/** * Copyright 2014 National University of Ireland, Galway. * * This file is part of the SIREn project. Project and contact information: * * https://github.com/rdelbru/SIREn * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.sindice.siren.qparser.keyword.processors; import org.apache.lucene.queryparser.flexible.core.config.QueryConfigHandler; import org.apache.lucene.queryparser.flexible.core.processors.NoChildOptimizationQueryNodeProcessor; import org.apache.lucene.queryparser.flexible.core.processors.QueryNodeProcessor; import org.apache.lucene.queryparser.flexible.core.processors.QueryNodeProcessorPipeline; import org.apache.lucene.queryparser.flexible.core.processors.RemoveDeletedQueryNodesProcessor; import org.apache.lucene.queryparser.flexible.standard.processors.AllowLeadingWildcardProcessor; import org.apache.lucene.queryparser.flexible.standard.processors.BooleanSingleChildOptimizationQueryNodeProcessor; import org.apache.lucene.queryparser.flexible.standard.processors.BoostQueryNodeProcessor; import org.apache.lucene.queryparser.flexible.standard.processors.DefaultPhraseSlopQueryNodeProcessor; import org.apache.lucene.queryparser.flexible.standard.processors.FuzzyQueryNodeProcessor; import org.apache.lucene.queryparser.flexible.standard.processors.LowercaseExpandedTermsQueryNodeProcessor; import org.apache.lucene.queryparser.flexible.standard.processors.MultiFieldQueryNodeProcessor; import org.apache.lucene.queryparser.flexible.standard.processors.OpenRangeQueryNodeProcessor; import org.apache.lucene.queryparser.flexible.standard.processors.PhraseSlopQueryNodeProcessor; import org.apache.lucene.queryparser.flexible.standard.processors.RemoveEmptyNonLeafQueryNodeProcessor; import org.apache.lucene.queryparser.flexible.standard.processors.StandardQueryNodeProcessorPipeline; import org.apache.lucene.queryparser.flexible.standard.processors.TermRangeQueryNodeProcessor; import org.apache.lucene.search.Query; import org.sindice.siren.qparser.keyword.KeywordSyntaxParser; import org.sindice.siren.qparser.keyword.builders.KeywordQueryTreeBuilder; import org.sindice.siren.qparser.keyword.config.KeywordQueryConfigHandler; import org.sindice.siren.search.node.TwigQuery; /** * This pipeline has all the processors needed to process a query node tree, * generated by {@link KeywordSyntaxParser}, already assembled. * * <p> * * The order they are assembled affects the results. * * <p> * * This processor pipeline was designed to work with * {@link KeywordQueryConfigHandler}. * * <p> * * The result query node tree can be used to build a {@link Query} object using * {@link KeywordQueryTreeBuilder}. * * <p> * * This is a modification of the original * {@link StandardQueryNodeProcessorPipeline} which adds a * {@link ChangeDefaultOperatorNodeProcessor} in order to correctly support * unary operators (SRN-106). Furthermore, it removes the field expansion * {@link MultiFieldQueryNodeProcessor}, and also the {@link BoostQueryNodeProcessor} * since it considers fields (GH-75). Several {@link QueryNodeProcessor} were * added to the {@link TwigQuery} syntax of the {@link KeywordSyntaxParser}. * * @see KeywordQueryTreeBuilder * @see KeywordQueryConfigHandler * @see KeywordSyntaxParser */ public class KeywordQueryNodeProcessorPipeline extends QueryNodeProcessorPipeline { public KeywordQueryNodeProcessorPipeline(final QueryConfigHandler queryConfig) { super(queryConfig); this.add(new TopLevelQueryNodeProcessor()); this.add(new AllowTwigProcessor()); this.add(new WildcardNodeQueryNodeProcessor()); this.add(new RootLevelTwigQueryNodeProcessor()); this.add(new ChangeDefaultOperatorNodeProcessor()); this.add(new WildcardQueryNodeProcessor()); this.add(new FuzzyQueryNodeProcessor()); this.add(new QNamesProcessor()); this.add(new PhraseQueryNodeProcessor()); this.add(new DatatypeQueryNodeProcessor()); // Ranges this.add(new OpenRangeQueryNodeProcessor()); // this processor creates a NodeNumericRangeQuery from a FieldQueryNode, // with both bounds equal. This is why it is before DatatypeAnalyzerProcessor this.add(new NodeNumericQueryNodeProcessor()); this.add(new NodeNumericRangeQueryNodeProcessor()); this.add(new TermRangeQueryNodeProcessor()); this.add(new LowercaseExpandedTermsQueryNodeProcessor()); this.add(new DatatypeAnalyzerProcessor()); this.add(new PhraseSlopQueryNodeProcessor()); this.add(new DefaultPhraseSlopQueryNodeProcessor()); this.add(new AllowFuzzyAndWildcardProcessor()); this.add(new AllowLeadingWildcardProcessor()); this.add(new GroupQueryNodeProcessor()); /* * TODO GroupQueryNodeProcessor is deprecated in Lucene4.0 in favour to * BooleanQuery2ModifierNodeProcessor. Try to apply changes done in SIREn * to it. */ // add(new BooleanQuery2ModifierNodeProcessor()); this.add(new NoChildOptimizationQueryNodeProcessor()); this.add(new RemoveDeletedQueryNodesProcessor()); this.add(new RemoveEmptyNonLeafQueryNodeProcessor()); this.add(new BooleanSingleChildOptimizationQueryNodeProcessor()); this.add(new MultiNodeTermRewriteMethodProcessor()); this.add(new NodeBooleanQueryNodeProcessor()); this.add(new NotSupportedQueryProcessor()); } }