FYI, I am not sure this commit made it in time for the current 4.6.1
release candidate being voted on.


On Fri, Jan 17, 2014 at 9:36 PM, <adrianocrest...@apache.org> wrote:

> Author: adrianocrestani
> Date: Sat Jan 18 05:36:28 2014
> New Revision: 1559318
>
> URL: http://svn.apache.org/r1559318
> Log:
> LUCENE-Flexible StandardQueryParser behaves differently than
> ClassicQueryParser (4.6 branch)
>
> Modified:
>     lucene/dev/branches/lucene_solr_4_6/lucene/CHANGES.txt
>
> lucene/dev/branches/lucene_solr_4_6/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/processors/AnalyzerQueryNodeProcessor.java
>
> lucene/dev/branches/lucene_solr_4_6/lucene/queryparser/src/test/org/apache/lucene/queryparser/util/QueryParserTestBase.java
>
> Modified: lucene/dev/branches/lucene_solr_4_6/lucene/CHANGES.txt
> URL:
> http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_4_6/lucene/CHANGES.txt?rev=1559318&r1=1559317&r2=1559318&view=diff
>
> ==============================================================================
> --- lucene/dev/branches/lucene_solr_4_6/lucene/CHANGES.txt (original)
> +++ lucene/dev/branches/lucene_solr_4_6/lucene/CHANGES.txt Sat Jan 18
> 05:36:28 2014
> @@ -22,6 +22,9 @@ Bug fixes
>
>  * LUCENE-5394: Fix TokenSources.getTokenStream to return payloads if
>    they were indexed with the term vectors. (Mike McCandless)
> +
> +* LUCENE-5344: Flexible StandardQueryParser behaves differently than
> +  ClassicQueryParser. (Adriano Crestani)
>
>  * LUCENE-5375: ToChildBlockJoinQuery works harder to detect mis-use,
>    when the parent query incorrectly returns child documents, and throw
> @@ -139,7 +142,7 @@ Bug Fixes
>  * LUCENE-5342: Fixed bulk-merge issue in CompressingStoredFieldsFormat
> which
>    created corrupted segments when mixing chunk sizes.
>    Lucene41StoredFieldsFormat is not impacted. (Adrien Grand, Robert Muir)
> -
> +
>  API Changes
>
>  * LUCENE-5222: Add SortField.needsScores(). Previously it was not possible
>
> Modified:
> lucene/dev/branches/lucene_solr_4_6/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/processors/AnalyzerQueryNodeProcessor.java
> URL:
> http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_4_6/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/processors/AnalyzerQueryNodeProcessor.java?rev=1559318&r1=1559317&r2=1559318&view=diff
>
> ==============================================================================
> ---
> lucene/dev/branches/lucene_solr_4_6/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/processors/AnalyzerQueryNodeProcessor.java
> (original)
> +++
> lucene/dev/branches/lucene_solr_4_6/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/processors/AnalyzerQueryNodeProcessor.java
> Sat Jan 18 05:36:28 2014
> @@ -19,6 +19,7 @@ package org.apache.lucene.queryparser.fl
>
>  import java.io.IOException;
>  import java.util.ArrayList;
> +import java.util.Collections;
>  import java.util.LinkedList;
>  import java.util.List;
>
> @@ -27,23 +28,32 @@ import org.apache.lucene.analysis.Cachin
>  import org.apache.lucene.analysis.TokenStream;
>  import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
>  import
> org.apache.lucene.analysis.tokenattributes.PositionIncrementAttribute;
> +import org.apache.lucene.index.Term;
>  import org.apache.lucene.queryparser.flexible.core.QueryNodeException;
>  import
> org.apache.lucene.queryparser.flexible.core.config.QueryConfigHandler;
> +import org.apache.lucene.queryparser.flexible.core.nodes.BooleanQueryNode;
>  import org.apache.lucene.queryparser.flexible.core.nodes.FieldQueryNode;
>  import org.apache.lucene.queryparser.flexible.core.nodes.FuzzyQueryNode;
>  import org.apache.lucene.queryparser.flexible.core.nodes.GroupQueryNode;
> +import
> org.apache.lucene.queryparser.flexible.core.nodes.ModifierQueryNode;
>  import
> org.apache.lucene.queryparser.flexible.core.nodes.NoTokenFoundQueryNode;
>  import org.apache.lucene.queryparser.flexible.core.nodes.QueryNode;
>  import
> org.apache.lucene.queryparser.flexible.core.nodes.QuotedFieldQueryNode;
>  import org.apache.lucene.queryparser.flexible.core.nodes.RangeQueryNode;
>  import
> org.apache.lucene.queryparser.flexible.core.nodes.TextableQueryNode;
>  import
> org.apache.lucene.queryparser.flexible.core.nodes.TokenizedPhraseQueryNode;
> +import
> org.apache.lucene.queryparser.flexible.core.nodes.ModifierQueryNode.Modifier;
>  import
> org.apache.lucene.queryparser.flexible.core.processors.QueryNodeProcessorImpl;
>  import
> org.apache.lucene.queryparser.flexible.standard.config.StandardQueryConfigHandler.ConfigurationKeys;
> +import
> org.apache.lucene.queryparser.flexible.standard.config.StandardQueryConfigHandler.Operator;
>  import
> org.apache.lucene.queryparser.flexible.standard.nodes.MultiPhraseQueryNode;
>  import
> org.apache.lucene.queryparser.flexible.standard.nodes.RegexpQueryNode;
>  import
> org.apache.lucene.queryparser.flexible.standard.nodes.StandardBooleanQueryNode;
>  import
> org.apache.lucene.queryparser.flexible.standard.nodes.WildcardQueryNode;
> +import org.apache.lucene.search.BooleanClause;
> +import org.apache.lucene.search.BooleanQuery;
> +import org.apache.lucene.search.Query;
> +import org.apache.lucene.util.BytesRef;
>  import org.apache.lucene.util.IOUtils;
>
>  /**
> @@ -73,6 +83,8 @@ public class AnalyzerQueryNodeProcessor
>    private Analyzer analyzer;
>
>    private boolean positionIncrementsEnabled;
> +
> +  private Operator defaultOperator;
>
>    public AnalyzerQueryNodeProcessor() {
>      // empty constructor
> @@ -86,6 +98,8 @@ public class AnalyzerQueryNodeProcessor
>        this.analyzer = analyzer;
>        this.positionIncrementsEnabled = false;
>        Boolean positionIncrementsEnabled =
> getQueryConfigHandler().get(ConfigurationKeys.ENABLE_POSITION_INCREMENTS);
> +      Operator defaultOperator =
> getQueryConfigHandler().get(ConfigurationKeys.DEFAULT_OPERATOR);
> +      this.defaultOperator = defaultOperator != null ? defaultOperator :
> Operator.OR;
>
>        if (positionIncrementsEnabled != null) {
>            this.positionIncrementsEnabled = positionIncrementsEnabled;
> @@ -185,24 +199,70 @@ public class AnalyzerQueryNodeProcessor
>        } else if (severalTokensAtSamePosition || !(node instanceof
> QuotedFieldQueryNode)) {
>          if (positionCount == 1 || !(node instanceof
> QuotedFieldQueryNode)) {
>            // no phrase query:
> -          LinkedList<QueryNode> children = new LinkedList<QueryNode>();
> -
> -          for (int i = 0; i < numTokens; i++) {
> -            String term = null;
> -            try {
> -              boolean hasNext = buffer.incrementToken();
> -              assert hasNext == true;
> -              term = termAtt.toString();
> -
> -            } catch (IOException e) {
> -              // safe to ignore, because we know the number of tokens
> +
> +          if (positionCount == 1) {
> +            // simple case: only one position, with synonyms
> +            LinkedList<QueryNode> children = new LinkedList<QueryNode>();
> +
> +            for (int i = 0; i < numTokens; i++) {
> +              String term = null;
> +              try {
> +                boolean hasNext = buffer.incrementToken();
> +                assert hasNext == true;
> +                term = termAtt.toString();
> +
> +              } catch (IOException e) {
> +                // safe to ignore, because we know the number of tokens
> +              }
> +
> +              children.add(new FieldQueryNode(field, term, -1, -1));
> +
>              }
> -
> -            children.add(new FieldQueryNode(field, term, -1, -1));
> -
> +            return new GroupQueryNode(
> +                new StandardBooleanQueryNode(children, positionCount==1));
> +
> +          } else {
> +            // multiple positions
> +            QueryNode q = new
> StandardBooleanQueryNode(Collections.<QueryNode>emptyList(),false);
> +            QueryNode currentQuery = null;
> +            for (int i = 0; i < numTokens; i++) {
> +              String term = null;
> +              try {
> +                boolean hasNext = buffer.incrementToken();
> +                assert hasNext == true;
> +                term = termAtt.toString();
> +              } catch (IOException e) {
> +                // safe to ignore, because we know the number of tokens
> +              }
> +              if (posIncrAtt != null && posIncrAtt.getPositionIncrement()
> == 0) {
> +                if (!(currentQuery instanceof BooleanQueryNode)) {
> +                  QueryNode t = currentQuery;
> +                  currentQuery = new
> StandardBooleanQueryNode(Collections.<QueryNode>emptyList(), true);
> +                  ((BooleanQueryNode)currentQuery).add(t);
> +                }
> +                ((BooleanQueryNode)currentQuery).add(new
> FieldQueryNode(field, term, -1, -1));
> +              } else {
> +                if (currentQuery != null) {
> +                  if (this.defaultOperator == Operator.OR) {
> +                    q.add(currentQuery);
> +                  } else {
> +                    q.add(new ModifierQueryNode(currentQuery,
> Modifier.MOD_REQ));
> +                  }
> +                }
> +                currentQuery = new FieldQueryNode(field, term, -1, -1);
> +              }
> +            }
> +            if (this.defaultOperator == Operator.OR) {
> +              q.add(currentQuery);
> +            } else {
> +              q.add(new ModifierQueryNode(currentQuery,
> Modifier.MOD_REQ));
> +            }
> +
> +            if (q instanceof BooleanQueryNode) {
> +              q = new GroupQueryNode(q);
> +            }
> +            return q;
>            }
> -          return new GroupQueryNode(
> -            new StandardBooleanQueryNode(children, positionCount==1));
>          } else {
>            // phrase query:
>            MultiPhraseQueryNode mpq = new MultiPhraseQueryNode();
>
> Modified:
> lucene/dev/branches/lucene_solr_4_6/lucene/queryparser/src/test/org/apache/lucene/queryparser/util/QueryParserTestBase.java
> URL:
> http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_4_6/lucene/queryparser/src/test/org/apache/lucene/queryparser/util/QueryParserTestBase.java?rev=1559318&r1=1559317&r2=1559318&view=diff
>
> ==============================================================================
> ---
> lucene/dev/branches/lucene_solr_4_6/lucene/queryparser/src/test/org/apache/lucene/queryparser/util/QueryParserTestBase.java
> (original)
> +++
> lucene/dev/branches/lucene_solr_4_6/lucene/queryparser/src/test/org/apache/lucene/queryparser/util/QueryParserTestBase.java
> Sat Jan 18 05:36:28 2014
> @@ -558,6 +558,13 @@ public abstract class QueryParserTestBas
>      assertQueryEquals("((stop))", qpAnalyzer, "");
>      assertTrue(getQuery("term term term", qpAnalyzer) instanceof
> BooleanQuery);
>      assertTrue(getQuery("term +stop", qpAnalyzer) instanceof TermQuery);
> +
> +    CommonQueryParserConfiguration cqpc = getParserConfig(qpAnalyzer);
> +    setDefaultOperatorAND(cqpc);
> +    assertQueryEquals(cqpc, "field", "term phrase term",
> +        "+term +(+phrase1 +phrase2) +term");
> +    assertQueryEquals(cqpc, "field", "phrase",
> +        "+phrase1 +phrase2");
>    }
>
>    public void testRange() throws Exception {
>
>
>

Reply via email to