LUCENE-8662: Change TermsEnum.seekExact(BytesRef) to abstract
authoryyuan2 <yyuan2@apple.com>
Mon, 28 Jan 2019 21:06:04 +0000 (13:06 -0800)
committerTomas Fernandez Lobbe <tflobbe@gmail.com>
Fri, 8 Feb 2019 23:10:38 +0000 (15:10 -0800)
17 files changed:
lucene/CHANGES.txt
lucene/MIGRATE.txt
lucene/backward-codecs/src/java/org/apache/lucene/codecs/lucene70/Lucene70DocValuesProducer.java
lucene/codecs/src/java/org/apache/lucene/codecs/blockterms/BlockTermsReader.java
lucene/codecs/src/java/org/apache/lucene/codecs/memory/DirectPostingsFormat.java
lucene/codecs/src/java/org/apache/lucene/codecs/memory/FSTOrdTermsReader.java
lucene/codecs/src/java/org/apache/lucene/codecs/memory/FSTTermsReader.java
lucene/codecs/src/java/org/apache/lucene/codecs/simpletext/SimpleTextTermVectorsReader.java
lucene/core/src/java/org/apache/lucene/codecs/compressing/CompressingTermVectorsReader.java
lucene/core/src/java/org/apache/lucene/codecs/lucene80/Lucene80DocValuesProducer.java
lucene/core/src/java/org/apache/lucene/index/FilterLeafReader.java
lucene/core/src/java/org/apache/lucene/index/FreqProxFields.java
lucene/core/src/java/org/apache/lucene/index/TermsEnum.java
lucene/core/src/test/org/apache/lucene/index/TestCodecs.java
lucene/test-framework/src/java/org/apache/lucene/codecs/ramonly/RAMOnlyPostingsFormat.java
lucene/test-framework/src/java/org/apache/lucene/index/RandomPostingsTester.java
solr/core/src/java/org/apache/solr/uninverting/DocTermOrds.java

index 84e9683..03e5781 100644 (file)
@@ -30,6 +30,9 @@ Other
 
 API Changes
 
+* LUCENE-8662: TermsEnum.seekExact(BytesRef) to abstract and delegate seekExact(BytesRef)
+  in FilterLeafReader.FilterTermsEnum. (Jeffery Yuan via Tomás Fernández Löbbe, Simon Willnauer)
+
 * LUCENE-8469: Deprecated StringHelper.compare has been removed. (Dawid Weiss)
 
 * LUCENE-8039: Introduce a "delta distance" method set to GeoDistance.  This
index c005bc0..16e8101 100644 (file)
@@ -1,5 +1,12 @@
 # Apache Lucene Migration Guide
 
+## TermsEnum.seekExact(BytesRef) is abstract (LUCENE-8662) ##
+
+TermsEnum.seekExact has been changed to abstract, so non-abstract subclass must implement it.
+The default implementation can be seekCeil(text) == SeekStatus.FOUND.
+This method is performance critical, so subclass SHOULD have its own implementation
+if possible instead of using the default implementation.
+
 ## RAMDirectory, RAMFile, RAMInputStream, RAMOutputStream removed ##
 
 RAM-based directory implementation have been removed. (LUCENE-8474). 
index b0f6e84..f5d5780 100644 (file)
@@ -1032,6 +1032,11 @@ final class Lucene70DocValuesProducer extends DocValuesProducer implements Close
     }
 
     @Override
