You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by rm...@apache.org on 2013/08/16 12:25:39 UTC
svn commit: r1514642 [2/2] - in /lucene/dev/branches/lucene5178:
lucene/codecs/src/java/org/apache/lucene/codecs/diskdv/
lucene/codecs/src/java/org/apache/lucene/codecs/simpletext/
lucene/core/src/java/org/apache/lucene/codecs/ lucene/core/src/java/org...
Modified: lucene/dev/branches/lucene5178/lucene/core/src/java/org/apache/lucene/index/SortedDocValuesWriter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5178/lucene/core/src/java/org/apache/lucene/index/SortedDocValuesWriter.java?rev=1514642&r1=1514641&r2=1514642&view=diff
==============================================================================
--- lucene/dev/branches/lucene5178/lucene/core/src/java/org/apache/lucene/index/SortedDocValuesWriter.java (original)
+++ lucene/dev/branches/lucene5178/lucene/core/src/java/org/apache/lucene/index/SortedDocValuesWriter.java Fri Aug 16 10:25:38 2013
@@ -30,19 +30,19 @@ import org.apache.lucene.util.BytesRefHa
import org.apache.lucene.util.BytesRefHash;
import org.apache.lucene.util.Counter;
import org.apache.lucene.util.RamUsageEstimator;
-import org.apache.lucene.util.packed.AppendingPackedLongBuffer;
+import org.apache.lucene.util.packed.AppendingDeltaPackedLongBuffer;
import org.apache.lucene.util.packed.PackedInts;
/** Buffers up pending byte[] per doc, deref and sorting via
* int ord, then flushes when segment flushes. */
class SortedDocValuesWriter extends DocValuesWriter {
final BytesRefHash hash;
- private AppendingPackedLongBuffer pending;
+ private AppendingDeltaPackedLongBuffer pending;
private final Counter iwBytesUsed;
private long bytesUsed; // this currently only tracks differences in 'pending'
private final FieldInfo fieldInfo;
- private static final BytesRef EMPTY = new BytesRef(BytesRef.EMPTY_BYTES);
+ private static final int EMPTY_ORD = -1;
public SortedDocValuesWriter(FieldInfo fieldInfo, Counter iwBytesUsed) {
this.fieldInfo = fieldInfo;
@@ -52,7 +52,7 @@ class SortedDocValuesWriter extends DocV
new ByteBlockPool.DirectTrackingAllocator(iwBytesUsed)),
BytesRefHash.DEFAULT_CAPACITY,
new DirectBytesStartArray(BytesRefHash.DEFAULT_CAPACITY, iwBytesUsed));
- pending = new AppendingPackedLongBuffer(PackedInts.COMPACT);
+ pending = new AppendingDeltaPackedLongBuffer(PackedInts.COMPACT);
bytesUsed = pending.ramBytesUsed();
iwBytesUsed.addAndGet(bytesUsed);
}
@@ -70,7 +70,7 @@ class SortedDocValuesWriter extends DocV
// Fill in any holes:
while(pending.size() < docID) {
- addOneValue(EMPTY);
+ pending.add(EMPTY_ORD);
}
addOneValue(value);
@@ -79,8 +79,9 @@ class SortedDocValuesWriter extends DocV
@Override
public void finish(int maxDoc) {
while(pending.size() < maxDoc) {
- addOneValue(EMPTY);
+ pending.add(EMPTY_ORD);
}
+ updateBytesUsed();
}
private void addOneValue(BytesRef value) {
@@ -177,7 +178,7 @@ class SortedDocValuesWriter extends DocV
// iterates over the ords for each doc we have in ram
private class OrdsIterator implements Iterator<Number> {
- final AppendingPackedLongBuffer.Iterator iter = pending.iterator();
+ final AppendingDeltaPackedLongBuffer.Iterator iter = pending.iterator();
final int ordMap[];
final int maxDoc;
int docUpto;
@@ -200,8 +201,7 @@ class SortedDocValuesWriter extends DocV
}
int ord = (int) iter.next();
docUpto++;
- // TODO: make reusable Number
- return ordMap[ord];
+ return ord == -1 ? ord : ordMap[ord];
}
@Override
Modified: lucene/dev/branches/lucene5178/lucene/core/src/java/org/apache/lucene/search/FieldCache.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5178/lucene/core/src/java/org/apache/lucene/search/FieldCache.java?rev=1514642&r1=1514641&r2=1514642&view=diff
==============================================================================
--- lucene/dev/branches/lucene5178/lucene/core/src/java/org/apache/lucene/search/FieldCache.java (original)
+++ lucene/dev/branches/lucene5178/lucene/core/src/java/org/apache/lucene/search/FieldCache.java Fri Aug 16 10:25:38 2013
@@ -104,26 +104,6 @@ public interface FieldCache {
}
};
}
-
- /** Returns MISSING/-1 ordinal for every document */
- public static final SortedDocValues EMPTY_TERMSINDEX = new SortedDocValues() {
- @Override
- public int getOrd(int docID) {
- return -1;
- }
-
- @Override
- public void lookupOrd(int ord, BytesRef result) {
- result.bytes = MISSING;
- result.offset = 0;
- result.length = 0;
- }
-
- @Override
- public int getValueCount() {
- return 0;
- }
- };
/**
* Placeholder indicating creation of this cache is currently in-progress.
@@ -266,13 +246,10 @@ public interface FieldCache {
}
};
-
/** Checks the internal cache for an appropriate entry, and if none is found,
* reads the terms in <code>field</code> and returns a bit set at the size of
* <code>reader.maxDoc()</code>, with turned on bits for each docid that
- * does have a value for this field. Note that if the field was only indexed
- * as DocValues then this method will not work (it will return a Bits stating
- * that no documents contain the field).
+ * does have a value for this field.
*/
public Bits getDocsWithField(AtomicReader reader, String field) throws IOException;
Modified: lucene/dev/branches/lucene5178/lucene/core/src/java/org/apache/lucene/search/FieldCacheImpl.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5178/lucene/core/src/java/org/apache/lucene/search/FieldCacheImpl.java?rev=1514642&r1=1514641&r2=1514642&view=diff
==============================================================================
--- lucene/dev/branches/lucene5178/lucene/core/src/java/org/apache/lucene/search/FieldCacheImpl.java (original)
+++ lucene/dev/branches/lucene5178/lucene/core/src/java/org/apache/lucene/search/FieldCacheImpl.java Fri Aug 16 10:25:38 2013
@@ -501,8 +501,7 @@ class FieldCacheImpl implements FieldCac
// field does not exist or has no value
return new Bits.MatchNoBits(reader.maxDoc());
} else if (fieldInfo.hasDocValues()) {
- // doc values are dense
- return new Bits.MatchAllBits(reader.maxDoc());
+ return reader.getDocsWithField(field);
} else if (!fieldInfo.isIndexed()) {
return new Bits.MatchNoBits(reader.maxDoc());
}
@@ -944,13 +943,13 @@ class FieldCacheImpl implements FieldCac
} else {
final FieldInfo info = reader.getFieldInfos().fieldInfo(field);
if (info == null) {
- return EMPTY_TERMSINDEX;
+ return SortedDocValues.EMPTY;
} else if (info.hasDocValues()) {
// we don't try to build a sorted instance from numeric/binary doc
// values because dedup can be very costly
throw new IllegalStateException("Type mismatch: " + field + " was indexed as " + info.getDocValuesType());
} else if (!info.isIndexed()) {
- return EMPTY_TERMSINDEX;
+ return SortedDocValues.EMPTY;
}
return (SortedDocValues) caches.get(SortedDocValues.class).get(reader, new CacheKey(field, acceptableOverheadRatio), false);
}
Modified: lucene/dev/branches/lucene5178/lucene/core/src/test/org/apache/lucene/search/TestFieldCache.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5178/lucene/core/src/test/org/apache/lucene/search/TestFieldCache.java?rev=1514642&r1=1514641&r2=1514642&view=diff
==============================================================================
--- lucene/dev/branches/lucene5178/lucene/core/src/test/org/apache/lucene/search/TestFieldCache.java (original)
+++ lucene/dev/branches/lucene5178/lucene/core/src/test/org/apache/lucene/search/TestFieldCache.java Fri Aug 16 10:25:38 2013
@@ -569,7 +569,7 @@ public class TestFieldCache extends Luce
assertEquals(2, sortedSet.getValueCount());
bits = FieldCache.DEFAULT.getDocsWithField(ar, "sortedset");
- assertTrue(bits instanceof Bits.MatchAllBits);
+ assertTrue(bits.get(0));
}
ir.close();
Modified: lucene/dev/branches/lucene5178/lucene/facet/src/java/org/apache/lucene/facet/codecs/facet42/Facet42DocValuesProducer.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5178/lucene/facet/src/java/org/apache/lucene/facet/codecs/facet42/Facet42DocValuesProducer.java?rev=1514642&r1=1514641&r2=1514642&view=diff
==============================================================================
--- lucene/dev/branches/lucene5178/lucene/facet/src/java/org/apache/lucene/facet/codecs/facet42/Facet42DocValuesProducer.java (original)
+++ lucene/dev/branches/lucene5178/lucene/facet/src/java/org/apache/lucene/facet/codecs/facet42/Facet42DocValuesProducer.java Fri Aug 16 10:25:38 2013
@@ -31,15 +31,18 @@ import org.apache.lucene.index.SegmentRe
import org.apache.lucene.index.SortedDocValues;
import org.apache.lucene.index.SortedSetDocValues;
import org.apache.lucene.store.IndexInput;
+import org.apache.lucene.util.Bits;
import org.apache.lucene.util.IOUtils;
class Facet42DocValuesProducer extends DocValuesProducer {
private final Map<Integer,Facet42BinaryDocValues> fields = new HashMap<Integer,Facet42BinaryDocValues>();
+ private final int maxDoc;
Facet42DocValuesProducer(SegmentReadState state) throws IOException {
String fileName = IndexFileNames.segmentFileName(state.segmentInfo.name, state.segmentSuffix, Facet42DocValuesFormat.EXTENSION);
IndexInput in = state.directory.openInput(fileName, state.context);
+ this.maxDoc = state.segmentInfo.getDocCount();
boolean success = false;
try {
CodecUtil.checkHeader(in, Facet42DocValuesFormat.CODEC,
@@ -81,6 +84,11 @@ class Facet42DocValuesProducer extends D
}
@Override
+ public Bits getDocsWithField(FieldInfo field) throws IOException {
+ return new Bits.MatchAllBits(maxDoc); // TODO: have codec impl this?
+ }
+
+ @Override
public void close() throws IOException {
}
}
Modified: lucene/dev/branches/lucene5178/lucene/facet/src/java/org/apache/lucene/facet/util/FacetsPayloadMigrationReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5178/lucene/facet/src/java/org/apache/lucene/facet/util/FacetsPayloadMigrationReader.java?rev=1514642&r1=1514641&r2=1514642&view=diff
==============================================================================
--- lucene/dev/branches/lucene5178/lucene/facet/src/java/org/apache/lucene/facet/util/FacetsPayloadMigrationReader.java (original)
+++ lucene/dev/branches/lucene5178/lucene/facet/src/java/org/apache/lucene/facet/util/FacetsPayloadMigrationReader.java Fri Aug 16 10:25:38 2013
@@ -40,6 +40,7 @@ import org.apache.lucene.index.Terms;
import org.apache.lucene.index.TermsEnum;
import org.apache.lucene.search.DocIdSetIterator;
import org.apache.lucene.store.Directory;
+import org.apache.lucene.util.Bits;
import org.apache.lucene.util.BytesRef;
/**
@@ -223,6 +224,18 @@ public class FacetsPayloadMigrationReade
}
@Override
+ public Bits getDocsWithField(String field) throws IOException {
+ Term term = fieldTerms.get(field);
+ if (term == null) {
+ return super.getDocsWithField(field);
+ } else {
+ // we shouldn't return null, even if the term does not exist or has no
+ // payloads, since we already marked the field as having DocValues.
+ return new Bits.MatchAllBits(maxDoc());
+ }
+ }
+
+ @Override
public FieldInfos getFieldInfos() {
FieldInfos innerInfos = super.getFieldInfos();
ArrayList<FieldInfo> infos = new ArrayList<FieldInfo>(innerInfos.size());
Modified: lucene/dev/branches/lucene5178/lucene/highlighter/src/java/org/apache/lucene/search/highlight/WeightedSpanTermExtractor.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5178/lucene/highlighter/src/java/org/apache/lucene/search/highlight/WeightedSpanTermExtractor.java?rev=1514642&r1=1514641&r2=1514642&view=diff
==============================================================================
--- lucene/dev/branches/lucene5178/lucene/highlighter/src/java/org/apache/lucene/search/highlight/WeightedSpanTermExtractor.java (original)
+++ lucene/dev/branches/lucene5178/lucene/highlighter/src/java/org/apache/lucene/search/highlight/WeightedSpanTermExtractor.java Fri Aug 16 10:25:38 2013
@@ -422,6 +422,11 @@ public class WeightedSpanTermExtractor {
public NumericDocValues getNormValues(String field) throws IOException {
return super.getNormValues(FIELD_NAME);
}
+
+ @Override
+ public Bits getDocsWithField(String field) throws IOException {
+ return super.getDocsWithField(FIELD_NAME);
+ }
}
/**
Modified: lucene/dev/branches/lucene5178/lucene/memory/src/java/org/apache/lucene/index/memory/MemoryIndex.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5178/lucene/memory/src/java/org/apache/lucene/index/memory/MemoryIndex.java?rev=1514642&r1=1514641&r2=1514642&view=diff
==============================================================================
--- lucene/dev/branches/lucene5178/lucene/memory/src/java/org/apache/lucene/index/memory/MemoryIndex.java (original)
+++ lucene/dev/branches/lucene5178/lucene/memory/src/java/org/apache/lucene/index/memory/MemoryIndex.java Fri Aug 16 10:25:38 2013
@@ -756,6 +756,11 @@ public class MemoryIndex {
return null;
}
+ @Override
+ public Bits getDocsWithField(String field) throws IOException {
+ return null;
+ }
+
private class MemoryFields extends Fields {
@Override
public Iterator<String> iterator() {
Modified: lucene/dev/branches/lucene5178/lucene/misc/src/java/org/apache/lucene/index/sorter/SortingAtomicReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5178/lucene/misc/src/java/org/apache/lucene/index/sorter/SortingAtomicReader.java?rev=1514642&r1=1514641&r2=1514642&view=diff
==============================================================================
--- lucene/dev/branches/lucene5178/lucene/misc/src/java/org/apache/lucene/index/sorter/SortingAtomicReader.java (original)
+++ lucene/dev/branches/lucene5178/lucene/misc/src/java/org/apache/lucene/index/sorter/SortingAtomicReader.java Fri Aug 16 10:25:38 2013
@@ -221,6 +221,27 @@ public class SortingAtomicReader extends
}
}
+ private static class SortingBits implements Bits {
+
+ private final Bits in;
+ private final Sorter.DocMap docMap;
+
+ public SortingBits(final Bits in, Sorter.DocMap docMap) {
+ this.in = in;
+ this.docMap = docMap;
+ }
+
+ @Override
+ public boolean get(int index) {
+ return in.get(docMap.newToOld(index));
+ }
+
+ @Override
+ public int length() {
+ return in.length();
+ }
+ }
+
private static class SortingSortedDocValues extends SortedDocValues {
private final SortedDocValues in;
@@ -743,20 +764,9 @@ public class SortingAtomicReader extends
final Bits inLiveDocs = in.getLiveDocs();
if (inLiveDocs == null) {
return null;
+ } else {
+ return new SortingBits(inLiveDocs, docMap);
}
- return new Bits() {
-
- @Override
- public boolean get(int index) {
- return inLiveDocs.get(docMap.newToOld(index));
- }
-
- @Override
- public int length() {
- return inLiveDocs.length();
- }
-
- };
}
@Override
@@ -797,6 +807,16 @@ public class SortingAtomicReader extends
}
@Override
+ public Bits getDocsWithField(String field) throws IOException {
+ Bits bits = in.getDocsWithField(field);
+ if (bits == null || bits instanceof Bits.MatchAllBits || bits instanceof Bits.MatchNoBits) {
+ return bits;
+ } else {
+ return new SortingBits(bits, docMap);
+ }
+ }
+
+ @Override
public Fields getTermVectors(final int docID) throws IOException {
return in.getTermVectors(docMap.newToOld(docID));
}
Modified: lucene/dev/branches/lucene5178/lucene/test-framework/src/java/org/apache/lucene/codecs/asserting/AssertingDocValuesFormat.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5178/lucene/test-framework/src/java/org/apache/lucene/codecs/asserting/AssertingDocValuesFormat.java?rev=1514642&r1=1514641&r2=1514642&view=diff
==============================================================================
--- lucene/dev/branches/lucene5178/lucene/test-framework/src/java/org/apache/lucene/codecs/asserting/AssertingDocValuesFormat.java (original)
+++ lucene/dev/branches/lucene5178/lucene/test-framework/src/java/org/apache/lucene/codecs/asserting/AssertingDocValuesFormat.java Fri Aug 16 10:25:38 2013
@@ -33,6 +33,7 @@ import org.apache.lucene.index.SegmentRe
import org.apache.lucene.index.SegmentWriteState;
import org.apache.lucene.index.SortedDocValues;
import org.apache.lucene.index.SortedSetDocValues;
+import org.apache.lucene.util.Bits;
import org.apache.lucene.util.BytesRef;
import org.apache.lucene.util.FixedBitSet;
import org.apache.lucene.util.OpenBitSet;
@@ -75,11 +76,10 @@ public class AssertingDocValuesFormat ex
public void addNumericField(FieldInfo field, Iterable<Number> values) throws IOException {
int count = 0;
for (Number v : values) {
- assert v != null;
count++;
}
assert count == maxDoc;
- checkIterator(values.iterator(), maxDoc);
+ checkIterator(values.iterator(), maxDoc, true);
in.addNumericField(field, values);
}
@@ -87,12 +87,11 @@ public class AssertingDocValuesFormat ex
public void addBinaryField(FieldInfo field, Iterable<BytesRef> values) throws IOException {
int count = 0;
for (BytesRef b : values) {
- assert b != null;
- assert b.isValid();
+ assert b == null || b.isValid();
count++;
}
assert count == maxDoc;
- checkIterator(values.iterator(), maxDoc);
+ checkIterator(values.iterator(), maxDoc, true);
in.addBinaryField(field, values);
}
@@ -117,15 +116,17 @@ public class AssertingDocValuesFormat ex
for (Number v : docToOrd) {
assert v != null;
int ord = v.intValue();
- assert ord >= 0 && ord < valueCount;
- seenOrds.set(ord);
+ assert ord >= -1 && ord < valueCount;
+ if (ord >= 0) {
+ seenOrds.set(ord);
+ }
count++;
}
assert count == maxDoc;
assert seenOrds.cardinality() == valueCount;
- checkIterator(values.iterator(), valueCount);
- checkIterator(docToOrd.iterator(), maxDoc);
+ checkIterator(values.iterator(), valueCount, false);
+ checkIterator(docToOrd.iterator(), maxDoc, false);
in.addSortedField(field, values, docToOrd);
}
@@ -169,18 +170,18 @@ public class AssertingDocValuesFormat ex
assert docCount == maxDoc;
assert seenOrds.cardinality() == valueCount;
- checkIterator(values.iterator(), valueCount);
- checkIterator(docToOrdCount.iterator(), maxDoc);
- checkIterator(ords.iterator(), ordCount);
+ checkIterator(values.iterator(), valueCount, false);
+ checkIterator(docToOrdCount.iterator(), maxDoc, false);
+ checkIterator(ords.iterator(), ordCount, false);
in.addSortedSetField(field, values, docToOrdCount, ords);
}
- private <T> void checkIterator(Iterator<T> iterator, long expectedSize) {
+ private <T> void checkIterator(Iterator<T> iterator, long expectedSize, boolean allowNull) {
for (long i = 0; i < expectedSize; i++) {
boolean hasNext = iterator.hasNext();
assert hasNext;
T v = iterator.next();
- assert v != null;
+ assert allowNull || v != null;
try {
iterator.remove();
throw new AssertionError("broken iterator (supports remove): " + iterator);
@@ -244,6 +245,15 @@ public class AssertingDocValuesFormat ex
assert values != null;
return new AssertingAtomicReader.AssertingSortedSetDocValues(values, maxDoc);
}
+
+ @Override
+ public Bits getDocsWithField(FieldInfo field) throws IOException {
+ assert field.getDocValuesType() != null;
+ Bits bits = in.getDocsWithField(field);
+ assert bits != null;
+ assert bits.length() == maxDoc;
+ return bits; // TODO: add AssertingBits w/ bounds check
+ }
@Override
public void close() throws IOException {
Modified: lucene/dev/branches/lucene5178/lucene/test-framework/src/java/org/apache/lucene/codecs/cheapbastard/CheapBastardDocValuesProducer.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5178/lucene/test-framework/src/java/org/apache/lucene/codecs/cheapbastard/CheapBastardDocValuesProducer.java?rev=1514642&r1=1514641&r2=1514642&view=diff
==============================================================================
--- lucene/dev/branches/lucene5178/lucene/test-framework/src/java/org/apache/lucene/codecs/cheapbastard/CheapBastardDocValuesProducer.java (original)
+++ lucene/dev/branches/lucene5178/lucene/test-framework/src/java/org/apache/lucene/codecs/cheapbastard/CheapBastardDocValuesProducer.java Fri Aug 16 10:25:38 2013
@@ -27,6 +27,7 @@ import java.util.Map;
import org.apache.lucene.codecs.CodecUtil;
import org.apache.lucene.codecs.DocValuesProducer;
+import org.apache.lucene.codecs.DocValuesProducer.SortedSetDocsWithField;
import org.apache.lucene.codecs.diskdv.DiskDocValuesConsumer;
import org.apache.lucene.codecs.diskdv.DiskDocValuesFormat;
import org.apache.lucene.index.BinaryDocValues;
@@ -38,6 +39,7 @@ import org.apache.lucene.index.SegmentRe
import org.apache.lucene.index.SortedDocValues;
import org.apache.lucene.index.SortedSetDocValues;
import org.apache.lucene.store.IndexInput;
+import org.apache.lucene.util.Bits;
import org.apache.lucene.util.BytesRef;
import org.apache.lucene.util.IOUtils;
import org.apache.lucene.util.packed.BlockPackedReader;
@@ -50,9 +52,11 @@ class CheapBastardDocValuesProducer exte
private final Map<Integer,NumericEntry> ordIndexes;
private final Map<Integer,BinaryEntry> binaries;
private final IndexInput data;
+ private final int maxDoc;
CheapBastardDocValuesProducer(SegmentReadState state, String dataCodec, String dataExtension, String metaCodec, String metaExtension) throws IOException {
String metaName = IndexFileNames.segmentFileName(state.segmentInfo.name, state.segmentSuffix, metaExtension);
+ this.maxDoc = state.segmentInfo.getDocCount();
// read in the entries from the metadata file.
IndexInput in = state.directory.openInput(metaName, state.context);
boolean success = false;
@@ -380,6 +384,15 @@ class CheapBastardDocValuesProducer exte
}
};
}
+
+ @Override
+ public Bits getDocsWithField(FieldInfo field) throws IOException {
+ if (field.getDocValuesType() == FieldInfo.DocValuesType.SORTED_SET) {
+ return new SortedSetDocsWithField(getSortedSet(field), maxDoc);
+ } else {
+ return new Bits.MatchAllBits(maxDoc);
+ }
+ }
@Override
public void close() throws IOException {
Modified: lucene/dev/branches/lucene5178/lucene/test-framework/src/java/org/apache/lucene/codecs/lucene40/Lucene40DocValuesWriter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5178/lucene/test-framework/src/java/org/apache/lucene/codecs/lucene40/Lucene40DocValuesWriter.java?rev=1514642&r1=1514641&r2=1514642&view=diff
==============================================================================
--- lucene/dev/branches/lucene5178/lucene/test-framework/src/java/org/apache/lucene/codecs/lucene40/Lucene40DocValuesWriter.java (original)
+++ lucene/dev/branches/lucene5178/lucene/test-framework/src/java/org/apache/lucene/codecs/lucene40/Lucene40DocValuesWriter.java Fri Aug 16 10:25:38 2013
@@ -24,7 +24,9 @@ import java.util.TreeSet;
import org.apache.lucene.codecs.CodecUtil;
import org.apache.lucene.codecs.DocValuesConsumer;
+import org.apache.lucene.codecs.MissingOrdRemapper;
import org.apache.lucene.codecs.lucene40.Lucene40FieldInfosReader.LegacyDocValuesType;
+import org.apache.lucene.index.BinaryDocValues;
import org.apache.lucene.index.FieldInfo;
import org.apache.lucene.index.IndexFileNames;
import org.apache.lucene.index.SegmentWriteState;
@@ -54,7 +56,7 @@ class Lucene40DocValuesWriter extends Do
long minValue = Long.MAX_VALUE;
long maxValue = Long.MIN_VALUE;
for (Number n : values) {
- long v = n.longValue();
+ long v = n == null ? 0 : n.longValue();
minValue = Math.min(minValue, v);
maxValue = Math.max(maxValue, v);
}
@@ -92,7 +94,7 @@ class Lucene40DocValuesWriter extends Do
Lucene40DocValuesFormat.INTS_VERSION_CURRENT);
output.writeInt(1); // size
for (Number n : values) {
- output.writeByte(n.byteValue());
+ output.writeByte(n == null ? 0 : n.byteValue());
}
}
@@ -103,7 +105,7 @@ class Lucene40DocValuesWriter extends Do
Lucene40DocValuesFormat.INTS_VERSION_CURRENT);
output.writeInt(2); // size
for (Number n : values) {
- output.writeShort(n.shortValue());
+ output.writeShort(n == null ? 0 : n.shortValue());
}
}
@@ -114,7 +116,7 @@ class Lucene40DocValuesWriter extends Do
Lucene40DocValuesFormat.INTS_VERSION_CURRENT);
output.writeInt(4); // size
for (Number n : values) {
- output.writeInt(n.intValue());
+ output.writeInt(n == null ? 0 : n.intValue());
}
}
@@ -131,7 +133,7 @@ class Lucene40DocValuesWriter extends Do
// writes longs
output.writeByte(Lucene40DocValuesFormat.VAR_INTS_FIXED_64);
for (Number n : values) {
- output.writeLong(n.longValue());
+ output.writeLong(n == null ? 0 : n.longValue());
}
} else {
// writes packed ints
@@ -143,7 +145,8 @@ class Lucene40DocValuesWriter extends Do
PackedInts.bitsRequired(delta),
PackedInts.DEFAULT);
for (Number n : values) {
- writer.add(n.longValue() - minValue);
+ long v = n == null ? 0 : n.longValue();
+ writer.add(v - minValue);
}
writer.finish();
}
@@ -156,6 +159,9 @@ class Lucene40DocValuesWriter extends Do
int minLength = Integer.MAX_VALUE;
int maxLength = Integer.MIN_VALUE;
for (BytesRef b : values) {
+ if (b == null) {
+ b = new BytesRef(); // 4.0 doesnt distinguish
+ }
minLength = Math.min(minLength, b.length);
maxLength = Math.max(maxLength, b.length);
if (uniqueValues != null) {
@@ -243,7 +249,9 @@ class Lucene40DocValuesWriter extends Do
output.writeInt(length);
for (BytesRef v : values) {
- output.writeBytes(v.bytes, v.offset, v.length);
+ if (v != null) {
+ output.writeBytes(v.bytes, v.offset, v.length);
+ }
}
}
@@ -264,7 +272,9 @@ class Lucene40DocValuesWriter extends Do
final long startPos = data.getFilePointer();
for (BytesRef v : values) {
- data.writeBytes(v.bytes, v.offset, v.length);
+ if (v != null) {
+ data.writeBytes(v.bytes, v.offset, v.length);
+ }
}
/* addresses */
@@ -279,7 +289,9 @@ class Lucene40DocValuesWriter extends Do
long currentPosition = 0;
for (BytesRef v : values) {
w.add(currentPosition);
- currentPosition += v.length;
+ if (v != null) {
+ currentPosition += v.length;
+ }
}
// write sentinel
assert currentPosition == maxAddress;
@@ -301,7 +313,7 @@ class Lucene40DocValuesWriter extends Do
// deduplicate
TreeSet<BytesRef> dictionary = new TreeSet<BytesRef>();
for (BytesRef v : values) {
- dictionary.add(BytesRef.deepCopyOf(v));
+ dictionary.add(v == null ? new BytesRef() : BytesRef.deepCopyOf(v));
}
/* values */
@@ -318,6 +330,9 @@ class Lucene40DocValuesWriter extends Do
final PackedInts.Writer w = PackedInts.getWriter(index, maxDoc, PackedInts.bitsRequired(valueCount-1), PackedInts.DEFAULT);
for (BytesRef v : values) {
+ if (v == null) {
+ v = new BytesRef();
+ }
int ord = dictionary.headSet(v).size();
w.add(ord);
}
@@ -338,7 +353,7 @@ class Lucene40DocValuesWriter extends Do
// deduplicate
TreeSet<BytesRef> dictionary = new TreeSet<BytesRef>();
for (BytesRef v : values) {
- dictionary.add(BytesRef.deepCopyOf(v));
+ dictionary.add(v == null ? new BytesRef() : BytesRef.deepCopyOf(v));
}
/* values */
@@ -359,7 +374,7 @@ class Lucene40DocValuesWriter extends Do
final PackedInts.Writer w = PackedInts.getWriter(index, maxDoc, PackedInts.bitsRequired(currentAddress), PackedInts.DEFAULT);
for (BytesRef v : values) {
- w.add(valueToAddress.get(v));
+ w.add(valueToAddress.get(v == null ? new BytesRef() : v));
}
w.finish();
}
@@ -385,6 +400,15 @@ class Lucene40DocValuesWriter extends Do
maxLength = Math.max(maxLength, b.length);
}
+ // but dont use fixed if there are missing values (we are simulating how lucene40 wrote dv...)
+ boolean anyMissing = false;
+ for (Number n : docToOrd) {
+ if (n.longValue() == -1) {
+ anyMissing = true;
+ break;
+ }
+ }
+
boolean success = false;
IndexOutput data = null;
IndexOutput index = null;
@@ -394,12 +418,22 @@ class Lucene40DocValuesWriter extends Do
try {
data = dir.createOutput(dataName, state.context);
index = dir.createOutput(indexName, state.context);
- if (minLength == maxLength) {
+ if (minLength == maxLength && !anyMissing) {
// fixed byte[]
addFixedSortedBytesField(field, data, index, values, docToOrd, minLength);
} else {
// var byte[]
- addVarSortedBytesField(field, data, index, values, docToOrd);
+ // three cases for simulating the old writer:
+ // 1. no missing
+ // 2. missing (and empty string in use): remap ord=-1 -> ord=0
+ // 3. missing (and empty string not in use): remap all ords +1, insert empty string into values
+ if (!anyMissing) {
+ addVarSortedBytesField(field, data, index, values, docToOrd);
+ } else if (minLength == 0) {
+ addVarSortedBytesField(field, data, index, values, MissingOrdRemapper.mapMissingToOrd0(docToOrd));
+ } else {
+ addVarSortedBytesField(field, data, index, MissingOrdRemapper.insertEmptyValue(values), MissingOrdRemapper.mapAllOrds(docToOrd));
+ }
}
success = true;
} finally {
Modified: lucene/dev/branches/lucene5178/lucene/test-framework/src/java/org/apache/lucene/index/BaseDocValuesFormatTestCase.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5178/lucene/test-framework/src/java/org/apache/lucene/index/BaseDocValuesFormatTestCase.java?rev=1514642&r1=1514641&r2=1514642&view=diff
==============================================================================
--- lucene/dev/branches/lucene5178/lucene/test-framework/src/java/org/apache/lucene/index/BaseDocValuesFormatTestCase.java (original)
+++ lucene/dev/branches/lucene5178/lucene/test-framework/src/java/org/apache/lucene/index/BaseDocValuesFormatTestCase.java Fri Aug 16 10:25:38 2013
@@ -52,6 +52,7 @@ import org.apache.lucene.search.ScoreDoc
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
+import org.apache.lucene.util.Bits;
import org.apache.lucene.util.BytesRef;
import org.apache.lucene.util.BytesRefHash;
import org.apache.lucene.util.LuceneTestCase;
@@ -1073,8 +1074,10 @@ public abstract class BaseDocValuesForma
doc.add(newTextField("id", "noValue", Field.Store.YES));
w.addDocument(doc);
}
- BytesRef bytesRef = new BytesRef();
- hash.add(bytesRef); // add empty value for the gaps
+ if (!codecSupportsDocsWithField("field")) {
+ BytesRef bytesRef = new BytesRef();
+ hash.add(bytesRef); // add empty value for the gaps
+ }
if (rarely()) {
w.commit();
}
@@ -2197,5 +2200,205 @@ public abstract class BaseDocValuesForma
doTestNumericsVsStoredFields(longs);
}
}
+
+ public void testTwoNumbersOneMissing() throws IOException {
+ assumeTrue("Codec does not support getDocsWithField", codecSupportsDocsWithField("dv1"));
+ Directory directory = newDirectory();
+ IndexWriterConfig conf = newIndexWriterConfig(TEST_VERSION_CURRENT, null);
+ conf.setMergePolicy(newLogMergePolicy());
+ RandomIndexWriter iw = new RandomIndexWriter(random(), directory, conf);
+ Document doc = new Document();
+ doc.add(new StringField("id", "0", Field.Store.YES));
+ doc.add(new NumericDocValuesField("dv1", 0));
+ iw.addDocument(doc);
+ doc = new Document();
+ doc.add(new StringField("id", "1", Field.Store.YES));
+ iw.addDocument(doc);
+ iw.forceMerge(1);
+ iw.close();
+
+ IndexReader ir = DirectoryReader.open(directory);
+ assertEquals(1, ir.leaves().size());
+ AtomicReader ar = ir.leaves().get(0).reader();
+ NumericDocValues dv = ar.getNumericDocValues("dv1");
+ assertEquals(0, dv.get(0));
+ assertEquals(0, dv.get(1));
+ Bits docsWithField = ar.getDocsWithField("dv1");
+ assertTrue(docsWithField.get(0));
+ assertFalse(docsWithField.get(1));
+ ir.close();
+ directory.close();
+ }
+
+ public void testTwoNumbersOneMissingWithMerging() throws IOException {
+ assumeTrue("Codec does not support getDocsWithField", codecSupportsDocsWithField("dv1"));
+ Directory directory = newDirectory();
+ IndexWriterConfig conf = newIndexWriterConfig(TEST_VERSION_CURRENT, null);
+ conf.setMergePolicy(newLogMergePolicy());
+ RandomIndexWriter iw = new RandomIndexWriter(random(), directory, conf);
+ Document doc = new Document();
+ doc.add(new StringField("id", "0", Field.Store.YES));
+ doc.add(new NumericDocValuesField("dv1", 0));
+ iw.addDocument(doc);
+ iw.commit();
+ doc = new Document();
+ doc.add(new StringField("id", "1", Field.Store.YES));
+ iw.addDocument(doc);
+ iw.forceMerge(1);
+ iw.close();
+
+ IndexReader ir = DirectoryReader.open(directory);
+ assertEquals(1, ir.leaves().size());
+ AtomicReader ar = ir.leaves().get(0).reader();
+ NumericDocValues dv = ar.getNumericDocValues("dv1");
+ assertEquals(0, dv.get(0));
+ assertEquals(0, dv.get(1));
+ Bits docsWithField = ar.getDocsWithField("dv1");
+ assertTrue(docsWithField.get(0));
+ assertFalse(docsWithField.get(1));
+ ir.close();
+ directory.close();
+ }
+
+ public void testThreeNumbersOneMissingWithMerging() throws IOException {
+ assumeTrue("Codec does not support getDocsWithField", codecSupportsDocsWithField("dv1"));
+ Directory directory = newDirectory();
+ IndexWriterConfig conf = newIndexWriterConfig(TEST_VERSION_CURRENT, null);
+ conf.setMergePolicy(newLogMergePolicy());
+ RandomIndexWriter iw = new RandomIndexWriter(random(), directory, conf);
+ Document doc = new Document();
+ doc.add(new StringField("id", "0", Field.Store.YES));
+ doc.add(new NumericDocValuesField("dv1", 0));
+ iw.addDocument(doc);
+ doc = new Document();
+ doc.add(new StringField("id", "1", Field.Store.YES));
+ iw.addDocument(doc);
+ iw.commit();
+ doc = new Document();
+ doc.add(new StringField("id", "2", Field.Store.YES));
+ doc.add(new NumericDocValuesField("dv1", 5));
+ iw.addDocument(doc);
+ iw.forceMerge(1);
+ iw.close();
+
+ IndexReader ir = DirectoryReader.open(directory);
+ assertEquals(1, ir.leaves().size());
+ AtomicReader ar = ir.leaves().get(0).reader();
+ NumericDocValues dv = ar.getNumericDocValues("dv1");
+ assertEquals(0, dv.get(0));
+ assertEquals(0, dv.get(1));
+ assertEquals(5, dv.get(2));
+ Bits docsWithField = ar.getDocsWithField("dv1");
+ assertTrue(docsWithField.get(0));
+ assertFalse(docsWithField.get(1));
+ assertTrue(docsWithField.get(2));
+ ir.close();
+ directory.close();
+ }
+
+ public void testTwoBytesOneMissing() throws IOException {
+ assumeTrue("Codec does not support getDocsWithField", codecSupportsDocsWithField("dv1"));
+ Directory directory = newDirectory();
+ IndexWriterConfig conf = newIndexWriterConfig(TEST_VERSION_CURRENT, null);
+ conf.setMergePolicy(newLogMergePolicy());
+ RandomIndexWriter iw = new RandomIndexWriter(random(), directory, conf);
+ Document doc = new Document();
+ doc.add(new StringField("id", "0", Field.Store.YES));
+ doc.add(new BinaryDocValuesField("dv1", new BytesRef()));
+ iw.addDocument(doc);
+ doc = new Document();
+ doc.add(new StringField("id", "1", Field.Store.YES));
+ iw.addDocument(doc);
+ iw.forceMerge(1);
+ iw.close();
+
+ IndexReader ir = DirectoryReader.open(directory);
+ assertEquals(1, ir.leaves().size());
+ AtomicReader ar = ir.leaves().get(0).reader();
+ BinaryDocValues dv = ar.getBinaryDocValues("dv1");
+ BytesRef ref = new BytesRef();
+ dv.get(0, ref);
+ assertEquals(new BytesRef(), ref);
+ dv.get(1, ref);
+ assertEquals(new BytesRef(), ref);
+ Bits docsWithField = ar.getDocsWithField("dv1");
+ assertTrue(docsWithField.get(0));
+ assertFalse(docsWithField.get(1));
+ ir.close();
+ directory.close();
+ }
+
+ public void testTwoBytesOneMissingWithMerging() throws IOException {
+ assumeTrue("Codec does not support getDocsWithField", codecSupportsDocsWithField("dv1"));
+ Directory directory = newDirectory();
+ IndexWriterConfig conf = newIndexWriterConfig(TEST_VERSION_CURRENT, null);
+ conf.setMergePolicy(newLogMergePolicy());
+ RandomIndexWriter iw = new RandomIndexWriter(random(), directory, conf);
+ Document doc = new Document();
+ doc.add(new StringField("id", "0", Field.Store.YES));
+ doc.add(new BinaryDocValuesField("dv1", new BytesRef()));
+ iw.addDocument(doc);
+ iw.commit();
+ doc = new Document();
+ doc.add(new StringField("id", "1", Field.Store.YES));
+ iw.addDocument(doc);
+ iw.forceMerge(1);
+ iw.close();
+
+ IndexReader ir = DirectoryReader.open(directory);
+ assertEquals(1, ir.leaves().size());
+ AtomicReader ar = ir.leaves().get(0).reader();
+ BinaryDocValues dv = ar.getBinaryDocValues("dv1");
+ BytesRef ref = new BytesRef();
+ dv.get(0, ref);
+ assertEquals(new BytesRef(), ref);
+ dv.get(1, ref);
+ assertEquals(new BytesRef(), ref);
+ Bits docsWithField = ar.getDocsWithField("dv1");
+ assertTrue(docsWithField.get(0));
+ assertFalse(docsWithField.get(1));
+ ir.close();
+ directory.close();
+ }
+
+ public void testThreeBytesOneMissingWithMerging() throws IOException {
+ assumeTrue("Codec does not support getDocsWithField", codecSupportsDocsWithField("dv1"));
+ Directory directory = newDirectory();
+ IndexWriterConfig conf = newIndexWriterConfig(TEST_VERSION_CURRENT, null);
+ conf.setMergePolicy(newLogMergePolicy());
+ RandomIndexWriter iw = new RandomIndexWriter(random(), directory, conf);
+ Document doc = new Document();
+ doc.add(new StringField("id", "0", Field.Store.YES));
+ doc.add(new BinaryDocValuesField("dv1", new BytesRef()));
+ iw.addDocument(doc);
+ doc = new Document();
+ doc.add(new StringField("id", "1", Field.Store.YES));
+ iw.addDocument(doc);
+ iw.commit();
+ doc = new Document();
+ doc.add(new StringField("id", "2", Field.Store.YES));
+ doc.add(new BinaryDocValuesField("dv1", new BytesRef("boo")));
+ iw.addDocument(doc);
+ iw.forceMerge(1);
+ iw.close();
+
+ IndexReader ir = DirectoryReader.open(directory);
+ assertEquals(1, ir.leaves().size());
+ AtomicReader ar = ir.leaves().get(0).reader();
+ BinaryDocValues dv = ar.getBinaryDocValues("dv1");
+ BytesRef ref = new BytesRef();
+ dv.get(0, ref);
+ assertEquals(new BytesRef(), ref);
+ dv.get(1, ref);
+ assertEquals(new BytesRef(), ref);
+ dv.get(2, ref);
+ assertEquals(new BytesRef("boo"), ref);
+ Bits docsWithField = ar.getDocsWithField("dv1");
+ assertTrue(docsWithField.get(0));
+ assertFalse(docsWithField.get(1));
+ assertTrue(docsWithField.get(2));
+ ir.close();
+ directory.close();
+ }
}
Modified: lucene/dev/branches/lucene5178/lucene/test-framework/src/java/org/apache/lucene/index/FieldFilterAtomicReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5178/lucene/test-framework/src/java/org/apache/lucene/index/FieldFilterAtomicReader.java?rev=1514642&r1=1514641&r2=1514642&view=diff
==============================================================================
--- lucene/dev/branches/lucene5178/lucene/test-framework/src/java/org/apache/lucene/index/FieldFilterAtomicReader.java (original)
+++ lucene/dev/branches/lucene5178/lucene/test-framework/src/java/org/apache/lucene/index/FieldFilterAtomicReader.java Fri Aug 16 10:25:38 2013
@@ -22,6 +22,7 @@ import java.util.ArrayList;
import java.util.Iterator;
import java.util.Set;
+import org.apache.lucene.util.Bits;
import org.apache.lucene.util.FilterIterator;
/**
@@ -137,6 +138,11 @@ public final class FieldFilterAtomicRead
}
@Override
+ public Bits getDocsWithField(String field) throws IOException {
+ return hasField(field) ? super.getDocsWithField(field) : null;
+ }
+
+ @Override
public String toString() {
final StringBuilder sb = new StringBuilder("FieldFilterAtomicReader(reader=");
sb.append(in).append(", fields=");
Modified: lucene/dev/branches/lucene5178/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5178/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java?rev=1514642&r1=1514641&r2=1514642&view=diff
==============================================================================
--- lucene/dev/branches/lucene5178/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java (original)
+++ lucene/dev/branches/lucene5178/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java Fri Aug 16 10:25:38 2013
@@ -1368,6 +1368,13 @@ public abstract class LuceneTestCase ext
}
return true;
}
+
+ /** Returns true if the codec for the field "supports" docsWithField
+ * (other codecs return MatchAllBits, because you couldnt write missing values before) */
+ public static boolean codecSupportsDocsWithField(String field) {
+ // currently only one codec!
+ return _TestUtil.getDocValuesFormat(Codec.getDefault(), field).equals("SimpleText");
+ }
public void assertReaderEquals(String info, IndexReader leftReader, IndexReader rightReader) throws IOException {
assertReaderStatisticsEquals(info, leftReader, rightReader);
Modified: lucene/dev/branches/lucene5178/lucene/test-framework/src/java/org/apache/lucene/util/_TestUtil.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5178/lucene/test-framework/src/java/org/apache/lucene/util/_TestUtil.java?rev=1514642&r1=1514641&r2=1514642&view=diff
==============================================================================
--- lucene/dev/branches/lucene5178/lucene/test-framework/src/java/org/apache/lucene/util/_TestUtil.java (original)
+++ lucene/dev/branches/lucene5178/lucene/test-framework/src/java/org/apache/lucene/util/_TestUtil.java Fri Aug 16 10:25:38 2013
@@ -45,6 +45,7 @@ import org.apache.lucene.codecs.Codec;
import org.apache.lucene.codecs.DocValuesFormat;
import org.apache.lucene.codecs.PostingsFormat;
import org.apache.lucene.codecs.lucene42.Lucene42Codec;
+import org.apache.lucene.codecs.perfield.PerFieldDocValuesFormat;
import org.apache.lucene.codecs.perfield.PerFieldPostingsFormat;
import org.apache.lucene.document.BinaryDocValuesField;
import org.apache.lucene.document.Document;
@@ -742,6 +743,15 @@ public class _TestUtil {
return p.getName();
}
}
+
+ public static String getDocValuesFormat(Codec codec, String field) {
+ DocValuesFormat d = codec.docValuesFormat();
+ if (d instanceof PerFieldDocValuesFormat) {
+ return ((PerFieldDocValuesFormat)d).getDocValuesFormatForField(field).getName();
+ } else {
+ return d.getName();
+ }
+ }
public static boolean anyFilesExceptWriteLock(Directory dir) throws IOException {
String[] files = dir.listAll();
Modified: lucene/dev/branches/lucene5178/solr/core/src/java/org/apache/solr/request/DocValuesFacets.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5178/solr/core/src/java/org/apache/solr/request/DocValuesFacets.java?rev=1514642&r1=1514641&r2=1514642&view=diff
==============================================================================
--- lucene/dev/branches/lucene5178/solr/core/src/java/org/apache/solr/request/DocValuesFacets.java (original)
+++ lucene/dev/branches/lucene5178/solr/core/src/java/org/apache/solr/request/DocValuesFacets.java Fri Aug 16 10:25:38 2013
@@ -221,6 +221,7 @@ public class DocValuesFacets {
if (schemaField.multiValued()) {
missingCount = SimpleFacets.getFieldMissingCount(searcher,docs,schemaField.getName());
} else {
+ // nocommit: support missing count (ord = -1) for single-valued here.
missingCount = 0; // single-valued dv is implicitly 0
}
}
Modified: lucene/dev/branches/lucene5178/solr/core/src/test/org/apache/solr/search/TestDocSet.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5178/solr/core/src/test/org/apache/solr/search/TestDocSet.java?rev=1514642&r1=1514641&r2=1514642&view=diff
==============================================================================
--- lucene/dev/branches/lucene5178/solr/core/src/test/org/apache/solr/search/TestDocSet.java (original)
+++ lucene/dev/branches/lucene5178/solr/core/src/test/org/apache/solr/search/TestDocSet.java Fri Aug 16 10:25:38 2013
@@ -404,6 +404,11 @@ public class TestDocSet extends LuceneTe
}
@Override
+ public Bits getDocsWithField(String field) throws IOException {
+ return null;
+ }
+
+ @Override
public NumericDocValues getNormValues(String field) {
return null;
}