SOLR-10047: Move test into its own test class and force use of NoMergePolicy to fix test failures

This closes #195
This commit is contained in:
Shalin Shekhar Mangar 2017-04-25 00:26:21 +05:30
parent c09d82e538
commit 56e1ad484a
2 changed files with 136 additions and 72 deletions

View File

@ -25,14 +25,10 @@ import java.util.List;
import java.util.function.Function;
import java.util.function.Supplier;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.DocValuesType;
import org.apache.lucene.index.FieldInfos;
import org.apache.lucene.index.IndexableField;
import org.apache.lucene.index.LeafReader;
import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.index.MultiFields;
import org.apache.lucene.index.NumericDocValues;
import org.apache.lucene.index.SortedDocValues;
import org.apache.lucene.queries.function.FunctionValues;
@ -155,74 +151,6 @@ public class DocValuesTest extends SolrTestCaseJ4 {
}
}
public void testHalfAndHalfDocValues() throws Exception {
// Insert two docs without docvalues
String fieldname = "string_add_dv_later";
assertU(adoc("id", "3", fieldname, "c"));
assertU(commit());
assertU(adoc("id", "1", fieldname, "a"));
assertU(commit());
try (SolrCore core = h.getCoreInc()) {
assertFalse(core.getLatestSchema().getField(fieldname).hasDocValues());
// Add docvalues to the field type
IndexSchema schema = core.getLatestSchema();
SchemaField oldField = schema.getField(fieldname);
int newProperties = oldField.getProperties() | SchemaField.DOC_VALUES;
SchemaField sf = new SchemaField( fieldname, oldField.getType(), newProperties, null);
schema.getFields().put( fieldname, sf );
// Insert a new doc with docvalues
assertU(adoc("id", "2", fieldname, "b"));
assertU(commit());
// Check there are a mix of segments with and without docvalues
final RefCounted<SolrIndexSearcher> searcherRef = core.openNewSearcher(true, true);
final SolrIndexSearcher searcher = searcherRef.get();
try {
final DirectoryReader topReader = searcher.getRawReader();
//Assert no merges
assertEquals(3, topReader.numDocs());
assertEquals(3, topReader.leaves().size());
final FieldInfos infos = MultiFields.getMergedFieldInfos(topReader);
//The global field type should have docValues because a document with dvs was added
assertEquals(DocValuesType.SORTED, infos.fieldInfo(fieldname).getDocValuesType());
for(LeafReaderContext ctx: topReader.leaves()) {
LeafReader r = ctx.reader();
//Make sure there were no merges
assertEquals(1, r.numDocs());
Document doc = r.document(0);
String id = doc.getField("id").stringValue();
if(id.equals("1") || id.equals("3")) {
assertEquals(DocValuesType.NONE, r.getFieldInfos().fieldInfo(fieldname).getDocValuesType());
} else {
assertEquals(DocValuesType.SORTED, r.getFieldInfos().fieldInfo(fieldname).getDocValuesType());
}
}
} finally {
searcherRef.decref();
}
}
// Assert sort order is correct
assertQ(req("q", "string_add_dv_later:*", "sort", "string_add_dv_later asc"),
"//*[@numFound='3']",
"//result/doc[1]/int[@name='id'][.=1]",
"//result/doc[2]/int[@name='id'][.=2]",
"//result/doc[3]/int[@name='id'][.=3]"
);
}
private void tstToObj(SchemaField sf, Object o) {
List<IndexableField> fields = sf.createFields(o);
for (IndexableField field : fields) {

View File

@ -0,0 +1,136 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.solr.schema;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.DocValuesType;
import org.apache.lucene.index.FieldInfos;
import org.apache.lucene.index.LeafReader;
import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.index.MultiFields;
import org.apache.solr.SolrTestCaseJ4;
import org.apache.solr.core.SolrCore;
import org.apache.solr.index.NoMergePolicyFactory;
import org.apache.solr.search.SolrIndexSearcher;
import org.apache.solr.util.RefCounted;
import org.junit.BeforeClass;
/**
* Added in SOLR-10047
*/
public class TestHalfAndHalfDocValues extends SolrTestCaseJ4 {
@BeforeClass
public static void beforeTests() throws Exception {
// we need consistent segments that aren't merged because we want to have
// segments with and without docvalues
systemSetPropertySolrTestsMergePolicyFactory(NoMergePolicyFactory.class.getName());
// HACK: Don't use a RandomMergePolicy, but only use the mergePolicyFactory that we've just set
System.setProperty(SYSTEM_PROPERTY_SOLR_TESTS_USEMERGEPOLICYFACTORY, "true");
System.setProperty(SYSTEM_PROPERTY_SOLR_TESTS_USEMERGEPOLICY, "false");
initCore("solrconfig-basic.xml", "schema-docValues.xml");
// sanity check our schema meets our expectations
final IndexSchema schema = h.getCore().getLatestSchema();
for (String f : new String[]{"floatdv", "intdv", "doubledv", "longdv", "datedv", "stringdv", "booldv"}) {
final SchemaField sf = schema.getField(f);
assertFalse(f + " is multiValued, test is useless, who changed the schema?",
sf.multiValued());
assertFalse(f + " is indexed, test is useless, who changed the schema?",
sf.indexed());
assertTrue(f + " has no docValues, test is useless, who changed the schema?",
sf.hasDocValues());
}
}
public void setUp() throws Exception {
super.setUp();
assertU(delQ("*:*"));
}
public void testHalfAndHalfDocValues() throws Exception {
// Insert two docs without docvalues
String fieldname = "string_add_dv_later";
assertU(adoc("id", "3", fieldname, "c"));
assertU(commit());
assertU(adoc("id", "1", fieldname, "a"));
assertU(commit());
try (SolrCore core = h.getCoreInc()) {
assertFalse(core.getLatestSchema().getField(fieldname).hasDocValues());
// Add docvalues to the field type
IndexSchema schema = core.getLatestSchema();
SchemaField oldField = schema.getField(fieldname);
int newProperties = oldField.getProperties() | SchemaField.DOC_VALUES;
SchemaField sf = new SchemaField(fieldname, oldField.getType(), newProperties, null);
schema.getFields().put(fieldname, sf);
// Insert a new doc with docvalues
assertU(adoc("id", "2", fieldname, "b"));
assertU(commit());
// Check there are a mix of segments with and without docvalues
final RefCounted<SolrIndexSearcher> searcherRef = core.openNewSearcher(true, true);
final SolrIndexSearcher searcher = searcherRef.get();
try {
final DirectoryReader topReader = searcher.getRawReader();
//Assert no merges
assertEquals(3, topReader.numDocs());
assertEquals(3, topReader.leaves().size());
final FieldInfos infos = MultiFields.getMergedFieldInfos(topReader);
//The global field type should have docValues because a document with dvs was added
assertEquals(DocValuesType.SORTED, infos.fieldInfo(fieldname).getDocValuesType());
for (LeafReaderContext ctx : topReader.leaves()) {
LeafReader r = ctx.reader();
//Make sure there were no merges
assertEquals(1, r.numDocs());
Document doc = r.document(0);
String id = doc.getField("id").stringValue();
if (id.equals("1") || id.equals("3")) {
assertEquals(DocValuesType.NONE, r.getFieldInfos().fieldInfo(fieldname).getDocValuesType());
} else {
assertEquals(DocValuesType.SORTED, r.getFieldInfos().fieldInfo(fieldname).getDocValuesType());
}
}
} finally {
searcherRef.decref();
}
}
// Assert sort order is correct
assertQ(req("q", "string_add_dv_later:*", "sort", "string_add_dv_later asc"),
"//*[@numFound='3']",
"//result/doc[1]/int[@name='id'][.=1]",
"//result/doc[2]/int[@name='id'][.=2]",
"//result/doc[3]/int[@name='id'][.=3]"
);
}
}