/**
* License Agreement for OpenSearchServer
*
* Copyright (C) 2008-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 javax.xml.xpath.XPathExpressionException;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery;
import org.w3c.dom.Node;
import org.xml.sax.SAXException;
import com.jaeksoft.searchlib.SearchLibException;
import com.jaeksoft.searchlib.query.ParseException;
import com.jaeksoft.searchlib.request.AbstractLocalSearchRequest;
import com.jaeksoft.searchlib.schema.SchemaField;
import com.jaeksoft.searchlib.util.DomUtils;
import com.jaeksoft.searchlib.util.StringUtils;
import com.jaeksoft.searchlib.util.Timer;
import com.jaeksoft.searchlib.util.XPathParser;
import com.jaeksoft.searchlib.util.XmlWriter;
import com.jaeksoft.searchlib.web.ServletTransaction;
import com.jaeksoft.searchlib.webservice.query.search.SearchQueryAbstract.OperatorEnum;
public class TermFilter extends FilterAbstract<TermFilter> {
private transient Query query;
private String field;
private String term;
public TermFilter() {
this("", "", false, Source.REQUEST, null);
}
public TermFilter(String field, String term, boolean negative, Source src,
String paramPosition) {
super(FilterType.TERM_FILTER, src, negative, paramPosition);
this.field = field;
this.term = term;
}
public TermFilter(XPathParser xpp, Node node)
throws XPathExpressionException {
this(DomUtils.getAttributeText(node, "field"), xpp.getNodeString(node,
false), "yes".equals(DomUtils
.getAttributeText(node, "negative")), Source.CONFIGXML, null);
}
public Query getQuery() throws ParseException {
if (query != null)
return query;
query = new TermQuery(new Term(field, term));
return query;
}
public String getField() {
return this.field;
}
public String getTerm() {
return this.term;
}
public void setField(String field) {
this.field = field;
this.query = null;
}
public void setTerm(String term) {
this.term = term;
this.query = null;
}
@Override
public String getDescription() {
return StringUtils.fastConcat("Term filter: ", field, ": " + term);
}
@Override
public String getCacheKey(SchemaField defaultField, Analyzer analyzer,
AbstractLocalSearchRequest request) throws ParseException {
return "QueryFilter - " + getQuery().toString();
}
@Override
public void writeXmlConfig(XmlWriter xmlWriter) throws SAXException {
xmlWriter.startElement("termFilter", "negative", isNegative() ? "yes"
: "no", "field", field);
xmlWriter.textNode(term);
xmlWriter.endElement();
}
@Override
public FilterHits getFilterHits(SchemaField defaultField,
Analyzer analyzer, AbstractLocalSearchRequest request, Timer timer)
throws ParseException, IOException, SearchLibException {
Query query = getQuery();
return new FilterHits(
getResult(request.getConfig(), query, null, timer),
isNegative(), timer);
}
@Override
public TermFilter duplicate() {
return new TermFilter(field, term, isNegative(), getSource(),
getParamPosition());
}
@Override
public void copyTo(FilterAbstract<?> selectedItem) {
if (!(selectedItem instanceof TermFilter))
throw new RuntimeException("Wrong filter type "
+ selectedItem.getClass().getName());
super.copyTo(selectedItem);
TermFilter copyTo = (TermFilter) selectedItem;
copyTo.field = field;
copyTo.term = term;
copyTo.query = null;
}
@Override
final public void setFromServlet(final ServletTransaction transaction,
final String prefix) {
String q = transaction.getParameterString(StringUtils.fastConcat(
prefix, getParamPosition()));
if (q != null)
setTerm(q);
}
@Override
final public void setParam(final String param) {
if (param != null)
setTerm(param);
}
@Override
public void reset() {
query = null;
}
@Override
public OperatorEnum getOperator(OperatorEnum defaultOperator) {
return defaultOperator;
}
}