2013-03-04 14:38:25 +01:00
|
|
|
/**
|
2017-01-11 18:39:11 +01:00
|
|
|
*
|
2013-03-04 14:38:25 +01:00
|
|
|
*/
|
|
|
|
package org.gcube.portlets.user.speciesdiscovery.server.persistence;
|
|
|
|
|
|
|
|
import java.sql.SQLException;
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.Iterator;
|
|
|
|
import java.util.List;
|
|
|
|
|
|
|
|
import javax.persistence.EntityManager;
|
|
|
|
import javax.persistence.Query;
|
2013-05-20 18:50:24 +02:00
|
|
|
import javax.persistence.TypedQuery;
|
2013-03-04 14:38:25 +01:00
|
|
|
import javax.persistence.criteria.CriteriaBuilder;
|
|
|
|
import javax.persistence.criteria.CriteriaQuery;
|
|
|
|
import javax.persistence.criteria.Predicate;
|
|
|
|
|
|
|
|
import org.apache.log4j.Logger;
|
|
|
|
import org.gcube.portlets.user.speciesdiscovery.server.persistence.dao.AbstractPersistence;
|
|
|
|
import org.gcube.portlets.user.speciesdiscovery.server.session.FilterableFetchingBuffer;
|
|
|
|
import org.gcube.portlets.user.speciesdiscovery.shared.MainTaxonomicRankEnum;
|
|
|
|
import org.gcube.portlets.user.speciesdiscovery.shared.ResultRow;
|
|
|
|
import org.gcube.portlets.user.speciesdiscovery.shared.Taxon;
|
|
|
|
import org.gcube.portlets.user.speciesdiscovery.shared.filter.FilterCriteria;
|
|
|
|
import org.gcube.portlets.user.speciesdiscovery.shared.filter.ResultFilter;
|
|
|
|
import org.gcube.portlets.user.speciesdiscovery.shared.util.NormalizeString;
|
|
|
|
|
2013-05-20 18:50:24 +02:00
|
|
|
|
2013-03-04 14:38:25 +01:00
|
|
|
/**
|
2017-01-11 18:39:11 +01:00
|
|
|
*
|
2013-05-20 18:50:24 +02:00
|
|
|
* @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it
|
|
|
|
* @May 20, 2013
|
2013-03-04 14:38:25 +01:00
|
|
|
*
|
|
|
|
*/
|
|
|
|
public class ResultRowBuffer extends AbstractSelectableDaoBuffer<ResultRow> implements FilterableFetchingBuffer<ResultRow> {
|
2017-01-11 18:39:11 +01:00
|
|
|
|
2013-03-04 14:38:25 +01:00
|
|
|
protected Logger logger = Logger.getLogger(ResultRowBuffer.class);
|
2017-01-11 18:39:11 +01:00
|
|
|
|
2013-03-04 14:38:25 +01:00
|
|
|
private AbstractPersistence<Taxon> taxonDao;
|
|
|
|
private int filteredListSize = 0;
|
2017-01-11 18:39:11 +01:00
|
|
|
|
2013-03-04 14:38:25 +01:00
|
|
|
public ResultRowBuffer(AbstractPersistence<ResultRow> dao, AbstractPersistence<Taxon> taxonDao)
|
|
|
|
{
|
|
|
|
super(dao, ResultRow.ID_FIELD, ResultRow.SELECTED);
|
|
|
|
this.taxonDao = taxonDao;
|
|
|
|
}
|
2017-01-11 18:39:11 +01:00
|
|
|
|
2013-03-04 14:38:25 +01:00
|
|
|
/**
|
|
|
|
* {@inheritDoc}
|
2017-01-11 18:39:11 +01:00
|
|
|
* @throws Exception
|
2013-03-04 14:38:25 +01:00
|
|
|
*/
|
|
|
|
@Override
|
|
|
|
public void add(ResultRow row) throws Exception{
|
|
|
|
//FOR DEBUG
|
2013-10-24 12:52:34 +02:00
|
|
|
// logger.trace("Add item "+ row.getId() + " service id: " +row.getServiceId());
|
2017-01-11 18:39:11 +01:00
|
|
|
|
2013-03-04 14:38:25 +01:00
|
|
|
super.add(row);
|
|
|
|
}
|
2017-01-11 18:39:11 +01:00
|
|
|
|
2013-03-04 14:38:25 +01:00
|
|
|
public int getFilteredListSize() throws SQLException
|
|
|
|
{
|
|
|
|
return filteredListSize;
|
|
|
|
}
|
2017-01-11 18:39:11 +01:00
|
|
|
|
2013-03-04 14:38:25 +01:00
|
|
|
|
|
|
|
//TODO MODIFIED
|
|
|
|
@Override
|
|
|
|
public List<ResultRow> getFilteredList(FilterCriteria filterCriteria) throws SQLException {
|
|
|
|
|
|
|
|
ResultFilter activeFiltersObject = (ResultFilter) filterCriteria;
|
|
|
|
List<ResultRow> list = new ArrayList<ResultRow>();
|
|
|
|
Iterator<ResultRow> iterator = null;
|
|
|
|
String value;
|
2017-01-11 18:39:11 +01:00
|
|
|
|
2013-03-04 14:38:25 +01:00
|
|
|
if(activeFiltersObject!=null){
|
|
|
|
//FILTER BY CLASSIFICATION
|
|
|
|
if(activeFiltersObject.isByClassification()){
|
|
|
|
|
|
|
|
int counter = activeFiltersObject.getNumberOfData();
|
|
|
|
logger.trace("in classification filter - counter: "+counter);
|
|
|
|
logger.trace("in classification filter - rank: "+activeFiltersObject.getRankClassification());
|
|
|
|
logger.trace("in classification filter - classification id: "+activeFiltersObject.getClassificationId());
|
2017-01-11 18:39:11 +01:00
|
|
|
|
2013-03-04 14:38:25 +01:00
|
|
|
String columName = null;
|
2017-01-11 18:39:11 +01:00
|
|
|
|
2013-03-04 14:38:25 +01:00
|
|
|
if(activeFiltersObject.getRankClassification().compareTo(MainTaxonomicRankEnum.KINGDOM.getLabel())==0)
|
|
|
|
columName = ResultRow.KINGDOM_ID;
|
|
|
|
else if(activeFiltersObject.getRankClassification().compareTo(MainTaxonomicRankEnum.FAMILY.getLabel())==0)
|
|
|
|
columName = ResultRow.FAMILY_ID;
|
|
|
|
else if(activeFiltersObject.getRankClassification().compareTo(MainTaxonomicRankEnum.GENUS.getLabel())==0)
|
|
|
|
columName = ResultRow.GENUS_ID;
|
|
|
|
else if(activeFiltersObject.getRankClassification().compareTo(MainTaxonomicRankEnum.CLASS.getLabel())==0)
|
|
|
|
columName = ResultRow.CLASS_ID;
|
|
|
|
else if(activeFiltersObject.getRankClassification().compareTo(MainTaxonomicRankEnum.ORDER.getLabel())==0)
|
|
|
|
columName = ResultRow.ORDER_ID;
|
|
|
|
else if(activeFiltersObject.getRankClassification().compareTo(MainTaxonomicRankEnum.PHYLUM.getLabel())==0)
|
|
|
|
columName = ResultRow.PHYLUM_ID;
|
|
|
|
else if(activeFiltersObject.getRankClassification().compareTo(MainTaxonomicRankEnum.SPECIES.getLabel())==0)
|
|
|
|
columName = ResultRow.SPECIES_ID;
|
2017-01-11 18:39:11 +01:00
|
|
|
|
2013-03-04 14:38:25 +01:00
|
|
|
// logger.trace("in classification filter - columName: "+columName);
|
|
|
|
|
|
|
|
try {
|
|
|
|
CriteriaBuilder queryBuilder = dao.getCriteriaBuilder();
|
|
|
|
Query query = dao.createNewManager().createQuery("select r FROM ResultRow r where r."+columName+ "='"+activeFiltersObject.getClassificationId()+"'");
|
|
|
|
query.setMaxResults(counter);
|
|
|
|
iterator = query.getResultList().iterator();
|
|
|
|
// logger.trace("in classification filter - statement: "+queryBuilder.where().eq(columName, activeFiltersObject.getClassificationId()).getStatement());
|
|
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
logger.error("Error in activeFiltersObject.isByClassification(): "+e, e);
|
|
|
|
}
|
2017-01-11 18:39:11 +01:00
|
|
|
|
2013-03-04 14:38:25 +01:00
|
|
|
//FILTER BY DATA PROVIDER
|
|
|
|
}else if(activeFiltersObject.isByDataProvider()){
|
2017-01-11 18:39:11 +01:00
|
|
|
|
2013-03-04 14:38:25 +01:00
|
|
|
try {
|
|
|
|
CriteriaBuilder queryBuilder = dao.getCriteriaBuilder();
|
|
|
|
value = activeFiltersObject.getDataProviderName();
|
|
|
|
CriteriaQuery<Object> cq = queryBuilder.createQuery();
|
|
|
|
Predicate pr1 = queryBuilder.equal(dao.rootFrom(cq).get(ResultRow.DATAPROVIDER_NAME), value);
|
|
|
|
cq.where(pr1);
|
2017-01-11 18:39:11 +01:00
|
|
|
|
2013-03-04 14:38:25 +01:00
|
|
|
//TODO FIXME empty value
|
|
|
|
logger.trace("FILTER BY DATA PROVIDER: "+ value );
|
2017-01-11 18:39:11 +01:00
|
|
|
|
2013-03-04 14:38:25 +01:00
|
|
|
iterator = dao.executeCriteriaQuery(cq).iterator();
|
2017-01-11 18:39:11 +01:00
|
|
|
|
2013-03-04 14:38:25 +01:00
|
|
|
} catch (Exception e) {
|
|
|
|
logger.error("Error in activeFiltersObject.isByDataProvider(): "+e, e);
|
|
|
|
e.printStackTrace();
|
|
|
|
}
|
2017-01-11 18:39:11 +01:00
|
|
|
|
2013-03-04 14:38:25 +01:00
|
|
|
//FILTER BY DATA SOURCE
|
|
|
|
}else if(activeFiltersObject.isByDataSourceName()){
|
2017-01-11 18:39:11 +01:00
|
|
|
|
2013-03-04 14:38:25 +01:00
|
|
|
try {
|
|
|
|
CriteriaBuilder queryBuilder = dao.getCriteriaBuilder();
|
|
|
|
value = activeFiltersObject.getDataSourceName();
|
|
|
|
CriteriaQuery<Object> cq = queryBuilder.createQuery();
|
|
|
|
Predicate pr1 = queryBuilder.equal(dao.rootFrom(cq).get(ResultRow.DATASOURCE_NAME), NormalizeString.validateUndefined(value));
|
|
|
|
cq.where(pr1);
|
2017-01-11 18:39:11 +01:00
|
|
|
|
2013-03-04 14:38:25 +01:00
|
|
|
logger.trace("FILTER BY DATA DATA SOURCE NAME: "+ value );
|
2017-01-11 18:39:11 +01:00
|
|
|
|
2013-03-04 14:38:25 +01:00
|
|
|
iterator = dao.executeCriteriaQuery(cq).iterator();
|
2017-01-11 18:39:11 +01:00
|
|
|
|
2013-03-04 14:38:25 +01:00
|
|
|
} catch (Exception e) {
|
|
|
|
logger.error("Error in activeFiltersObject.isByDataSourceName(): "+e, e);
|
|
|
|
e.printStackTrace();
|
|
|
|
}
|
2017-01-11 18:39:11 +01:00
|
|
|
|
2013-03-04 14:38:25 +01:00
|
|
|
//FILTER BY RANK
|
|
|
|
}else if(activeFiltersObject.isByRank()){
|
2017-01-11 18:39:11 +01:00
|
|
|
|
2013-03-04 14:38:25 +01:00
|
|
|
try {
|
2017-01-11 18:39:11 +01:00
|
|
|
|
2013-03-07 17:23:22 +01:00
|
|
|
value = activeFiltersObject.getRankName();
|
2017-01-11 18:39:11 +01:00
|
|
|
EntityManager em = dao.createNewManager();
|
|
|
|
|
|
|
|
String queryString = "select *" +
|
|
|
|
" FROM "+ResultRow.class.getSimpleName()+" r" +
|
|
|
|
" INNER JOIN RESULTROW_TAXON rt on r.ID=rt.RESULTROW_ID" +
|
|
|
|
" INNER JOIN "+Taxon.class.getSimpleName()+" t on t.INTERNALID=rt.MATCHINGTAXON_INTERNALID" +
|
|
|
|
" where t.RANK = '"+value+"' and t.ID IN" +
|
|
|
|
" (select MIN(tax.ID) from TAXON tax)";
|
|
|
|
|
|
|
|
Query query = em.createNativeQuery(queryString, ResultRow.class);
|
|
|
|
List<ResultRow> listResultRow = new ArrayList<ResultRow>();
|
|
|
|
try {
|
|
|
|
|
|
|
|
listResultRow = query.getResultList();
|
|
|
|
} catch (Exception e) {
|
|
|
|
logger.error("Error in ResultRow - executeCriteriaQuery: " + e.getMessage(), e);
|
|
|
|
} finally {
|
|
|
|
em.close();
|
2013-03-04 14:38:25 +01:00
|
|
|
}
|
|
|
|
|
2017-01-11 18:39:11 +01:00
|
|
|
iterator = listResultRow.iterator();
|
2013-03-04 14:38:25 +01:00
|
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
logger.error("Error in activeFiltersObject.isByRank(): "+e, e);
|
|
|
|
e.printStackTrace();
|
|
|
|
}
|
|
|
|
}
|
2017-01-11 18:39:11 +01:00
|
|
|
|
2013-03-04 14:38:25 +01:00
|
|
|
if(iterator!=null){
|
|
|
|
while(iterator.hasNext()){
|
|
|
|
ResultRow row = iterator.next();
|
|
|
|
list.add(row);
|
|
|
|
}
|
2017-01-11 18:39:11 +01:00
|
|
|
filteredListSize = list.size();
|
2013-03-04 14:38:25 +01:00
|
|
|
}
|
|
|
|
}
|
2017-01-11 18:39:11 +01:00
|
|
|
|
2013-03-04 14:38:25 +01:00
|
|
|
logger.trace("RETURNED List size " + list.size());
|
|
|
|
return list;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void updateAllSelection(boolean selection) throws Exception {
|
|
|
|
|
|
|
|
EntityManager em = dao.createNewManager();
|
|
|
|
|
|
|
|
//TODO use filterMap
|
2017-01-11 18:39:11 +01:00
|
|
|
|
2013-03-04 14:38:25 +01:00
|
|
|
try {
|
|
|
|
em.getTransaction().begin();
|
|
|
|
int updateCount = em.createQuery("UPDATE ResultRow SET " + ResultRow.SELECTED + " = "+ selection).executeUpdate();
|
|
|
|
logger.trace("Updated " + updateCount + " item");
|
|
|
|
em.getTransaction().commit();
|
|
|
|
} finally {
|
|
|
|
if (em.getTransaction().isActive())
|
|
|
|
em.getTransaction().rollback();
|
|
|
|
em.close();
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2013-05-20 18:50:24 +02:00
|
|
|
/* (non-Javadoc)
|
|
|
|
* @see org.gcube.portlets.user.speciesdiscovery.server.session.SelectableFetchingBuffer#updateAllSelectionByIds(boolean, java.util.List)
|
|
|
|
*/
|
|
|
|
@Override
|
|
|
|
public void updateAllSelectionByIds(boolean selection, List<String> listIds)
|
|
|
|
throws Exception {
|
2017-01-11 18:39:11 +01:00
|
|
|
|
2013-05-20 18:50:24 +02:00
|
|
|
EntityManager em = dao.createNewManager();
|
|
|
|
|
2017-01-11 18:39:11 +01:00
|
|
|
String queryString = "UPDATE ResultRow t SET "
|
2013-05-20 18:50:24 +02:00
|
|
|
+ ResultRow.SELECTED + " = "+ selection +" where "
|
|
|
|
+ ResultRow.ID_FIELD+" IN :inclList";
|
2017-01-11 18:39:11 +01:00
|
|
|
|
2013-05-20 18:50:24 +02:00
|
|
|
try {
|
|
|
|
em.getTransaction().begin();
|
|
|
|
|
|
|
|
TypedQuery<ResultRow> query = em.createQuery(queryString, ResultRow.class);
|
2017-01-11 18:39:11 +01:00
|
|
|
|
2013-05-20 18:50:24 +02:00
|
|
|
query.setParameter("inclList", listIds);
|
2017-01-11 18:39:11 +01:00
|
|
|
|
2013-05-20 18:50:24 +02:00
|
|
|
int updateCount = query.executeUpdate();
|
2017-01-11 18:39:11 +01:00
|
|
|
|
2013-05-20 18:50:24 +02:00
|
|
|
logger.trace("Updated " + updateCount + " item");
|
|
|
|
|
|
|
|
em.getTransaction().commit();
|
|
|
|
} finally {
|
|
|
|
if (em.getTransaction().isActive())
|
|
|
|
em.getTransaction().rollback();
|
|
|
|
em.close();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-03-04 14:38:25 +01:00
|
|
|
}
|