You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by jp...@apache.org on 2015/07/01 18:34:45 UTC

svn commit: r1688682 - in /lucene/dev/trunk/lucene: ./ suggest/src/java/org/apache/lucene/search/suggest/ suggest/src/java/org/apache/lucene/search/suggest/document/ suggest/src/test/org/apache/lucene/search/suggest/document/

Author: jpountz
Date: Wed Jul  1 16:34:44 2015
New Revision: 1688682

URL: http://svn.apache.org/r1688682
Log:
LUCENE-6640: Use BitsProducer instead of Filter in lucene/suggest.

Added:
    lucene/dev/trunk/lucene/suggest/src/java/org/apache/lucene/search/suggest/BitsProducer.java   (with props)
Modified:
    lucene/dev/trunk/lucene/CHANGES.txt
    lucene/dev/trunk/lucene/suggest/src/java/org/apache/lucene/search/suggest/document/CompletionQuery.java
    lucene/dev/trunk/lucene/suggest/src/java/org/apache/lucene/search/suggest/document/CompletionWeight.java
    lucene/dev/trunk/lucene/suggest/src/java/org/apache/lucene/search/suggest/document/FuzzyCompletionQuery.java
    lucene/dev/trunk/lucene/suggest/src/java/org/apache/lucene/search/suggest/document/PrefixCompletionQuery.java
    lucene/dev/trunk/lucene/suggest/src/java/org/apache/lucene/search/suggest/document/RegexCompletionQuery.java
    lucene/dev/trunk/lucene/suggest/src/test/org/apache/lucene/search/suggest/document/TestPrefixCompletionQuery.java
    lucene/dev/trunk/lucene/suggest/src/test/org/apache/lucene/search/suggest/document/TestSuggestField.java

Modified: lucene/dev/trunk/lucene/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/CHANGES.txt?rev=1688682&r1=1688681&r2=1688682&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/CHANGES.txt (original)
+++ lucene/dev/trunk/lucene/CHANGES.txt Wed Jul  1 16:34:44 2015
@@ -164,6 +164,10 @@ API Changes
 * LUCENE-6648: All lucene/facet APIs now take Query objects where they used to
   take Filter objects. (Adrien Grand)
 
+* LUCENE-6640: Suggesters now take a BitsProducer object instead of a Filter
+  object to reduce the scope of doc IDs that may be returned, emphasizing the
+  fact that these objects need to support random-access. (Adrien Grand)
+
 Bug fixes
 
 * LUCENE-6500: ParallelCompositeReader did not always call

Added: lucene/dev/trunk/lucene/suggest/src/java/org/apache/lucene/search/suggest/BitsProducer.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/suggest/src/java/org/apache/lucene/search/suggest/BitsProducer.java?rev=1688682&view=auto
==============================================================================
--- lucene/dev/trunk/lucene/suggest/src/java/org/apache/lucene/search/suggest/BitsProducer.java (added)
+++ lucene/dev/trunk/lucene/suggest/src/java/org/apache/lucene/search/suggest/BitsProducer.java Wed Jul  1 16:34:44 2015
@@ -0,0 +1,34 @@
+package org.apache.lucene.search.suggest;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.io.IOException;
+
+import org.apache.lucene.index.LeafReader;
+import org.apache.lucene.index.LeafReaderContext;
+import org.apache.lucene.util.Bits;
+
+/** A producer of {@link Bits} per segment. */
+public abstract class BitsProducer {
+
+  /** Return {@link Bits} for the given leaf. The returned instance must
+   *  be non-null and have a {@link Bits#length() length} equal to
+   *  {@link LeafReader#maxDoc() maxDoc}. */
+  public abstract Bits getBits(LeafReaderContext context) throws IOException;
+
+}

Modified: lucene/dev/trunk/lucene/suggest/src/java/org/apache/lucene/search/suggest/document/CompletionQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/suggest/src/java/org/apache/lucene/search/suggest/document/CompletionQuery.java?rev=1688682&r1=1688681&r2=1688682&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/suggest/src/java/org/apache/lucene/search/suggest/document/CompletionQuery.java (original)
+++ lucene/dev/trunk/lucene/suggest/src/java/org/apache/lucene/search/suggest/document/CompletionQuery.java Wed Jul  1 16:34:44 2015
@@ -24,15 +24,15 @@ import org.apache.lucene.index.LeafReade
 import org.apache.lucene.index.LeafReaderContext;
 import org.apache.lucene.index.Term;
 import org.apache.lucene.index.Terms;
-import org.apache.lucene.search.Filter;
 import org.apache.lucene.search.Query;
+import org.apache.lucene.search.suggest.BitsProducer;
 
 import static org.apache.lucene.search.suggest.document.CompletionAnalyzer.HOLE_CHARACTER;
 import static org.apache.lucene.search.suggest.document.CompletionAnalyzer.SEP_LABEL;
 
 /**
  * Abstract {@link Query} that match documents containing terms with a specified prefix
- * filtered by {@link Filter}. This should be used to query against any {@link SuggestField}s
+ * filtered by {@link BitsProducer}. This should be used to query against any {@link SuggestField}s
  * or {@link ContextSuggestField}s of documents.
  * <p>
  * Use {@link SuggestIndexSearcher#suggest(CompletionQuery, int)} to execute any query
@@ -56,25 +56,25 @@ public abstract class CompletionQuery ex
   private final Term term;
 
   /**
-   * Filter for document scoping
+   * {@link BitsProducer} which is used to filter the document scope.
    */
-  private final Filter filter;
+  private final BitsProducer filter;
 
   /**
    * Creates a base Completion query against a <code>term</code>
    * with a <code>filter</code> to scope the documents
    */
-  protected CompletionQuery(Term term, Filter filter) {
+  protected CompletionQuery(Term term, BitsProducer filter) {
     validate(term.text());
     this.term = term;
     this.filter = filter;
   }
 
   /**
-   * Returns the filter for the query, used to
-   * suggest completions on a subset of indexed documents
+   * Returns a {@link BitsProducer}. Only suggestions matching the returned
+   * bits will be returned.
    */
-  public Filter getFilter() {
+  public BitsProducer getFilter() {
     return filter;
   }
 
@@ -148,7 +148,7 @@ public abstract class CompletionQuery ex
       buffer.append(",");
       buffer.append("filter");
       buffer.append(":");
-      buffer.append(filter.toString(field));
+      buffer.append(filter.toString());
     }
     return buffer.toString();
   }

Modified: lucene/dev/trunk/lucene/suggest/src/java/org/apache/lucene/search/suggest/document/CompletionWeight.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/suggest/src/java/org/apache/lucene/search/suggest/document/CompletionWeight.java?rev=1688682&r1=1688681&r2=1688682&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/suggest/src/java/org/apache/lucene/search/suggest/document/CompletionWeight.java (original)
+++ lucene/dev/trunk/lucene/suggest/src/java/org/apache/lucene/search/suggest/document/CompletionWeight.java Wed Jul  1 16:34:44 2015
@@ -25,11 +25,10 @@ import org.apache.lucene.index.LeafReade
 import org.apache.lucene.index.Term;
 import org.apache.lucene.index.Terms;
 import org.apache.lucene.search.BulkScorer;
-import org.apache.lucene.search.DocIdSet;
 import org.apache.lucene.search.Explanation;
-import org.apache.lucene.search.Filter;
 import org.apache.lucene.search.Scorer;
 import org.apache.lucene.search.Weight;
+import org.apache.lucene.search.suggest.BitsProducer;
 import org.apache.lucene.util.Bits;
 import org.apache.lucene.util.IntsRef;
 import org.apache.lucene.util.automaton.Automaton;
@@ -88,19 +87,15 @@ public class CompletionWeight extends We
       throw new IllegalArgumentException(completionQuery.getField() + " is not a SuggestField");
     }
 
