mirror of https://github.com/apache/lucene.git
LUCENE-1937: add methods to manipulate QueryNodeProcessorPipeline elements
git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1024402 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
fb93148568
commit
6f66858572
|
@ -158,6 +158,10 @@ API Changes
|
||||||
* LUCENE-2712: FieldBoostMapAttribute in contrib/queryparser was changed from
|
* LUCENE-2712: FieldBoostMapAttribute in contrib/queryparser was changed from
|
||||||
a Map<CharSequence,Float> to a Map<String,Float>. Per the CharSequence javadoc,
|
a Map<CharSequence,Float> to a Map<String,Float>. Per the CharSequence javadoc,
|
||||||
CharSequence is inappropriate as a map key. (Robert Muir)
|
CharSequence is inappropriate as a map key. (Robert Muir)
|
||||||
|
|
||||||
|
* LUCENE-1937: Add more methods to manipulate QueryNodeProcessorPipeline elements.
|
||||||
|
QueryNodeProcessorPipeline now implements the List interface, this is useful
|
||||||
|
if you want to extend or modify an existing pipeline. (Adriano Crestani via Robert Muir)
|
||||||
|
|
||||||
New features
|
New features
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,11 @@ package org.apache.lucene.queryParser.core.processors;
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Iterator;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.ListIterator;
|
||||||
|
|
||||||
import org.apache.lucene.queryParser.core.QueryNodeException;
|
import org.apache.lucene.queryParser.core.QueryNodeException;
|
||||||
import org.apache.lucene.queryParser.core.config.QueryConfigHandler;
|
import org.apache.lucene.queryParser.core.config.QueryConfigHandler;
|
||||||
|
@ -33,11 +37,12 @@ import org.apache.lucene.queryParser.core.nodes.QueryNode;
|
||||||
* processors were on the pipeline.
|
* processors were on the pipeline.
|
||||||
*
|
*
|
||||||
* When a {@link QueryConfigHandler} object is set on a
|
* When a {@link QueryConfigHandler} object is set on a
|
||||||
* {@link QueryNodeProcessorPipeline}, it takes care of also setting this
|
* {@link QueryNodeProcessorPipeline}, it also takes care of setting this
|
||||||
* {@link QueryConfigHandler} on all processor on pipeline.
|
* {@link QueryConfigHandler} on all processor on pipeline.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class QueryNodeProcessorPipeline implements QueryNodeProcessor {
|
public class QueryNodeProcessorPipeline implements QueryNodeProcessor,
|
||||||
|
List<QueryNodeProcessor> {
|
||||||
|
|
||||||
private LinkedList<QueryNodeProcessor> processors = new LinkedList<QueryNodeProcessor>();
|
private LinkedList<QueryNodeProcessor> processors = new LinkedList<QueryNodeProcessor>();
|
||||||
|
|
||||||
|
@ -74,11 +79,10 @@ public class QueryNodeProcessorPipeline implements QueryNodeProcessor {
|
||||||
* For reference about this method check:
|
* For reference about this method check:
|
||||||
* {@link QueryNodeProcessor#process(QueryNode)}.
|
* {@link QueryNodeProcessor#process(QueryNode)}.
|
||||||
*
|
*
|
||||||
* @param queryTree
|
* @param queryTree the query node tree to be processed
|
||||||
* the query node tree to be processed
|
|
||||||
*
|
*
|
||||||
* @throws QueryNodeException
|
* @throws QueryNodeException if something goes wrong during the query node
|
||||||
* if something goes wrong during the query node processing
|
* processing
|
||||||
*
|
*
|
||||||
* @see QueryNode
|
* @see QueryNode
|
||||||
*/
|
*/
|
||||||
|
@ -96,9 +100,12 @@ public class QueryNodeProcessorPipeline implements QueryNodeProcessor {
|
||||||
* Adds a processor to the pipeline, it's always added to the end of the
|
* Adds a processor to the pipeline, it's always added to the end of the
|
||||||
* pipeline.
|
* pipeline.
|
||||||
*
|
*
|
||||||
* @param processor
|
* @deprecated this class now conforms to {@link List} interface, so use
|
||||||
* the processor to be added
|
* {@link #add(QueryNodeProcessor)} instead
|
||||||
|
*
|
||||||
|
* @param processor the processor to be added
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public void addProcessor(QueryNodeProcessor processor) {
|
public void addProcessor(QueryNodeProcessor processor) {
|
||||||
this.processors.add(processor);
|
this.processors.add(processor);
|
||||||
|
|
||||||
|
@ -110,8 +117,7 @@ public class QueryNodeProcessorPipeline implements QueryNodeProcessor {
|
||||||
* For reference about this method check:
|
* For reference about this method check:
|
||||||
* {@link QueryNodeProcessor#setQueryConfigHandler(QueryConfigHandler)}.
|
* {@link QueryNodeProcessor#setQueryConfigHandler(QueryConfigHandler)}.
|
||||||
*
|
*
|
||||||
* @param queryConfigHandler
|
* @param queryConfigHandler the query configuration handler to be set.
|
||||||
* the query configuration handler to be set.
|
|
||||||
*
|
*
|
||||||
* @see QueryNodeProcessor#getQueryConfigHandler()
|
* @see QueryNodeProcessor#getQueryConfigHandler()
|
||||||
* @see QueryConfigHandler
|
* @see QueryConfigHandler
|
||||||
|
@ -125,4 +131,195 @@ public class QueryNodeProcessorPipeline implements QueryNodeProcessor {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see List#add(Object)
|
||||||
|
*/
|
||||||
|
public boolean add(QueryNodeProcessor processor) {
|
||||||
|
boolean added = this.processors.add(processor);
|
||||||
|
|
||||||
|
if (added) {
|
||||||
|
processor.setQueryConfigHandler(this.queryConfig);
|
||||||
|
}
|
||||||
|
|
||||||
|
return added;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see List#add(int, Object)
|
||||||
|
*/
|
||||||
|
public void add(int index, QueryNodeProcessor processor) {
|
||||||
|
this.processors.add(index, processor);
|
||||||
|
processor.setQueryConfigHandler(this.queryConfig);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see List#addAll(Collection)
|
||||||
|
*/
|
||||||
|
public boolean addAll(Collection<? extends QueryNodeProcessor> c) {
|
||||||
|
boolean anyAdded = this.processors.addAll(c);
|
||||||
|
|
||||||
|
for (QueryNodeProcessor processor : c) {
|
||||||
|
processor.setQueryConfigHandler(this.queryConfig);
|
||||||
|
}
|
||||||
|
|
||||||
|
return anyAdded;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see List#addAll(int, Collection)
|
||||||
|
*/
|
||||||
|
public boolean addAll(int index, Collection<? extends QueryNodeProcessor> c) {
|
||||||
|
boolean anyAdded = this.processors.addAll(index, c);
|
||||||
|
|
||||||
|
for (QueryNodeProcessor processor : c) {
|
||||||
|
processor.setQueryConfigHandler(this.queryConfig);
|
||||||
|
}
|
||||||
|
|
||||||
|
return anyAdded;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see List#clear()
|
||||||
|
*/
|
||||||
|
public void clear() {
|
||||||
|
this.processors.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see List#contains(Object)
|
||||||
|
*/
|
||||||
|
public boolean contains(Object o) {
|
||||||
|
return this.processors.contains(o);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see List#containsAll(Collection)
|
||||||
|
*/
|
||||||
|
public boolean containsAll(Collection<?> c) {
|
||||||
|
return this.processors.containsAll(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see List#get(int)
|
||||||
|
*/
|
||||||
|
public QueryNodeProcessor get(int index) {
|
||||||
|
return this.processors.get(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see List#indexOf(Object)
|
||||||
|
*/
|
||||||
|
public int indexOf(Object o) {
|
||||||
|
return this.processors.indexOf(o);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see List#isEmpty()
|
||||||
|
*/
|
||||||
|
public boolean isEmpty() {
|
||||||
|
return this.processors.isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see List#iterator()
|
||||||
|
*/
|
||||||
|
public Iterator<QueryNodeProcessor> iterator() {
|
||||||
|
return this.processors.iterator();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see List#lastIndexOf(Object)
|
||||||
|
*/
|
||||||
|
public int lastIndexOf(Object o) {
|
||||||
|
return this.processors.lastIndexOf(o);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see List#listIterator()
|
||||||
|
*/
|
||||||
|
public ListIterator<QueryNodeProcessor> listIterator() {
|
||||||
|
return this.processors.listIterator();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see List#listIterator(int)
|
||||||
|
*/
|
||||||
|
public ListIterator<QueryNodeProcessor> listIterator(int index) {
|
||||||
|
return this.processors.listIterator(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see List#remove(Object)
|
||||||
|
*/
|
||||||
|
public boolean remove(Object o) {
|
||||||
|
return this.processors.remove(o);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see List#remove(int)
|
||||||
|
*/
|
||||||
|
public QueryNodeProcessor remove(int index) {
|
||||||
|
return this.processors.remove(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see List#removeAll(Collection)
|
||||||
|
*/
|
||||||
|
public boolean removeAll(Collection<?> c) {
|
||||||
|
return this.processors.removeAll(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see List#retainAll(Collection)
|
||||||
|
*/
|
||||||
|
public boolean retainAll(Collection<?> c) {
|
||||||
|
return this.processors.retainAll(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see List#set(int, Object)
|
||||||
|
*/
|
||||||
|
public QueryNodeProcessor set(int index, QueryNodeProcessor processor) {
|
||||||
|
QueryNodeProcessor oldProcessor = this.processors.set(index, processor);
|
||||||
|
|
||||||
|
if (oldProcessor != processor) {
|
||||||
|
processor.setQueryConfigHandler(this.queryConfig);
|
||||||
|
}
|
||||||
|
|
||||||
|
return oldProcessor;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see List#size()
|
||||||
|
*/
|
||||||
|
public int size() {
|
||||||
|
return this.processors.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see List#subList(int, int)
|
||||||
|
*/
|
||||||
|
public List<QueryNodeProcessor> subList(int fromIndex, int toIndex) {
|
||||||
|
return this.processors.subList(fromIndex, toIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see List#toArray(Object[])
|
||||||
|
*/
|
||||||
|
public <T> T[] toArray(T[] array) {
|
||||||
|
return this.processors.toArray(array);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see List#toArray()
|
||||||
|
*/
|
||||||
|
public Object[] toArray() {
|
||||||
|
return this.processors.toArray();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,23 +48,23 @@ public class StandardQueryNodeProcessorPipeline extends
|
||||||
public StandardQueryNodeProcessorPipeline(QueryConfigHandler queryConfig) {
|
public StandardQueryNodeProcessorPipeline(QueryConfigHandler queryConfig) {
|
||||||
super(queryConfig);
|
super(queryConfig);
|
||||||
|
|
||||||
addProcessor(new WildcardQueryNodeProcessor());
|
add(new WildcardQueryNodeProcessor());
|
||||||
addProcessor(new MultiFieldQueryNodeProcessor());
|
add(new MultiFieldQueryNodeProcessor());
|
||||||
addProcessor(new FuzzyQueryNodeProcessor());
|
add(new FuzzyQueryNodeProcessor());
|
||||||
addProcessor(new MatchAllDocsQueryNodeProcessor());
|
add(new MatchAllDocsQueryNodeProcessor());
|
||||||
addProcessor(new LowercaseExpandedTermsQueryNodeProcessor());
|
add(new LowercaseExpandedTermsQueryNodeProcessor());
|
||||||
addProcessor(new ParametricRangeQueryNodeProcessor());
|
add(new ParametricRangeQueryNodeProcessor());
|
||||||
addProcessor(new AllowLeadingWildcardProcessor());
|
add(new AllowLeadingWildcardProcessor());
|
||||||
addProcessor(new AnalyzerQueryNodeProcessor());
|
add(new AnalyzerQueryNodeProcessor());
|
||||||
addProcessor(new PhraseSlopQueryNodeProcessor());
|
add(new PhraseSlopQueryNodeProcessor());
|
||||||
addProcessor(new GroupQueryNodeProcessor());
|
add(new GroupQueryNodeProcessor());
|
||||||
addProcessor(new NoChildOptimizationQueryNodeProcessor());
|
add(new NoChildOptimizationQueryNodeProcessor());
|
||||||
addProcessor(new RemoveDeletedQueryNodesProcessor());
|
add(new RemoveDeletedQueryNodesProcessor());
|
||||||
addProcessor(new RemoveEmptyNonLeafQueryNodeProcessor());
|
add(new RemoveEmptyNonLeafQueryNodeProcessor());
|
||||||
addProcessor(new BooleanSingleChildOptimizationQueryNodeProcessor());
|
add(new BooleanSingleChildOptimizationQueryNodeProcessor());
|
||||||
addProcessor(new DefaultPhraseSlopQueryNodeProcessor());
|
add(new DefaultPhraseSlopQueryNodeProcessor());
|
||||||
addProcessor(new BoostQueryNodeProcessor());
|
add(new BoostQueryNodeProcessor());
|
||||||
addProcessor(new MultiTermRewriteMethodProcessor());
|
add(new MultiTermRewriteMethodProcessor());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -117,11 +117,9 @@ public class TestSpanQueryParser extends LuceneTestCase {
|
||||||
this.spanProcessorPipeline
|
this.spanProcessorPipeline
|
||||||
.setQueryConfigHandler(this.spanQueryConfigHandler);
|
.setQueryConfigHandler(this.spanQueryConfigHandler);
|
||||||
|
|
||||||
this.spanProcessorPipeline.addProcessor(new WildcardQueryNodeProcessor());
|
this.spanProcessorPipeline.add(new WildcardQueryNodeProcessor());
|
||||||
this.spanProcessorPipeline
|
this.spanProcessorPipeline.add(new SpansValidatorQueryNodeProcessor());
|
||||||
.addProcessor(new SpansValidatorQueryNodeProcessor());
|
this.spanProcessorPipeline.add(new UniqueFieldQueryNodeProcessor());
|
||||||
this.spanProcessorPipeline
|
|
||||||
.addProcessor(new UniqueFieldQueryNodeProcessor());
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -113,9 +113,9 @@ public class TestSpanQueryParserSimpleSample extends LuceneTestCase {
|
||||||
QueryNodeProcessorPipeline spanProcessorPipeline = new QueryNodeProcessorPipeline(
|
QueryNodeProcessorPipeline spanProcessorPipeline = new QueryNodeProcessorPipeline(
|
||||||
spanQueryConfigHandler);
|
spanQueryConfigHandler);
|
||||||
// @see SpansValidatorQueryNodeProcessor
|
// @see SpansValidatorQueryNodeProcessor
|
||||||
spanProcessorPipeline.addProcessor(new SpansValidatorQueryNodeProcessor());
|
spanProcessorPipeline.add(new SpansValidatorQueryNodeProcessor());
|
||||||
// @see UniqueFieldQueryNodeProcessor
|
// @see UniqueFieldQueryNodeProcessor
|
||||||
spanProcessorPipeline.addProcessor(new UniqueFieldQueryNodeProcessor());
|
spanProcessorPipeline.add(new UniqueFieldQueryNodeProcessor());
|
||||||
|
|
||||||
// print to show out the QueryNode tree before being processed
|
// print to show out the QueryNode tree before being processed
|
||||||
if (VERBOSE) System.out.println(queryTree);
|
if (VERBOSE) System.out.println(queryTree);
|
||||||
|
|
|
@ -138,7 +138,7 @@ public class TestQPHelper extends LuceneTestCase {
|
||||||
public static class QPTestParser extends StandardQueryParser {
|
public static class QPTestParser extends StandardQueryParser {
|
||||||
public QPTestParser(Analyzer a) {
|
public QPTestParser(Analyzer a) {
|
||||||
((QueryNodeProcessorPipeline)getQueryNodeProcessor())
|
((QueryNodeProcessorPipeline)getQueryNodeProcessor())
|
||||||
.addProcessor(new QPTestParserQueryNodeProcessor());
|
.add(new QPTestParserQueryNodeProcessor());
|
||||||
this.setAnalyzer(a);
|
this.setAnalyzer(a);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -139,9 +139,9 @@ public class TestQueryParserWrapper extends LuceneTestCase {
|
||||||
|
|
||||||
QueryNodeProcessorPipeline newProcessorPipeline = new QueryNodeProcessorPipeline(
|
QueryNodeProcessorPipeline newProcessorPipeline = new QueryNodeProcessorPipeline(
|
||||||
getQueryProcessor().getQueryConfigHandler());
|
getQueryProcessor().getQueryConfigHandler());
|
||||||
newProcessorPipeline.addProcessor(new WildcardQueryNodeProcessor());
|
newProcessorPipeline.add(new WildcardQueryNodeProcessor());
|
||||||
newProcessorPipeline.addProcessor(new QPTestParserQueryNodeProcessor());
|
newProcessorPipeline.add(new QPTestParserQueryNodeProcessor());
|
||||||
newProcessorPipeline.addProcessor(getQueryProcessor());
|
newProcessorPipeline.add(getQueryProcessor());
|
||||||
|
|
||||||
setQueryProcessor(newProcessorPipeline);
|
setQueryProcessor(newProcessorPipeline);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue