Adds methods handling 'filter' and 'limit' expressions
[mkjsf-moved-to-github.git] / src / main / java / com / indexdata / mkjsf / pazpar2 / commands / SearchCommand.java
index f2eb3be..c094d24 100644 (file)
@@ -1,5 +1,7 @@
 package com.indexdata.mkjsf.pazpar2.commands;\r
 \r
+import java.util.List;\r
+\r
 import javax.enterprise.context.SessionScoped;\r
 import javax.inject.Named;\r
 \r
@@ -29,7 +31,6 @@ public class SearchCommand extends Pazpar2Command implements ServiceProxyCommand
     Pz2Service.get().getSearchClient().setSearchCommand(this);\r
     return super.run();\r
   }\r
-\r
     \r
   public void setQuery(String query) {    \r
     setParameter(new CommandParameter("query","=",query));\r
@@ -40,44 +41,127 @@ public class SearchCommand extends Pazpar2Command implements ServiceProxyCommand
   }\r
   \r
   public void setFilter(String filterExpression) {\r
-    setParameter(new CommandParameter("filter","=",filterExpression));\r
+    if (filterExpression != null && filterExpression.length()>0) {\r
+      setParameter(new FilterParameter(new Expression(filterExpression)));\r
+    }\r
+  }\r
+  \r
+  public void setFilter(String field, String operator, String value, String label) {\r
+    setParameter(new FilterParameter(new Expression(field,operator,value,label)));\r
   }\r
   \r
   public String getFilter() {\r
-    return getParameter("filter") == null ? null : getParameter("filter").getValueWithExpressions();\r
+    return getParameter("filter") == null ? null : ((FilterParameter)getParameter("filter")).getValueWithExpressions();\r
   }\r
   \r
