You are viewing a plain text version of this content. The canonical link for it is here.
Posted to solr-commits@lucene.apache.org by yo...@apache.org on 2006/01/26 06:40:05 UTC

svn commit: r372455 [1/11] - in /incubator/solr/trunk: ./ src/ src/apps/ src/apps/SolarTest/ src/apps/SolarTest/src/ src/java/ src/java/org/ src/java/org/apache/ src/java/org/apache/solr/ src/java/org/apache/solr/analysis/ src/java/org/apache/solr/core...

Author: yonik
Date: Wed Jan 25 21:37:29 2006
New Revision: 372455

URL: http://svn.apache.org/viewcvs?rev=372455&view=rev
Log:
initial version

Added:
    incubator/solr/trunk/README.txt   (props changed)
      - copied unchanged from r372422, incubator/solr/trunk/README
    incubator/solr/trunk/src/
    incubator/solr/trunk/src/apps/
    incubator/solr/trunk/src/apps/SolarTest/
    incubator/solr/trunk/src/apps/SolarTest/cachetest.txt   (with props)
    incubator/solr/trunk/src/apps/SolarTest/commit.bat   (with props)
    incubator/solr/trunk/src/apps/SolarTest/dict.txt   (with props)
    incubator/solr/trunk/src/apps/SolarTest/newtest.txt   (with props)
    incubator/solr/trunk/src/apps/SolarTest/protwords.txt   (with props)
    incubator/solr/trunk/src/apps/SolarTest/run   (with props)
    incubator/solr/trunk/src/apps/SolarTest/schema.xml   (with props)
    incubator/solr/trunk/src/apps/SolarTest/solrconfig.xml   (with props)
    incubator/solr/trunk/src/apps/SolarTest/src/
    incubator/solr/trunk/src/apps/SolarTest/src/SolrTest.java   (with props)
    incubator/solr/trunk/src/apps/SolarTest/stopwords.txt   (with props)
    incubator/solr/trunk/src/apps/SolarTest/synonyms.txt   (with props)
    incubator/solr/trunk/src/apps/SolarTest/test_func.txt   (with props)
    incubator/solr/trunk/src/java/
    incubator/solr/trunk/src/java/org/
    incubator/solr/trunk/src/java/org/apache/
    incubator/solr/trunk/src/java/org/apache/solr/
    incubator/solr/trunk/src/java/org/apache/solr/analysis/
    incubator/solr/trunk/src/java/org/apache/solr/analysis/BaseTokenFilterFactory.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/analysis/BaseTokenizerFactory.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/analysis/EnglishPorterFilterFactory.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/analysis/HTMLStripReader.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/analysis/HTMLStripStandardTokenizerFactory.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/analysis/HTMLStripWhitespaceTokenizerFactory.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/analysis/LengthFilter.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/analysis/LengthFilterFactory.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/analysis/LetterTokenizerFactory.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/analysis/LowerCaseFilterFactory.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/analysis/LowerCaseTokenizerFactory.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/analysis/PorterStemFilterFactory.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/analysis/SnowballPorterFilterFactory.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/analysis/StandardFilterFactory.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/analysis/StandardTokenizerFactory.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/analysis/StopFilterFactory.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/analysis/SynonymFilterFactory.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/analysis/TokenFilterFactory.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/analysis/TokenizerChain.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/analysis/TokenizerFactory.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/analysis/WhitespaceTokenizerFactory.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/analysis/WordDelimiterFilter.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/analysis/WordDelimiterFilterFactory.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/core/
    incubator/solr/trunk/src/java/org/apache/solr/core/AbstractSolrEventListener.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/core/Config.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/core/QuerySenderListener.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/core/RequestHandlers.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/core/RunExecutableListener.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/core/SolrConfig.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/core/SolrCore.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/core/SolrEventListener.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/core/SolrException.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/core/SolrInfo.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/core/SolrInfoMBean.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/core/SolrInfoRegistry.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/request/
    incubator/solr/trunk/src/java/org/apache/solr/request/LocalSolrQueryRequest.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/request/QueryResponseWriter.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/request/SolrQueryRequest.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/request/SolrQueryRequestBase.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/request/SolrQueryResponse.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/request/SolrRequestHandler.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/request/StandardRequestHandler.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/request/XMLResponseWriter.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/request/XMLWriter.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/schema/
    incubator/solr/trunk/src/java/org/apache/solr/schema/BCDIntField.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/schema/BCDLongField.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/schema/BCDStrField.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/schema/BoolField.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/schema/DateField.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/schema/DoubleField.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/schema/FieldProperties.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/schema/FieldType.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/schema/FloatField.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/schema/IndexSchema.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/schema/IntField.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/schema/LongField.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/schema/SchemaField.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/schema/SortableDoubleField.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/schema/SortableFloatField.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/schema/SortableIntField.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/schema/SortableLongField.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/schema/StrField.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/schema/TextField.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/search/
    incubator/solr/trunk/src/java/org/apache/solr/search/BitDocSet.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/search/CacheConfig.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/search/CacheRegenerator.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/search/DocIterator.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/search/DocList.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/search/DocListAndSet.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/search/DocSet.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/search/DocSlice.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/search/HashDocSet.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/search/LRUCache.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/search/LuceneQueryOptimizer.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/search/MissingStringLastComparatorSource.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/search/QueryParsing.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/search/QueryResultKey.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/search/SolrCache.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/search/SolrIndexSearcher.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/search/SolrQueryParser.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/search/SolrSimilarity.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/search/Sorting.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/search/test/
    incubator/solr/trunk/src/java/org/apache/solr/search/test/TestDocSet.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/tst/
    incubator/solr/trunk/src/java/org/apache/solr/tst/OldRequestHandler.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/tst/TestRequestHandler.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/update/
    incubator/solr/trunk/src/java/org/apache/solr/update/AddUpdateCommand.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/update/CommitUpdateCommand.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/update/DeleteUpdateCommand.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/update/DirectUpdateHandler.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/update/DirectUpdateHandler2.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/update/DocumentBuilder.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/update/SolrIndexConfig.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/update/SolrIndexWriter.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/update/UpdateCommand.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/update/UpdateHandler.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/util/
    incubator/solr/trunk/src/java/org/apache/solr/util/BCDUtils.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/util/DOMUtil.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/util/NamedList.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/util/NumberUtils.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/util/RefCounted.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/util/StrUtils.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/util/XML.java   (with props)
    incubator/solr/trunk/src/java/org/apache/solr/util/test/
    incubator/solr/trunk/src/java/org/apache/solr/util/test/TestNumberUtils.java   (with props)
    incubator/solr/trunk/src/lucene_extras/
    incubator/solr/trunk/src/lucene_extras/org/
    incubator/solr/trunk/src/lucene_extras/org/apache/
    incubator/solr/trunk/src/lucene_extras/org/apache/lucene/
    incubator/solr/trunk/src/lucene_extras/org/apache/lucene/analysis/
    incubator/solr/trunk/src/lucene_extras/org/apache/lucene/analysis/SynonymFilter.java   (with props)
    incubator/solr/trunk/src/lucene_extras/org/apache/lucene/analysis/SynonymMap.java   (with props)
    incubator/solr/trunk/src/lucene_extras/org/apache/lucene/analysis/TestSynonymFilter.java   (with props)
    incubator/solr/trunk/src/lucene_extras/org/apache/lucene/search/
    incubator/solr/trunk/src/lucene_extras/org/apache/lucene/search/ConstantScorePrefixQuery.java   (with props)
    incubator/solr/trunk/src/lucene_extras/org/apache/lucene/search/PrefixFilter.java   (with props)
    incubator/solr/trunk/src/lucene_extras/org/apache/lucene/search/PublicFieldSortedHitQueue.java   (with props)
    incubator/solr/trunk/src/lucene_extras/org/apache/lucene/search/function/
    incubator/solr/trunk/src/lucene_extras/org/apache/lucene/search/function/DocValues.java   (with props)
    incubator/solr/trunk/src/lucene_extras/org/apache/lucene/search/function/FieldCacheSource.java   (with props)
    incubator/solr/trunk/src/lucene_extras/org/apache/lucene/search/function/FloatFieldSource.java   (with props)
    incubator/solr/trunk/src/lucene_extras/org/apache/lucene/search/function/FunctionQuery.java   (with props)
    incubator/solr/trunk/src/lucene_extras/org/apache/lucene/search/function/IntFieldSource.java   (with props)
    incubator/solr/trunk/src/lucene_extras/org/apache/lucene/search/function/LinearFloatFunction.java   (with props)
    incubator/solr/trunk/src/lucene_extras/org/apache/lucene/search/function/OrdFieldSource.java   (with props)
    incubator/solr/trunk/src/lucene_extras/org/apache/lucene/search/function/ReciprocalFloatFunction.java   (with props)
    incubator/solr/trunk/src/lucene_extras/org/apache/lucene/search/function/ReverseOrdFieldSource.java   (with props)
    incubator/solr/trunk/src/lucene_extras/org/apache/lucene/search/function/ValueSource.java   (with props)
    incubator/solr/trunk/src/lucene_extras/org/apache/lucene/search/function/function.zip   (with props)
    incubator/solr/trunk/src/scripts/
    incubator/solr/trunk/src/scripts/abc   (with props)
    incubator/solr/trunk/src/scripts/abo   (with props)
    incubator/solr/trunk/src/scripts/backup   (with props)
    incubator/solr/trunk/src/scripts/commit   (with props)
    incubator/solr/trunk/src/scripts/optimize   (with props)
    incubator/solr/trunk/src/scripts/readercycle   (with props)
    incubator/solr/trunk/src/scripts/rsyncd-disable   (with props)
    incubator/solr/trunk/src/scripts/rsyncd-enable   (with props)
    incubator/solr/trunk/src/scripts/rsyncd-start   (with props)
    incubator/solr/trunk/src/scripts/rsyncd-stop   (with props)
    incubator/solr/trunk/src/scripts/snapcleaner   (with props)
    incubator/solr/trunk/src/scripts/snapinstaller   (with props)
    incubator/solr/trunk/src/scripts/snappuller   (with props)
    incubator/solr/trunk/src/scripts/snappuller-disable   (with props)
    incubator/solr/trunk/src/scripts/snappuller-enable   (with props)
    incubator/solr/trunk/src/scripts/snapshooter   (with props)
    incubator/solr/trunk/src/test/
    incubator/solr/trunk/src/webapp/
    incubator/solr/trunk/src/webapp/WEB-INF/
    incubator/solr/trunk/src/webapp/WEB-INF/web.xml   (with props)
    incubator/solr/trunk/src/webapp/resources/
    incubator/solr/trunk/src/webapp/resources/admin/
    incubator/solr/trunk/src/webapp/resources/admin/action.jsp   (with props)
    incubator/solr/trunk/src/webapp/resources/admin/analysis.jsp   (with props)
    incubator/solr/trunk/src/webapp/resources/admin/distributiondump.jsp   (with props)
    incubator/solr/trunk/src/webapp/resources/admin/form.jsp   (with props)
    incubator/solr/trunk/src/webapp/resources/admin/get-file.jsp   (with props)
    incubator/solr/trunk/src/webapp/resources/admin/get-properties.jsp   (with props)
    incubator/solr/trunk/src/webapp/resources/admin/index.jsp   (with props)
    incubator/solr/trunk/src/webapp/resources/admin/logging.jsp   (with props)
    incubator/solr/trunk/src/webapp/resources/admin/ping.jsp   (with props)
    incubator/solr/trunk/src/webapp/resources/admin/raw-schema.jsp   (with props)
    incubator/solr/trunk/src/webapp/resources/admin/registry.jsp   (with props)
    incubator/solr/trunk/src/webapp/resources/admin/registry.xsl   (with props)
    incubator/solr/trunk/src/webapp/resources/admin/solar-status.jsp   (with props)
    incubator/solr/trunk/src/webapp/resources/admin/solr-admin.css   (with props)
    incubator/solr/trunk/src/webapp/resources/admin/solr-head.gif   (with props)
    incubator/solr/trunk/src/webapp/resources/admin/solr-head.png   (with props)
    incubator/solr/trunk/src/webapp/resources/admin/solr-lowercase.gif   (with props)
    incubator/solr/trunk/src/webapp/resources/admin/solr-lowercase.png   (with props)
    incubator/solr/trunk/src/webapp/resources/admin/stats.jsp   (with props)
    incubator/solr/trunk/src/webapp/resources/admin/stats.xsl   (with props)
    incubator/solr/trunk/src/webapp/resources/admin/status.xsl   (with props)
    incubator/solr/trunk/src/webapp/resources/admin/tabular.xsl   (with props)
    incubator/solr/trunk/src/webapp/resources/admin/threaddump.jsp   (with props)
    incubator/solr/trunk/src/webapp/resources/favicon.ico   (with props)
    incubator/solr/trunk/src/webapp/src/
    incubator/solr/trunk/src/webapp/src/org/
    incubator/solr/trunk/src/webapp/src/org/apache/
    incubator/solr/trunk/src/webapp/src/org/apache/solr/
    incubator/solr/trunk/src/webapp/src/org/apache/solr/servlet/
    incubator/solr/trunk/src/webapp/src/org/apache/solr/servlet/SolrServlet.java   (with props)
