You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ho...@apache.org on 2012/03/28 01:40:54 UTC
svn commit: r1306059 - in /lucene/dev/branches/branch_3x: ./ lucene/
lucene/core/src/ lucene/core/src/test/org/apache/lucene/analysis/ solr/
solr/core/src/java/org/apache/solr/search/
solr/core/src/test/org/apache/solr/search/
Author: hossman
Date: Tue Mar 27 23:40:54 2012
New Revision: 1306059
URL: http://svn.apache.org/viewvc?rev=1306059&view=rev
Log:
SOLR-3261: Fix edismax to respect query operators when literal colons are used in query string (merge r1306054)
Modified:
lucene/dev/branches/branch_3x/ (props changed)
lucene/dev/branches/branch_3x/lucene/ (props changed)
lucene/dev/branches/branch_3x/lucene/core/src/ (props changed)
lucene/dev/branches/branch_3x/lucene/core/src/test/org/apache/lucene/analysis/ (props changed)
lucene/dev/branches/branch_3x/solr/ (props changed)
lucene/dev/branches/branch_3x/solr/CHANGES.txt
lucene/dev/branches/branch_3x/solr/core/src/java/org/apache/solr/search/ExtendedDismaxQParserPlugin.java
lucene/dev/branches/branch_3x/solr/core/src/test/org/apache/solr/search/TestExtendedDismaxParser.java
Modified: lucene/dev/branches/branch_3x/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/solr/CHANGES.txt?rev=1306059&r1=1306058&r2=1306059&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/solr/CHANGES.txt (original)
+++ lucene/dev/branches/branch_3x/solr/CHANGES.txt Tue Mar 27 23:40:54 2012
@@ -297,6 +297,9 @@ Bug Fixes
* SOLR-3046: Fix whitespace typo in DIH response "Time taken" (hossman)
+* SOLR-3261: Fix edismax to respect query operators when literal colons
+ are used in query string. (Juan Grande via hossman)
+
Other Changes
----------------------
* SOLR-2922: Upgrade commons-io and commons-lang to 2.1 and 2.6, respectively. (koji)
Modified: lucene/dev/branches/branch_3x/solr/core/src/java/org/apache/solr/search/ExtendedDismaxQParserPlugin.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/solr/core/src/java/org/apache/solr/search/ExtendedDismaxQParserPlugin.java?rev=1306059&r1=1306058&r2=1306059&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/solr/core/src/java/org/apache/solr/search/ExtendedDismaxQParserPlugin.java (original)
+++ lucene/dev/branches/branch_3x/solr/core/src/java/org/apache/solr/search/ExtendedDismaxQParserPlugin.java Tue Mar 27 23:40:54 2012
@@ -629,14 +629,17 @@ class ExtendedDismaxQParser extends QPar
public List<Clause> splitIntoClauses(String s, boolean ignoreQuote) {
ArrayList<Clause> lst = new ArrayList<Clause>(4);
- Clause clause = new Clause();
+ Clause clause;
int pos=0;
int end=s.length();
char ch=0;
int start;
- boolean disallowUserField = false;
+ boolean disallowUserField;
outer: while (pos < end) {
+ clause = new Clause();
+ disallowUserField = true;
+
ch = s.charAt(pos);
while (Character.isWhitespace(ch)) {
@@ -653,10 +656,10 @@ class ExtendedDismaxQParser extends QPar
clause.field = getFieldName(s, pos, end);
if(clause.field != null && !userFields.isAllowed(clause.field)) {
- disallowUserField = true;
clause.field = null;
}
if (clause.field != null) {
+ disallowUserField = false;
pos += clause.field.length(); // skip the field name
pos++; // skip the ':'
}
@@ -752,7 +755,11 @@ class ExtendedDismaxQParser extends QPar
if (clause != null) {
if(disallowUserField) {
- clause.raw = clause.val;
+ clause.raw = s.substring(start, pos);
+ // escape colons, except for "match all" query
+ if(!"*:*".equals(clause.raw)) {
+ clause.raw = clause.raw.replaceAll(":", "\\\\:");
+ }
} else {
clause.raw = s.substring(start, pos);
// Add default userField boost if no explicit boost exists
@@ -764,8 +771,6 @@ class ExtendedDismaxQParser extends QPar
}
lst.add(clause);
}
- clause = new Clause();
- disallowUserField = false;
}
return lst;
Modified: lucene/dev/branches/branch_3x/solr/core/src/test/org/apache/solr/search/TestExtendedDismaxParser.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/solr/core/src/test/org/apache/solr/search/TestExtendedDismaxParser.java?rev=1306059&r1=1306058&r2=1306059&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/solr/core/src/test/org/apache/solr/search/TestExtendedDismaxParser.java (original)
+++ lucene/dev/branches/branch_3x/solr/core/src/test/org/apache/solr/search/TestExtendedDismaxParser.java Tue Mar 27 23:40:54 2012
@@ -435,5 +435,70 @@ public class TestExtendedDismaxParser ex
assertTrue(e.getCause().getMessage().contains("Field aliases lead to a cycle"));
}
}
-
+
+ public void testOperatorsWithLiteralColons() {
+ assertU(adoc("id", "142", "a_s", "bogus:xxx", "text_s", "yak"));
+ assertU(adoc("id", "143", "a_s", "bogus:xxx"));
+ assertU(adoc("id", "144", "text_s", "yak"));
+ assertU(adoc("id", "145", "a_s", "a_s:xxx", "text_s", "yak"));
+ assertU(adoc("id", "146", "a_s", "a_s:xxx"));
+ assertU(adoc("id", "147", "a_s", "AND", "a_s", "NOT"));
+ assertU(commit());
+
+ assertQ(req("q", "bogus:xxx AND text_s:yak",
+ "fl", "id",
+ "qf", "a_s b_s",
+ "defType", "edismax",
+ "mm", "0"),
+ "//*[@numFound='1']",
+ "//str[@name='id'][.='142']");
+
+ assertQ(req("q", "a_s:xxx AND text_s:yak",
+ "fl", "id",
+ "qf", "a_s b_s",
+ "defType", "edismax",
+ "mm", "0",
+ "uf", "text_s"),
+ "//*[@numFound='1']",
+ "//str[@name='id'][.='145']");
+
+ assertQ(req("q", "NOT bogus:xxx +text_s:yak",
+ "fl", "id",
+ "qf", "a_s b_s",
+ "defType", "edismax",
+ "mm", "0",
+ "debugQuery", "true"),
+ "//*[@numFound='2']",
+ "//str[@name='id'][.='144']",
+ "//str[@name='id'][.='145']");
+
+ assertQ(req("q", "NOT a_s:xxx +text_s:yak",
+ "fl", "id",
+ "qf", "a_s b_s",
+ "defType", "edismax",
+ "mm", "0",
+ "uf", "text_s"),
+ "//*[@numFound='2']",
+ "//str[@name='id'][.='142']",
+ "//str[@name='id'][.='144']");
+
+ assertQ(req("q", "+bogus:xxx yak",
+ "fl", "id",
+ "qf", "a_s b_s text_s",
+ "defType", "edismax",
+ "mm", "0"),
+ "//*[@numFound='2']",
+ "//str[@name='id'][.='142']",
+ "//str[@name='id'][.='143']");
+
+ assertQ(req("q", "+a_s:xxx yak",
+ "fl", "id",
+ "qf", "a_s b_s text_s",
+ "defType", "edismax",
+ "mm", "0",
+ "uf", "b_s"),
+ "//*[@numFound='2']",
+ "//str[@name='id'][.='145']",
+ "//str[@name='id'][.='146']");
+ }
}