X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fcom%2Findexdata%2Fmkjsf%2Fpazpar2%2Fcommands%2FSearchCommand.java;h=7d74b6cba24b55e578153bc12b53536031107916;hb=0c500bea459cf05157e0f753755466ce1b46604c;hp=654df45d126aaec97eaaa1324fd2a28fbfebb02a;hpb=11ff48b9d37193a89a4b74da75db8c58415c46a6;p=mkjsf-moved-to-github.git diff --git a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/SearchCommand.java b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/SearchCommand.java index 654df45..7d74b6c 100644 --- a/src/main/java/com/indexdata/mkjsf/pazpar2/commands/SearchCommand.java +++ b/src/main/java/com/indexdata/mkjsf/pazpar2/commands/SearchCommand.java @@ -1,23 +1,29 @@ package com.indexdata.mkjsf.pazpar2.commands; +import java.util.Arrays; +import java.util.List; + import javax.enterprise.context.SessionScoped; import javax.inject.Named; import org.apache.log4j.Logger; -import com.indexdata.mkjsf.pazpar2.ClientCommandResponse; -import com.indexdata.mkjsf.pazpar2.HttpResponseWrapper; -import com.indexdata.mkjsf.pazpar2.Pz2Bean; +import com.indexdata.mkjsf.pazpar2.Pz2Service; +import com.indexdata.mkjsf.pazpar2.commands.sp.SearchCommandSp; import com.indexdata.mkjsf.pazpar2.commands.sp.ServiceProxyCommand; import com.indexdata.mkjsf.pazpar2.data.ResponseDataObject; -import com.indexdata.mkjsf.pazpar2.data.ResponseParser; +/** + * search Pazpar2 command, referenced as: pzreq.search + * + * @author Niels Erik + * + */ @SessionScoped @Named public class SearchCommand extends Pazpar2Command implements ServiceProxyCommand { private static final long serialVersionUID = -1888520867838597236L; - private static Logger logger = Logger.getLogger(SearchCommand.class); - private SingleTargetFilter singleTargetFilter = null; + private static Logger logger = Logger.getLogger(SearchCommand.class); public SearchCommand() { super("search"); @@ -25,119 +31,422 @@ public class SearchCommand extends Pazpar2Command implements ServiceProxyCommand public ResponseDataObject run() { logger.info("Running " + getCommandName()); - logger.info("Using client " + Pz2Bean.get().getSearchClient()); - logger.info("Storing responses to " + Pz2Bean.get().getPzresp()); - Pz2Bean.get().getSearchClient().setSearchCommand(this); - logger.info("Executing command " + getCommandName()); - HttpResponseWrapper httpResponse = Pz2Bean.get().getSearchClient().executeCommand(this); - ResponseDataObject responseObject = ResponseParser.getParser().getDataObject((ClientCommandResponse) httpResponse); - Pz2Bean.get().getPzresp().put(getCommandName(), responseObject); - return responseObject; + Pz2Service.get().getStateMgr().hasPendingStateChange("search",false); + Pz2Service.get().getPzresp().resetSearchAndBeyond(); + Pz2Service.get().getPzreq().getRecord().removeParametersInState(); + Pz2Service.get().getPzreq().getShow().setParameterInState(new CommandParameter("start","=",0)); + Pz2Service.get().getSearchClient().setSearchCommand(this); + return super.run(); } - + /** + * Sets the query parameter. See Pazpar2 documentation for details. + */ public void setQuery(String query) { - setParameter(new CommandParameter("query","=",query)); + setParameter(new QueryParameter("query","=",query)); } - public String getQuery () { - return getParameter("query") == null ? null : getParameter("query").getValueWithExpressions(); + public void setBooleanOperatorForQuery(String operator) { + Pazpar2Command copy = this.copy(); + ((QueryParameter) getParameter("query")).setBooleanOperator(operator); + checkInState(copy); } + /** + * Returns the simple part of the query parameter value, excluding parts that + * were added as expressions (that is, not set with setQuery()). + */ + public String getQuery () { + return getParameter("query") == null ? null : ((QueryParameter)getParameter("query")).getSimpleValue(); + } + + /** + * Returns the complete query parameter value, including expressions. + */ + public String getExtendedQuery () { + return getParameter("query") == null ? null : ((QueryParameter)getParameter("query")).getValueWithExpressions(); + } + + /** + * Sets the filter parameter. See Pazpar2 documentation for details. + */ public void setFilter(String filterExpression) { - setParameter(new CommandParameter("filter","=",filterExpression)); + if (filterExpression != null && filterExpression.length()>0) { + if (filterExpression.split("[=~]").length==1) { + removeFilters(filterExpression.split("[=~]")[0]); + } else if (filterExpression.split("[=~]").length==2) { + setParameter(new FilterParameter(new Expression(filterExpression))); + } else { + logger.error("Could not parse filter expression [" + filterExpression + "]"); + } + } + } + + /** + * Sets the filter parameter. See Pazpar2 documentation for details. + */ + public void setFilter(String field, String operator, String value, String label) { + setParameter(new FilterParameter(new Expression(field,operator,value,label))); + } + + /** + * Checks if there are any filter expressions matching any of the given expressionFields + * @param expressionFields expression fields (left-of-operator entities) to look for + * @return true if expression(s) found with any of expressionFields + */ + public boolean hasFilterExpression(String... expressionFields) { + logger.trace("Checking for filter expression for " + Arrays.deepToString(expressionFields)); + for (String field : expressionFields) { + if (getFilterExpressions(field) != null && getFilterExpressions(field).size()>0) { + logger.trace("Filter expression found (" + field + ")"); + return true; + } + } + logger.trace("No filter expressions found"); + return false; } + + /** + * Returns the filter parameter value. + */ public String getFilter() { - return getParameter("filter") == null ? null : getParameter("filter").getValueWithExpressions(); + return getParameter("filter") == null ? null : ((FilterParameter)getParameter("filter")).getValueWithExpressions(); + } + + /** + * Returns the first filter expression of the given type + * @param expressionField expression field (left-of-operator entity) to look for + * @return the first filter expression found with the field expressionField or null if none found + */ + public Expression getOneFilterExpression(String expressionField) { + List exprs = getFilterExpressions(expressionField); + if (exprs != null && exprs.size()>0) { + if (exprs.size()>1) { + logger.warn("More that one filter expression found for [" + expressionField + "] but only asked to return the first one"); + } + return exprs.get(0); + } else { + return null; + } } + + + /** + * Returns list of all filter expressions + */ + public List getFilterExpressions() { + return getParameter("filter").getExpressions(); + } + - public void addFilter(String filterExpression) { - // TODO: implement - if (hasParameterValue("filter")) { - setFilter(filterExpression); + public List getFilterExpressions(String... expressionFields) { + logger.trace("Checking for filter parameter"); + if (parameters.get("filter")!=null) { + logger.trace("Found"); + return getParameter("filter").getExpressions(expressionFields); } else { - getParameter("filter"); + logger.trace("Not found"); + return null; } - throw new UnsupportedOperationException("removeFilter(filterExpression) yet to be implemented."); } + public boolean hasFilter () { + return getFilter().length()>0; + } + + /** + * Adds a filter expression with a label for display. The filter is added to the end + * of an ordered list. + * + * @param field + * @param operator + * @param value + * @param label + */ + public void addFilter(String field, String operator, String value, String label) { + if (getParameter("filter") == null) { + setFilter(field + operator + value); + } else { + addExpression("filter",new Expression(field,operator,value,(label != null ? label : value))); + } + } + + /** + * Clears the filter parameter + */ public void removeFilters () { removeParameter("filter"); } + + /** + * Removes a filter expression by exact attributes + * + * @param field + * @param operator + * @param value + */ + public void removeFilter(String field, String operator, String value) { + removeExpression("filter",new Expression(field, operator, value, null)); + } - public void removeFilter(String filterExpression) { - // TODO: implement - throw new UnsupportedOperationException("removeFilter(filterExpression) yet to be implemented."); + /** + * Removes all filter expressions matching a field listed in fieldsToRemove + * @param fieldsToRemove + */ + public void removeFilters(String... fieldsToRemove) { + removeExpressions("filter",fieldsToRemove); + } + + /** + * Removes filter expressions coming after the expression matching the provided filter expression, + * if they have a field listed in fieldsToRemove. To be used for bread crumb like UI + * controls. + * + * @param field + * @param operator + * @param value + * @param fieldsToRemove + */ + public void removeFiltersAfter(String field, String operator, String value, String... fieldsToRemove) { + removeExpressionsAfter("filter",new Expression(field,operator,value,null),fieldsToRemove); } - public boolean hasFilter () { - return getFilter().length()>0; + /** + * Sets the limit parameter. See Pazpar2 documentation for details. + */ + public void setLimit (String limitExpression) { + if (limitExpression != null && limitExpression.length()>0) { + setParameter(new LimitParameter(new Expression(limitExpression))); + } } - public void setLimit (String limitExpression) { - setParameter(new CommandParameter("limit","=",limitExpression)); + /** + * Sets the limit parameter including a label. See Pazpar2 documentation for details. + */ + public void setLimit(String field, String operator, String value, String label) { + setParameter(new LimitParameter(new Expression(field,operator,value,label))); } - + + /** + * Returns the limit parameter value. + */ public String getLimit () { - return getParameterValue("limit"); + return getParameter("limit") == null ? null : ((LimitParameter)getParameter("limit")).getValueWithExpressions(); } - + + /** + * Checks if there are any limit expressions matching any of the given expressionFields + * @param expressionFields expression fields (left-of-operator entities) to look for + * @return true if expression(s) found with any of expressionFields + */ + public boolean hasLimitExpression(String... expressionFields) { + logger.trace("Checking for limit expression for " + Arrays.deepToString(expressionFields)); + for (String field : expressionFields) { + if (getLimitExpressions(field) != null && getLimitExpressions(field).size()>0) { + logger.trace("Limit expression found (" + field + ")"); + return true; + } + } + logger.trace("No limit expressions found"); + return false; + } + + /** + * Returns the first limit expression of the given type + * @param expressionField expression field (left-of-operator entity) to look for + * @return the first limit expression found with the field expressionField or null if none found + */ + public Expression getOneLimitExpression(String expressionField) { + List exprs = getLimitExpressions(expressionField); + if (exprs != null && exprs.size()>0) { + if (exprs.size()>1) { + logger.warn("More that one limit expression found for [" + expressionField + "] but only asked to return the first one"); + } + return exprs.get(0); + } else { + return null; + } + } + + /** + * Return a list of all current limit expressions + */ + public List getLimitExpressions() { + return getParameter("limit").getExpressions(); + } + + /** + * Returns a list of limit expressions with fields that matches on of expressionFields + * + * @param expressionFields limit expressions to look for + */ + public List getLimitExpressions(String... expressionFields) { + logger.trace("Checking for limit parameter"); + if (parameters.get("limit")!=null) { + logger.trace("Found"); + return getParameter("limit").getExpressions(expressionFields); + } else { + logger.trace("Not found"); + return null; + } + } + + /** + * Adds a limit expression with a label for display. The limit is added to the end + * of an ordered list. + * + * @param field + * @param operator + * @param value + * @param label + */ + public void addLimit(String field, String operator, String value, String label) { + if (getParameter("limit") == null) { + setLimit(field, operator, value, label); + } else { + addExpression("limit",new Expression(field,operator,value,label)); + } + } + + /** + * Clears the limit parameter + */ + public void removeLimits() { + removeParameter("limit"); + } + + /** + * Removes all limit expressions that have fields as listed in fieldsToRemove + * @param fieldsToRemove + */ + public void removeLimits(String... fieldsToRemove) { + removeExpressions("limit",fieldsToRemove); + } + + /** + * Removes a limit expression by exact attributes + * + * @param field + * @param operator + * @param value + */ + public void removeLimit(String field, String operator, String value) { + removeExpression("limit",new Expression(field, operator, value, null)); + } + + /** + * Removes limit expressions coming after the provided limit expression, if they have a field listed in + * fieldsToRemove. To be used for bread crumb like UI controls. + * + * @param field + * @param operator + * @param value + * @param fieldsToRemove + */ + public void removeLimitsAfter(String field, String operator, String value, String... fieldsToRemove) { + removeExpressionsAfter("limit",new Expression(field,operator,value,null),fieldsToRemove); + } + + + /** + * Sets the startrecs parameter. See Pazpar2 documentation for details. + */ public void setStartrecs (String startrecs) { setParameter(new CommandParameter("startrecs","=",startrecs)); } + /** + * Returns the startrecs parameter value. + */ public String getStartrecs () { return getParameterValue("startrecs"); } + /** + * Sets the maxrecs parameter. See Pazpar2 documentation for details. + */ public void setMaxrecs (String maxrecs) { setParameter(new CommandParameter("maxrecs","=",maxrecs)); } + /** + * Returns the maxrecs parameter value. + */ public String getMaxrecs () { return getParameterValue("maxrecs"); } + /** + * Sets the sort parameter. See Pazpar2 documentation for details. + */ public void setSort (String sort) { setParameter(new CommandParameter("sort","=",sort)); } + /** + * Returns the sort parameter value. + */ public String getSort () { return getParameterValue("sort"); } + /** + * Sets the rank parameter. See Pazpar2 documentation for details. + */ public void setRank (String rank) { setParameter(new CommandParameter("rank","=",rank)); } + /** + * Returns the rank parameter value. + */ public String getRank () { return getParameterValue("rank"); } + /** + * Sets the mergekey parameter. See Pazpar2 documentation for details. + */ public void setMergekey (String mergekey) { setParameter(new CommandParameter("mergekey","=",mergekey)); } + /** + * Returns the mergekey parameter value. + */ public String getMergekey () { return getParameterValue("mergekey"); } /** - * Sets a facet, in CQL, to restrict the current results, - * then executes the search + * Adds an expression - for instance a facet criterion, with an optional label - to the query parameter * - * @param facetKey i.e. 'au' for author - * @param term i.e. 'Dickens, Charles' + *

Example:

+ *
    + *
  • {au}{=}{"Steinbeck, John"}{Steinbeck, John} + *
*/ - public void setFacet(String facetKey, String term) { - if (term != null && term.length()>0) { - getParameter("query").addExpression(new Expression(facetKey,"=",term)); + public void addQueryExpression(String field, String operator, String term, String label) { + if (term != null && term.length()>0) { + addExpression("query", new Expression(field,operator,term,label)); } } /** + * Removes a query expression - for instance a facet criterion - by its exact attributes + * + * @param field + * @param operator + * @param value + */ + public void removeQueryExpression(String field, String operator, String value) { + removeExpression("query",new Expression(field, operator, value, null)); + } + + + /** * Sets a facet to limit the current query by. The * facet is appended to the query string itself (rather * as a separately managed entity. It will thus appear @@ -150,14 +459,13 @@ public class SearchCommand extends Pazpar2Command implements ServiceProxyCommand public void setFacetOnQuery (String facetKey, String term) { String facetExpression = facetKey + "=" + term; if (term != null && term.length()>0) { - String currentQuery= getParameterValue("query"); - setParameter(new CommandParameter("query","=", currentQuery + " and " + facetExpression)); + String currentQuery= getQuery(); + setParameter(new QueryParameter("query","=", currentQuery + " and " + facetExpression)); } } /** - * Removes a facet set by setFacet(...), then executes - * the search. + * Removes a facet set by setFacet(...) * * Will not remove facets set by setFacetOnQuery(...) * @@ -166,81 +474,21 @@ public class SearchCommand extends Pazpar2Command implements ServiceProxyCommand */ public void removeFacet(String facetKey, String term) { if (getParameter("query") != null) { - getParameter("query").removeExpression(new Expression(facetKey,"=",term)); + removeExpression("query",new Expression(facetKey,"=",term,null)); } } - - - /** - * Adds a single target filter to restrict the current query by, - * then executes the current search. - * - * This is a special case of the general setFilter function, - * allowing to associate a descriptive target name with the - * filter expression for display in UI. - * - * @param targetId pazpar2's ID for the target to limit by - * @param targetName a descriptive name for the target - */ - public void setSingleTargetFilter (String targetId, String targetName) { - if (hasSingleTargetFilter(new SingleTargetFilter(targetId,targetName))) { - logger.debug("Already using target filter " + this.singleTargetFilter.getFilterExpression()); - } else { - logger.debug("Setting new single target filter for [" + targetName + "]"); - this.singleTargetFilter = new SingleTargetFilter(targetId,targetName); - setParameter(new CommandParameter("filter","=",this.singleTargetFilter.getFilterExpression())); - } - } - - public SingleTargetFilter getSingleTargetFilter () { - logger.debug("request to get the current single target filter " + singleTargetFilter); - return singleTargetFilter; - } - - /** - * Removes the current target filter from the search - * - */ - public String removeSingleTargetFilter () { - logger.debug("Removing target filter " + singleTargetFilter.getFilterExpression()); - this.singleTargetFilter = null; - removeParameter("filter"); - return null; - } - - /** - * - * @return The target filter set on the current search command - */ - public boolean hasSingleTargetFilter() { - logger.debug("Checking if a single target filter is set: " + (singleTargetFilter != null)); - return singleTargetFilter != null; - } - - /** - * Resolves if the current search command has a target filter - to - * be used by the UI for conditional rendering of target filter info. - * - * @return true if the current search command is limited by a target - * filter - */ - protected boolean hasSingleTargetFilter(SingleTargetFilter targetFilter) { - logger.debug("Checking if target filter for [" + targetFilter.getTargetName() + "] is set."); - return hasSingleTargetFilter() && targetFilter.equals(this.singleTargetFilter); - } - + public SearchCommand copy () { SearchCommand newCommand = new SearchCommand(); for (String parameterName : parameters.keySet()) { newCommand.setParameterInState(parameters.get(parameterName).copy()); } - newCommand.singleTargetFilter = this.singleTargetFilter; return newCommand; } @Override public ServiceProxyCommand getSp() { - return this; + return new SearchCommandSp(this); } @Override