Removed:
    incubator/solr/trunk/README

Propchange: incubator/solr/trunk/README.txt
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/solr/trunk/src/apps/SolarTest/cachetest.txt
URL: http://svn.apache.org/viewcvs/incubator/solr/trunk/src/apps/SolarTest/cachetest.txt?rev=372455&view=auto
==============================================================================
--- incubator/solr/trunk/src/apps/SolarTest/cachetest.txt (added)
+++ incubator/solr/trunk/src/apps/SolarTest/cachetest.txt Wed Jan 25 21:37:29 2006
@@ -0,0 +1,24 @@
+
+#change the query cache size to 3 and the autowarm size to 2 for this test
+<commit/>
+val_s:A
+val_s:B
+val_s:C
+val_s:D
+#B,C,D should be in cache
+val_s:A
+#miss, now C,D,A should be in cache
+<commit/>
+#should see old{lookups=5, hits=0, size=3}, new{size=2}
+#now D,A should be autowarmed in new
+
+val_s:C
+#miss, now cache=D,A,C
+<commit/>
+#should see old{lookups,1 hits=0, size=3}, new{size=2}
+#now A,C should be autowarmed in new
+
+val_s:A
+val_s:C
+<commit/>
+#should see old{lookups=2, hits=2, size=0}

Propchange: incubator/solr/trunk/src/apps/SolarTest/cachetest.txt
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/solr/trunk/src/apps/SolarTest/commit.bat
URL: http://svn.apache.org/viewcvs/incubator/solr/trunk/src/apps/SolarTest/commit.bat?rev=372455&view=auto
==============================================================================
--- incubator/solr/trunk/src/apps/SolarTest/commit.bat (added)
+++ incubator/solr/trunk/src/apps/SolarTest/commit.bat Wed Jan 25 21:37:29 2006
@@ -0,0 +1,4 @@
+
+PATH=c:/cygwin/bin
+c:/cygwin/bin/bash.exe -c "echo handler called... cwd=`pwd` MYVAR=%MYVAR% > commit.outfile"
+exit 33

Propchange: incubator/solr/trunk/src/apps/SolarTest/commit.bat
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/solr/trunk/src/apps/SolarTest/dict.txt
URL: http://svn.apache.org/viewcvs/incubator/solr/trunk/src/apps/SolarTest/dict.txt?rev=372455&view=auto
==============================================================================
--- incubator/solr/trunk/src/apps/SolarTest/dict.txt (added)
+++ incubator/solr/trunk/src/apps/SolarTest/dict.txt Wed Jan 25 21:37:29 2006
@@ -0,0 +1 @@
+userName:Alex;startDate top 2;

