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

svn commit: r1101062 [18/21] - in /lucene/dev/branches/bulkpostings: ./ dev-tools/ dev-tools/eclipse/ dev-tools/idea/.idea/ dev-tools/idea/lucene/contrib/ant/ dev-tools/idea/lucene/contrib/db/bdb-je/ dev-tools/idea/lucene/contrib/db/bdb/ dev-tools/idea...

Modified: lucene/dev/branches/bulkpostings/solr/build.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/bulkpostings/solr/build.xml?rev=1101062&r1=1101061&r2=1101062&view=diff
==============================================================================
--- lucene/dev/branches/bulkpostings/solr/build.xml (original)
+++ lucene/dev/branches/bulkpostings/solr/build.xml Mon May  9 15:24:04 2011
@@ -120,7 +120,7 @@
   <!-- Compile the project. -->
   <target name="compile"
           description="Compile the source code."
-          depends="validate-solr, compile-solrj">
+          depends="compile-solrj">
 
     <solr-javac destdir="${dest}/solr"
                 classpathref="compile.classpath.solrj">
@@ -394,7 +394,7 @@
   <!-- Run contrib unit tests. -->
   <target name="test"
         description="Runs the core unit tests."
-        depends="test-core, test-contrib, test-jsp" />
+        depends="validate-solr, test-core, test-contrib, test-jsp" />
 
   <target name="junit" depends="compileTests,junit-mkdir,junit-sequential,junit-parallel"/>
 
@@ -450,6 +450,7 @@
            >
       <sysproperty key="java.util.logging.config.file" value="${common-solr.dir}/testlogging.properties"/>
       <sysproperty key="tests.luceneMatchVersion" value="${tests.luceneMatchVersion}"/>
+      <sysproperty key="tests.codecprovider" value="${tests.codecprovider}"/>
       <sysproperty key="tests.codec" value="${tests.codec}"/>
       <sysproperty key="tests.locale" value="${tests.locale}"/>
       <sysproperty key="tests.timezone" value="${tests.timezone}"/>
@@ -1020,7 +1021,7 @@
                                    jar.file="lib/commons-csv-1.0-SNAPSHOT-r966014.jar" />
 
       <m2-deploy-with-pom-template pom.xml="lib/apache-solr-noggit-pom.xml.template"
-                                   jar.file="lib/apache-solr-noggit-r944541.jar" />
+                                   jar.file="lib/apache-solr-noggit-r1099557.jar" />
       
       <m2-deploy-with-pom-template pom.xml="contrib/uima/lib/solr-uima-an-alchemy-pom.xml.template"
                                    jar.file="contrib/uima/lib/uima-an-alchemy-2.3.1-SNAPSHOT-r1062868.jar" />

Modified: lucene/dev/branches/bulkpostings/solr/common-build.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/bulkpostings/solr/common-build.xml?rev=1101062&r1=1101061&r2=1101062&view=diff
==============================================================================
--- lucene/dev/branches/bulkpostings/solr/common-build.xml (original)
+++ lucene/dev/branches/bulkpostings/solr/common-build.xml Mon May  9 15:24:04 2011
@@ -61,6 +61,7 @@
   </condition>
 
   <property name="tests.multiplier" value="1" />
+  <property name="tests.codecprovider" value="random" />
   <property name="tests.codec" value="randomPerField" />
   <property name="tests.locale" value="random" />
   <property name="tests.timezone" value="random" />

Modified: lucene/dev/branches/bulkpostings/solr/contrib/analysis-extras/build.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/bulkpostings/solr/contrib/analysis-extras/build.xml?rev=1101062&r1=1101061&r2=1101062&view=diff
==============================================================================
--- lucene/dev/branches/bulkpostings/solr/contrib/analysis-extras/build.xml (original)
+++ lucene/dev/branches/bulkpostings/solr/contrib/analysis-extras/build.xml Mon May  9 15:24:04 2011
@@ -146,6 +146,7 @@
             >
       <sysproperty key="java.util.logging.config.file" value="${common-solr.dir}/testlogging.properties"/>
       <sysproperty key="tests.luceneMatchVersion" value="${tests.luceneMatchVersion}"/>
+      <sysproperty key="tests.codecprovider" value="${tests.codecprovider}"/>
       <sysproperty key="tests.codec" value="${tests.codec}"/>
       <sysproperty key="tests.locale" value="${tests.locale}"/>
       <sysproperty key="tests.timezone" value="${tests.timezone}"/>

Modified: lucene/dev/branches/bulkpostings/solr/contrib/clustering/build.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/bulkpostings/solr/contrib/clustering/build.xml?rev=1101062&r1=1101061&r2=1101062&view=diff
==============================================================================
--- lucene/dev/branches/bulkpostings/solr/contrib/clustering/build.xml (original)
+++ lucene/dev/branches/bulkpostings/solr/contrib/clustering/build.xml Mon May  9 15:24:04 2011
@@ -118,6 +118,7 @@
             >
       <sysproperty key="java.util.logging.config.file" value="${common-solr.dir}/testlogging.properties"/>
       <sysproperty key="tests.luceneMatchVersion" value="${tests.luceneMatchVersion}"/>
+      <sysproperty key="tests.codecprovider" value="${tests.codecprovider}"/>
       <sysproperty key="tests.codec" value="${tests.codec}"/>
       <sysproperty key="tests.locale" value="${tests.locale}"/>
       <sysproperty key="tests.timezone" value="${tests.timezone}"/>

Modified: lucene/dev/branches/bulkpostings/solr/contrib/dataimporthandler/build.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/bulkpostings/solr/contrib/dataimporthandler/build.xml?rev=1101062&r1=1101061&r2=1101062&view=diff
==============================================================================
--- lucene/dev/branches/bulkpostings/solr/contrib/dataimporthandler/build.xml (original)
+++ lucene/dev/branches/bulkpostings/solr/contrib/dataimporthandler/build.xml Mon May  9 15:24:04 2011
@@ -171,6 +171,7 @@
       <sysproperty key="java.util.logging.config.file" value="${common-solr.dir}/testlogging.properties"/>
       <sysproperty key="tests.luceneMatchVersion" value="${tests.luceneMatchVersion}"/>
       <sysproperty key="tests.codec" value="${tests.codec}"/>
+      <sysproperty key="tests.codecprovider" value="${tests.codecprovider}"/>
       <sysproperty key="tests.locale" value="${tests.locale}"/>
       <sysproperty key="tests.timezone" value="${tests.timezone}"/>
       <sysproperty key="tests.multiplier" value="${tests.multiplier}"/>
@@ -231,6 +232,7 @@
            >
       <sysproperty key="java.util.logging.config.file" value="${common-solr.dir}/testlogging.properties"/>
       <sysproperty key="tests.luceneMatchVersion" value="${tests.luceneMatchVersion}"/>
+      <sysproperty key="tests.codecprovider" value="${tests.codecprovider}"/>
       <sysproperty key="tests.codec" value="${tests.codec}"/>
       <sysproperty key="tests.locale" value="${tests.locale}"/>
       <sysproperty key="tests.timezone" value="${tests.timezone}"/>

