You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by kr...@apache.org on 2016/11/18 16:42:39 UTC

[14/20] lucene-solr:jira/solr-8593: LUCENE-7533: Classic query parser: disallow autoGeneratePhraseQueries=true when splitOnWhitespace=false (and vice-versa).

LUCENE-7533: Classic query parser: disallow autoGeneratePhraseQueries=true when splitOnWhitespace=false (and vice-versa).


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/8938c9f3
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/8938c9f3
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/8938c9f3

Branch: refs/heads/jira/solr-8593
Commit: 8938c9f3d0608544ba6f16832bad7421d4080b7b
Parents: 46ce87c
Author: Steve Rowe <sa...@apache.org>
Authored: Thu Nov 17 18:50:58 2016 -0500
Committer: Steve Rowe <sa...@apache.org>
Committed: Thu Nov 17 19:18:18 2016 -0500

----------------------------------------------------------------------
 lucene/CHANGES.txt                              |  8 ++
 .../lucene/queryparser/classic/QueryParser.java | 78 +++++++++++++-------
 .../lucene/queryparser/classic/QueryParser.jj   | 28 +++++++
 .../queryparser/classic/QueryParserBase.java    |  2 +-
 .../queryparser/classic/TestQueryParser.java    | 14 ++++
 .../queryparser/util/QueryParserTestBase.java   |  4 +
 6 files changed, 108 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/8938c9f3/lucene/CHANGES.txt
----------------------------------------------------------------------
diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt
index f5dfd44..051c326 100644
--- a/lucene/CHANGES.txt
+++ b/lucene/CHANGES.txt
@@ -56,6 +56,11 @@ Other
 
 ======================= Lucene 6.4.0 =======================
 
+API Changes
+
+* LUCENE-7533: Classic query parser no longer allows autoGeneratePhraseQueries
+  to be set to true when splitOnWhitespace is false (and vice-versa).
+
 New features
 
 * LUCENE-5867: Added BooleanSimilarity. (Robert Muir, Adrien Grand)
@@ -67,6 +72,9 @@ Bug Fixes
 
 * LUCENE-7562: CompletionFieldsConsumer sometimes throws
   NullPointerException on ghost fields (Oliver Eilhard via Mike McCandless)
+  
+* LUCENE-7533: Classic query parser: disallow autoGeneratePhraseQueries=true
+  when splitOnWhitespace=false (and vice-versa). (Steve Rowe)
 
 Improvements
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/8938c9f3/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/QueryParser.java
----------------------------------------------------------------------
diff --git a/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/QueryParser.java b/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/QueryParser.java
index dc43ab1..5e5d57b 100644
--- a/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/QueryParser.java
+++ b/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/QueryParser.java
@@ -97,6 +97,27 @@ public class QueryParser extends QueryParserBase implements QueryParserConstants
   }
 
   /**
+   * Set to true if phrase queries will be automatically generated
+   * when the analyzer returns more than one term from whitespace
+   * delimited text.
+   * NOTE: this behavior may not be suitable for all languages.
+   * <p>
+   * Set to false if phrase queries should only be generated when
+   * surrounded by double quotes.
+   * <p>
+   * The combination splitOnWhitespace=false and autoGeneratePhraseQueries=true
+   * is disallowed.  See <a href="https://issues.apache.org/jira/browse/LUCENE-7533">LUCENE-7533</a>.
+   */
+  @Override
+  public void setAutoGeneratePhraseQueries(boolean value) {
+    if (splitOnWhitespace == false && value == true) {
+      throw new IllegalArgumentException
+          ("setAutoGeneratePhraseQueries(true) is disallowed when getSplitOnWhitespace() == false");
+    }
+    this.autoGeneratePhraseQueries = value;
+  }
+
+  /**
    * @see #setSplitOnWhitespace(boolean)
    */
   public boolean getSplitOnWhitespace() {
@@ -106,8 +127,15 @@ public class QueryParser extends QueryParserBase implements QueryParserConstants
   /**
    * Whether query text should be split on whitespace prior to analysis.
    * Default is <code>{@value #DEFAULT_SPLIT_ON_WHITESPACE}</code>.
+   * <p>
+   * The combination splitOnWhitespace=false and autoGeneratePhraseQueries=true
+   * is disallowed.  See <a href="https://issues.apache.org/jira/browse/LUCENE-7533">LUCENE-7533</a>.
    */
   public void setSplitOnWhitespace(boolean splitOnWhitespace) {
+    if (splitOnWhitespace == false && getAutoGeneratePhraseQueries() == true) {
+      throw new IllegalArgumentException
+          ("setSplitOnWhitespace(false) is disallowed when getAutoGeneratePhraseQueries() == true");
+    }
     this.splitOnWhitespace = splitOnWhitespace;
   }
 
@@ -635,6 +663,31 @@ public class QueryParser extends QueryParserBase implements QueryParserConstants
     finally { jj_save(2, xla); }
   }
 
