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: