/**
* 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.w3c.dom.Node;
import org.xml.sax.SAXException;
import com.jaeksoft.searchlib.SearchLibException;
import com.jaeksoft.searchlib.function.expression.SyntaxError;
import com.jaeksoft.searchlib.query.ParseException;
import com.jaeksoft.searchlib.request.AbstractLocalSearchRequest;
import com.jaeksoft.searchlib.schema.SchemaField;
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 MirrorAndFilter extends FilterAbstract<MirrorAndFilter> {
private transient Query query;
public MirrorAndFilter() {
this(Source.REQUEST, false, null);
}
public MirrorAndFilter(Source source, boolean negative, String paramPosition) {
super(FilterType.MIRROR_AND_FILTER, source, negative, paramPosition);
query = null;
}
public MirrorAndFilter(XPathParser xpp, Node node) {
super(FilterType.MIRROR_AND_FILTER, Source.CONFIGXML, "yes"
.equals(XPathParser.getAttributeString(node, "negative")), null);
}
@Override
public String getDescription() {
StringBuilder sb = new StringBuilder("Mirror AND filter: ");
return sb.toString();
}
@Override
public void writeXmlConfig(XmlWriter xmlWriter) throws SAXException {
xmlWriter.startElement("mirrorAndFilter");
xmlWriter.endElement();
}
@Override
public String getCacheKey(SchemaField defaultField, Analyzer analyzer,
AbstractLocalSearchRequest request) throws ParseException,
SyntaxError, SearchLibException, IOException {
StringBuilder sb = new StringBuilder("MirrorAndFilter - ");
sb.append(getQuery(request).toString());
return sb.toString();
}
private Query getQuery(AbstractLocalSearchRequest request)
throws ParseException, SyntaxError, SearchLibException, IOException {
if (query != null)
return query;
try {
request = (AbstractLocalSearchRequest) request.duplicate();
request.setDefaultOperator(OperatorEnum.AND);
query = request.getNotBoostedQuery();
return query;
} catch (InstantiationException e) {
throw new SearchLibException(e);
} catch (IllegalAccessException e) {
throw new SearchLibException(e);
}
}
@Override
public FilterHits getFilterHits(SchemaField defaultField,
Analyzer analyzer, AbstractLocalSearchRequest request, Timer timer)
throws ParseException, IOException, SearchLibException, SyntaxError {
Query query = getQuery(request);
return new FilterHits(
getResult(request.getConfig(), query, null, timer),
isNegative(), timer);
}
@Override
public MirrorAndFilter duplicate() {
return new MirrorAndFilter(getSource(), isNegative(),
getParamPosition());
}
@Override
public void copyTo(FilterAbstract<?> selectedItem) {
if (!(selectedItem instanceof MirrorAndFilter))
throw new RuntimeException("Wrong filter type "
+ selectedItem.getClass().getName());
super.copyTo(selectedItem);
MirrorAndFilter copyTo = (MirrorAndFilter) selectedItem;
copyTo.query = null;
}
@Override
final public void setFromServlet(final ServletTransaction transaction,
final String prefix) {
}
@Override
public void setParam(String params) throws SearchLibException {
}
@Override
public boolean isDistance() {
return false;
}
@Override
public void reset() {
query = null;
}
@Override
public OperatorEnum getOperator(OperatorEnum defaultOperator) {
return OperatorEnum.AND;
}
}