You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by yo...@apache.org on 2011/10/05 23:34:55 UTC

svn commit: r1179453 [1/2] - in /lucene/dev/branches/solrcloud: ./ dev-tools/eclipse/ dev-tools/idea/lucene/contrib/ dev-tools/maven/solr/webapp/ lucene/ lucene/contrib/ lucene/contrib/misc/src/java/org/apache/lucene/index/ lucene/contrib/misc/src/java...

Author: yonik
Date: Wed Oct  5 21:34:51 2011
New Revision: 1179453

URL: http://svn.apache.org/viewvc?rev=1179453&view=rev
Log:
merge trunk

Added:
    lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/codecs/DefaultFieldsReader.java
      - copied unchanged from r1179426, lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/codecs/DefaultFieldsReader.java
    lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/codecs/DefaultFieldsWriter.java
      - copied unchanged from r1179426, lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/codecs/DefaultFieldsWriter.java
    lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/codecs/FieldsReader.java
      - copied unchanged from r1179426, lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/codecs/FieldsReader.java
    lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/codecs/FieldsWriter.java
      - copied unchanged from r1179426, lucene/dev/trunk/lucene/src/java/org/apache/lucene/index/codecs/FieldsWriter.java
    lucene/dev/branches/solrcloud/modules/facet/src/test/org/apache/lucene/facet/taxonomy/lucene/TestLuceneTaxonomyReader.java
      - copied unchanged from r1179426, lucene/dev/trunk/modules/facet/src/test/org/apache/lucene/facet/taxonomy/lucene/TestLuceneTaxonomyReader.java
    lucene/dev/branches/solrcloud/solr/contrib/extraction/lib/apache-mime4j-core-0.7.jar
      - copied unchanged from r1179426, lucene/dev/trunk/solr/contrib/extraction/lib/apache-mime4j-core-0.7.jar
    lucene/dev/branches/solrcloud/solr/contrib/extraction/lib/apache-mime4j-core-LICENSE-ASL.txt
      - copied unchanged from r1179452, lucene/dev/trunk/solr/contrib/extraction/lib/apache-mime4j-core-LICENSE-ASL.txt
    lucene/dev/branches/solrcloud/solr/contrib/extraction/lib/apache-mime4j-core-NOTICE.txt
      - copied unchanged from r1179452, lucene/dev/trunk/solr/contrib/extraction/lib/apache-mime4j-core-NOTICE.txt
    lucene/dev/branches/solrcloud/solr/contrib/extraction/lib/apache-mime4j-dom-0.7.jar
      - copied unchanged from r1179426, lucene/dev/trunk/solr/contrib/extraction/lib/apache-mime4j-dom-0.7.jar
    lucene/dev/branches/solrcloud/solr/contrib/extraction/lib/apache-mime4j-dom-LICENSE-ASL.txt
      - copied unchanged from r1179452, lucene/dev/trunk/solr/contrib/extraction/lib/apache-mime4j-dom-LICENSE-ASL.txt
    lucene/dev/branches/solrcloud/solr/contrib/extraction/lib/apache-mime4j-dom-NOTICE.txt
      - copied unchanged from r1179452, lucene/dev/trunk/solr/contrib/extraction/lib/apache-mime4j-dom-NOTICE.txt
    lucene/dev/branches/solrcloud/solr/contrib/extraction/lib/fontbox-1.6.0.jar
      - copied unchanged from r1179426, lucene/dev/trunk/solr/contrib/extraction/lib/fontbox-1.6.0.jar
    lucene/dev/branches/solrcloud/solr/contrib/extraction/lib/jempbox-1.6.0.jar
      - copied unchanged from r1179426, lucene/dev/trunk/solr/contrib/extraction/lib/jempbox-1.6.0.jar
    lucene/dev/branches/solrcloud/solr/contrib/extraction/lib/netcdf-4.2-min.jar
      - copied unchanged from r1179426, lucene/dev/trunk/solr/contrib/extraction/lib/netcdf-4.2-min.jar
    lucene/dev/branches/solrcloud/solr/contrib/extraction/lib/pdfbox-1.6.0.jar
      - copied unchanged from r1179426, lucene/dev/trunk/solr/contrib/extraction/lib/pdfbox-1.6.0.jar
    lucene/dev/branches/solrcloud/solr/contrib/extraction/lib/poi-3.8-beta4.jar
      - copied unchanged from r1179426, lucene/dev/trunk/solr/contrib/extraction/lib/poi-3.8-beta4.jar
    lucene/dev/branches/solrcloud/solr/contrib/extraction/lib/poi-ooxml-3.8-beta4.jar
      - copied unchanged from r1179426, lucene/dev/trunk/solr/contrib/extraction/lib/poi-ooxml-3.8-beta4.jar
    lucene/dev/branches/solrcloud/solr/contrib/extraction/lib/poi-ooxml-schemas-3.8-beta4.jar
      - copied unchanged from r1179426, lucene/dev/trunk/solr/contrib/extraction/lib/poi-ooxml-schemas-3.8-beta4.jar
    lucene/dev/branches/solrcloud/solr/contrib/extraction/lib/poi-scratchpad-3.8-beta4.jar
      - copied unchanged from r1179426, lucene/dev/trunk/solr/contrib/extraction/lib/poi-scratchpad-3.8-beta4.jar
    lucene/dev/branches/solrcloud/solr/contrib/extraction/lib/poi-scratchpad-NOTICE.txt
      - copied unchanged from r1179426, lucene/dev/trunk/solr/contrib/extraction/lib/poi-scratchpad-NOTICE.txt
    lucene/dev/branches/solrcloud/solr/contrib/extraction/lib/tagsoup-1.2.1.jar
      - copied unchanged from r1179426, lucene/dev/trunk/solr/contrib/extraction/lib/tagsoup-1.2.1.jar
    lucene/dev/branches/solrcloud/solr/contrib/extraction/lib/tika-core-0.10.jar
      - copied unchanged from r1179426, lucene/dev/trunk/solr/contrib/extraction/lib/tika-core-0.10.jar
    lucene/dev/branches/solrcloud/solr/contrib/extraction/lib/tika-parsers-0.10.jar
      - copied unchanged from r1179426, lucene/dev/trunk/solr/contrib/extraction/lib/tika-parsers-0.10.jar
    lucene/dev/branches/solrcloud/solr/contrib/langid/
      - copied from r1179426, lucene/dev/trunk/solr/contrib/langid/
    lucene/dev/branches/solrcloud/solr/contrib/langid/CHANGES.txt
      - copied unchanged from r1179426, lucene/dev/trunk/solr/contrib/langid/CHANGES.txt
    lucene/dev/branches/solrcloud/solr/contrib/langid/README.txt
      - copied unchanged from r1179426, lucene/dev/trunk/solr/contrib/langid/README.txt
    lucene/dev/branches/solrcloud/solr/contrib/langid/build.xml
      - copied unchanged from r1179426, lucene/dev/trunk/solr/contrib/langid/build.xml
    lucene/dev/branches/solrcloud/solr/contrib/langid/src/
      - copied from r1179426, lucene/dev/trunk/solr/contrib/langid/src/
    lucene/dev/branches/solrcloud/solr/contrib/langid/src/java/
      - copied from r1179426, lucene/dev/trunk/solr/contrib/langid/src/java/
    lucene/dev/branches/solrcloud/solr/contrib/langid/src/java/org/
      - copied from r1179426, lucene/dev/trunk/solr/contrib/langid/src/java/org/
    lucene/dev/branches/solrcloud/solr/contrib/langid/src/java/org/apache/
      - copied from r1179426, lucene/dev/trunk/solr/contrib/langid/src/java/org/apache/
    lucene/dev/branches/solrcloud/solr/contrib/langid/src/java/org/apache/solr/
      - copied from r1179426, lucene/dev/trunk/solr/contrib/langid/src/java/org/apache/solr/
    lucene/dev/branches/solrcloud/solr/contrib/langid/src/java/org/apache/solr/update/
      - copied from r1179426, lucene/dev/trunk/solr/contrib/langid/src/java/org/apache/solr/update/
    lucene/dev/branches/solrcloud/solr/contrib/langid/src/java/org/apache/solr/update/processor/
      - copied from r1179426, lucene/dev/trunk/solr/contrib/langid/src/java/org/apache/solr/update/processor/
    lucene/dev/branches/solrcloud/solr/contrib/langid/src/java/org/apache/solr/update/processor/DetectedLanguage.java
      - copied unchanged from r1179426, lucene/dev/trunk/solr/contrib/langid/src/java/org/apache/solr/update/processor/DetectedLanguage.java
    lucene/dev/branches/solrcloud/solr/contrib/langid/src/java/org/apache/solr/update/processor/LangIdParams.java
      - copied unchanged from r1179426, lucene/dev/trunk/solr/contrib/langid/src/java/org/apache/solr/update/processor/LangIdParams.java
    lucene/dev/branches/solrcloud/solr/contrib/langid/src/java/org/apache/solr/update/processor/LanguageIdentifierUpdateProcessor.java
      - copied unchanged from r1179426, lucene/dev/trunk/solr/contrib/langid/src/java/org/apache/solr/update/processor/LanguageIdentifierUpdateProcessor.java
    lucene/dev/branches/solrcloud/solr/contrib/langid/src/java/org/apache/solr/update/processor/LanguageIdentifierUpdateProcessorFactory.java
      - copied unchanged from r1179426, lucene/dev/trunk/solr/contrib/langid/src/java/org/apache/solr/update/processor/LanguageIdentifierUpdateProcessorFactory.java
    lucene/dev/branches/solrcloud/solr/contrib/langid/src/test/
      - copied from r1179426, lucene/dev/trunk/solr/contrib/langid/src/test/
    lucene/dev/branches/solrcloud/solr/contrib/langid/src/test-files/
      - copied from r1179426, lucene/dev/trunk/solr/contrib/langid/src/test-files/
    lucene/dev/branches/solrcloud/solr/contrib/langid/src/test-files/langid/
      - copied from r1179426, lucene/dev/trunk/solr/contrib/langid/src/test-files/langid/
    lucene/dev/branches/solrcloud/solr/contrib/langid/src/test-files/langid/solr/
      - copied from r1179426, lucene/dev/trunk/solr/contrib/langid/src/test-files/langid/solr/
    lucene/dev/branches/solrcloud/solr/contrib/langid/src/test-files/langid/solr/conf/
      - copied from r1179426, lucene/dev/trunk/solr/contrib/langid/src/test-files/langid/solr/conf/
    lucene/dev/branches/solrcloud/solr/contrib/langid/src/test-files/langid/solr/conf/schema.xml
      - copied unchanged from r1179426, lucene/dev/trunk/solr/contrib/langid/src/test-files/langid/solr/conf/schema.xml
    lucene/dev/branches/solrcloud/solr/contrib/langid/src/test-files/langid/solr/conf/solrconfig-languageidentifier.xml
      - copied unchanged from r1179426, lucene/dev/trunk/solr/contrib/langid/src/test-files/langid/solr/conf/solrconfig-languageidentifier.xml
    lucene/dev/branches/solrcloud/solr/contrib/langid/src/test/org/
      - copied from r1179426, lucene/dev/trunk/solr/contrib/langid/src/test/org/
    lucene/dev/branches/solrcloud/solr/contrib/langid/src/test/org/apache/
      - copied from r1179426, lucene/dev/trunk/solr/contrib/langid/src/test/org/apache/
    lucene/dev/branches/solrcloud/solr/contrib/langid/src/test/org/apache/solr/
      - copied from r1179426, lucene/dev/trunk/solr/contrib/langid/src/test/org/apache/solr/
    lucene/dev/branches/solrcloud/solr/contrib/langid/src/test/org/apache/solr/update/
      - copied from r1179426, lucene/dev/trunk/solr/contrib/langid/src/test/org/apache/solr/update/
    lucene/dev/branches/solrcloud/solr/contrib/langid/src/test/org/apache/solr/update/processor/
      - copied from r1179426, lucene/dev/trunk/solr/contrib/langid/src/test/org/apache/solr/update/processor/
    lucene/dev/branches/solrcloud/solr/contrib/langid/src/test/org/apache/solr/update/processor/LanguageIdentifierUpdateProcessorFactoryTest.java
      - copied unchanged from r1179426, lucene/dev/trunk/solr/contrib/langid/src/test/org/apache/solr/update/processor/LanguageIdentifierUpdateProcessorFactoryTest.java
