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 2011/08/23 16:07:19 UTC
svn commit: r1160700 [20/22] - in /lucene/dev/branches/flexscoring: ./
dev-tools/eclipse/ dev-tools/idea/.idea/ dev-tools/idea/lucene/contrib/
dev-tools/idea/lucene/contrib/demo/
dev-tools/idea/lucene/contrib/highlighter/ dev-tools/idea/lucene/contrib/...
Modified: lucene/dev/branches/flexscoring/solr/core/src/test-files/solr/conf/schema.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/flexscoring/solr/core/src/test-files/solr/conf/schema.xml?rev=1160700&r1=1160699&r2=1160700&view=diff
==============================================================================
--- lucene/dev/branches/flexscoring/solr/core/src/test-files/solr/conf/schema.xml (original)
+++ lucene/dev/branches/flexscoring/solr/core/src/test-files/solr/conf/schema.xml Tue Aug 23 14:06:58 2011
@@ -481,6 +481,24 @@
<field name="test_posofftv" type="text" termVectors="true"
termPositions="true" termOffsets="true"/>
+ <!-- test valid combinations of indexed settings,
+ see also BadIndexSchemaTest -->
+ <!-- indexed=false should not prevent omit___=true -->
+ <field name="pint_i_norm" type="pint" omitNorms="true"
+ indexed="false" />
+ <field name="pint_i_tf" type="pint" omitOmitTermFreqAndPositions="true"
+ indexed="false" />
+ <field name="pint_i_pos" type="pint" omitPositions="true"
+ indexed="false" />
+ <field name="pint_i_all" type="pint"
+ indexed="false"
+ omitNorms="true"
+ omitOmitTermFreqAndPositions="true"
+ omitPositions="true" />
+ <!-- omitOmitTermFreqAndPositions=false and omitPositions=true are ok -->
+ <field name="pint_tf_pos" type="pint" indexed="true"
+ omitOmitTermFreqAndPositions="false" omitPositions="true" />
+
<!-- test highlit field settings -->
<field name="test_hlt" type="highlittext" indexed="true" compressed="true"/>
<field name="test_hlt_off" type="highlittext" indexed="true" compressed="false"/>
Modified: lucene/dev/branches/flexscoring/solr/core/src/test-files/solr/conf/schema11.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/flexscoring/solr/core/src/test-files/solr/conf/schema11.xml?rev=1160700&r1=1160699&r2=1160700&view=diff
==============================================================================
--- lucene/dev/branches/flexscoring/solr/core/src/test-files/solr/conf/schema11.xml (original)
+++ lucene/dev/branches/flexscoring/solr/core/src/test-files/solr/conf/schema11.xml Tue Aug 23 14:06:58 2011
@@ -239,6 +239,8 @@
<fieldType name="file" keyField="id" defVal="1" stored="false" indexed="false" class="solr.ExternalFileField" valType="float"/>
+ <fieldType name="sfile" keyField="sfile_s" defVal="1" stored="false" indexed="false" class="solr.ExternalFileField" valType="float"/>
+
<fieldType name="tint" class="solr.TrieIntField" omitNorms="true" positionIncrementGap="0"/>
<fieldType name="tfloat" class="solr.TrieFloatField" omitNorms="true" positionIncrementGap="0"/>
@@ -340,6 +342,7 @@ valued. -->
<dynamicField name="*_ws" type="text_ws" indexed="true" stored="true"/>
<dynamicField name="*_extf" type="file"/>
+ <dynamicField name="*_extfs" type="sfile"/>
<dynamicField name="*_random" type="random" />
Modified: lucene/dev/branches/flexscoring/solr/core/src/test-files/solr/conf/schema12.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/flexscoring/solr/core/src/test-files/solr/conf/schema12.xml?rev=1160700&r1=1160699&r2=1160700&view=diff
==============================================================================
--- lucene/dev/branches/flexscoring/solr/core/src/test-files/solr/conf/schema12.xml (original)
+++ lucene/dev/branches/flexscoring/solr/core/src/test-files/solr/conf/schema12.xml Tue Aug 23 14:06:58 2011
@@ -523,6 +523,13 @@
<field name="pointD" type="xyd" indexed="true" stored="true" multiValued="false"/>
<field name="point_hash" type="geohash" indexed="true" stored="true" multiValued="false"/>
<field name="store" type="location" indexed="true" stored="true"/>
+
+ <!-- to test uniq fields -->
+ <field name="uniq" type="string" indexed="true" stored="true" multiValued="true"/>
+ <field name="uniq2" type="string" indexed="true" stored="true" multiValued="true"/>
+ <field name="uniq3" type="string" indexed="true" stored="true"/>
+ <field name="nouniq" type="string" indexed="true" stored="true" multiValued="true"/>
+
<dynamicField name="*_coordinate" type="tdouble" indexed="true" stored="false"/>
Modified: lucene/dev/branches/flexscoring/solr/core/src/test-files/solr/conf/solrconfig.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/flexscoring/solr/core/src/test-files/solr/conf/solrconfig.xml?rev=1160700&r1=1160699&r2=1160700&view=diff
==============================================================================
--- lucene/dev/branches/flexscoring/solr/core/src/test-files/solr/conf/solrconfig.xml (original)
+++ lucene/dev/branches/flexscoring/solr/core/src/test-files/solr/conf/solrconfig.xml Tue Aug 23 14:06:58 2011
@@ -491,5 +491,15 @@
</processor>
<processor class="solr.RunUpdateProcessorFactory" />
</updateRequestProcessorChain>
+ <updateRequestProcessorChain name="uniq-fields">
+ <processor class="org.apache.solr.update.processor.UniqFieldsUpdateProcessorFactory">
+ <lst name="fields">
+ <str>uniq</str>
+ <str>uniq2</str>
+ <str>uniq3</str>
+ </lst>
+ </processor>
+ <processor class="solr.RunUpdateProcessorFactory" />
+ </updateRequestProcessorChain>
</config>
Modified: lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/BasicFunctionalityTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/BasicFunctionalityTest.java?rev=1160700&r1=1160699&r2=1160700&view=diff
==============================================================================
--- lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/BasicFunctionalityTest.java (original)
+++ lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/BasicFunctionalityTest.java Tue Aug 23 14:06:58 2011
@@ -120,7 +120,7 @@ public class BasicFunctionalityTest exte
// test merge factor picked up
SolrCore core = h.getCore();
- IndexWriter writer = ((DirectUpdateHandler2)core.getUpdateHandler()).getIndexWriterProvider().getIndexWriter();
+ IndexWriter writer = ((DirectUpdateHandler2)core.getUpdateHandler()).getIndexWriterProvider().getIndexWriter(core);
assertEquals("Mergefactor was not picked up", ((LogMergePolicy)writer.getConfig().getMergePolicy()).getMergeFactor(), 8);
lrf.args.put(CommonParams.VERSION,"2.2");
Modified: lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/EchoParamsTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/EchoParamsTest.java?rev=1160700&r1=1160699&r2=1160700&view=diff
==============================================================================
--- lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/EchoParamsTest.java (original)
+++ lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/EchoParamsTest.java Tue Aug 23 14:06:58 2011
@@ -31,25 +31,32 @@ public class EchoParamsTest extends Solr
}
private static final String HEADER_XPATH = "/response/lst[@name='responseHeader']";
-
+
@Test
- public void testDefaultEchoParams() {
+ public void test() {
+ defaultEchoParams();
+ defaultEchoParamsDefaultVersion();
+ explicitEchoParams();
+ allEchoParams();
+ }
+
+ // the following test methods rely on their order, which is no longer guaranteed by Java 7, so call them directly above:
+
+ private void defaultEchoParams() {
lrf.args.put("wt", "xml");
lrf.args.put(CommonParams.VERSION, "2.2");
assertQ(req("foo"),HEADER_XPATH + "/int[@name='status']");
assertQ(req("foo"),"not(//lst[@name='params'])");
}
- @Test
- public void testDefaultEchoParamsDefaultVersion() {
+ private void defaultEchoParamsDefaultVersion() {
lrf.args.put("wt", "xml");
lrf.args.remove(CommonParams.VERSION);
assertQ(req("foo"),HEADER_XPATH + "/int[@name='status']");
assertQ(req("foo"),"not(//lst[@name='params'])");
}
- @Test
- public void testExplicitEchoParams() {
+ private void explicitEchoParams() {
lrf.args.put("wt", "xml");
lrf.args.put(CommonParams.VERSION, "2.2");
lrf.args.put("echoParams", "explicit");
@@ -58,8 +65,7 @@ public class EchoParamsTest extends Solr
assertQ(req("foo"),HEADER_XPATH + "/lst[@name='params']/str[@name='wt'][.='xml']");
}
- @Test
- public void testAllEchoParams() {
+ private void allEchoParams() {
lrf = h.getRequestFactory
("crazy_custom_qt", 0, 20,
CommonParams.VERSION,"2.2",
Modified: lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/TestGroupingSearch.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/TestGroupingSearch.java?rev=1160700&r1=1160699&r2=1160700&view=diff
==============================================================================
--- lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/TestGroupingSearch.java (original)
+++ lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/TestGroupingSearch.java Tue Aug 23 14:06:58 2011
@@ -234,6 +234,53 @@ public class TestGroupingSearch extends
);
}
+ @Test
+ public void testGroupingGroupedBasedFaceting() throws Exception {
+ assertU(add(doc("id", "1", "value1_s1", "1", "value2_i", "1", "value3_s1", "a", "value4_i", "1")));
+ assertU(add(doc("id", "2", "value1_s1", "1", "value2_i", "2", "value3_s1", "a", "value4_i", "1")));
+ assertU(commit());
+ assertU(add(doc("id", "3", "value1_s1", "2", "value2_i", "3", "value3_s1", "b", "value4_i", "2")));
+ assertU(add(doc("id", "4", "value1_s1", "1", "value2_i", "4", "value3_s1", "a", "value4_i", "1")));
+ assertU(add(doc("id", "5", "value1_s1", "2", "value2_i", "5", "value3_s1", "b", "value4_i", "2")));
+ assertU(commit());
+
+ // Facet counts based on documents
+ SolrQueryRequest req = req("q", "*:*", "sort", "value2_i asc", "rows", "1", "group", "true", "group.field",
+ "value1_s1", "fl", "id", "facet", "true", "facet.field", "value3_s1", "group.truncate", "false");
+ assertJQ(
+ req,
+ "/grouped=={'value1_s1':{'matches':5,'groups':[{'groupValue':'1','doclist':{'numFound':3,'start':0,'docs':[{'id':'1'}]}}]}}",
+ "/facet_counts=={'facet_queries':{},'facet_fields':{'value3_s1':['a',3,'b',2]},'facet_dates':{},'facet_ranges':{}}"
+ );
+
+ // Facet counts based on groups
+ req = req("q", "*:*", "sort", "value2_i asc", "rows", "1", "group", "true", "group.field",
+ "value1_s1", "fl", "id", "facet", "true", "facet.field", "value3_s1", "group.truncate", "true");
+ assertJQ(
+ req,
+ "/grouped=={'value1_s1':{'matches':5,'groups':[{'groupValue':'1','doclist':{'numFound':3,'start':0,'docs':[{'id':'1'}]}}]}}",
+ "/facet_counts=={'facet_queries':{},'facet_fields':{'value3_s1':['a',1,'b',1]},'facet_dates':{},'facet_ranges':{}}"
+ );
+
+ // Facet counts based on groups and with group.func. This should trigger FunctionAllGroupHeadsCollector
+ req = req("q", "*:*", "sort", "value2_i asc", "rows", "1", "group", "true", "group.func",
+ "strdist(1,value1_s1,edit)", "fl", "id", "facet", "true", "facet.field", "value3_s1", "group.truncate", "true");
+ assertJQ(
+ req,
+ "/grouped=={'strdist(1,value1_s1,edit)':{'matches':5,'groups':[{'groupValue':1.0,'doclist':{'numFound':3,'start':0,'docs':[{'id':'1'}]}}]}}",
+ "/facet_counts=={'facet_queries':{},'facet_fields':{'value3_s1':['a',1,'b',1]},'facet_dates':{},'facet_ranges':{}}"
+ );
+
+ // Facet counts based on groups without sort on an int field.
+ req = req("q", "*:*", "rows", "1", "group", "true", "group.field", "value4_i", "fl", "id", "facet", "true",
+ "facet.field", "value3_s1", "group.truncate", "true");
+ assertJQ(
+ req,
+ "/grouped=={'value4_i':{'matches':5,'groups':[{'groupValue':1,'doclist':{'numFound':3,'start':0,'docs':[{'id':'1'}]}}]}}",
+ "/facet_counts=={'facet_queries':{},'facet_fields':{'value3_s1':['a',1,'b',1]},'facet_dates':{},'facet_ranges':{}}"
+ );
+ }
+
static String f = "foo_i";
static String f2 = "foo2_i";
@@ -474,7 +521,7 @@ public class TestGroupingSearch extends
types.add(new FldType("id",ONE_ONE, new SVal('A','Z',4,4)));
types.add(new FldType("score_f",ONE_ONE, new FVal(1,100))); // field used to score
types.add(new FldType("foo_i",ZERO_ONE, new IRange(0,indexSize)));
- types.add(new FldType(FOO_STRING_FIELD,ZERO_ONE, new SVal('a','z',1,2)));
+ types.add(new FldType(FOO_STRING_FIELD,ONE_ONE, new SVal('a','z',1,2)));
types.add(new FldType(SMALL_STRING_FIELD,ZERO_ONE, new SVal('a',(char)('c'+indexSize/10),1,1)));
types.add(new FldType(SMALL_INT_FIELD,ZERO_ONE, new IRange(0,5+indexSize/10)));
@@ -567,25 +614,61 @@ public class TestGroupingSearch extends
for (Grp grp : groups.values()) grp.setMaxDoc(sortComparator);
}
- List<Grp> sortedGroups = new ArrayList(groups.values());
+ List<Grp> sortedGroups = new ArrayList<Grp>(groups.values());
Collections.sort(sortedGroups, groupComparator==sortComparator ? createFirstDocComparator(sortComparator) : createMaxDocComparator(sortComparator));
boolean includeNGroups = random.nextBoolean();
Object modelResponse = buildGroupedResult(h.getCore().getSchema(), sortedGroups, start, rows, group_offset, group_limit, includeNGroups);
+ boolean truncateGroups = random.nextBoolean();
+ Map<String, Integer> facetCounts = new TreeMap<String, Integer>();
+ if (truncateGroups) {
+ for (Grp grp : sortedGroups) {
+ Doc doc = grp.docs.get(0);
+ if (doc.getValues(FOO_STRING_FIELD) == null) {
+ continue;
+ }
+
+ String key = doc.getFirstValue(FOO_STRING_FIELD).toString();
+ boolean exists = facetCounts.containsKey(key);
+ int count = exists ? facetCounts.get(key) : 0;
+ facetCounts.put(key, ++count);
+ }
+ } else {
+ for (Doc doc : model.values()) {
+ if (doc.getValues(FOO_STRING_FIELD) == null) {
+ continue;
+ }
+
+ for (Comparable field : doc.getValues(FOO_STRING_FIELD)) {
+ String key = field.toString();
+ boolean exists = facetCounts.containsKey(key);
+ int count = exists ? facetCounts.get(key) : 0;
+ facetCounts.put(key, ++count);
+ }
+ }
+ }
+ List<Comparable> expectedFacetResponse = new ArrayList<Comparable>();
+ for (Map.Entry<String, Integer> stringIntegerEntry : facetCounts.entrySet()) {
+ expectedFacetResponse.add(stringIntegerEntry.getKey());
+ expectedFacetResponse.add(stringIntegerEntry.getValue());
+ }
+
int randomPercentage = random.nextInt(101);
// TODO: create a random filter too
SolrQueryRequest req = req("group","true","wt","json","indent","true", "echoParams","all", "q","{!func}score_f", "group.field",groupField
,sortStr==null ? "nosort":"sort", sortStr ==null ? "": sortStr
- ,(groupSortStr==null || groupSortStr==sortStr) ? "noGroupsort":"group.sort", groupSortStr==null ? "": groupSortStr
+ ,(groupSortStr == null || groupSortStr == sortStr) ? "noGroupsort":"group.sort", groupSortStr==null ? "": groupSortStr
,"rows",""+rows, "start",""+start, "group.offset",""+group_offset, "group.limit",""+group_limit,
- GroupParams.GROUP_CACHE_PERCENTAGE, Integer.toString(randomPercentage), GroupParams.GROUP_TOTAL_COUNT, includeNGroups ? "true" : "false"
+ GroupParams.GROUP_CACHE_PERCENTAGE, Integer.toString(randomPercentage), GroupParams.GROUP_TOTAL_COUNT, includeNGroups ? "true" : "false",
+ "facet", "true", "facet.sort", "index", "facet.limit", "-1", "facet.field", FOO_STRING_FIELD,
+ GroupParams.GROUP_TRUNCATE, truncateGroups ? "true" : "false", "facet.mincount", "1", "facet.method", "fcs" // to avoid FC insanity
);
String strResponse = h.query(req);
Object realResponse = ObjectBuilder.fromJSON(strResponse);
- String err = JSONTestUtil.matchObj("/grouped/"+groupField, realResponse, modelResponse);
+ String err = JSONTestUtil.matchObj("/grouped/" + groupField, realResponse, modelResponse);
if (err != null) {
log.error("GROUPING MISMATCH: " + err
+ "\n\trequest="+req
@@ -599,6 +682,20 @@ public class TestGroupingSearch extends
fail(err);
}
+
+ // assert post / pre grouping facets
+ err = JSONTestUtil.matchObj("/facet_counts/facet_fields/"+FOO_STRING_FIELD, realResponse, expectedFacetResponse);
+ if (err != null) {
+ log.error("GROUPING MISMATCH: " + err
+ + "\n\trequest="+req
+ + "\n\tresult="+strResponse
+ + "\n\texpected="+ JSONUtil.toJSON(expectedFacetResponse)
+ );
+
+ // re-execute the request... good for putting a breakpoint here for debugging
+ h.query(req);
+ fail(err);
+ }
} // end query iter
} // end index iter
Modified: lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/TestSolrCoreProperties.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/TestSolrCoreProperties.java?rev=1160700&r1=1160699&r2=1160700&view=diff
==============================================================================
--- lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/TestSolrCoreProperties.java (original)
+++ lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/TestSolrCoreProperties.java Tue Aug 23 14:06:58 2011
@@ -59,7 +59,6 @@ public class TestSolrCoreProperties exte
@Override
public void tearDown() throws Exception {
solrJetty.stop();
- SolrTestCaseJ4.closeDirectories();
AbstractSolrTestCase.recurseDelete(homeDir);
super.tearDown();
}
Modified: lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/analysis/TestUAX29URLEmailTokenizerFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/analysis/TestUAX29URLEmailTokenizerFactory.java?rev=1160700&r1=1160699&r2=1160700&view=diff
==============================================================================
--- lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/analysis/TestUAX29URLEmailTokenizerFactory.java (original)
+++ lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/analysis/TestUAX29URLEmailTokenizerFactory.java Tue Aug 23 14:06:58 2011
@@ -19,6 +19,7 @@ package org.apache.solr.analysis;
import java.io.Reader;
import java.io.StringReader;
+import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
@@ -173,4 +174,22 @@ public class TestUAX29URLEmailTokenizerF
assertTokenStreamContents(stream,
new String[] {"one", "two", "three", longWord, "four", "five", "six" });
}
+
+ /** @deprecated nuke this test in lucene 5.0 */
+ @Deprecated
+ public void testMatchVersion() throws Exception {
+ Reader reader = new StringReader("ãã");
+ UAX29URLEmailTokenizerFactory factory = new UAX29URLEmailTokenizerFactory();
+ factory.init(DEFAULT_VERSION_PARAM);
+ Tokenizer stream = factory.create(reader);
+ assertTokenStreamContents(stream,
+ new String[] {"ãã"});
+
+ reader = new StringReader("ãã");
+ factory = new UAX29URLEmailTokenizerFactory();
+ factory.init(Collections.singletonMap("luceneMatchVersion", "3.1"));
+ stream = factory.create(reader);
+ assertTokenStreamContents(stream,
+ new String[] {"ã"}); // old broken behavior
+ }
}
Modified: lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/cloud/BasicZkTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/cloud/BasicZkTest.java?rev=1160700&r1=1160699&r2=1160700&view=diff
==============================================================================
--- lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/cloud/BasicZkTest.java (original)
+++ lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/cloud/BasicZkTest.java Tue Aug 23 14:06:58 2011
@@ -47,7 +47,7 @@ public class BasicZkTest extends Abstrac
// test merge factor picked up
SolrCore core = h.getCore();
- IndexWriter writer = ((DirectUpdateHandler2)core.getUpdateHandler()).getIndexWriterProvider().getIndexWriter();
+ IndexWriter writer = ((DirectUpdateHandler2)core.getUpdateHandler()).getIndexWriterProvider().getIndexWriter(core);
assertEquals("Mergefactor was not picked up", ((LogMergePolicy)writer.getConfig().getMergePolicy()).getMergeFactor(), 8);
Modified: lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/core/AlternateDirectoryTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/core/AlternateDirectoryTest.java?rev=1160700&r1=1160699&r2=1160700&view=diff
==============================================================================
--- lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/core/AlternateDirectoryTest.java (original)
+++ lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/core/AlternateDirectoryTest.java Tue Aug 23 14:06:58 2011
@@ -41,20 +41,16 @@ public class AlternateDirectoryTest exte
assertQ(req("q","*:*","qt","standard"));
assertTrue(TestFSDirectoryFactory.openCalled);
assertTrue(TestIndexReaderFactory.newReaderCalled);
- TestFSDirectoryFactory.dir.close();
}
- static public class TestFSDirectoryFactory extends DirectoryFactory {
+ static public class TestFSDirectoryFactory extends CachingDirectoryFactory {
public static volatile boolean openCalled = false;
public static volatile Directory dir;
@Override
- public Directory open(String path) throws IOException {
+ public Directory create(String path) throws IOException {
openCalled = true;
- // need to close the directory, or otherwise the test fails.
- if (dir != null) {
- dir.close();
- }
+
return dir = newFSDirectory(new File(path));
}
Modified: lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/core/RAMDirectoryFactoryTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/core/RAMDirectoryFactoryTest.java?rev=1160700&r1=1160699&r2=1160700&view=diff
==============================================================================
--- lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/core/RAMDirectoryFactoryTest.java (original)
+++ lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/core/RAMDirectoryFactoryTest.java Tue Aug 23 14:06:58 2011
@@ -17,38 +17,45 @@
package org.apache.solr.core;
+import java.io.IOException;
+
import org.apache.lucene.store.Directory;
-import org.apache.lucene.store.SingleInstanceLockFactory;
+import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.util.LuceneTestCase;
-import java.io.IOException;
/**
* Test-case for RAMDirectoryFactory
*/
public class RAMDirectoryFactoryTest extends LuceneTestCase {
- public void testOpenReturnsTheSameForSamePath() throws IOException {
- final Directory directory = new RefCntRamDirectory();
+
+ public void test() throws Exception {
+ dotestOpenReturnsTheSameForSamePath();
+ dotestOpenSucceedForEmptyDir();
+ }
+
+ private void dotestOpenReturnsTheSameForSamePath() throws IOException {
+ final Directory directory = new RAMDirectory();
RAMDirectoryFactory factory = new RAMDirectoryFactory() {
@Override
- Directory openNew(String path) throws IOException {
+ protected Directory create(String path) throws IOException {
return directory;
}
};
String path = "/fake/path";
- Directory dir1 = factory.open(path);
- Directory dir2 = factory.open(path);
+ Directory dir1 = factory.get(path, null);
+ Directory dir2 = factory.get(path, null);
assertEquals("RAMDirectoryFactory should not create new instance of RefCntRamDirectory " +
- "every time open() is called for the same path", directory, dir1);
- assertEquals("RAMDirectoryFactory should not create new instance of RefCntRamDirectory " +
- "every time open() is called for the same path", directory, dir2);
- dir1.close();
- dir2.close();
+ "every time open() is called for the same path", dir1, dir2);
+
+ factory.release(dir1);
+ factory.release(dir2);
}
- public void testOpenSucceedForEmptyDir() throws IOException {
+ private void dotestOpenSucceedForEmptyDir() throws IOException {
RAMDirectoryFactory factory = new RAMDirectoryFactory();
- Directory dir = factory.open("/fake/path");
+ Directory dir = factory.get("/fake/path", null);
assertNotNull("RAMDirectoryFactory should create RefCntRamDirectory even if the path doen't lead " +
"to index directory on the file system", dir);
+ factory.release(dir);
}
}
Modified: lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/core/TestConfig.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/core/TestConfig.java?rev=1160700&r1=1160699&r2=1160700&view=diff
==============================================================================
--- lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/core/TestConfig.java (original)
+++ lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/core/TestConfig.java Tue Aug 23 14:06:58 2011
@@ -116,7 +116,7 @@ public class TestConfig extends SolrTest
@Test
public void testTermIndexInterval() throws Exception {
- IndexWriter writer = ((DirectUpdateHandler2)h.getCore().getUpdateHandler()).getIndexWriterProvider().getIndexWriter();
+ IndexWriter writer = ((DirectUpdateHandler2)h.getCore().getUpdateHandler()).getIndexWriterProvider().getIndexWriter(h.getCore());
int interval = writer.getConfig().getTermIndexInterval();
assertEquals(256, interval);
}
Modified: lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/core/TestJmxIntegration.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/core/TestJmxIntegration.java?rev=1160700&r1=1160699&r2=1160700&view=diff
==============================================================================
--- lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/core/TestJmxIntegration.java (original)
+++ lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/core/TestJmxIntegration.java Tue Aug 23 14:06:58 2011
@@ -112,8 +112,6 @@ public class TestJmxIntegration extends
public void testJmxOnCoreReload() throws Exception {
List<MBeanServer> servers = MBeanServerFactory.findMBeanServer(null);
MBeanServer mbeanServer = servers.get(0);
- log.info("Servers in testJmxUpdate: " + servers);
- log.info(h.getCore().getInfoRegistry().toString());
String coreName = h.getCore().getName();
if (coreName.length() == 0) {
@@ -121,16 +119,43 @@ public class TestJmxIntegration extends
}
Set<ObjectInstance> oldBeans = mbeanServer.queryMBeans(null, null);
- int oldNumberOfObjects = oldBeans.size();
+ int oldNumberOfObjects = 0;
+ for (ObjectInstance bean : oldBeans) {
+ try {
+ if (String.valueOf(h.getCore().hashCode()).equals(mbeanServer.getAttribute(bean.getObjectName(), "coreHashCode"))) {
+ oldNumberOfObjects++;
+ }
+ } catch (AttributeNotFoundException e) {
+ // expected
+ }
+ }
+
+ log.info("Before Reload: Size of infoRegistry: " + h.getCore().getInfoRegistry().size() + " MBeans: " + oldNumberOfObjects);
+ assertEquals("Number of registered MBeans is not the same as info registry size", h.getCore().getInfoRegistry().size(), oldNumberOfObjects);
+
h.getCoreContainer().reload(coreName);
-
- // chill for a moment, so our beans can get ready
- Thread.sleep(1000);
-
+
Set<ObjectInstance> newBeans = mbeanServer.queryMBeans(null, null);
- int newNumberOfObjects = newBeans.size();
+ int newNumberOfObjects = 0;
+ int registrySize = 0;
+ SolrCore core = h.getCoreContainer().getCore(coreName);
+ try {
+ registrySize = core.getInfoRegistry().size();
+ for (ObjectInstance bean : newBeans) {
+ try {
+ if (String.valueOf(core.hashCode()).equals(mbeanServer.getAttribute(bean.getObjectName(), "coreHashCode"))) {
+ newNumberOfObjects++;
+ }
+ } catch (AttributeNotFoundException e) {
+ // expected
+ }
+ }
+ } finally {
+ core.close();
+ }
- assertEquals("Number of registered MBeans is not the same after Solr core reload", oldNumberOfObjects, newNumberOfObjects);
+ log.info("After Reload: Size of infoRegistry: " + registrySize + " MBeans: " + newNumberOfObjects);
+ assertEquals("Number of registered MBeans is not the same as info registry size", registrySize, newNumberOfObjects);
}
private ObjectName getObjectName(String key, SolrInfoMBean infoBean)
Modified: lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/core/TestLegacyMergeSchedulerPolicyConfig.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/core/TestLegacyMergeSchedulerPolicyConfig.java?rev=1160700&r1=1160699&r2=1160700&view=diff
==============================================================================
--- lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/core/TestLegacyMergeSchedulerPolicyConfig.java (original)
+++ lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/core/TestLegacyMergeSchedulerPolicyConfig.java Tue Aug 23 14:06:58 2011
@@ -33,7 +33,7 @@ public class TestLegacyMergeSchedulerPol
@Test
public void testLegacy() throws Exception {
- IndexWriter writer = ((DirectUpdateHandler2)h.getCore().getUpdateHandler()).getIndexWriterProvider().getIndexWriter();
+ IndexWriter writer = ((DirectUpdateHandler2)h.getCore().getUpdateHandler()).getIndexWriterProvider().getIndexWriter(h.getCore());
assertTrue(writer.getConfig().getMergePolicy().getClass().getName().equals(LogDocMergePolicy.class.getName()));
assertTrue(writer.getConfig().getMergeScheduler().getClass().getName().equals(SerialMergeScheduler.class.getName()));
}
Modified: lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/core/TestPropInject.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/core/TestPropInject.java?rev=1160700&r1=1160699&r2=1160700&view=diff
==============================================================================
--- lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/core/TestPropInject.java (original)
+++ lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/core/TestPropInject.java Tue Aug 23 14:06:58 2011
@@ -37,13 +37,13 @@ public class TestPropInject extends Abst
}
public void testMergePolicy() throws Exception {
- IndexWriter writer = ((DirectUpdateHandler2)h.getCore().getUpdateHandler()).getIndexWriterProvider().getIndexWriter();
+ IndexWriter writer = ((DirectUpdateHandler2)h.getCore().getUpdateHandler()).getIndexWriterProvider().getIndexWriter(h.getCore());
LogByteSizeMergePolicy mp = (LogByteSizeMergePolicy)writer.getConfig().getMergePolicy();
assertEquals(64.0, mp.getMaxMergeMB(), 0);
}
public void testProps() throws Exception {
- IndexWriter writer = ((DirectUpdateHandler2)h.getCore().getUpdateHandler()).getIndexWriterProvider().getIndexWriter();
+ IndexWriter writer = ((DirectUpdateHandler2)h.getCore().getUpdateHandler()).getIndexWriterProvider().getIndexWriter(h.getCore());
ConcurrentMergeScheduler cms = (ConcurrentMergeScheduler)writer.getConfig().getMergeScheduler();
assertEquals(2, cms.getMaxThreadCount());
}
Modified: lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/core/TestPropInjectDefaults.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/core/TestPropInjectDefaults.java?rev=1160700&r1=1160699&r2=1160700&view=diff
==============================================================================
--- lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/core/TestPropInjectDefaults.java (original)
+++ lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/core/TestPropInjectDefaults.java Tue Aug 23 14:06:58 2011
@@ -33,14 +33,14 @@ public class TestPropInjectDefaults exte
@Test
public void testMergePolicyDefaults() throws Exception {
- IndexWriter writer = ((DirectUpdateHandler2)h.getCore().getUpdateHandler()).getIndexWriterProvider().getIndexWriter();
+ IndexWriter writer = ((DirectUpdateHandler2)h.getCore().getUpdateHandler()).getIndexWriterProvider().getIndexWriter(h.getCore());
LogByteSizeMergePolicy mp = (LogByteSizeMergePolicy)writer.getConfig().getMergePolicy();
assertEquals(32.0, mp.getMaxMergeMB(), 0);
}
@Test
public void testPropsDefaults() throws Exception {
- IndexWriter writer = ((DirectUpdateHandler2)h.getCore().getUpdateHandler()).getIndexWriterProvider().getIndexWriter();
+ IndexWriter writer = ((DirectUpdateHandler2)h.getCore().getUpdateHandler()).getIndexWriterProvider().getIndexWriter(h.getCore());
ConcurrentMergeScheduler cms = (ConcurrentMergeScheduler)writer.getConfig().getMergeScheduler();
assertEquals(4, cms.getMaxThreadCount());
}
Modified: lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/core/TestQuerySenderListener.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/core/TestQuerySenderListener.java?rev=1160700&r1=1160699&r2=1160700&view=diff
==============================================================================
--- lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/core/TestQuerySenderListener.java (original)
+++ lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/core/TestQuerySenderListener.java Tue Aug 23 14:06:58 2011
@@ -18,10 +18,9 @@
package org.apache.solr.core;
import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.common.params.EventParams;
import org.apache.solr.search.SolrIndexSearcher;
import org.apache.solr.util.RefCounted;
-import org.apache.solr.common.params.EventParams;
-import org.apache.lucene.store.Directory;
import org.junit.BeforeClass;
import org.junit.Test;
@@ -75,8 +74,8 @@ public class TestQuerySenderListener ext
String evt = mock.req.getParams().get(EventParams.EVENT);
assertNotNull("Event is null", evt);
assertTrue(evt + " is not equal to " + EventParams.FIRST_SEARCHER, evt.equals(EventParams.FIRST_SEARCHER) == true);
- Directory dir = currentSearcher.getIndexReader().directory();
- SolrIndexSearcher newSearcher = new SolrIndexSearcher(core, core.getSchema(), "testQuerySenderListener", dir, true, false);
+
+ SolrIndexSearcher newSearcher = new SolrIndexSearcher(core, core.getNewIndexDir(), core.getSchema(), core.getSolrConfig().mainIndexConfig, "testQuerySenderListener", true, false, core.getDirectoryFactory());
qsl.newSearcher(newSearcher, currentSearcher);
evt = mock.req.getParams().get(EventParams.EVENT);
Modified: lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/core/TestQuerySenderNoQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/core/TestQuerySenderNoQuery.java?rev=1160700&r1=1160699&r2=1160700&view=diff
==============================================================================
--- lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/core/TestQuerySenderNoQuery.java (original)
+++ lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/core/TestQuerySenderNoQuery.java Tue Aug 23 14:06:58 2011
@@ -17,11 +17,8 @@ package org.apache.solr.core;
* limitations under the License.
*/
-import org.apache.lucene.store.Directory;
import org.apache.solr.SolrTestCaseJ4;
-import org.apache.solr.common.params.EventParams;
import org.apache.solr.search.SolrIndexSearcher;
-import org.apache.solr.search.TestExtendedDismaxParser;
import org.apache.solr.util.RefCounted;
import org.junit.BeforeClass;
import org.junit.Test;
@@ -78,8 +75,7 @@ public class TestQuerySenderNoQuery exte
assertNotNull("Mock is null", mock);
assertNull("Req (firstsearcher) is not null", mock.req);
- Directory dir = currentSearcher.getIndexReader().directory();
- SolrIndexSearcher newSearcher = new SolrIndexSearcher(core, core.getSchema(), "testQuerySenderNoQuery", dir, true, false);
+ SolrIndexSearcher newSearcher = new SolrIndexSearcher(core, core.getNewIndexDir(), core.getSchema(), core.getSolrConfig().mainIndexConfig, "testQuerySenderNoQuery", true, false, core.getDirectoryFactory());
qsl.newSearcher(newSearcher, currentSearcher); // get newSearcher.
assertNull("Req (newsearcher) is not null", mock.req);
Modified: lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/handler/TestCSVLoader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/handler/TestCSVLoader.java?rev=1160700&r1=1160699&r2=1160700&view=diff
==============================================================================
--- lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/handler/TestCSVLoader.java (original)
+++ lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/handler/TestCSVLoader.java Tue Aug 23 14:06:58 2011
@@ -121,6 +121,14 @@ public class TestCSVLoader extends SolrT
}
@Test
+ public void testLiteral() throws Exception {
+ makeFile("id\n100");
+ loadLocal("stream.file",filename,"commit","true", "literal.name","LITERAL_VALUE");
+ assertQ(req("*:*"),"//doc/str[@name='name'][.='LITERAL_VALUE']");
+ }
+
+
+ @Test
public void testCSV() throws Exception {
lrf.args.put(CommonParams.VERSION,"2.2");
Modified: lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/handler/TestReplicationHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/handler/TestReplicationHandler.java?rev=1160700&r1=1160699&r2=1160700&view=diff
==============================================================================
--- lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/handler/TestReplicationHandler.java (original)
+++ lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/handler/TestReplicationHandler.java Tue Aug 23 14:06:58 2011
@@ -16,6 +16,16 @@
*/
package org.apache.solr.handler;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Writer;
+import java.net.URL;
+
import org.apache.commons.io.IOUtils;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.MatchAllDocsQuery;
@@ -25,7 +35,6 @@ import org.apache.lucene.store.SimpleFSD
import org.apache.solr.SolrTestCaseJ4;
import org.apache.solr.TestDistributedSearch;
import org.apache.solr.client.solrj.SolrServer;
-import org.apache.solr.client.solrj.SolrRequest;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.embedded.JettySolrRunner;
import org.apache.solr.client.solrj.impl.CommonsHttpSolrServer;
@@ -40,12 +49,6 @@ import org.apache.solr.common.util.Simpl
import org.apache.solr.util.AbstractSolrTestCase;
import org.junit.AfterClass;
import org.junit.BeforeClass;
-import org.junit.Test;
-
-import java.io.*;
-import java.net.URL;
-import java.util.Map;
-import java.util.HashMap;
/**
* Test for ReplicationHandler
@@ -179,9 +182,66 @@ public class TestReplicationHandler exte
return details;
}
+
+ private NamedList<Object> getCommits(SolrServer s) throws Exception {
+
+
+ ModifiableSolrParams params = new ModifiableSolrParams();
+ params.set("command","commits");
+ params.set("qt","/replication");
+ QueryRequest req = new QueryRequest(params);
+
+ NamedList<Object> res = s.request(req);
+
+ assertNotNull("null response from server", res);
+
+
+ return res;
+ }
+
+ private NamedList<Object> getIndexVersion(SolrServer s) throws Exception {
+
+ ModifiableSolrParams params = new ModifiableSolrParams();
+ params.set("command","indexversion");
+ params.set("qt","/replication");
+ QueryRequest req = new QueryRequest(params);
+
+ NamedList<Object> res = s.request(req);
+
+ assertNotNull("null response from server", res);
+
+
+ return res;
+ }
+
+ private NamedList<Object> reloadCore(SolrServer s, String core) throws Exception {
+
+ ModifiableSolrParams params = new ModifiableSolrParams();
+ params.set("action","reload");
+ params.set("core", core);
+ params.set("qt","/admin/cores");
+ QueryRequest req = new QueryRequest(params);
- @Test
- public void testDetails() throws Exception {
+ NamedList<Object> res = s.request(req);
+
+ assertNotNull("null response from server", res);
+
+ return res;
+ }
+
+ public void test() throws Exception {
+ doTestReplicateAfterCoreReload();
+ doTestDetails();
+ doTestReplicateAfterWrite2Slave();
+ doTestIndexAndConfigReplication();
+ doTestStopPoll();
+ doTestSnapPullWithMasterUrl();
+ doTestReplicateAfterStartup();
+ doTestIndexAndConfigAliasReplication();
+ doTestBackup();
+ }
+
+ private void doTestDetails() throws Exception {
{
NamedList<Object> details = getDetails(masterClient);
@@ -234,8 +294,7 @@ public class TestReplicationHandler exte
}
}
- @Test
- public void testReplicateAfterWrite2Slave() throws Exception {
+ private void doTestReplicateAfterWrite2Slave() throws Exception {
clearIndexWithReplication();
nDocs--;
for (int i = 0; i < nDocs; i++) {
@@ -299,8 +358,7 @@ public class TestReplicationHandler exte
assertEquals(nDocs, slaveQueryResult.getNumFound());
}
- @Test
- public void testIndexAndConfigReplication() throws Exception {
+ private void doTestIndexAndConfigReplication() throws Exception {
clearIndexWithReplication();
nDocs--;
@@ -355,8 +413,7 @@ public class TestReplicationHandler exte
}
- @Test
- public void testStopPoll() throws Exception {
+ private void doTestStopPoll() throws Exception {
clearIndexWithReplication();
// Test:
@@ -423,8 +480,7 @@ public class TestReplicationHandler exte
}
- @Test
- public void testSnapPullWithMasterUrl() throws Exception {
+ private void doTestSnapPullWithMasterUrl() throws Exception {
//change solrconfig on slave
//this has no entry for pollinginterval
slave.copyConfigFile(CONF_DIR + "solrconfig-slave1.xml", "solrconfig.xml");
@@ -471,8 +527,7 @@ public class TestReplicationHandler exte
}
- @Test
- public void testReplicateAfterStartup() throws Exception {
+ private void doTestReplicateAfterStartup() throws Exception {
//stop slave
slaveJetty.stop();
@@ -528,9 +583,83 @@ public class TestReplicationHandler exte
slaveClient = createNewSolrServer(slaveJetty.getLocalPort());
}
+ private void doTestReplicateAfterCoreReload() throws Exception {
+ //stop slave
+ slaveJetty.stop();
+
+ masterClient.deleteByQuery("*:*");
+ for (int i = 0; i < 10; i++)
+ index(masterClient, "id", i, "name", "name = " + i);
+
+ masterClient.commit();
+
+ NamedList masterQueryRsp = rQuery(10, "*:*", masterClient);
+ SolrDocumentList masterQueryResult = (SolrDocumentList) masterQueryRsp.get("response");
+ assertEquals(10, masterQueryResult.getNumFound());
+
+ //change solrconfig having 'replicateAfter startup' option on master
+ master.copyConfigFile(CONF_DIR + "solrconfig-master3.xml",
+ "solrconfig.xml");
+
+ masterJetty.stop();
+
+ masterJetty = createJetty(master);
+ masterClient = createNewSolrServer(masterJetty.getLocalPort());
+
+ slave.setTestPort(masterJetty.getLocalPort());
+ slave.copyConfigFile(slave.getSolrConfigFile(), "solrconfig.xml");
+
+ //start slave
+ slaveJetty = createJetty(slave);
+ slaveClient = createNewSolrServer(slaveJetty.getLocalPort());
+
+ //get docs from slave and check if number is equal to master
+ NamedList slaveQueryRsp = rQuery(10, "*:*", slaveClient);
+ SolrDocumentList slaveQueryResult = (SolrDocumentList) slaveQueryRsp.get("response");
+ assertEquals(10, slaveQueryResult.getNumFound());
+
+ //compare results
+ String cmp = TestDistributedSearch.compare(masterQueryResult, slaveQueryResult, 0, null);
+ assertEquals(null, cmp);
+
+ Object version = getIndexVersion(masterClient).get("indexversion");
+ NamedList<Object> commits = getCommits(masterClient);
+
+ reloadCore(masterClient, "collection1");
+
+ assertEquals(version, getIndexVersion(masterClient).get("indexversion"));
+ assertEquals(commits.get("commits"), getCommits(masterClient).get("commits"));
+
+ index(masterClient, "id", 110, "name", "name = 1");
+ index(masterClient, "id", 120, "name", "name = 2");
+
+ masterClient.commit();
+
+ NamedList resp = rQuery(12, "*:*", masterClient);
+ masterQueryResult = (SolrDocumentList) resp.get("response");
+ assertEquals(12, masterQueryResult.getNumFound());
+
+ //get docs from slave and check if number is equal to master
+ slaveQueryRsp = rQuery(12, "*:*", slaveClient);
+ slaveQueryResult = (SolrDocumentList) slaveQueryRsp.get("response");
+ assertEquals(12, slaveQueryResult.getNumFound());
+
+ // NOTE: revert config on master.
+ master.copyConfigFile(CONF_DIR + "solrconfig-master.xml", "solrconfig.xml");
+ masterJetty.stop();
+ masterJetty = createJetty(master);
+ masterClient = createNewSolrServer(masterJetty.getLocalPort());
+
+ slave.setTestPort(masterJetty.getLocalPort());
+ slave.copyConfigFile(slave.getSolrConfigFile(), "solrconfig.xml");
+
+ //start slave
+ slaveJetty.stop();
+ slaveJetty = createJetty(slave);
+ slaveClient = createNewSolrServer(slaveJetty.getLocalPort());
+ }
- @Test
- public void testIndexAndConfigAliasReplication() throws Exception {
+ private void doTestIndexAndConfigAliasReplication() throws Exception {
clearIndexWithReplication();
nDocs--;
@@ -604,8 +733,7 @@ public class TestReplicationHandler exte
- @Test
- public void testBackup() throws Exception {
+ private void doTestBackup() throws Exception {
masterJetty.stop();
master.copyConfigFile(CONF_DIR + "solrconfig-master1.xml",
"solrconfig.xml");
Modified: lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/request/TestBinaryResponseWriter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/request/TestBinaryResponseWriter.java?rev=1160700&r1=1160699&r2=1160700&view=diff
==============================================================================
--- lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/request/TestBinaryResponseWriter.java (original)
+++ lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/request/TestBinaryResponseWriter.java Tue Aug 23 14:06:58 2011
@@ -22,7 +22,10 @@ import org.apache.solr.common.params.Com
import org.apache.solr.common.util.NamedList;
import org.apache.solr.common.util.JavaBinCodec;
import org.apache.solr.response.BinaryQueryResponseWriter;
+import org.apache.solr.response.BinaryResponseWriter.Resolver;
import org.apache.solr.response.SolrQueryResponse;
+import org.apache.solr.search.ReturnFields;
+
import org.apache.solr.util.AbstractSolrTestCase;
import java.io.ByteArrayInputStream;
@@ -70,4 +73,31 @@ public class TestBinaryResponseWriter ex
req.close();
}
+
+ public void testResolverSolrDocumentPartialFields() throws Exception {
+ LocalSolrQueryRequest req = lrf.makeRequest("q", "*:*",
+ "fl", "id,xxx,ddd_s");
+ SolrDocument in = new SolrDocument();
+ in.addField("id", 345);
+ in.addField("aaa_s", "aaa");
+ in.addField("bbb_s", "bbb");
+ in.addField("ccc_s", "ccc");
+ in.addField("ddd_s", "ddd");
+ in.addField("eee_s", "eee");
+
+ Resolver r = new Resolver(req, new ReturnFields(req));
+ Object o = r.resolve(in, new JavaBinCodec());
+
+ assertNotNull("obj is null", o);
+ assertTrue("obj is not doc", o instanceof SolrDocument);
+
+ SolrDocument out = (SolrDocument) o;
+ assertTrue("id not found", out.getFieldNames().contains("id"));
+ assertTrue("ddd_s not found", out.getFieldNames().contains("ddd_s"));
+ assertEquals("Wrong number of fields found",
+ 2, out.getFieldNames().size());
+
+
+ }
+
}
Modified: lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/request/TestFaceting.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/request/TestFaceting.java?rev=1160700&r1=1160699&r2=1160700&view=diff
==============================================================================
--- lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/request/TestFaceting.java (original)
+++ lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/request/TestFaceting.java Tue Aug 23 14:06:58 2011
@@ -38,6 +38,12 @@ public class TestFaceting extends SolrTe
initCore("solrconfig.xml","schema11.xml");
}
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ clearIndex();
+ }
+
@After
@Override
public void tearDown() throws Exception {
Modified: lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/schema/BadIndexSchemaTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/schema/BadIndexSchemaTest.java?rev=1160700&r1=1160699&r2=1160700&view=diff
==============================================================================
--- lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/schema/BadIndexSchemaTest.java (original)
+++ lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/schema/BadIndexSchemaTest.java Tue Aug 23 14:06:58 2011
@@ -49,6 +49,14 @@ public class BadIndexSchemaTest extends
}
@Test
+ public void testSevereErrorsForInvalidFieldOptions() throws Exception {
+ doTest("bad-schema-not-indexed-but-norms.xml", "bad_field");
+ doTest("bad-schema-not-indexed-but-tf.xml", "bad_field");
+ doTest("bad-schema-not-indexed-but-pos.xml", "bad_field");
+ doTest("bad-schema-omit-tf-but-not-pos.xml", "bad_field");
+ }
+
+ @Test
public void testSevereErrorsForDuplicateFields() throws Exception {
doTest("bad-schema-dup-field.xml", "fAgain");
}
Modified: lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/schema/RequiredFieldsTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/schema/RequiredFieldsTest.java?rev=1160700&r1=1160699&r2=1160700&view=diff
==============================================================================
--- lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/schema/RequiredFieldsTest.java (original)
+++ lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/schema/RequiredFieldsTest.java Tue Aug 23 14:06:58 2011
@@ -33,6 +33,12 @@ public class RequiredFieldsTest extends
initCore("solrconfig.xml","schema-required-fields.xml");
}
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ clearIndex();
+ }
+
@Test
public void testRequiredFieldsConfig() {
SolrCore core = h.getCore();
@@ -81,7 +87,6 @@ public class RequiredFieldsTest extends
// Check to make sure this submission did not succeed
assertQ("should not find any", req("id:531") ,"//result[@numFound=0]" );
- clearIndex();
}
@Test
Modified: lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/search/TestFiltering.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/search/TestFiltering.java?rev=1160700&r1=1160699&r2=1160700&view=diff
==============================================================================
--- lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/search/TestFiltering.java (original)
+++ lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/search/TestFiltering.java Tue Aug 23 14:06:58 2011
@@ -36,6 +36,7 @@ public class TestFiltering extends SolrT
public void testCaching() throws Exception {
+ clearIndex();
assertU(adoc("id","4", "val_i","1"));
assertU(adoc("id","1", "val_i","2"));
assertU(adoc("id","3", "val_i","3"));
@@ -101,6 +102,10 @@ public class TestFiltering extends SolrT
);
assertEquals(0, DelegatingCollector.setLastDelegateCount - prevCount);
+ // test that offset works when not caching main query
+ assertJQ(req("q","{!cache=false}*:*", "start","2", "rows","1", "sort","val_i asc", "fl","val_i")
+ ,"/response/docs==[{'val_i':3}]"
+ );
}
Modified: lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/search/TestSort.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/search/TestSort.java?rev=1160700&r1=1160699&r2=1160700&view=diff
==============================================================================
--- lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/search/TestSort.java (original)
+++ lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/search/TestSort.java Tue Aug 23 14:06:58 2011
@@ -24,21 +24,28 @@ import org.apache.lucene.index.IndexRead
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.search.*;
+import org.apache.lucene.search.SortField.Type;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.util.OpenBitSet;
-import org.apache.solr.util.AbstractSolrTestCase;
+import org.apache.lucene.util._TestUtil;
+
+import org.apache.solr.request.SolrQueryRequest;
+
+import org.apache.solr.SolrTestCaseJ4;
+
+import org.junit.BeforeClass;
import java.io.IOException;
import java.util.*;
-public class TestSort extends AbstractSolrTestCase {
- @Override
- public String getSchemaFile() { return null; }
- @Override
- public String getSolrConfigFile() { return null; }
+public class TestSort extends SolrTestCaseJ4 {
+ @BeforeClass
+ public static void beforeClass() throws Exception {
+ initCore("solrconfig.xml","schema-minimal.xml");
+ }
- Random r = random;
+ final Random r = random;
int ndocs = 77;
int iter = 50;
@@ -57,6 +64,92 @@ public class TestSort extends AbstractSo
}
}
+ public void testRandomFieldNameSorts() throws Exception {
+ SolrQueryRequest req = lrf.makeRequest("q", "*:*");
+
+ final int iters = atLeast(5000);
+ int numberOfOddities = 0;
+
+ for (int i = 0; i < iters; i++) {
+ final StringBuilder input = new StringBuilder();
+ final String[] names = new String[_TestUtil.nextInt(r,1,10)];
+ final boolean[] reverse = new boolean[names.length];
+ for (int j = 0; j < names.length; j++) {
+ names[j] = _TestUtil.randomRealisticUnicodeString(r, 1, 20);
+
+ // reduce the likelyhood that the random str is a valid query or func
+ names[j] = names[j].replaceFirst("\\{","\\{\\{");
+ names[j] = names[j].replaceFirst("\\(","\\(\\(");
+ names[j] = names[j].replaceFirst("(\\\"|\\')","$1$1");
+ names[j] = names[j].replaceFirst("(\\d)","$1x");
+
+ // eliminate pesky problem chars
+ names[j] = names[j].replaceAll("\\p{Cntrl}|\\p{javaWhitespace}","");
+
+ if (0 == names[j].length()) {
+ numberOfOddities++;
+ // screw it, i'm taking my toys and going home
+ names[j] = "last_ditch_i_give_up";
+ }
+ reverse[j] = r.nextBoolean();
+
+ input.append(r.nextBoolean() ? " " : "");
+ input.append(names[j]);
+ input.append(" ");
+ input.append(reverse[j] ? "desc," : "asc,");
+ }
+ input.deleteCharAt(input.length()-1);
+ SortField[] sorts = null;
+ try {
+ sorts = QueryParsing.parseSort(input.toString(), req).getSort();
+ } catch (RuntimeException e) {
+ throw new RuntimeException("Failed to parse sort: " + input, e);
+ }
+ assertEquals("parsed sorts had unexpected size",
+ names.length, sorts.length);
+ for (int j = 0; j < names.length; j++) {
+ assertEquals("sorts["+j+"] had unexpected reverse: " + input,
+ reverse[j], sorts[j].getReverse());
+
+ final Type type = sorts[j].getType();
+
+ if (Type.SCORE.equals(type)) {
+ numberOfOddities++;
+ assertEquals("sorts["+j+"] is (unexpectedly) type score : " + input,
+ "score", names[j]);
+ } else if (Type.DOC.equals(type)) {
+ numberOfOddities++;
+ assertEquals("sorts["+j+"] is (unexpectedly) type doc : " + input,
+ "_docid_", names[j]);
+ } else if (Type.CUSTOM.equals(type) || Type.REWRITEABLE.equals(type)) {
+ numberOfOddities++;
+
+ // our orig string better be parsable as a func/query
+ QParser qp =
+ QParser.getParser(names[j], FunctionQParserPlugin.NAME, req);
+ try {
+ Query q = qp.getQuery();
+ assertNotNull("sorts["+j+"] had type " + type +
+ " but parsed to null func/query: " + input, q);
+ } catch (Exception e) {
+ assertNull("sorts["+j+"] had type " + type +
+ " but errored parsing as func/query: " + input, e);
+ }
+ } else {
+ assertEquals("sorts["+j+"] had unexpected field: " + input,
+ names[j], sorts[j].getField());
+ }
+ }
+ }
+
+ assertTrue("Over 0.2% oddities in test: " +
+ numberOfOddities + "/" + iters +
+ " have func/query parsing semenatics gotten broader?",
+ numberOfOddities < 0.002 * iters);
+ }
+
+
+
public void testSort() throws Exception {
Directory dir = new RAMDirectory();
Field f = new Field("f","0", Field.Store.NO, Field.Index.NOT_ANALYZED_NO_NORMS);
Modified: lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/search/function/TestFunctionQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/search/function/TestFunctionQuery.java?rev=1160700&r1=1160699&r2=1160700&view=diff
==============================================================================
--- lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/search/function/TestFunctionQuery.java (original)
+++ lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/search/function/TestFunctionQuery.java Tue Aug 23 14:06:58 2011
@@ -284,6 +284,18 @@ public class TestFunctionQuery extends S
}
@Test
+ public void testExternalFileFieldStringKeys() throws Exception {
+ final String extField = "foo_extfs";
+ final String keyField = "sfile_s";
+ assertU(adoc("id", "991", keyField, "AAA=AAA"));
+ assertU(adoc("id", "992", keyField, "BBB"));
+ assertU(adoc("id", "993", keyField, "CCC=CCC"));
+ assertU(commit());
+ makeExternalFile(extField, "AAA=AAA=543210\nBBB=-8\nCCC=CCC=250","UTF-8");
+ singleTest(extField,"\0",991,543210,992,-8,993,250);
+ }
+
+ @Test
public void testGeneral() throws Exception {
clearIndex();
@@ -422,9 +434,15 @@ public class TestFunctionQuery extends S
@Test
public void testSortByFunc() throws Exception {
- assertU(adoc("id", "1", "const_s", "xx", "x_i", "100", "1_s", "a"));
- assertU(adoc("id", "2", "const_s", "xx", "x_i", "300", "1_s", "c"));
- assertU(adoc("id", "3", "const_s", "xx", "x_i", "200", "1_s", "b"));
+ assertU(adoc("id", "1", "const_s", "xx",
+ "x_i", "100", "1_s", "a",
+ "x:x_i", "100", "1-1_s", "a"));
+ assertU(adoc("id", "2", "const_s", "xx",
+ "x_i", "300", "1_s", "c",
+ "x:x_i", "300", "1-1_s", "c"));
+ assertU(adoc("id", "3", "const_s", "xx",
+ "x_i", "200", "1_s", "b",
+ "x:x_i", "200", "1-1_s", "b"));
assertU(commit());
String desc = "/response/docs==[{'x_i':300},{'x_i':200},{'x_i':100}]";
@@ -482,6 +500,12 @@ public class TestFunctionQuery extends S
assertJQ(req("q",q, "fl","x_i", "sort", "1_s asc")
,asc
);
+ assertJQ(req("q",q, "fl","x_i", "sort", "x:x_i desc")
+ ,desc
+ );
+ assertJQ(req("q",q, "fl","x_i", "sort", "1-1_s asc")
+ ,asc
+ );
// really ugly field name that isn't a java Id, and can't be
// parsed as a func, but sorted fine in Solr 1.4
Modified: lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/update/AutoCommitTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/update/AutoCommitTest.java?rev=1160700&r1=1160699&r2=1160700&view=diff
==============================================================================
--- lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/update/AutoCommitTest.java (original)
+++ lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/update/AutoCommitTest.java Tue Aug 23 14:06:58 2011
@@ -31,10 +31,24 @@ import org.apache.solr.handler.XmlUpdate
import org.apache.solr.request.SolrQueryRequestBase;
import org.apache.solr.response.SolrQueryResponse;
import org.apache.solr.search.SolrIndexSearcher;
+import org.apache.solr.update.NewSearcherListener.TriggerOn;
import org.apache.solr.util.AbstractSolrTestCase;
class NewSearcherListener implements SolrEventListener {
+
+ enum TriggerOn {Both, Soft, Hard}
+
private volatile boolean triggered = false;
+ private volatile TriggerOn lastType;
+ private volatile TriggerOn triggerOnType;
+
+ public NewSearcherListener() {
+ this(TriggerOn.Both);
+ }
+
+ public NewSearcherListener(TriggerOn type) {
+ this.triggerOnType = type;
+ }
@Override
public void init(NamedList args) {}
@@ -42,14 +56,24 @@ class NewSearcherListener implements Sol
@Override
public void newSearcher(SolrIndexSearcher newSearcher,
SolrIndexSearcher currentSearcher) {
- triggered = true;
+ if (triggerOnType == TriggerOn.Soft && lastType == TriggerOn.Soft) {
+ triggered = true;
+ } else if (triggerOnType == TriggerOn.Hard && lastType == TriggerOn.Hard) {
+ triggered = true;
+ } else if (triggerOnType == TriggerOn.Both) {
+ triggered = true;
+ }
}
@Override
- public void postCommit() {}
+ public void postCommit() {
+ lastType = TriggerOn.Hard;
+ }
@Override
- public void postSoftCommit() {}
+ public void postSoftCommit() {
+ lastType = TriggerOn.Soft;
+ }
public void reset() {
triggered = false;
@@ -99,8 +123,8 @@ public class AutoCommitTest extends Abst
DirectUpdateHandler2 updateHandler = (DirectUpdateHandler2)core.getUpdateHandler();
CommitTracker tracker = updateHandler.commitTracker;
- tracker.timeUpperBound = -1;
- tracker.docsUpperBound = 14;
+ tracker.setTimeUpperBound(-1);
+ tracker.setDocsUpperBound(14);
core.registerNewSearcherListener(trigger);
@@ -148,8 +172,8 @@ public class AutoCommitTest extends Abst
CommitTracker tracker = updater.commitTracker;
// too low of a number can cause a slow host to commit before the test code checks that it
// isn't there... causing a failure at "shouldn't find any"
- tracker.timeUpperBound = 1000;
- tracker.docsUpperBound = -1;
+ tracker.setTimeUpperBound(1000);
+ tracker.setDocsUpperBound(-1);
// updater.commitCallbacks.add(trigger);
XmlUpdateRequestHandler handler = new XmlUpdateRequestHandler();
@@ -217,21 +241,27 @@ public class AutoCommitTest extends Abst
public void testSoftCommitMaxDocs() throws Exception {
SolrCore core = h.getCore();
- NewSearcherListener trigger = new NewSearcherListener();
+ NewSearcherListener trigger = new NewSearcherListener(TriggerOn.Hard);
+ core.registerNewSearcherListener(trigger);
+
DirectUpdateHandler2 updateHandler = (DirectUpdateHandler2)core.getUpdateHandler();
+ updateHandler.registerCommitCallback(trigger);
+
CommitTracker tracker = updateHandler.commitTracker;
- tracker.timeUpperBound = -1;
- tracker.docsUpperBound = 8;
+ tracker.setTimeUpperBound(-1);
+ tracker.setDocsUpperBound(8);
- NewSearcherListener softTrigger = new NewSearcherListener();
-
- CommitTracker softTracker = updateHandler.softCommitTracker;
- softTracker.timeUpperBound = -1;
- softTracker.docsUpperBound = 4;
+ NewSearcherListener softTrigger = new NewSearcherListener(TriggerOn.Soft);
+ updateHandler.registerSoftCommitCallback(softTrigger);
core.registerNewSearcherListener(softTrigger);
+ CommitTracker softTracker = updateHandler.softCommitTracker;
+ softTracker.setTimeUpperBound(-1);
+ softTracker.setDocsUpperBound(4);
+
+
XmlUpdateRequestHandler handler = new XmlUpdateRequestHandler();
handler.init( null );
@@ -254,8 +284,7 @@ public class AutoCommitTest extends Abst
handler.handleRequest( req, rsp );
assertTrue(softTrigger.waitForNewSearcher(10000));
-
- core.registerNewSearcherListener(trigger);
+ softTrigger.reset();
assertQ("should find 5", req("*:*") ,"//result[@numFound=5]" );
assertEquals( 1, softTracker.getCommitCount());
@@ -279,10 +308,12 @@ public class AutoCommitTest extends Abst
}
req.close();
+ assertTrue(softTrigger.waitForNewSearcher(10000));
+ softTrigger.reset();
assertTrue(trigger.waitForNewSearcher(10000));
assertQ("should find 10", req("*:*") ,"//result[@numFound=10]" );
- assertEquals( 1, softTracker.getCommitCount());
+ assertEquals( 2, softTracker.getCommitCount());
assertEquals( 1, tracker.getCommitCount());
}
@@ -296,8 +327,8 @@ public class AutoCommitTest extends Abst
// too low of a number can cause a slow host to commit before the test code checks that it
// isn't there... causing a failure at "shouldn't find any"
- softTracker.timeUpperBound = 2000;
- softTracker.docsUpperBound = -1;
+ softTracker.setTimeUpperBound(2000);
+ softTracker.setDocsUpperBound(-1);
// updater.commitCallbacks.add(trigger);
XmlUpdateRequestHandler handler = new XmlUpdateRequestHandler();
@@ -362,4 +393,109 @@ public class AutoCommitTest extends Abst
assertQ("now it should", req("id:500") ,"//result[@numFound=1]" );
assertQ("but not this", req("id:531") ,"//result[@numFound=0]" );
}
+
+ public void testSoftAndHardCommitMaxTime() throws Exception {
+ SolrCore core = h.getCore();
+ NewSearcherListener softTrigger = new NewSearcherListener(TriggerOn.Soft);
+ NewSearcherListener hardTrigger = new NewSearcherListener(TriggerOn.Hard);
+ core.registerNewSearcherListener(softTrigger);
+ core.registerNewSearcherListener(hardTrigger);
+ DirectUpdateHandler2 updater = (DirectUpdateHandler2) core.getUpdateHandler();
+
+ updater.registerCommitCallback(softTrigger);
+ updater.registerSoftCommitCallback(softTrigger);
+ updater.registerCommitCallback(hardTrigger);
+ updater.registerSoftCommitCallback(hardTrigger);
+
+ CommitTracker hardTracker = updater.commitTracker;
+ CommitTracker softTracker = updater.softCommitTracker;
+
+ // too low of a number can cause a slow host to commit before the test code checks that it
+ // isn't there... causing a failure at "shouldn't find any"
+ softTracker.setTimeUpperBound(500);
+ softTracker.setDocsUpperBound(-1);
+ hardTracker.setTimeUpperBound(1200);
+ hardTracker.setDocsUpperBound(-1);
+ // updater.commitCallbacks.add(trigger);
+
+ XmlUpdateRequestHandler handler = new XmlUpdateRequestHandler();
+ handler.init( null );
+
+ MapSolrParams params = new MapSolrParams( new HashMap<String, String>() );
+
+ // Add a single document
+ SolrQueryResponse rsp = new SolrQueryResponse();
+ SolrQueryRequestBase req = new SolrQueryRequestBase( core, params ) {};
+ req.setContentStreams( toContentStreams(
+ adoc("id", "529", "field_t", "what's inside?", "subject", "info"), null ) );
+
+ handler.handleRequest( req, rsp );
+
+ // Check if it is in the index
+ assertQ("shouldn't find any", req("id:529") ,"//result[@numFound=0]" );
+
+ // Wait longer than the autocommit time
+ assertTrue(softTrigger.waitForNewSearcher(30000));
+ softTrigger.reset();
+ req.setContentStreams( toContentStreams(
+ adoc("id", "530", "field_t", "what's inside?", "subject", "info"), null ) );
+ handler.handleRequest( req, rsp );
+
+ // Now make sure we can find it
+ assertQ("should find one", req("id:529") ,"//result[@numFound=1]" );
+ // But not this one
+ assertQ("should find none", req("id:530") ,"//result[@numFound=0]" );
+
+ // Delete the document
+ assertU( delI("529") );
+ assertQ("deleted, but should still be there", req("id:529") ,"//result[@numFound=1]" );
+
+ // Wait longer than the autocommit time - wait twice to ensure latest is picked up
+ assertTrue(softTrigger.waitForNewSearcher(15000));
+ softTrigger.reset();
+
+
+ req.setContentStreams( toContentStreams(
+ adoc("id", "550", "field_t", "what's inside?", "subject", "info"), null ) );
+ handler.handleRequest( req, rsp );
+ int totalCommits = softTracker.getCommitCount() + hardTracker.getCommitCount();
+ assertTrue("expected:>=2 but got " + totalCommits, totalCommits >= 2);
+ assertQ("deleted and time has passed", req("id:529") ,"//result[@numFound=0]" );
+
+ // now make the call 5 times really fast and make sure it
+ // only commits once
+ req.setContentStreams( toContentStreams(
+ adoc("id", "500" ), null ) );
+ for( int i=0;i<5; i++ ) {
+ handler.handleRequest( req, rsp );
+ }
+ assertQ("should not be there yet", req("id:500") ,"//result[@numFound=0]" );
+
+ // Wait longer than the autocommit time
+ assertTrue(softTrigger.waitForNewSearcher(15000));
+ softTrigger.reset();
+
+ req.setContentStreams( toContentStreams(
+ adoc("id", "531", "field_t", "what's inside?", "subject", "info"), null ) );
+ handler.handleRequest( req, rsp );
+
+ // depending on timing, you might see 2 or 3 soft commits
+ int softCommitCnt = softTracker.getCommitCount();
+ assertTrue("commit cnt:" + softCommitCnt, softCommitCnt == 2
+ || softCommitCnt == 3);
+
+ // depending on timing, you might see 1 or 2 hard commits
+ assertTrue(hardTrigger.waitForNewSearcher(15000));
+ hardTrigger.reset();
+
+ int hardCommitCnt = hardTracker.getCommitCount();
+ assertTrue("commit cnt:" + hardCommitCnt, hardCommitCnt == 1
+ || hardCommitCnt == 2);
+
+ assertTrue(softTrigger.waitForNewSearcher(15000));
+ softTrigger.reset();
+
+ assertQ("now it should", req("id:500") ,"//result[@numFound=1]" );
+ assertQ("but not this", req("id:531") ,"//result[@numFound=1]" );
+ }
}
Modified: lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/update/DirectUpdateHandlerOptimizeTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/update/DirectUpdateHandlerOptimizeTest.java?rev=1160700&r1=1160699&r2=1160700&view=diff
==============================================================================
--- lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/update/DirectUpdateHandlerOptimizeTest.java (original)
+++ lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/update/DirectUpdateHandlerOptimizeTest.java Tue Aug 23 14:06:58 2011
@@ -18,6 +18,7 @@ package org.apache.solr.update;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
+import org.apache.solr.common.SolrInputDocument;
import org.apache.solr.core.SolrCore;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.util.AbstractSolrTestCase;
@@ -55,9 +56,9 @@ public class DirectUpdateHandlerOptimize
//the merge factor is 100 and the maxBufferedDocs is 2, so there should be 50 segments
for (int i = 0; i < 99; i++) {
// Add a valid document
- cmd.doc = new Document();
- cmd.doc.add(new Field("id", "id_" + i, Field.Store.YES, Field.Index.NOT_ANALYZED));
- cmd.doc.add(new Field("subject", "subject_" + i, Field.Store.NO, Field.Index.ANALYZED));
+ cmd.solrDoc = new SolrInputDocument();
+ cmd.solrDoc.addField("id", "id_" + i);
+ cmd.solrDoc.addField("subject", "subject_" + i);
updater.addDoc(cmd);
}
Modified: lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/update/TestIndexingPerformance.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/update/TestIndexingPerformance.java?rev=1160700&r1=1160699&r2=1160700&view=diff
==============================================================================
--- lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/update/TestIndexingPerformance.java (original)
+++ lucene/dev/branches/flexscoring/solr/core/src/test/org/apache/solr/update/TestIndexingPerformance.java Tue Aug 23 14:06:58 2011
@@ -20,6 +20,7 @@ package org.apache.solr.update;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.Fieldable;
+import org.apache.solr.common.SolrInputDocument;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.schema.IndexSchema;
import org.apache.solr.util.AbstractSolrTestCase;
@@ -50,7 +51,6 @@ public class TestIndexingPerformance ext
int iter=1000;
String iterS = System.getProperty("iter");
if (iterS != null) iter=Integer.parseInt(iterS);
- boolean includeDoc = Boolean.parseBoolean(System.getProperty("includeDoc","true")); // include the time to create the document
boolean overwrite = Boolean.parseBoolean(System.getProperty("overwrite","false"));
String doc = System.getProperty("doc");
if (doc != null) {
@@ -61,14 +61,15 @@ public class TestIndexingPerformance ext
SolrQueryRequest req = lrf.makeRequest();
IndexSchema schema = req.getSchema();
UpdateHandler updateHandler = req.getCore().getUpdateHandler();
+ String field = "textgap";
- String[] fields = {"text","simple"
- ,"text","test"
- ,"text","how now brown cow"
- ,"text","what's that?"
- ,"text","radical!"
- ,"text","what's all this about, anyway?"
- ,"text","just how fast is this text indexing?"
+ String[] fields = {field,"simple"
+ ,field,"test"
+ ,field,"how now brown cow"
+ ,field,"what's that?"
+ ,field,"radical!"
+ ,field,"what's all this about, anyway?"
+ ,field,"just how fast is this text indexing?"
};
@@ -91,26 +92,21 @@ public class TestIndexingPerformance ext
long start = System.currentTimeMillis();
AddUpdateCommand add = new AddUpdateCommand(req);
-
- Field idField=null;
+ add.overwrite = overwrite;
for (int i=0; i<iter; i++) {
- if (includeDoc || add.doc==null) {
- add.doc = new Document();
- idField = new Field("id","", Field.Store.YES, Field.Index.NOT_ANALYZED);
- add.doc.add(idField);
- for (int j=0; j<fields.length; j+=2) {
- String field = fields[j];
- String val = fields[j+1];
- Fieldable f = schema.getField(field).createField(val, 1.0f);
- add.doc.add(f);
- }
+ add.clear();
+ add.solrDoc = new SolrInputDocument();
+ add.solrDoc.addField("id", Integer.toString(i));
+ for (int j=0; j<fields.length; j+=2) {
+ String f = fields[j];
+ String val = fields[j+1];
+ add.solrDoc.addField(f, val);
}
- idField.setValue(Integer.toString(i));
updateHandler.addDoc(add);
}
long end = System.currentTimeMillis();
- log.info("includeDoc="+includeDoc+" doc="+ Arrays.toString(fields));
+ log.info("doc="+ Arrays.toString(fields));
log.info("iter="+iter +" time=" + (end-start) + " throughput=" + ((long)iter*1000)/(end-start));
//discard all the changes
Modified: lucene/dev/branches/flexscoring/solr/example/multicore/core0/conf/solrconfig.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/flexscoring/solr/example/multicore/core0/conf/solrconfig.xml?rev=1160700&r1=1160699&r2=1160700&view=diff
==============================================================================
--- lucene/dev/branches/flexscoring/solr/example/multicore/core0/conf/solrconfig.xml (original)
+++ lucene/dev/branches/flexscoring/solr/example/multicore/core0/conf/solrconfig.xml Tue Aug 23 14:06:58 2011
@@ -27,6 +27,7 @@
solr.RAMDirectoryFactory is memory based, not persistent, and doesn't work with replication. -->
<directoryFactory name="DirectoryFactory" class="${solr.directoryFactory:solr.StandardDirectoryFactory}"/>
+ <dataDir>${solr.core0.data.dir:}</dataDir>
<updateHandler class="solr.DirectUpdateHandler2" />
Modified: lucene/dev/branches/flexscoring/solr/example/multicore/core1/conf/solrconfig.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/flexscoring/solr/example/multicore/core1/conf/solrconfig.xml?rev=1160700&r1=1160699&r2=1160700&view=diff
==============================================================================
--- lucene/dev/branches/flexscoring/solr/example/multicore/core1/conf/solrconfig.xml (original)
+++ lucene/dev/branches/flexscoring/solr/example/multicore/core1/conf/solrconfig.xml Tue Aug 23 14:06:58 2011
@@ -27,6 +27,8 @@
solr.RAMDirectoryFactory is memory based, not persistent, and doesn't work with replication. -->
<directoryFactory name="DirectoryFactory" class="${solr.directoryFactory:solr.StandardDirectoryFactory}"/>
+ <dataDir>${solr.core1.data.dir:}</dataDir>
+
<updateHandler class="solr.DirectUpdateHandler2" />
<requestDispatcher handleSelect="true" >
Modified: lucene/dev/branches/flexscoring/solr/example/solr/conf/solrconfig.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/flexscoring/solr/example/solr/conf/solrconfig.xml?rev=1160700&r1=1160699&r2=1160700&view=diff
==============================================================================
--- lucene/dev/branches/flexscoring/solr/example/solr/conf/solrconfig.xml (original)
+++ lucene/dev/branches/flexscoring/solr/example/solr/conf/solrconfig.xml Tue Aug 23 14:06:58 2011
@@ -87,7 +87,12 @@
<!-- The DirectoryFactory to use for indexes.
solr.StandardDirectoryFactory, the default, is filesystem
- based. solr.RAMDirectoryFactory is memory based, not
+ based and tries to pick the best implementation for the current
+ JVM and platform. One can force a particular implementation
+ via solr.MMapDirectoryFactory, solr.NIOFSDirectoryFactory, or
+ solr.SimpleFSDirectoryFactory.
+
+ solr.RAMDirectoryFactory is memory based, not
persistent, and doesn't work with replication.
-->
<directoryFactory name="DirectoryFactory"
@@ -1106,37 +1111,39 @@
component
-->
- <!-- a spellchecker built from a field of the main index, and
- written to disk
- -->
+ <!-- a spellchecker built from a field of the main index -->
<lst name="spellchecker">
<str name="name">default</str>
<str name="field">name</str>
- <str name="spellcheckIndexDir">spellchecker</str>
- <!-- uncomment this to require terms to occur in 1% of the documents in order to be included in the dictionary
+ <str name="classname">solr.DirectSolrSpellChecker</str>
+ <!-- the spellcheck distance measure used, the default is the internal levenshtein -->
+ <str name="distanceMeasure">internal</str>
+ <!-- minimum accuracy needed to be considered a valid spellcheck suggestion -->
+ <float name="accuracy">0.5</float>
+ <!-- the maximum #edits we consider when enumerating terms: can be 1 or 2 -->
+ <int name="maxEdits">2</int>
+ <!-- the minimum shared prefix when enumerating terms -->
+ <int name="minPrefix">1</int>
+ <!-- maximum number of inspections per result. -->
+ <int name="maxInspections">5</int>
+ <!-- minimum length of a query term to be considered for correction -->
+ <int name="minQueryLength">4</int>
+ <!-- maximum threshold of documents a query term can appear to be considered for correction -->
+ <float name="maxQueryFrequency">0.01</float>
+ <!-- uncomment this to require suggestions to occur in 1% of the documents
<float name="thresholdTokenFrequency">.01</float>
-->
</lst>
- <!-- a spellchecker that uses no auxiliary on disk index -->
- <!--
- <lst name="spellchecker">
- <str name="name">direct</str>
- <str name="field">name</str>
- <str name="classname">solr.DirectSolrSpellChecker</str>
- <int name="minPrefix">1</int>
- </lst>
- -->
-
<!-- a spellchecker that uses a different distance measure -->
<!--
<lst name="spellchecker">
<str name="name">jarowinkler</str>
<str name="field">spell</str>
+ <str name="classname">solr.DirectSolrSpellChecker</str>
<str name="distanceMeasure">
org.apache.lucene.search.spell.JaroWinklerDistance
</str>
- <str name="spellcheckIndexDir">spellcheckerJaro</str>
</lst>
-->
@@ -1151,9 +1158,8 @@
<lst name="spellchecker">
<str name="name">freq</str>
<str name="field">lowerfilt</str>
- <str name="spellcheckIndexDir">spellcheckerFreq</str>
+ <str name="classname">solr.DirectSolrSpellChecker</str>
<str name="comparatorClass">freq</str>
- <str name="buildOnCommit">true</str>
-->
<!-- A spellchecker that reads the list of words from a file -->
Modified: lucene/dev/branches/flexscoring/solr/site-src/src/documentation/content/xdocs/index.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/flexscoring/solr/site-src/src/documentation/content/xdocs/index.xml?rev=1160700&r1=1160699&r2=1160700&view=diff
==============================================================================
--- lucene/dev/branches/flexscoring/solr/site-src/src/documentation/content/xdocs/index.xml (original)
+++ lucene/dev/branches/flexscoring/solr/site-src/src/documentation/content/xdocs/index.xml Tue Aug 23 14:06:58 2011
@@ -66,6 +66,42 @@ customization is required.
</section>
<section id="news">
<title>News</title>
+<section><title>28 July 2011 - WARNING: Index corruption and crashes in Apache Lucene Core / Apache Solr with Java 7</title>
+ <p>Oracle released <a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">Java 7</a> today.
+ Unfortunately it contains hotspot compiler optimizations, which miscompile some loops.
+ This can affect code of several Apache projects. Sometimes JVMs only crash, but in several cases,
+ results calculated can be incorrect, leading to bugs in applications
+ (see Hotspot bugs <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7070134">7070134</a>,
+ <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7044738">7044738</a>,
+ <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7068051">7068051</a>).</p>
+ <p><strong>Apache Lucene Core</strong> and <strong>Apache Solr</strong> are two Apache projects,
+ which are affected by these bugs, namely all versions released until today.
+ Solr users with the default configuration will have
+ Java crashing with <code>SIGSEGV</code> as soon as they start to index documents, as one
+ affected part is the well-known Porter stemmer
+ (see <a href="https://issues.apache.org/jira/browse/LUCENE-3335">LUCENE-3335</a>).
+ Other loops in Lucene may be miscompiled, too, leading to index corruption
+ (especially on Lucene trunk with pulsing codec; other loops may be
+ affected, too - <a href="https://issues.apache.org/jira/browse/LUCENE-3346">LUCENE-3346</a>).</p>
+ <p>These problems were detected only 5 days before the official Java 7 release,
+ so Oracle had no time to fix those bugs, affecting also many more applications.
+ In response to our questions, they proposed to include the fixes into service
+ release u2 (eventually into service release u1, see
+ <a href="http://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/2011-July/005971.html">this mail</a>).
+ <strong>This means you cannot use Apache Lucene/Solr with Java 7 releases before Update 2!</strong>
+ If you do, please don't open bug reports, it is not the committers' fault!
+ At least disable loop optimizations using the <code>-XX:-UseLoopPredicate</code> JVM option
+ to not risk index corruptions.</p>
+ <p><em>Please note:</em> Also Java 6 users are affected, if they use one of those
+ JVM options, which are <strong>not</strong> enabled by default: <code>-XX:+OptimizeStringConcat</code>
+ or <code>-XX:+AggressiveOpts</code>.</p>
+ <p>It is strongly recommended not to use any hotspot optimization switches in any Java
+ version without extensive testing!</p>
+ <p>In case you upgrade to Java 7, remember that you may have to reindex, as the unicode
+ version shipped with Java 7 changed and tokenization behaves differently
+ (e.g. lowercasing). For more information, read <code>JRE_VERSION_MIGRATION.txt</code>
+ in your distribution package!</p>
+</section>
<section>
<title>July 2011 - Solr 3.3 Released</title>
<p>The Lucene PMC is pleased to announce the release of <a href="http://www.apache.org/dyn/closer.cgi/lucene/solr">Apache Solr 3.3</a>!
Modified: lucene/dev/branches/flexscoring/solr/site/features.pdf
URL: http://svn.apache.org/viewvc/lucene/dev/branches/flexscoring/solr/site/features.pdf?rev=1160700&r1=1160699&r2=1160700&view=diff
==============================================================================
Binary files - no diff available.