/**
* License Agreement for OpenSearchServer
*
* Copyright (C) 2012-2014 Emmanuel Keller / Jaeksoft
*
* http://www.open-search-server.com
*
* This file is part of OpenSearchServer.
*
* OpenSearchServer is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* OpenSearchServer is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenSearchServer.
* If not, see <http://www.gnu.org/licenses/>.
**/
package com.jaeksoft.searchlib.filter;
import java.io.IOException;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.search.Query;
import org.xml.sax.SAXException;
import com.jaeksoft.searchlib.SearchLibException;
import com.jaeksoft.searchlib.config.Config;
import com.jaeksoft.searchlib.function.expression.SyntaxError;
import com.jaeksoft.searchlib.geo.GeoParameters;
import com.jaeksoft.searchlib.query.ParseException;
import com.jaeksoft.searchlib.request.AbstractLocalSearchRequest;
import com.jaeksoft.searchlib.request.SearchFilterRequest;
import com.jaeksoft.searchlib.result.ResultSearchSingle;
import com.jaeksoft.searchlib.schema.SchemaField;
import com.jaeksoft.searchlib.util.Timer;
import com.jaeksoft.searchlib.util.XmlWriter;
import com.jaeksoft.searchlib.web.ServletTransaction;
import com.jaeksoft.searchlib.webservice.query.search.SearchQueryAbstract.OperatorEnum;
public abstract class FilterAbstract<T extends FilterAbstract<?>> {
private Source source;
private boolean negative;
private String paramPosition;
private final FilterType filterType;
public static enum Source {
CONFIGXML, REQUEST
}
public enum FilterType {
QUERY_FILTER("Query filter", QueryFilter.class,
"/WEB-INF/zul/query/search/filterQuery.zul"),
TERM_FILTER("Term filter", TermFilter.class,
"/WEB-INF/zul/query/search/filterTerm.zul"),
GEO_FILTER("Geo filter", GeoFilter.class,
"/WEB-INF/zul/query/search/filterGeo.zul"),
RELATIVE_DATE_FILTER("Relative date filter", RelativeDateFilter.class,
"/WEB-INF/zul/query/search/filterRelativeDate.zul"),
MIRROR_AND_FILTER("Mirror AND filter", MirrorAndFilter.class,
"/WEB-INF/zul/query/search/filterMirrorAnd.zul"),
REQUEST_TEMPLATE_FILTER("Request template filter",
RequestTemplateFilter.class,
"/WEB-INF/zul/query/search/filterRequestTemplate.zul");
private final String label;
private final Class<? extends FilterAbstract<?>> filterClass;
private final String templatePath;
private FilterType(String label,
Class<? extends FilterAbstract<?>> filterClass,
String templatePath) {
this.label = label;
this.filterClass = filterClass;
this.templatePath = templatePath;
}
/**
* @return the label
*/
public String getLabel() {
return label;
}
@Override
public String toString() {
return label;
}
public FilterAbstract<?> newInstance() throws InstantiationException,
IllegalAccessException {
return filterClass.newInstance();
}
/**
* @return the templatePath
*/
public String getTemplatePath() {
return templatePath;
}
}
protected FilterAbstract(FilterType filterType, Source source,
boolean negative, String paramPosition) {
this.filterType = filterType;
this.source = source;
this.negative = negative;
this.paramPosition = paramPosition;
}
public Source getSource() {
return this.source;
}
public boolean isNegative() {
return negative;
}
public void setNegative(boolean negative) {
this.negative = negative;
}
public void setParamPosition(int position) {
StringBuilder sb = new StringBuilder("fq");
sb.append(position);
paramPosition = sb.toString();
}
public String getParamPosition() {
return paramPosition;
}
public abstract String getDescription();
public abstract String getCacheKey(SchemaField defaultField,
Analyzer analyzer, AbstractLocalSearchRequest request)
throws ParseException, SyntaxError, SearchLibException, IOException;
public abstract FilterHits getFilterHits(SchemaField defaultField,
Analyzer analyzer, AbstractLocalSearchRequest request, Timer timer)
throws ParseException, IOException, SearchLibException, SyntaxError;
public abstract void writeXmlConfig(XmlWriter xmlWriter)
throws SAXException;
public abstract T duplicate();
public boolean isQueryFilter() {
return this instanceof QueryFilter;
}
public boolean isRequestTemplateFilter() {
return this instanceof RequestTemplateFilter;
}
public boolean isTermFilter() {
return this instanceof TermFilter;
}
public boolean isGeoFilter() {
return this instanceof GeoFilter;
}
public boolean isRelativeDateFilter() {
return this instanceof RelativeDateFilter;
}
public void copyTo(FilterAbstract<?> selectedItem) {
selectedItem.paramPosition = paramPosition;
selectedItem.negative = negative;
selectedItem.source = source;
}
public abstract void setFromServlet(final ServletTransaction transaction,
final String prefi);
public abstract void setParam(String param) throws SearchLibException;
public FilterType getFilterType() {
return filterType;
}
public boolean isDistance() {
return false;
}
public abstract void reset();
protected FilterHits getFilterHits(Config config, SchemaField defaultField,
Analyzer analyzer, Query query, Timer timer) throws ParseException,
IOException, SearchLibException {
return new FilterHits(getResult(config, query, null, timer)
.getDocSetHits().getFilterHitsCollector(), isNegative(), timer);
}
protected ResultSearchSingle getResult(Config config, Query query,
GeoParameters geoParams, Timer timer) throws SearchLibException {
Timer t = new Timer(timer, "Filter hit: " + query.toString());
SearchFilterRequest filterRequest = new SearchFilterRequest(config,
query, this);
if (geoParams != null)
filterRequest.getGeoParameters().copyFrom(geoParams);
ResultSearchSingle result = (ResultSearchSingle) config
.getIndexAbstract().request(filterRequest);
t.end(null);
return result;
}
public abstract OperatorEnum getOperator(OperatorEnum defaultOperator);
}