Removed:
    lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/FieldsReader.java
    lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/FieldsWriter.java
    lucene/dev/branches/solrcloud/solr/contrib/extraction/lib/fontbox-1.3.1.jar
    lucene/dev/branches/solrcloud/solr/contrib/extraction/lib/jempbox-1.3.1.jar
    lucene/dev/branches/solrcloud/solr/contrib/extraction/lib/netcdf-4.2.jar
    lucene/dev/branches/solrcloud/solr/contrib/extraction/lib/pdfbox-1.3.1.jar
    lucene/dev/branches/solrcloud/solr/contrib/extraction/lib/poi-3.7.jar
    lucene/dev/branches/solrcloud/solr/contrib/extraction/lib/poi-ooxml-3.7.jar
    lucene/dev/branches/solrcloud/solr/contrib/extraction/lib/poi-ooxml-schemas-3.7.jar
    lucene/dev/branches/solrcloud/solr/contrib/extraction/lib/poi-ooxml-scratchpad-NOTICE.txt
    lucene/dev/branches/solrcloud/solr/contrib/extraction/lib/poi-scratchpad-3.7.jar
    lucene/dev/branches/solrcloud/solr/contrib/extraction/lib/tagsoup-1.2.jar
    lucene/dev/branches/solrcloud/solr/contrib/extraction/lib/tika-core-0.8.jar
    lucene/dev/branches/solrcloud/solr/contrib/extraction/lib/tika-parsers-0.8.jar
Modified:
    lucene/dev/branches/solrcloud/   (props changed)
    lucene/dev/branches/solrcloud/dev-tools/eclipse/dot.classpath
    lucene/dev/branches/solrcloud/dev-tools/idea/lucene/contrib/   (props changed)
    lucene/dev/branches/solrcloud/dev-tools/maven/solr/webapp/pom.xml.template
    lucene/dev/branches/solrcloud/lucene/   (props changed)
    lucene/dev/branches/solrcloud/lucene/CHANGES.txt
    lucene/dev/branches/solrcloud/lucene/MIGRATE.txt
    lucene/dev/branches/solrcloud/lucene/contrib/CHANGES.txt
    lucene/dev/branches/solrcloud/lucene/contrib/misc/src/java/org/apache/lucene/index/NRTManager.java
    lucene/dev/branches/solrcloud/lucene/contrib/misc/src/java/org/apache/lucene/search/SearcherManager.java
    lucene/dev/branches/solrcloud/lucene/contrib/misc/src/test/org/apache/lucene/index/TestMultiPassIndexSplitter.java
    lucene/dev/branches/solrcloud/lucene/contrib/misc/src/test/org/apache/lucene/store/TestNRTCachingDirectory.java
    lucene/dev/branches/solrcloud/lucene/contrib/sandbox/src/test/org/apache/lucene/sandbox/queries/regex/TestSpanRegexQuery.java   (props changed)
    lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/DirectoryReader.java
    lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/DocumentsWriterPerThread.java
    lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/IndexReader.java
    lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/MultiReader.java
    lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/ParallelReader.java
    lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/SegmentCoreReaders.java
    lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/SegmentMerger.java
    lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/SegmentReader.java
    lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/StoredFieldsWriter.java
    lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/codecs/CodecProvider.java
    lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/codecs/DefaultSegmentInfosReader.java
    lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/values/Bytes.java
    lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/search/IndexSearcher.java
    lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/search/MultiPhraseQuery.java
    lucene/dev/branches/solrcloud/lucene/src/site/build/site/demo2.html
    lucene/dev/branches/solrcloud/lucene/src/site/src/documentation/content/xdocs/demo2.xml
    lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/index/RandomCodecProvider.java
    lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/search/CheckHits.java
    lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/util/LuceneTestCase.java
    lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/util/LuceneTestCaseRunner.java
    lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/index/TestIndexReader.java
    lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/index/TestIndexReaderClone.java
    lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/index/TestIndexReaderReopen.java
    lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/index/TestIndexWriter.java
    lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/index/TestIndexWriterCommit.java
    lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/index/TestIndexWriterReader.java
    lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/index/TestLongPostings.java
    lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/index/TestNRTThreads.java
    lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/index/TestNeverDelete.java
    lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/index/TestRollingUpdates.java
    lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/index/TestStressNRT.java
    lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/index/TestTermsEnum.java
    lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/search/TestCachingSpanFilter.java
    lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/search/TestCachingWrapperFilter.java
    lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/util/automaton/TestCompiledAutomaton.java
    lucene/dev/branches/solrcloud/lucene/src/test/org/apache/lucene/util/fst/TestFSTs.java
    lucene/dev/branches/solrcloud/modules/benchmark/src/java/org/apache/lucene/benchmark/byTask/tasks/NearRealtimeReaderTask.java
    lucene/dev/branches/solrcloud/modules/benchmark/src/java/org/apache/lucene/benchmark/byTask/tasks/ReopenReaderTask.java
    lucene/dev/branches/solrcloud/modules/facet/src/java/org/apache/lucene/facet/taxonomy/lucene/LuceneTaxonomyReader.java
    lucene/dev/branches/solrcloud/modules/facet/src/java/org/apache/lucene/facet/taxonomy/lucene/LuceneTaxonomyWriter.java
    lucene/dev/branches/solrcloud/modules/facet/src/test/org/apache/lucene/facet/search/TestTotalFacetCountsCache.java
    lucene/dev/branches/solrcloud/modules/facet/src/test/org/apache/lucene/facet/taxonomy/lucene/TestIndexClose.java
    lucene/dev/branches/solrcloud/modules/grouping/src/test/org/apache/lucene/search/grouping/TestGrouping.java
    lucene/dev/branches/solrcloud/modules/queryparser/src/test/org/apache/lucene/queryparser/xml/builders/TestNumericRangeFilterBuilder.java   (props changed)
    lucene/dev/branches/solrcloud/solr/   (props changed)
    lucene/dev/branches/solrcloud/solr/CHANGES.txt   (contents, props changed)
    lucene/dev/branches/solrcloud/solr/LICENSE.txt   (props changed)
    lucene/dev/branches/solrcloud/solr/NOTICE.txt   (contents, props changed)
    lucene/dev/branches/solrcloud/solr/README.txt   (props changed)
    lucene/dev/branches/solrcloud/solr/build.xml   (contents, props changed)
    lucene/dev/branches/solrcloud/solr/client/   (props changed)
    lucene/dev/branches/solrcloud/solr/common-build.xml   (props changed)
    lucene/dev/branches/solrcloud/solr/contrib/   (props changed)
    lucene/dev/branches/solrcloud/solr/contrib/clustering/src/test-files/   (props changed)
    lucene/dev/branches/solrcloud/solr/contrib/dataimporthandler-extras/src/java/   (props changed)
    lucene/dev/branches/solrcloud/solr/contrib/dataimporthandler/src/java/   (props changed)
    lucene/dev/branches/solrcloud/solr/contrib/dataimporthandler/src/test-files/   (props changed)
    lucene/dev/branches/solrcloud/solr/contrib/dataimporthandler/src/test/org/   (props changed)
    lucene/dev/branches/solrcloud/solr/contrib/extraction/CHANGES.txt
    lucene/dev/branches/solrcloud/solr/contrib/uima/src/java/   (props changed)
    lucene/dev/branches/solrcloud/solr/contrib/uima/src/test-files/   (props changed)
    lucene/dev/branches/solrcloud/solr/core/   (props changed)
    lucene/dev/branches/solrcloud/solr/core/src/java/   (props changed)
    lucene/dev/branches/solrcloud/solr/core/src/java/org/apache/solr/core/SolrCore.java
    lucene/dev/branches/solrcloud/solr/core/src/java/org/apache/solr/update/DirectUpdateHandler2.java
    lucene/dev/branches/solrcloud/solr/core/src/test/   (props changed)
    lucene/dev/branches/solrcloud/solr/dev-tools/   (props changed)
    lucene/dev/branches/solrcloud/solr/example/   (props changed)
    lucene/dev/branches/solrcloud/solr/example/solr/conf/solrconfig.xml
    lucene/dev/branches/solrcloud/solr/lib/   (props changed)
    lucene/dev/branches/solrcloud/solr/scripts/   (props changed)
    lucene/dev/branches/solrcloud/solr/site/   (props changed)
    lucene/dev/branches/solrcloud/solr/site-src/   (props changed)
    lucene/dev/branches/solrcloud/solr/solrj/   (props changed)
    lucene/dev/branches/solrcloud/solr/solrj/src/java/   (props changed)
    lucene/dev/branches/solrcloud/solr/solrj/src/test/org/apache/solr/client/   (props changed)
    lucene/dev/branches/solrcloud/solr/solrj/src/test/org/apache/solr/client/solrj/   (props changed)
    lucene/dev/branches/solrcloud/solr/solrj/src/test/org/apache/solr/common/   (props changed)
    lucene/dev/branches/solrcloud/solr/test-framework/   (props changed)
    lucene/dev/branches/solrcloud/solr/testlogging.properties   (props changed)
    lucene/dev/branches/solrcloud/solr/webapp/   (props changed)

