You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ab...@apache.org on 2017/01/02 10:18:28 UTC

[07/19] lucene-solr:jira/solr-9854: SOLR-9900: fix false positives on range queries with ReversedWildcardFilterFactory

SOLR-9900: fix false positives on range queries with ReversedWildcardFilterFactory


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

Branch: refs/heads/jira/solr-9854
Commit: 5d042d3a49dfcf654b8bf8a96521d5404bfd3a7b
Parents: 6b00ee5
Author: Mikhail Khludnev <mk...@apache.org>
Authored: Fri Dec 30 00:42:51 2016 +0300
Committer: Mikhail Khludnev <mk...@apache.org>
Committed: Fri Dec 30 00:43:29 2016 +0300

----------------------------------------------------------------------
 solr/CHANGES.txt                                      |  2 ++
 .../org/apache/solr/parser/SolrQueryParserBase.java   | 14 ++++++++++++++
 .../analysis/TestReversedWildcardFilterFactory.java   | 12 ++++++++++++
 3 files changed, 28 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5d042d3a/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index b509e23..7f83de0 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -298,6 +298,8 @@ Bug Fixes
 
 * SOLR-9901: Implement move in HdfsDirectoryFactory. (Mark Miller)
 
+* SOLR-9900: fix false positives on range queries with ReversedWildcardFilterFactory (Yonik Seeley via Mikhail Khludnev)
+
 Other Changes
 ----------------------
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5d042d3a/solr/core/src/java/org/apache/solr/parser/SolrQueryParserBase.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/parser/SolrQueryParserBase.java b/solr/core/src/java/org/apache/solr/parser/SolrQueryParserBase.java
index 168bd49..f54e9e9 100644
--- a/solr/core/src/java/org/apache/solr/parser/SolrQueryParserBase.java
+++ b/solr/core/src/java/org/apache/solr/parser/SolrQueryParserBase.java
@@ -24,6 +24,7 @@ import java.util.List;
 import java.util.Map;
 
 import org.apache.lucene.analysis.Analyzer;
+import org.apache.lucene.analysis.reverse.ReverseStringFilter;
 import org.apache.lucene.analysis.util.TokenFilterFactory;
 import org.apache.lucene.index.Term;
 import org.apache.lucene.search.AutomatonQuery;
@@ -894,6 +895,19 @@ public abstract class SolrQueryParserBase extends QueryBuilder {
   protected Query getRangeQuery(String field, String part1, String part2, boolean startInclusive, boolean endInclusive) throws SyntaxError {
     checkNullField(field);
     SchemaField sf = schema.getField(field);
+
+    if (part1 == null) {
+      ReversedWildcardFilterFactory factory = getReversedWildcardFilterFactory(sf.getType());
+      if (factory != null) {
+        // There will be reversed tokens starting with u0001 that we want to exclude, so
+        // lets start at u0002 inclusive instead.
+        char[] buf = new char[1];
+        buf[0] = ReverseStringFilter.START_OF_HEADING_MARKER + 1;
+        part1 = new String(buf);
+        startInclusive = true;
+      }
+    }
+
     return sf.getType().getRangeQuery(parser, sf, part1, part2, startInclusive, endInclusive);
   }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5d042d3a/solr/core/src/test/org/apache/solr/analysis/TestReversedWildcardFilterFactory.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/analysis/TestReversedWildcardFilterFactory.java b/solr/core/src/test/org/apache/solr/analysis/TestReversedWildcardFilterFactory.java
index 3ccc352..f7a49ac 100644
--- a/solr/core/src/test/org/apache/solr/analysis/TestReversedWildcardFilterFactory.java
+++ b/solr/core/src/test/org/apache/solr/analysis/TestReversedWildcardFilterFactory.java
@@ -182,6 +182,18 @@ public class TestReversedWildcardFilterFactory extends SolrTestCaseJ4 {
     assertQ("false positive",
         req("+id:1 +one:*zemog*"),
         "//result[@numFound=0]");
+    
+    assertQ("no reverse, no false positive",
+        req("q", "+id:1 +three:[* TO a]", 
+            "debugQuery", "true"),
+        "//result[@numFound=0]");
+    {
+      String reverseField = random().nextBoolean() ? "one":"two";
+      assertQ("false positive",
+          req("q", "+id:1 +"+reverseField+":[* TO a]", 
+              "debugQuery", "true"),
+          "//result[@numFound=0]");
+    }
     assertQ("false positive",
         req("+id:1 +two:*zemog*"),
         "//result[@numFound=0]");