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));
}