Index: contrib/queryparser/src/test/org/apache/lucene/queryParser/standard/TestQPHelper.java =================================================================== --- contrib/queryparser/src/test/org/apache/lucene/queryParser/standard/TestQPHelper.java (revision 802722) +++ contrib/queryparser/src/test/org/apache/lucene/queryParser/standard/TestQPHelper.java (working copy) @@ -55,7 +55,6 @@ import org.apache.lucene.queryParser.core.nodes.WildcardQueryNode; import org.apache.lucene.queryParser.core.processors.QueryNodeProcessorImpl; import org.apache.lucene.queryParser.core.processors.QueryNodeProcessorPipeline; -import org.apache.lucene.queryParser.standard.config.StandardQueryConfigHandler; import org.apache.lucene.queryParser.standard.config.DefaultOperatorAttribute.Operator; import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.FuzzyQuery; @@ -301,6 +300,21 @@ } } + public void testConstantScoreAutoRewrite() throws Exception { + StandardQueryParser qp = new StandardQueryParser(new WhitespaceAnalyzer()); + Query q = qp.parse("foo*bar", "field"); + assertTrue(q instanceof WildcardQuery); + assertEquals(MultiTermQuery.CONSTANT_SCORE_AUTO_REWRITE_DEFAULT, ((MultiTermQuery) q).getRewriteMethod()); + + q = qp.parse("foo*", "field"); + assertTrue(q instanceof PrefixQuery); + assertEquals(MultiTermQuery.CONSTANT_SCORE_AUTO_REWRITE_DEFAULT, ((MultiTermQuery) q).getRewriteMethod()); + + q = qp.parse("[a TO z]", "field"); + assertTrue(q instanceof TermRangeQuery); + assertEquals(MultiTermQuery.CONSTANT_SCORE_AUTO_REWRITE_DEFAULT, ((MultiTermQuery) q).getRewriteMethod()); + } + public void testCJK() throws Exception { // Test Ideographic Space - As wide as a CJK character cell (fullwidth) // used google to translate the word "term" to japanese -> ?? Index: contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/StandardQueryNodeProcessorPipeline.java =================================================================== --- contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/StandardQueryNodeProcessorPipeline.java (revision 802722) +++ contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/StandardQueryNodeProcessorPipeline.java (working copy) @@ -64,6 +64,7 @@ addProcessor(new BooleanSingleChildOptimizationQueryNodeProcessor()); addProcessor(new DefaultPhraseSlopQueryNodeProcessor()); addProcessor(new BoostQueryNodeProcessor()); + addProcessor(new MultiTermRewriteDefaultProcessor()); } Index: contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/MultiTermRewriteDefaultProcessor.java =================================================================== --- contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/MultiTermRewriteDefaultProcessor.java (revision 0) +++ contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/MultiTermRewriteDefaultProcessor.java (revision 0) @@ -0,0 +1,53 @@ +package org.apache.lucene.queryParser.standard.processors; + +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + +import java.util.List; + +import org.apache.lucene.queryParser.core.nodes.QueryNode; +import org.apache.lucene.queryParser.core.nodes.WildcardQueryNode; +import org.apache.lucene.queryParser.core.nodes.PrefixWildcardQueryNode; +import org.apache.lucene.queryParser.core.processors.QueryNodeProcessorImpl; +import org.apache.lucene.search.MultiTermQuery; + +/** + * This processor instates the default {@link + * MultiTermQuery.RewriteMethod}, {@link + * MultiTermQuery#CONSTANT_SCORE_AUTO_REWRITE_DEFAULT}, for + * multi-term query nodes. + */ +public class MultiTermRewriteDefaultProcessor extends QueryNodeProcessorImpl { + + protected QueryNode postProcessNode(QueryNode node) { + if (node instanceof WildcardQueryNode) { + ((WildcardQueryNode) node).setMultiTermRewriteMethod(MultiTermQuery.CONSTANT_SCORE_AUTO_REWRITE_DEFAULT); + } else if (node instanceof PrefixWildcardQueryNode) { + ((PrefixWildcardQueryNode) node).setMultiTermRewriteMethod(MultiTermQuery.CONSTANT_SCORE_AUTO_REWRITE_DEFAULT); + } + + return node; + } + + protected QueryNode preProcessNode(QueryNode node) { + return node; + } + + protected List setChildrenOrder(List children) { + return children; + } +} Property changes on: contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/MultiTermRewriteDefaultProcessor.java ___________________________________________________________________ Added: svn:eol-style + native Index: contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/builders/PrefixWildcardQueryNodeBuilder.java =================================================================== --- contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/builders/PrefixWildcardQueryNodeBuilder.java (revision 802722) +++ contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/builders/PrefixWildcardQueryNodeBuilder.java (working copy) @@ -36,9 +36,10 @@ public PrefixQuery build(QueryNode queryNode) throws QueryNodeException { PrefixWildcardQueryNode wildcardNode = (PrefixWildcardQueryNode) queryNode; - return new PrefixQuery(new Term(wildcardNode.getFieldAsString(), - wildcardNode.getTextAsString())); - + PrefixQuery q = new PrefixQuery(new Term(wildcardNode.getFieldAsString(), + wildcardNode.getTextAsString())); + q.setRewriteMethod(wildcardNode.getMultiTermRewriteMethod()); + return q; } } Index: contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/builders/WildcardQueryNodeBuilder.java =================================================================== --- contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/builders/WildcardQueryNodeBuilder.java (revision 802722) +++ contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/builders/WildcardQueryNodeBuilder.java (working copy) @@ -36,9 +36,10 @@ public WildcardQuery build(QueryNode queryNode) throws QueryNodeException { WildcardQueryNode wildcardNode = (WildcardQueryNode) queryNode; - return new WildcardQuery(new Term(wildcardNode.getFieldAsString(), - wildcardNode.getTextAsString())); - + WildcardQuery q = new WildcardQuery(new Term(wildcardNode.getFieldAsString(), + wildcardNode.getTextAsString())); + q.setRewriteMethod(wildcardNode.getMultiTermRewriteMethod()); + return q; } } Index: contrib/queryparser/src/java/org/apache/lucene/queryParser/core/nodes/WildcardQueryNode.java =================================================================== --- contrib/queryparser/src/java/org/apache/lucene/queryParser/core/nodes/WildcardQueryNode.java (revision 802722) +++ contrib/queryparser/src/java/org/apache/lucene/queryParser/core/nodes/WildcardQueryNode.java (working copy) @@ -18,6 +18,7 @@ */ import org.apache.lucene.queryParser.core.parser.EscapeQuerySyntax; +import org.apache.lucene.search.MultiTermQuery; /** * A {@link WildcardQueryNode} represents wildcard query This does not apply to @@ -25,6 +26,7 @@ */ public class WildcardQueryNode extends FieldQueryNode { private static final long serialVersionUID = 0L; + private MultiTermQuery.RewriteMethod multiTermRewriteMethod; /** * @param field @@ -60,4 +62,15 @@ return clone; } + + /** + * @return the rewrite method + */ + public MultiTermQuery.RewriteMethod getMultiTermRewriteMethod() { + return multiTermRewriteMethod; + } + + public void setMultiTermRewriteMethod(MultiTermQuery.RewriteMethod method) { + multiTermRewriteMethod = method; + } }