--- /dev/null
+package org.apache.lucene.queryParser.standard;
+
+/**
+ * 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.text.Collator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+import org.apache.lucene.analysis.Analyzer;
+import org.apache.lucene.document.DateTools;
+import org.apache.lucene.document.DateTools.Resolution;
+import org.apache.lucene.queryParser.ParseException;
+import org.apache.lucene.queryParser.QueryParser;
+import org.apache.lucene.queryParser.core.QueryNodeException;
+import org.apache.lucene.queryParser.core.config.FieldConfig;
+import org.apache.lucene.queryParser.core.config.QueryConfigHandler;
+import org.apache.lucene.queryParser.core.nodes.QueryNode;
+import org.apache.lucene.queryParser.core.parser.SyntaxParser;
+import org.apache.lucene.queryParser.core.processors.QueryNodeProcessor;
+import org.apache.lucene.queryParser.standard.builders.StandardQueryBuilder;
+import org.apache.lucene.queryParser.standard.builders.StandardQueryTreeBuilder;
+import org.apache.lucene.queryParser.standard.config.StandardQueryConfigHandler;
+import org.apache.lucene.queryParser.standard.config.StandardQueryConfigHandler.ConfigurationKeys;
+import org.apache.lucene.queryParser.standard.parser.StandardSyntaxParser;
+import org.apache.lucene.queryParser.standard.processors.StandardQueryNodeProcessorPipeline;
+import org.apache.lucene.search.BooleanClause;
+import org.apache.lucene.search.FuzzyQuery;
+import org.apache.lucene.search.MultiTermQuery;
+import org.apache.lucene.search.Query;
+
+/**
+ * This class performs the query parsing using the new query parser
+ * implementation, but keeps the old {@link QueryParser} API. <br/>
+ * <br/>
+ * This class should be used when the new query parser features are and the old
+ * {@link QueryParser} API are needed at the same time. <br/>
+ *
+ * @deprecated this class will be removed soon, it's a temporary class to be
+ * used along the transition from the old query parser to the new
+ * one
+ */
+@Deprecated
+public class QueryParserWrapper {
+
+ /**
+ * The default operator for parsing queries. Use
+ * {@link QueryParserWrapper#setDefaultOperator} to change it.
+ */
+ static public enum Operator { OR, AND }
+
+ // the nested class:
+ /** Alternative form of QueryParser.Operator.AND */
+ public static final Operator AND_OPERATOR = Operator.AND;
+
+ /** Alternative form of QueryParser.Operator.OR */
+ public static final Operator OR_OPERATOR = Operator.OR;
+
+ /**
+ * Returns a String where those characters that QueryParser expects to be
+ * escaped are escaped by a preceding <code>\</code>.
+ */
+ public static String escape(String s) {
+ StringBuilder sb = new StringBuilder();
+ for (int i = 0; i < s.length(); i++) {
+ char c = s.charAt(i);
+ // These characters are part of the query syntax and must be escaped
+ if (c == '\\' || c == '+' || c == '-' || c == '!' || c == '(' || c == ')'
+ || c == ':' || c == '^' || c == '[' || c == ']' || c == '\"'
+ || c == '{' || c == '}' || c == '~' || c == '*' || c == '?'
+ || c == '|' || c == '&') {
+ sb.append('\\');
+ }
+ sb.append(c);
+ }
+ return sb.toString();
+ }
+
+ private SyntaxParser syntaxParser = new StandardSyntaxParser();
+
+ private StandardQueryConfigHandler config;
+
+ private StandardQueryParser qpHelper;
+
+ private QueryNodeProcessor processorPipeline;
+
+ private StandardQueryBuilder builder = new StandardQueryTreeBuilder();
+
+ private String defaultField;
+
+ public QueryParserWrapper(String defaultField, Analyzer analyzer) {
+ this.defaultField = defaultField;
+
+ this.qpHelper = new StandardQueryParser();
+
+ this.config = (StandardQueryConfigHandler) qpHelper.getQueryConfigHandler();
+
+ this.qpHelper.setAnalyzer(analyzer);
+
+ this.processorPipeline = new StandardQueryNodeProcessorPipeline(this.config);
+
+ }
+
+ StandardQueryParser getQueryParserHelper() {
+ return qpHelper;
+ }
+
+ public String getField() {
+ return this.defaultField;
+ }
+
+ public Analyzer getAnalyzer() {
+
+ if (this.config != null) {
+ return this.config.get(ConfigurationKeys.ANALYZER);
+ }
+
+ return null;
+
+ }
+
+ /**
+ * Sets the {@link StandardQueryBuilder} used to generate a {@link Query}
+ * object from the parsed and processed query node tree.
+ *
+ * @param builder the builder
+ */
+ public void setQueryBuilder(StandardQueryBuilder builder) {
+ this.builder = builder;
+ }
+
+ /**
+ * Sets the {@link QueryNodeProcessor} used to process the query node tree
+ * generated by the
+ * {@link org.apache.lucene.queryParser.standard.parser.StandardSyntaxParser}.
+ *
+ * @param processor the processor
+ */
+ public void setQueryProcessor(QueryNodeProcessor processor) {
+ this.processorPipeline = processor;
+ this.processorPipeline.setQueryConfigHandler(this.config);
+
+ }
+
+ /**
+ * Sets the {@link QueryConfigHandler} used by the {@link QueryNodeProcessor}
+ * set to this object.
+ *
+ * @param queryConfig the query config handler
+ */
+ public void setQueryConfig(StandardQueryConfigHandler queryConfig) {
+ this.config = queryConfig;
+
+ if (this.processorPipeline != null) {
+ this.processorPipeline.setQueryConfigHandler(this.config);
+ }
+
+ }
+
+ /**
+ * Returns the query config handler used by this query parser
+ *
+ * @return the query config handler
+ */
+ public QueryConfigHandler getQueryConfigHandler() {
+ return this.config;
+ }
+
+ /**
+ * Returns {@link QueryNodeProcessor} used to process the query node tree
+ * generated by the
+ * {@link org.apache.lucene.queryParser.standard.parser.StandardSyntaxParser}.
+ *
+ * @return the query processor
+ */
+ public QueryNodeProcessor getQueryProcessor() {
+ return this.processorPipeline;
+ }
+
+ public ParseException generateParseException() {
+ return null;
+ }
+
+ public boolean getAllowLeadingWildcard() {
+
+ if (this.config != null) {
+ return this.config.get(ConfigurationKeys.ALLOW_LEADING_WILDCARD, false);
+ }
+
+ return false;
+
+ }
+
+ public MultiTermQuery.RewriteMethod getMultiTermRewriteMethod() {
+
+ if (this.config != null) {
+ return this.config.get(ConfigurationKeys.MULTI_TERM_REWRITE_METHOD,
+ MultiTermQuery.CONSTANT_SCORE_AUTO_REWRITE_DEFAULT);
+ }
+
+ return MultiTermQuery.CONSTANT_SCORE_AUTO_REWRITE_DEFAULT;
+
+ }
+
+ public Resolution getDateResolution(String fieldName) {
+
+ if (this.config != null) {
+ FieldConfig fieldConfig = this.config.getFieldConfig(fieldName);
+
+ if (fieldConfig != null) {
+ return fieldConfig.get(ConfigurationKeys.DATE_RESOLUTION);
+ }
+
+ }
+
+ return null;
+
+ }
+
+ public boolean getEnablePositionIncrements() {
+
+ if (this.config != null) {
+ return this.config.get(ConfigurationKeys.ENABLE_POSITION_INCREMENTS,
+ false);
+ }
+
+ return false;
+
+ }
+
+ public float getFuzzyMinSim() {
+ return FuzzyQuery.defaultMinSimilarity;
+ }
+
+ public int getFuzzyPrefixLength() {
+ return FuzzyQuery.defaultPrefixLength;
+ }
+
+ public Locale getLocale() {
+
+ if (this.config != null) {
+ return this.config.get(ConfigurationKeys.LOCALE, Locale.getDefault());
+ }
+
+ return Locale.getDefault();
+
+ }
+
+ public boolean getLowercaseExpandedTerms() {
+
+ if (this.config != null) {
+ return this.config.get(ConfigurationKeys.LOWERCASE_EXPANDED_TERMS, true);
+ }
+
+ return true;
+
+ }
+
+ public int getPhraseSlop() {
+
+ if (this.config != null) {
+ return this.config.get(ConfigurationKeys.PHRASE_SLOP, 0);
+ }
+
+ return 0;
+
+ }
+
+ public Collator getRangeCollator() {
+
+ if (this.config != null) {
+ return this.config.get(ConfigurationKeys.RANGE_COLLATOR);
+ }
+
+ return null;
+
+ }
+
+ public boolean getUseOldRangeQuery() {
+ if (getMultiTermRewriteMethod() == MultiTermQuery.SCORING_BOOLEAN_QUERY_REWRITE) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public Query parse(String query) throws ParseException {
+
+ try {
+ QueryNode queryTree = this.syntaxParser.parse(query, getField());
+ queryTree = this.processorPipeline.process(queryTree);
+ return this.builder.build(queryTree);
+
+ } catch (QueryNodeException e) {
+ throw new ParseException("parse exception");
+ }
+
+ }
+
+ public void setAllowLeadingWildcard(boolean allowLeadingWildcard) {
+ this.qpHelper.setAllowLeadingWildcard(allowLeadingWildcard);
+ }
+
+ public void setMultiTermRewriteMethod(MultiTermQuery.RewriteMethod method) {
+ this.qpHelper.setMultiTermRewriteMethod(method);
+ }
+
+ public void setDateResolution(Resolution dateResolution) {
+ this.qpHelper.setDateResolution(dateResolution);
+ }
+
+ private Map<CharSequence, DateTools.Resolution> dateRes = new HashMap<CharSequence, DateTools.Resolution>();
+
+ public void setDateResolution(String fieldName, Resolution dateResolution) {
+ dateRes.put(fieldName, dateResolution);
+ this.qpHelper.setDateResolution(dateRes);
+ }
+
+ public void setDefaultOperator(Operator op) {
+
+ this.qpHelper
+ .setDefaultOperator(OR_OPERATOR.equals(op) ? org.apache.lucene.queryParser.standard.config.DefaultOperatorAttribute.Operator.OR
+ : org.apache.lucene.queryParser.standard.config.DefaultOperatorAttribute.Operator.AND);
+
+ }
+
+ public Operator getDefaultOperator() {
+
+ if (this.config != null) {
+
+ return (this.config.get(ConfigurationKeys.DEFAULT_OPERATOR, org.apache.lucene.queryParser.standard.config.StandardQueryConfigHandler.Operator.OR)
+ == org.apache.lucene.queryParser.standard.config.StandardQueryConfigHandler.Operator.AND) ? AND_OPERATOR
+ : OR_OPERATOR;
+
+ }
+
+ return OR_OPERATOR;
+
+ }
+
+ public void setEnablePositionIncrements(boolean enable) {
+ this.qpHelper.setEnablePositionIncrements(enable);
+ }
+
+ public void setFuzzyMinSim(float fuzzyMinSim) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void setFuzzyPrefixLength(int fuzzyPrefixLength) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void setLocale(Locale locale) {
+ this.qpHelper.setLocale(locale);
+ }
+
+ public void setLowercaseExpandedTerms(boolean lowercaseExpandedTerms) {
+ this.qpHelper.setLowercaseExpandedTerms(lowercaseExpandedTerms);
+ }
+
+ public void setPhraseSlop(int phraseSlop) {
+ this.qpHelper.setDefaultPhraseSlop(phraseSlop);
+ }
+
+ public void setRangeCollator(Collator rc) {
+ this.qpHelper.setRangeCollator(rc);
+ }
+
+ public void setUseOldRangeQuery(boolean useOldRangeQuery) {
+ if (useOldRangeQuery) {
+ setMultiTermRewriteMethod(MultiTermQuery.SCORING_BOOLEAN_QUERY_REWRITE);
+ } else {
+ setMultiTermRewriteMethod(MultiTermQuery.CONSTANT_SCORE_AUTO_REWRITE_DEFAULT);
+ }
+ }
+
+ protected Query getPrefixQuery(String field, String termStr)
+ throws ParseException {
+ throw new UnsupportedOperationException();
+ }
+
+ protected Query getWildcardQuery(String field, String termStr)
+ throws ParseException {
+ throw new UnsupportedOperationException();
+ }
+
+ protected Query getFuzzyQuery(String field, String termStr,
+ float minSimilarity) throws ParseException {
+ throw new UnsupportedOperationException();
+ }
+
+ /** @deprecated Use {@link #getFieldQuery(String, String, boolean)} instead */
+ @Deprecated
+ protected Query getFieldQuery(String field, String queryText) throws ParseException {
+ return getFieldQuery(field, queryText, true);
+ }
+
+ /**
+ * @exception ParseException throw in overridden method to disallow
+ */
+ protected Query getFieldQuery(String field, String queryText, boolean quoted)
+ throws ParseException {
+ throw new UnsupportedOperationException();
+ }
+
+ protected Query getBooleanQuery(List<BooleanClause> clauses, boolean disableCoord)
+ throws ParseException {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * Base implementation delegates to {@link #getFieldQuery(String,String)}.
+ * This method may be overridden, for example, to return a SpanNearQuery
+ * instead of a PhraseQuery.
+ *
+ * @exception ParseException throw in overridden method to disallow
+ */
+ protected Query getFieldQuery(String field, String queryText, int slop)
+ throws ParseException {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * @exception ParseException throw in overridden method to disallow
+ */
+ protected Query getRangeQuery(String field, String part1, String part2,
+ boolean inclusive) throws ParseException {
+ throw new UnsupportedOperationException();
+ }
+
+}