Propchange: incubator/solr/trunk/src/apps/SolarTest/dict.txt
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/solr/trunk/src/apps/SolarTest/newtest.txt
URL: http://svn.apache.org/viewcvs/incubator/solr/trunk/src/apps/SolarTest/newtest.txt?rev=372455&view=auto
==============================================================================
--- incubator/solr/trunk/src/apps/SolarTest/newtest.txt (added)
+++ incubator/solr/trunk/src/apps/SolarTest/newtest.txt Wed Jan 25 21:37:29 2006
@@ -0,0 +1,540 @@
+#compact the index, keep things from getting out of hand
+<optimize/>
+
+#test query
+qlkciyopsbgzyvkylsjhchghjrdf %//result[@numFound="0"]
+
+#test escaping of ";"
+<delete><id>42</id></delete>
+<add><doc><field name="id">42</field><field name="val_s">aa;bb</field></doc></add>
+<commit/>
+id:42 AND val_s:aa\;bb    %//*[@numFound="1"]
+id:42 AND val_s:"aa;bb"    %//*[@numFound="1"]
+id:42 AND val_s:"aa"    %//*[@numFound="0"]
+
+
+
+#test allowDups default of false
+<delete><id>42</id></delete>
+<add><doc><field name="id">42</field><field name="val_s">AAA</field></doc></add>
+<add><doc><field name="id">42</field><field name="val_s">BBB</field></doc></add>
+<commit/>
+id:42 %//*[@numFound="1"] %//str[.="BBB"]
+<add><doc><field name="id">42</field><field name="val_s">CCC</field></doc></add>
+<add><doc><field name="id">42</field><field name="val_s">DDD</field></doc></add>
+<commit/>
+id:42 %//*[@numFound="1"] %//str[.="DDD"]
+<delete><id>42</id></delete>
+
+#test deletes
+<delete><query>id:[100 TO 110]</query></delete>
+<add allowDups="false"><doc><field name="id">101</field></doc></add>
+<add allowDups="false"><doc><field name="id">101</field></doc></add>
+<add allowDups="true"><doc><field name="id">105</field></doc></add>
+<add allowDups="false"><doc><field name="id">102</field></doc></add>
+<add allowDups="true"><doc><field name="id">103</field></doc></add>
+<add allowDups="false"><doc><field name="id">101</field></doc></add>
+<commit/>
+id:[100 TO 110] %//*[@numFound="4"]
+<delete><id>102</id></delete>
+<commit/>
+id:[100 TO 110] %//*[@numFound="3"]
+<delete><query>id:105</query></delete>
+<commit/>
+id:[100 TO 110] %//*[@numFound="2"]
+<delete><query>id:[100 TO 110]</query></delete>
+<commit/>
+id:[100 TO 110] %//*[@numFound="0"]
+
+#test range
+<delete><id>44</id></delete>
+<add allowDups="true"><doc><field name="id">44</field><field name="val_s">apple</field></doc></add>
+<add allowDups="true"><doc><field name="id">44</field><field name="val_s">banana</field></doc></add>
+<add allowDups="true"><doc><field name="id">44</field><field name="val_s">pear</field></doc></add>
+<commit/>
+val_s:[a TO z] %//*[@numFound="3"] %*[count(//doc)=3] %//*[@start="0"]
+val_s:[a TO z] %%start=2&limit=5 %//*[@numFound="3"] %*[count(//doc)=1] %*//doc[1]/str[.="pear"] %//*[@start="2"]
+val_s:[a TO z] %%start=3&limit=5 %//*[@numFound="3"] %*[count(//doc)=0]
+val_s:[a TO z] %%start=4&limit=5 %//*[@numFound="3"] %*[count(//doc)=0]
+val_s:[a TO z] %%start=25&limit=5 %//*[@numFound="3"] %*[count(//doc)=0]
+val_s:[a TO z] %%start=0&limit=1 %//*[@numFound="3"] %*[count(//doc)=1] %*//doc[1]/str[.="apple"]
+val_s:[a TO z] %%start=0&limit=2 %//*[@numFound="3"] %*[count(//doc)=2] %*//doc[2]/str[.="banana"]
+val_s:[a TO z] %%start=1&limit=1 %//*[@numFound="3"] %*[count(//doc)=1] %*//doc[1]/str[.="banana"]
+val_s:[a TO z] %%start=3&limit=1 %//*[@numFound="3"] %*[count(//doc)=0]
+val_s:[a TO z] %%start=4&limit=1 %//*[@numFound="3"] %*[count(//doc)=0]
+val_s:[a TO z] %%start=1&limit=0 %//*[@numFound="3"] %*[count(//doc)=0]
+val_s:[a TO z] %%start=0&limit=0 %//*[@numFound="3"] %*[count(//doc)=0]
+val_s:[a TO z];val_s asc %%start=0&limit=0 %//*[@numFound="3"] %*[count(//doc)=0]
+val_s:[a TO z];val_s desc %%start=0&limit=0 %//*[@numFound="3"] %*[count(//doc)=0]
+val_s:[a TO b] %//*[@numFound="1"]
+val_s:[a TO cat] %//*[@numFound="2"]
+val_s:[a TO *] %//*[@numFound="3"]
+val_s:[* TO z] %//*[@numFound="3"]
+val_s:[* TO *] %//*[@numFound="3"]
+val_s:[apple TO pear] %//*[@numFound="3"]
+val_s:[bear TO boar] %//*[@numFound="0"]
+val_s:[a TO a] %//*[@numFound="0"]
+val_s:[apple TO apple] %//*[@numFound="1"]
+val_s:{apple TO pear} %//*[@numFound="1"]
+val_s:{a TO z} %//*[@numFound="3"]
+val_s:{* TO *} %//*[@numFound="3"]
+#test rangequery within a boolean query
+id:44 AND val_s:[a TO z] %//*[@numFound="3"]
+id:44 OR val_s:[a TO z] %//*[@numFound="3"]
+val_s:[a TO b] OR val_s:[b TO z] %//*[@numFound="3"]
++val_s:[a TO b] -val_s:[b TO z] %//*[@numFound="1"]
+-val_s:[a TO b] +val_s:[b TO z] %//*[@numFound="2"]
+val_s:[a TO c] AND val_s:[apple TO z] %//*[@numFound="2"]
+val_s:[a TO c] AND val_s:[a TO apple] %//*[@numFound="1"]
+id:44 AND (val_s:[a TO c] AND val_s:[a TO apple]) %//*[@numFound="1"]
+(val_s:[apple TO apple] OR val_s:[a TO c]) AND (val_s:[b TO c] OR val_s:[b TO b])  %//*[@numFound="1"] %//str[.="banana"]
+(val_s:[apple TO apple] AND val_s:[a TO c]) OR (val_s:[p TO z] AND val_s:[a TO z]) %//*[@numFound="2"] %//str[.="apple"] %//str[.="pear"]
+
+#check for docs that appear more than once in a range
+<add allowDups="true"><doc><field name="id">44</field><field name="val_s">apple</field><field name="val_s">banana</field></doc></add>
+<commit/>
+val_s:[* TO *] OR  val_s:[* TO *] %//*[@numFound="4"]
+val_s:[* TO *] AND  val_s:[* TO *] %//*[@numFound="4"]
+val_s:[* TO *] %//*[@numFound="4"]
+
+
+#<delete><id>44</id></delete>
+<add overwritePending="true" overwriteCommitted="true"><doc><field name="id">44</field><field name="text">red riding hood</field></doc></add>
+<commit/>
+id:44 AND red  %//@numFound[.="1"] %*[count(//doc)=1]
+id:44 AND ride %//@numFound[.="1"]
+id:44 AND blue %//@numFound[.="0"]
+
+#allow duplicates
+<delete><id>44</id></delete>
+<add allowDups="true" overwriteCommitted="false" overwritePending="false"><doc><field name="id">44</field><field name="text">red riding hood</field></doc></add>
+<add allowDups="true" overwriteCommitted="false" overwritePending="false"><doc><field name="id">44</field><field name="text">big bad wolf</field></doc></add>
+<commit/>
+id:44 %//@numFound[.="2"]
+id:44 AND red %//@numFound[.="1"] %*[count(//doc)=1]
+id:44 AND wolf %//@numFound[.="1"] %*[count(//doc)=1]
++id:44 red wolf %//@numFound[.="2"]
+
+#test removal of multiples w/o adding anything else
+<delete><id>44</id></delete>
+<commit/>
+id:44 %//@numFound[.="0"]
+
+#untokenized string type
+<delete><id>44</id></delete>
+<add><doc><field name="id">44</field><field name="ssto">and a 10.4 ?</field></doc></add>
+<commit/>
+id:44 %//str[.="and a 10.4 ?"]
+<delete><id>44</id></delete>
+<add><doc><field name="id">44</field><field name="sind">abc123</field></doc></add>
+<commit/>
+#TODO: how to search for something with spaces....
+sind:abc123 %//@numFound[.="1"] %*[count(//@name[.="sind"])=0] %*[count(//@name[.="id"])=1]
+
+<delete><id>44</id></delete>
+<delete><id>44</id></delete>
+<add><doc><field name="id">44</field><field name="sindsto">abc123</field></doc></add>
+<commit/>
+#TODO: how to search for something with spaces....
+sindsto:abc123 %//str[.="abc123"]
+
+#test output of multivalued fields
+<delete><id>44</id></delete>
+<add><doc><field name="id">44</field><field name="title">yonik3</field><field name="title" boost="2">yonik4</field></doc></add>
+<commit></commit>
+id:44 %//arr[@name="title"][./str="yonik3" and ./str="yonik4"] %*[count(//@name[.="title"])=1]
+title:yonik3 %//@numFound[.>"0"]
+title:yonik4 %//@numFound[.>"0"]
+title:yonik5 %//@numFound[.="0"]
+<delete><query>title:yonik4</query></delete>
+<commit/>
+id:44 %//@numFound[.="0"]
+
+
+#not visible until commit
+<delete><id>44</id></delete>
+<commit/>
+<add><doc><field name="id">44</field></doc></add>
+id:44 %//@numFound[.="0"]
+<commit/>
+id:44 %//@numFound[.="1"]
+
+#test configurable stop words
+<delete><id>44</id></delete>
+<add><doc><field name="id">44</field><field name="teststop">world stopworda view</field></doc></add>
+<commit/>
++id:44 +teststop:world %//@numFound[.="1"]
+teststop:stopworda %//@numFound[.="0"]
+
+#test ignoreCase stop words
+<delete><id>44</id></delete>
+<add><doc><field name="id">44</field><field name="stopfilt">world AnD view</field></doc></add>
+<commit/>
++id:44 +stopfilt:world %//@numFound[.="1"]
+stopfilt:"and" %//@numFound[.="0"]
+stopfilt:"AND" %//@numFound[.="0"]
+stopfilt:"AnD" %//@numFound[.="0"]
+
+#test dynamic field types
+<delete fromPending="true" fromCommitted="true"><id>44</id></delete>
+<add><doc><field name="id">44</field><field name="gack_i">51778</field><field name="t_name">cats</field></doc></add>
+<commit/>
+#test if the dyn fields got added
+id:44  %*[count(//doc/*)>=3]  %//int[@name="gack_i"][.="51778"]  %//str[@name="t_name"][.="cats"]
+#now test if we can query by a dynamic field (requires analyzer support)
+t_name:cat  %//str[@name="t_name" and .="cats"]
+#check that deleteByQuery works for dynamic fields
+<delete><query>t_name:cat</query></delete>
+<commit/>
+t_name:cat  %//@numFound[.="0"]
+
+#test that longest dynamic field match happens first
+<add><doc><field name="id">44</field><field name="xaa">mystr</field><field name="xaaa">12321</field></doc></add>
+<commit/>
+id:44  %//str[@name="xaa"][.="mystr"]  %//int[@name="xaaa"][.="12321"]
+
+
+#test integer ranges and sorting
+<delete><id>44</id></delete>
+<add allowDups="true"><doc><field name="id">44</field><field name="num_i">1234567890</field></doc></add>
+<add allowDups="true"><doc><field name="id">44</field><field name="num_i">10</field></doc></add>
+<add allowDups="true"><doc><field name="id">44</field><field name="num_i">1</field></doc></add>
+<add allowDups="true"><doc><field name="id">44</field><field name="num_i">2</field></doc></add>
+<add allowDups="true"><doc><field name="id">44</field><field name="num_i">15</field></doc></add>
+<add allowDups="true"><doc><field name="id">44</field><field name="num_i">-1</field></doc></add>
+<add allowDups="true"><doc><field name="id">44</field><field name="num_i">-987654321</field></doc></add>
+<add allowDups="true"><doc><field name="id">44</field><field name="num_i">2147483647</field></doc></add>
+<add allowDups="true"><doc><field name="id">44</field><field name="num_i">-2147483648</field></doc></add>
+<add allowDups="true"><doc><field name="id">44</field><field name="num_i">0</field></doc></add>
+<commit/>
+id:44   %*[count(//doc)=10]
+num_i:2147483647  %//@numFound[.="1"]  %//int[.="2147483647"]
+num_i:"-2147483648"  %//@numFound[.="1"] %//int[.="-2147483648"]
+id:44;num_i asc;    %//doc[1]/int[.="-2147483648"] %//doc[last()]/int[.="2147483647"]
+id:44;num_i desc;   %//doc[1]/int[.="2147483647"] %//doc[last()]/int[.="-2147483648"]
+num_i:[0 TO 9]  %*[count(//doc)=3]
+num_i:[-2147483648 TO 2147483647]  %*[count(//doc)=10]
+num_i:[-10 TO -1] %*[count(//doc)=1]
+
+#test long ranges and sorting
+<delete><id>44</id></delete>
+<add allowDups="true"><doc><field name="id">44</field><field name="num_l">1234567890</field></doc></add>
+<add allowDups="true"><doc><field name="id">44</field><field name="num_l">10</field></doc></add>
+<add allowDups="true"><doc><field name="id">44</field><field name="num_l">1</field></doc></add>
+<add allowDups="true"><doc><field name="id">44</field><field name="num_l">2</field></doc></add>
+<add allowDups="true"><doc><field name="id">44</field><field name="num_l">15</field></doc></add>
+<add allowDups="true"><doc><field name="id">44</field><field name="num_l">-1</field></doc></add>
+<add allowDups="true"><doc><field name="id">44</field><field name="num_l">-987654321</field></doc></add>
+<add allowDups="true"><doc><field name="id">44</field><field name="num_l">9223372036854775807</field></doc></add>
+<add allowDups="true"><doc><field name="id">44</field><field name="num_l">-9223372036854775808</field></doc></add>
+<add allowDups="true"><doc><field name="id">44</field><field name="num_l">0</field></doc></add>
+<commit/>
+id:44   %*[count(//doc)=10]
+num_l:9223372036854775807  %//@numFound[.="1"] %//long[.="9223372036854775807"]
+num_l:"-9223372036854775808"  %//@numFound[.="1"] %//long[.="-9223372036854775808"]
+id:44;num_l asc;    %//doc[1]/long[.="-9223372036854775808"] %//doc[last()]/long[.="9223372036854775807"]
+id:44;num_l desc;   %//doc[1]/long[.="9223372036854775807"] %//doc[last()]/long[.="-9223372036854775808"]
+num_l:[-1 TO 9]  %*[count(//doc)=4]
+num_l:[-9223372036854775808 TO 9223372036854775807]  %*[count(//doc)=10]
+num_l:[-10 TO -1] %*[count(//doc)=1]
+
+#test binary float ranges and sorting
+<delete><id>44</id></delete>
+<add allowDups="true"><doc><field name="id">44</field><field name="num_f">1.4142135</field></doc></add>
+<add allowDups="true"><doc><field name="id">44</field><field name="num_f">Infinity</field></doc></add>
+<add allowDups="true"><doc><field name="id">44</field><field name="num_f">-Infinity</field></doc></add>
+<add allowDups="true"><doc><field name="id">44</field><field name="num_f">NaN</field></doc></add>
+<add allowDups="true"><doc><field name="id">44</field><field name="num_f">2</field></doc></add>
+<add allowDups="true"><doc><field name="id">44</field><field name="num_f">-1</field></doc></add>
+<add allowDups="true"><doc><field name="id">44</field><field name="num_f">-987654321</field></doc></add>
+<add allowDups="true"><doc><field name="id">44</field><field name="num_f">-999999.99</field></doc></add>
+<add allowDups="true"><doc><field name="id">44</field><field name="num_f">-1e20</field></doc></add>
+<add allowDups="true"><doc><field name="id">44</field><field name="num_f">0</field></doc></add>
+<commit/>
+id:44   %*[count(//doc)=10]
+num_f:Infinity  %//@numFound[.="1"]  %//float[.="Infinity"]
+num_f:"-Infinity"  %//@numFound[.="1"]  %//float[.="-Infinity"]
+num_f:"NaN"  %//@numFound[.="1"]  %//float[.="NaN"]
+num_f:"-1e20"  %//@numFound[.="1"]
+id:44;num_f asc;    %//doc[1]/float[.="-Infinity"] %//doc[last()]/float[.="NaN"]
+id:44;num_f desc;   %//doc[1]/float[.="NaN"] %//doc[last()]/float[.="-Infinity"]
+num_f:[-1 TO 2]  %*[count(//doc)=4]
+num_f:[-Infinity TO Infinity]  %*[count(//doc)=9]
+
+
+
+#test binary double ranges and sorting
+<delete><id>44</id></delete>
+<add allowDups="true"><doc><field name="id">44</field><field name="num_d">1.4142135</field></doc></add>
+<add allowDups="true"><doc><field name="id">44</field><field name="num_d">Infinity</field></doc></add>
+<add allowDups="true"><doc><field name="id">44</field><field name="num_d">-Infinity</field></doc></add>
+<add allowDups="true"><doc><field name="id">44</field><field name="num_d">NaN</field></doc></add>
+<add allowDups="true"><doc><field name="id">44</field><field name="num_d">2</field></doc></add>
+<add allowDups="true"><doc><field name="id">44</field><field name="num_d">-1</field></doc></add>
+<add allowDups="true"><doc><field name="id">44</field><field name="num_d">1e-100</field></doc></add>
+<add allowDups="true"><doc><field name="id">44</field><field name="num_d">-999999.99</field></doc></add>
+<add allowDups="true"><doc><field name="id">44</field><field name="num_d">-1e100</field></doc></add>
+<add allowDups="true"><doc><field name="id">44</field><field name="num_d">0</field></doc></add>
+<commit/>
+id:44   %*[count(//doc)=10]
+num_d:Infinity  %//@numFound[.="1"]  %//double[.="Infinity"]
+num_d:"-Infinity"  %//@numFound[.="1"]  %//double[.="-Infinity"]
+num_d:"NaN"  %//@numFound[.="1"]  %//double[.="NaN"]
+num_d:"-1e100"  %//@numFound[.="1"]
+num_d:"1e-100"  %//@numFound[.="1"]
+id:44;num_d asc;    %//doc[1]/double[.="-Infinity"] %//doc[last()]/double[.="NaN"]
+id:44;num_d desc;   %//doc[1]/double[.="NaN"] %//doc[last()]/double[.="-Infinity"]
+num_d:[-1 TO 2]  %*[count(//doc)=5]
+num_d:[-Infinity TO Infinity]  %*[count(//doc)=9]
+
+
+#test sorting on multiple fields
+<delete><id>44</id></delete>
+<add allowDups="true"><doc><field name="id">44</field><field name="a_i">10</field></doc></add>
+<add allowDups="true"><doc><field name="id">44</field><field name="a_i">1</field><field name="b_i">100</field></doc></add>
+<add allowDups="true"><doc><field name="id">44</field><field name="a_i">-1</field></doc></add>
+<add allowDups="true"><doc><field name="id">44</field><field name="a_i">15</field></doc></add>
+<add allowDups="true"><doc><field name="id">44</field><field name="a_i">1</field><field name="b_i">50</field></doc></add>
+<add allowDups="true"><doc><field name="id">44</field><field name="a_i">0</field></doc></add>
+<commit/>
+id:44   %*[count(//doc)=6]
+
+id:44; a_i asc,b_i desc %*[count(//doc)=6] %//doc[3]/int[.="100"] %//doc[4]/int[.="50"]
+id:44;a_i asc  , b_i asc; %*[count(//doc)=6] %//doc[3]/int[.="50"] %//doc[4]/int[.="100"]
+id:44;a_i asc;  %*[count(//doc)=6] %//doc[1]/int[.="-1"] %//doc[last()]/int[.="15"]
+id:44;a_i asc , score top;  %*[count(//doc)=6] %//doc[1]/int[.="-1"] %//doc[last()]/int[.="15"]
+id:44; score top , a_i top, b_i bottom ;  %*[count(//doc)=6] %//doc[last()]/int[.="-1"] %//doc[1]/int[.="15"] %//doc[3]/int[.="50"] %//doc[4]/int[.="100"]
+
+
+#test sorting  with some docs missing the sort field
+<delete><query>id_i:[1000 TO 1010]</query></delete>
+<add allowDups="true"><doc><field name="id_i">1000</field><field name="a_i">1</field></doc></add>
+<add allowDups="true"><doc><field name="id_i">1001</field><field name="a_i">10</field></doc></add>
+<add allowDups="true"><doc><field name="id_i">1002</field><field name="a_i">1</field><field name="b_i">100</field></doc></add>
+<add allowDups="true"><doc><field name="id_i">1003</field><field name="a_i">-1</field></doc></add>
+<add allowDups="true"><doc><field name="id_i">1004</field><field name="a_i">15</field></doc></add>
+<add allowDups="true"><doc><field name="id_i">1005</field><field name="a_i">1</field><field name="b_i">50</field></doc></add>
+<add allowDups="true"><doc><field name="id_i">1006</field><field name="a_i">0</field></doc></add>
+<commit/>
+id_i:[1000 TO 1010]   %*[count(//doc)=7]
+id_i:[1000 TO 1010]; b_i asc %*[count(//doc)=7] %//doc[1]/int[.="50"] %//doc[2]/int[.="100"]
+id_i:[1000 TO 1010]; b_i desc %*[count(//doc)=7] %//doc[1]/int[.="100"] %//doc[2]/int[.="50"]
+id_i:[1000 TO 1010]; a_i asc,b_i desc %*[count(//doc)=7] %//doc[3]/int[.="100"] %//doc[4]/int[.="50"]  %//doc[5]/int[.="1000"]
+id_i:[1000 TO 1010]; a_i asc,b_i asc %*[count(//doc)=7] %//doc[3]/int[.="50"] %//doc[4]/int[.="100"]  %//doc[5]/int[.="1000"]
+
+
+#test prefix query
+<delete><query>val_s:[* TO *]</query></delete>
+<add><doc><field name="id">100</field><field name="val_s">apple</field></doc></add>
+<add><doc><field name="id">101</field><field name="val_s">banana</field></doc></add>
+<add><doc><field name="id">102</field><field name="val_s">apple</field></doc></add>
+<add><doc><field name="id">103</field><field name="val_s">pearing</field></doc></add>
+<add><doc><field name="id">104</field><field name="val_s">pear</field></doc></add>
+<add><doc><field name="id">105</field><field name="val_s">appalling</field></doc></add>
+<add><doc><field name="id">106</field><field name="val_s">pearson</field></doc></add>
+<add><doc><field name="id">107</field><field name="val_s">port</field></doc></add>
+<commit/>
+
+val_s:a* %//*[@numFound="3"]
+val_s:p* %//*[@numFound="4"]
+#val_s:* %//*[@numFound="8"]
+
+<delete><query>id:[100 TO 110]</query></delete>
+
+#test copyField functionality
+<add><doc><field name="id">42</field><field name="title">How Now4 brown Cows</field></doc></add>
+<commit/>
+id:42 AND title:Now %*[count(//doc)=0]
+id:42 AND title_lettertok:Now %*[count(//doc)=1]
+id:42 AND title:cow %*[count(//doc)=0]
+id:42 AND title_stemmed:cow %*[count(//doc)=1]
+id:42 AND text:cow %*[count(//doc)=1]
+
+#test slop
+<add><doc><field name="id">42</field><field name="text">foo bar</field></doc></add>
+<commit/>
+id:42 AND text:"foo bar"  %*[count(//doc)=1]
+id:42 AND text:"foo"  %*[count(//doc)=1]
+id:42 AND text:"bar"  %*[count(//doc)=1]
+id:42 AND text:"bar foo"  %*[count(//doc)=0]
+id:42 AND text:"bar foo"~2  %*[count(//doc)=1]
+
+
+#intra-word delimiter testing (WordDelimiterFilter)
+<add><doc><field name="id">42</field><field name="subword">foo bar</field></doc></add>
+<commit/>
+id:42 AND subword:"foo bar"  %*[count(//doc)=1]
+id:42 AND subword:"foo"  %*[count(//doc)=1]
+id:42 AND subword:"bar"  %*[count(//doc)=1]
+id:42 AND subword:"bar foo"  %*[count(//doc)=0]
+id:42 AND subword:"bar foo"~2  %*[count(//doc)=1]
+id:42 AND subword:"foo/bar" %*[count(//doc)=1]
+id:42 AND subword:"foobar" %*[count(//doc)=0]
+
+<add><doc><field name="id">42</field><field name="subword">foo-bar</field></doc></add>
+<commit/>
+id:42 AND subword:"foo bar"  %*[count(//doc)=1]
+id:42 AND subword:"foo"  %*[count(//doc)=1]
+id:42 AND subword:"bar"  %*[count(//doc)=1]
+id:42 AND subword:"bar foo"  %*[count(//doc)=0]
+id:42 AND subword:"bar foo"~2  %*[count(//doc)=1]
+id:42 AND subword:"foo/bar" %*[count(//doc)=1]
+id:42 AND subword:foobar %*[count(//doc)=1]
+
+<add><doc><field name="id">42</field><field name="subword">Canon PowerShot SD500 7MP</field></doc></add>
+<commit/>
+id:42 AND subword:"power-shot"  %*[count(//doc)=1]
+id:42 AND subword:"power shot sd 500"  %*[count(//doc)=1]
+id:42 AND subword:"powershot"  %*[count(//doc)=1]
+id:42 AND subword:"SD-500"  %*[count(//doc)=1]
+id:42 AND subword:"SD500"  %*[count(//doc)=1]
+id:42 AND subword:"SD500-7MP"  %*[count(//doc)=1]
+id:42 AND subword:"PowerShotSD500-7MP"  %*[count(//doc)=1]
+
+<add><doc><field name="id">42</field><field name="subword">Wi-Fi</field></doc></add>
+<commit/>
+id:42 AND subword:wifi  %*[count(//doc)=1]
+id:42 AND subword:wi+=fi  %*[count(//doc)=1]
+id:42 AND subword:wi+=fi  %*[count(//doc)=1]
+id:42 AND subword:WiFi  %*[count(//doc)=1]
+id:42 AND subword:"wi fi"  %*[count(//doc)=1]
+
+<add><doc><field name="id">42</field><field name="subword">'I.B.M' A's,B's,C's</field></doc></add>
+<commit/>
+id:42 AND subword:"'I.B.M.'"  %*[count(//doc)=1]
+id:42 AND subword:I.B.M  %*[count(//doc)=1]
+id:42 AND subword:IBM  %*[count(//doc)=1]
+id:42 AND subword:I--B--M  %*[count(//doc)=1]
+id:42 AND subword:"I B M"  %*[count(//doc)=1]
+id:42 AND subword:IBM's  %*[count(//doc)=1]
+id:42 AND subword:IBM'sx  %*[count(//doc)=0]
+
+#this one fails since IBM and ABC are separated by two tokens
+#id:42 AND subword:IBM's-ABC's  %*[count(//doc)=1]
+id:42 AND subword:"IBM's-ABC's"~2  %*[count(//doc)=1]
+
+id:42 AND subword:"A's B's-C's"  %*[count(//doc)=1]
+
+<add><doc><field name="id">42</field><field name="subword">Sony KDF-E50A10</field></doc></add>
+<commit/>
+
+#check for exact match:
+# Sony KDF E/KDFE 50 A 10  (this is how it's indexed)
+# Sony KDF E      50 A 10  (and how it's queried)
+id:42 AND subword:"Sony KDF-E50A10"  %*[count(//doc)=1]
+id:42 AND subword:10  %*[count(//doc)=1]
+id:42 AND subword:Sony  %*[count(//doc)=1]
+
+#this one fails without slop since Sony and KDFE have a token inbetween
+#id:42 AND subword:SonyKDFE50A10  %*[count(//doc)=1]
+id:42 AND subword:"SonyKDFE50A10"~10  %*[count(//doc)=1]
+
+id:42 AND subword:"Sony KDF E-50-A-10"  %*[count(//doc)=1]
+
+<add><doc><field name="id">42</field><field name="subword">http://www.yahoo.com</field></doc></add>
+<commit/>
+id:42 AND subword:yahoo  %*[count(//doc)=1]
+id:42 AND subword:www.yahoo.com    %*[count(//doc)=1]
+id:42 AND subword:http://www.yahoo.com   %*[count(//doc)=1]
+
+<add><doc><field name="id">42</field><field name="subword">--Q 1-- W2 E-3 Ok xY 4R 5-T *6-Y- 7-8-- 10A-B</field></doc></add>
+<commit/>
+id:42 AND subword:Q  %*[count(//doc)=1]
+id:42 AND subword:1  %*[count(//doc)=1]
+id:42 AND subword:"w 2"  %*[count(//doc)=1]
+id:42 AND subword:"e 3"  %*[count(//doc)=1]
+id:42 AND subword:"o k"  %*[count(//doc)=0]
+id:42 AND subword:"ok"  %*[count(//doc)=1]
+id:42 AND subword:"x y"  %*[count(//doc)=1]
+id:42 AND subword:"xy"  %*[count(//doc)=1]
+id:42 AND subword:"4 r"  %*[count(//doc)=1]
+id:42 AND subword:"5 t"  %*[count(//doc)=1]
+id:42 AND subword:"5 t"  %*[count(//doc)=1]
+id:42 AND subword:"6 y"  %*[count(//doc)=1]
+id:42 AND subword:"7 8"  %*[count(//doc)=1]
+id:42 AND subword:"78"  %*[count(//doc)=1]
+id:42 AND subword:"10 A+B"  %*[count(//doc)=1]
+
+<add><doc><field name="id">42</field><field name="subword">FooBarBaz</field></doc></add>
+<add><doc><field name="id">42</field><field name="subword">FooBar10</field></doc></add>
+<add><doc><field name="id">42</field><field name="subword">10FooBar</field></doc></add>
+<add><doc><field name="id">42</field><field name="subword">BAZ</field></doc></add>
+<add><doc><field name="id">42</field><field name="subword">10</field></doc></add>
+<add><doc><field name="id">42</field><field name="subword">Mark, I found what's the problem! It turns to be from the latest schema. I found tons of exceptions in the resin.stdout that prevented the builder from performing. It's all coming from the WordDelimiterFilter which was just added to the latest schema: [2005-08-29 15:11:38.375] java.lang.IndexOutOfBoundsException: Index: 3, Size: 3 673804 [2005-08-29 15:11:38.375]  at java.util.ArrayList.RangeCheck(ArrayList.java:547) 673805 [2005-08-29 15:11:38.375]  at java.util.ArrayList.get(ArrayList.java:322) 673806 [2005-08-29 15:11:38.375]  at solar.analysis.WordDelimiterFilter.addCombos(WordDelimiterFilter.java:349) 673807 [2005-08-29 15:11:38.375]  at solar.analysis.WordDelimiterFilter.next(WordDelimiterFilter.java:325) 673808 [2005-08-29 15:11:38.375]  at org.apache.lucene.analysis.LowerCaseFilter.next(LowerCaseFilter.java:32) 673809 [2005-08-29 15:11:38.375]  at org.apache.lucene.analysis.StopFilter.next(StopFilter.java:98)
  673810 [2005-08-29 15:11:38.375]  at solar.EnglishPorterFilter.next(TokenizerFactory.java:163) 673811 [2005-08-29 15:11:38.375]  at org.apache.lucene.index.DocumentWriter.invertDocument(DocumentWriter.java:143) 673812 [2005-08-29 15:11:38.375]  at org.apache.lucene.index.DocumentWriter.addDocument(DocumentWriter.java:81) 673813 [2005-08-29 15:11:38.375]  at org.apache.lucene.index.IndexWriter.addDocument(IndexWriter.java:307) 673814 [2005-08-29 15:11:38.375]  at org.apache.lucene.index.IndexWriter.addDocument(IndexWriter.java:294) 673815 [2005-08-29 15:11:38.375]  at solar.DirectUpdateHandler2.doAdd(DirectUpdateHandler2.java:170) 673816 [2005-08-29 15:11:38.375]  at solar.DirectUpdateHandler2.overwriteBoth(DirectUpdateHandler2.java:317) 673817 [2005-08-29 15:11:38.375]  at solar.DirectUpdateHandler2.addDoc(DirectUpdateHandler2.java:191) 673818 [2005-08-29 15:11:38.375]  at solar.SolarCore.update(SolarCore.java:795) 673819 [2005-08-29 15:11:38.375]  at solarserver.SolarServl
 et.doPost(SolarServlet.java:71) 673820 [2005-08-29 15:11:38.375]  at javax.servlet.http.HttpServlet.service(HttpServlet.java:154) 673821 [2005-08-29 15:11:38.375]  at javax.servlet.http.HttpServlet.service(HttpServlet.java:92) 673822 [2005-08-29 15:11:38.375]  at com.caucho.server.dispatch.ServletFilterChain.doFilter(ServletFilterChain.java:99) 673823 [2005-08-29 15:11:38.375]  at com.caucho.server.cache.CacheFilterChain.doFilter(CacheFilterChain.java:188) 673824 [2005-08-29 15:11:38.375]  at com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain.java:163) 673825 [2005-08-29 15:11:38.375]  at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:208) 673826 [2005-08-29 15:11:38.375]  at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:259) 673827 [2005-08-29 15:11:38.375]  at com.caucho.server.port.TcpConnection.run(TcpConnection.java:363) 673828 [2005-08-29 15:11:38.375]  at com.caucho.util.ThreadPool.runTasks(ThreadPool
 .java:490) 673829 [2005-08-29 15:11:38.375]  at com.caucho.util.ThreadPool.run(ThreadPool.java:423) 673830 [2005-08-29 15:11:38.375]  at java.lang.Thread.run(Thread.java:595) With the previous schema I'm able to perform a successful full build: http://c12-ssa-dev40-so-mas1.cnet.com:5078/select/?stylesheet=q=docTypeversion=2.0start=0rows=10indent=on Do you want to rollback to the previous schema version</field></doc></add>
+
+
+#
+<delete fromPending="true" fromCommitted="true"><id>44</id></delete>
+<add><doc><field name="id">44</field><field name="fname_s">Yonik</field><field name="here_b">true</field><field name="iq_l">10000000000</field><field name="description_t">software engineer</field><field name="ego_d">1e100</field><field name="pi_f">3.1415962</field><field name="when_dt">2005-03-18T01:14:34Z</field><field name="arr_f">1.414213562</field><field name="arr_f">.999</field></doc></add>
+<commit/>
+id:44
+id:44 %%fl=fname_s,arr_f  %//str[.="Yonik"]  %//float[.="1.4142135"]
+id:44 %%fl=  %//str[.="Yonik"]  %//float[.="1.4142135"]
+
+#test addition of score field
+id:44 %%fl=score %//str[.="Yonik"]  %//float[.="1.4142135"] %//float[@name="score"] %*[count(//doc/*)=10]
+id:44 %%fl=*,score %//str[.="Yonik"]  %//float[.="1.4142135"] %//float[@name="score"] %*[count(//doc/*)=10]
+id:44 %%fl=* %//str[.="Yonik"]  %//float[.="1.4142135"] %*[count(//doc/*)>=9]
+
+#test maxScore
+id:44 %%fl=score %//result[@maxScore>0]
+id:44;id desc; %%fl=score %//result[@maxScore>0]
+id:44; %%fl=score %//@maxScore = //doc/float[@name="score"]
+id:44;id desc; %%fl=score %//@maxScore = //doc/float[@name="score"]
+id:44;id desc; %%fl=score&limit=0 %//result[@maxScore>0]
+
+
+# test schema field attribute inheritance and overriding
+<delete><id>44</id></delete>
+<add><doc><field name="id">44</field><field name="shouldbestored">hi</field></doc></add>
+<commit/>
+id:44 %//*[@name="shouldbestored"]
++id:44 +shouldbestored:hi %//*[@numFound="1"]
+
+<delete><id>44</id></delete>
+<add><doc><field name="id">44</field><field name="shouldbeunstored">hi</field></doc></add>
+<commit/>
+id:44 %not(//*[@name="shouldbeunstored"])
++id:44 +shouldbeunstored:hi %//*[@numFound="1"]
+
+<delete><id>44</id></delete>
+<add><doc><field name="id">44</field><field name="shouldbeunindexed">hi</field></doc></add>
+<commit/>
+id:44 %//*[@name="shouldbeunindexed"]
+# this should result in an error... how to check for that?
+#+id:44 +shouldbeunindexed:hi %//*[@numFound="0"]
+
+#test spaces between XML elements because that can introduce extra XML events that
+#can mess up parsing (and it has in the past)
+  <delete>  <id>44</id>  </delete>
+  <add>  <doc>  <field name="id">44</field>  <field name="shouldbestored">hi</field>  </doc>  </add>
+  <commit />
+
+#test adding multiple docs per add command
+<delete><query>id:[0 TO 99]</query></delete>
+<add><doc><field name="id">1</field></doc><doc><field name="id">2</field></doc></add>
+<commit/>
+id:[0 TO 99] %//*[@numFound="2"]
+
+#test synonym filter
+<delete><query>id:[10 TO 100]</query></delete>
+<add><doc><field name="id">10</field><field name="syn">a</field></doc></add>
+<add><doc><field name="id">11</field><field name="syn">b</field></doc></add>
+<add><doc><field name="id">12</field><field name="syn">c</field></doc></add>
+<add><doc><field name="id">13</field><field name="syn">foo</field></doc></add>
+<commit/>
+id:10 AND syn:a %//*[@numFound="1"]
+id:10 AND syn:aa %//*[@numFound="1"]
+id:11 AND syn:b %//*[@numFound="1"]
+id:11 AND syn:b1 %//*[@numFound="1"]
+id:11 AND syn:b2 %//*[@numFound="1"]
+id:12 AND syn:c %//*[@numFound="1"]
+id:12 AND syn:c1 %//*[@numFound="1"]
+id:12 AND syn:c2 %//*[@numFound="1"]
+id:13 AND syn:foo %//*[@numFound="1"]
+id:13 AND syn:bar %//*[@numFound="1"]
+id:13 AND syn:baz %//*[@numFound="1"]
+
+#trigger output of custom value test
+values %%qt=test
+

Propchange: incubator/solr/trunk/src/apps/SolarTest/newtest.txt
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/solr/trunk/src/apps/SolarTest/protwords.txt
URL: http://svn.apache.org/viewcvs/incubator/solr/trunk/src/apps/SolarTest/protwords.txt?rev=372455&view=auto
==============================================================================
--- incubator/solr/trunk/src/apps/SolarTest/protwords.txt (added)
+++ incubator/solr/trunk/src/apps/SolarTest/protwords.txt Wed Jan 25 21:37:29 2006
@@ -0,0 +1,5 @@
+#use a protected word file to avoid stemming two
+#unrelated words to the same base word.
+#to test, we will use words that would normally obviously be stemmed.
+cats
+ridding
\ No newline at end of file

Propchange: incubator/solr/trunk/src/apps/SolarTest/protwords.txt
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/solr/trunk/src/apps/SolarTest/run
URL: http://svn.apache.org/viewcvs/incubator/solr/trunk/src/apps/SolarTest/run?rev=372455&view=auto
==============================================================================
--- incubator/solr/trunk/src/apps/SolarTest/run (added)
+++ incubator/solr/trunk/src/apps/SolarTest/run Wed Jan 25 21:37:29 2006
@@ -0,0 +1 @@
+java -cp "../solar/classes;classes;../../lucene/lucene-1.4.3.jar" SolarPerf -schema test_schema.xml -index F:/root/index -verbose -test newtest.txt

Propchange: incubator/solr/trunk/src/apps/SolarTest/run
------------------------------------------------------------------------------
    svn:executable = *

Added: incubator/solr/trunk/src/apps/SolarTest/schema.xml
URL: http://svn.apache.org/viewcvs/incubator/solr/trunk/src/apps/SolarTest/schema.xml?rev=372455&view=auto
==============================================================================
--- incubator/solr/trunk/src/apps/SolarTest/schema.xml (added)
+++ incubator/solr/trunk/src/apps/SolarTest/schema.xml Wed Jan 25 21:37:29 2006
@@ -0,0 +1,334 @@
+<?xml version="1.0" ?>
+<!-- The Solar schema file. This file should be named "schema.xml" and
+     should be located where the classloader for the Solar webapp can find it.
+
+     $Id: schema.xml,v 1.1 2005/06/09 03:01:13 yonik Exp $
+     $Source: /cvs/main/searching/solar-configs/test/WEB-INF/classes/schema.xml,v $
+     $Name:  $
+  -->
+
+<schema name="test" version="1.0">
+  <types>
+
+    <!-- field type definitions... note that the "name" attribute is
+         just a label to be used by field definitions.  The "class"
+         attribute and any other attributes determine the real type and
+         behavior of the fieldtype.
+      -->
+
+    <!-- numeric field types that store and index the text
+         value verbatim (and hence don't sort correctly or support range queries.)
+         These are provided more for backward compatability, allowing one
+         to create a schema that matches an existing lucene index.
+    -->
+    <fieldtype name="integer" class="solar.IntField"/>
+    <fieldtype name="long" class="solar.LongField"/>
+    <fieldtype name="float" class="solar.FloatField"/>
+    <fieldtype name="double" class="solar.DoubleField"/>
+
+    <!-- numeric field types that manipulate the value into
+       a string value that isn't human readable in it's internal form,
+       but sorts correctly and supports range queries.
+
+         If sortMissingLast="true" then a sort on this field will cause documents
+       without the field to come after documents with the field,
+       regardless of the requested sort order.
+         If sortMissingFirst="true" then a sort on this field will cause documents
+       without the field to come before documents with the field,
+       regardless of the requested sort order.
+         If sortMissingLast="false" and sortMissingFirst="false" (the default),
+       then default lucene sorting will be used which places docs without the field
+       first in an ascending sort and last in a descending sort.
+    -->
+    <fieldtype name="sint" class="solar.SortableIntField" sortMissingLast="true"/>
+    <fieldtype name="slong" class="solar.SortableLongField" sortMissingLast="true"/>
+    <fieldtype name="sfloat" class="solar.SortableFloatField" sortMissingLast="true"/>
+    <fieldtype name="sdouble" class="solar.SortableDoubleField" sortMissingLast="true"/>
+
+    <!-- bcd versions of sortable numeric type may provide smaller
+         storage space and support very large numbers.
+    -->
+    <fieldtype name="bcdint" class="solar.BCDIntField" sortMissingLast="true"/>
+    <fieldtype name="bcdlong" class="solar.BCDLongField" sortMissingLast="true"/>
+    <fieldtype name="bcdstr" class="solar.BCDStrField" sortMissingLast="true"/>
+
+
+    <fieldtype name="boolean" class="solar.BoolField" sortMissingLast="true"/>
+    <fieldtype name="string" class="solar.StrField" sortMissingLast="true"/>
+
+    <!-- format for date is 1995-12-31T23:59:59.999Z and only the fractional
+         seconds part (.999) is optional.
+      -->
+    <fieldtype name="date" class="solar.DateField" sortMissingLast="true"/>
+
+    <!-- solar.TextField allows the specification of custom
+         text analyzers specified as a tokenizer and a list
+         of token filters.
+      -->
+    <fieldtype name="text" class="solar.TextField">
+      <analyzer>
+        <tokenizer class="solar.StandardTokenizerFactory"/>
+        <filter class="solar.StandardFilterFactory"/>
+        <filter class="solar.LowerCaseFilterFactory"/>
+        <filter class="solar.StopFilterFactory"/>
+        <!-- lucene PorterStemFilterFactory deprecated
+          <filter class="solar.PorterStemFilterFactory"/>
+        -->
+        <filter class="solar.EnglishPorterFilterFactory"/>
+      </analyzer>
+    </fieldtype>
+
+
+    <fieldtype name="nametext" class="solar.TextField">
+      <analyzer class="org.apache.lucene.analysis.WhitespaceAnalyzer"/>
+    </fieldtype>
+
+    <fieldtype name="teststop" class="solar.TextField">
+       <analyzer>
+        <tokenizer class="solar.LowerCaseTokenizerFactory"/>
+        <filter class="solar.StandardFilterFactory"/>
+        <filter class="solar.StopFilterFactory" words="stopwords.txt"/>
+      </analyzer>
+    </fieldtype>
+
+    <!-- fieldtypes in this section isolate tokenizers and tokenfilters for testing -->
+    <fieldtype name="lowertok" class="solar.TextField">
+      <analyzer><tokenizer class="solar.LowerCaseTokenizerFactory"/></analyzer>
+    </fieldtype>
+    <fieldtype name="standardtok" class="solar.TextField">
+      <analyzer><tokenizer class="solar.StandardTokenizerFactory"/></analyzer>
+    </fieldtype>
+    <fieldtype name="lettertok" class="solar.TextField">
+      <analyzer><tokenizer class="solar.LetterTokenizerFactory"/></analyzer>
+    </fieldtype>
+    <fieldtype name="whitetok" class="solar.TextField">
+      <analyzer><tokenizer class="solar.WhitespaceTokenizerFactory"/></analyzer>
+    </fieldtype>
+    <fieldtype name="HTMLstandardtok" class="solar.TextField">
+      <analyzer><tokenizer class="solar.HTMLStripStandardTokenizerFactory"/></analyzer>
+    </fieldtype>
+    <fieldtype name="HTMLwhitetok" class="solar.TextField">
+      <analyzer><tokenizer class="solar.HTMLStripWhitespaceTokenizerFactory"/></analyzer>
+    </fieldtype>
+    <fieldtype name="standardtokfilt" class="solar.TextField">
+      <analyzer>
+        <tokenizer class="solar.StandardTokenizerFactory"/>
+        <filter class="solar.StandardFilterFactory"/>
+      </analyzer>
+    </fieldtype>
+    <fieldtype name="standardfilt" class="solar.TextField">
+      <analyzer>
+        <tokenizer class="solar.WhitespaceTokenizerFactory"/>
+        <filter class="solar.StandardFilterFactory"/>
+      </analyzer>
+    </fieldtype>
+    <fieldtype name="lowerfilt" class="solar.TextField">
+      <analyzer>
+        <tokenizer class="solar.WhitespaceTokenizerFactory"/>
+        <filter class="solar.LowerCaseFilterFactory"/>
+      </analyzer>
+    </fieldtype>
+    <fieldtype name="porterfilt" class="solar.TextField">
+      <analyzer>
+        <tokenizer class="solar.WhitespaceTokenizerFactory"/>
+        <filter class="solar.PorterStemFilterFactory"/>
+      </analyzer>
+    </fieldtype>
+    <!-- fieldtype name="snowballfilt" class="solar.TextField">
+      <analyzer>
+        <tokenizer class="solar.WhitespaceTokenizerFactory"/>
+        <filter class="solar.SnowballPorterFilterFactory"/>
+      </analyzer>
+    </fieldtype -->
+    <fieldtype name="engporterfilt" class="solar.TextField">
+      <analyzer>
+        <tokenizer class="solar.WhitespaceTokenizerFactory"/>
+        <filter class="solar.EnglishPorterFilterFactory"/>
+      </analyzer>
+    </fieldtype>
+    <fieldtype name="custengporterfilt" class="solar.TextField">
+      <analyzer>
+        <tokenizer class="solar.WhitespaceTokenizerFactory"/>
+        <filter class="solar.EnglishPorterFilterFactory" protected="protwords.txt"/>
+      </analyzer>
+    </fieldtype>
+    <fieldtype name="stopfilt" class="solar.TextField">
+      <analyzer>
+        <tokenizer class="solar.WhitespaceTokenizerFactory"/>
+        <filter class="solar.StopFilterFactory" ignoreCase="true"/>
+      </analyzer>
+    </fieldtype>
+    <fieldtype name="custstopfilt" class="solar.TextField">
+      <analyzer>
+        <tokenizer class="solar.WhitespaceTokenizerFactory"/>
+        <filter class="solar.StopFilterFactory" words="stopwords.txt"/>
+      </analyzer>
+    </fieldtype>
+    <fieldtype name="lengthfilt" class="solar.TextField">
+      <analyzer>
+        <tokenizer class="solar.WhitespaceTokenizerFactory"/>
+        <filter class="solar.LengthFilterFactory" min="2" max="5"/>
+      </analyzer>
+    </fieldtype>
+
+    <fieldtype name="subword" class="solar.TextField">
+      <analyzer type="index">
+          <tokenizer class="solar.WhitespaceTokenizerFactory"/>
+          <filter class="solar.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0"/>
+          <filter class="solar.LowerCaseFilterFactory"/>
+          <filter class="solar.StopFilterFactory"/>
+          <filter class="solar.EnglishPorterFilterFactory"/>
+      </analyzer>
+      <analyzer type="query">
+          <tokenizer class="solar.WhitespaceTokenizerFactory"/>
+          <filter class="solar.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0"/>
+          <filter class="solar.LowerCaseFilterFactory"/>
+          <filter class="solar.StopFilterFactory"/>
+          <filter class="solar.EnglishPorterFilterFactory"/>
+      </analyzer>
+    </fieldtype>
+
+    <!-- more flexible in matching skus, but more chance of a false match -->
+    <fieldtype name="skutype1" class="solar.TextField">
+      <analyzer type="index">
+          <tokenizer class="solar.WhitespaceTokenizerFactory"/>
+          <filter class="solar.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0"/>
+          <filter class="solar.LowerCaseFilterFactory"/>
+      </analyzer>
+      <analyzer type="query">
+          <tokenizer class="solar.WhitespaceTokenizerFactory"/>
+          <filter class="solar.WordDelimiterFilterFactory" generateWordParts="0" generateNumberParts="0" catenateWords="1" catenateNumbers="1" catenateAll="0"/>
+          <filter class="solar.LowerCaseFilterFactory"/>
+      </analyzer>
+    </fieldtype>
+
+    <!-- less flexible in matching skus, but less chance of a false match -->
+    <fieldtype name="skutype2" class="solar.TextField">
+      <analyzer type="index">
+          <tokenizer class="solar.WhitespaceTokenizerFactory"/>
+          <filter class="solar.WordDelimiterFilterFactory" generateWordParts="0" generateNumberParts="0" catenateWords="1" catenateNumbers="1" catenateAll="0"/>
+          <filter class="solar.LowerCaseFilterFactory"/>
+      </analyzer>
+      <analyzer type="query">
+          <tokenizer class="solar.WhitespaceTokenizerFactory"/>
+          <filter class="solar.WordDelimiterFilterFactory" generateWordParts="0" generateNumberParts="0" catenateWords="1" catenateNumbers="1" catenateAll="0"/>
+          <filter class="solar.LowerCaseFilterFactory"/>
+      </analyzer>
+    </fieldtype>
+
+    <!-- less flexible in matching skus, but less chance of a false match -->
+    <fieldtype name="syn" class="solar.TextField">
+      <analyzer>
+          <tokenizer class="solar.WhitespaceTokenizerFactory"/>
+          <filter name="syn" class="solar.SynonymFilterFactory" synonyms="synonyms.txt"/>
+      </analyzer>
+    </fieldtype>
+
+    <fieldtype  name="unstored" class="solar.StrField" indexed="true" stored="false"/>
+  </types>
+
+
+ <fields>
+   <field name="id" type="integer" indexed="true" stored="true"/>
+   <field name="name" type="nametext" indexed="true" stored="true"/>
+   <field name="text" type="text" indexed="true" stored="false"/>
+   <field name="subject" type="text" indexed="true" stored="true"/>
+   <field name="title" type="nametext" indexed="true" stored="true"/>
+   <field name="weight" type="float" indexed="true" stored="true"/>
+   <field name="bday" type="date" indexed="true" stored="true"/>
+
+   <field name="title_stemmed" type="text" indexed="true" stored="false"/>
+   <field name="title_lettertok" type="lettertok" indexed="true" stored="false"/>
+
+   <field name="syn" type="syn" indexed="true" stored="true"/>
+
+   <!-- to test property inheritance and overriding -->
+   <field name="shouldbeunstored" type="unstored" />
+   <field name="shouldbestored" type="unstored" stored="true"/>
+   <field name="shouldbeunindexed" type="unstored" indexed="false" stored="true"/>
+
+
+   <!-- test different combinations of indexed and stored -->
+   <field name="bind" type="boolean" indexed="true" stored="false"/>
+   <field name="bsto" type="boolean" indexed="false" stored="true"/>
+   <field name="bindsto" type="boolean" indexed="true" stored="true"/>
+   <field name="isto" type="integer" indexed="false" stored="true"/>
+   <field name="iind" type="integer" indexed="true" stored="false"/>
+   <field name="ssto" type="string" indexed="false" stored="true"/>
+   <field name="sind" type="string" indexed="true" stored="false"/>
+   <field name="sindsto" type="string" indexed="true" stored="true"/>
+
+   <!-- fields to test individual tokenizers and tokenfilters -->
+   <field name="teststop" type="teststop" indexed="true" stored="true"/>
+   <field name="lowertok" type="lowertok" indexed="true" stored="true"/>
+   <field name="standardtok" type="standardtok" indexed="true" stored="true"/>
+   <field name="HTMLstandardtok" type="HTMLstandardtok" indexed="true" stored="true"/>
+   <field name="lettertok" type="lettertok" indexed="true" stored="true"/>
+   <field name="whitetok" type="whitetok" indexed="true" stored="true"/>
+   <field name="HTMLwhitetok" type="HTMLwhitetok" indexed="true" stored="true"/>
+   <field name="standardtokfilt" type="standardtokfilt" indexed="true" stored="true"/>
+   <field name="standardfilt" type="standardfilt" indexed="true" stored="true"/>
+   <field name="lowerfilt" type="lowerfilt" indexed="true" stored="true"/>
+   <field name="porterfilt" type="porterfilt" indexed="true" stored="true"/>
+   <field name="engporterfilt" type="engporterfilt" indexed="true" stored="true"/>
+   <field name="custengporterfilt" type="custengporterfilt" indexed="true" stored="true"/>
+   <field name="stopfilt" type="stopfilt" indexed="true" stored="true"/>
+   <field name="custstopfilt" type="custstopfilt" indexed="true" stored="true"/>
+   <field name="lengthfilt" type="lengthfilt" indexed="true" stored="true"/>
+
+
+   <field name="subword" type="subword" indexed="true" stored="true"/>
+   <field name="sku1" type="skutype1" indexed="true" stored="true"/>
+   <field name="sku2" type="skutype2" indexed="true" stored="true"/>
+
+   <!-- Dynamic field definitions.  If a field name is not found, dynamicFields
+        will be used if the name matches any of the patterns.
+        RESTRICTION: the glob-like pattern in the name attribute must have
+        a "*" only at the start or the end.
+        EXAMPLE:  name="*_i" will match any field ending in _i (like myid_i, z_i)
+        Longer patterns will be matched first.  if equal size patterns
+        both match, the first appearing in the schema will be used.
+   -->
+   <dynamicField name="*_i"  type="sint"    indexed="true"  stored="true"/>
+   <dynamicField name="*_s"  type="string"  indexed="true"  stored="true"/>
+   <dynamicField name="*_l"  type="slong"   indexed="true"  stored="true"/>
+   <dynamicField name="*_t"  type="text"    indexed="true"  stored="true"/>
+   <dynamicField name="*_b"  type="boolean" indexed="true"  stored="true"/>
+   <dynamicField name="*_f"  type="sfloat"  indexed="true"  stored="true"/>
+   <dynamicField name="*_d"  type="sdouble" indexed="true"  stored="true"/>
+   <dynamicField name="*_dt" type="date"    indexed="true"  stored="true"/>
+   <dynamicField name="*_bcd" type="bcdstr" indexed="true"  stored="true"/>
+
+   <dynamicField name="*_sI" type="string"  indexed="true"  stored="false"/>
+   <dynamicField name="*_sS" type="string"  indexed="false" stored="true"/>
+   <dynamicField name="t_*"  type="text"    indexed="true"  stored="true"/>
+   
+
+   <!-- for testing to ensure that longer patterns are matched first -->
+   <dynamicField name="*aa"  type="string"  indexed="true" stored="true"/>
+   <dynamicField name="*aaa" type="integer" indexed="false" stored="true"/>
+
+
+ </fields>
+
+ <defaultSearchField>text</defaultSearchField>
+ <uniqueKey>id</uniqueKey>
+
+  <!-- copyField commands copy one field to another at the time a document
+        is added to the index.  It's used either to index the same field different
+        ways, or to add multiple fields to the same field for easier/faster searching.
+   -->
+   <copyField source="title" dest="title_stemmed"/>
+   <copyField source="title" dest="title_lettertok"/>
+
+   <copyField source="title" dest="text"/>
+   <copyField source="subject" dest="text"/>
+ 
+
+ <!-- Similarity is the scoring routine for each document vs a query.
+      A custom similarity may be specified here, but the default is fine
+      for most applications.
+ -->
+ <!-- <similarity class="org.apache.lucene.search.DefaultSimilarity"/> -->
+
+</schema>

Propchange: incubator/solr/trunk/src/apps/SolarTest/schema.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/solr/trunk/src/apps/SolarTest/solrconfig.xml
URL: http://svn.apache.org/viewcvs/incubator/solr/trunk/src/apps/SolarTest/solrconfig.xml?rev=372455&view=auto
==============================================================================
--- incubator/solr/trunk/src/apps/SolarTest/solrconfig.xml (added)
+++ incubator/solr/trunk/src/apps/SolarTest/solrconfig.xml Wed Jan 25 21:37:29 2006
@@ -0,0 +1,191 @@
+<?xml version="1.0" ?>
+
+<!-- $Id$
+     $Source$
+     $Name$
+  -->
+
+<config>
+
+  <!-- Used to specify an alternate directory to hold all index data.
+       It defaults to "index" if not present, and should probably
+       not be changed if replication is in use. -->
+  <!--
+  <indexDir>index</indexDir>
+  -->
+
+  <indexDefaults>
+   <!-- Values here affect all index writers and act as a default
+   unless overridden. -->
+    <useCompoundFile>false</useCompoundFile>
+    <mergeFactor>10</mergeFactor>
+    <maxBufferedDocs>1000</maxBufferedDocs>
+    <maxMergeDocs>2147483647</maxMergeDocs>
+    <maxFieldLength>10000</maxFieldLength>
+
+    <!-- these are global... can't currently override per index -->
+    <writeLockTimeout>1000</writeLockTimeout>
+    <commitLockTimeout>10000</commitLockTimeout>
+
+  </indexDefaults>
+
+  <mainIndex>
+    <!-- lucene options specific to the main on-disk lucene index -->
+    <useCompoundFile>false</useCompoundFile>
+    <mergeFactor>10</mergeFactor>
+    <maxBufferedDocs>1000</maxBufferedDocs>
+    <maxMergeDocs>2147483647</maxMergeDocs>
+    <maxFieldLength>10000</maxFieldLength>
+
+    <unlockOnStartup>true</unlockOnStartup>
+  </mainIndex>
+
+  <updateHandler class="solar.DirectUpdateHandler2">
+
+    <!-- autocommit pending docs if certain criteria are met -->
+    <autocommit>  <!-- NOTE: autocommit not implemented yet -->
+      <maxDocs>10000</maxDocs>
+      <maxSec>3600</maxSec>
+    </autocommit>
+
+    <!-- represents a lower bound on the frequency that commits may
+    occur (in seconds). NOTE: not yet implemented
+    -->
+    <commitIntervalLowerBound>0</commitIntervalLowerBound>
+
+    <!-- The RunExecutableListener executes an external command.
+         exe - the name of the executable to run
+         dir - dir to use as the current working directory. default="."
+         wait - the calling thread waits until the executable returns. default="true"
+         args - the arguments to pass to the program.  default=nothing
+         env - environment variables to set.  default=nothing
+      -->
+    <!-- A postCommit event is fired after every commit
+    <listener event="postCommit" class="solar.RunExecutableListener">
+      <str name="exe">/var/opt/resin3/__PORT__/scripts/solar/snapshooter</str>
+      <str name="dir">/var/opt/resin3/__PORT__</str>
+      <bool name="wait">true</bool>
+      <arr name="args"> <str>arg1</str> <str>arg2</str> </arr>
+      <arr name="env"> <str>MYVAR=val1</str> </arr>
+    </listener>
+    -->
+
+
+  </updateHandler>
+
+
+  <query>
+    <!-- Maximum number of clauses in a boolean query... can affect
+        range or wildcard queries that expand to big boolean
+        queries.  An exception is thrown if exceeded.
+    -->
+    <maxBooleanClauses>1024</maxBooleanClauses>
+
+    
+    <!-- Cache specification for Filters or DocSets - unordered set of *all* documents
+         that match a particular query.
+      -->
+    <filterCache
+      class="solar.search.LRUCache"
+      size="512"
+      initialSize="512"
+      autowarmCount="256"/>
+
+    <queryResultCache
+      class="solar.search.LRUCache"
+      size="512"
+      initialSize="512"
+      autowarmCount="1024"/>
+
+    <documentCache
+      class="solar.search.LRUCache"
+      size="512"
+      initialSize="512"
+      autowarmCount="0"/>
+
+    <!--
+    <cache name="myUserCache"
+      class="solar.search.LRUCache"
+      size="4096"
+      initialSize="1024"
+      autowarmCount="1024"
+      regenerator="MyRegenerator"
+      />
+    -->
+
+
+    <useFilterForSortedQuery>true</useFilterForSortedQuery>
+
+    <queryResultWindowSize>10</queryResultWindowSize>
+
+    <HashDocSet maxSize="3000" loadFactor="0.75"/>
+
+
+    <!-- boolToFilterOptimizer converts boolean clauses with zero boost
+         into cached filters if the number of docs selected by the clause exceeds
+         the threshold (represented as a fraction of the total index)
+    -->
+    <boolTofilterOptimizer enabled="true" cacheSize="32" threshold=".05"/>
+
+
+    <!-- a newSearcher event is fired whenever a new searcher is being prepared
+         and there is a current searcher handling requests (aka registered). -->
+    <!-- QuerySenderListener takes an array of NamedList and executes a
+         local query request for each NamedList in sequence. -->
+    <!--
+    <listener event="newSearcher" class="solar.QuerySenderListener">
+      <arr name="queries">
+        <lst> <str name="q">solar</str> <str name="start">0</str> <str name="rows">10</str> </lst>
+        <lst> <str name="q">rocks</str> <str name="start">0</str> <str name="rows">10</str> </lst>
+      </arr>
+    </listener>
+    -->
+
+    <!-- a firstSearcher event is fired whenever a new searcher is being
+         prepared but there is no current registered searcher to handle
+         requests or to gain prewarming data from. -->
+    <!--
+    <listener event="firstSearcher" class="solar.QuerySenderListener">
+      <arr name="queries">
+        <lst> <str name="q">fast_warm</str> <str name="start">0</str> <str name="rows">10</str> </lst>
+      </arr>
+    </listener>
+    -->
+
+
+  </query>
+
+
+  <!-- An alternate set representation that uses an integer hash to store filters (sets of docids).
+       If the set cardinality <= maxSize elements, then HashDocSet will be used instead of the bitset
+       based HashBitset. -->
+
+  <!-- requestHandler plugins... incoming queries will be dispatched to the
+     correct handler based on the qt (query type) param matching the
+     name of registered handlers.
+      The "standard" request handler is the default and will be used if qt
+     is not specified in the request.
+  -->
+  <requestHandler name="standard" class="solar.StandardRequestHandler" />
+  <requestHandler name="old" class="solar.tst.OldRequestHandler" >
+    <int name="myparam">1000</int>
+    <float name="ratio">1.4142135</float>
+    <arr name="myarr"><int>1</int><int>2</int></arr>
+    <str>foo</str>
+  </requestHandler>
+  <requestHandler name="oldagain" class="solar.tst.OldRequestHandler" >
+    <lst name="lst1"> <str name="op">sqrt</str> <int name="val">2</int> </lst>
+    <lst name="lst2"> <str name="op">log</str> <float name="val">10</float> </lst>
+  </requestHandler>
+
+  <requestHandler name="test" class="solar.tst.TestRequestHandler" />
+
+
+  <admin>
+    <defaultQuery>solar</defaultQuery>
+    <gettableFiles>solarconfig.xml conf/solar/WEB-INF/web.external.xml conf/resin.conf </gettableFiles>
+  </admin>
+
+
+
+</config>

Propchange: incubator/solr/trunk/src/apps/SolarTest/solrconfig.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/solr/trunk/src/apps/SolarTest/src/SolrTest.java
URL: http://svn.apache.org/viewcvs/incubator/solr/trunk/src/apps/SolarTest/src/SolrTest.java?rev=372455&view=auto
==============================================================================
--- incubator/solr/trunk/src/apps/SolarTest/src/SolrTest.java (added)
+++ incubator/solr/trunk/src/apps/SolarTest/src/SolrTest.java Wed Jan 25 21:37:29 2006
@@ -0,0 +1,367 @@
+/**
+ * Copyright 2006 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.solr.core.SolrCore;
+import org.apache.solr.schema.IndexSchema;
+import org.apache.solr.request.*;
+
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathFactory;
+import javax.xml.xpath.XPathConstants;
+import java.io.*;
+import java.util.*;
+import java.util.logging.Logger;
+import java.util.logging.Level;
+import java.util.logging.Handler;
+import java.util.logging.ConsoleHandler;
+
+import org.w3c.dom.Document;
+
+
+/**
+ * User: Yonik Seeley
+ * Date: Aug 16, 2004
+ */
+public class SolrTest extends Thread {
+  static SolrCore core;
+
+  static String[] requestDict;
+  static String[] updateDict;
+  static String[] testDict;
+  static List<Integer> testDictLineno;
+
+  static List<Integer> lineno;
+  public static String[] readDict(String filename) throws IOException {
+      BufferedReader br = new BufferedReader(new FileReader(filename));
+      ArrayList lst = new ArrayList(1024);
+    lineno = new ArrayList<Integer>(1024);
+    String line;
+    int lineNum=0;
+    while ((line = br.readLine())!=null) {
+      lineNum++;
+      if (line.length() <= 1) continue;
+      lst.add(line);
+      lineno.add(lineNum);
+    }
+    br.close();
+    return (String[]) lst.toArray(new String[lst.size()]);
+  }
+
+
+  public static boolean verbose=false;
+  static boolean doValidate=true;
+
+  static int countdown;
+  static synchronized boolean runAgain() {
+    return countdown-- > 0;
+  }
+
+
+  // statistics per client
+  int numReq=0;
+  int numErr=0;
+  int numBodyChars=0;
+
+  boolean isWriter=false;
+  boolean sequenceTest=false;
+
+  public void run() {
+    if (sequenceTest) {
+      for (int i=0; i<testDict.length; i++) {
+        String s = testDict[i];
+        int lineno = testDictLineno.get(i);
+        String req;
+        String test=null;
+        String params=null;
+        char[] resp;
+        if (s.length()<2 || s.startsWith("#")) continue;  // comment
+        System.out.println("LINE=" + lineno + " EXECUTING " + s);
+
+        int endQuery = s.length();
+        int startParams = s.indexOf("%%");
+        int endParams = s.length();
+        int endTests = s.length();
+        if (startParams > 0) {
+          endQuery = startParams;
+          endParams = s.length();
+        }
+        int startTests = s.indexOf('%', startParams+2);
+        if (startTests > 0) {
+          if (endQuery == s.length()) endQuery = startTests;
+          endParams = startTests;
+        }
+
+        req = s.substring(0,endQuery).trim();
+        if (startParams > 0) params = s.substring(startParams+2,endParams).trim();
+        if (startTests > 0) test = s.substring(startTests+1,endTests).trim();
+
+        System.out.println("###req=" + req);
+        System.out.println("###params=" + params);
+        System.out.println("###tests=" + test);
+
+        if (req.startsWith("<")) {
+          resp = doUpdate(req);
+        } else {
+          resp = doReq(req,params);
+        }
+        if (doValidate) {
+          validate(req,test,resp);
+        } else {
+          System.out.println("#### no validation performed");
+        }
+      }
+      System.out.println(">>>>>>>>>>>>>>>>>>>>>>>> SUCCESS <<<<<<<<<<<<<<<<<<<<<<<<<<");
+    }
+
+    else {
+      while(runAgain()) {
+        if (isWriter) doUpdate(updateDict[(int)(Math.random()*updateDict.length)]);
+        else doReq(requestDict[(int)(Math.random()*requestDict.length)], null);
+      }
+    }
+  }
+
+  private DocumentBuilder builder;
+  private XPath xpath = XPathFactory.newInstance().newXPath();
+  {
+    try {
+      builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
+    } catch (ParserConfigurationException e) {
+      e.printStackTrace();
+    }
+  }
+
+  private void validate(String req, String test, char[] resp) {
+    if (test==null || test.length()==0) return;
+    Document document=null;
+    try {
+      // the resp[] contains a declaration that it is UTF-8, so we
+      // need to change it to that for the XML parser.
+
+      document = builder.parse(new ByteArrayInputStream(new String(resp).getBytes("UTF-8")));
+      // document = builder.parse(new String(resp));
+    } catch (Exception e) {
+      System.out.println("ERROR parsing '" + new String(resp) + "'");
+      throw new RuntimeException(e);
+    }
+
+      String[] tests = test.split("%");
+      for (String xp : tests) {
+        Boolean bool=false;
+        xp=xp.trim();
+        try {
+           bool = (Boolean) xpath.evaluate(xp, document, XPathConstants.BOOLEAN);
+        } catch (Exception e) {
+          System.out.println("##################ERROR EVALUATING XPATH '" + xp + "'");
+          throw new RuntimeException(e);
+        }
+        if (!bool) {
+          System.out.println("##################ERROR");
+          System.out.println("req="+req);
+          System.out.println("xp="+xp);
+          throw new RuntimeException("test failed.");
+        }
+      }
+
+  }
+
+
+  public char[] doUpdate(String req) {
+    try {
+      // String lucene=updateDict[(int)(Math.random()*updateDict.length)];
+      String lucene=req;
+      StringReader ureq = new StringReader(lucene);
+      CharArrayWriter writer = new CharArrayWriter(32000);
+      core.update(ureq, writer);
+      if (verbose) System.out.println("UPDATE RESPONSE:'" + writer + "'");
+      // if (verbose) System.out.println("BODY chars read:" + writer.size());
+      this.numBodyChars+=writer.size();
+      this.numReq++;
+      return writer.toCharArray();
+    } catch (Exception e) {
+      this.numErr++;
+      e.printStackTrace();
+    }
+    return null;
+  }
+
+
+  static XMLResponseWriter xmlwriter = new XMLResponseWriter();
+  static SolrRequestHandler handler =
+           // new OldRequestHandler();
+              new StandardRequestHandler();
+
+  public char[] doReq(String req, String params)  {
+    int start=0;
+    int limit=10;
+    String handler="standard";
+    //handler="test";
+
+
+    Map args = new HashMap();
+    args.put("indent", "on");
+    args.put("debugQuery", "on");
+    args.put("fl", "score");
+    args.put("version", "2.0");
+
+    if (params != null) {
+      String[] plist = params.split("&");
+      for (String decl : plist) {
+        String[] nv = decl.split("=");
+        if (nv.length==1) {
+          nv = new String[] { nv[0], "" };
+        }
+        if (nv[0].equals("start")) {
+          start=Integer.parseInt(nv[1]);
+        }
+        else if (nv[0].equals("limit")) {
+          limit=Integer.parseInt(nv[1]);
+        }
+        else if (nv[0].equals("qt")) {
+          handler = nv[1];
+        } else {
+          args.put(nv[0], nv[1]);
+        }
+      }
+    }
+
+    try {
+      // String lucene=requestDict[(int)(Math.random()*requestDict.length)];
+      String lucene=req;
+      CharArrayWriter writer = new CharArrayWriter(32000);
+
+      System.out.println("start="+start+" limit="+limit+" handler="+handler);
+      LocalSolrQueryRequest qreq = new LocalSolrQueryRequest(core,lucene,handler,start,limit,args);
+      SolrQueryResponse qrsp = new SolrQueryResponse();
+      try {
+        core.execute(qreq,qrsp);
+        if (qrsp.getException() != null) throw qrsp.getException();
+        // handler.handleRequest(qreq,qrsp);
+        xmlwriter.write(writer,qreq,qrsp);
+      } finally {
+        qreq.close();
+      }
+      if (verbose) System.out.println("GOT:'" + writer + "'");
+      if (verbose) System.out.println("BODY chars read:" + writer.size());
+      this.numBodyChars+=writer.size();
+      this.numReq++;
+      return writer.toCharArray();
+    } catch (Exception e) {
+      this.numErr++;
+      e.printStackTrace();
+    }
+    return null;
+  }
+
+
+
+  public static void main(String[] args) throws Exception {
+    int readers=1;
+    int requests=1;
+    int writers=0;
+
+    Logger log = Logger.getLogger("solar");
+    log.setUseParentHandlers(false);
+    log.setLevel(Level.FINEST);
+    Handler handler = new ConsoleHandler();
+    handler.setLevel(Level.FINEST);
+    log.addHandler(handler);
+
+    String filename="dict.txt";
+    String updateFilename="update_dict.txt";
+    String luceneDir=null;
+    String schemaFile="schema.xml";
+    String testFile=null;
+
+    boolean b_numUpdates=false; boolean b_writers=false;
+
+    int i=0; String arg;
+    while (i < args.length && args[i].startsWith("-")) {
+      arg = args[i++];
+      if (arg.equals("-verbose")) {
+        verbose=true;
+      } else if (arg.equals("-dict")) {
+        filename=args[i++];
+      } else if (arg.equals("-index")) {
+        luceneDir=args[i++];
+      } else if (arg.equals("-readers")) {
+        readers=Integer.parseInt(args[i++]);
+      } else if (arg.equals("-numRequests")) {
+        requests=Integer.parseInt(args[i++]);
+      } else if (arg.equals("-writers")) {
+        writers=Integer.parseInt(args[i++]);
+        b_writers=true;
+      } else if (arg.equals("-schema")) {
+        schemaFile=args[i++];
+      } else if (arg.equals("-test")) {
+        testFile=args[i++];
+      } else if (arg.equals("-noValidate")) {
+        doValidate=false;
+      } else {
+        System.out.println("Unknown option: " + arg);
+        return;
+      }
+    }
+
+    try {
+
+    IndexSchema schema = new IndexSchema(schemaFile);
+    countdown = requests;
+    core=new SolrCore(luceneDir,schema);
+
+    try {
+      if (readers > 0) requestDict = readDict(filename);
+      if (writers > 0) updateDict = readDict(updateFilename);
+      if (testFile != null) {
+        testDict = readDict(testFile);
+        testDictLineno = lineno;
+      }
+    } catch (IOException e) {
+      e.printStackTrace();
+      System.out.println("Can't read "+filename);
+      return;
+    }
+
+    SolrTest[] clients = new SolrTest[readers+writers];
+    for (i=0; i<readers; i++) {
+      clients[i] = new SolrTest();
+      if (testFile != null) clients[i].sequenceTest=true;
+      clients[i].start();
+    }
+    for (i=readers; i<readers+writers; i++) {
+      clients[i] = new SolrTest();
+      clients[i].isWriter = true;
+      clients[i].start();
+    }
+
+    for (i=0; i<readers; i++) {
+      clients[i].join();
+    }
+    for (i=readers; i<readers+writers; i++) {
+      clients[i].join();
+    }
+
+    } finally {
+      if (core != null) core.close();
+    }
+
+  }
+
+}

Propchange: incubator/solr/trunk/src/apps/SolarTest/src/SolrTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/solr/trunk/src/apps/SolarTest/stopwords.txt
URL: http://svn.apache.org/viewcvs/incubator/solr/trunk/src/apps/SolarTest/stopwords.txt?rev=372455&view=auto
==============================================================================
--- incubator/solr/trunk/src/apps/SolarTest/stopwords.txt (added)
+++ incubator/solr/trunk/src/apps/SolarTest/stopwords.txt Wed Jan 25 21:37:29 2006
@@ -0,0 +1,2 @@
+stopworda
+stopwordb

Propchange: incubator/solr/trunk/src/apps/SolarTest/stopwords.txt
------------------------------------------------------------------------------
    svn:eol-style = native