Modified: lucene/dev/branches/solrcloud/dev-tools/eclipse/dot.classpath
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/dev-tools/eclipse/dot.classpath?rev=1179453&r1=1179452&r2=1179453&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/dev-tools/eclipse/dot.classpath (original)
+++ lucene/dev/branches/solrcloud/dev-tools/eclipse/dot.classpath Wed Oct  5 21:34:51 2011
@@ -71,6 +71,9 @@
 	<classpathentry kind="src" path="solr/contrib/extraction/src/java"/>
 	<classpathentry kind="src" path="solr/contrib/extraction/src/test"/>
 	<classpathentry kind="src" path="solr/contrib/extraction/src/test-files"/>
+  <classpathentry kind="src" path="solr/contrib/langid/src/java"/>
+  <classpathentry kind="src" path="solr/contrib/langid/src/test"/>
+  <classpathentry kind="src" path="solr/contrib/langid/src/test-files"/>
 	<classpathentry kind="src" path="solr/contrib/uima/src/java"/>
 	<classpathentry kind="src" path="solr/contrib/uima/src/resources"/>
 	<classpathentry kind="src" path="solr/contrib/uima/src/test"/>

Modified: lucene/dev/branches/solrcloud/dev-tools/maven/solr/webapp/pom.xml.template
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/dev-tools/maven/solr/webapp/pom.xml.template?rev=1179453&r1=1179452&r2=1179453&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/dev-tools/maven/solr/webapp/pom.xml.template (original)
+++ lucene/dev/branches/solrcloud/dev-tools/maven/solr/webapp/pom.xml.template Wed Oct  5 21:34:51 2011
@@ -66,10 +66,6 @@
           <artifactId>dom4j</artifactId>
         </exclusion>
         <exclusion>
-          <groupId>log4j</groupId>
-          <artifactId>log4j</artifactId>
-        </exclusion>
-        <exclusion>
           <groupId>javax.activation</groupId>
           <artifactId>activation</artifactId>
         </exclusion>

Modified: lucene/dev/branches/solrcloud/lucene/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/CHANGES.txt?rev=1179453&r1=1179452&r2=1179453&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/CHANGES.txt (original)
+++ lucene/dev/branches/solrcloud/lucene/CHANGES.txt Wed Oct  5 21:34:51 2011
@@ -608,6 +608,11 @@ Changes in backwards compatibility polic
   As this is expert API, most code will not be affected.
   (Uwe Schindler, Doron Cohen, Mike McCandless)
 
+* LUCENE-3464: IndexReader.reopen has been renamed to
+  IndexReader.openIfChanged (a static method), and now returns null
+  (instead of the old reader) if there are no changes in the index, to
+  prevent the common pitfall of accidentally closing the old reader.
+
 Bug fixes
 
 * LUCENE-3412: SloppyPhraseScorer was returning non-deterministic results 

Modified: lucene/dev/branches/solrcloud/lucene/MIGRATE.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/MIGRATE.txt?rev=1179453&r1=1179452&r2=1179453&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/MIGRATE.txt (original)
+++ lucene/dev/branches/solrcloud/lucene/MIGRATE.txt Wed Oct  5 21:34:51 2011
@@ -521,4 +521,9 @@ you can now do this:
 * LUCENE-3396: Analyzer.tokenStream() and .reusableTokenStream() have been made final.
   It is now necessary to use Analyzer.TokenStreamComponents to define an analysis process.
   Analyzer also has its own way of managing the reuse of TokenStreamComponents (either
-  globally, or per-field).  To define another Strategy, implement Analyzer.ReuseStrategy.
\ No newline at end of file
+  globally, or per-field).  To define another Strategy, implement Analyzer.ReuseStrategy.
+
+* LUCENE-3464: IndexReader.reopen has been renamed to
+  IndexReader.openIfChanged (a static method), and now returns null
+  (instead of the old reader) if there are no changes to the index, to
+  prevent the common pitfall of accidentally closing the old reader.

Modified: lucene/dev/branches/solrcloud/lucene/contrib/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/contrib/CHANGES.txt?rev=1179453&r1=1179452&r2=1179453&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/contrib/CHANGES.txt (original)
+++ lucene/dev/branches/solrcloud/lucene/contrib/CHANGES.txt Wed Oct  5 21:34:51 2011
@@ -109,6 +109,9 @@ Bug Fixes
 
  * LUCENE-3446: Fix NPE in BooleanFilter when DocIdSet/DocIdSetIterator is null.
    Converted code to FixedBitSet and simplified.  (Uwe Schindler, Shuji Umino)
+   
+ * LUCENE-3484: Fix NPE in TaxonomyWriter: parents array creation was not thread safe.
+   (Doron Cohen)
 
 API Changes
  

Modified: lucene/dev/branches/solrcloud/lucene/contrib/misc/src/java/org/apache/lucene/index/NRTManager.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/contrib/misc/src/java/org/apache/lucene/index/NRTManager.java?rev=1179453&r1=1179452&r2=1179453&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/contrib/misc/src/java/org/apache/lucene/index/NRTManager.java (original)
+++ lucene/dev/branches/solrcloud/lucene/contrib/misc/src/java/org/apache/lucene/index/NRTManager.java Wed Oct  5 21:34:51 2011
@@ -307,7 +307,14 @@ public class NRTManager implements Close
 
     // Start from whichever searcher is most current:
     final IndexSearcher startSearcher = noDeletesSearchingGen.get() > searchingGen.get() ? noDeletesCurrentSearcher : currentSearcher;
