You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by mk...@apache.org on 2016/12/20 21:50:56 UTC

lucene-solr:branch_6x: SOLR-9878: fix ReversedWildcardFilterFactory caching in query parser

Repository: lucene-solr
Updated Branches:
  refs/heads/branch_6x b45293313 -> 1e22dd25b


SOLR-9878: fix ReversedWildcardFilterFactory caching in query parser


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

Branch: refs/heads/branch_6x
Commit: 1e22dd25bf20844c71648c39028c48d2a9aa4e58
Parents: b452933
Author: Mikhail Khludnev <mk...@apache.org>
Authored: Wed Dec 21 00:01:27 2016 +0300
Committer: Mikhail Khludnev <mk...@apache.org>
Committed: Wed Dec 21 00:50:34 2016 +0300

----------------------------------------------------------------------
 solr/CHANGES.txt                                |  2 +
 .../apache/solr/parser/SolrQueryParserBase.java |  2 +-
 .../TestReversedWildcardFilterFactory.java      | 44 +++++++++++++++++++-
 3 files changed, 46 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/1e22dd25/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 9b58f8b..d2cb56c 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -252,6 +252,8 @@ Other Changes
 
 * SOLR-9874: Solr will reject CREATEALIAS requests if target collections don't exist (Tom�s Fern�ndez L�bbe)
 
+* SOLR-9878: fixing lazy logic for retrieving ReversedWildcardFilterFactory in SolrQueryParserBase (Mikhail Khludnev)
+
 ==================  6.3.0 ==================
 
 Consult the LUCENE_CHANGES.txt file for additional, low level, changes in this release.

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/1e22dd25/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 0f6c7ac..168bd49 100644
--- a/solr/core/src/java/org/apache/solr/parser/SolrQueryParserBase.java
+++ b/solr/core/src/java/org/apache/solr/parser/SolrQueryParserBase.java
@@ -787,7 +787,7 @@ public abstract class SolrQueryParserBase extends QueryBuilder {
   protected ReversedWildcardFilterFactory getReversedWildcardFilterFactory(FieldType fieldType) {
     if (leadingWildcards == null) leadingWildcards = new HashMap<>();
     ReversedWildcardFilterFactory fac = leadingWildcards.get(fieldType);
-    if (fac != null || leadingWildcards.containsKey(fac)) {
+    if (fac != null || leadingWildcards.containsKey(fieldType)) {
       return fac;
     }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/1e22dd25/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 269a2c5..3ccc352 100644
--- a/solr/core/src/test/org/apache/solr/analysis/TestReversedWildcardFilterFactory.java
+++ b/solr/core/src/test/org/apache/solr/analysis/TestReversedWildcardFilterFactory.java
@@ -15,6 +15,11 @@
  * limitations under the License.
  */
 package org.apache.solr.analysis;
+import static org.apache.lucene.analysis.BaseTokenStreamTestCase.assertTokenStreamContents;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
 import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
@@ -26,18 +31,23 @@ import org.apache.lucene.search.Query;
 import org.apache.lucene.util.automaton.Automaton;
 import org.apache.lucene.util.automaton.Operations;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.parser.CharStream;
+import org.apache.solr.parser.ParseException;
+import org.apache.solr.parser.SolrQueryParserBase;
 import org.apache.solr.request.SolrQueryRequest;
+import org.apache.solr.schema.FieldType;
 import org.apache.solr.schema.IndexSchema;
 import org.apache.solr.schema.IndexSchemaFactory;
 import org.apache.solr.search.QParser;
 import org.apache.solr.search.SolrQueryParser;
+import org.apache.solr.search.SyntaxError;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import static org.apache.lucene.analysis.BaseTokenStreamTestCase.*;
 
 public class TestReversedWildcardFilterFactory extends SolrTestCaseJ4 {
+
   Map<String,String> args = new HashMap<>();
   IndexSchema schema;
 
@@ -183,4 +193,36 @@ public class TestReversedWildcardFilterFactory extends SolrTestCaseJ4 {
         req("+id:1 +one:*omez*"),
         "//result[@numFound=1]");
   }
+  
+  private static final class SolrQParser extends SolrQueryParserBase {
+    @Override
+    public Query TopLevelQuery(String field) throws ParseException, SyntaxError {
+      return null;
+    }
+
+    @Override
+    public void ReInit(CharStream stream) {}
+
+    @Override
+    protected ReversedWildcardFilterFactory getReversedWildcardFilterFactory(FieldType fieldType) {
+      return super.getReversedWildcardFilterFactory(fieldType);
+    }
+  }
+  
+  @Test 
+  public void testCachingInQueryParser() {
+    SolrQParser parser = new SolrQParser();
+    
+    SolrQueryRequest req = req();
+    String[] fields = new String[]{"one", "two", "three"};
+    String aField = fields[random().nextInt(fields.length)];
+    FieldType type = req.getSchema().getField(aField).getType();
+    
+    FieldType typeSpy = spy(type);
+    // calling twice 
+    parser.getReversedWildcardFilterFactory(typeSpy);
+    parser.getReversedWildcardFilterFactory(typeSpy);
+    // but it should reach only once 
+    verify(typeSpy, times(1)).getIndexAnalyzer();
+  }
 }