diff --git a/pom.xml b/pom.xml
index 90bd875..dcc350f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -62,7 +62,7 @@
org.gcube.data.spd
spql-parser
- [1.0.0-SNAPSHOT, 2.0.0-SNAPSHOT)
+ [2.0.0-SNAPSHOT, 3.0.0-SNAPSHOT)
provided
diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/service/QueryBuilder.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/service/QueryBuilder.java
index e45594b..29c7e71 100644
--- a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/service/QueryBuilder.java
+++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/service/QueryBuilder.java
@@ -15,32 +15,35 @@ import org.gcube.portlets.user.speciesdiscovery.shared.SearchType;
public class QueryBuilder {
- protected static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("d/MM/yyyy");
+ protected static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("dd/MM/yyyy");
public static String buildQuery(String searchTerm, SearchType searchType, SearchFilters searchFilters){
+
StringBuilder query = new StringBuilder();
+ query.append("SEARCH BY ");
+
+ //ADD search type;
+ switch (searchType) {
+ case BY_SCIENTIFIC_NAME: query.append("SN "); break;
+ case BY_COMMON_NAME: query.append("CN "); break;
+ default: break;
+ }
+
//ADD search term;
query.append('\'');
query.append(searchTerm);
- query.append('\'');
-
- //ADD search type;
- switch (searchType) {
- case BY_SCIENTIFIC_NAME: query.append(" as ScientificName "); break;
- case BY_COMMON_NAME: query.append(" as CommonName "); break;
- }
+ query.append("' ");
//ADD data sources;
if (searchFilters.getListDataSources()!=null && searchFilters.getListDataSources().size()>0) {
- query.append(" in ");
+ query.append("in ");
Iterator dsIterator = searchFilters.getListDataSources().iterator();
while(dsIterator.hasNext()) {
DataSourceModel ds = dsIterator.next();
- query.append(" ");
query.append(ds.getId());
if (dsIterator.hasNext()) query.append(", ");
else query.append(" ");
@@ -52,7 +55,7 @@ public class QueryBuilder {
//ADD filters
if(properties.size()>0){
- query.append(" where ");
+ query.append("WHERE ");
Iterator pIterator = properties.iterator();
while (pIterator.hasNext()) {
@@ -67,17 +70,14 @@ public class QueryBuilder {
}
//ADD return type
-
- query.append(" return ");
+ query.append("RETURN ");
if (searchFilters.getResultType()!=null) {
switch (searchFilters.getResultType()) {
-// case RESULTITEM: query.append("*"); break; //Modify by Francesco
- case RESULTITEM: query.append("* having Occurrence"); break;
- case TAXONOMYITEM: query.append("Taxon"); break;
+ case RESULTITEM: query.append("PRODUCT HAVING xpath(\"//product[type='OCCURRENCE' and counter>0]\")"); break;
+ case TAXONOMYITEM: query.append("TAXON"); break;
}
} else {
-// query.append("*"); Modify by Francesco
- query.append("* having Occurrence");
+ query.append("PRODUCT HAVING xpath(\"//product[type='OCCURRENCE' and counter>0]\")");
}
return query.toString();
@@ -88,19 +88,24 @@ public class QueryBuilder {
String statement = null;
Properties prop = property.getProp();
-
- if(prop.equals(Properties.CoordinateTo)){
- org.gcube.data.spd.model.Coordinate coordinate = (org.gcube.data.spd.model.Coordinate)property.getValue();
- statement= "lowerBound IS " + coordinate.getLatitude() + " , "+coordinate.getLongitude();
- }else if(prop.equals(Properties.CoordinateFrom)){
- org.gcube.data.spd.model.Coordinate coordinate = (org.gcube.data.spd.model.Coordinate)property.getValue();
- statement= "upperBound IS " + coordinate.getLatitude() + " , "+coordinate.getLongitude();
- }else if(prop.equals(Properties.DateFrom)){
- Calendar calendar = (Calendar) property.getValue();
- statement= "fromDate IS " + DATE_FORMAT.format(calendar.getTime());
- }else if(prop.equals(Properties.DateTo)){
- Calendar calendar = (Calendar) property.getValue();
- statement= "toDate IS " + DATE_FORMAT.format(calendar.getTime());
+
+ switch (prop) {
+ case CoordinateTo: {
+ org.gcube.data.spd.model.Coordinate coordinate = (org.gcube.data.spd.model.Coordinate)property.getValue();
+ statement= "coordinate <= " + coordinate.getLatitude() + " , "+coordinate.getLongitude();
+ } break;
+ case CoordinateFrom: {
+ org.gcube.data.spd.model.Coordinate coordinate = (org.gcube.data.spd.model.Coordinate)property.getValue();
+ statement= "coordinate >= " + coordinate.getLatitude() + " , "+coordinate.getLongitude();
+ } break;
+ case DateFrom: {
+ Calendar calendar = (Calendar) property.getValue();
+ statement= "eventDate >= '" + DATE_FORMAT.format(calendar.getTime())+"'";
+ } break;
+ case DateTo: {
+ Calendar calendar = (Calendar) property.getValue();
+ statement= "eventDate <= '" + DATE_FORMAT.format(calendar.getTime())+"'";
+ }
}
return statement;
diff --git a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/util/QueryUtil.java b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/util/QueryUtil.java
index 36834d7..b8fe234 100644
--- a/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/util/QueryUtil.java
+++ b/src/main/java/org/gcube/portlets/user/speciesdiscovery/server/util/QueryUtil.java
@@ -4,15 +4,11 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import org.antlr.runtime.ANTLRStringStream;
-import org.antlr.runtime.CommonTokenStream;
-import org.antlr.runtime.RecognitionException;
import org.apache.log4j.Logger;
-import org.gcube.dataaccess.spql.SPQLLexer;
-import org.gcube.dataaccess.spql.SPQLParser;
-import org.gcube.dataaccess.spql.model.ParsingResult;
-import org.gcube.dataaccess.spql.model.ReturnType;
-import org.gcube.dataaccess.spql.model.TermType;
+import org.gcube.dataaccess.spql.SPQLQueryParser;
+import org.gcube.dataaccess.spql.model.Query;
+import org.gcube.dataaccess.spql.model.Term;
+import org.gcube.dataaccess.spql.model.ret.ReturnType;
import org.gcube.portlets.user.speciesdiscovery.shared.SearchByQueryParameter;
import org.gcube.portlets.user.speciesdiscovery.shared.SearchFilters;
import org.gcube.portlets.user.speciesdiscovery.shared.SearchResultType;
@@ -29,56 +25,32 @@ public class QueryUtil {
protected static Logger logger = Logger.getLogger(QueryUtil.class);
- public static SearchByQueryParameter getQueryResultType(String query) throws SearchServiceException
+ public static SearchByQueryParameter getQueryResultType(String queryText) throws SearchServiceException
{
try {
- SPQLLexer lexer = new SPQLLexer(new ANTLRStringStream(query));
- CommonTokenStream tokens = new CommonTokenStream(lexer);
- SPQLParser parser = new SPQLParser(tokens);
- ParsingResult result = parser.query();
-
-
+ Query query = SPQLQueryParser.parse(queryText);
+
Map> terms = new HashMap>();
-
- for (TermType key : result.getTerms().keySet()) {
-
- if(key.equals(TermType.COMMON_NAME)){
- terms.put(SearchType.BY_COMMON_NAME, terms.get(key));
- }else if(key.equals(TermType.SCIENTIFIC_NAME)){
- terms.put(SearchType.BY_COMMON_NAME, terms.get(key));
+ for (Term term:query.getTerms()) {
+ switch (term.getType()) {
+ case COMMON_NAME: terms.put(SearchType.BY_COMMON_NAME, term.getWords()); break;
+ case SCIENTIFIC_NAME: terms.put(SearchType.BY_SCIENTIFIC_NAME, term.getWords()); break;
}
-
}
- ReturnType type = result.getReturnExpression().getType();
+ ReturnType returnType = query.getReturnType();
+ SearchResultType searchResultType = SearchResultType.SPECIES_PRODUCT;
- SearchResultType searchResultType = null;
-
- if (type == null) searchResultType = SearchResultType.SPECIES_PRODUCT;
-
- switch (type) {
- case ALL:{
- searchResultType = SearchResultType.SPECIES_PRODUCT;
- break;
- }
- case OCCURRENCE:{
- searchResultType = SearchResultType.OCCURRENCE_POINT;
- break;
- }
- case TAXON: {
- searchResultType = SearchResultType.TAXONOMY_ITEM;
- break;
- }
- default: {
- logger.error("Unknow return type: "+type + " setting default "+SearchResultType.SPECIES_PRODUCT);
- searchResultType = SearchResultType.SPECIES_PRODUCT;
- }
+ switch (returnType) {
+ case OCCURRENCE: searchResultType = SearchResultType.OCCURRENCE_POINT; break;
+ case PRODUCT: searchResultType = SearchResultType.SPECIES_PRODUCT; break;
+ case TAXON: searchResultType = SearchResultType.TAXONOMY_ITEM; break;
}
return new SearchByQueryParameter(terms, searchResultType);
-
- } catch (RecognitionException e) {
+
+ } catch (Exception e) {
logger.warn("Error parsing the user query", e);
throw new SearchServiceException("Wrong query: "+e.getMessage());
}