-    final IndexReader nextReader = startSearcher.getIndexReader().reopen(writer, applyDeletes);
+    IndexReader nextReader = IndexReader.openIfChanged(startSearcher.getIndexReader(), writer, applyDeletes);
+    if (nextReader == null) {
+      // NOTE: doesn't happen currently in Lucene (reopen on
+      // NRT reader always returns new reader), but could in
+      // the future:
+      nextReader = startSearcher.getIndexReader();
+      nextReader.incRef();
+    }
 
     if (nextReader != startSearcher.getIndexReader()) {
       final IndexSearcher nextSearcher = new IndexSearcher(nextReader, es);

Modified: lucene/dev/branches/solrcloud/lucene/contrib/misc/src/java/org/apache/lucene/search/SearcherManager.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/contrib/misc/src/java/org/apache/lucene/search/SearcherManager.java?rev=1179453&r1=1179452&r2=1179453&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/contrib/misc/src/java/org/apache/lucene/search/SearcherManager.java (original)
+++ lucene/dev/branches/solrcloud/lucene/contrib/misc/src/java/org/apache/lucene/search/SearcherManager.java Wed Oct  5 21:34:51 2011
@@ -110,7 +110,7 @@ public class SearcherManager implements 
   }
 
   /** You must call this, periodically, to perform a
-   *  reopen.  This calls {@link IndexReader#reopen} on the
+   *  reopen.  This calls {@link IndexReader#openIfChanged} on the
    *  underlying reader, and if that returns a new reader,
    *  it's warmed (if you provided a {@link SearcherWarmer}
    *  and then swapped into production.
@@ -138,8 +138,8 @@ public class SearcherManager implements 
     // threads just return immediately:
     if (reopening.tryAcquire()) {
       try {
-        IndexReader newReader = currentSearcher.getIndexReader().reopen();
-        if (newReader != currentSearcher.getIndexReader()) {
+        IndexReader newReader = IndexReader.openIfChanged(currentSearcher.getIndexReader());
+        if (newReader != null) {
           IndexSearcher newSearcher = new IndexSearcher(newReader, es);
           if (warmer != null) {
             boolean success = false;

Modified: lucene/dev/branches/solrcloud/lucene/contrib/misc/src/test/org/apache/lucene/index/TestMultiPassIndexSplitter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/contrib/misc/src/test/org/apache/lucene/index/TestMultiPassIndexSplitter.java?rev=1179453&r1=1179452&r2=1179453&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/contrib/misc/src/test/org/apache/lucene/index/TestMultiPassIndexSplitter.java (original)
+++ lucene/dev/branches/solrcloud/lucene/contrib/misc/src/test/org/apache/lucene/index/TestMultiPassIndexSplitter.java Wed Oct  5 21:34:51 2011
@@ -45,9 +45,6 @@ public class TestMultiPassIndexSplitter 
     input = IndexReader.open(dir, false);
     // delete the last doc
     input.deleteDocument(input.maxDoc() - 1);
-    IndexReader inputOld = input;
-    input = input.reopen(true);
-    inputOld.close();
   }
   
   @Override

Modified: lucene/dev/branches/solrcloud/lucene/contrib/misc/src/test/org/apache/lucene/store/TestNRTCachingDirectory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/contrib/misc/src/test/org/apache/lucene/store/TestNRTCachingDirectory.java?rev=1179453&r1=1179452&r2=1179453&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/contrib/misc/src/test/org/apache/lucene/store/TestNRTCachingDirectory.java (original)
+++ lucene/dev/branches/solrcloud/lucene/contrib/misc/src/test/org/apache/lucene/store/TestNRTCachingDirectory.java Wed Oct  5 21:34:51 2011
@@ -65,8 +65,8 @@ public class TestNRTCachingDirectory ext
         if (r == null) {
           r = IndexReader.open(w.w, false);
         } else {
-          final IndexReader r2 = r.reopen();
-          if (r2 != r) {
+          final IndexReader r2 = IndexReader.openIfChanged(r);
+          if (r2 != null) {
             r.close();
             r = r2;
           }

Modified: lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/DirectoryReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/DirectoryReader.java?rev=1179453&r1=1179452&r2=1179453&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/DirectoryReader.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/DirectoryReader.java Wed Oct  5 21:34:51 2011
@@ -198,8 +198,8 @@ class DirectoryReader extends IndexReade
     initialize(readers.toArray(new SegmentReader[readers.size()]));
   }
 
-  /** This constructor is only used for {@link #reopen()} */
-  DirectoryReader(Directory directory, SegmentInfos infos, SegmentReader[] oldReaders, int[] oldStarts,
+  /** This constructor is only used for {@link #doOpenIfChanged()} */
+  DirectoryReader(Directory directory, SegmentInfos infos, SegmentReader[] oldReaders,
                   boolean readOnly, boolean doClone, int termInfosIndexDivisor, CodecProvider codecs,
                   Collection<ReaderFinishedListener> readerFinishedListeners) throws IOException {
     this.directory = directory;
@@ -255,18 +255,21 @@ class DirectoryReader extends IndexReade
           // this is a new reader; in case we hit an exception we can close it safely
           newReader = SegmentReader.get(readOnly, infos.info(i), termInfosIndexDivisor, IOContext.READ);
           newReader.readerFinishedListeners = readerFinishedListeners;
-        } else {
-          newReader = newReaders[i].reopenSegment(infos.info(i), doClone, readOnly);
-          assert newReader.readerFinishedListeners == readerFinishedListeners;
-        }
-        if (newReader == newReaders[i]) {
-          // this reader will be shared between the old and the new one,
-          // so we must incRef it
-          readerShared[i] = true;
-          newReader.incRef();
-        } else {
           readerShared[i] = false;
           newReaders[i] = newReader;
+        } else {
+          newReader = newReaders[i].reopenSegment(infos.info(i), doClone, readOnly);
+          if (newReader == null) {
+            // this reader will be shared between the old and the new one,
+            // so we must incRef it
+            readerShared[i] = true;
+            newReaders[i].incRef();
+          } else {
+            assert newReader.readerFinishedListeners == readerFinishedListeners;
+            readerShared[i] = false;
+            // Steal ref returned to us by reopenSegment:
+            newReaders[i] = newReader;
+          }
         }
         success = true;
       } finally {
@@ -364,8 +367,8 @@ class DirectoryReader extends IndexReade
 
   @Override
   public final synchronized IndexReader clone(boolean openReadOnly) throws CorruptIndexException, IOException {
-    // doReopen calls ensureOpen
-    DirectoryReader newReader = doReopen((SegmentInfos) segmentInfos.clone(), true, openReadOnly);
+    // doOpenIfChanged calls ensureOpen
+    DirectoryReader newReader = doOpenIfChanged((SegmentInfos) segmentInfos.clone(), true, openReadOnly);
 
     if (this != newReader) {
       newReader.deletionPolicy = deletionPolicy;
@@ -388,22 +391,24 @@ class DirectoryReader extends IndexReade
   }
 
   @Override
-  public final IndexReader reopen() throws CorruptIndexException, IOException {
+  protected final IndexReader doOpenIfChanged() throws CorruptIndexException, IOException {
     // Preserve current readOnly
-    return doReopen(readOnly, null);
+    return doOpenIfChanged(readOnly, null);
   }
 
   @Override
-  public final IndexReader reopen(boolean openReadOnly) throws CorruptIndexException, IOException {
-    return doReopen(openReadOnly, null);
+  protected final IndexReader doOpenIfChanged(boolean openReadOnly) throws CorruptIndexException, IOException {
+    return doOpenIfChanged(openReadOnly, null);
   }
 
   @Override
-  public final IndexReader reopen(final IndexCommit commit) throws CorruptIndexException, IOException {
-    return doReopen(true, commit);
+  protected final IndexReader doOpenIfChanged(final IndexCommit commit) throws CorruptIndexException, IOException {
+    return doOpenIfChanged(true, commit);
   }
 
-  private final IndexReader doReopenFromWriter(boolean openReadOnly, IndexCommit commit) throws CorruptIndexException, IOException {
+  // NOTE: always returns a non-null result (ie new reader)
+  // but that could change someday
+  private final IndexReader doOpenFromWriter(boolean openReadOnly, IndexCommit commit) throws CorruptIndexException, IOException {
     assert readOnly;
 
     if (!openReadOnly) {
@@ -422,7 +427,7 @@ class DirectoryReader extends IndexReade
     return reader;
   }
 
-  private IndexReader doReopen(final boolean openReadOnly, IndexCommit commit) throws CorruptIndexException, IOException {
+  private IndexReader doOpenIfChanged(final boolean openReadOnly, IndexCommit commit) throws CorruptIndexException, IOException {
     ensureOpen();
 
     assert commit == null || openReadOnly;
@@ -430,13 +435,13 @@ class DirectoryReader extends IndexReade
     // If we were obtained by writer.getReader(), re-ask the
     // writer to get a new reader.
     if (writer != null) {
-      return doReopenFromWriter(openReadOnly, commit);
+      return doOpenFromWriter(openReadOnly, commit);
     } else {
-      return doReopenNoWriter(openReadOnly, commit);
+      return doOpenNoWriter(openReadOnly, commit);
     }
   }
 
-  private synchronized IndexReader doReopenNoWriter(final boolean openReadOnly, IndexCommit commit) throws CorruptIndexException, IOException {
+  private synchronized IndexReader doOpenNoWriter(final boolean openReadOnly, IndexCommit commit) throws CorruptIndexException, IOException {
 
     if (commit == null) {
       if (hasChanges) {
@@ -451,25 +456,26 @@ class DirectoryReader extends IndexReade
         if (openReadOnly) {
           return clone(openReadOnly);
         } else {
-          return this;
+          return null;
         }
       } else if (isCurrent()) {
         if (openReadOnly != readOnly) {
           // Just fallback to clone
           return clone(openReadOnly);
         } else {
-          return this;
+          return null;
         }
       }
     } else {
-      if (directory != commit.getDirectory())
+      if (directory != commit.getDirectory()) {
         throw new IOException("the specified commit does not match the specified Directory");
+      }
       if (segmentInfos != null && commit.getSegmentsFileName().equals(segmentInfos.getCurrentSegmentFileName())) {
         if (readOnly != openReadOnly) {
           // Just fallback to clone
           return clone(openReadOnly);
         } else {
-          return this;
+          return null;
         }
       }
     }
@@ -479,15 +485,13 @@ class DirectoryReader extends IndexReade
       protected Object doBody(String segmentFileName) throws CorruptIndexException, IOException {
         final SegmentInfos infos = new SegmentInfos(codecs);
         infos.read(directory, segmentFileName, codecs);
-        return doReopen(infos, false, openReadOnly);
+        return doOpenIfChanged(infos, false, openReadOnly);
       }
     }.run(commit);
   }
 
-  private synchronized DirectoryReader doReopen(SegmentInfos infos, boolean doClone, boolean openReadOnly) throws CorruptIndexException, IOException {
-    DirectoryReader reader;
-    reader = new DirectoryReader(directory, infos, subReaders, starts, openReadOnly, doClone, termInfosIndexDivisor, codecs, readerFinishedListeners);
-    return reader;
+  private synchronized DirectoryReader doOpenIfChanged(SegmentInfos infos, boolean doClone, boolean openReadOnly) throws CorruptIndexException, IOException {
+    return new DirectoryReader(directory, infos, subReaders, openReadOnly, doClone, termInfosIndexDivisor, codecs, readerFinishedListeners);
   }
 
   /** Version number when this IndexReader was opened. */

Modified: lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/DocumentsWriterPerThread.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/DocumentsWriterPerThread.java?rev=1179453&r1=1179452&r2=1179453&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/DocumentsWriterPerThread.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/DocumentsWriterPerThread.java Wed Oct  5 21:34:51 2011
@@ -26,6 +26,7 @@ import java.text.NumberFormat;
 
 import org.apache.lucene.analysis.Analyzer;
 import org.apache.lucene.index.DocumentsWriterDeleteQueue.DeleteSlice;
+import org.apache.lucene.index.codecs.CodecProvider;
 import org.apache.lucene.search.similarities.SimilarityProvider;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.store.FlushInfo;
@@ -151,6 +152,7 @@ public class DocumentsWriterPerThread {
   }
   private final static boolean INFO_VERBOSE = false;
   final DocumentsWriter parent;
+  final CodecProvider codecProvider;
   final IndexWriter writer;
   final Directory directory;
   final DocState docState;
@@ -181,6 +183,7 @@ public class DocumentsWriterPerThread {
     this.fieldInfos = fieldInfos;
     this.writer = parent.indexWriter;
     this.infoStream = parent.infoStream;
+    this.codecProvider = this.writer.codecs;
     this.docState = new DocState(this);
     this.docState.similarityProvider = parent.indexWriter.getConfig()
         .getSimilarityProvider();

Modified: lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/IndexReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/IndexReader.java?rev=1179453&r1=1179452&r2=1179453&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/IndexReader.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/IndexReader.java Wed Oct  5 21:34:51 2011
@@ -233,7 +233,7 @@ public abstract class IndexReader implem
   public boolean tryIncRef() {
     int count;
     while ((count = refCount.get()) > 0) {
-      if(refCount.compareAndSet(count, count+1)) {
+      if (refCount.compareAndSet(count, count+1)) {
         return true;
       }
     }
@@ -344,7 +344,7 @@ public abstract class IndexReader implem
    * @throws CorruptIndexException
    * @throws IOException if there is a low-level IO error
    *
-   * @see #reopen(IndexWriter,boolean)
+   * @see #openIfChanged(IndexReader,IndexWriter,boolean)
    *
    * @lucene.experimental
    */
@@ -537,90 +537,87 @@ public abstract class IndexReader implem
   }
 
   /**
-   * Refreshes an IndexReader if the index has changed since this instance 
-   * was (re)opened. 
-   * <p>
-   * Opening an IndexReader is an expensive operation. This method can be used
-   * to refresh an existing IndexReader to reduce these costs. This method 
-   * tries to only load segments that have changed or were created after the 
-   * IndexReader was (re)opened.
-   * <p>
-   * If the index has not changed since this instance was (re)opened, then this
-   * call is a NOOP and returns this instance. Otherwise, a new instance is 
-   * returned. The old instance is <b>not</b> closed and remains usable.<br>
-   * <p>   
-   * If the reader is reopened, even though they share
-   * resources internally, it's safe to make changes
-   * (deletions, norms) with the new reader.  All shared
-   * mutable state obeys "copy on write" semantics to ensure
-   * the changes are not seen by other readers.
-   * <p>
-   * You can determine whether a reader was actually reopened by comparing the
-   * old instance with the instance returned by this method: 
-   * <pre>
-   * IndexReader reader = ... 
-   * ...
-   * IndexReader newReader = r.reopen();
-   * if (newReader != reader) {
-   * ...     // reader was reopened
-   *   reader.close(); 
-   * }
-   * reader = newReader;
-   * ...
-   * </pre>
-   *
-   * Be sure to synchronize that code so that other threads,
-   * if present, can never use reader after it has been
-   * closed and before it's switched to newReader.
-   *
-   * <p><b>NOTE</b>: If this reader is a near real-time
-   * reader (obtained from {@link IndexWriter#getReader()},
-   * reopen() will simply call writer.getReader() again for
-   * you, though this may change in the future.
+   * If the index has changed since the provided reader was
+   * opened, open and return a new reader; else, return
+   * null.  The new reader, if not null, will be the same
+   * type of reader as the previous one, ie an NRT reader
+   * will open a new NRT reader, a MultiReader will open a
+   * new MultiReader,  etc.
+   *
+   * <p>This method is typically far less costly than opening a
+   * fully new <code>IndexReader</code> as it shares
+   * resources (for example sub-readers) with the provided
+   * <code>IndexReader</code>, when possible.
+   *
+   * <p>The provided reader is not closed (you are responsible
+   * for doing so); if a new reader is returned you also
+   * must eventually close it.  Be sure to never close a
+   * reader while other threads are still using it; see
+   * <code>SearcherManager</code> in
+   * <code>contrib/misc</code> to simplify managing this.
+   *
+   * <p>If a new reader is returned, it's safe to make changes
+   * (deletions, norms) with it.  All shared mutable state
+   * with the old reader uses "copy on write" semantics to
+   * ensure the changes are not seen by other readers.
+   *
+   * <p><b>NOTE</b>: If the provided reader is a near real-time
+   * reader, this method will return another near-real-time
+   * reader.
    * 
    * @throws CorruptIndexException if the index is corrupt
    * @throws IOException if there is a low-level IO error
+   * @return null if there are no changes; else, a new
+   * IndexReader instance which you must eventually close
    */  
-  public synchronized IndexReader reopen() throws CorruptIndexException, IOException {
-    throw new UnsupportedOperationException("This reader does not support reopen().");
+  public static IndexReader openIfChanged(IndexReader oldReader) throws IOException {
+    final IndexReader newReader = oldReader.doOpenIfChanged();
+    assert newReader != oldReader;
+    return newReader;
   }
-  
 
-  /** Just like {@link #reopen()}, except you can change the
-   *  readOnly of the original reader.  If the index is
-   *  unchanged but readOnly is different then a new reader
-   *  will be returned. */
-  public synchronized IndexReader reopen(boolean openReadOnly) throws CorruptIndexException, IOException {
-    throw new UnsupportedOperationException("This reader does not support reopen().");
+  /**
+   * If the index has changed since the provided reader was
+   * opened, open and return a new reader, with the
+   * specified <code>readOnly</code>; else, return
+   * null.
+   *
+   * @see #openIfChanged(IndexReader)
+   */
+  public static IndexReader openIfChanged(IndexReader oldReader, boolean readOnly) throws IOException {
+    final IndexReader newReader = oldReader.doOpenIfChanged(readOnly);
+    assert newReader != oldReader;
+    return newReader;
   }
-  
-  /** Expert: reopen this reader on a specific commit point.
-   *  This always returns a readOnly reader.  If the
-   *  specified commit point matches what this reader is
-   *  already on, and this reader is already readOnly, then
-   *  this same instance is returned; if it is not already
-   *  readOnly, a readOnly clone is returned. */
-  public synchronized IndexReader reopen(final IndexCommit commit) throws CorruptIndexException, IOException {
-    throw new UnsupportedOperationException("This reader does not support reopen(IndexCommit).");
+
+  /**
+   * If the IndexCommit differs from what the
+   * provided reader is searching, or the provided reader is
+   * not already read-only, open and return a new
+   * <code>readOnly=true</code> reader; else, return null.
+   *
+   * @see #openIfChanged(IndexReader)
+   */
+  // TODO: should you be able to specify readOnly?
+  public static IndexReader openIfChanged(IndexReader oldReader, IndexCommit commit) throws IOException {
+    final IndexReader newReader = oldReader.doOpenIfChanged(commit);
+    assert newReader != oldReader;
+    return newReader;
   }
 
   /**
-   * Expert: returns a readonly reader, covering all
-   * committed as well as un-committed changes to the index.
-   * This provides "near real-time" searching, in that
-   * changes made during an IndexWriter session can be
+   * Expert: If there changes (committed or not) in the
+   * {@link IndexWriter} versus what the provided reader is
+   * searching, then open and return a new read-only
+   * IndexReader searching both committed and uncommitted
+   * changes from the writer; else, return null (though, the
+   * current implementation never returns null).
+   *
+   * <p>This provides "near real-time" searching, in that
+   * changes made during an {@link IndexWriter} session can be
    * quickly made available for searching without closing
    * the writer nor calling {@link #commit}.
    *
-   * <p>Note that this is functionally equivalent to calling
-   * {#flush} (an internal IndexWriter operation) and then using {@link IndexReader#open} to
-   * open a new reader.  But the turnaround time of this
-   * method should be faster since it avoids the potentially
-   * costly {@link #commit}.</p>
-   *
-   * <p>You must close the {@link IndexReader} returned by
-   * this method once you are done using it.</p>
-   *
    * <p>It's <i>near</i> real-time because there is no hard
    * guarantee on how quickly you can get a new reader after
    * making changes with IndexWriter.  You'll have to
@@ -629,11 +626,6 @@ public abstract class IndexReader implem
    * feature, please report back on your findings so we can
    * learn, improve and iterate.</p>
    *
-   * <p>The resulting reader supports {@link
-   * IndexReader#reopen}, but that call will simply forward
-   * back to this method (though this may change in the
-   * future).</p>
-   *
    * <p>The very first time this method is called, this
    * writer instance will make every effort to pool the
    * readers that it opens for doing merges, applying
@@ -649,7 +641,7 @@ public abstract class IndexReader implem
    * <p>If an addIndexes* call is running in another thread,
    * then this reader will only search those segments from
    * the foreign index that have been successfully copied
-   * over, so far</p>.
+   * over, so far.</p>
    *
    * <p><b>NOTE</b>: Once the writer is closed, any
    * outstanding readers may continue to be used.  However,
@@ -657,9 +649,11 @@ public abstract class IndexReader implem
    * hit an {@link AlreadyClosedException}.</p>
    *
    * @return IndexReader that covers entire index plus all
-   * changes made so far by this IndexWriter instance
+   * changes made so far by this IndexWriter instance, or
+   * null if there are no new changes
    *
    * @param writer The IndexWriter to open from
+   *
    * @param applyAllDeletes If true, all buffered deletes will
    * be applied (made visible) in the returned reader.  If
    * false, the deletes are not applied but remain buffered
@@ -672,7 +666,25 @@ public abstract class IndexReader implem
    *
    * @lucene.experimental
    */
-  public IndexReader reopen(IndexWriter writer, boolean applyAllDeletes) throws CorruptIndexException, IOException {
+  public static IndexReader openIfChanged(IndexReader oldReader, IndexWriter writer, boolean applyAllDeletes) throws IOException {
+    final IndexReader newReader = oldReader.doOpenIfChanged(writer, applyAllDeletes);
+    assert newReader != oldReader;
+    return newReader;
+  }
+
+  protected IndexReader doOpenIfChanged() throws CorruptIndexException, IOException {
+    throw new UnsupportedOperationException("This reader does not support reopen().");
+  }
+  
+  protected IndexReader doOpenIfChanged(boolean openReadOnly) throws CorruptIndexException, IOException {
+    throw new UnsupportedOperationException("This reader does not support reopen().");
+  }
+
+  protected IndexReader doOpenIfChanged(final IndexCommit commit) throws CorruptIndexException, IOException {
+    throw new UnsupportedOperationException("This reader does not support reopen(IndexCommit).");
+  }
+
+  protected IndexReader doOpenIfChanged(IndexWriter writer, boolean applyAllDeletes) throws CorruptIndexException, IOException {
     return writer.getReader(applyAllDeletes);
   }
 
@@ -687,7 +699,7 @@ public abstract class IndexReader implem
    * changes to the index on close, but the old reader still
    * reflects all changes made up until it was cloned.
    * <p>
-   * Like {@link #reopen()}, it's safe to make changes to
+   * Like {@link #openIfChanged(IndexReader)}, it's safe to make changes to
    * either the original or the cloned reader: all shared
    * mutable state obeys "copy on write" semantics to ensure
    * the changes are not seen by other readers.
@@ -808,7 +820,7 @@ public abstract class IndexReader implem
    * implemented in the IndexReader base class.
    *
    * <p>If this reader is based on a Directory (ie, was
-   * created by calling {@link #open}, or {@link #reopen} on
+   * created by calling {@link #open}, or {@link #openIfChanged} on
    * a reader based on a Directory), then this method
    * returns the version recorded in the commit that the
    * reader opened.  This version is advanced every time
@@ -816,7 +828,7 @@ public abstract class IndexReader implem
    *
    * <p>If instead this reader is a near real-time reader
    * (ie, obtained by a call to {@link
-   * IndexWriter#getReader}, or by calling {@link #reopen}
+   * IndexWriter#getReader}, or by calling {@link #openIfChanged}
    * on a near real-time reader), then this method returns
    * the version of the last commit done by the writer.
    * Note that even as further changes are made with the
@@ -849,14 +861,14 @@ public abstract class IndexReader implem
    * index since this reader was opened.
    *
    * <p>If this reader is based on a Directory (ie, was
-   * created by calling {@link #open}, or {@link #reopen} on
+   * created by calling {@link #open}, or {@link #openIfChanged} on
    * a reader based on a Directory), then this method checks
    * if any further commits (see {@link IndexWriter#commit}
    * have occurred in that directory).</p>
    *
    * <p>If instead this reader is a near real-time reader
    * (ie, obtained by a call to {@link
-   * IndexWriter#getReader}, or by calling {@link #reopen}
+   * IndexWriter#getReader}, or by calling {@link #openIfChanged}
    * on a near real-time reader), then this method checks if
    * either a new commmit has occurred, or any new
    * uncommitted changes have taken place via the writer.
@@ -864,7 +876,7 @@ public abstract class IndexReader implem
    * merging, this method will still return false.</p>
    *
    * <p>In any event, if this returns false, you should call
-   * {@link #reopen} to get a new reader that sees the
+   * {@link #openIfChanged} to get a new reader that sees the
    * changes.</p>
    *
    * @throws CorruptIndexException if the index is corrupt

Modified: lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/MultiReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/MultiReader.java?rev=1179453&r1=1179452&r2=1179453&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/MultiReader.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/MultiReader.java Wed Oct  5 21:34:51 2011
@@ -99,14 +99,14 @@ public class MultiReader extends IndexRe
   /**
    * Tries to reopen the subreaders.
    * <br>
-   * If one or more subreaders could be re-opened (i. e. subReader.reopen() 
-   * returned a new instance != subReader), then a new MultiReader instance 
+   * If one or more subreaders could be re-opened (i. e. IndexReader.openIfChanged(subReader) 
+   * returned a new instance), then a new MultiReader instance 
    * is returned, otherwise this instance is returned.
    * <p>
    * A re-opened instance might share one or more subreaders with the old 
    * instance. Index modification operations result in undefined behavior
    * when performed before the old instance is closed.
-   * (see {@link IndexReader#reopen()}).
+   * (see {@link IndexReader#openIfChanged}).
    * <p>
    * If subreaders are shared, then the reference count of those
    * readers is increased to ensure that the subreaders remain open
@@ -116,8 +116,8 @@ public class MultiReader extends IndexRe
    * @throws IOException if there is a low-level IO error 
    */
   @Override
-  public synchronized IndexReader reopen() throws CorruptIndexException, IOException {
-    return doReopen(false);
+  protected synchronized IndexReader doOpenIfChanged() throws CorruptIndexException, IOException {
+    return doOpenIfChanged(false);
   }
   
   /**
@@ -132,7 +132,7 @@ public class MultiReader extends IndexRe
   @Override
   public synchronized Object clone() {
     try {
-      return doReopen(true);
+      return doOpenIfChanged(true);
     } catch (Exception ex) {
       throw new RuntimeException(ex);
     }
@@ -146,33 +146,35 @@ public class MultiReader extends IndexRe
   /**
    * If clone is true then we clone each of the subreaders
    * @param doClone
-   * @return New IndexReader, or same one (this) if
-   *   reopen/clone is not necessary
+   * @return New IndexReader, or null if open/clone is not necessary
    * @throws CorruptIndexException
    * @throws IOException
    */
-  protected IndexReader doReopen(boolean doClone) throws CorruptIndexException, IOException {
+  protected IndexReader doOpenIfChanged(boolean doClone) throws CorruptIndexException, IOException {
     ensureOpen();
     
-    boolean reopened = false;
+    boolean changed = false;
     IndexReader[] newSubReaders = new IndexReader[subReaders.length];
     
     boolean success = false;
     try {
       for (int i = 0; i < subReaders.length; i++) {
-        if (doClone)
+        if (doClone) {
           newSubReaders[i] = (IndexReader) subReaders[i].clone();
-        else
-          newSubReaders[i] = subReaders[i].reopen();
-        // if at least one of the subreaders was updated we remember that
-        // and return a new MultiReader
-        if (newSubReaders[i] != subReaders[i]) {
-          reopened = true;
+          changed = true;
+        } else {
+          final IndexReader newSubReader = IndexReader.openIfChanged(subReaders[i]);
+          if (newSubReader != null) {
+            newSubReaders[i] = newSubReader;
+            changed = true;
+          } else {
+            newSubReaders[i] = subReaders[i];
+          }
         }
       }
       success = true;
     } finally {
-      if (!success && reopened) {
+      if (!success && changed) {
         for (int i = 0; i < newSubReaders.length; i++) {
           if (newSubReaders[i] != subReaders[i]) {
             try {
@@ -185,7 +187,7 @@ public class MultiReader extends IndexRe
       }
     }
 
-    if (reopened) {
+    if (changed) {
       boolean[] newDecrefOnClose = new boolean[subReaders.length];
       for (int i = 0; i < subReaders.length; i++) {
         if (newSubReaders[i] == subReaders[i]) {
@@ -197,7 +199,7 @@ public class MultiReader extends IndexRe
       mr.decrefOnClose = newDecrefOnClose;
       return mr;
     } else {
-      return this;
+      return null;
     }
   }
 

Modified: lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/ParallelReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/ParallelReader.java?rev=1179453&r1=1179452&r2=1179453&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/ParallelReader.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/ParallelReader.java Wed Oct  5 21:34:51 2011
@@ -229,12 +229,12 @@ public class ParallelReader extends Inde
    * <br>
    * If one or more subreaders could be re-opened (i. e. subReader.reopen() 
    * returned a new instance != subReader), then a new ParallelReader instance 
-   * is returned, otherwise this instance is returned.
+   * is returned, otherwise null is returned.
    * <p>
    * A re-opened instance might share one or more subreaders with the old 
    * instance. Index modification operations result in undefined behavior
    * when performed before the old instance is closed.
-   * (see {@link IndexReader#reopen()}).
+   * (see {@link IndexReader#openIfChanged}).
    * <p>
    * If subreaders are shared, then the reference count of those
    * readers is increased to ensure that the subreaders remain open
@@ -244,7 +244,7 @@ public class ParallelReader extends Inde
    * @throws IOException if there is a low-level IO error 
    */
   @Override
-  public synchronized IndexReader reopen() throws CorruptIndexException, IOException {
+  protected synchronized IndexReader doOpenIfChanged() throws CorruptIndexException, IOException {
     // doReopen calls ensureOpen
     return doReopen(false);
   }
@@ -262,15 +262,16 @@ public class ParallelReader extends Inde
         IndexReader newReader = null;
         if (doClone) {
           newReader = (IndexReader) oldReader.clone();
+          reopened = true;
         } else {
-          newReader = oldReader.reopen();
+          newReader = IndexReader.openIfChanged(oldReader);
+          if (newReader != null) {
+            reopened = true;
+          } else {
+            newReader = oldReader;
+          }
         }
         newReaders.add(newReader);
-        // if at least one of the subreaders was updated we remember that
-        // and return a new ParallelReader
-        if (newReader != oldReader) {
-          reopened = true;
-        }
       }
       success = true;
     } finally {
@@ -310,7 +311,7 @@ public class ParallelReader extends Inde
       return pr;
     } else {
       // No subreader was refreshed
-      return this;
+      return null;
     }
   }
 

Modified: lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/SegmentCoreReaders.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/SegmentCoreReaders.java?rev=1179453&r1=1179452&r2=1179453&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/SegmentCoreReaders.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/SegmentCoreReaders.java Wed Oct  5 21:34:51 2011
@@ -22,6 +22,7 @@ import java.util.concurrent.atomic.Atomi
 
 import org.apache.lucene.index.codecs.Codec;
 import org.apache.lucene.index.codecs.FieldsProducer;
+import org.apache.lucene.index.codecs.FieldsReader;
 import org.apache.lucene.index.codecs.PerDocValues;
 import org.apache.lucene.store.CompoundFileDirectory;
 import org.apache.lucene.store.Directory;
@@ -164,7 +165,7 @@ final class SegmentCoreReaders {
       }
       
       final String storesSegment = si.getDocStoreSegment();
-      fieldsReaderOrig = new FieldsReader(storeDir, storesSegment, fieldInfos, context,
+      fieldsReaderOrig = si.getSegmentCodecs().provider.fieldsReader(storeDir, storesSegment, fieldInfos, context,
           si.getDocStoreOffset(), si.docCount);
       
       // Verify two sources of "maxDoc" agree:

Modified: lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/SegmentMerger.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/SegmentMerger.java?rev=1179453&r1=1179452&r2=1179453&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/SegmentMerger.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/SegmentMerger.java Wed Oct  5 21:34:51 2011
@@ -29,6 +29,8 @@ import org.apache.lucene.index.IndexRead
 import org.apache.lucene.index.MergePolicy.MergeAbortedException;
 import org.apache.lucene.index.codecs.Codec;
 import org.apache.lucene.index.codecs.FieldsConsumer;
+import org.apache.lucene.index.codecs.FieldsReader;
+import org.apache.lucene.index.codecs.FieldsWriter;
 import org.apache.lucene.index.codecs.MergeState;
 import org.apache.lucene.index.codecs.PerDocConsumer;
 import org.apache.lucene.index.codecs.PerDocValues;
@@ -257,7 +259,7 @@ final class SegmentMerger {
     int docCount = 0;
 
     setMatchingSegmentReaders();
-    final FieldsWriter fieldsWriter = new FieldsWriter(directory, segment, context);
+    final FieldsWriter fieldsWriter = codecInfo.provider.fieldsWriter(directory, segment, context);
     try {
       int idx = 0;
       for (MergeState.IndexReaderAndLiveDocs reader : readers) {

Modified: lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/SegmentReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/SegmentReader.java?rev=1179453&r1=1179452&r2=1179453&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/SegmentReader.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/SegmentReader.java Wed Oct  5 21:34:51 2011
@@ -30,6 +30,7 @@ import java.util.concurrent.atomic.Atomi
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.store.IndexInput;
 import org.apache.lucene.index.FieldInfo.IndexOptions;
+import org.apache.lucene.index.codecs.FieldsReader;
 import org.apache.lucene.index.codecs.PerDocValues;
 import org.apache.lucene.store.IOContext;
 import org.apache.lucene.util.BitVector;
@@ -76,7 +77,7 @@ public class SegmentReader extends Index
   private class FieldsReaderLocal extends CloseableThreadLocal<FieldsReader> {
     @Override
     protected FieldsReader initialValue() {
-      return (FieldsReader) core.getFieldsReaderOrig().clone();
+      return core.getFieldsReaderOrig().clone();
     }
   }
 
@@ -204,13 +205,13 @@ public class SegmentReader extends Index
   }
 
   @Override
-  public synchronized IndexReader reopen()
+  protected synchronized IndexReader doOpenIfChanged()
     throws CorruptIndexException, IOException {
     return reopenSegment(si, false, readOnly);
   }
 
   @Override
-  public synchronized IndexReader reopen(boolean openReadOnly)
+  protected synchronized IndexReader doOpenIfChanged(boolean openReadOnly)
     throws CorruptIndexException, IOException {
     return reopenSegment(si, false, openReadOnly);
   }
@@ -233,7 +234,7 @@ public class SegmentReader extends Index
     // if we're cloning we need to run through the reopenSegment logic
     // also if both old and new readers aren't readonly, we clone to avoid sharing modifications
     if (normsUpToDate && deletionsUpToDate && !doClone && openReadOnly && readOnly) {
-      return this;
+      return null;
     }    
 
     // When cloning, the incoming SegmentInfos should not

Modified: lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/StoredFieldsWriter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/StoredFieldsWriter.java?rev=1179453&r1=1179452&r2=1179453&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/StoredFieldsWriter.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/StoredFieldsWriter.java Wed Oct  5 21:34:51 2011
@@ -19,6 +19,8 @@ package org.apache.lucene.index;
 
 import java.io.IOException;
 
+import org.apache.lucene.index.codecs.CodecProvider;
+import org.apache.lucene.index.codecs.FieldsWriter;
 import org.apache.lucene.store.IOContext;
 import org.apache.lucene.util.ArrayUtil;
 import org.apache.lucene.util.RamUsageEstimator;
@@ -33,10 +35,12 @@ final class StoredFieldsWriter {
   int freeCount;
 
   final DocumentsWriterPerThread.DocState docState;
+  final CodecProvider codecProvider;
 
   public StoredFieldsWriter(DocumentsWriterPerThread docWriter) {
     this.docWriter = docWriter;
     this.docState = docWriter.docState;
+    this.codecProvider = docWriter.codecProvider;
   }
 
   private int numStoredFields;
@@ -77,7 +81,7 @@ final class StoredFieldsWriter {
 
   private synchronized void initFieldsWriter(IOContext context) throws IOException {
     if (fieldsWriter == null) {
-      fieldsWriter = new FieldsWriter(docWriter.directory, docWriter.getSegment(), context);
+      fieldsWriter = codecProvider.fieldsWriter(docWriter.directory, docWriter.getSegment(), context);
       lastDocID = 0;
     }
   }

Modified: lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/codecs/CodecProvider.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/codecs/CodecProvider.java?rev=1179453&r1=1179452&r2=1179453&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/codecs/CodecProvider.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/codecs/CodecProvider.java Wed Oct  5 21:34:51 2011
@@ -17,12 +17,17 @@ package org.apache.lucene.index.codecs;
  * limitations under the License.
  */
 
+import java.io.IOException;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.lucene.index.FieldInfos;
+import org.apache.lucene.store.Directory;
+import org.apache.lucene.store.IOContext;
+
 /** Holds a set of codecs, keyed by name.  You subclass
  *  this, instantiate it, and register your codecs, then
  *  pass this instance to IndexReader/IndexWriter (via
@@ -105,6 +110,16 @@ public class CodecProvider {
   public SegmentInfosReader getSegmentInfosReader() {
     return infosReader;
   }
+  
+  /** expert */
+  public FieldsReader fieldsReader(Directory directory, String segment, FieldInfos fn, IOContext context, int docStoreOffset, int size) throws IOException {
+    return new DefaultFieldsReader(directory, segment, fn, context, docStoreOffset, size);
+  }
+
+  /** expert */
+  public FieldsWriter fieldsWriter(Directory directory, String segment, IOContext context) throws IOException {
+    return new DefaultFieldsWriter(directory, segment, context);
+  }
 
   static private CodecProvider defaultCodecs = new CoreCodecProvider();
 

Modified: lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/codecs/DefaultSegmentInfosReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/codecs/DefaultSegmentInfosReader.java?rev=1179453&r1=1179452&r2=1179453&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/codecs/DefaultSegmentInfosReader.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/codecs/DefaultSegmentInfosReader.java Wed Oct  5 21:34:51 2011
@@ -20,7 +20,6 @@ package org.apache.lucene.index.codecs;
 import java.io.IOException;
 
 import org.apache.lucene.index.CorruptIndexException;
-import org.apache.lucene.index.FieldsReader;
 import org.apache.lucene.index.IndexFileNames;
 import org.apache.lucene.index.IndexFormatTooOldException;
 import org.apache.lucene.index.IndexFormatTooNewException;
@@ -79,7 +78,7 @@ public class DefaultSegmentInfosReader e
           }
 
           try {
-            FieldsReader.checkCodeVersion(dir, si.getDocStoreSegment());
+            DefaultFieldsReader.checkCodeVersion(dir, si.getDocStoreSegment());
           } finally {
             // If we opened the directory, close it
             if (dir != directory) dir.close();

Modified: lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/values/Bytes.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/values/Bytes.java?rev=1179453&r1=1179452&r2=1179453&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/values/Bytes.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/index/values/Bytes.java Wed Oct  5 21:34:51 2011
@@ -514,17 +514,17 @@ public final class Bytes {
           Writer.DATA_EXTENSION), context);
       boolean success = false;
       try {
-      version = CodecUtil.checkHeader(datIn, codecName, maxVersion, maxVersion);
-      if (doIndex) {
-        idxIn = dir.openInput(IndexFileNames.segmentFileName(id, "",
-            Writer.INDEX_EXTENSION), context);
-        final int version2 = CodecUtil.checkHeader(idxIn, codecName,
-            maxVersion, maxVersion);
-        assert version == version2;
-      } else {
-        idxIn = null;
-      }
-      success = true;
+        version = CodecUtil.checkHeader(datIn, codecName, maxVersion, maxVersion);
+        if (doIndex) {
+          idxIn = dir.openInput(IndexFileNames.segmentFileName(id, "",
+                                                               Writer.INDEX_EXTENSION), context);
+          final int version2 = CodecUtil.checkHeader(idxIn, codecName,
+                                                     maxVersion, maxVersion);
+          assert version == version2;
+        } else {
+          idxIn = null;
+        }
+        success = true;
       } finally {
         if (!success) {
           closeInternal();

Modified: lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/search/IndexSearcher.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/search/IndexSearcher.java?rev=1179453&r1=1179452&r2=1179453&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/search/IndexSearcher.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/search/IndexSearcher.java Wed Oct  5 21:34:51 2011
@@ -55,7 +55,7 @@ import org.apache.lucene.util.ThreadInte
  * multiple searches instead of creating a new one
  * per-search.  If your index has changed and you wish to
  * see the changes reflected in searching, you should
- * use {@link IndexReader#reopen} to obtain a new reader and
+ * use {@link IndexReader#openIfChanged} to obtain a new reader and
  * then create a new IndexSearcher from that.  Also, for
  * low-latency turnaround it's best to use a near-real-time
  * reader ({@link IndexReader#open(IndexWriter,boolean)}).

Modified: lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/search/MultiPhraseQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/search/MultiPhraseQuery.java?rev=1179453&r1=1179452&r2=1179453&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/search/MultiPhraseQuery.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/java/org/apache/lucene/search/MultiPhraseQuery.java Wed Oct  5 21:34:51 2011
@@ -178,7 +178,7 @@ public class MultiPhraseQuery extends Qu
         int docFreq;
 
         if (terms.length > 1) {
-          postingsEnum = new UnionDocsAndPositionsEnum(reader, terms);
+          postingsEnum = new UnionDocsAndPositionsEnum(liveDocs, reader, terms);
 
           // coarse -- this overcounts since a given doc can
           // have more than one terms:
@@ -434,9 +434,8 @@ class UnionDocsAndPositionsEnum extends 
   private DocsQueue _queue;
   private IntQueue _posList;
 
-  public UnionDocsAndPositionsEnum(IndexReader indexReader, Term[] terms) throws IOException {
+  public UnionDocsAndPositionsEnum(Bits liveDocs, IndexReader indexReader, Term[] terms) throws IOException {
     List<DocsAndPositionsEnum> docsEnums = new LinkedList<DocsAndPositionsEnum>();
-    final Bits liveDocs = indexReader.getLiveDocs();
     for (int i = 0; i < terms.length; i++) {
       DocsAndPositionsEnum postings = indexReader.termPositionsEnum(liveDocs,
                                                                     terms[i].field(),

Modified: lucene/dev/branches/solrcloud/lucene/src/site/build/site/demo2.html
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/site/build/site/demo2.html?rev=1179453&r1=1179452&r2=1179453&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/site/build/site/demo2.html (original)
+++ lucene/dev/branches/solrcloud/lucene/src/site/build/site/demo2.html Wed Oct  5 21:34:51 2011
@@ -317,7 +317,7 @@ common language words such as articles (
 searching.  It should be noted that there are different rules for every language, and you should use the
 proper analyzer for each.  Lucene currently provides Analyzers for a number of different languages (see
 the javadocs under 
-<a href="api/module-analysis-common/org/apache/lucene/analysis/package-summary.html">modules/analysis/common/src/java/org/apache/lucene/analysis</a>).
+<a href="api/module-analysis-common/org/apache/lucene/analysis/">modules/analysis/common/src/java/org/apache/lucene/analysis</a>).
 </p>
 <p>
 The <span class="codefrag">IndexWriterConfig</span> instance holds all configuration for <span class="codefrag">IndexWriter</span>.  For

Modified: lucene/dev/branches/solrcloud/lucene/src/site/src/documentation/content/xdocs/demo2.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/site/src/documentation/content/xdocs/demo2.xml?rev=1179453&r1=1179452&r2=1179453&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/site/src/documentation/content/xdocs/demo2.xml (original)
+++ lucene/dev/branches/solrcloud/lucene/src/site/src/documentation/content/xdocs/demo2.xml Wed Oct  5 21:34:51 2011
@@ -96,7 +96,7 @@ common language words such as articles (
 searching.  It should be noted that there are different rules for every language, and you should use the
 proper analyzer for each.  Lucene currently provides Analyzers for a number of different languages (see
 the javadocs under 
-<a href="api/module-analysis-common/org/apache/lucene/analysis/package-summary.html"
+<a href="api/module-analysis-common/org/apache/lucene/analysis/"
 >modules/analysis/common/src/java/org/apache/lucene/analysis</a>).
 </p>
 

Modified: lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/index/RandomCodecProvider.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/index/RandomCodecProvider.java?rev=1179453&r1=1179452&r2=1179453&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/index/RandomCodecProvider.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/index/RandomCodecProvider.java Wed Oct  5 21:34:51 2011
@@ -48,7 +48,7 @@ public class RandomCodecProvider extends
   private Map<String,Codec> previousMappings = new HashMap<String,Codec>();
   private final int perFieldSeed;
   
-  public RandomCodecProvider(Random random) {
+  public RandomCodecProvider(Random random, boolean useNoMemoryExpensiveCodec) {
     this.perFieldSeed = random.nextInt();
     // TODO: make it possible to specify min/max iterms per
     // block via CL:
@@ -61,8 +61,10 @@ public class RandomCodecProvider extends
     minItemsPerBlock = _TestUtil.nextInt(random, 2, 100);
     maxItemsPerBlock = 2*(Math.max(1, minItemsPerBlock-1)) + random.nextInt(100);
     register(new PulsingCodec( 1 + random.nextInt(20), minItemsPerBlock, maxItemsPerBlock));
-    register(new SimpleTextCodec());
-    register(new MemoryCodec());
+    if (!useNoMemoryExpensiveCodec) {
+      register(new SimpleTextCodec());
+      register(new MemoryCodec());
+    }
     Collections.shuffle(knownCodecs, random);
   }
   

Modified: lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/search/CheckHits.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/search/CheckHits.java?rev=1179453&r1=1179452&r2=1179453&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/search/CheckHits.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/search/CheckHits.java Wed Oct  5 21:34:51 2011
@@ -34,9 +34,17 @@ public class CheckHits {
   /**
    * Some explains methods calculate their values though a slightly
    * different  order of operations from the actual scoring method ...
-   * this allows for a small amount of variation
+   * this allows for a small amount of relative variation
    */
-  public static float EXPLAIN_SCORE_TOLERANCE_DELTA = 0.02f;
+  public static float EXPLAIN_SCORE_TOLERANCE_DELTA = 0.001f;
+  
+  /**
+   * In general we use a relative epsilon, but some tests do crazy things
+   * like boost documents with 0, creating tiny tiny scores where the
+   * relative difference is large but the absolute difference is tiny.
+   * we ensure the the epsilon is always at least this big.
+   */
+  public static float EXPLAIN_SCORE_TOLERANCE_MINIMUM = 1e-6f;
     
   /**
    * Tests that all documents up to maxDoc which are *not* in the
@@ -305,6 +313,10 @@ public class CheckHits {
 
   }
 
+  private static float explainToleranceDelta(float f1, float f2) {
+    return Math.max(EXPLAIN_SCORE_TOLERANCE_MINIMUM, Math.max(Math.abs(f1), Math.abs(f2)) * EXPLAIN_SCORE_TOLERANCE_DELTA);
+  }
+
   /** 
    * Assert that an explanation has the expected score, and optionally that its
    * sub-details max/sum/factor match to that score.
@@ -323,7 +335,7 @@ public class CheckHits {
     float value = expl.getValue();
     Assert.assertEquals(q+": score(doc="+doc+")="+score+
         " != explanationScore="+value+" Explanation: "+expl,
-        score,value,EXPLAIN_SCORE_TOLERANCE_DELTA);
+        score,value,explainToleranceDelta(score, value));
 
     if (!deep) return;
 
@@ -393,7 +405,7 @@ public class CheckHits {
         }
         Assert.assertEquals(q+": actual subDetails combined=="+combined+
             " != value="+value+" Explanation: "+expl,
-            combined,value,EXPLAIN_SCORE_TOLERANCE_DELTA);
+            combined,value,explainToleranceDelta(combined, value));
       }
     }
   }

Modified: lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/util/LuceneTestCase.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/util/LuceneTestCase.java?rev=1179453&r1=1179452&r2=1179453&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/util/LuceneTestCase.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/util/LuceneTestCase.java Wed Oct  5 21:34:51 2011
@@ -21,9 +21,11 @@ import java.io.File;
 import java.io.IOException;
 import java.io.PrintStream;
 import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
 import java.lang.annotation.Inherited;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
 import java.lang.reflect.Constructor;
 import java.util.*;
 import java.util.Map.Entry;
@@ -349,7 +351,7 @@ public abstract class LuceneTestCase ext
         if (random.nextInt(4) == 0) { // preflex-only setup
           codec = installTestCodecs("PreFlex", CodecProvider.getDefault());
         } else { // per-field setup
-          CodecProvider.setDefault(new RandomCodecProvider(random));
+          CodecProvider.setDefault(new RandomCodecProvider(random, useNoMemoryExpensiveCodec));
           codec = installTestCodecs(TEST_CODEC, CodecProvider.getDefault());
         }
       } else { // ordinary setup
@@ -639,6 +641,17 @@ public abstract class LuceneTestCase ext
     if (!testsFailed) {
       assertTrue("ensure your tearDown() calls super.tearDown()!!!", (s == State.INITIAL || s == State.TEARDOWN));
     }
+    
+    if (useNoMemoryExpensiveCodec) {
+      final String defCodec = CodecProvider.getDefault().getDefaultFieldCodec();
+      // Stupid: assumeFalse in setUp() does not print any information, because
+      // TestWatchman does not watch test during setUp() - getName() is also not defined...
+      // => print info directly and use assume without message:
+      if ("SimpleText".equals(defCodec) || "Memory".equals(defCodec)) {
+        System.err.println("NOTE: A test method in " + getClass().getSimpleName() + " was ignored, as it uses too much memory with " + defCodec + ".");
+        Assume.assumeTrue(false);
+      }
+    }
   }
 
   /**
@@ -1400,6 +1413,9 @@ public abstract class LuceneTestCase ext
     return context;
   }
   
+  // initialized by the TestRunner
+  static boolean useNoMemoryExpensiveCodec;
+  
   // recorded seed: for beforeClass
   private static long staticSeed;
   // seed for individual test methods, changed in @before
@@ -1418,6 +1434,15 @@ public abstract class LuceneTestCase ext
   @Retention(RetentionPolicy.RUNTIME)
   public @interface Nightly {}
 
+  /**
+   * Annotation for test classes that should only use codecs that are not memory expensive (avoid SimpleText, MemoryCodec).
+   */
+  @Documented
+  @Inherited
+  @Retention(RetentionPolicy.RUNTIME)
+  @Target(ElementType.TYPE)
+  public @interface UseNoMemoryExpensiveCodec {}
+
   @Ignore("just a hack")
   public final void alwaysIgnoredTestMethod() {}
 }

Modified: lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/util/LuceneTestCaseRunner.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/util/LuceneTestCaseRunner.java?rev=1179453&r1=1179452&r2=1179453&view=diff
==============================================================================
--- lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/util/LuceneTestCaseRunner.java (original)
+++ lucene/dev/branches/solrcloud/lucene/src/test-framework/org/apache/lucene/util/LuceneTestCaseRunner.java Wed Oct  5 21:34:51 2011
@@ -26,6 +26,7 @@ import java.util.List;
 import java.util.Random;
 
 import org.apache.lucene.util.LuceneTestCase.Nightly;
+import org.apache.lucene.util.LuceneTestCase.UseNoMemoryExpensiveCodec;
 import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.Description;
@@ -156,6 +157,19 @@ public class LuceneTestCaseRunner extend
   
   public LuceneTestCaseRunner(Class<?> clazz) throws InitializationError {
     super(clazz);
+    
+    // This TestRunner can handle only LuceneTestCase subclasses
+    if (!LuceneTestCase.class.isAssignableFrom(clazz)) {
+      throw new UnsupportedOperationException("LuceneTestCaseRunner can only be used with LuceneTestCase.");
+    }
+    
+    final boolean useNoMemoryExpensiveCodec = LuceneTestCase.useNoMemoryExpensiveCodec =
+      clazz.isAnnotationPresent(UseNoMemoryExpensiveCodec.class);
+    if (useNoMemoryExpensiveCodec) {
+      System.err.println("NOTE: Using no memory expensive codecs (Memory, SimpleText) for " +
+        clazz.getSimpleName() + ".");
+    }
+    
     // evil we cannot init our random here, because super() calls computeTestMethods!!!!;
     Filter f = new Filter() {