-    DocIdSet docIdSet = null;
-    Filter filter = completionQuery.getFilter();
+    BitsProducer filter = completionQuery.getFilter();
+    Bits filteredDocs = null;
     if (filter != null) {
-      docIdSet = filter.getDocIdSet(context, null);
-      if (docIdSet == null || docIdSet.iterator() == null) {
-        // filter matches no docs in current leave
+      filteredDocs = filter.getBits(context);
+      if (filteredDocs.getClass() == Bits.MatchNoBits.class) {
         return null;
-      } else if (docIdSet.bits() == null) {
-        throw new IllegalArgumentException("DocIDSet does not provide random access interface");
       }
     }
-    Bits acceptDocBits = (docIdSet != null) ? docIdSet.bits() : null;
-    return new CompletionScorer(this, suggester, reader, acceptDocBits, filter != null, automaton);
+    return new CompletionScorer(this, suggester, reader, filteredDocs, filter != null, automaton);
   }
 
   /**

Modified: lucene/dev/trunk/lucene/suggest/src/java/org/apache/lucene/search/suggest/document/FuzzyCompletionQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/suggest/src/java/org/apache/lucene/search/suggest/document/FuzzyCompletionQuery.java?rev=1688682&r1=1688681&r2=1688682&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/suggest/src/java/org/apache/lucene/search/suggest/document/FuzzyCompletionQuery.java (original)
+++ lucene/dev/trunk/lucene/suggest/src/java/org/apache/lucene/search/suggest/document/FuzzyCompletionQuery.java Wed Jul  1 16:34:44 2015
@@ -23,9 +23,9 @@ import java.util.Set;
 
 import org.apache.lucene.analysis.Analyzer;
 import org.apache.lucene.index.Term;
-import org.apache.lucene.search.Filter;
 import org.apache.lucene.search.IndexSearcher;
 import org.apache.lucene.search.Weight;
+import org.apache.lucene.search.suggest.BitsProducer;
 import org.apache.lucene.util.IntsRef;
 import org.apache.lucene.util.UnicodeUtil;
 import org.apache.lucene.util.automaton.Automata;
@@ -88,7 +88,7 @@ public class FuzzyCompletionQuery extend
   private final int maxDeterminizedStates;
 
   /**
-   * Calls {@link FuzzyCompletionQuery#FuzzyCompletionQuery(Analyzer, Term, Filter)}
+   * Calls {@link FuzzyCompletionQuery#FuzzyCompletionQuery(Analyzer, Term, BitsProducer)}
    * with no filter
    */
   public FuzzyCompletionQuery(Analyzer analyzer, Term term) {
@@ -96,7 +96,7 @@ public class FuzzyCompletionQuery extend
   }
 
   /**
-   * Calls {@link FuzzyCompletionQuery#FuzzyCompletionQuery(Analyzer, Term, Filter,
+   * Calls {@link FuzzyCompletionQuery#FuzzyCompletionQuery(Analyzer, Term, BitsProducer,
    * int, boolean, int, int, boolean, int)}
    * with defaults for <code>maxEdits</code>, <code>transpositions</code>,
    * <code>nonFuzzyPrefix</code>, <code>minFuzzyLength</code>,
@@ -107,7 +107,7 @@ public class FuzzyCompletionQuery extend
    * {@link #DEFAULT_UNICODE_AWARE} and {@link Operations#DEFAULT_MAX_DETERMINIZED_STATES}
    * for defaults
    */
-  public FuzzyCompletionQuery(Analyzer analyzer, Term term, Filter filter) {
+  public FuzzyCompletionQuery(Analyzer analyzer, Term term, BitsProducer filter) {
     this(analyzer, term, filter, DEFAULT_MAX_EDITS, DEFAULT_TRANSPOSITIONS, DEFAULT_NON_FUZZY_PREFIX,
         DEFAULT_MIN_FUZZY_LENGTH, DEFAULT_UNICODE_AWARE, Operations.DEFAULT_MAX_DETERMINIZED_STATES
     );
@@ -127,7 +127,7 @@ public class FuzzyCompletionQuery extend
    * @param unicodeAware treat prefix as unicode rather than bytes
    * @param maxDeterminizedStates maximum automaton states allowed for {@link LevenshteinAutomata}
    */
-  public FuzzyCompletionQuery(Analyzer analyzer, Term term, Filter filter, int maxEdits,
+  public FuzzyCompletionQuery(Analyzer analyzer, Term term, BitsProducer filter, int maxEdits,
                               boolean transpositions, int nonFuzzyPrefix, int minFuzzyLength,
                               boolean unicodeAware, int maxDeterminizedStates) {
     super(analyzer, term, filter);
@@ -208,7 +208,7 @@ public class FuzzyCompletionQuery extend
     if (getFilter() != null) {
       buffer.append(",");
       buffer.append("filter");
-      buffer.append(getFilter().toString(field));
+      buffer.append(getFilter().toString());
     }
     return buffer.toString();
   }

Modified: lucene/dev/trunk/lucene/suggest/src/java/org/apache/lucene/search/suggest/document/PrefixCompletionQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/suggest/src/java/org/apache/lucene/search/suggest/document/PrefixCompletionQuery.java?rev=1688682&r1=1688681&r2=1688682&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/suggest/src/java/org/apache/lucene/search/suggest/document/PrefixCompletionQuery.java (original)
+++ lucene/dev/trunk/lucene/suggest/src/java/org/apache/lucene/search/suggest/document/PrefixCompletionQuery.java Wed Jul  1 16:34:44 2015
@@ -21,9 +21,9 @@ import java.io.IOException;
 
 import org.apache.lucene.analysis.Analyzer;
 import org.apache.lucene.index.Term;
-import org.apache.lucene.search.Filter;
 import org.apache.lucene.search.IndexSearcher;
 import org.apache.lucene.search.Weight;
+import org.apache.lucene.search.suggest.BitsProducer;
 
 /**
  * A {@link CompletionQuery} which takes an {@link Analyzer}
@@ -42,7 +42,7 @@ public class PrefixCompletionQuery exten
   protected final CompletionAnalyzer analyzer;
 
   /**
-   * Calls {@link PrefixCompletionQuery#PrefixCompletionQuery(Analyzer, Term, Filter)}
+   * Calls {@link PrefixCompletionQuery#PrefixCompletionQuery(Analyzer, Term, BitsProducer)}
    * with no filter
    */
   public PrefixCompletionQuery(Analyzer analyzer, Term term) {
@@ -57,7 +57,7 @@ public class PrefixCompletionQuery exten
    *             is analyzed with <code>analyzer</code>
    * @param filter used to query on a sub set of documents
    */
-  public PrefixCompletionQuery(Analyzer analyzer, Term term, Filter filter) {
+  public PrefixCompletionQuery(Analyzer analyzer, Term term, BitsProducer filter) {
     super(term, filter);
     if (!(analyzer instanceof CompletionAnalyzer)) {
       this.analyzer = new CompletionAnalyzer(analyzer);

Modified: lucene/dev/trunk/lucene/suggest/src/java/org/apache/lucene/search/suggest/document/RegexCompletionQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/suggest/src/java/org/apache/lucene/search/suggest/document/RegexCompletionQuery.java?rev=1688682&r1=1688681&r2=1688682&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/suggest/src/java/org/apache/lucene/search/suggest/document/RegexCompletionQuery.java (original)
+++ lucene/dev/trunk/lucene/suggest/src/java/org/apache/lucene/search/suggest/document/RegexCompletionQuery.java Wed Jul  1 16:34:44 2015
@@ -20,9 +20,9 @@ package org.apache.lucene.search.suggest
 import java.io.IOException;
 
 import org.apache.lucene.index.Term;
-import org.apache.lucene.search.Filter;
 import org.apache.lucene.search.IndexSearcher;
 import org.apache.lucene.search.Weight;
+import org.apache.lucene.search.suggest.BitsProducer;
 import org.apache.lucene.util.automaton.Operations;
 import org.apache.lucene.util.automaton.RegExp;
 
@@ -50,7 +50,7 @@ public class RegexCompletionQuery extend
   private final int maxDeterminizedStates;
 
   /**
-   * Calls {@link RegexCompletionQuery#RegexCompletionQuery(Term, Filter)}
+   * Calls {@link RegexCompletionQuery#RegexCompletionQuery(Term, BitsProducer)}
    * with no filter
    */
   public RegexCompletionQuery(Term term) {
@@ -58,15 +58,15 @@ public class RegexCompletionQuery extend
   }
 
   /**
-   * Calls {@link RegexCompletionQuery#RegexCompletionQuery(Term, int, int, Filter)}
+   * Calls {@link RegexCompletionQuery#RegexCompletionQuery(Term, int, int, BitsProducer)}
    * enabling all optional regex syntax and <code>maxDeterminizedStates</code> of
    * {@value Operations#DEFAULT_MAX_DETERMINIZED_STATES}
    */
-  public RegexCompletionQuery(Term term, Filter filter) {
+  public RegexCompletionQuery(Term term, BitsProducer filter) {
     this(term, RegExp.ALL, Operations.DEFAULT_MAX_DETERMINIZED_STATES, filter);
   }
   /**
-   * Calls {@link RegexCompletionQuery#RegexCompletionQuery(Term, int, int, Filter)}
+   * Calls {@link RegexCompletionQuery#RegexCompletionQuery(Term, int, int, BitsProducer)}
    * with no filter
    */
   public RegexCompletionQuery(Term term, int flags, int maxDeterminizedStates) {
@@ -82,7 +82,7 @@ public class RegexCompletionQuery extend
    * @param maxDeterminizedStates used in {@link RegExp#toAutomaton(int)}
    * @param filter used to query on a sub set of documents
    */
-  public RegexCompletionQuery(Term term, int flags, int maxDeterminizedStates, Filter filter) {
+  public RegexCompletionQuery(Term term, int flags, int maxDeterminizedStates, BitsProducer filter) {
     super(term, filter);
     this.flags = flags;
     this.maxDeterminizedStates = maxDeterminizedStates;

Modified: lucene/dev/trunk/lucene/suggest/src/test/org/apache/lucene/search/suggest/document/TestPrefixCompletionQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/suggest/src/test/org/apache/lucene/search/suggest/document/TestPrefixCompletionQuery.java?rev=1688682&r1=1688681&r2=1688682&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/suggest/src/test/org/apache/lucene/search/suggest/document/TestPrefixCompletionQuery.java (original)
+++ lucene/dev/trunk/lucene/suggest/src/test/org/apache/lucene/search/suggest/document/TestPrefixCompletionQuery.java Wed Jul  1 16:34:44 2015
@@ -18,27 +18,23 @@ package org.apache.lucene.search.suggest
  */
 
 import java.io.IOException;
+import java.util.Objects;
 
 import org.apache.lucene.analysis.Analyzer;
 import org.apache.lucene.analysis.MockAnalyzer;
 import org.apache.lucene.analysis.MockTokenFilter;
 import org.apache.lucene.analysis.MockTokenizer;
 import org.apache.lucene.document.Document;
-import org.apache.lucene.document.Field;
-import org.apache.lucene.document.IntField;
+import org.apache.lucene.document.NumericDocValuesField;
 import org.apache.lucene.index.DirectoryReader;
+import org.apache.lucene.index.DocValues;
 import org.apache.lucene.index.LeafReaderContext;
 import org.apache.lucene.index.RandomIndexWriter;
+import org.apache.lucene.index.SortedNumericDocValues;
 import org.apache.lucene.index.Term;
-import org.apache.lucene.search.DocIdSet;
-import org.apache.lucene.search.DocIdSetIterator;
-import org.apache.lucene.search.Filter;
-import org.apache.lucene.search.NumericRangeQuery;
-import org.apache.lucene.search.QueryWrapperFilter;
+import org.apache.lucene.search.suggest.BitsProducer;
 import org.apache.lucene.store.Directory;
-import org.apache.lucene.util.BitDocIdSet;
 import org.apache.lucene.util.Bits;
-import org.apache.lucene.util.FixedBitSet;
 import org.apache.lucene.util.LuceneTestCase;
 import org.junit.After;
 import org.junit.Before;
@@ -50,6 +46,68 @@ import static org.apache.lucene.search.s
 import static org.hamcrest.core.IsEqual.equalTo;
 
 public class TestPrefixCompletionQuery extends LuceneTestCase {
+
+  private static class NumericRangeBitsProducer extends BitsProducer {
+
+    private final String field;
+    private final long min, max;
+
+    public NumericRangeBitsProducer(String field, long min, long max) {
+      this.field = field;
+      this.min = min;
+      this.max = max;
+    }
+
+    @Override
+    public String toString() {
+      return field + "[" + min + ".." + max + "]";
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+      if (obj == null || getClass() != obj.getClass()) {
+        return false;
+      }
+      NumericRangeBitsProducer that = (NumericRangeBitsProducer) obj;
+      return field.equals(that.field)
+          && min == that.min
+          && max == that.max;
+    }
+
+    @Override
+    public int hashCode() {
+      return Objects.hash(getClass(), field, min, max);
+    }
+
+    @Override
+    public Bits getBits(final LeafReaderContext context) throws IOException {
+      final int maxDoc = context.reader().maxDoc();
+      final SortedNumericDocValues values = DocValues.getSortedNumeric(context.reader(), field);
+      return new Bits() {
+
+        @Override
+        public boolean get(int doc) {
+          values.setDocument(doc);
+          final int count = values.count();
+          for (int i = 0; i < count; ++i) {
+            final long v = values.valueAt(i);
+            if (v >= min && v <= max) {
+              return true;
+            }
+          }
+          return false;
+        }
+
+        @Override
+        public int length() {
+          return maxDoc;
+        }
+        
+      };
+    }
+
+  }
+
   public Directory dir;
 
   @Before
@@ -99,7 +157,7 @@ public class TestPrefixCompletionQuery e
     for (int i = 0; i < num; i++) {
       Document document = new Document();
       document.add(new SuggestField("suggest_field", "abc_" + i, i));
-      document.add(new IntField("filter_int_fld", i, Field.Store.NO));
+      document.add(new NumericDocValuesField("filter_int_fld", i));
       iw.addDocument(document);
 
       if (usually()) {
@@ -111,8 +169,7 @@ public class TestPrefixCompletionQuery e
     SuggestIndexSearcher indexSearcher = new SuggestIndexSearcher(reader);
 
     int topScore = num/2;
-    QueryWrapperFilter filterWrapper = new QueryWrapperFilter(NumericRangeQuery.newIntRange("filter_int_fld", 0, topScore, true, true));
-    Filter filter = randomAccessFilter(filterWrapper);
+    BitsProducer filter = new NumericRangeBitsProducer("filter_int_fld", 0, topScore);
     PrefixCompletionQuery query = new PrefixCompletionQuery(analyzer, new Term("suggest_field", "abc_"), filter);
     // if at most half of the top scoring documents have been filtered out
     // the search should be admissible for a single segment
@@ -121,16 +178,14 @@ public class TestPrefixCompletionQuery e
     assertThat(suggest.scoreLookupDocs()[0].key.toString(), equalTo("abc_" + topScore));
     assertThat(suggest.scoreLookupDocs()[0].score, equalTo((float) topScore));
 
-    filterWrapper = new QueryWrapperFilter(NumericRangeQuery.newIntRange("filter_int_fld", 0, 0, true, true));
-    filter = randomAccessFilter(filterWrapper);
+    filter = new NumericRangeBitsProducer("filter_int_fld", 0, 0);
     query = new PrefixCompletionQuery(analyzer, new Term("suggest_field", "abc_"), filter);
     // if more than half of the top scoring documents have been filtered out
     // search is not admissible, so # of suggestions requested is num instead of 1
     suggest = indexSearcher.suggest(query, num);
     assertSuggestions(suggest, new Entry("abc_0", 0));
 
-    filterWrapper = new QueryWrapperFilter(NumericRangeQuery.newIntRange("filter_int_fld", num - 1, num - 1, true, true));
-    filter = randomAccessFilter(filterWrapper);
+    filter = new NumericRangeBitsProducer("filter_int_fld", num - 1, num - 1);
     query = new PrefixCompletionQuery(analyzer, new Term("suggest_field", "abc_"), filter);
     // if only lower scoring documents are filtered out
     // search is admissible
@@ -147,17 +202,17 @@ public class TestPrefixCompletionQuery e
     RandomIndexWriter iw = new RandomIndexWriter(random(), dir, iwcWithSuggestField(analyzer, "suggest_field"));
 
     Document document = new Document();
-    document.add(new IntField("filter_int_fld", 9, Field.Store.NO));
+    document.add(new NumericDocValuesField("filter_int_fld", 9));
     document.add(new SuggestField("suggest_field", "apples", 3));
     iw.addDocument(document);
 
     document = new Document();
-    document.add(new IntField("filter_int_fld", 10, Field.Store.NO));
+    document.add(new NumericDocValuesField("filter_int_fld", 10));
     document.add(new SuggestField("suggest_field", "applle", 4));
     iw.addDocument(document);
 
     document = new Document();
-    document.add(new IntField("filter_int_fld", 4, Field.Store.NO));
+    document.add(new NumericDocValuesField("filter_int_fld", 4));
     document.add(new SuggestField("suggest_field", "apple", 5));
     iw.addDocument(document);
 
@@ -174,8 +229,7 @@ public class TestPrefixCompletionQuery e
     assertSuggestions(suggest, new Entry("apple", 5), new Entry("applle", 4), new Entry("apples", 3));
 
     // suggest with filter
-    QueryWrapperFilter filterWrapper = new QueryWrapperFilter(NumericRangeQuery.newIntRange("filter_int_fld", 5, 12, true, true));
-    Filter filter = randomAccessFilter(filterWrapper);
+    BitsProducer filter = new NumericRangeBitsProducer("filter_int_fld", 5, 12);
     query = new PrefixCompletionQuery(analyzer, new Term("suggest_field", "app"), filter);
     suggest = indexSearcher.suggest(query, 3);
     assertSuggestions(suggest, new Entry("applle", 4), new Entry("apples", 3));
@@ -256,45 +310,4 @@ public class TestPrefixCompletionQuery e
     iw.close();
   }
 
-  private static class RandomAccessFilter extends Filter {
-    private final Filter in;
-
-    private RandomAccessFilter(Filter in) {
-      this.in = in;
-    }
-
-    @Override
-    public DocIdSet getDocIdSet(LeafReaderContext context, Bits acceptDocs) throws IOException {
-      DocIdSet docIdSet = in.getDocIdSet(context, acceptDocs);
-      DocIdSetIterator iterator = docIdSet.iterator();
-      FixedBitSet bits = new FixedBitSet(context.reader().maxDoc());
-      if (iterator != null) {
-        bits.or(iterator);
-      }
-      return new BitDocIdSet(bits);
-    }
-
-    @Override
-    public String toString(String field) {
-      return in.toString(field);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-      if (super.equals(obj) == false) {
-        return false;
-      }
-      return in.equals(((RandomAccessFilter) obj).in);
-    }
-
-    @Override
-    public int hashCode() {
-      return 31 * super.hashCode() + in.hashCode();
-    }
-  }
-
-  private static Filter randomAccessFilter(Filter filter) {
-    return new RandomAccessFilter(filter);
-  }
-
 }

Modified: lucene/dev/trunk/lucene/suggest/src/test/org/apache/lucene/search/suggest/document/TestSuggestField.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/suggest/src/test/org/apache/lucene/search/suggest/document/TestSuggestField.java?rev=1688682&r1=1688681&r2=1688682&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/suggest/src/test/org/apache/lucene/search/suggest/document/TestSuggestField.java (original)
+++ lucene/dev/trunk/lucene/suggest/src/test/org/apache/lucene/search/suggest/document/TestSuggestField.java Wed Jul  1 16:34:44 2015
@@ -17,6 +17,7 @@ package org.apache.lucene.search.suggest
  * limitations under the License.
  */
 
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
@@ -37,17 +38,16 @@ import org.apache.lucene.document.IntFie
 import org.apache.lucene.index.DirectoryReader;
 import org.apache.lucene.index.IndexWriter;
 import org.apache.lucene.index.IndexWriterConfig;
+import org.apache.lucene.index.LeafReaderContext;
 import org.apache.lucene.index.RandomIndexWriter;
 import org.apache.lucene.index.StoredDocument;
 import org.apache.lucene.index.Term;
-import org.apache.lucene.queries.TermsQuery;
-import org.apache.lucene.search.Filter;
 import org.apache.lucene.search.NumericRangeQuery;
-import org.apache.lucene.search.QueryWrapperFilter;
 import org.apache.lucene.search.ScoreDoc;
 import org.apache.lucene.search.TopDocs;
+import org.apache.lucene.search.suggest.BitsProducer;
 import org.apache.lucene.store.Directory;
-import org.apache.lucene.util.BytesRef;
+import org.apache.lucene.util.Bits;
 import org.apache.lucene.util.CharsRefBuilder;
 import org.apache.lucene.util.LineFileDocs;
 import org.apache.lucene.util.LuceneTestCase;
@@ -223,7 +223,12 @@ public class TestSuggestField extends Lu
       }
     }
 
-    Filter filter = new QueryWrapperFilter(new TermsQuery("str_fld", new BytesRef("non_existent")));
+    BitsProducer filter = new BitsProducer() {
+      @Override
+      public Bits getBits(LeafReaderContext context) throws IOException {
+        return new Bits.MatchNoBits(context.reader().maxDoc());
+      }
+    };
     DirectoryReader reader = iw.getReader();
     SuggestIndexSearcher indexSearcher = new SuggestIndexSearcher(reader);
     // no random access required;