+  private boolean jj_3R_3() {
+    if (jj_scan_token(TERM)) return true;
+    jj_lookingAhead = true;
+    jj_semLA = getToken(1).kind == TERM && allowedPostMultiTerm(getToken(2).kind);
+    jj_lookingAhead = false;
+    if (!jj_semLA || jj_3R_6()) return true;
+    Token xsp;
+    if (jj_3R_7()) return true;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_3R_7()) { jj_scanpos = xsp; break; }
+    }
+    return false;
+  }
+
+  private boolean jj_3R_6() {
+    return false;
+  }
+
+  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() {
     if (jj_scan_token(TERM)) return true;
     if (jj_scan_token(COLON)) return true;
@@ -666,31 +719,6 @@ public class QueryParser extends QueryParserBase implements QueryParserConstants
     return false;
   }
 
-  private boolean jj_3R_3() {
-    if (jj_scan_token(TERM)) return true;
-    jj_lookingAhead = true;
-    jj_semLA = getToken(1).kind == TERM && allowedPostMultiTerm(getToken(2).kind);
-    jj_lookingAhead = false;
-    if (!jj_semLA || jj_3R_6()) return true;
-    Token xsp;
-    if (jj_3R_7()) return true;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_7()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_6() {
-    return false;
-  }
-
-  private boolean jj_3R_5() {
-    if (jj_scan_token(STAR)) return true;
-    if (jj_scan_token(COLON)) return true;
-    return false;
-  }
-
   /** Generated Token Manager. */
   public QueryParserTokenManager token_source;
   /** Current token. */

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/8938c9f3/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/QueryParser.jj
----------------------------------------------------------------------
diff --git a/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/QueryParser.jj b/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/QueryParser.jj
index ea18588..35cbe1a 100644
--- a/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/QueryParser.jj
+++ b/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/QueryParser.jj
@@ -121,6 +121,27 @@ public class QueryParser extends QueryParserBase {
   }
 
   /**
+   * Set to true if phrase queries will be automatically generated
+   * when the analyzer returns more than one term from whitespace
+   * delimited text.
+   * NOTE: this behavior may not be suitable for all languages.
+   * <p>
+   * Set to false if phrase queries should only be generated when
+   * surrounded by double quotes.
+   * <p>
+   * The combination splitOnWhitespace=false and autoGeneratePhraseQueries=true
+   * is disallowed.  See <a href="https://issues.apache.org/jira/browse/LUCENE-7533">LUCENE-7533</a>.
+   */
+  @Override
+  public void setAutoGeneratePhraseQueries(boolean value) {
+    if (splitOnWhitespace == false && value == true) {
+      throw new IllegalArgumentException
+          ("setAutoGeneratePhraseQueries(true) is disallowed when getSplitOnWhitespace() == false");
+    }
+    this.autoGeneratePhraseQueries = value;
+  }
+
+  /**
    * @see #setSplitOnWhitespace(boolean)
    */
   public boolean getSplitOnWhitespace() {
@@ -130,8 +151,15 @@ public class QueryParser extends QueryParserBase {
   /**
    * Whether query text should be split on whitespace prior to analysis.
    * Default is <code>{@value #DEFAULT_SPLIT_ON_WHITESPACE}</code>.
+   * <p>
+   * The combination splitOnWhitespace=false and autoGeneratePhraseQueries=true
+   * is disallowed.  See <a href="https://issues.apache.org/jira/browse/LUCENE-7533">LUCENE-7533</a>.
    */
   public void setSplitOnWhitespace(boolean splitOnWhitespace) {
+    if (splitOnWhitespace == false && getAutoGeneratePhraseQueries() == true) {
+      throw new IllegalArgumentException
+          ("setSplitOnWhitespace(false) is disallowed when getAutoGeneratePhraseQueries() == true");
+    }
     this.splitOnWhitespace = splitOnWhitespace;
   }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/8938c9f3/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/QueryParserBase.java
----------------------------------------------------------------------
diff --git a/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/QueryParserBase.java b/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/QueryParserBase.java
index fbe08a9..41d3764 100644
--- a/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/QueryParserBase.java
+++ b/lucene/queryparser/src/java/org/apache/lucene/queryparser/classic/QueryParserBase.java
@@ -144,7 +144,7 @@ public abstract class QueryParserBase extends QueryBuilder implements CommonQuer
    * Set to false if phrase queries should only be generated when
    * surrounded by double quotes.
    */
-  public final void setAutoGeneratePhraseQueries(boolean value) {
+  public void setAutoGeneratePhraseQueries(boolean value) {
     this.autoGeneratePhraseQueries = value;
   }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/8938c9f3/lucene/queryparser/src/test/org/apache/lucene/queryparser/classic/TestQueryParser.java
----------------------------------------------------------------------
diff --git a/lucene/queryparser/src/test/org/apache/lucene/queryparser/classic/TestQueryParser.java b/lucene/queryparser/src/test/org/apache/lucene/queryparser/classic/TestQueryParser.java
index de90e29..bb97624 100644
--- a/lucene/queryparser/src/test/org/apache/lucene/queryparser/classic/TestQueryParser.java
+++ b/lucene/queryparser/src/test/org/apache/lucene/queryparser/classic/TestQueryParser.java
@@ -840,6 +840,20 @@ public class TestQueryParser extends QueryParserTestBase {
     assertTrue(isAHit(qp.parse("\u0e40??"), s, analyzer));
   }
    
+  // LUCENE-7533
+  public void test_splitOnWhitespace_with_autoGeneratePhraseQueries() {
+    final QueryParser qp = new QueryParser(FIELD, new MockAnalyzer(random()));
+    expectThrows(IllegalArgumentException.class, () -> {
+      qp.setSplitOnWhitespace(false);
+      qp.setAutoGeneratePhraseQueries(true);
+    });
+    final QueryParser qp2 = new QueryParser(FIELD, new MockAnalyzer(random()));
+    expectThrows(IllegalArgumentException.class, () -> {
+      qp2.setSplitOnWhitespace(true);
+      qp2.setAutoGeneratePhraseQueries(true);
+      qp2.setSplitOnWhitespace(false);
+    });
+  }
   
   private boolean isAHit(Query q, String content, Analyzer analyzer) throws IOException{
     Directory ramDir = newDirectory();

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/8938c9f3/lucene/queryparser/src/test/org/apache/lucene/queryparser/util/QueryParserTestBase.java
----------------------------------------------------------------------
diff --git a/lucene/queryparser/src/test/org/apache/lucene/queryparser/util/QueryParserTestBase.java b/lucene/queryparser/src/test/org/apache/lucene/queryparser/util/QueryParserTestBase.java
index 2170193..0041106 100644
--- a/lucene/queryparser/src/test/org/apache/lucene/queryparser/util/QueryParserTestBase.java
+++ b/lucene/queryparser/src/test/org/apache/lucene/queryparser/util/QueryParserTestBase.java
@@ -38,6 +38,7 @@ import org.apache.lucene.index.Term;
 //import org.apache.lucene.queryparser.classic.ParseException;
 //import org.apache.lucene.queryparser.classic.QueryParser;
 //import org.apache.lucene.queryparser.classic.QueryParserBase;
+import org.apache.lucene.queryparser.classic.QueryParser;
 import org.apache.lucene.queryparser.classic.QueryParserBase;
 //import org.apache.lucene.queryparser.classic.QueryParserTokenManager;
 import org.apache.lucene.queryparser.flexible.standard.CommonQueryParserConfiguration;
@@ -328,6 +329,9 @@ public abstract class QueryParserTestBase extends LuceneTestCase {
   
     PhraseQuery expected = new PhraseQuery("field", "\u4e2d", "\u56fd");
     CommonQueryParserConfiguration qp = getParserConfig(analyzer);
+    if (qp instanceof QueryParser) { // Always true, since TestStandardQP overrides this method
+      ((QueryParser)qp).setSplitOnWhitespace(true); // LUCENE-7533
+    }
     setAutoGeneratePhraseQueries(qp, true);
     assertEquals(expected, getQuery("\u4e2d\u56fd",qp));
   }