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.