mirror of https://github.com/apache/lucene.git
beef up tests
git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene5178@1515686 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
3b49cf1c86
commit
cf0078a686
|
@ -28,7 +28,6 @@ import java.util.Locale;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.apache.lucene.codecs.DocValuesProducer;
|
import org.apache.lucene.codecs.DocValuesProducer;
|
||||||
import org.apache.lucene.codecs.DocValuesProducer.SortedSetDocsWithField;
|
|
||||||
import org.apache.lucene.index.BinaryDocValues;
|
import org.apache.lucene.index.BinaryDocValues;
|
||||||
import org.apache.lucene.index.CorruptIndexException;
|
import org.apache.lucene.index.CorruptIndexException;
|
||||||
import org.apache.lucene.index.FieldInfo;
|
import org.apache.lucene.index.FieldInfo;
|
||||||
|
@ -431,16 +430,17 @@ class SimpleTextDocValuesReader extends DocValuesProducer {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Bits getDocsWithField(FieldInfo field) throws IOException {
|
public Bits getDocsWithField(FieldInfo field) throws IOException {
|
||||||
if (field.getDocValuesType() == FieldInfo.DocValuesType.SORTED_SET) {
|
switch (field.getDocValuesType()) {
|
||||||
return new SortedSetDocsWithField(getSortedSet(field), maxDoc);
|
case SORTED_SET:
|
||||||
} else if (field.getDocValuesType() == FieldInfo.DocValuesType.SORTED) {
|
return new SortedSetDocsWithField(getSortedSet(field), maxDoc);
|
||||||
return new SortedDocsWithField(getSorted(field), maxDoc);
|
case SORTED:
|
||||||
} else if (field.getDocValuesType() == FieldInfo.DocValuesType.BINARY) {
|
return new SortedDocsWithField(getSorted(field), maxDoc);
|
||||||
return getBinaryDocsWithField(field);
|
case BINARY:
|
||||||
} else if (field.getDocValuesType() == FieldInfo.DocValuesType.NUMERIC) {
|
return getBinaryDocsWithField(field);
|
||||||
return getNumericDocsWithField(field);
|
case NUMERIC:
|
||||||
} else {
|
return getNumericDocsWithField(field);
|
||||||
return new Bits.MatchAllBits(maxDoc);
|
default:
|
||||||
|
throw new AssertionError();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -175,28 +175,6 @@ public class AssertingDocValuesFormat extends DocValuesFormat {
|
||||||
checkIterator(ords.iterator(), ordCount, false);
|
checkIterator(ords.iterator(), ordCount, false);
|
||||||
in.addSortedSetField(field, values, docToOrdCount, ords);
|
in.addSortedSetField(field, values, docToOrdCount, ords);
|
||||||
}
|
}
|
||||||
|
|
||||||
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 allowNull || v != null;
|
|
||||||
try {
|
|
||||||
iterator.remove();
|
|
||||||
throw new AssertionError("broken iterator (supports remove): " + iterator);
|
|
||||||
} catch (UnsupportedOperationException expected) {
|
|
||||||
// ok
|
|
||||||
}
|
|
||||||
}
|
|
||||||
assert !iterator.hasNext();
|
|
||||||
try {
|
|
||||||
iterator.next();
|
|
||||||
throw new AssertionError("broken iterator (allows next() when hasNext==false) " + iterator);
|
|
||||||
} catch (NoSuchElementException expected) {
|
|
||||||
// ok
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void close() throws IOException {
|
public void close() throws IOException {
|
||||||
|
@ -204,6 +182,70 @@ public class AssertingDocValuesFormat extends DocValuesFormat {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static class AssertingNormsConsumer extends DocValuesConsumer {
|
||||||
|
private final DocValuesConsumer in;
|
||||||
|
private final int maxDoc;
|
||||||
|
|
||||||
|
AssertingNormsConsumer(DocValuesConsumer in, int maxDoc) {
|
||||||
|
this.in = in;
|
||||||
|
this.maxDoc = maxDoc;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
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, false);
|
||||||
|
in.addNumericField(field, values);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() throws IOException {
|
||||||
|
in.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addBinaryField(FieldInfo field, Iterable<BytesRef> values) throws IOException {
|
||||||
|
throw new IllegalStateException();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addSortedField(FieldInfo field, Iterable<BytesRef> values, Iterable<Number> docToOrd) throws IOException {
|
||||||
|
throw new IllegalStateException();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addSortedSetField(FieldInfo field, Iterable<BytesRef> values, Iterable<Number> docToOrdCount, Iterable<Number> ords) throws IOException {
|
||||||
|
throw new IllegalStateException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static <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 allowNull || v != null;
|
||||||
|
try {
|
||||||
|
iterator.remove();
|
||||||
|
throw new AssertionError("broken iterator (supports remove): " + iterator);
|
||||||
|
} catch (UnsupportedOperationException expected) {
|
||||||
|
// ok
|
||||||
|
}
|
||||||
|
}
|
||||||
|
assert !iterator.hasNext();
|
||||||
|
try {
|
||||||
|
iterator.next();
|
||||||
|
throw new AssertionError("broken iterator (allows next() when hasNext==false) " + iterator);
|
||||||
|
} catch (NoSuchElementException expected) {
|
||||||
|
// ok
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static class AssertingDocValuesProducer extends DocValuesProducer {
|
static class AssertingDocValuesProducer extends DocValuesProducer {
|
||||||
private final DocValuesProducer in;
|
private final DocValuesProducer in;
|
||||||
private final int maxDoc;
|
private final int maxDoc;
|
||||||
|
@ -252,7 +294,7 @@ public class AssertingDocValuesFormat extends DocValuesFormat {
|
||||||
Bits bits = in.getDocsWithField(field);
|
Bits bits = in.getDocsWithField(field);
|
||||||
assert bits != null;
|
assert bits != null;
|
||||||
assert bits.length() == maxDoc;
|
assert bits.length() == maxDoc;
|
||||||
return bits; // TODO: add AssertingBits w/ bounds check
|
return new AssertingAtomicReader.AssertingBits(bits);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -22,7 +22,7 @@ import java.io.IOException;
|
||||||
import org.apache.lucene.codecs.DocValuesConsumer;
|
import org.apache.lucene.codecs.DocValuesConsumer;
|
||||||
import org.apache.lucene.codecs.DocValuesProducer;
|
import org.apache.lucene.codecs.DocValuesProducer;
|
||||||
import org.apache.lucene.codecs.NormsFormat;
|
import org.apache.lucene.codecs.NormsFormat;
|
||||||
import org.apache.lucene.codecs.asserting.AssertingDocValuesFormat.AssertingDocValuesConsumer;
|
import org.apache.lucene.codecs.asserting.AssertingDocValuesFormat.AssertingNormsConsumer;
|
||||||
import org.apache.lucene.codecs.asserting.AssertingDocValuesFormat.AssertingDocValuesProducer;
|
import org.apache.lucene.codecs.asserting.AssertingDocValuesFormat.AssertingDocValuesProducer;
|
||||||
import org.apache.lucene.codecs.lucene42.Lucene42NormsFormat;
|
import org.apache.lucene.codecs.lucene42.Lucene42NormsFormat;
|
||||||
import org.apache.lucene.index.SegmentReadState;
|
import org.apache.lucene.index.SegmentReadState;
|
||||||
|
@ -38,7 +38,7 @@ public class AssertingNormsFormat extends NormsFormat {
|
||||||
public DocValuesConsumer normsConsumer(SegmentWriteState state) throws IOException {
|
public DocValuesConsumer normsConsumer(SegmentWriteState state) throws IOException {
|
||||||
DocValuesConsumer consumer = in.normsConsumer(state);
|
DocValuesConsumer consumer = in.normsConsumer(state);
|
||||||
assert consumer != null;
|
assert consumer != null;
|
||||||
return new AssertingDocValuesConsumer(consumer, state.segmentInfo.getDocCount());
|
return new AssertingNormsConsumer(consumer, state.segmentInfo.getDocCount());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -607,12 +607,33 @@ public class AssertingAtomicReader extends FilterAtomicReader {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Wraps a Bits but with additional asserts */
|
||||||
|
public static class AssertingBits implements Bits {
|
||||||
|
final Bits in;
|
||||||
|
|
||||||
|
public AssertingBits(Bits in) {
|
||||||
|
this.in = in;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean get(int index) {
|
||||||
|
assert index >= 0 && index < length();
|
||||||
|
return in.get(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int length() {
|
||||||
|
return in.length();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Bits getLiveDocs() {
|
public Bits getLiveDocs() {
|
||||||
Bits liveDocs = super.getLiveDocs();
|
Bits liveDocs = super.getLiveDocs();
|
||||||
if (liveDocs != null) {
|
if (liveDocs != null) {
|
||||||
assert maxDoc() == liveDocs.length();
|
assert maxDoc() == liveDocs.length();
|
||||||
|
liveDocs = new AssertingBits(liveDocs);
|
||||||
} else {
|
} else {
|
||||||
assert maxDoc() == numDocs();
|
assert maxDoc() == numDocs();
|
||||||
assert !hasDeletions();
|
assert !hasDeletions();
|
||||||
|
@ -628,6 +649,7 @@ public class AssertingAtomicReader extends FilterAtomicReader {
|
||||||
assert fi != null;
|
assert fi != null;
|
||||||
assert fi.hasDocValues();
|
assert fi.hasDocValues();
|
||||||
assert maxDoc() == docsWithField.length();
|
assert maxDoc() == docsWithField.length();
|
||||||
|
docsWithField = new AssertingBits(docsWithField);
|
||||||
} else {
|
} else {
|
||||||
assert fi == null || fi.hasDocValues() == false;
|
assert fi == null || fi.hasDocValues() == false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,6 +26,7 @@ import java.util.Map.Entry;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.TreeSet;
|
import java.util.TreeSet;
|
||||||
|
import java.util.concurrent.CountDownLatch;
|
||||||
|
|
||||||
import org.apache.lucene.analysis.Analyzer;
|
import org.apache.lucene.analysis.Analyzer;
|
||||||
import org.apache.lucene.analysis.MockAnalyzer;
|
import org.apache.lucene.analysis.MockAnalyzer;
|
||||||
|
@ -673,7 +674,7 @@ public abstract class BaseDocValuesFormatTestCase extends LuceneTestCase {
|
||||||
iwriter.close();
|
iwriter.close();
|
||||||
|
|
||||||
SortedDocValues dv = getOnlySegmentReader(ireader).getSortedDocValues("field");
|
SortedDocValues dv = getOnlySegmentReader(ireader).getSortedDocValues("field");
|
||||||
if (codecSupportsDocsWithField("field")) {
|
if (defaultCodecSupportsDocsWithField()) {
|
||||||
assertEquals(-1, dv.getOrd(0));
|
assertEquals(-1, dv.getOrd(0));
|
||||||
assertEquals(0, dv.getValueCount());
|
assertEquals(0, dv.getValueCount());
|
||||||
} else {
|
} else {
|
||||||
|
@ -733,7 +734,7 @@ public abstract class BaseDocValuesFormatTestCase extends LuceneTestCase {
|
||||||
BytesRef scratch = new BytesRef();
|
BytesRef scratch = new BytesRef();
|
||||||
dv.lookupOrd(dv.getOrd(0), scratch);
|
dv.lookupOrd(dv.getOrd(0), scratch);
|
||||||
assertEquals(new BytesRef("hello world 2"), scratch);
|
assertEquals(new BytesRef("hello world 2"), scratch);
|
||||||
if (codecSupportsDocsWithField("dv")) {
|
if (defaultCodecSupportsDocsWithField()) {
|
||||||
assertEquals(-1, dv.getOrd(1));
|
assertEquals(-1, dv.getOrd(1));
|
||||||
}
|
}
|
||||||
dv.get(1, scratch);
|
dv.get(1, scratch);
|
||||||
|
@ -1115,7 +1116,7 @@ public abstract class BaseDocValuesFormatTestCase extends LuceneTestCase {
|
||||||
doc.add(newTextField("id", "noValue", Field.Store.YES));
|
doc.add(newTextField("id", "noValue", Field.Store.YES));
|
||||||
w.addDocument(doc);
|
w.addDocument(doc);
|
||||||
}
|
}
|
||||||
if (!codecSupportsDocsWithField("field")) {
|
if (!defaultCodecSupportsDocsWithField()) {
|
||||||
BytesRef bytesRef = new BytesRef();
|
BytesRef bytesRef = new BytesRef();
|
||||||
hash.add(bytesRef); // add empty value for the gaps
|
hash.add(bytesRef); // add empty value for the gaps
|
||||||
}
|
}
|
||||||
|
@ -1242,7 +1243,7 @@ public abstract class BaseDocValuesFormatTestCase extends LuceneTestCase {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void doTestMissingVsFieldCache(LongProducer longs) throws Exception {
|
private void doTestMissingVsFieldCache(LongProducer longs) throws Exception {
|
||||||
assumeTrue("Codec does not support getDocsWithField", codecSupportsDocsWithField("dv"));
|
assumeTrue("Codec does not support getDocsWithField", defaultCodecSupportsDocsWithField());
|
||||||
Directory dir = newDirectory();
|
Directory dir = newDirectory();
|
||||||
IndexWriterConfig conf = newIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(random()));
|
IndexWriterConfig conf = newIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(random()));
|
||||||
RandomIndexWriter writer = new RandomIndexWriter(random(), dir, conf);
|
RandomIndexWriter writer = new RandomIndexWriter(random(), dir, conf);
|
||||||
|
@ -2345,7 +2346,7 @@ public abstract class BaseDocValuesFormatTestCase extends LuceneTestCase {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testTwoNumbersOneMissing() throws IOException {
|
public void testTwoNumbersOneMissing() throws IOException {
|
||||||
assumeTrue("Codec does not support getDocsWithField", codecSupportsDocsWithField("dv1"));
|
assumeTrue("Codec does not support getDocsWithField", defaultCodecSupportsDocsWithField());
|
||||||
Directory directory = newDirectory();
|
Directory directory = newDirectory();
|
||||||
IndexWriterConfig conf = newIndexWriterConfig(TEST_VERSION_CURRENT, null);
|
IndexWriterConfig conf = newIndexWriterConfig(TEST_VERSION_CURRENT, null);
|
||||||
conf.setMergePolicy(newLogMergePolicy());
|
conf.setMergePolicy(newLogMergePolicy());
|
||||||
|
@ -2374,7 +2375,7 @@ public abstract class BaseDocValuesFormatTestCase extends LuceneTestCase {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testTwoNumbersOneMissingWithMerging() throws IOException {
|
public void testTwoNumbersOneMissingWithMerging() throws IOException {
|
||||||
assumeTrue("Codec does not support getDocsWithField", codecSupportsDocsWithField("dv1"));
|
assumeTrue("Codec does not support getDocsWithField", defaultCodecSupportsDocsWithField());
|
||||||
Directory directory = newDirectory();
|
Directory directory = newDirectory();
|
||||||
IndexWriterConfig conf = newIndexWriterConfig(TEST_VERSION_CURRENT, null);
|
IndexWriterConfig conf = newIndexWriterConfig(TEST_VERSION_CURRENT, null);
|
||||||
conf.setMergePolicy(newLogMergePolicy());
|
conf.setMergePolicy(newLogMergePolicy());
|
||||||
|
@ -2404,7 +2405,7 @@ public abstract class BaseDocValuesFormatTestCase extends LuceneTestCase {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testThreeNumbersOneMissingWithMerging() throws IOException {
|
public void testThreeNumbersOneMissingWithMerging() throws IOException {
|
||||||
assumeTrue("Codec does not support getDocsWithField", codecSupportsDocsWithField("dv1"));
|
assumeTrue("Codec does not support getDocsWithField", defaultCodecSupportsDocsWithField());
|
||||||
Directory directory = newDirectory();
|
Directory directory = newDirectory();
|
||||||
IndexWriterConfig conf = newIndexWriterConfig(TEST_VERSION_CURRENT, null);
|
IndexWriterConfig conf = newIndexWriterConfig(TEST_VERSION_CURRENT, null);
|
||||||
conf.setMergePolicy(newLogMergePolicy());
|
conf.setMergePolicy(newLogMergePolicy());
|
||||||
|
@ -2440,7 +2441,7 @@ public abstract class BaseDocValuesFormatTestCase extends LuceneTestCase {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testTwoBytesOneMissing() throws IOException {
|
public void testTwoBytesOneMissing() throws IOException {
|
||||||
assumeTrue("Codec does not support getDocsWithField", codecSupportsDocsWithField("dv1"));
|
assumeTrue("Codec does not support getDocsWithField", defaultCodecSupportsDocsWithField());
|
||||||
Directory directory = newDirectory();
|
Directory directory = newDirectory();
|
||||||
IndexWriterConfig conf = newIndexWriterConfig(TEST_VERSION_CURRENT, null);
|
IndexWriterConfig conf = newIndexWriterConfig(TEST_VERSION_CURRENT, null);
|
||||||
conf.setMergePolicy(newLogMergePolicy());
|
conf.setMergePolicy(newLogMergePolicy());
|
||||||
|
@ -2472,7 +2473,7 @@ public abstract class BaseDocValuesFormatTestCase extends LuceneTestCase {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testTwoBytesOneMissingWithMerging() throws IOException {
|
public void testTwoBytesOneMissingWithMerging() throws IOException {
|
||||||
assumeTrue("Codec does not support getDocsWithField", codecSupportsDocsWithField("dv1"));
|
assumeTrue("Codec does not support getDocsWithField", defaultCodecSupportsDocsWithField());
|
||||||
Directory directory = newDirectory();
|
Directory directory = newDirectory();
|
||||||
IndexWriterConfig conf = newIndexWriterConfig(TEST_VERSION_CURRENT, null);
|
IndexWriterConfig conf = newIndexWriterConfig(TEST_VERSION_CURRENT, null);
|
||||||
conf.setMergePolicy(newLogMergePolicy());
|
conf.setMergePolicy(newLogMergePolicy());
|
||||||
|
@ -2505,7 +2506,7 @@ public abstract class BaseDocValuesFormatTestCase extends LuceneTestCase {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testThreeBytesOneMissingWithMerging() throws IOException {
|
public void testThreeBytesOneMissingWithMerging() throws IOException {
|
||||||
assumeTrue("Codec does not support getDocsWithField", codecSupportsDocsWithField("dv1"));
|
assumeTrue("Codec does not support getDocsWithField", defaultCodecSupportsDocsWithField());
|
||||||
Directory directory = newDirectory();
|
Directory directory = newDirectory();
|
||||||
IndexWriterConfig conf = newIndexWriterConfig(TEST_VERSION_CURRENT, null);
|
IndexWriterConfig conf = newIndexWriterConfig(TEST_VERSION_CURRENT, null);
|
||||||
conf.setMergePolicy(newLogMergePolicy());
|
conf.setMergePolicy(newLogMergePolicy());
|
||||||
|
@ -2709,6 +2710,243 @@ public abstract class BaseDocValuesFormatTestCase extends LuceneTestCase {
|
||||||
ar.close();
|
ar.close();
|
||||||
d.close();
|
d.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Tests dv against stored fields with threads (binary/numeric/sorted, no missing) */
|
||||||
|
public void testThreads() throws Exception {
|
||||||
|
Directory dir = newDirectory();
|
||||||
|
IndexWriterConfig conf = newIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(random()));
|
||||||
|
RandomIndexWriter writer = new RandomIndexWriter(random(), dir, conf);
|
||||||
|
Document doc = new Document();
|
||||||
|
Field idField = new StringField("id", "", Field.Store.NO);
|
||||||
|
Field storedBinField = new StoredField("storedBin", new byte[0]);
|
||||||
|
Field dvBinField = new BinaryDocValuesField("dvBin", new BytesRef());
|
||||||
|
Field dvSortedField = new SortedDocValuesField("dvSorted", new BytesRef());
|
||||||
|
Field storedNumericField = new StoredField("storedNum", "");
|
||||||
|
Field dvNumericField = new NumericDocValuesField("dvNum", 0);
|
||||||
|
doc.add(idField);
|
||||||
|
doc.add(storedBinField);
|
||||||
|
doc.add(dvBinField);
|
||||||
|
doc.add(dvSortedField);
|
||||||
|
doc.add(storedNumericField);
|
||||||
|
doc.add(dvNumericField);
|
||||||
|
|
||||||
|
// index some docs
|
||||||
|
int numDocs = atLeast(300);
|
||||||
|
for (int i = 0; i < numDocs; i++) {
|
||||||
|
idField.setStringValue(Integer.toString(i));
|
||||||
|
int length = _TestUtil.nextInt(random(), 0, 8);
|
||||||
|
byte buffer[] = new byte[length];
|
||||||
|
random().nextBytes(buffer);
|
||||||
|
storedBinField.setBytesValue(buffer);
|
||||||
|
dvBinField.setBytesValue(buffer);
|
||||||
|
dvSortedField.setBytesValue(buffer);
|
||||||
|
long numericValue = random().nextLong();
|
||||||
|
storedNumericField.setStringValue(Long.toString(numericValue));
|
||||||
|
dvNumericField.setLongValue(numericValue);
|
||||||
|
writer.addDocument(doc);
|
||||||
|
if (random().nextInt(31) == 0) {
|
||||||
|
writer.commit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// delete some docs
|
||||||
|
int numDeletions = random().nextInt(numDocs/10);
|
||||||
|
for (int i = 0; i < numDeletions; i++) {
|
||||||
|
int id = random().nextInt(numDocs);
|
||||||
|
writer.deleteDocuments(new Term("id", Integer.toString(id)));
|
||||||
|
}
|
||||||
|
writer.close();
|
||||||
|
|
||||||
|
// compare
|
||||||
|
final DirectoryReader ir = DirectoryReader.open(dir);
|
||||||
|
int numThreads = _TestUtil.nextInt(random(), 2, 7);
|
||||||
|
Thread threads[] = new Thread[numThreads];
|
||||||
|
final CountDownLatch startingGun = new CountDownLatch(1);
|
||||||
|
|
||||||
|
for (int i = 0; i < threads.length; i++) {
|
||||||
|
threads[i] = new Thread() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
try {
|
||||||
|
startingGun.await();
|
||||||
|
for (AtomicReaderContext context : ir.leaves()) {
|
||||||
|
AtomicReader r = context.reader();
|
||||||
|
BinaryDocValues binaries = r.getBinaryDocValues("dvBin");
|
||||||
|
SortedDocValues sorted = r.getSortedDocValues("dvSorted");
|
||||||
|
NumericDocValues numerics = r.getNumericDocValues("dvNum");
|
||||||
|
for (int j = 0; j < r.maxDoc(); j++) {
|
||||||
|
BytesRef binaryValue = r.document(j).getBinaryValue("storedBin");
|
||||||
|
BytesRef scratch = new BytesRef();
|
||||||
|
binaries.get(j, scratch);
|
||||||
|
assertEquals(binaryValue, scratch);
|
||||||
|
sorted.get(j, scratch);
|
||||||
|
assertEquals(binaryValue, scratch);
|
||||||
|
String expected = r.document(j).get("storedNum");
|
||||||
|
assertEquals(Long.parseLong(expected), numerics.get(j));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_TestUtil.checkReader(ir);
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
threads[i].start();
|
||||||
|
}
|
||||||
|
startingGun.countDown();
|
||||||
|
for (Thread t : threads) {
|
||||||
|
t.join();
|
||||||
|
}
|
||||||
|
ir.close();
|
||||||
|
dir.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Tests dv against stored fields with threads (all types + missing) */
|
||||||
|
public void testThreads2() throws Exception {
|
||||||
|
assumeTrue("Codec does not support getDocsWithField", defaultCodecSupportsDocsWithField());
|
||||||
|
assumeTrue("Codec does not support SORTED_SET", defaultCodecSupportsSortedSet());
|
||||||
|
Directory dir = newDirectory();
|
||||||
|
IndexWriterConfig conf = newIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(random()));
|
||||||
|
RandomIndexWriter writer = new RandomIndexWriter(random(), dir, conf);
|
||||||
|
Field idField = new StringField("id", "", Field.Store.NO);
|
||||||
|
Field storedBinField = new StoredField("storedBin", new byte[0]);
|
||||||
|
Field dvBinField = new BinaryDocValuesField("dvBin", new BytesRef());
|
||||||
|
Field dvSortedField = new SortedDocValuesField("dvSorted", new BytesRef());
|
||||||
|
Field storedNumericField = new StoredField("storedNum", "");
|
||||||
|
Field dvNumericField = new NumericDocValuesField("dvNum", 0);
|
||||||
|
|
||||||
|
// index some docs
|
||||||
|
int numDocs = atLeast(300);
|
||||||
|
for (int i = 0; i < numDocs; i++) {
|
||||||
|
idField.setStringValue(Integer.toString(i));
|
||||||
|
int length = _TestUtil.nextInt(random(), 0, 8);
|
||||||
|
byte buffer[] = new byte[length];
|
||||||
|
random().nextBytes(buffer);
|
||||||
|
storedBinField.setBytesValue(buffer);
|
||||||
|
dvBinField.setBytesValue(buffer);
|
||||||
|
dvSortedField.setBytesValue(buffer);
|
||||||
|
long numericValue = random().nextLong();
|
||||||
|
storedNumericField.setStringValue(Long.toString(numericValue));
|
||||||
|
dvNumericField.setLongValue(numericValue);
|
||||||
|
Document doc = new Document();
|
||||||
|
doc.add(idField);
|
||||||
|
if (random().nextInt(4) > 0) {
|
||||||
|
doc.add(storedBinField);
|
||||||
|
doc.add(dvBinField);
|
||||||
|
doc.add(dvSortedField);
|
||||||
|
}
|
||||||
|
if (random().nextInt(4) > 0) {
|
||||||
|
doc.add(storedNumericField);
|
||||||
|
doc.add(dvNumericField);
|
||||||
|
}
|
||||||
|
int numSortedSetFields = random().nextInt(3);
|
||||||
|
Set<String> values = new TreeSet<String>();
|
||||||
|
for (int j = 0; j < numSortedSetFields; j++) {
|
||||||
|
values.add(_TestUtil.randomSimpleString(random()));
|
||||||
|
}
|
||||||
|
for (String v : values) {
|
||||||
|
doc.add(new SortedSetDocValuesField("dvSortedSet", new BytesRef(v)));
|
||||||
|
doc.add(new StoredField("storedSortedSet", v));
|
||||||
|
}
|
||||||
|
writer.addDocument(doc);
|
||||||
|
if (random().nextInt(31) == 0) {
|
||||||
|
writer.commit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// delete some docs
|
||||||
|
int numDeletions = random().nextInt(numDocs/10);
|
||||||
|
for (int i = 0; i < numDeletions; i++) {
|
||||||
|
int id = random().nextInt(numDocs);
|
||||||
|
writer.deleteDocuments(new Term("id", Integer.toString(id)));
|
||||||
|
}
|
||||||
|
writer.close();
|
||||||
|
|
||||||
|
// compare
|
||||||
|
final DirectoryReader ir = DirectoryReader.open(dir);
|
||||||
|
int numThreads = _TestUtil.nextInt(random(), 2, 7);
|
||||||
|
Thread threads[] = new Thread[numThreads];
|
||||||
|
final CountDownLatch startingGun = new CountDownLatch(1);
|
||||||
|
|
||||||
|
for (int i = 0; i < threads.length; i++) {
|
||||||
|
threads[i] = new Thread() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
try {
|
||||||
|
startingGun.await();
|
||||||
|
for (AtomicReaderContext context : ir.leaves()) {
|
||||||
|
AtomicReader r = context.reader();
|
||||||
|
BinaryDocValues binaries = r.getBinaryDocValues("dvBin");
|
||||||
|
Bits binaryBits = r.getDocsWithField("dvBin");
|
||||||
|
SortedDocValues sorted = r.getSortedDocValues("dvSorted");
|
||||||
|
Bits sortedBits = r.getDocsWithField("dvSorted");
|
||||||
|
NumericDocValues numerics = r.getNumericDocValues("dvNum");
|
||||||
|
Bits numericBits = r.getDocsWithField("dvNum");
|
||||||
|
SortedSetDocValues sortedSet = r.getSortedSetDocValues("dvSortedSet");
|
||||||
|
Bits sortedSetBits = r.getDocsWithField("dvSortedSet");
|
||||||
|
for (int j = 0; j < r.maxDoc(); j++) {
|
||||||
|
BytesRef binaryValue = r.document(j).getBinaryValue("storedBin");
|
||||||
|
if (binaryValue != null) {
|
||||||
|
if (binaries != null) {
|
||||||
|
BytesRef scratch = new BytesRef();
|
||||||
|
binaries.get(j, scratch);
|
||||||
|
assertEquals(binaryValue, scratch);
|
||||||
|
sorted.get(j, scratch);
|
||||||
|
assertEquals(binaryValue, scratch);
|
||||||
|
assertTrue(binaryBits.get(j));
|
||||||
|
assertTrue(sortedBits.get(j));
|
||||||
|
}
|
||||||
|
} else if (binaries != null) {
|
||||||
|
assertFalse(binaryBits.get(j));
|
||||||
|
assertFalse(sortedBits.get(j));
|
||||||
|
assertEquals(-1, sorted.getOrd(j));
|
||||||
|
}
|
||||||
|
|
||||||
|
String number = r.document(j).get("storedNum");
|
||||||
|
if (number != null) {
|
||||||
|
if (numerics != null) {
|
||||||
|
assertEquals(Long.parseLong(number), numerics.get(j));
|
||||||
|
}
|
||||||
|
} else if (numerics != null) {
|
||||||
|
assertFalse(numericBits.get(j));
|
||||||
|
assertEquals(0, numerics.get(j));
|
||||||
|
}
|
||||||
|
|
||||||
|
String values[] = r.document(j).getValues("storedSortedSet");
|
||||||
|
if (values.length > 0) {
|
||||||
|
assertNotNull(sortedSet);
|
||||||
|
sortedSet.setDocument(j);
|
||||||
|
for (int i = 0; i < values.length; i++) {
|
||||||
|
long ord = sortedSet.nextOrd();
|
||||||
|
assertTrue(ord != SortedSetDocValues.NO_MORE_ORDS);
|
||||||
|
BytesRef value = new BytesRef();
|
||||||
|
sortedSet.lookupOrd(ord, value);
|
||||||
|
assertEquals(values[i], value.utf8ToString());
|
||||||
|
}
|
||||||
|
assertEquals(SortedSetDocValues.NO_MORE_ORDS, sortedSet.nextOrd());
|
||||||
|
assertTrue(sortedSetBits.get(j));
|
||||||
|
} else if (sortedSet != null) {
|
||||||
|
sortedSet.setDocument(j);
|
||||||
|
assertEquals(SortedSetDocValues.NO_MORE_ORDS, sortedSet.nextOrd());
|
||||||
|
assertFalse(sortedSetBits.get(j));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_TestUtil.checkReader(ir);
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
threads[i].start();
|
||||||
|
}
|
||||||
|
startingGun.countDown();
|
||||||
|
for (Thread t : threads) {
|
||||||
|
t.join();
|
||||||
|
}
|
||||||
|
ir.close();
|
||||||
|
dir.close();
|
||||||
|
}
|
||||||
|
|
||||||
protected boolean codecAcceptsHugeBinaryValues(String field) {
|
protected boolean codecAcceptsHugeBinaryValues(String field) {
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -1369,11 +1369,11 @@ public abstract class LuceneTestCase extends Assert {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Returns true if the codec for the field "supports" docsWithField
|
/** Returns true if the codec "supports" docsWithField
|
||||||
* (other codecs return MatchAllBits, because you couldnt write missing values before) */
|
* (other codecs return MatchAllBits, because you couldnt write missing values before) */
|
||||||
public static boolean codecSupportsDocsWithField(String field) {
|
public static boolean defaultCodecSupportsDocsWithField() {
|
||||||
String name = _TestUtil.getDocValuesFormat(Codec.getDefault(), field);
|
String name = Codec.getDefault().getName();
|
||||||
if (name.equals("Lucene40") || name.equals("Lucene42")) {
|
if (name.equals("Lucene40") || name.equals("Lucene41") || name.equals("Lucene42")) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|
Loading…
Reference in New Issue