+    public boolean seekExact(BytesRef text) throws IOException {
+      return seekCeil(text) == SeekStatus.FOUND;
+    }
+    
+    @Override
     public void seekExact(long ord) throws IOException {
       if (ord < 0 || ord >= entry.termsDictSize) {
         throw new IndexOutOfBoundsException();
index 4260dc3..9ac0e34 100644 (file)
@@ -686,6 +686,11 @@ public class BlockTermsReader extends FieldsProducer {
       }
 
       @Override
+      public boolean seekExact(BytesRef text) throws IOException {
+        return seekCeil(text) == SeekStatus.FOUND;
+      }
+      
+      @Override
       public void seekExact(long ord) throws IOException {
         //System.out.println("BTR.seek by ord ord=" + ord);
         if (indexEnum == null) {
index 15c0025..50ab83d 100644 (file)
@@ -1507,6 +1507,11 @@ public final class DirectPostingsFormat extends PostingsFormat {
       public void seekExact(long ord) {
         throw new UnsupportedOperationException();
       }
+      
+      @Override
+      public boolean seekExact(BytesRef text) throws IOException {
+        return seekCeil(text) == SeekStatus.FOUND;
+      }
     }
   }
 
index 2b948ff..12f51f9 100644 (file)
@@ -627,6 +627,11 @@ public class FSTOrdTermsReader extends FieldsProducer {
       }
 
       @Override
+      public boolean seekExact(BytesRef text) throws IOException {
+        return seekCeil(text) == SeekStatus.FOUND;
+      }
+      
+      @Override
       public SeekStatus seekCeil(BytesRef target) throws IOException {
         throw new UnsupportedOperationException();
       }
index 7afbc7c..a8cd0ff 100644 (file)
@@ -520,6 +520,11 @@ public class FSTTermsReader extends FieldsProducer {
       }
 
       @Override
+      public boolean seekExact(BytesRef text) throws IOException {
+        return seekCeil(text) == SeekStatus.FOUND;
+      }
+      
+      @Override
       public SeekStatus seekCeil(BytesRef target) throws IOException {
         decoded = false;
         doSeekCeil(target);
index a306e8c..ecbf5cb 100644 (file)
@@ -359,6 +359,11 @@ public class SimpleTextTermVectorsReader extends TermVectorsReader {
     }
 
     @Override
+    public boolean seekExact(BytesRef text) throws IOException {
+      return seekCeil(text) == SeekStatus.FOUND;
+    }
+    
+    @Override
     public void seekExact(long ord) throws IOException {
       throw new UnsupportedOperationException();
     }
index cbe1050..5dd3a64 100644 (file)
@@ -907,6 +907,11 @@ public final class CompressingTermVectorsReader extends TermVectorsReader implem
     }
 
     @Override
+    public boolean seekExact(BytesRef text) throws IOException {
+      return seekCeil(text) == SeekStatus.FOUND;
+    }
+    
+    @Override
     public void seekExact(long ord) throws IOException {
       throw new UnsupportedOperationException();
     }
index e0ece52..bbef30a 100644 (file)
@@ -974,6 +974,11 @@ final class Lucene80DocValuesProducer extends DocValuesProducer implements Close
     }
 
     @Override
+    public boolean seekExact(BytesRef text) throws IOException {
+      return seekCeil(text) == SeekStatus.FOUND;
+    }
+    
+    @Override
     public void seekExact(long ord) throws IOException {
       if (ord < 0 || ord >= entry.termsDictSize) {
         throw new IndexOutOfBoundsException();
index 418e7a8..5d12766 100644 (file)
@@ -178,6 +178,11 @@ public abstract class FilterLeafReader extends LeafReader {
     public SeekStatus seekCeil(BytesRef text) throws IOException {
       return in.seekCeil(text);
     }
+    
+    @Override
+    public boolean seekExact(BytesRef text) throws IOException {
+      return in.seekExact(text);
+    }
 
     @Override
     public void seekExact(long ord) throws IOException {
index f902022..b1615c3 100644 (file)
@@ -180,6 +180,11 @@ class FreqProxFields extends Fields {
       }
     }
 
+    @Override
+    public boolean seekExact(BytesRef text) throws IOException {
+      return seekCeil(text) == SeekStatus.FOUND;
+    }
+    
     public void seekExact(long ord) {
       this.ord = (int) ord;
       int textStart = postingsArray.textStarts[sortedTermIDs[this.ord]];
index e1e48ef..7750bbb 100644 (file)
@@ -65,13 +65,19 @@ public abstract class TermsEnum implements BytesRefIterator {
     NOT_FOUND
   };
 
-  /** Attempts to seek to the exact term, returning
-   *  true if the term is found.  If this returns false, the
-   *  enum is unpositioned.  For some codecs, seekExact may
-   *  be substantially faster than {@link #seekCeil}. */
-  public boolean seekExact(BytesRef text) throws IOException {
-    return seekCeil(text) == SeekStatus.FOUND;
-  }
+  /**
+   * Attempts to seek to the exact term, returning true if the term is found. If this returns false, the enum is
+   * unpositioned. For some codecs, seekExact may be substantially faster than {@link #seekCeil}.
+   * <p>
+   * 
+   * The default implementation can be <code>seekCeil(text) == SeekStatus.FOUND; </code><br>
+   * But this method is performance critical. In some cases, the default implementation may be slow and consume huge memory,
+   * so subclass SHOULD have its own implementation if possible.
+   * 
+   * @return true if the term is found; return false if the enum is unpositioned.
+   */
+  public abstract boolean seekExact(BytesRef text) throws IOException;
+
 
   /** Seeks to the specified term, if it exists, or to the
    *  next (ceiling) term.  Returns SeekStatus to
@@ -207,6 +213,11 @@ public abstract class TermsEnum implements BytesRefIterator {
     public SeekStatus seekCeil(BytesRef term) { return SeekStatus.END; }
     
     @Override
+    public boolean seekExact(BytesRef text) throws IOException {
+      return seekCeil(text) == SeekStatus.FOUND;
+    }
+    
+    @Override
     public void seekExact(long ord) {}
     
     @Override
index 5ff0dde..6955d65 100644 (file)
@@ -654,6 +654,11 @@ public class TestCodecs extends LuceneTestCase {
     }
 
     @Override
+    public boolean seekExact(BytesRef text) throws IOException {
+      return seekCeil(text) == SeekStatus.FOUND;
+    }
+    
+    @Override
     public void seekExact(long ord) {
       throw new UnsupportedOperationException();
     }
index 8a2b042..e519ce0 100644 (file)
@@ -443,6 +443,11 @@ public final class RAMOnlyPostingsFormat extends PostingsFormat {
         }
       }
     }
+    
+    @Override
+    public boolean seekExact(BytesRef text) throws IOException {
+      return seekCeil(text) == SeekStatus.FOUND;
+    }    
 
     @Override
     public void seekExact(long ord) {
index 6da2761..e4f1e4c 100644 (file)
@@ -565,6 +565,11 @@ public class RandomPostingsTester {
     }
 
     @Override
+    public boolean seekExact(BytesRef text) throws IOException {
+      return seekCeil(text) == SeekStatus.FOUND;
+    }
+    
+    @Override
     public void seekExact(long ord) {
       throw new UnsupportedOperationException();
     }
index 736be37..4ce085c 100644 (file)
@@ -704,6 +704,11 @@ public class DocTermOrds implements Accountable {
     }
 
     @Override
+    public boolean seekExact(BytesRef text) throws IOException {
+      return seekCeil(text) == SeekStatus.FOUND;
+    }
+    
+    @Override
     public void seekExact(long targetOrd) throws IOException {
       int delta = (int) (targetOrd - ordBase - ord);
       //System.out.println("  seek(ord) targetOrd=" + targetOrd + " delta=" + delta + " ord=" + ord + " ii=" + indexInterval);