blob: d03eff7a453fec7eac1379aa2360cd805bfb5f61 [file] [log] [blame]
/**
* 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.search;
import org.apache.solr.SolrTestCaseJ4;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.schema.SchemaField;
import org.apache.solr.search.function.ValueSource;
import org.apache.solr.search.function.DocValues;
import org.junit.BeforeClass;
import java.util.Map;
import java.io.IOException;
public class TestIndexSearcher extends SolrTestCaseJ4 {
@BeforeClass
public static void beforeClass() throws Exception {
initCore("solrconfig.xml","schema11.xml");
}
private String getStringVal(SolrQueryRequest sqr, String field, int doc) throws IOException {
SchemaField sf = sqr.getSchema().getField(field);
ValueSource vs = sf.getType().getValueSource(sf, null);
Map context = ValueSource.newContext();
vs.createWeight(context, sqr.getSearcher());
SolrIndexReader sr = sqr.getSearcher().getReader();
int idx = SolrIndexReader.readerIndex(doc, sr.getLeafOffsets());
int base = sr.getLeafOffsets()[idx];
SolrIndexReader sub = sr.getLeafReaders()[idx];
DocValues vals = vs.getValues(context, sub);
return vals.strVal(doc-base);
}
public void testReopen() throws Exception {
assertU(adoc("id","1", "v_t","Hello Dude", "v_s","string1"));
assertU(adoc("id","2", "v_t","Hello Yonik", "v_s","string2"));
assertU(commit());
SolrQueryRequest sr1 = req("q","foo");
SolrIndexReader r1 = sr1.getSearcher().getReader();
String sval1 = getStringVal(sr1, "v_s",0);
assertEquals("string1", sval1);
assertU(adoc("id","3", "v_s","{!literal}"));
assertU(adoc("id","4", "v_s","other stuff"));
assertU(commit());
SolrQueryRequest sr2 = req("q","foo");
SolrIndexReader r2 = sr2.getSearcher().getReader();
// make sure the readers share the first segment
// Didn't work w/ older versions of lucene2.9 going from segment -> multi
assertEquals(r1.getLeafReaders()[0], r2.getLeafReaders()[0]);
// make sure the String returned is the exact same instance (i.e. same FieldCache instance)
assertTrue(sval1 == getStringVal(sr2,"v_s",0));
assertU(adoc("id","5", "v_f","3.14159"));
assertU(adoc("id","6", "v_f","8983", "v_s","string6"));
assertU(commit());
SolrQueryRequest sr3 = req("q","foo");
SolrIndexReader r3 = sr3.getSearcher().getReader();
// make sure the readers share segments
// assertEquals(r1.getLeafReaders()[0], r3.getLeafReaders()[0]);
assertEquals(r2.getLeafReaders()[0], r3.getLeafReaders()[0]);
assertEquals(r2.getLeafReaders()[1], r3.getLeafReaders()[1]);
sr1.close();
sr2.close();
// should currently be 1, but this could change depending on future index management
int baseRefCount = r3.getRefCount();
assertEquals(1, baseRefCount);
assertU(commit());
SolrQueryRequest sr4 = req("q","foo");
SolrIndexReader r4 = sr4.getSearcher().getReader();
// force an index change so the registered searcher won't be the one we are testing (and
// then we should be able to test the refCount going all the way to 0
assertU(adoc("id","7", "v_f","7574"));
assertU(commit());
// test that reader didn't change (according to equals at least... which uses the wrapped reader)
assertEquals(r3,r4);
assertEquals(baseRefCount+1, r4.getRefCount());
sr3.close();
assertEquals(baseRefCount, r4.getRefCount());
sr4.close();
assertEquals(baseRefCount-1, r4.getRefCount());
SolrQueryRequest sr5 = req("q","foo");
SolrIndexReader r5 = sr5.getSearcher().getReader();
String beforeDelete = getStringVal(sr5, "v_s",1);
assertU(delI("1"));
assertU(commit());
SolrQueryRequest sr6 = req("q","foo");
SolrIndexReader r6 = sr6.getSearcher().getReader();
assertEquals(1, r6.getLeafReaders()[0].numDocs()); // only a single doc left in the first segment
assertTrue( !r5.getLeafReaders()[0].equals(r6.getLeafReaders()[0]) ); // readers now different
String afterDelete = getStringVal(sr6, "v_s",1);
assertTrue( beforeDelete == afterDelete ); // same field cache is used even though deletions are different
sr5.close();
sr6.close();
}
}