You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by kr...@apache.org on 2016/10/27 20:09:35 UTC

[31/50] [abbrv] lucene-solr:jira/solr-8593: LUCENE-7475: Remove one layer of abstraction in the Lucene70 norms impl.

LUCENE-7475: Remove one layer of abstraction in the Lucene70 norms impl.


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

Branch: refs/heads/jira/solr-8593
Commit: 5394d29fca8546936dc8227f23c6561d6b386832
Parents: ecfbe51
Author: Adrien Grand <jp...@gmail.com>
Authored: Wed Oct 26 10:39:01 2016 +0200
Committer: Adrien Grand <jp...@gmail.com>
Committed: Wed Oct 26 10:39:01 2016 +0200

----------------------------------------------------------------------
 .../codecs/lucene70/Lucene70NormsProducer.java  | 231 +++++++++++--------
 1 file changed, 133 insertions(+), 98 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5394d29f/lucene/core/src/java/org/apache/lucene/codecs/lucene70/Lucene70NormsProducer.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/codecs/lucene70/Lucene70NormsProducer.java b/lucene/core/src/java/org/apache/lucene/codecs/lucene70/Lucene70NormsProducer.java
index c97f1c3..eb7c41a 100644
--- a/lucene/core/src/java/org/apache/lucene/codecs/lucene70/Lucene70NormsProducer.java
+++ b/lucene/core/src/java/org/apache/lucene/codecs/lucene70/Lucene70NormsProducer.java
@@ -95,8 +95,78 @@ final class Lucene70NormsProducer extends NormsProducer {
     long normsOffset;
   }
 