Modified: lucene/dev/branches/bulkpostings/solr/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/DataImportHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/bulkpostings/solr/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/DataImportHandler.java?rev=1101062&r1=1101061&r2=1101062&view=diff
==============================================================================
--- lucene/dev/branches/bulkpostings/solr/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/DataImportHandler.java (original)
+++ lucene/dev/branches/bulkpostings/solr/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/DataImportHandler.java Mon May  9 15:24:04 2011
@@ -194,7 +194,7 @@ public class DataImportHandler extends R
               IMPORT_CMD.equals(command)) {
 
         UpdateRequestProcessorChain processorChain =
-                req.getCore().getUpdateProcessingChain(params.get(UpdateParams.UPDATE_PROCESSOR));
+                req.getCore().getUpdateProcessingChain(params.get(UpdateParams.UPDATE_CHAIN));
         UpdateRequestProcessor processor = processorChain.createProcessor(req, rsp);
         SolrResourceLoader loader = req.getCore().getResourceLoader();
         SolrWriter sw = getSolrWriter(processor, loader, requestParams, req);

Modified: lucene/dev/branches/bulkpostings/solr/contrib/extraction/build.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/bulkpostings/solr/contrib/extraction/build.xml?rev=1101062&r1=1101061&r2=1101062&view=diff
==============================================================================
--- lucene/dev/branches/bulkpostings/solr/contrib/extraction/build.xml (original)
+++ lucene/dev/branches/bulkpostings/solr/contrib/extraction/build.xml Mon May  9 15:24:04 2011
@@ -115,6 +115,7 @@
            >
       <sysproperty key="java.util.logging.config.file" value="${common-solr.dir}/testlogging.properties"/>
       <sysproperty key="tests.luceneMatchVersion" value="${tests.luceneMatchVersion}"/>
+      <sysproperty key="tests.codecprovider" value="${tests.codecprovider}"/>
       <sysproperty key="tests.codec" value="${tests.codec}"/>
       <sysproperty key="tests.locale" value="${tests.locale}"/>
       <sysproperty key="tests.timezone" value="${tests.timezone}"/>

Modified: lucene/dev/branches/bulkpostings/solr/contrib/uima/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/bulkpostings/solr/contrib/uima/CHANGES.txt?rev=1101062&r1=1101061&r2=1101062&view=diff
==============================================================================
--- lucene/dev/branches/bulkpostings/solr/contrib/uima/CHANGES.txt (original)
+++ lucene/dev/branches/bulkpostings/solr/contrib/uima/CHANGES.txt Mon May  9 15:24:04 2011
@@ -21,11 +21,30 @@ $Id$
 
 ==================  3.2.0-dev ==================
 
+Upgrading from Solr 3.1
+----------------------
+
+* <uimaConfig/> just beneath <config> ... </config> is no longer supported.
+  It should move to UIMAUpdateRequestProcessorFactory setting.
+  See contrib/uima/README.txt for more details. (SOLR-2436)
+
+New Features
+----------------------
+
+* SOLR-2503: extend mapping function to map feature value to dynamicField. (koji)
+
 Test Cases:
+----------------------
+
+* SOLR-2387: add mock annotators for improved testing,
+  (Tommaso Teofili via rmuir)
+
+Other Changes
+----------------------
 
- * SOLR-2387: add mock annotators for improved testing,
-   (Tommaso Teofili via rmuir)
+* SOLR-2436: move uimaConfig to under the uima's update processor in solrconfig.xml.
+  (Tommaso Teofili, koji)
 
-==================  3.1.0-dev ==================
+==================  3.1.0 ==================
 
 Initial Release

Modified: lucene/dev/branches/bulkpostings/solr/contrib/uima/README.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/bulkpostings/solr/contrib/uima/README.txt?rev=1101062&r1=1101061&r2=1101062&view=diff
==============================================================================
--- lucene/dev/branches/bulkpostings/solr/contrib/uima/README.txt (original)
+++ lucene/dev/branches/bulkpostings/solr/contrib/uima/README.txt Mon May  9 15:24:04 2011
@@ -3,38 +3,67 @@ Getting Started
 To start using Solr UIMA Metadata Extraction Library you should go through the following configuration steps:
 
 1. copy generated solr-uima jar and its libs (under contrib/uima/lib) inside a Solr libraries directory.
+   or set <lib/> tags in solrconfig.xml appropriately to point those jar files.
+
+   <lib dir="../../contrib/uima/lib" />
+   <lib dir="../../dist/" regex="apache-solr-uima-\d.*\.jar" />
 
 2. modify your schema.xml adding the fields you want to be hold metadata specifying proper values for type, indexed, stored and multiValued options:
 
-3. for example you could specify the following
+   for example you could specify the following
+
   <field name="language" type="string" indexed="true" stored="true" required="false"/>
   <field name="concept" type="string" indexed="true" stored="true" multiValued="true" required="false"/>
   <field name="sentence" type="text" indexed="true" stored="true" multiValued="true" required="false" />
 
-4. modify your solrconfig.xml adding the following snippet:
-  <uimaConfig>
-    <runtimeParameters>
-      <keyword_apikey>VALID_ALCHEMYAPI_KEY</keyword_apikey>
-      <concept_apikey>VALID_ALCHEMYAPI_KEY</concept_apikey>
-      <lang_apikey>VALID_ALCHEMYAPI_KEY</lang_apikey>
-      <cat_apikey>VALID_ALCHEMYAPI_KEY</cat_apikey>
-      <entities_apikey>VALID_ALCHEMYAPI_KEY</entities_apikey>
-      <oc_licenseID>VALID_OPENCALAIS_KEY</oc_licenseID>
-    </runtimeParameters>
-    <analysisEngine>/org/apache/uima/desc/OverridingParamsExtServicesAE.xml</analysisEngine>
-    <analyzeFields merge="false">text</analyzeFields>
-    <fieldMapping>
-      <type name="org.apache.uima.alchemy.ts.concept.ConceptFS">
-       <map feature="text" field="concept"/>
-      </type>
-      <type name="org.apache.uima.alchemy.ts.language.LanguageFS">
-       <map feature="language" field="language"/>
-      </type>
-      <type name="org.apache.uima.SentenceAnnotation">
-        <map feature="coveredText" field="sentence"/>
-      </type>
-    </fieldMapping>
-  </uimaConfig>
+3. modify your solrconfig.xml adding the following snippet:
+
+  <updateRequestProcessorChain name="uima">
+    <processor class="org.apache.solr.uima.processor.UIMAUpdateRequestProcessorFactory">
+      <lst name="uimaConfig">
+        <lst name="runtimeParameters">
+          <str name="keyword_apikey">VALID_ALCHEMYAPI_KEY</str>
+          <str name="concept_apikey">VALID_ALCHEMYAPI_KEY</str>
+          <str name="lang_apikey">VALID_ALCHEMYAPI_KEY</str>
+          <str name="cat_apikey">VALID_ALCHEMYAPI_KEY</str>
+          <str name="entities_apikey">VALID_ALCHEMYAPI_KEY</str>
+          <str name="oc_licenseID">VALID_OPENCALAIS_KEY</str>
+        </lst>
+        <str name="analysisEngine">/org/apache/uima/desc/OverridingParamsExtServicesAE.xml</str>
+        <lst name="analyzeFields">
+          <bool name="merge">false</bool>
+          <arr name="fields">
+            <str>text</str>
+          </arr>
+        </lst>
+        <lst name="fieldMappings">
+          <lst name="type">
+            <str name="name">org.apache.uima.alchemy.ts.concept.ConceptFS</str>
+            <lst name="mapping">
+              <str name="feature">text</str>
+              <str name="field">concept</str>
+            </lst>
+          </lst>
+          <lst name="type">
+            <str name="name">org.apache.uima.alchemy.ts.language.LanguageFS</str>
+            <lst name="mapping">
+              <str name="feature">language</str>
+              <str name="field">language</str>
+            </lst>
+          </lst>
+          <lst name="type">
+            <str name="name">org.apache.uima.SentenceAnnotation</str>
+            <lst name="mapping">
+              <str name="feature">coveredText</str>
+              <str name="field">sentence</str>
+            </lst>
+          </lst>
+        </lst>
+      </lst>
+    </processor>
+    <processor class="solr.LogUpdateProcessorFactory" />
+    <processor class="solr.RunUpdateProcessorFactory" />
+  </updateRequestProcessorChain>
 
    where VALID_ALCHEMYAPI_KEY is your AlchemyAPI Access Key. You need to register AlchemyAPI Access
    key to exploit the AlchemyAPI services: http://www.alchemyapi.com/api/register.html
@@ -42,21 +71,14 @@ To start using Solr UIMA Metadata Extrac
    where VALID_OPENCALAIS_KEY is your Calais Service Key. You need to register Calais Service
    key to exploit the Calais services: http://www.opencalais.com/apikey
   
-5. the analysisEngine tag must contain an AE descriptor inside the specified path in the classpath
+   the analysisEngine must contain an AE descriptor inside the specified path in the classpath
 
-6. the analyzeFields tag must contain the input fields that need to be analyzed by UIMA,
+   the analyzeFields must contain the input fields that need to be analyzed by UIMA,
    if merge=true then their content will be merged and analyzed only once
 
-7. field mapping describes which features of which types should go in a field
-
-8. define in your solrconfig.xml an UpdateRequestProcessorChain as following:
-  <updateRequestProcessorChain name="uima">
-    <processor class="org.apache.solr.uima.processor.UIMAUpdateRequestProcessorFactory"/>
-    <processor class="solr.LogUpdateProcessorFactory" />
-    <processor class="solr.RunUpdateProcessorFactory" />
-  </updateRequestProcessorChain>
+   field mapping describes which features of which types should go in a field
 
-9. in your solrconfig.xml replace the existing default (<requestHandler name="/update"...)  or create a new UpdateRequestHandler with the following:
+4. in your solrconfig.xml replace the existing default (<requestHandler name="/update"...)  or create a new UpdateRequestHandler with the following:
   <requestHandler name="/update" class="solr.XmlUpdateRequestHandler">
     <lst name="defaults">
       <str name="update.processor">uima</str>

Modified: lucene/dev/branches/bulkpostings/solr/contrib/uima/build.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/bulkpostings/solr/contrib/uima/build.xml?rev=1101062&r1=1101061&r2=1101062&view=diff
==============================================================================
--- lucene/dev/branches/bulkpostings/solr/contrib/uima/build.xml (original)
+++ lucene/dev/branches/bulkpostings/solr/contrib/uima/build.xml Mon May  9 15:24:04 2011
@@ -114,6 +114,7 @@
            >
       <sysproperty key="java.util.logging.config.file" value="${common-solr.dir}/testlogging.properties"/>
       <sysproperty key="tests.luceneMatchVersion" value="${tests.luceneMatchVersion}"/>
+      <sysproperty key="tests.codecprovider" value="${tests.codecprovider}"/>
       <sysproperty key="tests.codec" value="${tests.codec}"/>
       <sysproperty key="tests.locale" value="${tests.locale}"/>
       <sysproperty key="tests.timezone" value="${tests.timezone}"/>

Modified: lucene/dev/branches/bulkpostings/solr/contrib/uima/src/main/java/org/apache/solr/uima/processor/SolrUIMAConfiguration.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/bulkpostings/solr/contrib/uima/src/main/java/org/apache/solr/uima/processor/SolrUIMAConfiguration.java?rev=1101062&r1=1101061&r2=1101062&view=diff
==============================================================================
--- lucene/dev/branches/bulkpostings/solr/contrib/uima/src/main/java/org/apache/solr/uima/processor/SolrUIMAConfiguration.java (original)
+++ lucene/dev/branches/bulkpostings/solr/contrib/uima/src/main/java/org/apache/solr/uima/processor/SolrUIMAConfiguration.java Mon May  9 15:24:04 2011
@@ -21,7 +21,7 @@ import java.util.Map;
 
 /**
  * Configuration holding all the configurable parameters for calling UIMA inside Solr
- * 
+ *
  * @version $Id$
  */
 public class SolrUIMAConfiguration {
@@ -30,14 +30,14 @@ public class SolrUIMAConfiguration {
 
   private boolean fieldsMerging;
 
-  private Map<String, Map<String, String>> typesFeaturesFieldsMapping;
+  private Map<String, Map<String, MapField>> typesFeaturesFieldsMapping;
 
   private String aePath;
 
   private Map<String, Object> runtimeParameters;
 
   public SolrUIMAConfiguration(String aePath, String[] fieldsToAnalyze, boolean fieldsMerging,
-          Map<String, Map<String, String>> typesFeaturesFieldsMapping,
+          Map<String, Map<String, MapField>> typesFeaturesFieldsMapping,
           Map<String, Object> runtimeParameters) {
     this.aePath = aePath;
     this.fieldsToAnalyze = fieldsToAnalyze;
@@ -54,7 +54,7 @@ public class SolrUIMAConfiguration {
     return fieldsMerging;
   }
 
-  public Map<String, Map<String, String>> getTypesFeaturesFieldsMapping() {
+  public Map<String, Map<String, MapField>> getTypesFeaturesFieldsMapping() {
     return typesFeaturesFieldsMapping;
   }
 
@@ -65,5 +65,39 @@ public class SolrUIMAConfiguration {
   public Map<String, Object> getRuntimeParameters() {
     return runtimeParameters;
   }
-
+  
+  static final class MapField {
+    
+    private String fieldName, fieldNameFeature;
+    private boolean prefix; // valid if dynamicField == true
+                            // false: *_s, true: s_*
+    
+    MapField(String fieldName, String fieldNameFeature){
+      this.fieldName = fieldName;
+      this.fieldNameFeature = fieldNameFeature;
+      if(fieldNameFeature != null){
+        if(fieldName.startsWith("*")){
+          prefix = false;
+          this.fieldName = fieldName.substring(1);
+        }
+        else if(fieldName.endsWith("*")){
+          prefix = true;
+          this.fieldName = fieldName.substring(0, fieldName.length() - 1);
+        }
+        else
+          throw new RuntimeException("static field name cannot be used for dynamicField");
+      }
+    }
+    
+    String getFieldNameFeature(){
+      return fieldNameFeature;
+    }
+    
+    String getFieldName(String featureValue){
+      if(fieldNameFeature != null){
+        return prefix ? fieldName + featureValue : featureValue + fieldName;
+      }
+      return fieldName;
+    }
+  }
 }

Modified: lucene/dev/branches/bulkpostings/solr/contrib/uima/src/main/java/org/apache/solr/uima/processor/SolrUIMAConfigurationReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/bulkpostings/solr/contrib/uima/src/main/java/org/apache/solr/uima/processor/SolrUIMAConfigurationReader.java?rev=1101062&r1=1101061&r2=1101062&view=diff
==============================================================================
--- lucene/dev/branches/bulkpostings/solr/contrib/uima/src/main/java/org/apache/solr/uima/processor/SolrUIMAConfigurationReader.java (original)
+++ lucene/dev/branches/bulkpostings/solr/contrib/uima/src/main/java/org/apache/solr/uima/processor/SolrUIMAConfigurationReader.java Mon May  9 15:24:04 2011
@@ -18,11 +18,11 @@ package org.apache.solr.uima.processor;
  */
 
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
-import org.apache.solr.core.SolrConfig;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
+import org.apache.solr.common.util.NamedList;
+import org.apache.solr.uima.processor.SolrUIMAConfiguration.MapField;
 
 /**
  * Read configuration for Solr-UIMA integration
@@ -32,18 +32,10 @@ import org.w3c.dom.NodeList;
  */
 public class SolrUIMAConfigurationReader {
 
-  private static final String AE_RUNTIME_PARAMETERS_NODE_PATH = "/config/uimaConfig/runtimeParameters";
+  private NamedList<Object> args;
 
-  private static final String FIELD_MAPPING_NODE_PATH = "/config/uimaConfig/fieldMapping";
-
-  private static final String ANALYZE_FIELDS_NODE_PATH = "/config/uimaConfig/analyzeFields";
-
-  private static final String ANALYSIS_ENGINE_NODE_PATH = "/config/uimaConfig/analysisEngine";
-
-  private SolrConfig solrConfig;
-
-  public SolrUIMAConfigurationReader(SolrConfig solrConfig) {
-    this.solrConfig = solrConfig;
+  public SolrUIMAConfigurationReader(NamedList<Object> args) {
+    this.args = args;
   }
 
   public SolrUIMAConfiguration readSolrUIMAConfiguration() {
@@ -52,73 +44,64 @@ public class SolrUIMAConfigurationReader
   }
 
   private String readAEPath() {
-    return solrConfig.getNode(ANALYSIS_ENGINE_NODE_PATH, true).getTextContent();
+    return (String) args.get("analysisEngine");
+  }
+
+  @SuppressWarnings("rawtypes")
+  private NamedList getAnalyzeFields() {
+    return (NamedList) args.get("analyzeFields");
   }
 
+  @SuppressWarnings("unchecked")
   private String[] readFieldsToAnalyze() {
-    Node analyzeFieldsNode = solrConfig.getNode(ANALYZE_FIELDS_NODE_PATH, true);
-    return analyzeFieldsNode.getTextContent().split(",");
+    List<String> fields = (List<String>) getAnalyzeFields().get("fields");
+    return fields.toArray(new String[fields.size()]);
   }
 
   private boolean readFieldsMerging() {
-    Node analyzeFieldsNode = solrConfig.getNode(ANALYZE_FIELDS_NODE_PATH, true);
-    Node mergeNode = analyzeFieldsNode.getAttributes().getNamedItem("merge");
-    return Boolean.valueOf(mergeNode.getNodeValue());
+    return (Boolean) getAnalyzeFields().get("merge");
   }
 
-  private Map<String, Map<String, String>> readTypesFeaturesFieldsMapping() {
-    Map<String, Map<String, String>> map = new HashMap<String, Map<String, String>>();
+  @SuppressWarnings("rawtypes")
+  private Map<String, Map<String, MapField>> readTypesFeaturesFieldsMapping() {
+    Map<String, Map<String, MapField>> map = new HashMap<String, Map<String, MapField>>();
 
-    Node fieldMappingNode = solrConfig.getNode(FIELD_MAPPING_NODE_PATH, true);
+    NamedList fieldMappings = (NamedList) args.get("fieldMappings");
     /* iterate over UIMA types */
-    if (fieldMappingNode.hasChildNodes()) {
-      NodeList typeNodes = fieldMappingNode.getChildNodes();
-      for (int i = 0; i < typeNodes.getLength(); i++) {
-        /* <type> node */
-        Node typeNode = typeNodes.item(i);
-        if (typeNode.getNodeType() != Node.TEXT_NODE) {
-          Node typeNameAttribute = typeNode.getAttributes().getNamedItem("name");
-          /* get a UIMA typename */
-          String typeName = typeNameAttribute.getNodeValue();
-          /* create entry for UIMA type */
-          map.put(typeName, new HashMap<String, String>());
-          if (typeNode.hasChildNodes()) {
-            /* iterate over features */
-            NodeList featuresNodeList = typeNode.getChildNodes();
-            for (int j = 0; j < featuresNodeList.getLength(); j++) {
-              Node mappingNode = featuresNodeList.item(j);
-              if (mappingNode.getNodeType() != Node.TEXT_NODE) {
-                /* get field name */
-                Node fieldNameNode = mappingNode.getAttributes().getNamedItem("field");
-                String mappedFieldName = fieldNameNode.getNodeValue();
-                /* get feature name */
-                Node featureNameNode = mappingNode.getAttributes().getNamedItem("feature");
-                String featureName = featureNameNode.getNodeValue();
-                /* map the feature to the field for the specified type */
-                map.get(typeName).put(featureName, mappedFieldName);
-              }
-            }
-          }
+    for (int i = 0; i < fieldMappings.size(); i++) {
+      NamedList type = (NamedList) fieldMappings.get("type", i);
+      String typeName = (String)type.get("name");
+
+      Map<String, MapField> subMap = new HashMap<String, MapField>();
+      /* iterate over mapping definitions */
+      for(int j = 0; j < type.size() - 1; j++){
+        NamedList mapping = (NamedList) type.get("mapping", j + 1);
+        String featureName = (String) mapping.get("feature");
+        String fieldNameFeature = null;
+        String mappedFieldName = (String) mapping.get("field");
+        if(mappedFieldName == null){
+          fieldNameFeature = (String) mapping.get("fieldNameFeature");
+          mappedFieldName = (String) mapping.get("dynamicField");
         }
+        if(mappedFieldName == null)
+          throw new RuntimeException("either of field or dynamicField should be defined for feature " + featureName);
+        MapField mapField = new MapField(mappedFieldName, fieldNameFeature);
+        subMap.put(featureName, mapField);
       }
+      map.put(typeName, subMap);
     }
     return map;
   }
 
+  @SuppressWarnings("rawtypes")
   private Map<String, Object> readAEOverridingParameters() {
     Map<String, Object> runtimeParameters = new HashMap<String, Object>();
-    Node uimaConfigNode = solrConfig.getNode(AE_RUNTIME_PARAMETERS_NODE_PATH, true);
-
-    if (uimaConfigNode.hasChildNodes()) {
-      NodeList overridingNodes = uimaConfigNode.getChildNodes();
-      for (int i = 0; i < overridingNodes.getLength(); i++) {
-        Node overridingNode = overridingNodes.item(i);
-        if (overridingNode.getNodeType() != Node.TEXT_NODE && overridingNode.getNodeType() != Node.COMMENT_NODE) {
-          runtimeParameters.put(overridingNode.getNodeName(), overridingNode.getTextContent());
-        }
-      }
+    NamedList runtimeParams = (NamedList) args.get("runtimeParameters");
+    for (int i = 0; i < runtimeParams.size(); i++) {
+      String name = runtimeParams.getName(i);
+      Object value = runtimeParams.getVal(i);
+      runtimeParameters.put(name, value);
     }
-
     return runtimeParameters;
   }
 

Modified: lucene/dev/branches/bulkpostings/solr/contrib/uima/src/main/java/org/apache/solr/uima/processor/UIMAToSolrMapper.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/bulkpostings/solr/contrib/uima/src/main/java/org/apache/solr/uima/processor/UIMAToSolrMapper.java?rev=1101062&r1=1101061&r2=1101062&view=diff
==============================================================================
--- lucene/dev/branches/bulkpostings/solr/contrib/uima/src/main/java/org/apache/solr/uima/processor/UIMAToSolrMapper.java (original)
+++ lucene/dev/branches/bulkpostings/solr/contrib/uima/src/main/java/org/apache/solr/uima/processor/UIMAToSolrMapper.java Mon May  9 15:24:04 2011
@@ -20,6 +20,7 @@ package org.apache.solr.uima.processor;
 import java.util.Map;
 
 import org.apache.solr.common.SolrInputDocument;
+import org.apache.solr.uima.processor.SolrUIMAConfiguration.MapField;
 import org.apache.uima.cas.FSIterator;
 import org.apache.uima.cas.FeatureStructure;
 import org.apache.uima.cas.Type;
@@ -53,7 +54,7 @@ public class UIMAToSolrMapper {
    *          name of UIMA type to map
    * @param featureFieldsmapping
    */
-  public void map(String typeName, Map<String, String> featureFieldsmapping) {
+  public void map(String typeName, Map<String, MapField> featureFieldsmapping) {
     try {
       FeatureStructure fsMock = (FeatureStructure) Class.forName(typeName).getConstructor(
               JCas.class).newInstance(cas);
@@ -62,7 +63,11 @@ public class UIMAToSolrMapper {
               .hasNext();) {
         FeatureStructure fs = iterator.next();
         for (String featureName : featureFieldsmapping.keySet()) {
-          String fieldName = featureFieldsmapping.get(featureName);
+          MapField mapField = featureFieldsmapping.get(featureName);
+          String fieldNameFeature = mapField.getFieldNameFeature();
+          String fieldNameFeatureValue = fieldNameFeature == null ? null :
+            fs.getFeatureValueAsString(type.getFeatureByBaseName(fieldNameFeature));
+          String fieldName = mapField.getFieldName(fieldNameFeatureValue);
           log.info(new StringBuffer("mapping ").append(typeName).append("@").append(featureName)
                   .append(" to ").append(fieldName).toString());
           String featureValue = null;

Modified: lucene/dev/branches/bulkpostings/solr/contrib/uima/src/main/java/org/apache/solr/uima/processor/UIMAUpdateRequestProcessor.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/bulkpostings/solr/contrib/uima/src/main/java/org/apache/solr/uima/processor/UIMAUpdateRequestProcessor.java?rev=1101062&r1=1101061&r2=1101062&view=diff
==============================================================================
--- lucene/dev/branches/bulkpostings/solr/contrib/uima/src/main/java/org/apache/solr/uima/processor/UIMAUpdateRequestProcessor.java (original)
+++ lucene/dev/branches/bulkpostings/solr/contrib/uima/src/main/java/org/apache/solr/uima/processor/UIMAUpdateRequestProcessor.java Mon May  9 15:24:04 2011
@@ -22,6 +22,7 @@ import java.util.Map;
 
 import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.core.SolrCore;
+import org.apache.solr.uima.processor.SolrUIMAConfiguration.MapField;
 import org.apache.solr.uima.processor.ae.AEProvider;
 import org.apache.solr.uima.processor.ae.AEProviderFactory;
 import org.apache.solr.update.AddUpdateCommand;
@@ -34,24 +35,23 @@ import org.apache.uima.resource.Resource
 
 /**
  * Update document(s) to be indexed with UIMA extracted information
- * 
+ *
  * @version $Id$
  */
 public class UIMAUpdateRequestProcessor extends UpdateRequestProcessor {
 
-  private SolrUIMAConfiguration solrUIMAConfiguration;
+  SolrUIMAConfiguration solrUIMAConfiguration;
 
   private AEProvider aeProvider;
 
-  public UIMAUpdateRequestProcessor(UpdateRequestProcessor next, SolrCore solrCore) {
+  public UIMAUpdateRequestProcessor(UpdateRequestProcessor next, SolrCore solrCore,
+      SolrUIMAConfiguration config) {
     super(next);
-    initialize(solrCore);
+    initialize(solrCore, config);
   }
 
-  private void initialize(SolrCore solrCore) {
-    SolrUIMAConfigurationReader uimaConfigurationReader = new SolrUIMAConfigurationReader(solrCore
-            .getSolrConfig());
-    solrUIMAConfiguration = uimaConfigurationReader.readSolrUIMAConfiguration();
+  private void initialize(SolrCore solrCore, SolrUIMAConfiguration config) {
+    solrUIMAConfiguration = config;
     aeProvider = AEProviderFactory.getInstance().getAEProvider(solrCore.getName(),
             solrUIMAConfiguration.getAePath(), solrUIMAConfiguration.getRuntimeParameters());
   }
@@ -70,7 +70,7 @@ public class UIMAUpdateRequestProcessor 
 
           UIMAToSolrMapper uimaToSolrMapper = new UIMAToSolrMapper(solrInputDocument, jcas);
           /* get field mapping from config */
-          Map<String, Map<String, String>> typesAndFeaturesFieldsMap = solrUIMAConfiguration
+          Map<String, Map<String, MapField>> typesAndFeaturesFieldsMap = solrUIMAConfiguration
                   .getTypesFeaturesFieldsMapping();
           /* map type features on fields */
           for (String typeFQN : typesAndFeaturesFieldsMap.keySet()) {

Modified: lucene/dev/branches/bulkpostings/solr/contrib/uima/src/main/java/org/apache/solr/uima/processor/UIMAUpdateRequestProcessorFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/bulkpostings/solr/contrib/uima/src/main/java/org/apache/solr/uima/processor/UIMAUpdateRequestProcessorFactory.java?rev=1101062&r1=1101061&r2=1101062&view=diff
==============================================================================
--- lucene/dev/branches/bulkpostings/solr/contrib/uima/src/main/java/org/apache/solr/uima/processor/UIMAUpdateRequestProcessorFactory.java (original)
+++ lucene/dev/branches/bulkpostings/solr/contrib/uima/src/main/java/org/apache/solr/uima/processor/UIMAUpdateRequestProcessorFactory.java Mon May  9 15:24:04 2011
@@ -17,6 +17,7 @@ package org.apache.solr.uima.processor;
  * limitations under the License.
  */
 
+import org.apache.solr.common.util.NamedList;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.response.SolrQueryResponse;
 import org.apache.solr.update.processor.UpdateRequestProcessor;
@@ -29,10 +30,19 @@ import org.apache.solr.update.processor.
  */
 public class UIMAUpdateRequestProcessorFactory extends UpdateRequestProcessorFactory {
 
+  private NamedList<Object> args;
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public void init(@SuppressWarnings("rawtypes") NamedList args) {
+    this.args = (NamedList<Object>) args.get("uimaConfig");
+  }
+
   @Override
   public UpdateRequestProcessor getInstance(SolrQueryRequest req, SolrQueryResponse rsp,
           UpdateRequestProcessor next) {
-    return new UIMAUpdateRequestProcessor(next, req.getCore());
+    return new UIMAUpdateRequestProcessor(next, req.getCore(),
+            new SolrUIMAConfigurationReader(args).readSolrUIMAConfiguration());
   }
 
 }

Modified: lucene/dev/branches/bulkpostings/solr/contrib/uima/src/main/resources/solr/conf/aggregate-uima-config.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/bulkpostings/solr/contrib/uima/src/main/resources/solr/conf/aggregate-uima-config.xml?rev=1101062&r1=1101061&r2=1101062&view=diff
==============================================================================
--- lucene/dev/branches/bulkpostings/solr/contrib/uima/src/main/resources/solr/conf/aggregate-uima-config.xml (original)
+++ lucene/dev/branches/bulkpostings/solr/contrib/uima/src/main/resources/solr/conf/aggregate-uima-config.xml Mon May  9 15:24:04 2011
@@ -15,19 +15,34 @@
     limitations under the License.
   -->
 
-<uimaConfig>
-  <runtimeParameters>
-    <keyword_apikey>VALID_ALCHEMYAPI_KEY</keyword_apikey>
-    <concept_apikey>VALID_ALCHEMYAPI_KEY</concept_apikey>
-    <lang_apikey>VALID_ALCHEMYAPI_KEY</lang_apikey>
-    <cat_apikey>VALID_ALCHEMYAPI_KEY</cat_apikey>
-    <oc_licenseID>VALID_OPENCALAIS_KEY</oc_licenseID>
-  </runtimeParameters>
-  <analysisEngine>/org/apache/uima/desc/OverridingParamsExtServicesAE.xml</analysisEngine>
-  <analyzeFields merge="false">text,title</analyzeFields>
-  <fieldMapping>
-    <type name="org.apache.uima.jcas.tcas.Annotation">
-      <map feature="coveredText" field="tag"/>
-    </type>
-  </fieldMapping>
-</uimaConfig>
\ No newline at end of file
+  <updateRequestProcessorChain name="uima">
+    <processor class="org.apache.solr.uima.processor.UIMAUpdateRequestProcessorFactory">
+      <lst name="uimaConfig">
+        <lst name="runtimeParameters">
+          <str name="keyword_apikey">VALID_ALCHEMYAPI_KEY</str>
+          <str name="concept_apikey">VALID_ALCHEMYAPI_KEY</str>
+          <str name="lang_apikey">VALID_ALCHEMYAPI_KEY</str>
+          <str name="cat_apikey">VALID_ALCHEMYAPI_KEY</str>
+          <str name="entities_apikey">VALID_ALCHEMYAPI_KEY</str>
+          <str name="oc_licenseID">VALID_OPENCALAIS_KEY</str>
+        </lst>
+        <str name="analysisEngine">/org/apache/uima/desc/OverridingParamsExtServicesAE.xml</str>
+        <lst name="analyzeFields">
+          <bool name="merge">false</bool>
+          <arr name="fields">
+            <str>text</str>
+            <str>title</str>
+          </arr>
+        </lst>
+        <lst name="fieldMappings">
+          <lst name="mapping">
+            <str name="type">org.apache.uima.jcas.tcas.Annotation</str>
+            <str name="feature">convertText</str>
+            <str name="field">tag</str>
+          </lst>
+        </lst>
+      </lst>
+    </processor>
+    <processor class="solr.LogUpdateProcessorFactory" />
+    <processor class="solr.RunUpdateProcessorFactory" />
+  </updateRequestProcessorChain>

Modified: lucene/dev/branches/bulkpostings/solr/contrib/uima/src/test/java/org/apache/solr/uima/processor/UIMAUpdateRequestProcessorTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/bulkpostings/solr/contrib/uima/src/test/java/org/apache/solr/uima/processor/UIMAUpdateRequestProcessorTest.java?rev=1101062&r1=1101061&r2=1101062&view=diff
==============================================================================
--- lucene/dev/branches/bulkpostings/solr/contrib/uima/src/test/java/org/apache/solr/uima/processor/UIMAUpdateRequestProcessorTest.java (original)
+++ lucene/dev/branches/bulkpostings/solr/contrib/uima/src/test/java/org/apache/solr/uima/processor/UIMAUpdateRequestProcessorTest.java Mon May  9 15:24:04 2011
@@ -33,6 +33,8 @@ import org.apache.solr.core.SolrCore;
 import org.apache.solr.handler.XmlUpdateRequestHandler;
 import org.apache.solr.request.SolrQueryRequestBase;
 import org.apache.solr.response.SolrQueryResponse;
+import org.apache.solr.uima.processor.SolrUIMAConfiguration.MapField;
+import org.apache.solr.update.processor.UpdateRequestProcessor;
 import org.apache.solr.update.processor.UpdateRequestProcessorChain;
 import org.junit.Before;
 import org.junit.BeforeClass;
@@ -66,6 +68,26 @@ public class UIMAUpdateRequestProcessorT
     UIMAUpdateRequestProcessorFactory factory = (UIMAUpdateRequestProcessorFactory) chained
             .getFactories()[0];
     assertNotNull(factory);
+    UpdateRequestProcessor processor = factory.getInstance(req(), null, null);
+    assertTrue(processor instanceof UIMAUpdateRequestProcessor);
+  }
+
+  @Test
+  public void testMultiMap() {
+    SolrCore core = h.getCore();
+    UpdateRequestProcessorChain chained = core.getUpdateProcessingChain("uima-multi-map");
+    assertNotNull(chained);
+    UIMAUpdateRequestProcessorFactory factory = (UIMAUpdateRequestProcessorFactory) chained
+            .getFactories()[0];
+    assertNotNull(factory);
+    UpdateRequestProcessor processor = factory.getInstance(req(), null, null);
+    assertTrue(processor instanceof UIMAUpdateRequestProcessor);
+    SolrUIMAConfiguration conf = ((UIMAUpdateRequestProcessor)processor).solrUIMAConfiguration;
+    Map<String, Map<String, MapField>> map = conf.getTypesFeaturesFieldsMapping();
+    Map<String, MapField> subMap = map.get("a-type-which-can-have-multiple-features");
+    assertEquals(2, subMap.size());
+    assertEquals("1", subMap.get("A").getFieldName(null));
+    assertEquals("2", subMap.get("B").getFieldName(null));
   }
 
   @Test
@@ -83,7 +105,7 @@ public class UIMAUpdateRequestProcessorT
     assertU(commit());
     assertQ(req("sentence:*"), "//*[@numFound='1']");
     assertQ(req("sentiment:*"), "//*[@numFound='0']");
-    assertQ(req("entity:Prague"), "//*[@numFound='1']");
+    assertQ(req("OTHER_sm:Prague"), "//*[@numFound='1']");
   }
 
   @Test
@@ -103,12 +125,12 @@ public class UIMAUpdateRequestProcessorT
     assertQ(req("sentence:*"), "//*[@numFound='2']");
 
     assertQ(req("sentiment:positive"), "//*[@numFound='1']");
-    assertQ(req("entity:Apache"), "//*[@numFound='2']");
+    assertQ(req("ORGANIZATION_sm:Apache"), "//*[@numFound='2']");
   }
 
   private void addDoc(String doc) throws Exception {
     Map<String, String[]> params = new HashMap<String, String[]>();
-    params.put(UpdateParams.UPDATE_PROCESSOR, new String[] { "uima" });
+    params.put(UpdateParams.UPDATE_CHAIN, new String[] { "uima" });
     MultiMapSolrParams mmparams = new MultiMapSolrParams(params);
     SolrQueryRequestBase req = new SolrQueryRequestBase(h.getCore(), (SolrParams) mmparams) {
     };

Modified: lucene/dev/branches/bulkpostings/solr/contrib/uima/src/test/java/org/apache/solr/uima/processor/an/DummyEntityAnnotator.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/bulkpostings/solr/contrib/uima/src/test/java/org/apache/solr/uima/processor/an/DummyEntityAnnotator.java?rev=1101062&r1=1101061&r2=1101062&view=diff
==============================================================================
--- lucene/dev/branches/bulkpostings/solr/contrib/uima/src/test/java/org/apache/solr/uima/processor/an/DummyEntityAnnotator.java (original)
+++ lucene/dev/branches/bulkpostings/solr/contrib/uima/src/test/java/org/apache/solr/uima/processor/an/DummyEntityAnnotator.java Mon May  9 15:24:04 2011
@@ -34,6 +34,12 @@ public class DummyEntityAnnotator extend
         EntityAnnotation entityAnnotation = new EntityAnnotation(jcas);
         entityAnnotation.setBegin(annotation.getBegin());
         entityAnnotation.setEnd(annotation.getEnd());
+        String entityString = annotation.getCoveredText();
+        entityAnnotation.setEntity(entityString);
+        String name = "OTHER"; // "OTHER" makes no sense. In practice, "PERSON", "COUNTRY", "E-MAIL", etc.
+        if(entityString.equals("Apache"))
+          name = "ORGANIZATION";
+        entityAnnotation.setName(name);
         entityAnnotation.addToIndexes();
       }
     }

Modified: lucene/dev/branches/bulkpostings/solr/contrib/uima/src/test/java/org/apache/solr/uima/ts/EntityAnnotation.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/bulkpostings/solr/contrib/uima/src/test/java/org/apache/solr/uima/ts/EntityAnnotation.java?rev=1101062&r1=1101061&r2=1101062&view=diff
==============================================================================
--- lucene/dev/branches/bulkpostings/solr/contrib/uima/src/test/java/org/apache/solr/uima/ts/EntityAnnotation.java (original)
+++ lucene/dev/branches/bulkpostings/solr/contrib/uima/src/test/java/org/apache/solr/uima/ts/EntityAnnotation.java Mon May  9 15:24:04 2011
@@ -1,6 +1,6 @@
 
 
-/* First created by JCasGen Fri Mar 04 12:48:08 CET 2011 */
+/* First created by JCasGen Sat May 07 22:33:38 JST 2011 */
 package org.apache.solr.uima.ts;
 
 import org.apache.uima.jcas.JCas; 
@@ -11,8 +11,8 @@ import org.apache.uima.jcas.tcas.Annotat
 
 
 /** 
- * Updated by JCasGen Fri Mar 04 12:50:14 CET 2011
- * XML source: /Users/tommasoteofili/Documents/workspaces/lucene_workspace/lucene_dev/solr/contrib/uima/src/test/resources/DummyEntityAEDescriptor.xml
+ * Updated by JCasGen Sat May 07 22:33:38 JST 2011
+ * XML source: /Users/koji/Documents/workspace/DummyEntityAnnotator/desc/DummyEntityAEDescriptor.xml
  * @generated */
 public class EntityAnnotation extends Annotation {
   /** @generated
@@ -57,6 +57,42 @@ public class EntityAnnotation extends An
   @generated modifiable */
   private void readObject() {}
      
-}
+ 
+    
+  //*--------------*
+  //* Feature: name
+
+  /** getter for name - gets 
+   * @generated */
+  public String getName() {
+    if (EntityAnnotation_Type.featOkTst && ((EntityAnnotation_Type)jcasType).casFeat_name == null)
+      jcasType.jcas.throwFeatMissing("name", "org.apache.solr.uima.ts.EntityAnnotation");
+    return jcasType.ll_cas.ll_getStringValue(addr, ((EntityAnnotation_Type)jcasType).casFeatCode_name);}
+    
+  /** setter for name - sets  
+   * @generated */
+  public void setName(String v) {
+    if (EntityAnnotation_Type.featOkTst && ((EntityAnnotation_Type)jcasType).casFeat_name == null)
+      jcasType.jcas.throwFeatMissing("name", "org.apache.solr.uima.ts.EntityAnnotation");
+    jcasType.ll_cas.ll_setStringValue(addr, ((EntityAnnotation_Type)jcasType).casFeatCode_name, v);}    
+   
+    
+  //*--------------*
+  //* Feature: entity
+
+  /** getter for entity - gets 
+   * @generated */
+  public String getEntity() {
+    if (EntityAnnotation_Type.featOkTst && ((EntityAnnotation_Type)jcasType).casFeat_entity == null)
+      jcasType.jcas.throwFeatMissing("entity", "org.apache.solr.uima.ts.EntityAnnotation");
+    return jcasType.ll_cas.ll_getStringValue(addr, ((EntityAnnotation_Type)jcasType).casFeatCode_entity);}
+    
+  /** setter for entity - sets  
+   * @generated */
+  public void setEntity(String v) {
+    if (EntityAnnotation_Type.featOkTst && ((EntityAnnotation_Type)jcasType).casFeat_entity == null)
+      jcasType.jcas.throwFeatMissing("entity", "org.apache.solr.uima.ts.EntityAnnotation");
+    jcasType.ll_cas.ll_setStringValue(addr, ((EntityAnnotation_Type)jcasType).casFeatCode_entity, v);}    
+  }
 
     
\ No newline at end of file

Modified: lucene/dev/branches/bulkpostings/solr/contrib/uima/src/test/java/org/apache/solr/uima/ts/EntityAnnotation_Type.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/bulkpostings/solr/contrib/uima/src/test/java/org/apache/solr/uima/ts/EntityAnnotation_Type.java?rev=1101062&r1=1101061&r2=1101062&view=diff
==============================================================================
--- lucene/dev/branches/bulkpostings/solr/contrib/uima/src/test/java/org/apache/solr/uima/ts/EntityAnnotation_Type.java (original)
+++ lucene/dev/branches/bulkpostings/solr/contrib/uima/src/test/java/org/apache/solr/uima/ts/EntityAnnotation_Type.java Mon May  9 15:24:04 2011
@@ -1,5 +1,5 @@
 
-/* First created by JCasGen Fri Mar 04 12:48:08 CET 2011 */
+/* First created by JCasGen Sat May 07 22:33:38 JST 2011 */
 package org.apache.solr.uima.ts;
 
 import org.apache.uima.jcas.JCas;
@@ -9,10 +9,12 @@ import org.apache.uima.cas.impl.FSGenera
 import org.apache.uima.cas.FeatureStructure;
 import org.apache.uima.cas.impl.TypeImpl;
 import org.apache.uima.cas.Type;
+import org.apache.uima.cas.impl.FeatureImpl;
+import org.apache.uima.cas.Feature;
 import org.apache.uima.jcas.tcas.Annotation_Type;
 
 /** 
- * Updated by JCasGen Fri Mar 04 12:50:14 CET 2011
+ * Updated by JCasGen Sat May 07 22:33:38 JST 2011
  * @generated */
 public class EntityAnnotation_Type extends Annotation_Type {
   /** @generated */
@@ -38,6 +40,42 @@ public class EntityAnnotation_Type exten
   /** @generated 
      @modifiable */
   public final static boolean featOkTst = JCasRegistry.getFeatOkTst("org.apache.solr.uima.ts.EntityAnnotation");
+ 
+  /** @generated */
+  final Feature casFeat_name;
+  /** @generated */
+  final int     casFeatCode_name;
+  /** @generated */ 
+  public String getName(int addr) {
+        if (featOkTst && casFeat_name == null)
+      jcas.throwFeatMissing("name", "org.apache.solr.uima.ts.EntityAnnotation");
+    return ll_cas.ll_getStringValue(addr, casFeatCode_name);
+  }
+  /** @generated */    
+  public void setName(int addr, String v) {
+        if (featOkTst && casFeat_name == null)
+      jcas.throwFeatMissing("name", "org.apache.solr.uima.ts.EntityAnnotation");
+    ll_cas.ll_setStringValue(addr, casFeatCode_name, v);}
+    
+  
+ 
+  /** @generated */
+  final Feature casFeat_entity;
+  /** @generated */
+  final int     casFeatCode_entity;
+  /** @generated */ 
+  public String getEntity(int addr) {
+        if (featOkTst && casFeat_entity == null)
+      jcas.throwFeatMissing("entity", "org.apache.solr.uima.ts.EntityAnnotation");
+    return ll_cas.ll_getStringValue(addr, casFeatCode_entity);
+  }
+  /** @generated */    
+  public void setEntity(int addr, String v) {
+        if (featOkTst && casFeat_entity == null)
+      jcas.throwFeatMissing("entity", "org.apache.solr.uima.ts.EntityAnnotation");
+    ll_cas.ll_setStringValue(addr, casFeatCode_entity, v);}
+    
+  
 
 
 
@@ -47,6 +85,14 @@ public class EntityAnnotation_Type exten
     super(jcas, casType);
     casImpl.getFSClassRegistry().addGeneratorForType((TypeImpl)this.casType, getFSGenerator());
 
+ 
+    casFeat_name = jcas.getRequiredFeatureDE(casType, "name", "uima.cas.String", featOkTst);
+    casFeatCode_name  = (null == casFeat_name) ? JCas.INVALID_FEATURE_CODE : ((FeatureImpl)casFeat_name).getCode();
+
+ 
+    casFeat_entity = jcas.getRequiredFeatureDE(casType, "entity", "uima.cas.String", featOkTst);
+    casFeatCode_entity  = (null == casFeat_entity) ? JCas.INVALID_FEATURE_CODE : ((FeatureImpl)casFeat_entity).getCode();
+
   }
 }
 

Modified: lucene/dev/branches/bulkpostings/solr/contrib/uima/src/test/resources/DummyEntityAEDescriptor.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/bulkpostings/solr/contrib/uima/src/test/resources/DummyEntityAEDescriptor.xml?rev=1101062&r1=1101061&r2=1101062&view=diff
==============================================================================
--- lucene/dev/branches/bulkpostings/solr/contrib/uima/src/test/resources/DummyEntityAEDescriptor.xml (original)
+++ lucene/dev/branches/bulkpostings/solr/contrib/uima/src/test/resources/DummyEntityAEDescriptor.xml Mon May  9 15:24:04 2011
@@ -32,6 +32,18 @@
           <name>org.apache.solr.uima.ts.EntityAnnotation</name>
           <description/>
           <supertypeName>uima.tcas.Annotation</supertypeName>
+          <features>
+            <featureDescription>
+              <name>name</name>
+              <description/>
+              <rangeTypeName>uima.cas.String</rangeTypeName>
+            </featureDescription>
+            <featureDescription>
+              <name>entity</name>
+              <description/>
+              <rangeTypeName>uima.cas.String</rangeTypeName>
+            </featureDescription>
+          </features>
         </typeDescription>
       </types>
     </typeSystemDescription>

Modified: lucene/dev/branches/bulkpostings/solr/contrib/uima/src/test/resources/solr-uima/conf/schema.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/bulkpostings/solr/contrib/uima/src/test/resources/solr-uima/conf/schema.xml?rev=1101062&r1=1101061&r2=1101062&view=diff
==============================================================================
--- lucene/dev/branches/bulkpostings/solr/contrib/uima/src/test/resources/solr-uima/conf/schema.xml (original)
+++ lucene/dev/branches/bulkpostings/solr/contrib/uima/src/test/resources/solr-uima/conf/schema.xml Mon May  9 15:24:04 2011
@@ -597,6 +597,7 @@
       stored="true" multiValued="true"/> <dynamicField name="random_*"
       type="random" />
     -->
+    <dynamicField name="*_sm" type="string" indexed="true" stored="true" multiValued="true"/>
     <!--
       uncomment the following to ignore any fields that don't already
       match an existing field name or dynamic field, rather than

Modified: lucene/dev/branches/bulkpostings/solr/contrib/uima/src/test/resources/solr-uima/conf/solrconfig.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/bulkpostings/solr/contrib/uima/src/test/resources/solr-uima/conf/solrconfig.xml?rev=1101062&r1=1101061&r2=1101062&view=diff
==============================================================================
--- lucene/dev/branches/bulkpostings/solr/contrib/uima/src/test/resources/solr-uima/conf/solrconfig.xml (original)
+++ lucene/dev/branches/bulkpostings/solr/contrib/uima/src/test/resources/solr-uima/conf/solrconfig.xml Mon May  9 15:24:04 2011
@@ -295,7 +295,7 @@
   <!--
     <indexReaderFactory name="IndexReaderFactory"
     class="org.apache.solr.core.StandardIndexReaderFactory"> <int
-    name="termInfosIndexDivisor">12</int> </indexReaderFactory >
+    name="setTermIndexDivisor">12</int> </indexReaderFactory >
   -->
 
 
@@ -855,7 +855,7 @@
   -->
   <requestHandler name="/update" class="solr.XmlUpdateRequestHandler">
     <lst name="defaults">
-      <str name="update.processor">uima</str>
+      <str name="update.chain">uima</str>
     </lst>
   </requestHandler>
 
@@ -953,42 +953,6 @@
     </lst>
   </requestHandler>
 
-  <highlighting>
-    <!-- Configure the standard fragmenter -->
-    <!-- This could most likely be commented out in the "default" case -->
-    <fragmenter name="gap"
-      class="org.apache.solr.highlight.GapFragmenter" default="true">
-      <lst name="defaults">
-        <int name="hl.fragsize">100</int>
-      </lst>
-    </fragmenter>
-
-    <!--
-      A regular-expression-based fragmenter (f.i., for sentence
-      extraction)
-    -->
-    <fragmenter name="regex"
-      class="org.apache.solr.highlight.RegexFragmenter">
-      <lst name="defaults">
-        <!-- slightly smaller fragsizes work better because of slop -->
-        <int name="hl.fragsize">70</int>
-        <!-- allow 50% slop on fragment sizes -->
-        <float name="hl.regex.slop">0.5</float>
-        <!-- a basic sentence pattern -->
-        <str name="hl.regex.pattern">[-\w ,/\n\"']{20,200}</str>
-      </lst>
-    </fragmenter>
-
-    <!-- Configure the standard formatter -->
-    <formatter name="html" class="org.apache.solr.highlight.HtmlFormatter"
-      default="true">
-      <lst name="defaults">
-        <str name="hl.simple.pre"><![CDATA[<em>]]></str>
-        <str name="hl.simple.post"><![CDATA[</em>]]></str>
-      </lst>
-    </formatter>
-  </highlighting>
-
   <!--
     An example dedup update processor that creates the "id" field on the
     fly based on the hash code of some other fields. This example has
@@ -997,16 +961,81 @@
     anyway. You have to link the chain to an update handler above to use
     it ie: <requestHandler name="/update
     "class="solr.XmlUpdateRequestHandler"> <lst name="defaults"> <str
-    name="update.processor">dedupe</str> </lst> </requestHandler>
+    name="update.chain">dedupe</str> </lst> </requestHandler>
   -->
 
   <updateRequestProcessorChain name="uima">
-    <processor class="org.apache.solr.uima.processor.UIMAUpdateRequestProcessorFactory"/>
+    <processor class="org.apache.solr.uima.processor.UIMAUpdateRequestProcessorFactory">
+      <lst name="uimaConfig">
+        <lst name="runtimeParameters">
+          <int name="ngramsize">3</int>
+        </lst>
+        <str name="analysisEngine">/TestAE.xml</str>
+        <lst name="analyzeFields">
+          <bool name="merge">false</bool>
+          <arr name="fields">
+            <str>text</str>
+          </arr>
+        </lst>
+        <lst name="fieldMappings">
+          <lst name="type">
+            <str name="name">org.apache.uima.SentenceAnnotation</str>
+            <lst name="mapping">
+              <str name="feature">coveredText</str>
+              <str name="field">sentence</str>
+            </lst>
+          </lst>
+          <lst name="type">
+            <str name="name">org.apache.solr.uima.ts.SentimentAnnotation</str>
+            <lst name="mapping">
+              <str name="feature">mood</str>
+              <str name="field">sentiment</str>
+            </lst>
+          </lst>
+          <lst name="type">
+            <str name="name">org.apache.solr.uima.ts.EntityAnnotation</str>
+            <lst name="mapping">
+              <str name="feature">entity</str>
+              <str name="fieldNameFeature">name</str>
+              <str name="dynamicField">*_sm</str>
+            </lst>
+          </lst>
+        </lst>
+      </lst>
+    </processor>
     <processor class="solr.LogUpdateProcessorFactory" />
     <processor class="solr.RunUpdateProcessorFactory" />
   </updateRequestProcessorChain>
 
-
+  <updateRequestProcessorChain name="uima-multi-map">
+    <processor class="org.apache.solr.uima.processor.UIMAUpdateRequestProcessorFactory">
+      <lst name="uimaConfig">
+        <lst name="runtimeParameters">
+          <int name="ngramsize">3</int>
+        </lst>
+        <str name="analysisEngine">/TestAE.xml</str>
+        <lst name="analyzeFields">
+          <bool name="merge">false</bool>
+          <arr name="fields">
+            <str>text</str>
+          </arr>
+        </lst>
+        <lst name="fieldMappings">
+          <lst name="type">
+            <str name="name">a-type-which-can-have-multiple-features</str>
+            <lst name="mapping">
+              <str name="feature">A</str>
+              <str name="field">1</str>
+            </lst>
+            <lst name="mapping">
+              <str name="feature">B</str>
+              <str name="field">2</str>
+            </lst>
+          </lst>
+        </lst>
+      </lst>
+    </processor>
+  </updateRequestProcessorChain>
 
   <!--
     queryResponseWriter plugins... query responses will be written using
@@ -1062,23 +1091,4 @@
     -->
   </admin>
 
-<uimaConfig>
-   <runtimeParameters>
-     <ngramsize>3</ngramsize>
-  </runtimeParameters>
-  <analysisEngine>/TestAE.xml</analysisEngine>
-  <analyzeFields merge="false">text</analyzeFields>
-  <fieldMapping>
-    <type name="org.apache.uima.SentenceAnnotation">
-      <map feature="coveredText" field="sentence"/>
-    </type>
-    <type name="org.apache.solr.uima.ts.SentimentAnnotation">
-      <map feature="mood" field="sentiment"/>
-    </type>
-    <type name="org.apache.solr.uima.ts.EntityAnnotation">
-      <map feature="coveredText" field="entity"/>
-    </type>
-  </fieldMapping>
-</uimaConfig>
-
 </config>

Modified: lucene/dev/branches/bulkpostings/solr/example/solr/conf/solrconfig.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/bulkpostings/solr/example/solr/conf/solrconfig.xml?rev=1101062&r1=1101061&r2=1101062&view=diff
==============================================================================
--- lucene/dev/branches/bulkpostings/solr/example/solr/conf/solrconfig.xml (original)
+++ lucene/dev/branches/bulkpostings/solr/example/solr/conf/solrconfig.xml Mon May  9 15:24:04 2011
@@ -774,6 +774,7 @@
        <str name="q.alt">*:*</str>
        <str name="rows">10</str>
        <str name="fl">*,score</str>
+
        <str name="mlt.qf">
          text^0.5 features^1.0 name^1.2 sku^1.5 id^10.0 manu^1.1 cat^1.4
        </str>
@@ -792,6 +793,8 @@
        <int name="facet.range.start">0</int>
        <int name="facet.range.end">600</int>
        <int name="facet.range.gap">50</int>
+       <str name="facet.range">popularity</str>
+       <int name="f.popularity.facet.range.gap">3</int>
        <str name="facet.range.other">after</str>
        <str name="facet.date">manufacturedate_dt</str>
        <str name="facet.date.start">NOW/YEAR-10YEARS</str>
@@ -841,7 +844,7 @@
       -->
     <!--
        <lst name="defaults">
-         <str name="update.processor">dedupe</str>
+         <str name="update.chain">dedupe</str>
        </lst>
        -->
     </requestHandler>

Modified: lucene/dev/branches/bulkpostings/solr/example/solr/conf/velocity/VM_global_library.vm
URL: http://svn.apache.org/viewvc/lucene/dev/branches/bulkpostings/solr/example/solr/conf/velocity/VM_global_library.vm?rev=1101062&r1=1101061&r2=1101062&view=diff
==============================================================================
--- lucene/dev/branches/bulkpostings/solr/example/solr/conf/velocity/VM_global_library.vm (original)
+++ lucene/dev/branches/bulkpostings/solr/example/solr/conf/velocity/VM_global_library.vm Mon May  9 15:24:04 2011
@@ -88,13 +88,13 @@
     <ul>
     #foreach ($facet in $field)
       #set($theDate = $date.toDate("yyyy-MM-dd'T'HH:mm:ss'Z'", $facet.key))
-      #set($value = '["' + $facet.key + '" TO "' + $facet.key + $gap + '"]')
+      #set($value = '["' + $facet.key + '" TO "' + $facet.key + $gap + '"}')
 
       #set($facetURL = "#url_for_facet_date_filter($fieldName, $value)")
       #if ($facetURL != '')
         #if ($facet.key != "gap" && $facet.key != "start" && $facet.key != "end" && $facet.key != "before" && $facet.key != "after")
 
-          <li><a href="$facetURL">$date.format('MMM yyyy', $theDate)</a> ($facet.value)</li>
+          <li><a href="$facetURL">$date.format('MMM yyyy', $theDate) $gap</a> ($facet.value)</li>
         #end
         #if ($facet.key == "before" && $facet.value > 0)
           <li><a href="$facetURL">Before</a> ($facet.value)</li>
@@ -113,20 +113,20 @@
   <span class="facet-field">$display</span>
     <ul>
     #if($before && $before != "")
-      #set($value = "[* TO " + $start + "]")
+      #set($value = "[* TO " + $start + "}")
       #set($facetURL = "#url_for_facet_range_filter($fieldName, $value)")
       <li><a href="$facetURL">Less than $start</a> ($before)</li>
     #end
     #foreach ($facet in $field)
       #set($rangeEnd = $math.add($facet.key, $gap))
-      #set($value = "[" + $facet.key + " TO " + $rangeEnd + "]")
+      #set($value = "[" + $facet.key + " TO " + $rangeEnd + "}")
       #set($facetURL = "#url_for_facet_range_filter($fieldName, $value)")
       #if ($facetURL != '')
-        <li><a href="$facetURL">$facet.key</a> ($facet.value)</li>
+        <li><a href="$facetURL">$facet.key - $rangeEnd</a> ($facet.value)</li>
       #end
     #end
-    #if($end && $end != "")
-      #set($value = "[" + $end + " TO *]")
+    #if($end && $end != "" && $after > 0)
+      #set($value = "[" + $end + " TO *}")
       #set($facetURL = "#url_for_facet_range_filter($fieldName, $value)")
       <li><a href="$facetURL">More than $math.toNumber($end)</a> ($after)</li>
     #end
@@ -180,4 +180,8 @@
       $v
     #end
   #end
-#end  
\ No newline at end of file
+#end  
+
+#macro(capitalize $name)
+  ${name.substring(0,1).toUpperCase()}${name.substring(1)}
+#end
\ No newline at end of file

Modified: lucene/dev/branches/bulkpostings/solr/example/solr/conf/velocity/facet_dates.vm
URL: http://svn.apache.org/viewvc/lucene/dev/branches/bulkpostings/solr/example/solr/conf/velocity/facet_dates.vm?rev=1101062&r1=1101061&r2=1101062&view=diff
==============================================================================
--- lucene/dev/branches/bulkpostings/solr/example/solr/conf/velocity/facet_dates.vm (original)
+++ lucene/dev/branches/bulkpostings/solr/example/solr/conf/velocity/facet_dates.vm Mon May  9 15:24:04 2011
@@ -1,5 +1,9 @@
 ##TODO: Generically deal with all dates
 <h2 #annTitle("Facets generated by adding &facet.date= to the request")>Date Facets</h2>        
-#set($field = $response.response.facet_counts.facet_dates.manufacturedate_dt)
-#set($gap = $response.response.facet_counts.facet_dates.manufacturedate_dt.gap)
-#display_facet_date($field, "Manufacture Date", "manufacturedate_dt", $gap)
+#foreach ($field in $response.response.facet_counts.facet_dates)
+	#set($name = $field.key)
+	#set($display = "#capitalize($name)")
+	#set($f = $field.value)
+	#set($gap = $field.value.gap)
+    #display_facet_date($f, $display, $name, $gap)
+#end
\ No newline at end of file

Modified: lucene/dev/branches/bulkpostings/solr/example/solr/conf/velocity/facet_ranges.vm
URL: http://svn.apache.org/viewvc/lucene/dev/branches/bulkpostings/solr/example/solr/conf/velocity/facet_ranges.vm?rev=1101062&r1=1101061&r2=1101062&view=diff
==============================================================================
--- lucene/dev/branches/bulkpostings/solr/example/solr/conf/velocity/facet_ranges.vm (original)
+++ lucene/dev/branches/bulkpostings/solr/example/solr/conf/velocity/facet_ranges.vm Mon May  9 15:24:04 2011
@@ -1,10 +1,12 @@
 <h2 #annTitle("Facets generated by adding &facet.range= to the request")>Range Facets</h2>
-#set($field = $response.response.facet_counts.facet_ranges.price.counts)
-#set($start = $response.response.facet_counts.facet_ranges.price.start)
-#set($end = $response.response.facet_counts.facet_ranges.price.end)
-#set($gap = $response.response.facet_counts.facet_ranges.price.gap)
-#set($before = $response.response.facet_counts.facet_ranges.price.before)
-#set($after = $response.response.facet_counts.facet_ranges.price.after)
-##TODO: Make this display the "range", not just the lower value
-##TODO: Have a generic way to deal with ranges
-#display_facet_range($field, "Price (in $)", "price", $start, $end, $gap, $before, $after)
+#foreach ($field in $response.response.facet_counts.facet_ranges)
+	#set($name = $field.key)
+	#set($display = "#capitalize($name)")
+	#set($f = $field.value.counts)
+	#set($start = $field.value.start)
+	#set($end = $field.value.end)
+	#set($gap = $field.value.gap)
+	#set($before = $field.value.before)
+	#set($after = $field.value.after)
+	#display_facet_range($f, $display, $name, $start, $end, $gap, $before, $after)
+#end
\ No newline at end of file

Modified: lucene/dev/branches/bulkpostings/solr/example/solr/conf/velocity/main.css
URL: http://svn.apache.org/viewvc/lucene/dev/branches/bulkpostings/solr/example/solr/conf/velocity/main.css?rev=1101062&r1=1101061&r2=1101062&view=diff
==============================================================================
--- lucene/dev/branches/bulkpostings/solr/example/solr/conf/velocity/main.css (original)
+++ lucene/dev/branches/bulkpostings/solr/example/solr/conf/velocity/main.css Mon May  9 15:24:04 2011
@@ -18,6 +18,18 @@
   margin-left: 20px;
 }
 
+.parsed_query_header {
+  font-family: Helvetica, Arial, sans-serif;
+  font-size: 10pt;
+  font-weight: bold;
+}
+
+.parsed_query {
+  font-family: Courier, Courier New, monospaced;
+  font-size: 10pt;
+  font-weight: normal;
+}
+
 body {
   font-family: Helvetica, Arial, sans-serif;
   font-size: 10pt;

Modified: lucene/dev/branches/bulkpostings/solr/example/solr/conf/velocity/query.vm
URL: http://svn.apache.org/viewvc/lucene/dev/branches/bulkpostings/solr/example/solr/conf/velocity/query.vm?rev=1101062&r1=1101061&r2=1101062&view=diff
==============================================================================
--- lucene/dev/branches/bulkpostings/solr/example/solr/conf/velocity/query.vm (original)
+++ lucene/dev/branches/bulkpostings/solr/example/solr/conf/velocity/query.vm Mon May  9 15:24:04 2011
@@ -27,14 +27,16 @@
         #end
       #end
     </div>
+    <div class="parsed_query_header">
      #if($request.params.get('debugQuery'))
-        <a href="#" onclick='jQuery(this).siblings("pre").toggle(); return false;'>toggle parsed query</a>
-        <pre style="display:none">$response.response.debug.parsedquery</pre>
+        <a href="#" onclick='jQuery(this).siblings("div").toggle(); return false;'>toggle parsed query</a>
+        <div class="parsed_query" style="display:none">$response.response.debug.parsedquery</div>
       #end
       #set($queryOpts = $request.params.get("queryOpts"))
       #if($queryOpts && $queryOpts != "")
         <input type="hidden" name="queryOpts" value="$queryOpts"/>
       #end
+    </div>
   </form>
 
 </div>

Modified: lucene/dev/branches/bulkpostings/solr/lib/apache-solr-noggit-pom.xml.template
URL: http://svn.apache.org/viewvc/lucene/dev/branches/bulkpostings/solr/lib/apache-solr-noggit-pom.xml.template?rev=1101062&r1=1101061&r2=1101062&view=diff
==============================================================================
--- lucene/dev/branches/bulkpostings/solr/lib/apache-solr-noggit-pom.xml.template (original)
+++ lucene/dev/branches/bulkpostings/solr/lib/apache-solr-noggit-pom.xml.template Mon May  9 15:24:04 2011
@@ -31,6 +31,6 @@
   <artifactId>solr-noggit</artifactId>
   <name>Solr Specific Noggit</name>
   <version>@version@</version>
-  <description>Solr Specific Noggit r944541</description>
+  <description>Solr Specific Noggit r1099557</description>
   <packaging>jar</packaging>
 </project>

Modified: lucene/dev/branches/bulkpostings/solr/src/common/org/apache/solr/common/SolrDocumentList.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/bulkpostings/solr/src/common/org/apache/solr/common/SolrDocumentList.java?rev=1101062&r1=1101061&r2=1101062&view=diff
==============================================================================
--- lucene/dev/branches/bulkpostings/solr/src/common/org/apache/solr/common/SolrDocumentList.java (original)
+++ lucene/dev/branches/bulkpostings/solr/src/common/org/apache/solr/common/SolrDocumentList.java Mon May  9 15:24:04 2011
@@ -61,7 +61,7 @@ public class SolrDocumentList extends Ar
   public String toString() {
     return "{numFound="+numFound
             +",start="+start
-            + (maxScore!=null ? ""+maxScore : "")
+            + (maxScore!=null ? ",maxScore="+maxScore : "")
             +",docs="+super.toString()
             +"}";
   }

Modified: lucene/dev/branches/bulkpostings/solr/src/common/org/apache/solr/common/params/UpdateParams.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/bulkpostings/solr/src/common/org/apache/solr/common/params/UpdateParams.java?rev=1101062&r1=1101061&r2=1101062&view=diff
==============================================================================
--- lucene/dev/branches/bulkpostings/solr/src/common/org/apache/solr/common/params/UpdateParams.java (original)
+++ lucene/dev/branches/bulkpostings/solr/src/common/org/apache/solr/common/params/UpdateParams.java Mon May  9 15:24:04 2011
@@ -43,8 +43,11 @@ public interface UpdateParams 
   /** Rollback update commands */
   public static String ROLLBACK = "rollback";
 
-  /** Select the update processor to use.  A RequestHandler may or may not respect this parameter */
-  public static final String UPDATE_PROCESSOR = "update.processor";
+  /** Select the update processor chain to use.  A RequestHandler may or may not respect this parameter */
+  public static final String UPDATE_CHAIN = "update.chain";
+  // TODO: Include the old deprecated param, for removal in Solr 4.0
+  public static final String UPDATE_CHAIN_DEPRECATED = "update.processor";
+
   /**
    * If optimizing, set the maximum number of segments left in the index after optimization.  1 is the default (and is equivalent to calling IndexWriter.optimize() in Lucene).
    */

Modified: lucene/dev/branches/bulkpostings/solr/src/java/org/apache/solr/analysis/PathHierarchyTokenizerFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/bulkpostings/solr/src/java/org/apache/solr/analysis/PathHierarchyTokenizerFactory.java?rev=1101062&r1=1101061&r2=1101062&view=diff
==============================================================================
--- lucene/dev/branches/bulkpostings/solr/src/java/org/apache/solr/analysis/PathHierarchyTokenizerFactory.java (original)
+++ lucene/dev/branches/bulkpostings/solr/src/java/org/apache/solr/analysis/PathHierarchyTokenizerFactory.java Mon May  9 15:24:04 2011
@@ -21,6 +21,7 @@ import java.util.Map;
 
 import org.apache.lucene.analysis.Tokenizer;
 import org.apache.lucene.analysis.path.PathHierarchyTokenizer;
+import org.apache.lucene.analysis.path.ReversePathHierarchyTokenizer;
 
 
 /**
@@ -37,6 +38,8 @@ public class PathHierarchyTokenizerFacto
   
   private char delimiter;
   private char replacement;
+  private boolean reverse = false;
+  private int skip =  PathHierarchyTokenizer.DEFAULT_SKIP;
   
   /**
    * Require a configured pattern
@@ -70,10 +73,23 @@ public class PathHierarchyTokenizerFacto
     else{
       replacement = delimiter;
     }
+    
+    v = args.get( "reverse" );
+    if( v != null ){
+      reverse = "true".equals( v );
+    }
+
+    v = args.get( "skip" );
+    if( v != null ){
+      skip = Integer.parseInt( v );
+    }
   }
 
   public Tokenizer create(Reader input) {
-    return new PathHierarchyTokenizer(input, delimiter, replacement);
+    if( reverse ) {
+      return new ReversePathHierarchyTokenizer(input, delimiter, replacement, skip);
+    }
+    return new PathHierarchyTokenizer(input, delimiter, replacement, skip);
   }
 }
 

Modified: lucene/dev/branches/bulkpostings/solr/src/java/org/apache/solr/analysis/SynonymFilterFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/bulkpostings/solr/src/java/org/apache/solr/analysis/SynonymFilterFactory.java?rev=1101062&r1=1101061&r2=1101062&view=diff
==============================================================================
--- lucene/dev/branches/bulkpostings/solr/src/java/org/apache/solr/analysis/SynonymFilterFactory.java (original)
+++ lucene/dev/branches/bulkpostings/solr/src/java/org/apache/solr/analysis/SynonymFilterFactory.java Mon May  9 15:24:04 2011
@@ -61,6 +61,16 @@ public class SynonymFilterFactory extend
       tokFactory = loadTokenizerFactory( loader, tf, args );
     }
 
+    Iterable<String> wlist=loadRules( synonyms, loader );
+    
+    synMap = new SynonymMap(ignoreCase);
+    parseRules(wlist, synMap, "=>", ",", expand,tokFactory);
+  }
+  
+  /**
+   * @return a list of all rules
+   */
+  protected Iterable<String> loadRules( String synonyms, ResourceLoader loader ) {
     List<String> wlist=null;
     try {
       File synonymFile = new File(synonyms);
@@ -77,13 +87,12 @@ public class SynonymFilterFactory extend
     } catch (IOException e) {
       throw new RuntimeException(e);
     }
-    synMap = new SynonymMap(ignoreCase);
-    parseRules(wlist, synMap, "=>", ",", expand,tokFactory);
+    return wlist;
   }
 
   private SynonymMap synMap;
 
-  static void parseRules(List<String> rules, SynonymMap map, String mappingSep,
+  static void parseRules(Iterable<String> rules, SynonymMap map, String mappingSep,
     String synSep, boolean expansion, TokenizerFactory tokFactory) {
     int count=0;
     for (String rule : rules) {

Modified: lucene/dev/branches/bulkpostings/solr/src/java/org/apache/solr/core/AbstractSolrEventListener.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/bulkpostings/solr/src/java/org/apache/solr/core/AbstractSolrEventListener.java?rev=1101062&r1=1101061&r2=1101062&view=diff
==============================================================================
--- lucene/dev/branches/bulkpostings/solr/src/java/org/apache/solr/core/AbstractSolrEventListener.java (original)
+++ lucene/dev/branches/bulkpostings/solr/src/java/org/apache/solr/core/AbstractSolrEventListener.java Mon May  9 15:24:04 2011
@@ -23,7 +23,7 @@ import org.apache.solr.search.SolrIndexS
 
 /**
  */
-class AbstractSolrEventListener implements SolrEventListener {
+public class AbstractSolrEventListener implements SolrEventListener {
   protected final SolrCore core;
   public AbstractSolrEventListener(SolrCore core) {
     this.core = core;

Modified: lucene/dev/branches/bulkpostings/solr/src/java/org/apache/solr/core/CoreContainer.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/bulkpostings/solr/src/java/org/apache/solr/core/CoreContainer.java?rev=1101062&r1=1101061&r2=1101062&view=diff
==============================================================================
--- lucene/dev/branches/bulkpostings/solr/src/java/org/apache/solr/core/CoreContainer.java (original)
+++ lucene/dev/branches/bulkpostings/solr/src/java/org/apache/solr/core/CoreContainer.java Mon May  9 15:24:04 2011
@@ -79,6 +79,7 @@ public class CoreContainer 
   protected Map<String ,IndexSchema> indexSchemaCache;
   protected String adminHandler;
   protected boolean shareSchema;
+  protected Integer zkClientTimeout;
   protected String solrHome;
   protected String defaultCoreName = "";
   private ZkController zkController;
@@ -313,7 +314,7 @@ public class CoreContainer 
     zkHost = cfg.get("solr/@zkHost" , null);
     adminPath = cfg.get("solr/cores/@adminPath", null);
     shareSchema = cfg.getBool("solr/cores/@shareSchema", false);
-    int zkClientTimeout = cfg.getInt("solr/cores/@zkClientTimeout", 10000);
+    zkClientTimeout = cfg.getInt("solr/cores/@zkClientTimeout", 10000);
 
     hostPort = System.getProperty("hostPort");
     if (hostPort == null) {
@@ -500,7 +501,12 @@ public class CoreContainer 
     SolrCore old = null;
     synchronized (cores) {
       old = cores.put(name, core);
+      /*
+      * set both the name of the descriptor and the name of the
+      * core, since the descriptors name is used for persisting.
+      */
       core.setName(name);
+      core.getCoreDescriptor().name = name;
     }
 
     if (zkController != null) {
@@ -884,6 +890,7 @@ public class CoreContainer 
     if (this.libDir != null) {
       writeAttribute(w,"sharedLib",libDir);
     }
+    if(zkHost != null) writeAttribute(w, "zkHost", zkHost);
     writeAttribute(w,"persistent",isPersistent());
     w.write(">\n");
 
@@ -892,9 +899,13 @@ public class CoreContainer 
     }
     w.write("  <cores");
     writeAttribute(w, "adminPath",adminPath);
-    if(adminHandler != null) writeAttribute(w, "adminHandler",adminHandler);
-    if(shareSchema) writeAttribute(w, "shareSchema","true");
-    if(!defaultCoreName.equals("")) writeAttribute(w, "defaultCoreName",defaultCoreName);
+    if(adminHandler != null) writeAttribute(w, "adminHandler", adminHandler);
+    if(shareSchema) writeAttribute(w, "shareSchema", "true");
+    if(!defaultCoreName.equals("")) writeAttribute(w, "defaultCoreName", defaultCoreName);
+    if(host != null) writeAttribute(w, "host", host);
+    if(hostPort != null) writeAttribute(w, "hostPort", hostPort);
+    if(zkClientTimeout != null) writeAttribute(w, "zkClientTimeout", zkClientTimeout);
+    if(hostContext != null) writeAttribute(w, "hostContext", hostContext);
     w.write(">\n");
 
     synchronized(cores) {

Modified: lucene/dev/branches/bulkpostings/solr/src/java/org/apache/solr/core/QuerySenderListener.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/bulkpostings/solr/src/java/org/apache/solr/core/QuerySenderListener.java?rev=1101062&r1=1101061&r2=1101062&view=diff
==============================================================================
--- lucene/dev/branches/bulkpostings/solr/src/java/org/apache/solr/core/QuerySenderListener.java (original)
+++ lucene/dev/branches/bulkpostings/solr/src/java/org/apache/solr/core/QuerySenderListener.java Mon May  9 15:24:04 2011
@@ -32,7 +32,7 @@ import java.util.List;
 /**
  * @version $Id$
  */
-class QuerySenderListener extends AbstractSolrEventListener {
+public class QuerySenderListener extends AbstractSolrEventListener {
   public QuerySenderListener(SolrCore core) {
     super(core);
   }

Modified: lucene/dev/branches/bulkpostings/solr/src/java/org/apache/solr/handler/AnalysisRequestHandlerBase.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/bulkpostings/solr/src/java/org/apache/solr/handler/AnalysisRequestHandlerBase.java?rev=1101062&r1=1101061&r2=1101062&view=diff
==============================================================================
--- lucene/dev/branches/bulkpostings/solr/src/java/org/apache/solr/handler/AnalysisRequestHandlerBase.java (original)
+++ lucene/dev/branches/bulkpostings/solr/src/java/org/apache/solr/handler/AnalysisRequestHandlerBase.java Mon May  9 15:24:04 2011
@@ -337,6 +337,7 @@ public abstract class AnalysisRequestHan
     @Override
     public boolean incrementToken() throws IOException {
       if (tokenIterator.hasNext()) {
+        clearAttributes();
         AttributeSource next = tokenIterator.next();
         Iterator<Class<? extends Attribute>> atts = next.getAttributeClassesIterator();
         while (atts.hasNext()) // make sure all att impls in the token exist here

Modified: lucene/dev/branches/bulkpostings/solr/src/java/org/apache/solr/handler/ContentStreamHandlerBase.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/bulkpostings/solr/src/java/org/apache/solr/handler/ContentStreamHandlerBase.java?rev=1101062&r1=1101061&r2=1101062&view=diff
==============================================================================
--- lucene/dev/branches/bulkpostings/solr/src/java/org/apache/solr/handler/ContentStreamHandlerBase.java (original)
+++ lucene/dev/branches/bulkpostings/solr/src/java/org/apache/solr/handler/ContentStreamHandlerBase.java Mon May  9 15:24:04 2011
@@ -24,6 +24,8 @@ import org.apache.solr.request.SolrQuery
 import org.apache.solr.response.SolrQueryResponse;
 import org.apache.solr.update.processor.UpdateRequestProcessor;
 import org.apache.solr.update.processor.UpdateRequestProcessorChain;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 
 /**
@@ -31,12 +33,22 @@ import org.apache.solr.update.processor.
  *
  **/
 public abstract class ContentStreamHandlerBase extends RequestHandlerBase {
+  public static Logger log = LoggerFactory.getLogger(XmlUpdateRequestHandler.class);
 
   @Override
   public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throws Exception {
     SolrParams params = req.getParams();
+    String updateChainName = null;
+    if(params.get(UpdateParams.UPDATE_CHAIN_DEPRECATED) != null) {
+    	log.warn("Use of deprecated update request parameter "+UpdateParams.UPDATE_CHAIN_DEPRECATED+
+    			 " detected. Please use the new parameter "+UpdateParams.UPDATE_CHAIN+" instead, as support"+
+    			 " for "+UpdateParams.UPDATE_CHAIN_DEPRECATED+" will be removed in a later version.");
+    	updateChainName = params.get(UpdateParams.UPDATE_CHAIN_DEPRECATED);
+    } else {
+    	updateChainName = params.get(UpdateParams.UPDATE_CHAIN);
+    }
     UpdateRequestProcessorChain processorChain =
-            req.getCore().getUpdateProcessingChain(params.get(UpdateParams.UPDATE_PROCESSOR));
+            req.getCore().getUpdateProcessingChain(updateChainName);
 
     UpdateRequestProcessor processor = processorChain.createProcessor(req, rsp);
 

Modified: lucene/dev/branches/bulkpostings/solr/src/java/org/apache/solr/handler/ReplicationHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/bulkpostings/solr/src/java/org/apache/solr/handler/ReplicationHandler.java?rev=1101062&r1=1101061&r2=1101062&view=diff
==============================================================================
--- lucene/dev/branches/bulkpostings/solr/src/java/org/apache/solr/handler/ReplicationHandler.java (original)
+++ lucene/dev/branches/bulkpostings/solr/src/java/org/apache/solr/handler/ReplicationHandler.java Mon May  9 15:24:04 2011
@@ -843,9 +843,13 @@ public class ReplicationHandler extends 
                 indexCommitPoint = reader.getIndexCommit();
               }
             } finally {
+              // We don't need to save commit points for replication, the SolrDeletionPolicy
+              // always saves the last commit point (and the last optimized commit point, if needed)
+              /***
               if(indexCommitPoint != null){
                 core.getDeletionPolicy().saveCommitPoint(indexCommitPoint.getVersion());
               }
+              ***/
             }
           }
           if (core.getUpdateHandler() instanceof DirectUpdateHandler2) {

Modified: lucene/dev/branches/bulkpostings/solr/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/bulkpostings/solr/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java?rev=1101062&r1=1101061&r2=1101062&view=diff
==============================================================================
--- lucene/dev/branches/bulkpostings/solr/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java (original)
+++ lucene/dev/branches/bulkpostings/solr/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java Mon May  9 15:24:04 2011
@@ -190,7 +190,7 @@ public class CoreAdminHandler extends Re
         }
 
         UpdateRequestProcessorChain processorChain =
-                core.getUpdateProcessingChain(params.get(UpdateParams.UPDATE_PROCESSOR));
+                core.getUpdateProcessingChain(params.get(UpdateParams.UPDATE_CHAIN));
         wrappedReq = new LocalSolrQueryRequest(core, req.getParams());
         UpdateRequestProcessor processor =
                 processorChain.createProcessor(wrappedReq, rsp);