-  public void addFilter(String filterExpression) {\r
-    // TODO: implement\r
-    if (hasParameterValue("filter")) {\r
-      setFilter(filterExpression);\r
+  public List<Expression> getFilters() {\r
+    return getParameter("filter").getExpressions();\r
+  }\r
+  \r
+  public void addFilter(String field, String operator, String value, String label) {\r
+    if (getParameter("filter") == null) {\r
+      setFilter(field + operator + value);\r
     } else {\r
-      getParameter("filter");\r
+      getParameter("filter").addExpression(new Expression(field,operator,value,(label != null ? label : value)));\r
     }\r
-    throw new UnsupportedOperationException("removeFilter(filterExpression) yet to be implemented.");\r
   }\r
   \r
   public void removeFilters () {\r
     removeParameter("filter");\r
   }\r
   \r
-  public void removeFilter(String filterExpression) {\r
-    // TODO: implement\r
-    throw new UnsupportedOperationException("removeFilter(filterExpression) yet to be implemented.");\r
+  public void removeFilter(String field, String operator, String value) {\r
+    removeExpression("filter",new Expression(field, operator, value, null));\r
   }\r
-\r
+  \r
+  public void removeFiltersAfter(String field, String operator, String value) {\r
+    removeExpressionsAfter("filter",new Expression(field,operator,value,null));\r
+  }\r
+  \r
   public boolean hasFilter () {\r
     return getFilter().length()>0;\r
   }\r
   \r
-  public void setLimit (String limitExpression) {\r
-    setParameter(new CommandParameter("limit","=",limitExpression));\r
+  public void setLimit (String limitExpression) {   \r
+    if (limitExpression != null && limitExpression.length()>0) {\r
+      setParameter(new LimitParameter(new Expression(limitExpression)));\r
+    }\r
   }\r
   \r
+  public void setLimit(String field, String operator, String value, String label) {\r
+    setParameter(new LimitParameter(new Expression(field,operator,value,label)));\r
+  }\r
+      \r
   public String getLimit () {\r
-    return getParameterValue("limit");\r
+    return getParameter("limit") == null ? null : ((FilterParameter)getParameter("limit")).getValueWithExpressions();    \r
+  }\r
+  \r
+  public List<Expression> getLimitExpressions() {\r
+    return getParameter("limit").getExpressions();\r
+  }\r
+  \r
+  public boolean hasLimitExpression(String... expressionFields) {\r
+    logger.trace("Checking for limit expression for " + expressionFields);\r
+    for (String field : expressionFields) {\r
+      if (getLimitExpressions(field) != null && getLimitExpressions(field).size()>0) {\r
+        logger.trace("Limit expression found (" + field + ")");\r
+        return true;\r
+      }  \r
+    }\r
+    logger.trace("No limit expressions found");\r
+    return false;\r
+  }\r
+  \r
+  public Expression getOneLimitExpression(String expressionField) {\r
+    List<Expression> exprs = getLimitExpressions(expressionField);\r
+    if (exprs != null && exprs.size()>0) {\r
+      if (exprs.size()>1) {\r
+        logger.warn("More that one limit expression found for [" + expressionField + "] but only asked to return the first one");\r
+      }\r
+      return exprs.get(0);\r
+    } else {\r
+      return null;\r
+    }\r
+    \r
   }\r
+  \r
+  public List<Expression> getLimitExpressions(String... expressionFields) {\r
+    logger.trace("Checking for limit parameter");\r
+    if (parameters.get("limit")!=null) {\r
+      logger.trace("Found");\r
+      return getParameter("limit").getExpressions(expressionFields);\r
+    } else {\r
+      logger.trace("Not found");\r
+      return null;\r
+    }\r
+  }\r
+  \r
+  public void addLimit(String field, String operator, String value, String label) {\r
+    if (getParameter("limit") == null) {\r
+      setLimit(field, operator, value, label);\r
+    } else {\r
+      addExpression("limit",new Expression(field,operator,value,label));\r
       \r
+    }\r
+  }\r
+  \r
+  public void removeLimits() {\r
+    removeParameter("limit");\r
+  }\r
+  \r
+  public void removeLimits(String... fields) {    \r
+    removeExpressions("limit",fields);    \r
+  }\r
+  \r
+  public void removeLimit(String field, String operator, String value) {\r
+    removeExpression("limit",new Expression(field, operator, value, null));    \r
+  }\r
+  \r
+  public void removeLimitsAfter(String field, String operator, String value, String... fields) {     \r
+    removeExpressionsAfter("limit",new Expression(field,operator,value,null),fields);    \r
+  }\r
+\r
+        \r
   public void setStartrecs (String startrecs) {\r
     setParameter(new CommandParameter("startrecs","=",startrecs));\r
   }\r
@@ -120,15 +204,14 @@ public class SearchCommand extends Pazpar2Command implements ServiceProxyCommand
   \r
   \r
   /**\r
-   * Sets a facet, in CQL, to restrict the current results,\r
-   * then executes the search \r
+   * Sets a facet, in CQL, to restrict the current results\r
    * \r
    * @param facetKey  i.e.  'au' for author\r
    * @param term  i.e. 'Dickens, Charles'\r
    */\r
   public void setFacet(String facetKey, String term) {\r
     if (term != null && term.length()>0) {         \r
-      getParameter("query").addExpression(new Expression(facetKey,"=",term));            \r
+      getParameter("query").addExpression(new Expression(facetKey,"=",term,null));            \r
     }            \r
   }\r
   \r
@@ -151,8 +234,7 @@ public class SearchCommand extends Pazpar2Command implements ServiceProxyCommand
   }\r
       \r
   /**\r
-   * Removes a facet set by setFacet(...), then executes\r
-   * the search.\r
+   * Removes a facet set by setFacet(...)\r
    * \r
    * Will not remove facets set by setFacetOnQuery(...)\r
    *  \r
@@ -161,7 +243,7 @@ public class SearchCommand extends Pazpar2Command implements ServiceProxyCommand
    */\r
   public void removeFacet(String facetKey, String term) {\r
     if (getParameter("query") != null) {\r
-      getParameter("query").removeExpression(new Expression(facetKey,"=",term));\r
+      getParameter("query").removeExpression(new Expression(facetKey,"=",term,null));\r
     }\r
   }\r
   \r