diff --git a/contrib/CHANGES.txt b/contrib/CHANGES.txt index c4e104cf79e..c58b81783cc 100644 --- a/contrib/CHANGES.txt +++ b/contrib/CHANGES.txt @@ -75,6 +75,9 @@ Bug fixes that the regexp must match the entire string, not just a prefix. (Trejkaz via Mike McCandless) +10. LUCENE-1792: Fix new query parser to set rewrite method for + multi-term queries. (Luis Alves, Mike McCandless via Michael Busch) + New features diff --git a/contrib/queryparser/src/java/org/apache/lucene/queryParser/core/QueryParserHelper.java b/contrib/queryparser/src/java/org/apache/lucene/queryParser/core/QueryParserHelper.java index b7d05b0bddc..626d8a56ce2 100644 --- a/contrib/queryparser/src/java/org/apache/lucene/queryParser/core/QueryParserHelper.java +++ b/contrib/queryparser/src/java/org/apache/lucene/queryParser/core/QueryParserHelper.java @@ -122,7 +122,7 @@ public class QueryParserHelper { * @param syntaxParser * the text parser that will be used to parse the query string * - * @see #getTextParser() + * @see #getSyntaxParser() * @see SyntaxParser */ public void setSyntaxParser(SyntaxParser syntaxParser) { @@ -193,7 +193,7 @@ public class QueryParserHelper { * @see SyntaxParser * @see #setSyntaxParser(SyntaxParser) */ - public SyntaxParser getTextParser() { + public SyntaxParser getSyntaxParser() { return this.syntaxParser; } @@ -225,7 +225,7 @@ public class QueryParserHelper { * In this method the three phases are executed:
*
*      1st - the query string is parsed using the - * text parser returned by {@link #getTextParser()}, the result is a query + * text parser returned by {@link #getSyntaxParser()}, the result is a query * node tree
*
*      2nd - the query node tree is processed by the @@ -246,7 +246,7 @@ public class QueryParserHelper { */ public Object parse(String query, String defaultField) throws QueryNodeException { - QueryNode queryTree = getTextParser().parse(query, defaultField); + QueryNode queryTree = getSyntaxParser().parse(query, defaultField); QueryNodeProcessor processor = getQueryNodeProcessor(); diff --git a/contrib/queryparser/src/java/org/apache/lucene/queryParser/core/nodes/FieldQueryNode.java b/contrib/queryparser/src/java/org/apache/lucene/queryParser/core/nodes/FieldQueryNode.java index 82b38b1a8db..e5abe5ccd43 100644 --- a/contrib/queryparser/src/java/org/apache/lucene/queryParser/core/nodes/FieldQueryNode.java +++ b/contrib/queryparser/src/java/org/apache/lucene/queryParser/core/nodes/FieldQueryNode.java @@ -75,11 +75,11 @@ public class FieldQueryNode extends QueryNodeImpl implements TextableQueryNode, } - CharSequence getTermEscaped(EscapeQuerySyntax escaper) { + protected CharSequence getTermEscaped(EscapeQuerySyntax escaper) { return escaper.escape(this.text, Locale.getDefault(), Type.NORMAL); } - CharSequence getTermEscapeQuoted(EscapeQuerySyntax escaper) { + protected CharSequence getTermEscapeQuoted(EscapeQuerySyntax escaper) { return escaper.escape(this.text, Locale.getDefault(), Type.STRING); } diff --git a/contrib/queryparser/src/java/org/apache/lucene/queryParser/core/nodes/PrefixWildcardQueryNode.java b/contrib/queryparser/src/java/org/apache/lucene/queryParser/core/nodes/PrefixWildcardQueryNode.java index d905e463ae3..e69de29bb2d 100644 --- a/contrib/queryparser/src/java/org/apache/lucene/queryParser/core/nodes/PrefixWildcardQueryNode.java +++ b/contrib/queryparser/src/java/org/apache/lucene/queryParser/core/nodes/PrefixWildcardQueryNode.java @@ -1,57 +0,0 @@ -package org.apache.lucene.queryParser.core.nodes; - -/** - * 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. - */ - -/** - * A {@link PrefixWildcardQueryNode} represents wildcardquery that matches abc* - * or *. This does not apply to phrases, this is a special case on the original - * lucene parser. TODO: refactor the code to remove this special case from the - * parser. and probably do it on a Processor - */ -public class PrefixWildcardQueryNode extends WildcardQueryNode { - - private static final long serialVersionUID = 6851557641826407515L; - - /** - * @param field - * - field name - * @param text - * - value including the wildcard - * @param begin - * - position in the query string - * @param end - * - position in the query string - */ - public PrefixWildcardQueryNode(CharSequence field, CharSequence text, - int begin, int end) { - super(field, text, begin, end); - } - - public String toString() { - return ""; - } - - public PrefixWildcardQueryNode cloneTree() throws CloneNotSupportedException { - PrefixWildcardQueryNode clone = (PrefixWildcardQueryNode) super.cloneTree(); - - // nothing to do here - - return clone; - } -} diff --git a/contrib/queryparser/src/java/org/apache/lucene/queryParser/core/nodes/WildcardQueryNode.java b/contrib/queryparser/src/java/org/apache/lucene/queryParser/core/nodes/WildcardQueryNode.java index 0a9ac36c533..e69de29bb2d 100644 --- a/contrib/queryparser/src/java/org/apache/lucene/queryParser/core/nodes/WildcardQueryNode.java +++ b/contrib/queryparser/src/java/org/apache/lucene/queryParser/core/nodes/WildcardQueryNode.java @@ -1,76 +0,0 @@ -package org.apache.lucene.queryParser.core.nodes; - -/** - * 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 org.apache.lucene.queryParser.core.parser.EscapeQuerySyntax; -import org.apache.lucene.search.MultiTermQuery; - -/** - * A {@link WildcardQueryNode} represents wildcard query This does not apply to - * phrases. Examples: a*b*c Fl?w? m?ke*g - */ -public class WildcardQueryNode extends FieldQueryNode { - private static final long serialVersionUID = 0L; - private MultiTermQuery.RewriteMethod multiTermRewriteMethod; - - /** - * @param field - * - field name - * @param text - * - value that contains one or more wild card characters (? or *) - * @param begin - * - position in the query string - * @param end - * - position in the query string - */ - public WildcardQueryNode(CharSequence field, CharSequence text, int begin, - int end) { - super(field, text, begin, end); - } - - public CharSequence toQueryString(EscapeQuerySyntax escaper) { - if (isDefaultField(this.field)) { - return getTermEscaped(escaper); - } else { - return this.field + ":" + getTermEscaped(escaper); - } - } - - public String toString() { - return ""; - } - - public WildcardQueryNode cloneTree() throws CloneNotSupportedException { - WildcardQueryNode clone = (WildcardQueryNode) super.cloneTree(); - - // nothing to do here - - return clone; - } - - /** - * @return the rewrite method - */ - public MultiTermQuery.RewriteMethod getMultiTermRewriteMethod() { - return multiTermRewriteMethod; - } - - public void setMultiTermRewriteMethod(MultiTermQuery.RewriteMethod method) { - multiTermRewriteMethod = method; - } -} diff --git a/contrib/queryparser/src/java/org/apache/lucene/queryParser/core/util/UnescapedCharSequence.java b/contrib/queryparser/src/java/org/apache/lucene/queryParser/core/util/UnescapedCharSequence.java index c00904eac84..bbc74cd0bd8 100644 --- a/contrib/queryparser/src/java/org/apache/lucene/queryParser/core/util/UnescapedCharSequence.java +++ b/contrib/queryparser/src/java/org/apache/lucene/queryParser/core/util/UnescapedCharSequence.java @@ -85,10 +85,6 @@ public final class UnescapedCharSequence implements CharSequence { newLength); } - public boolean wasEscaped(int index) { - return this.wasEscaped[index]; - } - public String toString() { return new String(this.chars); } @@ -138,4 +134,23 @@ public final class UnescapedCharSequence implements CharSequence { } return result.toString(); } + + public boolean wasEscaped(int index) { + return this.wasEscaped[index]; + } + + static final public boolean wasEscaped(CharSequence text, int index) { + if (text instanceof UnescapedCharSequence) + return ((UnescapedCharSequence)text).wasEscaped[index]; + else return false; + } + + public static CharSequence toLowerCase(CharSequence text) { + if (text instanceof UnescapedCharSequence) { + char[] chars = text.toString().toLowerCase().toCharArray(); + boolean[] wasEscaped = ((UnescapedCharSequence)text).wasEscaped; + return new UnescapedCharSequence(chars, wasEscaped, 0, chars.length); + } else + return new UnescapedCharSequence(text.toString().toLowerCase()); + } } diff --git a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/QueryParserWrapper.java b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/QueryParserWrapper.java index b2bd053a83f..dcdc6d006d8 100644 --- a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/QueryParserWrapper.java +++ b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/QueryParserWrapper.java @@ -38,15 +38,15 @@ import org.apache.lucene.queryParser.standard.builders.StandardQueryBuilder; import org.apache.lucene.queryParser.standard.builders.StandardQueryTreeBuilder; import org.apache.lucene.queryParser.standard.config.AllowLeadingWildcardAttribute; import org.apache.lucene.queryParser.standard.config.AnalyzerAttribute; -import org.apache.lucene.queryParser.standard.config.MultiTermRewriteMethodAttribute; import org.apache.lucene.queryParser.standard.config.DateResolutionAttribute; import org.apache.lucene.queryParser.standard.config.DefaultOperatorAttribute; import org.apache.lucene.queryParser.standard.config.DefaultPhraseSlopAttribute; import org.apache.lucene.queryParser.standard.config.LocaleAttribute; import org.apache.lucene.queryParser.standard.config.LowercaseExpandedTermsAttribute; -import org.apache.lucene.queryParser.standard.config.StandardQueryConfigHandler; +import org.apache.lucene.queryParser.standard.config.MultiTermRewriteMethodAttribute; import org.apache.lucene.queryParser.standard.config.PositionIncrementsAttribute; import org.apache.lucene.queryParser.standard.config.RangeCollatorAttribute; +import org.apache.lucene.queryParser.standard.config.StandardQueryConfigHandler; import org.apache.lucene.queryParser.standard.parser.StandardSyntaxParser; import org.apache.lucene.queryParser.standard.processors.StandardQueryNodeProcessorPipeline; import org.apache.lucene.search.FuzzyQuery; diff --git a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/StandardQueryParser.java b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/StandardQueryParser.java index 74f7738ef5f..3640548242e 100644 --- a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/StandardQueryParser.java +++ b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/StandardQueryParser.java @@ -31,18 +31,18 @@ import org.apache.lucene.queryParser.standard.builders.StandardQueryTreeBuilder; import org.apache.lucene.queryParser.standard.config.AllowLeadingWildcardAttribute; import org.apache.lucene.queryParser.standard.config.AnalyzerAttribute; import org.apache.lucene.queryParser.standard.config.DateResolutionAttribute; -import org.apache.lucene.queryParser.standard.config.FieldDateResolutionMapAttribute; import org.apache.lucene.queryParser.standard.config.DefaultOperatorAttribute; import org.apache.lucene.queryParser.standard.config.DefaultPhraseSlopAttribute; import org.apache.lucene.queryParser.standard.config.FieldBoostMapAttribute; +import org.apache.lucene.queryParser.standard.config.FieldDateResolutionMapAttribute; import org.apache.lucene.queryParser.standard.config.FuzzyAttribute; import org.apache.lucene.queryParser.standard.config.LocaleAttribute; import org.apache.lucene.queryParser.standard.config.LowercaseExpandedTermsAttribute; import org.apache.lucene.queryParser.standard.config.MultiFieldAttribute; import org.apache.lucene.queryParser.standard.config.MultiTermRewriteMethodAttribute; -import org.apache.lucene.queryParser.standard.config.StandardQueryConfigHandler; import org.apache.lucene.queryParser.standard.config.PositionIncrementsAttribute; import org.apache.lucene.queryParser.standard.config.RangeCollatorAttribute; +import org.apache.lucene.queryParser.standard.config.StandardQueryConfigHandler; import org.apache.lucene.queryParser.standard.config.DefaultOperatorAttribute.Operator; import org.apache.lucene.queryParser.standard.nodes.RangeQueryNode; import org.apache.lucene.queryParser.standard.parser.StandardSyntaxParser; diff --git a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/builders/PrefixWildcardQueryNodeBuilder.java b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/builders/PrefixWildcardQueryNodeBuilder.java index e68ad99d0a6..943e20c8a1a 100644 --- a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/builders/PrefixWildcardQueryNodeBuilder.java +++ b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/builders/PrefixWildcardQueryNodeBuilder.java @@ -19,8 +19,10 @@ package org.apache.lucene.queryParser.standard.builders; import org.apache.lucene.index.Term; import org.apache.lucene.queryParser.core.QueryNodeException; -import org.apache.lucene.queryParser.core.nodes.PrefixWildcardQueryNode; import org.apache.lucene.queryParser.core.nodes.QueryNode; +import org.apache.lucene.queryParser.standard.config.MultiTermRewriteMethodAttribute; +import org.apache.lucene.queryParser.standard.nodes.PrefixWildcardQueryNode; +import org.apache.lucene.search.MultiTermQuery; import org.apache.lucene.search.PrefixQuery; /** @@ -33,12 +35,18 @@ public class PrefixWildcardQueryNodeBuilder implements StandardQueryBuilder { // empty constructor } - public PrefixQuery build(QueryNode queryNode) throws QueryNodeException { + public PrefixQuery build(QueryNode queryNode) throws QueryNodeException { + PrefixWildcardQueryNode wildcardNode = (PrefixWildcardQueryNode) queryNode; - PrefixQuery q = new PrefixQuery(new Term(wildcardNode.getFieldAsString(), - wildcardNode.getTextAsString())); - q.setRewriteMethod(wildcardNode.getMultiTermRewriteMethod()); + String text = wildcardNode.getText().subSequence(0, wildcardNode.getText().length() - 1).toString(); + PrefixQuery q = new PrefixQuery(new Term(wildcardNode.getFieldAsString(), text)); + + MultiTermQuery.RewriteMethod method = (MultiTermQuery.RewriteMethod)queryNode.getTag(MultiTermRewriteMethodAttribute.TAG_ID); + if (method != null) { + q.setRewriteMethod(method); + } + return q; } diff --git a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/builders/RangeQueryNodeBuilder.java b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/builders/RangeQueryNodeBuilder.java index 0b48f6327db..1b90cb599c2 100644 --- a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/builders/RangeQueryNodeBuilder.java +++ b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/builders/RangeQueryNodeBuilder.java @@ -21,7 +21,9 @@ import org.apache.lucene.queryParser.core.QueryNodeException; import org.apache.lucene.queryParser.core.nodes.ParametricQueryNode; import org.apache.lucene.queryParser.core.nodes.QueryNode; import org.apache.lucene.queryParser.core.nodes.ParametricQueryNode.CompareOperator; +import org.apache.lucene.queryParser.standard.config.MultiTermRewriteMethodAttribute; import org.apache.lucene.queryParser.standard.nodes.RangeQueryNode; +import org.apache.lucene.search.MultiTermQuery; import org.apache.lucene.search.TermRangeQuery; /** @@ -54,7 +56,11 @@ public class RangeQueryNodeBuilder implements StandardQueryBuilder { TermRangeQuery rangeQuery = new TermRangeQuery(field, lower .getTextAsString(), upper.getTextAsString(), lowerInclusive, upperInclusive, rangeNode.getCollator()); - rangeQuery.setRewriteMethod(rangeNode.getMultiTermRewriteMethod()); + + MultiTermQuery.RewriteMethod method = (MultiTermQuery.RewriteMethod)queryNode.getTag(MultiTermRewriteMethodAttribute.TAG_ID); + if (method != null) { + rangeQuery.setRewriteMethod(method); + } return rangeQuery; diff --git a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/builders/StandardQueryTreeBuilder.java b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/builders/StandardQueryTreeBuilder.java index bb9dbaaf6e0..ba1dfc4e2ae 100644 --- a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/builders/StandardQueryTreeBuilder.java +++ b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/builders/StandardQueryTreeBuilder.java @@ -27,14 +27,14 @@ import org.apache.lucene.queryParser.core.nodes.GroupQueryNode; import org.apache.lucene.queryParser.core.nodes.MatchAllDocsQueryNode; import org.apache.lucene.queryParser.core.nodes.MatchNoDocsQueryNode; import org.apache.lucene.queryParser.core.nodes.ModifierQueryNode; -import org.apache.lucene.queryParser.core.nodes.PrefixWildcardQueryNode; import org.apache.lucene.queryParser.core.nodes.QueryNode; import org.apache.lucene.queryParser.core.nodes.SlopQueryNode; import org.apache.lucene.queryParser.core.nodes.TokenizedPhraseQueryNode; -import org.apache.lucene.queryParser.core.nodes.WildcardQueryNode; -import org.apache.lucene.queryParser.standard.nodes.StandardBooleanQueryNode; import org.apache.lucene.queryParser.standard.nodes.MultiPhraseQueryNode; +import org.apache.lucene.queryParser.standard.nodes.PrefixWildcardQueryNode; import org.apache.lucene.queryParser.standard.nodes.RangeQueryNode; +import org.apache.lucene.queryParser.standard.nodes.StandardBooleanQueryNode; +import org.apache.lucene.queryParser.standard.nodes.WildcardQueryNode; import org.apache.lucene.queryParser.standard.processors.StandardQueryNodeProcessorPipeline; import org.apache.lucene.search.Query; diff --git a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/builders/WildcardQueryNodeBuilder.java b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/builders/WildcardQueryNodeBuilder.java index ca8c4b21247..5ff59ea868d 100644 --- a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/builders/WildcardQueryNodeBuilder.java +++ b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/builders/WildcardQueryNodeBuilder.java @@ -20,7 +20,9 @@ package org.apache.lucene.queryParser.standard.builders; import org.apache.lucene.index.Term; import org.apache.lucene.queryParser.core.QueryNodeException; import org.apache.lucene.queryParser.core.nodes.QueryNode; -import org.apache.lucene.queryParser.core.nodes.WildcardQueryNode; +import org.apache.lucene.queryParser.standard.config.MultiTermRewriteMethodAttribute; +import org.apache.lucene.queryParser.standard.nodes.WildcardQueryNode; +import org.apache.lucene.search.MultiTermQuery; import org.apache.lucene.search.WildcardQuery; /** @@ -38,7 +40,12 @@ public class WildcardQueryNodeBuilder implements StandardQueryBuilder { WildcardQuery q = new WildcardQuery(new Term(wildcardNode.getFieldAsString(), wildcardNode.getTextAsString())); - q.setRewriteMethod(wildcardNode.getMultiTermRewriteMethod()); + + MultiTermQuery.RewriteMethod method = (MultiTermQuery.RewriteMethod)queryNode.getTag(MultiTermRewriteMethodAttribute.TAG_ID); + if (method != null) { + q.setRewriteMethod(method); + } + return q; } diff --git a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/config/MultiTermRewriteMethodAttribute.java b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/config/MultiTermRewriteMethodAttribute.java index 7fc2d27d0ca..84924e34599 100644 --- a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/config/MultiTermRewriteMethodAttribute.java +++ b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/config/MultiTermRewriteMethodAttribute.java @@ -31,6 +31,9 @@ import org.apache.lucene.util.Attribute; * */ public interface MultiTermRewriteMethodAttribute extends Attribute { + + public static final CharSequence TAG_ID = "MultiTermRewriteMethodAttribute"; + public void setMultiTermRewriteMethod(MultiTermQuery.RewriteMethod method); public MultiTermQuery.RewriteMethod getMultiTermRewriteMethod(); diff --git a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/config/MultiTermRewriteMethodAttributeImpl.java b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/config/MultiTermRewriteMethodAttributeImpl.java index 1302e8de476..cf79efd10e8 100644 --- a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/config/MultiTermRewriteMethodAttributeImpl.java +++ b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/config/MultiTermRewriteMethodAttributeImpl.java @@ -35,7 +35,7 @@ public class MultiTermRewriteMethodAttributeImpl extends AttributeImpl implements MultiTermRewriteMethodAttribute { private static final long serialVersionUID = -2104763012723049527L; - + private MultiTermQuery.RewriteMethod multiTermRewriteMethod = MultiTermQuery.CONSTANT_SCORE_AUTO_REWRITE_DEFAULT; public MultiTermRewriteMethodAttributeImpl() { diff --git a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/config/StandardQueryConfigHandler.java b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/config/StandardQueryConfigHandler.java index a2ad0bfed63..a219aa59189 100644 --- a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/config/StandardQueryConfigHandler.java +++ b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/config/StandardQueryConfigHandler.java @@ -48,7 +48,7 @@ public class StandardQueryConfigHandler extends QueryConfigHandler { addAttribute(PositionIncrementsAttribute.class); addAttribute(LocaleAttribute.class); addAttribute(DefaultPhraseSlopAttribute.class); - //addAttribute(DateResolutionAttribute.class); + addAttribute(MultiTermRewriteMethodAttribute.class); } diff --git a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/nodes/PrefixWildcardQueryNode.java b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/nodes/PrefixWildcardQueryNode.java new file mode 100644 index 00000000000..17ce9462482 --- /dev/null +++ b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/nodes/PrefixWildcardQueryNode.java @@ -0,0 +1,63 @@ +package org.apache.lucene.queryParser.standard.nodes; + +import org.apache.lucene.queryParser.core.nodes.FieldQueryNode; + +/** + * 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. + */ + +/** + * A {@link PrefixWildcardQueryNode} represents wildcardquery that matches abc* + * or *. This does not apply to phrases, this is a special case on the original + * lucene parser. TODO: refactor the code to remove this special case from the + * parser. and probably do it on a Processor + */ +public class PrefixWildcardQueryNode extends WildcardQueryNode { + + private static final long serialVersionUID = 6851557641826407515L; + + /** + * @param field + * - field name + * @param text + * - value including the wildcard + * @param begin + * - position in the query string + * @param end + * - position in the query string + */ + public PrefixWildcardQueryNode(CharSequence field, CharSequence text, + int begin, int end) { + super(field, text, begin, end); + } + + public PrefixWildcardQueryNode(FieldQueryNode fqn) { + this(fqn.getField(), fqn.getText(), fqn.getBegin(), fqn.getEnd()); + } + + public String toString() { + return ""; + } + + public PrefixWildcardQueryNode cloneTree() throws CloneNotSupportedException { + PrefixWildcardQueryNode clone = (PrefixWildcardQueryNode) super.cloneTree(); + + // nothing to do here + + return clone; + } +} diff --git a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/nodes/RangeQueryNode.java b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/nodes/RangeQueryNode.java index 3b9ebfd935c..aa9a177a587 100644 --- a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/nodes/RangeQueryNode.java +++ b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/nodes/RangeQueryNode.java @@ -23,7 +23,6 @@ import org.apache.lucene.queryParser.core.nodes.ParametricQueryNode; import org.apache.lucene.queryParser.core.nodes.ParametricRangeQueryNode; import org.apache.lucene.queryParser.standard.config.RangeCollatorAttribute; import org.apache.lucene.queryParser.standard.processors.ParametricRangeQueryNodeProcessor; -import org.apache.lucene.search.MultiTermQuery; /** * This query node represents a range query. It also holds which collator will @@ -39,17 +38,13 @@ public class RangeQueryNode extends ParametricRangeQueryNode { private Collator collator; - private MultiTermQuery.RewriteMethod multiTermRewriteMethod; - /** * @param lower * @param upper */ - public RangeQueryNode(ParametricQueryNode lower, ParametricQueryNode upper, - Collator collator, MultiTermQuery.RewriteMethod multiTermRewriteMethod) { + public RangeQueryNode(ParametricQueryNode lower, ParametricQueryNode upper, Collator collator) { super(lower, upper); - this.multiTermRewriteMethod = multiTermRewriteMethod; this.collator = collator; } @@ -71,10 +66,4 @@ public class RangeQueryNode extends ParametricRangeQueryNode { return this.collator; } - /** - * @return the rewrite method - */ - public MultiTermQuery.RewriteMethod getMultiTermRewriteMethod() { - return multiTermRewriteMethod; - } } diff --git a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/nodes/WildcardQueryNode.java b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/nodes/WildcardQueryNode.java new file mode 100644 index 00000000000..c73eb9b58fc --- /dev/null +++ b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/nodes/WildcardQueryNode.java @@ -0,0 +1,69 @@ +package org.apache.lucene.queryParser.standard.nodes; + +/** + * 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 org.apache.lucene.queryParser.core.nodes.FieldQueryNode; +import org.apache.lucene.queryParser.core.parser.EscapeQuerySyntax; + +/** + * A {@link WildcardQueryNode} represents wildcard query This does not apply to + * phrases. Examples: a*b*c Fl?w? m?ke*g + */ +public class WildcardQueryNode extends FieldQueryNode { + private static final long serialVersionUID = 0L; + + /** + * @param field + * - field name + * @param text + * - value that contains one or more wild card characters (? or *) + * @param begin + * - position in the query string + * @param end + * - position in the query string + */ + public WildcardQueryNode(CharSequence field, CharSequence text, int begin, + int end) { + super(field, text, begin, end); + } + + public WildcardQueryNode(FieldQueryNode fqn) { + this(fqn.getField(), fqn.getText(), fqn.getBegin(), fqn.getEnd()); + } + + public CharSequence toQueryString(EscapeQuerySyntax escaper) { + if (isDefaultField(this.field)) { + return getTermEscaped(escaper); + } else { + return this.field + ":" + getTermEscaped(escaper); + } + } + + public String toString() { + return ""; + } + + public WildcardQueryNode cloneTree() throws CloneNotSupportedException { + WildcardQueryNode clone = (WildcardQueryNode) super.cloneTree(); + + // nothing to do here + + return clone; + } + +} diff --git a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/parser/JavaCharStream.java b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/parser/JavaCharStream.java index 178d2ab9aea..c022d5a69f3 100644 --- a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/parser/JavaCharStream.java +++ b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/parser/JavaCharStream.java @@ -614,4 +614,4 @@ class JavaCharStream } } -/* JavaCC - StandardChecksum=065d79d49fcd02f542903038e37bd9d9 (do not edit this line) */ +/* JavaCC - OriginalChecksum=d665eff1df49d9f82f07f7dc863fcd22 (do not edit this line) */ diff --git a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/parser/StandardSyntaxParser.java b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/parser/StandardSyntaxParser.java index 0975d2479a0..fd6640cb863 100644 --- a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/parser/StandardSyntaxParser.java +++ b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/parser/StandardSyntaxParser.java @@ -19,14 +19,10 @@ package org.apache.lucene.queryParser.standard.parser; */ import java.io.StringReader; -import java.util.ArrayList; -import java.util.List; import java.util.Vector; import org.apache.lucene.messages.Message; import org.apache.lucene.messages.MessageImpl; -import org.apache.lucene.queryParser.core.QueryNodeError; -import org.apache.lucene.queryParser.core.QueryNodeException; import org.apache.lucene.queryParser.core.QueryNodeParseException; import org.apache.lucene.queryParser.core.messages.QueryParserMessages; import org.apache.lucene.queryParser.core.nodes.AndQueryNode; @@ -34,19 +30,14 @@ import org.apache.lucene.queryParser.core.nodes.BooleanQueryNode; import org.apache.lucene.queryParser.core.nodes.BoostQueryNode; import org.apache.lucene.queryParser.core.nodes.FieldQueryNode; import org.apache.lucene.queryParser.core.nodes.FuzzyQueryNode; -import org.apache.lucene.queryParser.core.nodes.ModifierQueryNode; import org.apache.lucene.queryParser.core.nodes.GroupQueryNode; -import org.apache.lucene.queryParser.core.nodes.OpaqueQueryNode; +import org.apache.lucene.queryParser.core.nodes.ModifierQueryNode; import org.apache.lucene.queryParser.core.nodes.OrQueryNode; import org.apache.lucene.queryParser.core.nodes.ParametricQueryNode; import org.apache.lucene.queryParser.core.nodes.ParametricRangeQueryNode; -import org.apache.lucene.queryParser.core.nodes.PrefixWildcardQueryNode; -import org.apache.lucene.queryParser.core.nodes.SlopQueryNode; -import org.apache.lucene.queryParser.core.nodes.ProximityQueryNode; import org.apache.lucene.queryParser.core.nodes.QueryNode; -import org.apache.lucene.queryParser.core.nodes.QueryNodeImpl; import org.apache.lucene.queryParser.core.nodes.QuotedFieldQueryNode; -import org.apache.lucene.queryParser.core.nodes.WildcardQueryNode; +import org.apache.lucene.queryParser.core.nodes.SlopQueryNode; import org.apache.lucene.queryParser.core.parser.SyntaxParser; @SuppressWarnings("all") @@ -178,11 +169,8 @@ public class StandardSyntaxParser implements SyntaxParser, StandardSyntaxParserC case PLUS: case MINUS: case LPAREN: - case STAR: case QUOTED: case TERM: - case PREFIXTERM: - case WILDTERM: case RANGEIN_START: case RANGEEX_START: case NUMBER: @@ -322,31 +310,15 @@ public class StandardSyntaxParser implements SyntaxParser, StandardSyntaxParserC Token fieldToken=null, boost=null; boolean group = false; if (jj_2_1(2)) { - switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { - case TERM: - fieldToken = jj_consume_token(TERM); - jj_consume_token(COLON); + fieldToken = jj_consume_token(TERM); + jj_consume_token(COLON); field=EscapeQuerySyntaxImpl.discardEscapeChar(fieldToken.image); - break; - case STAR: - jj_consume_token(STAR); - jj_consume_token(COLON); - field="*"; - break; - default: - jj_la1[7] = jj_gen; - jj_consume_token(-1); - throw new ParseException(); - } } else { ; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { - case STAR: case QUOTED: case TERM: - case PREFIXTERM: - case WILDTERM: case RANGEIN_START: case RANGEEX_START: case NUMBER: @@ -362,13 +334,13 @@ public class StandardSyntaxParser implements SyntaxParser, StandardSyntaxParserC boost = jj_consume_token(NUMBER); break; default: - jj_la1[8] = jj_gen; + jj_la1[7] = jj_gen; ; } group=true; break; default: - jj_la1[9] = jj_gen; + jj_la1[8] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -393,40 +365,23 @@ public class StandardSyntaxParser implements SyntaxParser, StandardSyntaxParserC final public QueryNode Term(CharSequence field) throws ParseException { Token term, boost=null, fuzzySlop=null, goop1, goop2; - boolean prefix = false; - boolean wildcard = false; boolean fuzzy = false; QueryNode q =null; ParametricQueryNode qLower, qUpper; float defaultMinSimilarity = 0.5f; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { - case STAR: case TERM: - case PREFIXTERM: - case WILDTERM: case NUMBER: switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case TERM: term = jj_consume_token(TERM); q = new FieldQueryNode(field, EscapeQuerySyntaxImpl.discardEscapeChar(term.image), term.beginColumn, term.endColumn); break; - case STAR: - term = jj_consume_token(STAR); - wildcard=true; q = new WildcardQueryNode(field, EscapeQuerySyntaxImpl.discardEscapeChar(term.image), term.beginColumn, term.endColumn); - break; - case PREFIXTERM: - term = jj_consume_token(PREFIXTERM); - prefix=true; q = new PrefixWildcardQueryNode(field, EscapeQuerySyntaxImpl.discardEscapeChar(term.image), term.beginColumn, term.endColumn); - break; - case WILDTERM: - term = jj_consume_token(WILDTERM); - wildcard=true; q = new WildcardQueryNode(field, EscapeQuerySyntaxImpl.discardEscapeChar(term.image), term.beginColumn, term.endColumn); - break; case NUMBER: term = jj_consume_token(NUMBER); break; default: - jj_la1[10] = jj_gen; + jj_la1[9] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -436,7 +391,7 @@ public class StandardSyntaxParser implements SyntaxParser, StandardSyntaxParserC fuzzy=true; break; default: - jj_la1[11] = jj_gen; + jj_la1[10] = jj_gen; ; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { @@ -449,15 +404,15 @@ public class StandardSyntaxParser implements SyntaxParser, StandardSyntaxParserC fuzzy=true; break; default: - jj_la1[12] = jj_gen; + jj_la1[11] = jj_gen; ; } break; default: - jj_la1[13] = jj_gen; + jj_la1[12] = jj_gen; ; } - if (!wildcard && !prefix && fuzzy) { + if (fuzzy) { float fms = defaultMinSimilarity; try { fms = Float.valueOf(fuzzySlop.image.substring(1)).floatValue(); @@ -478,7 +433,7 @@ public class StandardSyntaxParser implements SyntaxParser, StandardSyntaxParserC goop1 = jj_consume_token(RANGEIN_QUOTED); break; default: - jj_la1[14] = jj_gen; + jj_la1[13] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -487,7 +442,7 @@ public class StandardSyntaxParser implements SyntaxParser, StandardSyntaxParserC jj_consume_token(RANGEIN_TO); break; default: - jj_la1[15] = jj_gen; + jj_la1[14] = jj_gen; ; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { @@ -498,7 +453,7 @@ public class StandardSyntaxParser implements SyntaxParser, StandardSyntaxParserC goop2 = jj_consume_token(RANGEIN_QUOTED); break; default: - jj_la1[16] = jj_gen; + jj_la1[15] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -509,7 +464,7 @@ public class StandardSyntaxParser implements SyntaxParser, StandardSyntaxParserC boost = jj_consume_token(NUMBER); break; default: - jj_la1[17] = jj_gen; + jj_la1[16] = jj_gen; ; } if (goop1.kind == RANGEIN_QUOTED) { @@ -535,7 +490,7 @@ public class StandardSyntaxParser implements SyntaxParser, StandardSyntaxParserC goop1 = jj_consume_token(RANGEEX_QUOTED); break; default: - jj_la1[18] = jj_gen; + jj_la1[17] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -544,7 +499,7 @@ public class StandardSyntaxParser implements SyntaxParser, StandardSyntaxParserC jj_consume_token(RANGEEX_TO); break; default: - jj_la1[19] = jj_gen; + jj_la1[18] = jj_gen; ; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { @@ -555,7 +510,7 @@ public class StandardSyntaxParser implements SyntaxParser, StandardSyntaxParserC goop2 = jj_consume_token(RANGEEX_QUOTED); break; default: - jj_la1[20] = jj_gen; + jj_la1[19] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -566,7 +521,7 @@ public class StandardSyntaxParser implements SyntaxParser, StandardSyntaxParserC boost = jj_consume_token(NUMBER); break; default: - jj_la1[21] = jj_gen; + jj_la1[20] = jj_gen; ; } if (goop1.kind == RANGEEX_QUOTED) { @@ -589,7 +544,7 @@ public class StandardSyntaxParser implements SyntaxParser, StandardSyntaxParserC fuzzySlop = jj_consume_token(FUZZY_SLOP); break; default: - jj_la1[22] = jj_gen; + jj_la1[21] = jj_gen; ; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { @@ -598,7 +553,7 @@ public class StandardSyntaxParser implements SyntaxParser, StandardSyntaxParserC boost = jj_consume_token(NUMBER); break; default: - jj_la1[23] = jj_gen; + jj_la1[22] = jj_gen; ; } int phraseSlop = 0; @@ -616,7 +571,7 @@ public class StandardSyntaxParser implements SyntaxParser, StandardSyntaxParserC } break; default: - jj_la1[24] = jj_gen; + jj_la1[23] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -645,28 +600,12 @@ public class StandardSyntaxParser implements SyntaxParser, StandardSyntaxParserC finally { jj_save(0, xla); } } - private boolean jj_3R_5() { - if (jj_scan_token(STAR)) return true; - if (jj_scan_token(COLON)) return true; - return false; - } - - private boolean jj_3R_4() { + private boolean jj_3_1() { if (jj_scan_token(TERM)) return true; if (jj_scan_token(COLON)) return true; return false; } - private boolean jj_3_1() { - Token xsp; - xsp = jj_scanpos; - if (jj_3R_4()) { - jj_scanpos = xsp; - if (jj_3R_5()) return true; - } - return false; - } - /** Generated Token Manager. */ public StandardSyntaxParserTokenManager token_source; JavaCharStream jj_input_stream; @@ -678,18 +617,13 @@ public class StandardSyntaxParser implements SyntaxParser, StandardSyntaxParserC private Token jj_scanpos, jj_lastpos; private int jj_la; private int jj_gen; - final private int[] jj_la1 = new int[25]; + final private int[] jj_la1 = new int[24]; static private int[] jj_la1_0; - static private int[] jj_la1_1; static { jj_la1_init_0(); - jj_la1_init_1(); } private static void jj_la1_init_0() { - jj_la1_0 = new int[] {0x300,0x300,0x1c00,0x1c00,0x3ed3c00,0x200,0x100,0x90000,0x20000,0x3ed2000,0x2690000,0x100000,0x100000,0x20000,0x30000000,0x4000000,0x30000000,0x20000,0x0,0x40000000,0x0,0x20000,0x100000,0x20000,0x3ed0000,}; - } - private static void jj_la1_init_1() { - jj_la1_1 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x3,0x0,0x3,0x0,0x0,0x0,0x0,}; + jj_la1_0 = new int[] {0x300,0x300,0x1c00,0x1c00,0x763c00,0x200,0x100,0x10000,0x762000,0x440000,0x80000,0x80000,0x10000,0x6000000,0x800000,0x6000000,0x10000,0x60000000,0x8000000,0x60000000,0x10000,0x80000,0x10000,0x760000,}; } final private JJCalls[] jj_2_rtns = new JJCalls[1]; private boolean jj_rescan = false; @@ -706,7 +640,7 @@ public class StandardSyntaxParser implements SyntaxParser, StandardSyntaxParserC token = new Token(); jj_ntk = -1; jj_gen = 0; - for (int i = 0; i < 25; i++) jj_la1[i] = -1; + for (int i = 0; i < 24; i++) jj_la1[i] = -1; for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); } @@ -721,7 +655,7 @@ public class StandardSyntaxParser implements SyntaxParser, StandardSyntaxParserC token = new Token(); jj_ntk = -1; jj_gen = 0; - for (int i = 0; i < 25; i++) jj_la1[i] = -1; + for (int i = 0; i < 24; i++) jj_la1[i] = -1; for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); } @@ -732,7 +666,7 @@ public class StandardSyntaxParser implements SyntaxParser, StandardSyntaxParserC token = new Token(); jj_ntk = -1; jj_gen = 0; - for (int i = 0; i < 25; i++) jj_la1[i] = -1; + for (int i = 0; i < 24; i++) jj_la1[i] = -1; for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); } @@ -743,7 +677,7 @@ public class StandardSyntaxParser implements SyntaxParser, StandardSyntaxParserC token = new Token(); jj_ntk = -1; jj_gen = 0; - for (int i = 0; i < 25; i++) jj_la1[i] = -1; + for (int i = 0; i < 24; i++) jj_la1[i] = -1; for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); } @@ -753,7 +687,7 @@ public class StandardSyntaxParser implements SyntaxParser, StandardSyntaxParserC token = new Token(); jj_ntk = -1; jj_gen = 0; - for (int i = 0; i < 25; i++) jj_la1[i] = -1; + for (int i = 0; i < 24; i++) jj_la1[i] = -1; for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); } @@ -763,7 +697,7 @@ public class StandardSyntaxParser implements SyntaxParser, StandardSyntaxParserC token = new Token(); jj_ntk = -1; jj_gen = 0; - for (int i = 0; i < 25; i++) jj_la1[i] = -1; + for (int i = 0; i < 24; i++) jj_la1[i] = -1; for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); } @@ -875,24 +809,21 @@ public class StandardSyntaxParser implements SyntaxParser, StandardSyntaxParserC /** Generate ParseException. */ public ParseException generateParseException() { jj_expentries.clear(); - boolean[] la1tokens = new boolean[34]; + boolean[] la1tokens = new boolean[31]; if (jj_kind >= 0) { la1tokens[jj_kind] = true; jj_kind = -1; } - for (int i = 0; i < 25; i++) { + for (int i = 0; i < 24; i++) { if (jj_la1[i] == jj_gen) { for (int j = 0; j < 32; j++) { if ((jj_la1_0[i] & (1< | <#_TERM_START_CHAR: ( ~[ " ", "\t", "\n", "\r", "\u3000", "+", "-", "!", "(", ")", ":", "^", - "[", "]", "\"", "{", "}", "~", "*", "?", "\\" ] + "[", "]", "\"", "{", "}", "~", "\\" ] | <_ESCAPED_CHAR> ) > | <#_TERM_CHAR: ( <_TERM_START_CHAR> | <_ESCAPED_CHAR> | "-" | "+" ) > | <#_WHITESPACE: ( " " | "\t" | "\n" | "\r" | "\u3000") > @@ -130,13 +128,10 @@ PARSER_END(StandardSyntaxParser) | | | -| | : Boost | )* "\""> | (<_TERM_CHAR>)* > | )+ ( "." (<_NUM_CHAR>)+ )? )? > -| (<_TERM_CHAR>)* "*" ) > -| | [ "*", "?" ]) (<_TERM_CHAR> | ( [ "*", "?" ] ))* > | : RangeIn | : RangeEx } @@ -346,8 +341,7 @@ QueryNode Clause(CharSequence field) : { [ LOOKAHEAD(2) ( - fieldToken= {field=EscapeQuerySyntaxImpl.discardEscapeChar(fieldToken.image);} - | {field="*";} + fieldToken= {field=EscapeQuerySyntaxImpl.discardEscapeChar(fieldToken.image);} ) ] @@ -379,8 +373,6 @@ QueryNode Clause(CharSequence field) : { QueryNode Term(CharSequence field) : { Token term, boost=null, fuzzySlop=null, goop1, goop2; - boolean prefix = false; - boolean wildcard = false; boolean fuzzy = false; QueryNode q =null; ParametricQueryNode qLower, qUpper; @@ -390,15 +382,12 @@ QueryNode Term(CharSequence field) : { ( ( term= { q = new FieldQueryNode(field, EscapeQuerySyntaxImpl.discardEscapeChar(term.image), term.beginColumn, term.endColumn); } - | term= { wildcard=true; q = new WildcardQueryNode(field, EscapeQuerySyntaxImpl.discardEscapeChar(term.image), term.beginColumn, term.endColumn); } - | term= { prefix=true; q = new PrefixWildcardQueryNode(field, EscapeQuerySyntaxImpl.discardEscapeChar(term.image), term.beginColumn, term.endColumn); } - | term= { wildcard=true; q = new WildcardQueryNode(field, EscapeQuerySyntaxImpl.discardEscapeChar(term.image), term.beginColumn, term.endColumn); } | term= ) [ fuzzySlop= { fuzzy=true; } ] [ boost= [ fuzzySlop= { fuzzy=true; } ] ] { - if (!wildcard && !prefix && fuzzy) { + if (fuzzy) { float fms = defaultMinSimilarity; try { fms = Float.valueOf(fuzzySlop.image.substring(1)).floatValue(); diff --git a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/parser/StandardSyntaxParserConstants.java b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/parser/StandardSyntaxParserConstants.java index 1474adfa63d..147a2d88ffc 100644 --- a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/parser/StandardSyntaxParserConstants.java +++ b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/parser/StandardSyntaxParserConstants.java @@ -39,41 +39,35 @@ public interface StandardSyntaxParserConstants { /** RegularExpression Id. */ int COLON = 15; /** RegularExpression Id. */ - int STAR = 16; + int CARAT = 16; /** RegularExpression Id. */ - int CARAT = 17; + int QUOTED = 17; /** RegularExpression Id. */ - int QUOTED = 18; + int TERM = 18; /** RegularExpression Id. */ - int TERM = 19; + int FUZZY_SLOP = 19; /** RegularExpression Id. */ - int FUZZY_SLOP = 20; + int RANGEIN_START = 20; /** RegularExpression Id. */ - int PREFIXTERM = 21; + int RANGEEX_START = 21; /** RegularExpression Id. */ - int WILDTERM = 22; + int NUMBER = 22; /** RegularExpression Id. */ - int RANGEIN_START = 23; + int RANGEIN_TO = 23; /** RegularExpression Id. */ - int RANGEEX_START = 24; + int RANGEIN_END = 24; /** RegularExpression Id. */ - int NUMBER = 25; + int RANGEIN_QUOTED = 25; /** RegularExpression Id. */ - int RANGEIN_TO = 26; + int RANGEIN_GOOP = 26; /** RegularExpression Id. */ - int RANGEIN_END = 27; + int RANGEEX_TO = 27; /** RegularExpression Id. */ - int RANGEIN_QUOTED = 28; + int RANGEEX_END = 28; /** RegularExpression Id. */ - int RANGEIN_GOOP = 29; + int RANGEEX_QUOTED = 29; /** RegularExpression Id. */ - int RANGEEX_TO = 30; - /** RegularExpression Id. */ - int RANGEEX_END = 31; - /** RegularExpression Id. */ - int RANGEEX_QUOTED = 32; - /** RegularExpression Id. */ - int RANGEEX_GOOP = 33; + int RANGEEX_GOOP = 30; /** Lexical state. */ int Boost = 0; @@ -102,13 +96,10 @@ public interface StandardSyntaxParserConstants { "\"(\"", "\")\"", "\":\"", - "\"*\"", "\"^\"", "", "", "", - "", - "", "\"[\"", "\"{\"", "", diff --git a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/parser/StandardSyntaxParserTokenManager.java b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/parser/StandardSyntaxParserTokenManager.java index 931e2c85e9f..56623fb861f 100644 --- a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/parser/StandardSyntaxParserTokenManager.java +++ b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/parser/StandardSyntaxParserTokenManager.java @@ -17,35 +17,6 @@ package org.apache.lucene.queryParser.standard.parser; * limitations under the License. */ -import java.io.StringReader; -import java.util.ArrayList; -import java.util.List; -import java.util.Vector; -import org.apache.lucene.messages.Message; -import org.apache.lucene.messages.MessageImpl; -import org.apache.lucene.queryParser.core.QueryNodeError; -import org.apache.lucene.queryParser.core.QueryNodeException; -import org.apache.lucene.queryParser.core.QueryNodeParseException; -import org.apache.lucene.queryParser.core.messages.QueryParserMessages; -import org.apache.lucene.queryParser.core.nodes.AndQueryNode; -import org.apache.lucene.queryParser.core.nodes.BooleanQueryNode; -import org.apache.lucene.queryParser.core.nodes.BoostQueryNode; -import org.apache.lucene.queryParser.core.nodes.FieldQueryNode; -import org.apache.lucene.queryParser.core.nodes.FuzzyQueryNode; -import org.apache.lucene.queryParser.core.nodes.ModifierQueryNode; -import org.apache.lucene.queryParser.core.nodes.GroupQueryNode; -import org.apache.lucene.queryParser.core.nodes.OpaqueQueryNode; -import org.apache.lucene.queryParser.core.nodes.OrQueryNode; -import org.apache.lucene.queryParser.core.nodes.ParametricQueryNode; -import org.apache.lucene.queryParser.core.nodes.ParametricRangeQueryNode; -import org.apache.lucene.queryParser.core.nodes.PrefixWildcardQueryNode; -import org.apache.lucene.queryParser.core.nodes.SlopQueryNode; -import org.apache.lucene.queryParser.core.nodes.ProximityQueryNode; -import org.apache.lucene.queryParser.core.nodes.QueryNode; -import org.apache.lucene.queryParser.core.nodes.QueryNodeImpl; -import org.apache.lucene.queryParser.core.nodes.QuotedFieldQueryNode; -import org.apache.lucene.queryParser.core.nodes.WildcardQueryNode; -import org.apache.lucene.queryParser.core.parser.SyntaxParser; /** Token Manager. */ public class StandardSyntaxParserTokenManager implements StandardSyntaxParserConstants @@ -81,8 +52,6 @@ private int jjMoveStringLiteralDfa0_3() return jjStopAtPos(0, 13); case 41: return jjStopAtPos(0, 14); - case 42: - return jjStartNfaWithStates_3(0, 16, 36); case 43: return jjStopAtPos(0, 11); case 45: @@ -90,23 +59,15 @@ private int jjMoveStringLiteralDfa0_3() case 58: return jjStopAtPos(0, 15); case 91: - return jjStopAtPos(0, 23); + return jjStopAtPos(0, 20); case 94: - return jjStopAtPos(0, 17); + return jjStopAtPos(0, 16); case 123: - return jjStopAtPos(0, 24); + return jjStopAtPos(0, 21); default : return jjMoveNfa_3(0, 0); } } -private int jjStartNfaWithStates_3(int pos, int kind, int state) -{ - jjmatchedKind = kind; - jjmatchedPos = pos; - try { curChar = input_stream.readChar(); } - catch(java.io.IOException e) { return pos + 1; } - return jjMoveNfa_3(state, pos + 1); -} static final long[] jjbitVec0 = { 0x1L, 0x0L, 0x0L, 0x0L }; @@ -122,7 +83,7 @@ static final long[] jjbitVec4 = { private int jjMoveNfa_3(int startState, int curPos) { int startsAt = 0; - jjnewStateCnt = 36; + jjnewStateCnt = 28; int i = 1; jjstateSet[0] = startState; int kind = 0x7fffffff; @@ -137,20 +98,12 @@ private int jjMoveNfa_3(int startState, int curPos) { switch(jjstateSet[--i]) { - case 36: - case 25: - if ((0xfbfffcf8ffffd9ffL & l) == 0L) - break; - if (kind > 22) - kind = 22; - jjCheckNAddTwoStates(25, 26); - break; case 0: if ((0xfbffd4f8ffffd9ffL & l) != 0L) { - if (kind > 22) - kind = 22; - jjCheckNAddTwoStates(25, 26); + if (kind > 18) + kind = 18; + jjCheckNAddTwoStates(20, 21); } else if ((0x100002600L & l) != 0L) { @@ -164,17 +117,6 @@ private int jjMoveNfa_3(int startState, int curPos) if (kind > 10) kind = 10; } - if ((0x7bffd0f8ffffd9ffL & l) != 0L) - { - if (kind > 19) - kind = 19; - jjCheckNAddStates(3, 7); - } - else if (curChar == 42) - { - if (kind > 21) - kind = 21; - } if (curChar == 38) jjstateSet[jjnewStateCnt++] = 4; break; @@ -202,68 +144,45 @@ private int jjMoveNfa_3(int startState, int curPos) jjCheckNAddStates(0, 2); break; case 18: - if (curChar == 34 && kind > 18) - kind = 18; + if (curChar == 34 && kind > 17) + kind = 17; break; - case 20: - if ((0x3ff000000000000L & l) == 0L) - break; - if (kind > 20) - kind = 20; - jjAddStates(8, 9); - break; - case 21: - if (curChar == 46) - jjCheckNAdd(22); - break; - case 22: - if ((0x3ff000000000000L & l) == 0L) - break; - if (kind > 20) - kind = 20; - jjCheckNAdd(22); - break; - case 23: - if (curChar == 42 && kind > 21) - kind = 21; - break; - case 24: + case 19: if ((0xfbffd4f8ffffd9ffL & l) == 0L) break; - if (kind > 22) - kind = 22; - jjCheckNAddTwoStates(25, 26); + if (kind > 18) + kind = 18; + jjCheckNAddTwoStates(20, 21); + break; + case 20: + if ((0xfbfffcf8ffffd9ffL & l) == 0L) + break; + if (kind > 18) + kind = 18; + jjCheckNAddTwoStates(20, 21); + break; + case 22: + if (kind > 18) + kind = 18; + jjCheckNAddTwoStates(20, 21); + break; + case 25: + if ((0x3ff000000000000L & l) == 0L) + break; + if (kind > 19) + kind = 19; + jjAddStates(3, 4); + break; + case 26: + if (curChar == 46) + jjCheckNAdd(27); break; case 27: - if (kind > 22) - kind = 22; - jjCheckNAddTwoStates(25, 26); - break; - case 28: - if ((0x7bffd0f8ffffd9ffL & l) == 0L) + if ((0x3ff000000000000L & l) == 0L) break; if (kind > 19) kind = 19; - jjCheckNAddStates(3, 7); - break; - case 29: - if ((0x7bfff8f8ffffd9ffL & l) == 0L) - break; - if (kind > 19) - kind = 19; - jjCheckNAddTwoStates(29, 30); - break; - case 31: - if (kind > 19) - kind = 19; - jjCheckNAddTwoStates(29, 30); - break; - case 32: - if ((0x7bfff8f8ffffd9ffL & l) != 0L) - jjCheckNAddStates(10, 12); - break; - case 34: - jjCheckNAddStates(10, 12); + jjCheckNAdd(27); break; default : break; } @@ -276,37 +195,21 @@ private int jjMoveNfa_3(int startState, int curPos) { switch(jjstateSet[--i]) { - case 36: - if ((0x97ffffff87ffffffL & l) != 0L) - { - if (kind > 22) - kind = 22; - jjCheckNAddTwoStates(25, 26); - } - else if (curChar == 92) - jjCheckNAddTwoStates(27, 27); - break; case 0: if ((0x97ffffff87ffffffL & l) != 0L) { - if (kind > 19) - kind = 19; - jjCheckNAddStates(3, 7); + if (kind > 18) + kind = 18; + jjCheckNAddTwoStates(20, 21); } - else if (curChar == 92) - jjCheckNAddStates(13, 15); else if (curChar == 126) { - if (kind > 20) - kind = 20; - jjstateSet[jjnewStateCnt++] = 20; - } - if ((0x97ffffff87ffffffL & l) != 0L) - { - if (kind > 22) - kind = 22; - jjCheckNAddTwoStates(25, 26); + if (kind > 19) + kind = 19; + jjstateSet[jjnewStateCnt++] = 25; } + else if (curChar == 92) + jjCheckNAdd(22); if (curChar == 78) jjstateSet[jjnewStateCnt++] = 11; else if (curChar == 124) @@ -368,72 +271,32 @@ private int jjMoveNfa_3(int startState, int curPos) jjCheckNAddStates(0, 2); break; case 19: - if (curChar != 126) + case 20: + if ((0x97ffffff87ffffffL & l) == 0L) break; - if (kind > 20) - kind = 20; - jjstateSet[jjnewStateCnt++] = 20; + if (kind > 18) + kind = 18; + jjCheckNAddTwoStates(20, 21); + break; + case 21: + if (curChar == 92) + jjCheckNAddTwoStates(22, 22); + break; + case 22: + if (kind > 18) + kind = 18; + jjCheckNAddTwoStates(20, 21); + break; + case 23: + if (curChar == 92) + jjCheckNAdd(22); break; case 24: - if ((0x97ffffff87ffffffL & l) == 0L) - break; - if (kind > 22) - kind = 22; - jjCheckNAddTwoStates(25, 26); - break; - case 25: - if ((0x97ffffff87ffffffL & l) == 0L) - break; - if (kind > 22) - kind = 22; - jjCheckNAddTwoStates(25, 26); - break; - case 26: - if (curChar == 92) - jjCheckNAddTwoStates(27, 27); - break; - case 27: - if (kind > 22) - kind = 22; - jjCheckNAddTwoStates(25, 26); - break; - case 28: - if ((0x97ffffff87ffffffL & l) == 0L) + if (curChar != 126) break; if (kind > 19) kind = 19; - jjCheckNAddStates(3, 7); - break; - case 29: - if ((0x97ffffff87ffffffL & l) == 0L) - break; - if (kind > 19) - kind = 19; - jjCheckNAddTwoStates(29, 30); - break; - case 30: - if (curChar == 92) - jjCheckNAddTwoStates(31, 31); - break; - case 31: - if (kind > 19) - kind = 19; - jjCheckNAddTwoStates(29, 30); - break; - case 32: - if ((0x97ffffff87ffffffL & l) != 0L) - jjCheckNAddStates(10, 12); - break; - case 33: - if (curChar == 92) - jjCheckNAddTwoStates(34, 34); - break; - case 34: - jjCheckNAddStates(10, 12); - break; - case 35: - if (curChar == 92) - jjCheckNAddStates(13, 15); + jjstateSet[jjnewStateCnt++] = 25; break; default : break; } @@ -450,14 +313,6 @@ private int jjMoveNfa_3(int startState, int curPos) { switch(jjstateSet[--i]) { - case 36: - case 25: - if (!jjCanMove_2(hiByte, i1, i2, l1, l2)) - break; - if (kind > 22) - kind = 22; - jjCheckNAddTwoStates(25, 26); - break; case 0: if (jjCanMove_0(hiByte, i1, i2, l1, l2)) { @@ -466,15 +321,9 @@ private int jjMoveNfa_3(int startState, int curPos) } if (jjCanMove_2(hiByte, i1, i2, l1, l2)) { - if (kind > 22) - kind = 22; - jjCheckNAddTwoStates(25, 26); - } - if (jjCanMove_2(hiByte, i1, i2, l1, l2)) - { - if (kind > 19) - kind = 19; - jjCheckNAddStates(3, 7); + if (kind > 18) + kind = 18; + jjCheckNAddTwoStates(20, 21); } break; case 15: @@ -482,48 +331,20 @@ private int jjMoveNfa_3(int startState, int curPos) if (jjCanMove_1(hiByte, i1, i2, l1, l2)) jjCheckNAddStates(0, 2); break; - case 24: + case 19: + case 20: if (!jjCanMove_2(hiByte, i1, i2, l1, l2)) break; - if (kind > 22) - kind = 22; - jjCheckNAddTwoStates(25, 26); + if (kind > 18) + kind = 18; + jjCheckNAddTwoStates(20, 21); break; - case 27: + case 22: if (!jjCanMove_1(hiByte, i1, i2, l1, l2)) break; - if (kind > 22) - kind = 22; - jjCheckNAddTwoStates(25, 26); - break; - case 28: - if (!jjCanMove_2(hiByte, i1, i2, l1, l2)) - break; - if (kind > 19) - kind = 19; - jjCheckNAddStates(3, 7); - break; - case 29: - if (!jjCanMove_2(hiByte, i1, i2, l1, l2)) - break; - if (kind > 19) - kind = 19; - jjCheckNAddTwoStates(29, 30); - break; - case 31: - if (!jjCanMove_1(hiByte, i1, i2, l1, l2)) - break; - if (kind > 19) - kind = 19; - jjCheckNAddTwoStates(29, 30); - break; - case 32: - if (jjCanMove_2(hiByte, i1, i2, l1, l2)) - jjCheckNAddStates(10, 12); - break; - case 34: - if (jjCanMove_1(hiByte, i1, i2, l1, l2)) - jjCheckNAddStates(10, 12); + if (kind > 18) + kind = 18; + jjCheckNAddTwoStates(20, 21); break; default : break; } @@ -536,7 +357,7 @@ private int jjMoveNfa_3(int startState, int curPos) kind = 0x7fffffff; } ++curPos; - if ((i = jjnewStateCnt) == (startsAt = 36 - (jjnewStateCnt = startsAt))) + if ((i = jjnewStateCnt) == (startsAt = 28 - (jjnewStateCnt = startsAt))) return curPos; try { curChar = input_stream.readChar(); } catch(java.io.IOException e) { return curPos; } @@ -547,9 +368,9 @@ private final int jjStopStringLiteralDfa_1(int pos, long active0) switch (pos) { case 0: - if ((active0 & 0x40000000L) != 0L) + if ((active0 & 0x8000000L) != 0L) { - jjmatchedKind = 33; + jjmatchedKind = 30; return 6; } return -1; @@ -566,9 +387,9 @@ private int jjMoveStringLiteralDfa0_1() switch(curChar) { case 84: - return jjMoveStringLiteralDfa1_1(0x40000000L); + return jjMoveStringLiteralDfa1_1(0x8000000L); case 125: - return jjStopAtPos(0, 31); + return jjStopAtPos(0, 28); default : return jjMoveNfa_1(0, 0); } @@ -583,8 +404,8 @@ private int jjMoveStringLiteralDfa1_1(long active0) switch(curChar) { case 79: - if ((active0 & 0x40000000L) != 0L) - return jjStartNfaWithStates_1(1, 30, 6); + if ((active0 & 0x8000000L) != 0L) + return jjStartNfaWithStates_1(1, 27, 6); break; default : break; @@ -620,8 +441,8 @@ private int jjMoveNfa_1(int startState, int curPos) case 0: if ((0xfffffffeffffffffL & l) != 0L) { - if (kind > 33) - kind = 33; + if (kind > 30) + kind = 30; jjCheckNAdd(6); } if ((0x100002600L & l) != 0L) @@ -638,21 +459,21 @@ private int jjMoveNfa_1(int startState, int curPos) break; case 2: if ((0xfffffffbffffffffL & l) != 0L) - jjCheckNAddStates(16, 18); + jjCheckNAddStates(5, 7); break; case 3: if (curChar == 34) - jjCheckNAddStates(16, 18); + jjCheckNAddStates(5, 7); break; case 5: - if (curChar == 34 && kind > 32) - kind = 32; + if (curChar == 34 && kind > 29) + kind = 29; break; case 6: if ((0xfffffffeffffffffL & l) == 0L) break; - if (kind > 33) - kind = 33; + if (kind > 30) + kind = 30; jjCheckNAdd(6); break; default : break; @@ -670,12 +491,12 @@ private int jjMoveNfa_1(int startState, int curPos) case 6: if ((0xdfffffffffffffffL & l) == 0L) break; - if (kind > 33) - kind = 33; + if (kind > 30) + kind = 30; jjCheckNAdd(6); break; case 2: - jjAddStates(16, 18); + jjAddStates(5, 7); break; case 4: if (curChar == 92) @@ -704,20 +525,20 @@ private int jjMoveNfa_1(int startState, int curPos) } if (jjCanMove_1(hiByte, i1, i2, l1, l2)) { - if (kind > 33) - kind = 33; + if (kind > 30) + kind = 30; jjCheckNAdd(6); } break; case 2: if (jjCanMove_1(hiByte, i1, i2, l1, l2)) - jjAddStates(16, 18); + jjAddStates(5, 7); break; case 6: if (!jjCanMove_1(hiByte, i1, i2, l1, l2)) break; - if (kind > 33) - kind = 33; + if (kind > 30) + kind = 30; jjCheckNAdd(6); break; default : break; @@ -762,9 +583,9 @@ private int jjMoveNfa_0(int startState, int curPos) case 0: if ((0x3ff000000000000L & l) == 0L) break; - if (kind > 25) - kind = 25; - jjAddStates(19, 20); + if (kind > 22) + kind = 22; + jjAddStates(8, 9); break; case 1: if (curChar == 46) @@ -773,8 +594,8 @@ private int jjMoveNfa_0(int startState, int curPos) case 2: if ((0x3ff000000000000L & l) == 0L) break; - if (kind > 25) - kind = 25; + if (kind > 22) + kind = 22; jjCheckNAdd(2); break; default : break; @@ -825,9 +646,9 @@ private final int jjStopStringLiteralDfa_2(int pos, long active0) switch (pos) { case 0: - if ((active0 & 0x4000000L) != 0L) + if ((active0 & 0x800000L) != 0L) { - jjmatchedKind = 29; + jjmatchedKind = 26; return 6; } return -1; @@ -844,9 +665,9 @@ private int jjMoveStringLiteralDfa0_2() switch(curChar) { case 84: - return jjMoveStringLiteralDfa1_2(0x4000000L); + return jjMoveStringLiteralDfa1_2(0x800000L); case 93: - return jjStopAtPos(0, 27); + return jjStopAtPos(0, 24); default : return jjMoveNfa_2(0, 0); } @@ -861,8 +682,8 @@ private int jjMoveStringLiteralDfa1_2(long active0) switch(curChar) { case 79: - if ((active0 & 0x4000000L) != 0L) - return jjStartNfaWithStates_2(1, 26, 6); + if ((active0 & 0x800000L) != 0L) + return jjStartNfaWithStates_2(1, 23, 6); break; default : break; @@ -898,8 +719,8 @@ private int jjMoveNfa_2(int startState, int curPos) case 0: if ((0xfffffffeffffffffL & l) != 0L) { - if (kind > 29) - kind = 29; + if (kind > 26) + kind = 26; jjCheckNAdd(6); } if ((0x100002600L & l) != 0L) @@ -916,21 +737,21 @@ private int jjMoveNfa_2(int startState, int curPos) break; case 2: if ((0xfffffffbffffffffL & l) != 0L) - jjCheckNAddStates(16, 18); + jjCheckNAddStates(5, 7); break; case 3: if (curChar == 34) - jjCheckNAddStates(16, 18); + jjCheckNAddStates(5, 7); break; case 5: - if (curChar == 34 && kind > 28) - kind = 28; + if (curChar == 34 && kind > 25) + kind = 25; break; case 6: if ((0xfffffffeffffffffL & l) == 0L) break; - if (kind > 29) - kind = 29; + if (kind > 26) + kind = 26; jjCheckNAdd(6); break; default : break; @@ -948,12 +769,12 @@ private int jjMoveNfa_2(int startState, int curPos) case 6: if ((0xffffffffdfffffffL & l) == 0L) break; - if (kind > 29) - kind = 29; + if (kind > 26) + kind = 26; jjCheckNAdd(6); break; case 2: - jjAddStates(16, 18); + jjAddStates(5, 7); break; case 4: if (curChar == 92) @@ -982,20 +803,20 @@ private int jjMoveNfa_2(int startState, int curPos) } if (jjCanMove_1(hiByte, i1, i2, l1, l2)) { - if (kind > 29) - kind = 29; + if (kind > 26) + kind = 26; jjCheckNAdd(6); } break; case 2: if (jjCanMove_1(hiByte, i1, i2, l1, l2)) - jjAddStates(16, 18); + jjAddStates(5, 7); break; case 6: if (!jjCanMove_1(hiByte, i1, i2, l1, l2)) break; - if (kind > 29) - kind = 29; + if (kind > 26) + kind = 26; jjCheckNAdd(6); break; default : break; @@ -1016,8 +837,7 @@ private int jjMoveNfa_2(int startState, int curPos) } } static final int[] jjnextStates = { - 15, 16, 18, 29, 32, 23, 33, 30, 20, 21, 32, 23, 33, 31, 34, 27, - 2, 4, 5, 0, 1, + 15, 16, 18, 25, 26, 2, 4, 5, 0, 1, }; private static final boolean jjCanMove_0(int hiByte, int i1, int i2, long l1, long l2) { @@ -1059,8 +879,8 @@ private static final boolean jjCanMove_2(int hiByte, int i1, int i2, long l1, lo /** Token literal values. */ public static final String[] jjstrLiteralImages = { "", null, null, null, null, null, null, null, null, null, null, "\53", "\55", -"\50", "\51", "\72", "\52", "\136", null, null, null, null, null, "\133", "\173", -null, "\124\117", "\135", null, null, "\124\117", "\175", null, null, }; +"\50", "\51", "\72", "\136", null, null, null, "\133", "\173", null, "\124\117", +"\135", null, null, "\124\117", "\175", null, null, }; /** Lexer state names. */ public static final String[] lexStateNames = { @@ -1072,18 +892,18 @@ public static final String[] lexStateNames = { /** Lex State array. */ public static final int[] jjnewLexState = { - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, 2, 1, - 3, -1, 3, -1, -1, -1, 3, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, 2, 1, 3, -1, 3, + -1, -1, -1, 3, -1, -1, }; static final long[] jjtoToken = { - 0x3ffffff01L, + 0x7fffff01L, }; static final long[] jjtoSkip = { 0x80L, }; protected JavaCharStream input_stream; -private final int[] jjrounds = new int[36]; -private final int[] jjstateSet = new int[72]; +private final int[] jjrounds = new int[28]; +private final int[] jjstateSet = new int[56]; protected char curChar; /** Constructor. */ public StandardSyntaxParserTokenManager(JavaCharStream stream){ @@ -1110,7 +930,7 @@ private void ReInitRounds() { int i; jjround = 0x80000001; - for (i = 36; i-- > 0;) + for (i = 28; i-- > 0;) jjrounds[i] = 0x80000000; } diff --git a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/parser/Token.java b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/parser/Token.java index 60a8825c368..1fdd26941fc 100644 --- a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/parser/Token.java +++ b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/parser/Token.java @@ -128,4 +128,4 @@ public class Token implements java.io.Serializable { } } -/* JavaCC - StandardChecksum=f9eb36a076cde62bf39ccbf828bc2117 (do not edit this line) */ +/* JavaCC - OriginalChecksum=75998e81abbed08b0922a65bec11680d (do not edit this line) */ diff --git a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/parser/TokenMgrError.java b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/parser/TokenMgrError.java index 92797006e6b..4b72f0ce03d 100644 --- a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/parser/TokenMgrError.java +++ b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/parser/TokenMgrError.java @@ -144,4 +144,4 @@ public class TokenMgrError extends Error this(LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason); } } -/* JavaCC - StandardChecksum=91ba9c9f5e0e552a815530d639ce15ed (do not edit this line) */ +/* JavaCC - OriginalChecksum=9672a6de7ecf4f5789a473d7dd40f6fb (do not edit this line) */ diff --git a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/AllowLeadingWildcardProcessor.java b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/AllowLeadingWildcardProcessor.java index eccc9ffb8ff..92c724bfe37 100644 --- a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/AllowLeadingWildcardProcessor.java +++ b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/AllowLeadingWildcardProcessor.java @@ -24,9 +24,10 @@ import org.apache.lucene.queryParser.core.QueryNodeException; import org.apache.lucene.queryParser.core.config.QueryConfigHandler; import org.apache.lucene.queryParser.core.messages.QueryParserMessages; import org.apache.lucene.queryParser.core.nodes.QueryNode; -import org.apache.lucene.queryParser.core.nodes.WildcardQueryNode; import org.apache.lucene.queryParser.core.processors.QueryNodeProcessorImpl; +import org.apache.lucene.queryParser.core.util.UnescapedCharSequence; import org.apache.lucene.queryParser.standard.config.AllowLeadingWildcardAttribute; +import org.apache.lucene.queryParser.standard.nodes.WildcardQueryNode; import org.apache.lucene.queryParser.standard.parser.EscapeQuerySyntaxImpl; /** @@ -46,19 +47,16 @@ public class AllowLeadingWildcardProcessor extends QueryNodeProcessorImpl { public QueryNode process(QueryNode queryTree) throws QueryNodeException { - if (getQueryConfigHandler().hasAttribute( - AllowLeadingWildcardAttribute.class)) { + if (getQueryConfigHandler().hasAttribute(AllowLeadingWildcardAttribute.class)) { - if (!((AllowLeadingWildcardAttribute) getQueryConfigHandler() - .getAttribute(AllowLeadingWildcardAttribute.class)) - .isAllowLeadingWildcard()) { + AllowLeadingWildcardAttribute alwAttr= (AllowLeadingWildcardAttribute) getQueryConfigHandler().getAttribute(AllowLeadingWildcardAttribute.class); + if (!alwAttr.isAllowLeadingWildcard()) { return super.process(queryTree); } } return queryTree; - } protected QueryNode postProcessNode(QueryNode node) throws QueryNodeException { @@ -66,14 +64,19 @@ public class AllowLeadingWildcardProcessor extends QueryNodeProcessorImpl { if (node instanceof WildcardQueryNode) { WildcardQueryNode wildcardNode = (WildcardQueryNode) node; - switch (wildcardNode.getText().charAt(0)) { - - case '*': - case '?': - throw new QueryNodeException(new MessageImpl( - QueryParserMessages.LEADING_WILDCARD_NOT_ALLOWED, node - .toQueryString(new EscapeQuerySyntaxImpl()))); - + if (wildcardNode.getText().length() > 0) { + + // Validate if the wildcard was escaped + if (UnescapedCharSequence.wasEscaped(wildcardNode.getText(), 0)) + return node; + + switch (wildcardNode.getText().charAt(0)) { + case '*': + case '?': + throw new QueryNodeException(new MessageImpl( + QueryParserMessages.LEADING_WILDCARD_NOT_ALLOWED, node + .toQueryString(new EscapeQuerySyntaxImpl()))); + } } } diff --git a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/AnalyzerQueryNodeProcessor.java b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/AnalyzerQueryNodeProcessor.java index 9bd6e4a7ce9..63a8ebe2c6a 100644 --- a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/AnalyzerQueryNodeProcessor.java +++ b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/AnalyzerQueryNodeProcessor.java @@ -38,12 +38,12 @@ import org.apache.lucene.queryParser.core.nodes.ParametricQueryNode; import org.apache.lucene.queryParser.core.nodes.QueryNode; import org.apache.lucene.queryParser.core.nodes.TextableQueryNode; import org.apache.lucene.queryParser.core.nodes.TokenizedPhraseQueryNode; -import org.apache.lucene.queryParser.core.nodes.WildcardQueryNode; import org.apache.lucene.queryParser.core.processors.QueryNodeProcessorImpl; import org.apache.lucene.queryParser.standard.config.AnalyzerAttribute; import org.apache.lucene.queryParser.standard.config.PositionIncrementsAttribute; -import org.apache.lucene.queryParser.standard.nodes.StandardBooleanQueryNode; import org.apache.lucene.queryParser.standard.nodes.MultiPhraseQueryNode; +import org.apache.lucene.queryParser.standard.nodes.StandardBooleanQueryNode; +import org.apache.lucene.queryParser.standard.nodes.WildcardQueryNode; /** * This processor verifies if the attribute {@link AnalyzerQueryNodeProcessor} diff --git a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/LowercaseExpandedTermsQueryNodeProcessor.java b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/LowercaseExpandedTermsQueryNodeProcessor.java index 67f6ddae400..c81532af7cd 100644 --- a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/LowercaseExpandedTermsQueryNodeProcessor.java +++ b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/LowercaseExpandedTermsQueryNodeProcessor.java @@ -25,9 +25,10 @@ import org.apache.lucene.queryParser.core.nodes.FieldQueryNode; import org.apache.lucene.queryParser.core.nodes.FuzzyQueryNode; import org.apache.lucene.queryParser.core.nodes.ParametricQueryNode; import org.apache.lucene.queryParser.core.nodes.QueryNode; -import org.apache.lucene.queryParser.core.nodes.WildcardQueryNode; import org.apache.lucene.queryParser.core.processors.QueryNodeProcessorImpl; +import org.apache.lucene.queryParser.core.util.UnescapedCharSequence; import org.apache.lucene.queryParser.standard.config.LowercaseExpandedTermsAttribute; +import org.apache.lucene.queryParser.standard.nodes.WildcardQueryNode; /** * This processor verifies if the attribute @@ -68,9 +69,8 @@ public class LowercaseExpandedTermsQueryNodeProcessor extends if (node instanceof WildcardQueryNode || node instanceof FuzzyQueryNode || node instanceof ParametricQueryNode) { - FieldQueryNode fieldNode = (FieldQueryNode) node; - fieldNode.setText(fieldNode.getText().toString().toLowerCase()); - + FieldQueryNode fieldNode = (FieldQueryNode) node; + fieldNode.setText(UnescapedCharSequence.toLowerCase(fieldNode.getText())); } return node; diff --git a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/MatchAllDocsQueryNodeProcessor.java b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/MatchAllDocsQueryNodeProcessor.java index 96b676826c4..a418ac08ab2 100644 --- a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/MatchAllDocsQueryNodeProcessor.java +++ b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/MatchAllDocsQueryNodeProcessor.java @@ -20,10 +20,11 @@ package org.apache.lucene.queryParser.standard.processors; import java.util.List; import org.apache.lucene.queryParser.core.QueryNodeException; +import org.apache.lucene.queryParser.core.nodes.FieldQueryNode; import org.apache.lucene.queryParser.core.nodes.MatchAllDocsQueryNode; import org.apache.lucene.queryParser.core.nodes.QueryNode; -import org.apache.lucene.queryParser.core.nodes.WildcardQueryNode; import org.apache.lucene.queryParser.core.processors.QueryNodeProcessorImpl; +import org.apache.lucene.queryParser.standard.nodes.WildcardQueryNode; import org.apache.lucene.search.MatchAllDocsQuery; /** @@ -41,11 +42,11 @@ public class MatchAllDocsQueryNodeProcessor extends QueryNodeProcessorImpl { protected QueryNode postProcessNode(QueryNode node) throws QueryNodeException { - if (node instanceof WildcardQueryNode) { - WildcardQueryNode wildcardNode = (WildcardQueryNode) node; + if (node instanceof FieldQueryNode) { + FieldQueryNode fqn = (FieldQueryNode) node; - if (wildcardNode.getField().toString().equals("*") - && wildcardNode.getText().toString().equals("*")) { + if (fqn.getField().toString().equals("*") + && fqn.getText().toString().equals("*")) { return new MatchAllDocsQueryNode(); diff --git a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/MultiTermRewriteDefaultProcessor.java b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/MultiTermRewriteDefaultProcessor.java index 562ec01668b..e69de29bb2d 100644 --- a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/MultiTermRewriteDefaultProcessor.java +++ b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/MultiTermRewriteDefaultProcessor.java @@ -1,53 +0,0 @@ -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; - } -} diff --git a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/MultiTermRewriteMethodProcessor.java b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/MultiTermRewriteMethodProcessor.java new file mode 100644 index 00000000000..57f4b855734 --- /dev/null +++ b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/MultiTermRewriteMethodProcessor.java @@ -0,0 +1,66 @@ +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.ParametricRangeQueryNode; +import org.apache.lucene.queryParser.core.nodes.QueryNode; +import org.apache.lucene.queryParser.core.processors.QueryNodeProcessorImpl; +import org.apache.lucene.queryParser.standard.config.MultiTermRewriteMethodAttribute; +import org.apache.lucene.queryParser.standard.nodes.WildcardQueryNode; +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 MultiTermRewriteMethodProcessor extends QueryNodeProcessorImpl { + + protected QueryNode postProcessNode(QueryNode node) { + + // set setMultiTermRewriteMethod for WildcardQueryNode and PrefixWildcardQueryNode + if (node instanceof WildcardQueryNode || node instanceof ParametricRangeQueryNode + || node instanceof ParametricRangeQueryNode) { + + if (!getQueryConfigHandler().hasAttribute(MultiTermRewriteMethodAttribute.class)) { + // This should not happen, this attribute is created in the StandardQueryConfigHandler + throw new IllegalArgumentException("MultiTermRewriteMethodAttribute should be set on the QueryConfigHandler"); + } + + //read the attribute value and use a TAG to take the value to the Builder + MultiTermQuery.RewriteMethod rewriteMethod = ((MultiTermRewriteMethodAttribute) getQueryConfigHandler() + .getAttribute(MultiTermRewriteMethodAttribute.class)) + .getMultiTermRewriteMethod(); + + node.setTag(MultiTermRewriteMethodAttribute.TAG_ID, rewriteMethod); + } + + return node; + } + + protected QueryNode preProcessNode(QueryNode node) { + return node; + } + + protected List setChildrenOrder(List children) { + return children; + } +} diff --git a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/ParametricRangeQueryNodeProcessor.java b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/ParametricRangeQueryNodeProcessor.java index e5c6779c4ab..a2f6832203b 100644 --- a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/ParametricRangeQueryNodeProcessor.java +++ b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/ParametricRangeQueryNodeProcessor.java @@ -35,12 +35,10 @@ import org.apache.lucene.queryParser.core.nodes.ParametricRangeQueryNode; import org.apache.lucene.queryParser.core.nodes.QueryNode; import org.apache.lucene.queryParser.core.nodes.ParametricQueryNode.CompareOperator; import org.apache.lucene.queryParser.core.processors.QueryNodeProcessorImpl; -import org.apache.lucene.queryParser.standard.config.MultiTermRewriteMethodAttribute; import org.apache.lucene.queryParser.standard.config.DateResolutionAttribute; import org.apache.lucene.queryParser.standard.config.LocaleAttribute; import org.apache.lucene.queryParser.standard.config.RangeCollatorAttribute; import org.apache.lucene.queryParser.standard.nodes.RangeQueryNode; -import org.apache.lucene.search.MultiTermQuery; /** * This processor converts {@link ParametricRangeQueryNode} objects to @@ -85,16 +83,6 @@ public class ParametricRangeQueryNodeProcessor extends QueryNodeProcessorImpl { DateTools.Resolution dateRes = null; boolean inclusive = false; - if (!getQueryConfigHandler().hasAttribute( - MultiTermRewriteMethodAttribute.class)) { - throw new IllegalArgumentException( - "MultiTermRewriteMethodAttribute should be set on the QueryConfigHandler"); - } - - MultiTermQuery.RewriteMethod rewriteMethod = ((MultiTermRewriteMethodAttribute) getQueryConfigHandler() - .getAttribute(MultiTermRewriteMethodAttribute.class)) - .getMultiTermRewriteMethod(); - if (getQueryConfigHandler().hasAttribute(RangeCollatorAttribute.class)) { collator = ((RangeCollatorAttribute) getQueryConfigHandler() .getAttribute(RangeCollatorAttribute.class)).getRangeCollator(); @@ -164,7 +152,7 @@ public class ParametricRangeQueryNodeProcessor extends QueryNodeProcessorImpl { lower.setText(part1); upper.setText(part2); - return new RangeQueryNode(lower, upper, collator, rewriteMethod); + return new RangeQueryNode(lower, upper, collator); } diff --git a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/PrefixWildcardQueryNodeProcessor.java b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/PrefixWildcardQueryNodeProcessor.java index 53fa2d9255b..e69de29bb2d 100644 --- a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/PrefixWildcardQueryNodeProcessor.java +++ b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/PrefixWildcardQueryNodeProcessor.java @@ -1,72 +0,0 @@ -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.QueryNodeException; -import org.apache.lucene.queryParser.core.nodes.PrefixWildcardQueryNode; -import org.apache.lucene.queryParser.core.nodes.QueryNode; -import org.apache.lucene.queryParser.core.processors.QueryNodeProcessorImpl; -import org.apache.lucene.queryParser.standard.parser.StandardSyntaxParser; -import org.apache.lucene.search.PrefixQuery; - -/** - * The {@link StandardSyntaxParser} creates {@link PrefixWildcardQueryNode} nodes which - * have values containing the prefixed wildcard. However, Lucene - * {@link PrefixQuery} cannot contain the prefixed wildcard. So, this processor - * basically removed the prefixed wildcard from the - * {@link PrefixWildcardQueryNode} value.
- * - * @see PrefixQuery - * @see PrefixWildcardQueryNode - */ -public class PrefixWildcardQueryNodeProcessor extends QueryNodeProcessorImpl { - - public PrefixWildcardQueryNodeProcessor() { - // empty constructor - } - - protected QueryNode postProcessNode(QueryNode node) throws QueryNodeException { - - if (node instanceof PrefixWildcardQueryNode) { - PrefixWildcardQueryNode prefixWildcardNode = (PrefixWildcardQueryNode) node; - CharSequence text = prefixWildcardNode.getText(); - - prefixWildcardNode.setText(text.subSequence(0, text.length() - 1)); - - } - - return node; - - } - - protected QueryNode preProcessNode(QueryNode node) throws QueryNodeException { - - return node; - - } - - protected List setChildrenOrder(List children) - throws QueryNodeException { - - return children; - - } - -} diff --git a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/StandardQueryNodeProcessorPipeline.java b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/StandardQueryNodeProcessorPipeline.java index b47eafc2d07..9ad54517970 100644 --- a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/StandardQueryNodeProcessorPipeline.java +++ b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/StandardQueryNodeProcessorPipeline.java @@ -48,13 +48,13 @@ public class StandardQueryNodeProcessorPipeline extends public StandardQueryNodeProcessorPipeline(QueryConfigHandler queryConfig) { super(queryConfig); + addProcessor(new WildcardQueryNodeProcessor()); addProcessor(new MultiFieldQueryNodeProcessor()); addProcessor(new FuzzyQueryNodeProcessor()); addProcessor(new MatchAllDocsQueryNodeProcessor()); addProcessor(new LowercaseExpandedTermsQueryNodeProcessor()); addProcessor(new ParametricRangeQueryNodeProcessor()); - addProcessor(new AllowLeadingWildcardProcessor()); - addProcessor(new PrefixWildcardQueryNodeProcessor()); + addProcessor(new AllowLeadingWildcardProcessor()); addProcessor(new AnalyzerQueryNodeProcessor()); addProcessor(new PhraseSlopQueryNodeProcessor()); addProcessor(new GroupQueryNodeProcessor()); @@ -63,9 +63,8 @@ public class StandardQueryNodeProcessorPipeline extends addProcessor(new RemoveEmptyNonLeafQueryNodeProcessor()); addProcessor(new BooleanSingleChildOptimizationQueryNodeProcessor()); addProcessor(new DefaultPhraseSlopQueryNodeProcessor()); - addProcessor(new BoostQueryNodeProcessor()); - addProcessor(new MultiTermRewriteDefaultProcessor()); - + addProcessor(new BoostQueryNodeProcessor()); + addProcessor(new MultiTermRewriteMethodProcessor()); } } diff --git a/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/WildcardQueryNodeProcessor.java b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/WildcardQueryNodeProcessor.java new file mode 100644 index 00000000000..2bef4bd7c8b --- /dev/null +++ b/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/WildcardQueryNodeProcessor.java @@ -0,0 +1,136 @@ +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.QueryNodeException; +import org.apache.lucene.queryParser.core.nodes.FieldQueryNode; +import org.apache.lucene.queryParser.core.nodes.FuzzyQueryNode; +import org.apache.lucene.queryParser.core.nodes.ParametricQueryNode; +import org.apache.lucene.queryParser.core.nodes.QueryNode; +import org.apache.lucene.queryParser.core.nodes.QuotedFieldQueryNode; +import org.apache.lucene.queryParser.core.processors.QueryNodeProcessorImpl; +import org.apache.lucene.queryParser.core.util.UnescapedCharSequence; +import org.apache.lucene.queryParser.standard.nodes.PrefixWildcardQueryNode; +import org.apache.lucene.queryParser.standard.nodes.WildcardQueryNode; +import org.apache.lucene.queryParser.standard.parser.StandardSyntaxParser; +import org.apache.lucene.search.PrefixQuery; + +/** + * The {@link StandardSyntaxParser} creates {@link PrefixWildcardQueryNode} nodes which + * have values containing the prefixed wildcard. However, Lucene + * {@link PrefixQuery} cannot contain the prefixed wildcard. So, this processor + * basically removed the prefixed wildcard from the + * {@link PrefixWildcardQueryNode} value.
+ * + * @see PrefixQuery + * @see PrefixWildcardQueryNode + */ +public class WildcardQueryNodeProcessor extends QueryNodeProcessorImpl { + + public WildcardQueryNodeProcessor() { + // empty constructor + } + + protected QueryNode postProcessNode(QueryNode node) throws QueryNodeException { + + // the old Lucene Parser ignores FuzzyQueryNode that are also PrefixWildcardQueryNode or WildcardQueryNode + // we do the same here, also ignore empty terms + if (node instanceof FieldQueryNode || node instanceof FuzzyQueryNode) { + FieldQueryNode fqn = (FieldQueryNode) node; + CharSequence text = fqn.getText(); + + // do not process wildcards for ParametricQueryNode and + // QuotedFieldQueryNode to reproduce the old parser behavior + if (fqn instanceof ParametricQueryNode + || fqn instanceof QuotedFieldQueryNode + || text.length() <= 0){ + // Ignore empty terms + return node; + } + + // Code below simulates the old lucene parser behavior for wildcards + + if (isPrefixWildcard(text)) { + PrefixWildcardQueryNode prefixWildcardQN = new PrefixWildcardQueryNode(fqn); + return prefixWildcardQN; + + } else if (isWildcard(text)){ + WildcardQueryNode wildcardQN = new WildcardQueryNode(fqn); + return wildcardQN; + } + + } + + return node; + + } + + private boolean isWildcard(CharSequence text) { + if (text ==null || text.length() <= 0) return false; + + // If a un-escaped '*' or '?' if found return true + // start at the end since it's more common to put wildcards at the end + for(int i=text.length()-1; i>=0; i--){ + if ((text.charAt(i) == '*' || text.charAt(i) == '?') && !UnescapedCharSequence.wasEscaped(text, i)){ + return true; + } + } + + return false; + } + + private boolean isPrefixWildcard(CharSequence text) { + if (text == null || text.length() <= 0 || !isWildcard(text)) return false; + + // Validate last character is a '*' and was not escaped + // If single '*' is is a wildcard not prefix to simulate old queryparser + if (text.charAt(text.length()-1) != '*') return false; + if (UnescapedCharSequence.wasEscaped(text, text.length()-1)) return false; + if (text.length() == 1) return false; + + // Only make a prefix if there is only one single star at the end and no '?' or '*' characters + // If single wildcard return false to mimic old queryparser + for(int i=0; i setChildrenOrder(List children) + throws QueryNodeException { + + return children; + + } + +} diff --git a/contrib/queryparser/src/test/org/apache/lucene/queryParser/spans/TestSpanQueryParser.java b/contrib/queryparser/src/test/org/apache/lucene/queryParser/spans/TestSpanQueryParser.java index 954e48f7c9a..36628c2549c 100644 --- a/contrib/queryparser/src/test/org/apache/lucene/queryParser/spans/TestSpanQueryParser.java +++ b/contrib/queryparser/src/test/org/apache/lucene/queryParser/spans/TestSpanQueryParser.java @@ -27,6 +27,7 @@ import org.apache.lucene.queryParser.core.nodes.QueryNode; import org.apache.lucene.queryParser.core.parser.SyntaxParser; import org.apache.lucene.queryParser.core.processors.QueryNodeProcessorPipeline; import org.apache.lucene.queryParser.standard.parser.StandardSyntaxParser; +import org.apache.lucene.queryParser.standard.processors.WildcardQueryNodeProcessor; import org.apache.lucene.search.spans.SpanOrQuery; import org.apache.lucene.search.spans.SpanQuery; import org.apache.lucene.search.spans.SpanTermQuery; @@ -115,13 +116,11 @@ public class TestSpanQueryParser extends TestCase { this.spansQueryTreeBuilder = new SpansQueryTreeBuilder(); // set up the processor pipeline - this.spanProcessorPipeline - .setQueryConfigHandler(this.spanQueryConfigHandler); + this.spanProcessorPipeline.setQueryConfigHandler(this.spanQueryConfigHandler); - this.spanProcessorPipeline - .addProcessor(new SpansValidatorQueryNodeProcessor()); - this.spanProcessorPipeline - .addProcessor(new UniqueFieldQueryNodeProcessor()); + this.spanProcessorPipeline.addProcessor(new WildcardQueryNodeProcessor()); + this.spanProcessorPipeline.addProcessor(new SpansValidatorQueryNodeProcessor()); + this.spanProcessorPipeline.addProcessor(new UniqueFieldQueryNodeProcessor()); } diff --git a/contrib/queryparser/src/test/org/apache/lucene/queryParser/standard/TestQPHelper.java b/contrib/queryparser/src/test/org/apache/lucene/queryParser/standard/TestQPHelper.java index e106ebb670f..4c4569ef865 100644 --- a/contrib/queryparser/src/test/org/apache/lucene/queryParser/standard/TestQPHelper.java +++ b/contrib/queryparser/src/test/org/apache/lucene/queryParser/standard/TestQPHelper.java @@ -54,10 +54,10 @@ import org.apache.lucene.queryParser.core.QueryNodeException; import org.apache.lucene.queryParser.core.messages.QueryParserMessages; import org.apache.lucene.queryParser.core.nodes.FuzzyQueryNode; import org.apache.lucene.queryParser.core.nodes.QueryNode; -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.DefaultOperatorAttribute.Operator; +import org.apache.lucene.queryParser.standard.nodes.WildcardQueryNode; import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.FuzzyQuery; import org.apache.lucene.search.IndexSearcher; @@ -759,6 +759,8 @@ public class TestQPHelper extends LuceneTestCase { * "foo \\AND bar"); */ + assertQueryEquals("\\*", a, "*"); + assertQueryEquals("\\a", a, "a"); assertQueryEquals("a\\-b:c", a, "a-b:c"); @@ -938,13 +940,13 @@ public class TestQPHelper extends LuceneTestCase { } public void testException() throws Exception { + assertQueryNodeException("*leadingWildcard"); // disallowed by default assertQueryNodeException("\"some phrase"); assertQueryNodeException("(foo bar"); assertQueryNodeException("foo bar))"); assertQueryNodeException("field:term:with:colon some more terms"); assertQueryNodeException("(sub query)^5.0^2.0 plus more"); - assertQueryNodeException("secret AND illegal) AND access:confidential"); - assertQueryNodeException("*leadingWildcard"); // disallowed by default + assertQueryNodeException("secret AND illegal) AND access:confidential"); } public void testCustomQueryParserWildcard() { diff --git a/contrib/queryparser/src/test/org/apache/lucene/queryParser/standard/TestQueryParserWrapper.java b/contrib/queryparser/src/test/org/apache/lucene/queryParser/standard/TestQueryParserWrapper.java index d172059603c..0f044a4676c 100644 --- a/contrib/queryparser/src/test/org/apache/lucene/queryParser/standard/TestQueryParserWrapper.java +++ b/contrib/queryparser/src/test/org/apache/lucene/queryParser/standard/TestQueryParserWrapper.java @@ -51,9 +51,10 @@ import org.apache.lucene.queryParser.core.QueryNodeException; import org.apache.lucene.queryParser.core.messages.QueryParserMessages; import org.apache.lucene.queryParser.core.nodes.FuzzyQueryNode; import org.apache.lucene.queryParser.core.nodes.QueryNode; -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.nodes.WildcardQueryNode; +import org.apache.lucene.queryParser.standard.processors.WildcardQueryNodeProcessor; import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.FuzzyQuery; import org.apache.lucene.search.IndexSearcher; @@ -159,6 +160,7 @@ public class TestQueryParserWrapper extends LuceneTestCase { QueryNodeProcessorPipeline newProcessorPipeline = new QueryNodeProcessorPipeline( getQueryProcessor().getQueryConfigHandler()); + newProcessorPipeline.addProcessor(new WildcardQueryNodeProcessor()); newProcessorPipeline.addProcessor(new QPTestParserQueryNodeProcessor()); newProcessorPipeline.addProcessor(getQueryProcessor());