-  static abstract class LongValues {
-    abstract long get(int index) throws IOException;
+  static abstract class DenseNormsIterator extends NumericDocValues {
+
+    final int maxDoc;
+    int doc = -1;
+
+    DenseNormsIterator(int maxDoc) {
+      this.maxDoc = maxDoc;
+    }
+
+    @Override
+    public int docID() {
+      return doc;
+    }
+
+    @Override
+    public int nextDoc() throws IOException {
+      return advance(doc + 1);
+    }
+
+    @Override
+    public int advance(int target) throws IOException {
+      if (target >= maxDoc) {
+        return doc = NO_MORE_DOCS;
+      }
+      return doc = target;
+    }
+
+    @Override
+    public boolean advanceExact(int target) throws IOException {
+      this.doc = target;
+      return true;
+    }
+
+    @Override
+    public long cost() {
+      return maxDoc;
+    }
+
+  }
+
+  static abstract class SparseNormsIterator extends NumericDocValues {
+
+    final IndexedDISI disi;
+
+    SparseNormsIterator(IndexedDISI disi) {
+      this.disi = disi;
+    }
+
+    @Override
+    public int docID() {
+      return disi.docID();
+    }
+
+    @Override
+    public int nextDoc() throws IOException {
+      return disi.nextDoc();
+    }
+
+    @Override
+    public int advance(int target) throws IOException {
+      return disi.advance(target);
+    }
+
+    @Override
+    public boolean advanceExact(int target) throws IOException {
+      return disi.advanceExact(target);
+    }
+
+    @Override
+    public long cost() {
+      return disi.cost();
+    }
   }
 
   private void readFields(IndexInput meta, FieldInfos infos) throws IOException {
@@ -131,122 +201,87 @@ final class Lucene70NormsProducer extends NormsProducer {
       return DocValues.emptyNumeric();
     } else if (entry.docsWithFieldOffset == -1) {
       // dense
-      final LongValues normValues = getNormValues(entry);
-      return new NumericDocValues() {
-
-        int doc = -1;
-
-        @Override
-        public long longValue() throws IOException {
-          return normValues.get(doc);
-        }
-
-        @Override
-        public int docID() {
-          return doc;
-        }
-
-        @Override
-        public int nextDoc() throws IOException {
-          return advance(doc + 1);
-        }
-
-        @Override
-        public int advance(int target) throws IOException {
-          if (target >= maxDoc) {
-            return doc = NO_MORE_DOCS;
+      if (entry.bytesPerNorm == 0) {
+        return new DenseNormsIterator(maxDoc) {
+          @Override
+          public long longValue() throws IOException {
+            return entry.normsOffset;
           }
-          return doc = target;
-        }
-
-        @Override
-        public boolean advanceExact(int target) throws IOException {
-          this.doc = target;
-          return true;
-        }
-
-        @Override
-        public long cost() {
-          return maxDoc;
-        }
-
-      };
+        };
+      }
+      final RandomAccessInput slice = data.randomAccessSlice(entry.normsOffset, entry.numDocsWithField * (long) entry.bytesPerNorm);
+      switch (entry.bytesPerNorm) {
+        case 1:
+          return new DenseNormsIterator(maxDoc) {
+            @Override
+            public long longValue() throws IOException {
+              return slice.readByte(doc);
+            }
+          };
+        case 2:
+          return new DenseNormsIterator(maxDoc) {
+            @Override
+            public long longValue() throws IOException {
+              return slice.readShort(((long) doc) << 1);
+            }
+          };
+        case 4:
+          return new DenseNormsIterator(maxDoc) {
+            @Override
+            public long longValue() throws IOException {
+              return slice.readInt(((long) doc) << 2);
+            }
+          };
+        case 8:
+          return new DenseNormsIterator(maxDoc) {
+            @Override
+            public long longValue() throws IOException {
+              return slice.readLong(((long) doc) << 3);
+            }
+          };
+        default:
+          // should not happen, we already validate bytesPerNorm in readFields
+          throw new AssertionError();
+      }
     } else {
       // sparse
-      final LongValues normValues = getNormValues(entry);
       final IndexedDISI disi = new IndexedDISI(data, entry.docsWithFieldOffset, entry.docsWithFieldLength, entry.numDocsWithField);
-      return new NumericDocValues() {
-
-        @Override
-        public int advance(int target) throws IOException {
-          return disi.advance(target);
-        }
-
-        @Override
-        public boolean advanceExact(int target) throws IOException {
-          return disi.advanceExact(target);
-        }
-
-        @Override
-        public int nextDoc() throws IOException {
-          return disi.nextDoc();
-        }
-
-        @Override
-        public int docID() {
-          return disi.docID();
-        }
-
-        @Override
-        public long cost() {
-          return entry.numDocsWithField;
-        }
-
-        @Override
-        public long longValue() throws IOException {
-          return normValues.get(disi.index());
-        }
-      };
-    }
-  }
-
-  private LongValues getNormValues(NormsEntry entry) throws IOException {
-    if (entry.bytesPerNorm == 0) {
-      return new LongValues() {
-        @Override
-        long get(int index) {
-          return entry.normsOffset;
-        }
-      };
-    } else {
+      if (entry.bytesPerNorm == 0) {
+        return new SparseNormsIterator(disi) {
+          @Override
+          public long longValue() throws IOException {
+            return entry.normsOffset;
+          }
+        };
+      }
       final RandomAccessInput slice = data.randomAccessSlice(entry.normsOffset, entry.numDocsWithField * (long) entry.bytesPerNorm);
       switch (entry.bytesPerNorm) {
         case 1:
-          return new LongValues() {
+          return new SparseNormsIterator(disi) {
             @Override
-            long get(int index) throws IOException {
-              return slice.readByte(index);
+            public long longValue() throws IOException {
+              return slice.readByte(disi.index());
             }
           };
         case 2:
-          return new LongValues() {
+          return new SparseNormsIterator(disi) {
             @Override
-            long get(int index) throws IOException {
-              return slice.readShort(((long) index) << 1);
+            public long longValue() throws IOException {
+              return slice.readShort(((long) disi.index()) << 1);
             }
           };
         case 4:
-          return new LongValues() {
+          return new SparseNormsIterator(disi) {
             @Override
-            long get(int index) throws IOException {
-              return slice.readInt(((long) index) << 2);
+            public long longValue() throws IOException {
+              return slice.readInt(((long) disi.index()) << 2);
             }
           };
         case 8:
-          return new LongValues() {
+          return new SparseNormsIterator(disi) {
             @Override
-            long get(int index) throws IOException {
-              return slice.readLong(((long) index) << 3);
+            public long longValue() throws IOException {
+              return slice.readLong(((long) disi.index()) << 3);
             }
           };
         default: