You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by sa...@apache.org on 2013/04/22 16:26:58 UTC

svn commit: r1470539 [1/5] - in /lucene/dev/trunk/solr: ./ contrib/clustering/src/java/org/apache/solr/handler/clustering/carrot2/ contrib/dataimporthandler-extras/src/test/org/apache/solr/handler/dataimport/ contrib/dataimporthandler/src/java/org/apac...

Author: sarowe
Date: Mon Apr 22 14:26:55 2013
New Revision: 1470539

URL: http://svn.apache.org/r1470539
Log:
SOLR-3251: Dynamically add fields to schema.

Added:
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/rest/POSTable.java   (with props)
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/rest/PUTable.java   (with props)
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/ZkIndexSchemaReader.java   (with props)
    lucene/dev/trunk/solr/core/src/test-files/solr/collection1/conf/schema-id-and-version-fields-only.xml   (with props)
    lucene/dev/trunk/solr/core/src/test-files/solr/collection1/conf/schema-one-field-no-dynamic-field.xml   (with props)
    lucene/dev/trunk/solr/core/src/test-files/solr/collection1/conf/solrconfig-mutable-managed-schema.xml   (with props)
    lucene/dev/trunk/solr/core/src/test-files/solr/collection1/conf/solrconfig-tlog-mutable-managed-schema.xml   (with props)
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/rest/schema/TestManagedSchemaFieldResource.java   (with props)
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/schema/TestCloudManagedSchemaAddField.java   (with props)
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/TestAddFieldRealTimeGet.java   (with props)
Removed:
    lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/config/Document.java
Modified:
    lucene/dev/trunk/solr/CHANGES.txt
    lucene/dev/trunk/solr/contrib/clustering/src/java/org/apache/solr/handler/clustering/carrot2/CarrotClusteringEngine.java
    lucene/dev/trunk/solr/contrib/clustering/src/java/org/apache/solr/handler/clustering/carrot2/SolrStopwordsCarrot2LexicalDataFactory.java
    lucene/dev/trunk/solr/contrib/dataimporthandler-extras/src/test/org/apache/solr/handler/dataimport/TestMailEntityProcessor.java
    lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DataImportHandler.java
    lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DataImporter.java
    lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DocBuilder.java
    lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/RequestInfo.java
    lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/config/ConfigParseUtil.java
    lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/config/DIHConfiguration.java
    lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/config/Entity.java
    lucene/dev/trunk/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestContextImpl.java
    lucene/dev/trunk/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestDocBuilder.java
    lucene/dev/trunk/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestFieldReader.java
    lucene/dev/trunk/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestPlainTextEntityProcessor.java
    lucene/dev/trunk/solr/contrib/extraction/src/java/org/apache/solr/handler/extraction/ExtractingDocumentLoader.java
    lucene/dev/trunk/solr/contrib/uima/src/java/org/apache/solr/uima/processor/UIMAUpdateRequestProcessor.java
    lucene/dev/trunk/solr/contrib/uima/src/test/org/apache/solr/uima/analysis/UIMATokenizersSolrIntegrationTest.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/AbstractSolrEventListener.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/ConfigSolrXml.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/CoreContainer.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/IndexReaderFactory.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/QuerySenderListener.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SchemaCodecFactory.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrCore.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/FieldAnalysisRequestHandler.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/admin/SystemInfoHandler.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/QueryElevationComponent.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/RealTimeGetComponent.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/ResponseLogComponent.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/SpellCheckComponent.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/StatsComponent.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/request/SolrQueryRequest.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/request/SolrQueryRequestBase.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/rest/schema/BaseSchemaResource.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/rest/schema/FieldCollectionResource.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/rest/schema/FieldResource.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/AbstractSubTypeFieldType.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/ClassicIndexSchemaFactory.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/CurrencyField.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/ExternalFileField.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/ExternalFileFieldReloader.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/FieldProperties.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/FieldType.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/IndexSchema.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/IndexSchemaFactory.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/LatLonType.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/ManagedIndexSchema.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/ManagedIndexSchemaFactory.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/PointType.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/SchemaField.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/SpatialPointVectorFieldType.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/ExtendedDismaxQParser.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/grouping/distributed/requestfactory/TopGroupsShardRequestFactory.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/grouping/distributed/shardresultserializer/TopGroupsResultTransformer.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/similarities/SchemaSimilarityFactory.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/servlet/SolrRequestParsers.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/spelling/FileBasedSpellChecker.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/spelling/SolrSpellChecker.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/spelling/suggest/fst/AnalyzingLookupFactory.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/spelling/suggest/fst/FuzzyLookupFactory.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/DefaultSolrCoreState.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/DirectUpdateHandler2.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/DocumentBuilder.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/SolrIndexSplitter.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/UpdateHandler.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/VersionInfo.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/processor/CloneFieldUpdateProcessorFactory.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/processor/ConcatFieldUpdateProcessorFactory.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/processor/FieldMutatingUpdateProcessor.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/processor/FieldMutatingUpdateProcessorFactory.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/processor/IgnoreFieldUpdateProcessorFactory.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/processor/PreAnalyzedUpdateProcessorFactory.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/processor/SignatureUpdateProcessorFactory.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/util/SolrPluginUtils.java
    lucene/dev/trunk/solr/core/src/test-files/solr/collection1/conf/solrconfig-tlog-managed-schema.xml
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/MinimalSchemaTest.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/TestGroupingSearch.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/TestJoin.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/TestTrie.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/analysis/TestLuceneMatchVersion.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/core/SolrCoreTest.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/core/TestCodecSupport.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/core/TestCoreContainer.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/core/TestMergePolicyConfig.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/core/TestQuerySenderListener.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/core/TestQuerySenderNoQuery.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/core/TestSolrIndexConfig.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/core/TestXIncludeConfig.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/DocumentAnalysisRequestHandlerTest.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/FieldAnalysisRequestHandlerTest.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/component/StatsComponentTest.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/highlight/TestPostingsSolrHighlighter.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/request/SimpleFacetsTest.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/request/TestFaceting.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/rest/schema/TestFieldResource.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/schema/AbstractCurrencyFieldTest.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/schema/CopyFieldTest.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/schema/DocValuesTest.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/schema/IndexSchemaRuntimeFieldTest.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/schema/IndexSchemaTest.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/schema/MultiTermTest.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/schema/NotRequiredUniqueKeyTest.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/schema/PolyFieldTest.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/schema/PreAnalyzedFieldTest.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/schema/RequiredFieldsTest.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/schema/SchemaVersionSpecificBehaviorTest.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/schema/SynonymTokenizerTest.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/schema/TestManagedSchema.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/QueryParsingTest.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/search/TestPseudoReturnFields.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/update/DirectUpdateHandlerTest.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/update/DocumentBuilderTest.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/update/TestIndexingPerformance.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/update/processor/FieldMutatingUpdateProcessorTest.java
    lucene/dev/trunk/solr/core/src/test/org/apache/solr/util/SolrPluginUtilsTest.java
    lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/BaseDistributedSearchTestCase.java
    lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/util/RestTestBase.java
    lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/util/RestTestHarness.java

Modified: lucene/dev/trunk/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/CHANGES.txt?rev=1470539&r1=1470538&r2=1470539&view=diff
==============================================================================
--- lucene/dev/trunk/solr/CHANGES.txt (original)
+++ lucene/dev/trunk/solr/CHANGES.txt Mon Apr 22 14:26:55 2013
@@ -54,6 +54,11 @@ Upgrading from Solr 4.3.0
 Detailed Change List
 ----------------------
 
+New Features
+----------------------
+
+* SOLR-3251: Dynamically add fields to schema. (Steve Rowe, Robert Muir, yonik)   
+
 Bug Fixes
 ----------------------
 

Modified: lucene/dev/trunk/solr/contrib/clustering/src/java/org/apache/solr/handler/clustering/carrot2/CarrotClusteringEngine.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/contrib/clustering/src/java/org/apache/solr/handler/clustering/carrot2/CarrotClusteringEngine.java?rev=1470539&r1=1470538&r2=1470539&view=diff
==============================================================================
--- lucene/dev/trunk/solr/contrib/clustering/src/java/org/apache/solr/handler/clustering/carrot2/CarrotClusteringEngine.java (original)
+++ lucene/dev/trunk/solr/contrib/clustering/src/java/org/apache/solr/handler/clustering/carrot2/CarrotClusteringEngine.java Mon Apr 22 14:26:55 2013
@@ -17,7 +17,10 @@ package org.apache.solr.handler.clusteri
  * limitations under the License.
  */
 
-import java.io.*;
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -278,8 +281,8 @@ public class CarrotClusteringEngine exte
       attributeBuilder.stemmerFactory(LuceneCarrot2StemmerFactory.class);
     }
 
-    // Pass the schema to SolrStopwordsCarrot2LexicalDataFactory.
-    initAttributes.put("solrIndexSchema", core.getSchema());
+    // Pass the schema (via the core) to SolrStopwordsCarrot2LexicalDataFactory.
+    initAttributes.put("solrCore", core);
 
     // Customize Carrot2's resource lookup to first look for resources
     // using Solr's resource loader. If that fails, try loading from the classpath.
@@ -303,7 +306,7 @@ public class CarrotClusteringEngine exte
       ct.setContextClassLoader(prev);
     }
 
-    SchemaField uniqueField = core.getSchema().getUniqueKeyField();
+    SchemaField uniqueField = core.getLatestSchema().getUniqueKeyField();
     if (uniqueField == null) {
       throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, 
           CarrotClusteringEngine.class.getSimpleName() + " requires the schema to have a uniqueKeyField");

Modified: lucene/dev/trunk/solr/contrib/clustering/src/java/org/apache/solr/handler/clustering/carrot2/SolrStopwordsCarrot2LexicalDataFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/contrib/clustering/src/java/org/apache/solr/handler/clustering/carrot2/SolrStopwordsCarrot2LexicalDataFactory.java?rev=1470539&r1=1470538&r2=1470539&view=diff
==============================================================================
--- lucene/dev/trunk/solr/contrib/clustering/src/java/org/apache/solr/handler/clustering/carrot2/SolrStopwordsCarrot2LexicalDataFactory.java (original)
+++ lucene/dev/trunk/solr/contrib/clustering/src/java/org/apache/solr/handler/clustering/carrot2/SolrStopwordsCarrot2LexicalDataFactory.java Mon Apr 22 14:26:55 2013
@@ -26,8 +26,7 @@ import org.apache.lucene.analysis.util.T
 import org.apache.lucene.analysis.commongrams.CommonGramsFilterFactory;
 import org.apache.lucene.analysis.core.StopFilterFactory;
 import org.apache.solr.analysis.TokenizerChain;
-import org.apache.solr.schema.IndexSchema;
-import org.apache.solr.schema.ManagedIndexSchema;
+import org.apache.solr.core.SolrCore;
 import org.carrot2.core.LanguageCode;
 import org.carrot2.core.attribute.Init;
 import org.carrot2.core.attribute.Processing;
@@ -38,7 +37,6 @@ import org.carrot2.text.util.MutableChar
 import org.carrot2.util.attribute.Attribute;
 import org.carrot2.util.attribute.Bindable;
 import org.carrot2.util.attribute.Input;
-import org.carrot2.util.attribute.constraint.ImplementingClasses;
 import org.slf4j.Logger;
 
 import com.google.common.collect.HashMultimap;
@@ -61,9 +59,8 @@ public class SolrStopwordsCarrot2Lexical
 
   @Init
   @Input
-  @Attribute(key = "solrIndexSchema")
-  @ImplementingClasses(classes = { IndexSchema.class, ManagedIndexSchema.class })
-  private IndexSchema schema;
+  @Attribute(key = "solrCore")
+  private SolrCore core;
 
   @Processing
   @Input
@@ -89,7 +86,7 @@ public class SolrStopwordsCarrot2Lexical
     // No need to synchronize here, Carrot2 ensures that instances
     // of this class are not used by multiple threads at a time.
     if (!solrStopWords.containsKey(fieldName)) {
-      final Analyzer fieldAnalyzer = schema.getFieldType(fieldName)
+      final Analyzer fieldAnalyzer = core.getLatestSchema().getFieldType(fieldName)
           .getAnalyzer();
       if (fieldAnalyzer instanceof TokenizerChain) {
         final TokenFilterFactory[] filterFactories = ((TokenizerChain) fieldAnalyzer)

Modified: lucene/dev/trunk/solr/contrib/dataimporthandler-extras/src/test/org/apache/solr/handler/dataimport/TestMailEntityProcessor.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/contrib/dataimporthandler-extras/src/test/org/apache/solr/handler/dataimport/TestMailEntityProcessor.java?rev=1470539&r1=1470538&r2=1470539&view=diff
==============================================================================
--- lucene/dev/trunk/solr/contrib/dataimporthandler-extras/src/test/org/apache/solr/handler/dataimport/TestMailEntityProcessor.java (original)
+++ lucene/dev/trunk/solr/contrib/dataimporthandler-extras/src/test/org/apache/solr/handler/dataimport/TestMailEntityProcessor.java Mon Apr 22 14:26:55 2013
@@ -65,7 +65,7 @@ public class TestMailEntityProcessor ext
     DataImporter di = new DataImporter();
     di.loadAndInit(getConfigFromMap(paramMap));
     Entity ent = di.getConfig().getEntities().get(0);
-    RequestInfo rp = new RequestInfo(createMap("command", "full-import"), null);
+    RequestInfo rp = new RequestInfo(null, createMap("command", "full-import"), null);
     SolrWriterImpl swi = new SolrWriterImpl();
     di.runCmd(rp, swi);
     assertEquals("top1 did not return 2 messages", swi.docs.size(), 2);
@@ -80,7 +80,7 @@ public class TestMailEntityProcessor ext
     DataImporter di = new DataImporter();
     di.loadAndInit(getConfigFromMap(paramMap));
     Entity ent = di.getConfig().getEntities().get(0);
-    RequestInfo rp = new RequestInfo(createMap("command", "full-import"), null);
+    RequestInfo rp = new RequestInfo(null, createMap("command", "full-import"), null);
     SolrWriterImpl swi = new SolrWriterImpl();
     di.runCmd(rp, swi);
     assertEquals("top2 and its children did not return 8 messages", swi.docs.size(), 8);
@@ -96,7 +96,7 @@ public class TestMailEntityProcessor ext
     DataImporter di = new DataImporter();
     di.loadAndInit(getConfigFromMap(paramMap));
     Entity ent = di.getConfig().getEntities().get(0);
-    RequestInfo rp = new RequestInfo(createMap("command", "full-import"), null);
+    RequestInfo rp = new RequestInfo(null, createMap("command", "full-import"), null);
     SolrWriterImpl swi = new SolrWriterImpl();
     di.runCmd(rp, swi);
     assertEquals("top2 and its direct children did not return 5 messages", swi.docs.size(), 5);
@@ -112,7 +112,7 @@ public class TestMailEntityProcessor ext
     DataImporter di = new DataImporter();
     di.loadAndInit(getConfigFromMap(paramMap));
     Entity ent = di.getConfig().getEntities().get(0);
-    RequestInfo rp = new RequestInfo(createMap("command", "full-import"), null);
+    RequestInfo rp = new RequestInfo(null, createMap("command", "full-import"), null);
     SolrWriterImpl swi = new SolrWriterImpl();
     di.runCmd(rp, swi);
     assertEquals("top2 and its direct children did not return 3 messages", swi.docs.size(), 3);
@@ -129,7 +129,7 @@ public class TestMailEntityProcessor ext
     DataImporter di = new DataImporter();
     di.loadAndInit(getConfigFromMap(paramMap));
     Entity ent = di.getConfig().getEntities().get(0);
-    RequestInfo rp = new RequestInfo(createMap("command", "full-import"), null);
+    RequestInfo rp = new RequestInfo(null, createMap("command", "full-import"), null);
     SolrWriterImpl swi = new SolrWriterImpl();
     di.runCmd(rp, swi);
     assertEquals("top2 and its direct children did not return 3 messages", swi.docs.size(), 3);
@@ -145,7 +145,7 @@ public class TestMailEntityProcessor ext
     DataImporter di = new DataImporter();
     di.loadAndInit(getConfigFromMap(paramMap));
     Entity ent = di.getConfig().getEntities().get(0);
-    RequestInfo rp = new RequestInfo(createMap("command", "full-import"), null);
+    RequestInfo rp = new RequestInfo(null, createMap("command", "full-import"), null);
     SolrWriterImpl swi = new SolrWriterImpl();
     di.runCmd(rp, swi);
     assertEquals("top2 and its direct children did not return 3 messages", swi.docs.size(), 3);

Modified: lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DataImportHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DataImportHandler.java?rev=1470539&r1=1470538&r2=1470539&view=diff
==============================================================================
--- lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DataImportHandler.java (original)
+++ lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DataImportHandler.java Mon Apr 22 14:26:55 2013
@@ -124,7 +124,7 @@ public class DataImportHandler extends R
     }
     SolrParams params = req.getParams();
     NamedList defaultParams = (NamedList) initArgs.get("defaults");
-    RequestInfo requestParams = new RequestInfo(getParamsMap(params), contentStream);
+    RequestInfo requestParams = new RequestInfo(req, getParamsMap(params), contentStream);
     String command = requestParams.getCommand();
     
     if (DataImporter.SHOW_CONF_CMD.equals(command)) {    

Modified: lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DataImporter.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DataImporter.java?rev=1470539&r1=1470538&r2=1470539&view=diff
==============================================================================
--- lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DataImporter.java (original)
+++ lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DataImporter.java Mon Apr 22 14:26:55 2013
@@ -20,9 +20,7 @@ package org.apache.solr.handler.dataimpo
 import org.apache.solr.common.SolrException;
 import org.apache.solr.core.SolrCore;
 import org.apache.solr.schema.IndexSchema;
-import org.apache.solr.schema.SchemaField;
 import org.apache.solr.util.SystemIdResolver;
-import org.apache.solr.common.params.SolrParams;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.util.XMLErrorLogger;
 import org.apache.solr.handler.dataimport.config.ConfigNameConstants;
@@ -36,7 +34,6 @@ import static org.apache.solr.handler.da
 import static org.apache.solr.handler.dataimport.DataImportHandlerException.SEVERE;
 import static org.apache.solr.handler.dataimport.DocBuilder.loadClass;
 import static org.apache.solr.handler.dataimport.config.ConfigNameConstants.CLASS;
-import static org.apache.solr.handler.dataimport.config.ConfigNameConstants.NAME;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -51,8 +48,14 @@ import javax.xml.parsers.DocumentBuilder
 
 import java.io.IOException;
 import java.io.StringReader;
-import java.text.SimpleDateFormat;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicLong;
 import java.util.concurrent.locks.ReentrantLock;
@@ -86,7 +89,6 @@ public class DataImporter {
   private ReentrantLock importLock = new ReentrantLock();
   private boolean isDeltaImportSupported = false;  
   private final String handlerName;  
-  private Map<String, SchemaField> lowerNameVsSchemaField = new HashMap<String, SchemaField>();
 
   /**
    * Only for testing purposes
@@ -98,8 +100,7 @@ public class DataImporter {
   DataImporter(SolrCore core, String handlerName) {
     this.handlerName = handlerName;
     this.core = core;
-    this.schema = core.getSchema();
-    loadSchemaFieldMap();   
+    this.schema = core.getLatestSchema();
   }
   
   
@@ -110,8 +111,13 @@ public class DataImporter {
   if (importLock.tryLock()) {
       boolean success = false;
       try {        
+        if (null != params.getRequest()) {
+          if (schema != params.getRequest().getSchema()) {
+            schema = params.getRequest().getSchema();
+          }
+        }
         String dataConfigText = params.getDataConfig();
-        String dataconfigFile = (String) params.getConfigFile();        
+        String dataconfigFile = params.getConfigFile();        
         InputSource is = null;
         if(dataConfigText!=null && dataConfigText.length()>0) {
           is = new InputSource(new StringReader(dataConfigText));
@@ -161,31 +167,14 @@ public class DataImporter {
   
   
   
-  private void loadSchemaFieldMap() {
-    Map<String, SchemaField> modLnvsf = new HashMap<String, SchemaField>();
-    for (Map.Entry<String, SchemaField> entry : schema.getFields().entrySet()) {
-      modLnvsf.put(entry.getKey().toLowerCase(Locale.ROOT), entry.getValue());
-    }
-    lowerNameVsSchemaField = Collections.unmodifiableMap(modLnvsf);
-  }
-  
-  public SchemaField getSchemaField(String caseInsensitiveName) {
-    SchemaField schemaField = null;
-    if(schema!=null) {
-      schemaField = schema.getFieldOrNull(caseInsensitiveName);
-    }
-    if (schemaField == null) {
-      schemaField = lowerNameVsSchemaField.get(caseInsensitiveName.toLowerCase(Locale.ROOT));
-    }
-    return schemaField;
+  public String getHandlerName() {
+    return handlerName;
   }
 
-   public String getHandlerName() {
-        return handlerName;
-    }
-
-    
-
+  public IndexSchema getSchema() {
+    return schema;
+  }
+  
   /**
    * Used by tests
    */
@@ -581,11 +570,7 @@ public class DataImporter {
     public static final String TOTAL_DOCS_SKIPPED = "Total Documents Skipped";
   }
 
-  public IndexSchema getSchema() {
-    return schema;
-  }
-
-  SolrCore getCore() {
+  public SolrCore getCore() {
     return core;
   }
   

Modified: lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DocBuilder.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DocBuilder.java?rev=1470539&r1=1470538&r2=1470539&view=diff
==============================================================================
--- lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DocBuilder.java (original)
+++ lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DocBuilder.java Mon Apr 22 14:26:55 2013
@@ -26,7 +26,9 @@ import org.apache.solr.handler.dataimpor
 import org.apache.solr.handler.dataimport.config.EntityField;
 
 import static org.apache.solr.handler.dataimport.SolrWriter.LAST_INDEX_KEY;
-import static org.apache.solr.handler.dataimport.DataImportHandlerException.*;
+import static org.apache.solr.handler.dataimport.DataImportHandlerException.SEVERE;
+import static org.apache.solr.handler.dataimport.DataImportHandlerException.wrapAndThrow;
+import org.apache.solr.schema.IndexSchema;
 import org.apache.solr.schema.SchemaField;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -625,11 +627,12 @@ public class DocBuilder {
       if (value == null)  continue;
       if (key.startsWith("$")) continue;
       Set<EntityField> field = entity.getColNameVsField().get(key);
-      if (field == null && dataImporter.getSchema() != null) {
+      IndexSchema schema = null == reqParams.getRequest() ? null : reqParams.getRequest().getSchema();
+      if (field == null && schema != null) {
         // This can be a dynamic field or a field which does not have an entry in data-config ( an implicit field)
-        SchemaField sf = dataImporter.getSchema().getFieldOrNull(key);
+        SchemaField sf = schema.getFieldOrNull(key);
         if (sf == null) {
-          sf = dataImporter.getSchemaField(key);
+          sf = config.getSchemaField(key);
         }
         if (sf != null) {
           addFieldToDoc(entry.getValue(), sf.getName(), 1.0f, sf.multiValued(), doc);
@@ -643,7 +646,7 @@ public class DocBuilder {
             boolean toWrite = f.isToWrite();
             if(f.isDynamicName()){
               name =  vr.replaceTokens(name);
-              SchemaField schemaField = dataImporter.getSchemaField(name);
+              SchemaField schemaField = config.getSchemaField(name);
               if(schemaField == null) {
                 toWrite = false;
               } else {

Modified: lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/RequestInfo.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/RequestInfo.java?rev=1470539&r1=1470538&r2=1470539&view=diff
==============================================================================
--- lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/RequestInfo.java (original)
+++ lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/RequestInfo.java Mon Apr 22 14:26:55 2013
@@ -24,6 +24,7 @@ import java.util.Map;
 
 import org.apache.solr.common.util.ContentStream;
 import org.apache.solr.common.util.StrUtils;
+import org.apache.solr.request.SolrQueryRequest;
 
 public class RequestInfo {
   private final String command;
@@ -37,13 +38,15 @@ public class RequestInfo {
   private final List<String> entitiesToRun;
   private final Map<String,Object> rawParams;
   private final String configFile;
-  private final String dataConfig;  
+  private final String dataConfig;
+  private final SolrQueryRequest request;
   
   //TODO:  find a different home for these two...
   private final ContentStream contentStream;  
   private final DebugInfo debugInfo;
   
-  public RequestInfo(Map<String,Object> requestParams, ContentStream stream) {
+  public RequestInfo(SolrQueryRequest request, Map<String,Object> requestParams, ContentStream stream) {
+    this.request = request;
     this.contentStream = stream;    
     if (requestParams.containsKey("command")) { 
       command = (String) requestParams.get("command");
@@ -167,4 +170,8 @@ public class RequestInfo {
   public String getConfigFile() {
     return configFile;
   }
+
+  public SolrQueryRequest getRequest() {
+    return request;
+  }
 }
\ No newline at end of file

Modified: lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/config/ConfigParseUtil.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/config/ConfigParseUtil.java?rev=1470539&r1=1470538&r2=1470539&view=diff
==============================================================================
--- lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/config/ConfigParseUtil.java (original)
+++ lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/config/ConfigParseUtil.java Mon Apr 22 14:26:55 2013
@@ -23,6 +23,7 @@ import java.util.List;
 import java.util.Map;
 
 import org.apache.solr.handler.dataimport.DataImporter;
+import org.apache.solr.schema.IndexSchema;
 import org.apache.solr.schema.SchemaField;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -32,7 +33,6 @@ import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 
 public class ConfigParseUtil {
-  private static final Logger LOG = LoggerFactory .getLogger(ConfigParseUtil.class);
   
   public static String getStringAttribute(Element e, String name, String def) {
     String r = e.getAttribute(name);
@@ -77,46 +77,4 @@ public class ConfigParseUtil {
     }
     return result;
   }
-  
-  public static void verifyWithSchema(DataImporter di, Map<String,EntityField> fields) {
-    Map<String,SchemaField> schemaFields = null;
-    if (di.getSchema() == null) {
-      schemaFields = Collections.emptyMap();
-    } else {
-      schemaFields = di.getSchema().getFields();
-    }
-    for (Map.Entry<String,SchemaField> entry : schemaFields.entrySet()) {
-      SchemaField sf = entry.getValue();
-      if (!fields.containsKey(sf.getName())) {
-        if (sf.isRequired()) {
-          LOG
-              .info(sf.getName()
-                  + " is a required field in SolrSchema . But not found in DataConfig");
-        }
-      }
-    }
-    for (Map.Entry<String,EntityField> entry : fields.entrySet()) {
-      EntityField fld = entry.getValue();
-      SchemaField field = di.getSchemaField(fld.getName());
-      if (field == null) {
-        LOG
-            .info("The field :"
-                + fld.getName()
-                + " present in DataConfig does not have a counterpart in Solr Schema");
-      }
-    }
-  }
-  
-  public static Map<String,EntityField> gatherAllFields(DataImporter di, Entity e) {
-    Map<String,EntityField> fields = new HashMap<String,EntityField>();
-    if (e.getFields() != null) {
-      for (EntityField f : e.getFields()) {
-        fields.put(f.getName(), f);
-      }
-    }
-    for (Entity e1 : e.getChildren()) {
-      fields.putAll(gatherAllFields(di, e1));
-    }
-    return fields;
-  }
 }

Modified: lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/config/DIHConfiguration.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/config/DIHConfiguration.java?rev=1470539&r1=1470538&r2=1470539&view=diff
==============================================================================
--- lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/config/DIHConfiguration.java (original)
+++ lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/config/DIHConfiguration.java Mon Apr 22 14:26:55 2013
@@ -2,10 +2,16 @@ package org.apache.solr.handler.dataimpo
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 
 import org.apache.solr.handler.dataimport.DataImporter;
+import org.apache.solr.schema.IndexSchema;
+import org.apache.solr.schema.SchemaField;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.w3c.dom.Element;
 
 /*
@@ -41,6 +47,8 @@ import org.w3c.dom.Element;
  * @since solr 1.3
  */
 public class DIHConfiguration {
+  private static final Logger LOG = LoggerFactory.getLogger(DIHConfiguration.class);
+
   // TODO - remove from here and add it to entity
   private final String deleteQuery;
   
@@ -51,10 +59,14 @@ public class DIHConfiguration {
   private final Script script;
   private final Map<String, Map<String,String>> dataSources;
   private final PropertyWriter propertyWriter;
+  private final IndexSchema schema;
+  private final Map<String,SchemaField> lowerNameVsSchemaField;
   
   public DIHConfiguration(Element element, DataImporter di,
       List<Map<String,String>> functions, Script script,
       Map<String,Map<String,String>> dataSources, PropertyWriter pw) {
+    schema = di.getSchema();
+    lowerNameVsSchemaField = null == schema ? Collections.<String,SchemaField>emptyMap() : loadSchemaFieldMap();
     this.deleteQuery = ConfigParseUtil.getStringAttribute(element, "deleteQuery", null);
     this.onImportStart = ConfigParseUtil.getStringAttribute(element, "onImportStart", null);
     this.onImportEnd = ConfigParseUtil.getStringAttribute(element, "onImportEnd", null);
@@ -62,9 +74,9 @@ public class DIHConfiguration {
     List<Element> l = ConfigParseUtil.getChildNodes(element, "entity");
     boolean docRootFound = false;
     for (Element e : l) {
-      Entity entity = new Entity(docRootFound, e, di, null);
-      Map<String, EntityField> fields = ConfigParseUtil.gatherAllFields(di, entity);
-      ConfigParseUtil.verifyWithSchema(di, fields);    
+      Entity entity = new Entity(docRootFound, e, di, this, null);
+      Map<String, EntityField> fields = gatherAllFields(di, entity);
+      verifyWithSchema(fields);    
       modEntities.add(entity);
     }
     this.entities = Collections.unmodifiableList(modEntities);
@@ -80,6 +92,64 @@ public class DIHConfiguration {
     this.dataSources = Collections.unmodifiableMap(dataSources);
     this.propertyWriter = pw;
   }
+
+  private void verifyWithSchema(Map<String,EntityField> fields) {
+    Map<String,SchemaField> schemaFields = null;
+    if (schema == null) {
+      schemaFields = Collections.emptyMap();
+    } else {
+      schemaFields = schema.getFields();
+    }
+    for (Map.Entry<String,SchemaField> entry : schemaFields.entrySet()) {
+      SchemaField sf = entry.getValue();
+      if (!fields.containsKey(sf.getName())) {
+        if (sf.isRequired()) {
+          LOG.info(sf.getName() + " is a required field in SolrSchema . But not found in DataConfig");
+        }
+      }
+    }
+    for (Map.Entry<String,EntityField> entry : fields.entrySet()) {
+      EntityField fld = entry.getValue();
+      SchemaField field = getSchemaField(fld.getName());
+      if (field == null) {
+        LOG.info("The field :" + fld.getName() + " present in DataConfig does not have a counterpart in Solr Schema");
+      }
+    }
+  }
+
+  private Map<String,EntityField> gatherAllFields(DataImporter di, Entity e) {
+    Map<String,EntityField> fields = new HashMap<String,EntityField>();
+    if (e.getFields() != null) {
+      for (EntityField f : e.getFields()) {
+        fields.put(f.getName(), f);
+      }
+    }
+    for (Entity e1 : e.getChildren()) {
+      fields.putAll(gatherAllFields(di, e1));
+    }
+    return fields;
+  }
+
+  private Map<String,SchemaField> loadSchemaFieldMap() {
+    Map<String, SchemaField> modLnvsf = new HashMap<String, SchemaField>();
+    for (Map.Entry<String, SchemaField> entry : schema.getFields().entrySet()) {
+      modLnvsf.put(entry.getKey().toLowerCase(Locale.ROOT), entry.getValue());
+    }
+    return Collections.unmodifiableMap(modLnvsf);
+  }
+
+  public SchemaField getSchemaField(String caseInsensitiveName) {
+    SchemaField schemaField = null;
+    if(schema!=null) {
+      schemaField = schema.getFieldOrNull(caseInsensitiveName);
+    }
+    if (schemaField == null) {
+      schemaField = lowerNameVsSchemaField.get(caseInsensitiveName.toLowerCase(Locale.ROOT));
+    }
+    return schemaField;
+  }
+
+
   public String getDeleteQuery() {
     return deleteQuery;
   }
@@ -104,4 +174,8 @@ public class DIHConfiguration {
   public PropertyWriter getPropertyWriter() {
     return propertyWriter;
   }
+
+  public IndexSchema getSchema() {
+    return schema;
+  }
 }
\ No newline at end of file

Modified: lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/config/Entity.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/config/Entity.java?rev=1470539&r1=1470538&r2=1470539&view=diff
==============================================================================
--- lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/config/Entity.java (original)
+++ lucene/dev/trunk/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/config/Entity.java Mon Apr 22 14:26:55 2013
@@ -29,6 +29,7 @@ import java.util.Set;
 
 import org.apache.solr.handler.dataimport.DataImportHandlerException;
 import org.apache.solr.handler.dataimport.DataImporter;
+import org.apache.solr.schema.IndexSchema;
 import org.apache.solr.schema.SchemaField;
 import org.w3c.dom.Element;
 
@@ -45,9 +46,11 @@ public class Entity {
   private final Map<String,Set<EntityField>> colNameVsField;
   private final Map<String,String> allAttributes;
   private final List<Map<String,String>> allFieldAttributes;
+  private final DIHConfiguration config;
   
-  public Entity(boolean docRootFound, Element element, DataImporter di, Entity parent) {
+  public Entity(boolean docRootFound, Element element, DataImporter di, DIHConfiguration config, Entity parent) {
     this.parentEntity = parent;
+    this.config = config;
     
     String modName = ConfigParseUtil.getStringAttribute(element, ConfigNameConstants.NAME, null);
     if (modName == null) {
@@ -85,13 +88,13 @@ public class Entity {
     List<Map<String,String>> modAllFieldAttributes = new ArrayList<Map<String,String>>();
     for (Element elem : n) {
       EntityField.Builder fieldBuilder = new EntityField.Builder(elem);
-      if (di.getSchema() != null) {
+      if (config.getSchema() != null) {
         if (fieldBuilder.getNameOrColumn() != null
             && fieldBuilder.getNameOrColumn().contains("${")) {
           fieldBuilder.dynamicName = true;
         } else {
-          SchemaField schemaField = di.getSchemaField(fieldBuilder
-              .getNameOrColumn());
+          SchemaField schemaField = config.getSchemaField
+              (fieldBuilder.getNameOrColumn());
           if (schemaField != null) {
             fieldBuilder.name = schemaField.getName();
             fieldBuilder.multiValued = schemaField.multiValued();
@@ -139,8 +142,8 @@ public class Entity {
         .unmodifiableList(modAllFieldAttributes);
     
     String modPkMappingFromSchema = null;
-    if (di.getSchema() != null) {
-      SchemaField uniqueKey = di.getSchema().getUniqueKeyField();
+    if (config.getSchema() != null) {
+      SchemaField uniqueKey = config.getSchema().getUniqueKeyField();
       if (uniqueKey != null) {
         modPkMappingFromSchema = uniqueKey.getName();
         // if no fields are mentioned . solr uniqueKey is same as dih 'pk'
@@ -160,8 +163,7 @@ public class Entity {
     n = ConfigParseUtil.getChildNodes(element, "entity");
     List<Entity> modEntities = new ArrayList<Entity>();
     for (Element elem : n) {
-      modEntities
-          .add(new Entity((docRootFound || this.docRoot), elem, di, this));
+      modEntities.add(new Entity((docRootFound || this.docRoot), elem, di, config, this));
     }
     this.children = Collections.unmodifiableList(modEntities);
   }

Modified: lucene/dev/trunk/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestContextImpl.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestContextImpl.java?rev=1470539&r1=1470538&r2=1470539&view=diff
==============================================================================
--- lucene/dev/trunk/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestContextImpl.java (original)
+++ lucene/dev/trunk/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestContextImpl.java Mon Apr 22 14:26:55 2013
@@ -37,7 +37,7 @@ public class TestContextImpl extends Abs
   public void testCoreScope() {
     DataImporter di = new DataImporter();
     di.loadAndInit("<dataConfig><document /></dataConfig>");
-    DocBuilder db = new DocBuilder(di, new SolrWriter(null, null),new SimplePropertiesWriter(), new RequestInfo(new HashMap<String,Object>(), null));
+    DocBuilder db = new DocBuilder(di, new SolrWriter(null, null),new SimplePropertiesWriter(), new RequestInfo(null, new HashMap<String,Object>(), null));
     ContextImpl ctx = new ContextImpl(null, new VariableResolver(), null, "something", new HashMap<String,Object>(), null, db);
     String lala = new String("lala");
     ctx.setSessionAttribute("huhu", lala, Context.SCOPE_SOLR_CORE);

Modified: lucene/dev/trunk/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestDocBuilder.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestDocBuilder.java?rev=1470539&r1=1470538&r2=1470539&view=diff
==============================================================================
--- lucene/dev/trunk/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestDocBuilder.java (original)
+++ lucene/dev/trunk/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestDocBuilder.java Mon Apr 22 14:26:55 2013
@@ -57,7 +57,7 @@ public class TestDocBuilder extends Abst
     DIHConfiguration cfg = di.getConfig();
     Entity ent = cfg.getEntities().get(0);
     MockDataSource.setIterator("select * from x", new ArrayList<Map<String, Object>>().iterator());
-    RequestInfo rp = new RequestInfo(createMap("command", "full-import"), null);
+    RequestInfo rp = new RequestInfo(null, createMap("command", "full-import"), null);
     SolrWriterImpl swi = new SolrWriterImpl();
     di.runCmd(rp, swi);
     assertEquals(Boolean.TRUE, swi.deleteAllCalled);
@@ -77,7 +77,7 @@ public class TestDocBuilder extends Abst
     Entity ent = cfg.getEntities().get(0);
     MockDataSource.setIterator("select * from x", new ArrayList<Map<String, Object>>().iterator());
     MockDataSource.setIterator("select id from x", new ArrayList<Map<String, Object>>().iterator());
-    RequestInfo rp = new RequestInfo(createMap("command", "delta-import"), null);
+    RequestInfo rp = new RequestInfo(null, createMap("command", "delta-import"), null);
     SolrWriterImpl swi = new SolrWriterImpl();
     di.runCmd(rp, swi);
     assertEquals(Boolean.FALSE, swi.deleteAllCalled);
@@ -98,7 +98,7 @@ public class TestDocBuilder extends Abst
     List<Map<String, Object>> l = new ArrayList<Map<String, Object>>();
     l.add(createMap("id", 1, "desc", "one"));
     MockDataSource.setIterator("select * from x", l.iterator());
-    RequestInfo rp = new RequestInfo(createMap("command", "full-import"), null);
+    RequestInfo rp = new RequestInfo(null, createMap("command", "full-import"), null);
     SolrWriterImpl swi = new SolrWriterImpl();
     di.runCmd(rp, swi);
     assertEquals(Boolean.TRUE, swi.deleteAllCalled);
@@ -127,7 +127,7 @@ public class TestDocBuilder extends Abst
     List<Map<String, Object>> l = new ArrayList<Map<String, Object>>();
     l.add(createMap("id", 1, "desc", "one"));
     MockDataSource.setIterator("select * from x", l.iterator());
-    RequestInfo rp = new RequestInfo(createMap("command", "import"), null);
+    RequestInfo rp = new RequestInfo(null, createMap("command", "import"), null);
     SolrWriterImpl swi = new SolrWriterImpl();
     di.runCmd(rp, swi);
     assertEquals(Boolean.FALSE, swi.deleteAllCalled);
@@ -153,7 +153,7 @@ public class TestDocBuilder extends Abst
     di.loadAndInit(dc_singleEntity);
     DIHConfiguration cfg = di.getConfig();
     Entity ent = cfg.getEntities().get(0);
-    RequestInfo rp = new RequestInfo(createMap("command", "full-import"), null);
+    RequestInfo rp = new RequestInfo(null, createMap("command", "full-import"), null);
     List<Map<String, Object>> l = new ArrayList<Map<String, Object>>();
     l.add(createMap("id", 1, "desc", "one"));
     l.add(createMap("id", 2, "desc", "two"));

Modified: lucene/dev/trunk/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestFieldReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestFieldReader.java?rev=1470539&r1=1470538&r2=1470539&view=diff
==============================================================================
--- lucene/dev/trunk/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestFieldReader.java (original)
+++ lucene/dev/trunk/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestFieldReader.java Mon Apr 22 14:26:55 2013
@@ -36,7 +36,7 @@ public class TestFieldReader extends Abs
     DataImporter di = new DataImporter();
     di.loadAndInit(config);
     TestDocBuilder.SolrWriterImpl sw = new TestDocBuilder.SolrWriterImpl();
-    RequestInfo rp = new RequestInfo(createMap("command", "full-import"), null);
+    RequestInfo rp = new RequestInfo(null, createMap("command", "full-import"), null);
     List<Map<String, Object>> l = new ArrayList<Map<String, Object>>();
     l.add(createMap("xml", xml));
     MockDataSource.setIterator("select * from a", l.iterator());

Modified: lucene/dev/trunk/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestPlainTextEntityProcessor.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestPlainTextEntityProcessor.java?rev=1470539&r1=1470538&r2=1470539&view=diff
==============================================================================
--- lucene/dev/trunk/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestPlainTextEntityProcessor.java (original)
+++ lucene/dev/trunk/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestPlainTextEntityProcessor.java Mon Apr 22 14:26:55 2013
@@ -34,7 +34,7 @@ public class TestPlainTextEntityProcesso
     DataImporter di = new DataImporter();
     di.loadAndInit(DATA_CONFIG);
     TestDocBuilder.SolrWriterImpl sw = new TestDocBuilder.SolrWriterImpl();
-    RequestInfo rp = new RequestInfo(createMap("command", "full-import"), null);
+    RequestInfo rp = new RequestInfo(null, createMap("command", "full-import"), null);
     di.runCmd(rp, sw);
     assertEquals(DS.s, sw.docs.get(0).getFieldValue("x"));
   }

Modified: lucene/dev/trunk/solr/contrib/extraction/src/java/org/apache/solr/handler/extraction/ExtractingDocumentLoader.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/contrib/extraction/src/java/org/apache/solr/handler/extraction/ExtractingDocumentLoader.java?rev=1470539&r1=1470538&r2=1470539&view=diff
==============================================================================
--- lucene/dev/trunk/solr/contrib/extraction/src/java/org/apache/solr/handler/extraction/ExtractingDocumentLoader.java (original)
+++ lucene/dev/trunk/solr/contrib/extraction/src/java/org/apache/solr/handler/extraction/ExtractingDocumentLoader.java Mon Apr 22 14:26:55 2013
@@ -28,10 +28,10 @@ import org.apache.solr.common.params.Upd
 import org.apache.solr.common.util.ContentStream;
 import org.apache.solr.common.util.ContentStreamBase;
 import org.apache.solr.common.util.NamedList;
+import org.apache.solr.core.SolrCore;
 import org.apache.solr.handler.loader.ContentStreamLoader;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.response.SolrQueryResponse;
-import org.apache.solr.schema.IndexSchema;
 import org.apache.solr.update.AddUpdateCommand;
 import org.apache.solr.update.processor.UpdateRequestProcessor;
 import org.apache.tika.config.TikaConfig;
@@ -81,7 +81,7 @@ public class ExtractingDocumentLoader ex
   private static final XPathParser PARSER =
           new XPathParser("xhtml", XHTMLContentHandler.XHTML);
 
-  final IndexSchema schema;
+  final SolrCore core;
   final SolrParams params;
   final UpdateRequestProcessor processor;
   final boolean ignoreTikaException;
@@ -95,7 +95,7 @@ public class ExtractingDocumentLoader ex
   public ExtractingDocumentLoader(SolrQueryRequest req, UpdateRequestProcessor processor,
                            TikaConfig config, SolrContentHandlerFactory factory) {
     this.params = req.getParams();
-    schema = req.getSchema();
+    this.core = req.getCore();
     this.config = config;
     this.processor = processor;
 
@@ -167,7 +167,7 @@ public class ExtractingDocumentLoader ex
 
         String xpathExpr = params.get(ExtractingParams.XPATH_EXPRESSION);
         boolean extractOnly = params.getBool(ExtractingParams.EXTRACT_ONLY, false);
-        SolrContentHandler handler = factory.createSolrContentHandler(metadata, params, schema);
+        SolrContentHandler handler = factory.createSolrContentHandler(metadata, params, req.getSchema());
         ContentHandler parsingHandler = handler;
 
         StringWriter writer = null;

Modified: lucene/dev/trunk/solr/contrib/uima/src/java/org/apache/solr/uima/processor/UIMAUpdateRequestProcessor.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/contrib/uima/src/java/org/apache/solr/uima/processor/UIMAUpdateRequestProcessor.java?rev=1470539&r1=1470538&r2=1470539&view=diff
==============================================================================
--- lucene/dev/trunk/solr/contrib/uima/src/java/org/apache/solr/uima/processor/UIMAUpdateRequestProcessor.java (original)
+++ lucene/dev/trunk/solr/contrib/uima/src/java/org/apache/solr/uima/processor/UIMAUpdateRequestProcessor.java Mon Apr 22 14:26:55 2013
@@ -92,7 +92,7 @@ public class UIMAUpdateRequestProcessor 
     } catch (Exception e) {
       String logField = solrUIMAConfiguration.getLogField();
       if(logField == null){
-        SchemaField uniqueKeyField = solrCore.getSchema().getUniqueKeyField();
+        SchemaField uniqueKeyField = cmd.getReq().getSchema().getUniqueKeyField();
         if(uniqueKeyField != null){
           logField = uniqueKeyField.getName();
         }

Modified: lucene/dev/trunk/solr/contrib/uima/src/test/org/apache/solr/uima/analysis/UIMATokenizersSolrIntegrationTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/contrib/uima/src/test/org/apache/solr/uima/analysis/UIMATokenizersSolrIntegrationTest.java?rev=1470539&r1=1470538&r2=1470539&view=diff
==============================================================================
--- lucene/dev/trunk/solr/contrib/uima/src/test/org/apache/solr/uima/analysis/UIMATokenizersSolrIntegrationTest.java (original)
+++ lucene/dev/trunk/solr/contrib/uima/src/test/org/apache/solr/uima/analysis/UIMATokenizersSolrIntegrationTest.java Mon Apr 22 14:26:55 2013
@@ -19,6 +19,7 @@ package org.apache.solr.uima.analysis;
 
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.request.SolrQueryRequest;
+import org.apache.solr.schema.IndexSchema;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -34,10 +35,11 @@ public class UIMATokenizersSolrIntegrati
 
   @Test
   public void testInitialization() throws Exception {
-    assertNotNull(h.getCore().getSchema().getField("sentences"));
-    assertNotNull(h.getCore().getSchema().getFieldType("sentences"));
-    assertNotNull(h.getCore().getSchema().getField("nouns"));
-    assertNotNull(h.getCore().getSchema().getFieldType("nouns"));
+    IndexSchema schema = h.getCore().getLatestSchema();
+    assertNotNull(schema.getField("sentences"));
+    assertNotNull(schema.getFieldType("sentences"));
+    assertNotNull(schema.getField("nouns"));
+    assertNotNull(schema.getFieldType("nouns"));
   }
 
   @Test

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/AbstractSolrEventListener.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/AbstractSolrEventListener.java?rev=1470539&r1=1470538&r2=1470539&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/AbstractSolrEventListener.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/AbstractSolrEventListener.java Mon Apr 22 14:26:55 2013
@@ -24,15 +24,18 @@ import org.apache.solr.search.SolrIndexS
 /**
  */
 public class AbstractSolrEventListener implements SolrEventListener {
-  protected final SolrCore core;
+  private final SolrCore core;
+  public SolrCore getCore() { return core; }
+
   public AbstractSolrEventListener(SolrCore core) {
     this.core = core;
   }
-  protected NamedList args;
+  private NamedList args;
+  public NamedList getArgs() { return args; }
 
   @Override
   public void init(NamedList args) {
-    this.args = args;
+    this.args = args.clone();
   }
 
   @Override

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/ConfigSolrXml.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/ConfigSolrXml.java?rev=1470539&r1=1470538&r2=1470539&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/ConfigSolrXml.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/ConfigSolrXml.java Mon Apr 22 14:26:55 2013
@@ -22,12 +22,10 @@ import org.apache.solr.cloud.ZkControlle
 import org.apache.solr.common.SolrException;
 import org.apache.solr.handler.component.HttpShardHandlerFactory;
 import org.apache.solr.handler.component.ShardHandlerFactory;
-import org.apache.solr.schema.IndexSchema;
 import org.apache.solr.util.DOMUtil;
 import org.apache.solr.util.PropertiesUtil;
 import org.apache.solr.util.SystemIdResolver;
 import org.apache.solr.util.plugin.PluginInfoInitialized;
-import org.apache.zookeeper.KeeperException;
 import org.w3c.dom.Document;
 import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
@@ -484,16 +482,6 @@ public class ConfigSolrXml extends Confi
     coreDescriptorPlusMap.remove(desc.getName());
   }
 
-  public IndexSchema getSchemaFromZk(ZkController zkController, String zkConfigName, String schemaName,
-                                     SolrConfig config)
-      throws KeeperException, InterruptedException {
-    byte[] configBytes = zkController.getConfigFileData(zkConfigName, schemaName);
-    InputSource is = new InputSource(new ByteArrayInputStream(configBytes));
-    is.setSystemId(SystemIdResolver.createSystemIdFromResourceName(schemaName));
-    IndexSchema schema = new IndexSchema(config, schemaName, is);
-    return schema;
-  }
-
   @Override
   public SolrConfig getSolrConfigFromZk(ZkController zkController, String zkConfigName, String solrConfigFileName,
                                         SolrResourceLoader resourceLoader) {

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/CoreContainer.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/CoreContainer.java?rev=1470539&r1=1470538&r2=1470539&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/CoreContainer.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/CoreContainer.java Mon Apr 22 14:26:55 2013
@@ -31,6 +31,7 @@ import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Locale;
@@ -921,10 +922,10 @@ public class CoreContainer
 
     IndexSchema schema = null;
     if (indexSchemaCache != null) {
-      File schemaFile = new File(dcore.getSchemaName());
+      final String resourceNameToBeUsed = IndexSchemaFactory.getResourceNameToBeUsed(dcore.getSchemaName(), config);
+      File schemaFile = new File(resourceNameToBeUsed);
       if (!schemaFile.isAbsolute()) {
-        schemaFile = new File(solrLoader.getInstanceDir() + "conf"
-            + File.separator + dcore.getSchemaName());
+        schemaFile = new File(solrLoader.getConfigDir(), schemaFile.getPath());
       }
       if (schemaFile.exists()) {
         String key = schemaFile.getAbsolutePath()
@@ -956,6 +957,54 @@ public class CoreContainer
   }
 
   /**
+   * Removes all references to the oldSchema from the schema cache; places an entry
+   * in the schema cache for the newSchema; and replaces references to the oldSchema
+   * with references to the newSchema in all registered cores.
+   * 
+   * @param initiatingCore The initiating core; schema references doesn't need to be changed here
+   * @param oldSchema The schema to remove references to
+   * @param newSchema The schema to add references to
+   */
+  public void replaceSchema(SolrCore initiatingCore, IndexSchema oldSchema, IndexSchema newSchema) {
+    if (null != indexSchemaCache) { // isShareSchema() == true
+      // Remove references to the oldSchema from the schema cache
+      for (Iterator<Map.Entry<String,IndexSchema>> iter = indexSchemaCache.entrySet().iterator() ; iter.hasNext() ; ) {
+        Map.Entry<String,IndexSchema> entry = iter.next();
+        if (oldSchema == entry.getValue()) {
+          iter.remove();
+        }
+      }
+
+      // Cache the new schema
+      final String newSchemaResourceName
+          = IndexSchemaFactory.getResourceNameToBeUsed(newSchema.getResourceName(), initiatingCore.getSolrConfig());
+      File schemaFile = new File(newSchemaResourceName);
+      if ( ! schemaFile.isAbsolute()) {
+        schemaFile = new File(initiatingCore.getResourceLoader().getConfigDir(), schemaFile.getPath());
+      }
+      if (schemaFile.exists()) {
+        String key = schemaFile.getAbsolutePath()
+            + ":"
+            + new SimpleDateFormat("yyyyMMddHHmmss", Locale.ROOT).format(new Date(
+            schemaFile.lastModified()));
+        indexSchemaCache.put(key, newSchema);
+      }
+
+      // Replace oldSchema references with newSchema references in all active cores
+      for (String coreName : coreMaps.getAllCoreNames()) {
+        SolrCore activeCore = coreMaps.getCoreFromAnyList(coreName);
+        if (null != activeCore) {
+          if (initiatingCore != activeCore) {
+            if (oldSchema == activeCore.getLatestSchema()) {
+              activeCore.setLatestSchema(newSchema);
+            }
+          }
+        }
+      }
+    }
+  }
+
+ /**
    * Creates a new core based on a descriptor but does not register it.
    *
    * @param dcore a core descriptor
@@ -1739,7 +1788,7 @@ class CoreMaps {
     }
   }
 
-  protected SolrCore getCoreFromAnyList(String name) {
+  public SolrCore getCoreFromAnyList(String name) {
     SolrCore core;
 
     synchronized (locker) {

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/IndexReaderFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/IndexReaderFactory.java?rev=1470539&r1=1470538&r2=1470539&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/IndexReaderFactory.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/IndexReaderFactory.java Mon Apr 22 14:26:55 2013
@@ -19,7 +19,6 @@ package org.apache.solr.core;
 import java.io.IOException;
 
 import org.apache.lucene.index.DirectoryReader;
-import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.store.Directory;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.util.plugin.NamedListInitializedPlugin;
@@ -61,7 +60,7 @@ public abstract class IndexReaderFactory
    * @param indexDir indexDir index location
    * @param core {@link SolrCore} instance where this reader will be used. NOTE:
    * this SolrCore instance may not be fully configured yet, but basic things like
-   * {@link SolrCore#getCoreDescriptor()}, {@link SolrCore#getSchema()} and
+   * {@link SolrCore#getCoreDescriptor()}, {@link SolrCore#getLatestSchema()} and
    * {@link SolrCore#getSolrConfig()} are valid.
    * @return An IndexReader instance
    * @throws IOException If there is a low-level I/O error.

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/QuerySenderListener.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/QuerySenderListener.java?rev=1470539&r1=1470538&r2=1470539&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/QuerySenderListener.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/QuerySenderListener.java Mon Apr 22 14:26:55 2013
@@ -42,7 +42,7 @@ public class QuerySenderListener extends
   public void newSearcher(SolrIndexSearcher newSearcher, SolrIndexSearcher currentSearcher) {
     final SolrIndexSearcher searcher = newSearcher;
     log.info("QuerySenderListener sending requests to " + newSearcher);
-    List<NamedList> allLists = (List<NamedList>)args.get("queries");
+    List<NamedList> allLists = (List<NamedList>)getArgs().get("queries");
     if (allLists == null) return;
     for (NamedList nlst : allLists) {
       SolrQueryRequest req = null;
@@ -54,14 +54,14 @@ public class QuerySenderListener extends
         if (params.get("distrib") == null) {
           params.add("distrib", false);
         }
-        req = new LocalSolrQueryRequest(core,params) {
+        req = new LocalSolrQueryRequest(getCore(),params) {
           @Override public SolrIndexSearcher getSearcher() { return searcher; }
           @Override public void close() { }
         };
 
         SolrQueryResponse rsp = new SolrQueryResponse();
         SolrRequestInfo.setRequestInfo(new SolrRequestInfo(req, rsp));
-        core.execute(core.getRequestHandler(req.getParams().get(CommonParams.QT)), req, rsp);
+        getCore().execute(getCore().getRequestHandler(req.getParams().get(CommonParams.QT)), req, rsp);
 
         // Retrieve the Document instances (not just the ids) to warm
         // the OS disk cache, and any Solr document cache.  Only the top

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SchemaCodecFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SchemaCodecFactory.java?rev=1470539&r1=1470538&r2=1470539&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SchemaCodecFactory.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SchemaCodecFactory.java Mon Apr 22 14:26:55 2013
@@ -4,9 +4,9 @@ import org.apache.lucene.codecs.Codec;
 import org.apache.lucene.codecs.DocValuesFormat;
 import org.apache.lucene.codecs.PostingsFormat;
 import org.apache.lucene.codecs.lucene42.Lucene42Codec;
-import org.apache.solr.schema.IndexSchema;
-import org.apache.solr.schema.SchemaAware;
+import org.apache.solr.common.util.NamedList;
 import org.apache.solr.schema.SchemaField;
+import org.apache.solr.util.plugin.SolrCoreAware;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one or more
@@ -31,8 +31,10 @@ import org.apache.solr.schema.SchemaFiel
  * schema configuration.
  * @lucene.experimental
  */
-public class SchemaCodecFactory extends CodecFactory implements SchemaAware {
+public class SchemaCodecFactory extends CodecFactory implements SolrCoreAware {
   private Codec codec;
+  private volatile SolrCore core;
+  
   // TODO: we need to change how solr does this?
   // rather than a string like "Pulsing" you need to be able to pass parameters
   // and everything to a field in the schema, e.g. we should provide factories for 
@@ -42,11 +44,17 @@ public class SchemaCodecFactory extends 
   // how it constructs this from the XML... i don't care.
 
   @Override
-  public void inform(final IndexSchema schema) {
+  public void inform(SolrCore core) {
+    this.core = core;
+  }
+
+  @Override
+  public void init(NamedList args) {
+    super.init(args);
     codec = new Lucene42Codec() {
       @Override
       public PostingsFormat getPostingsFormatForField(String field) {
-        final SchemaField fieldOrNull = schema.getFieldOrNull(field);
+        final SchemaField fieldOrNull = core.getLatestSchema().getFieldOrNull(field);
         if (fieldOrNull == null) {
           throw new IllegalArgumentException("no such field " + field);
         }
@@ -58,7 +66,7 @@ public class SchemaCodecFactory extends 
       }
       @Override
       public DocValuesFormat getDocValuesFormatForField(String field) {
-        final SchemaField fieldOrNull = schema.getFieldOrNull(field);
+        final SchemaField fieldOrNull = core.getLatestSchema().getFieldOrNull(field);
         if (fieldOrNull == null) {
           throw new IllegalArgumentException("no such field " + field);
         }
@@ -73,7 +81,7 @@ public class SchemaCodecFactory extends 
 
   @Override
   public Codec getCodec() {
-    assert codec != null : "inform must be called first";
+    assert core != null : "inform must be called first";
     return codec;
   }
 }

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrCore.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrCore.java?rev=1470539&r1=1470538&r2=1470539&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrCore.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrCore.java Mon Apr 22 14:26:55 2013
@@ -97,7 +97,7 @@ import org.apache.solr.response.transfor
 import org.apache.solr.schema.FieldType;
 import org.apache.solr.schema.IndexSchema;
 import org.apache.solr.schema.IndexSchemaFactory;
-import org.apache.solr.schema.SchemaAware;
+import org.apache.solr.schema.SimilarityFactory;
 import org.apache.solr.search.QParserPlugin;
 import org.apache.solr.search.SolrFieldCacheMBean;
 import org.apache.solr.search.SolrIndexSearcher;
@@ -147,7 +147,7 @@ public final class SolrCore implements S
 
   private final SolrConfig solrConfig;
   private final SolrResourceLoader resourceLoader;
-  private final IndexSchema schema;
+  private volatile IndexSchema schema;
   private final String dataDir;
   private final UpdateHandler updateHandler;
   private final SolrCoreState solrCoreState;
@@ -206,16 +206,19 @@ public final class SolrCore implements S
    * @since solr 1.3
    */
   public String getSchemaResource() {
-    return schema.getResourceName();
+    return getLatestSchema().getResourceName();
   }
 
-  /**
-   * Gets the schema object used by this core instance.
-   */
-  public IndexSchema getSchema() { 
+  /** @return the latest snapshot of the schema used by this core instance. */
+  public IndexSchema getLatestSchema() { 
     return schema;
   }
   
+  /** Sets the latest schema snapshot to be used by this core instance. */
+  public void setLatestSchema(IndexSchema replacementSchema) {
+    schema = replacementSchema;
+  }
+  
   public String getDataDir() {
     return dataDir;
   }
@@ -396,7 +399,7 @@ public final class SolrCore implements S
     
     SolrConfig config = new SolrConfig(resourceLoader, getSolrConfig().getName(), null);
     
-    IndexSchema schema = IndexSchemaFactory.buildIndexSchema(getSchema().getResourceName(), config);
+    IndexSchema schema = IndexSchemaFactory.buildIndexSchema(getLatestSchema().getResourceName(), config);
     
     solrCoreState.increfSolrCoreState();
     
@@ -419,7 +422,8 @@ public final class SolrCore implements S
 
   // gets a non-caching searcher
   public SolrIndexSearcher newSearcher(String name) throws IOException {
-    return new SolrIndexSearcher(this, getNewIndexDir(), schema, getSolrConfig().indexConfig, name, false, directoryFactory);
+    return new SolrIndexSearcher(this, getNewIndexDir(), getLatestSchema(), getSolrConfig().indexConfig, 
+                                 name, false, directoryFactory);
   }
 
 
@@ -496,7 +500,8 @@ public final class SolrCore implements S
         log.warn(logid+"Solr index directory '" + new File(indexDir) + "' doesn't exist."
                 + " Creating new index...");
 
-        SolrIndexWriter writer = SolrIndexWriter.create("SolrCore.initIndex", indexDir, getDirectoryFactory(), true, schema, solrConfig.indexConfig, solrDelPolicy, codec);
+        SolrIndexWriter writer = SolrIndexWriter.create("SolrCore.initIndex", indexDir, getDirectoryFactory(), true, 
+                                                        getLatestSchema(), solrConfig.indexConfig, solrDelPolicy, codec);
         writer.close();
       }
 
@@ -679,10 +684,6 @@ public final class SolrCore implements S
     dataDir = SolrResourceLoader.normalizeDir(dataDir);
     log.info(logid+"Opening new SolrCore at " + resourceLoader.getInstanceDir() + ", dataDir="+dataDir);
 
-    if (schema==null) {
-      schema = IndexSchemaFactory.buildIndexSchema(IndexSchema.DEFAULT_SCHEMA_FILE, config);
-    }
-
     if (null != cd && null != cd.getCloudDescriptor()) {
       // we are evidently running in cloud mode.  
       //
@@ -712,7 +713,16 @@ public final class SolrCore implements S
 
     infoRegistry.put("fieldCache", new SolrFieldCacheMBean());
 
+    if (schema==null) {
+      schema = IndexSchemaFactory.buildIndexSchema(IndexSchema.DEFAULT_SCHEMA_FILE, config);
+    }
     this.schema = schema;
+    final SimilarityFactory similarityFactory = schema.getSimilarityFactory(); 
+    if (similarityFactory instanceof SolrCoreAware) {
+      // Similarity needs SolrCore before inform() is called on all registered SolrCoreAware listeners below
+      ((SolrCoreAware)similarityFactory).inform(this);
+    }
+
     this.dataDir = dataDir;
     this.startTime = System.currentTimeMillis();
     this.maxWarmingSearchers = config.maxWarmingSearchers;
@@ -854,8 +864,10 @@ public final class SolrCore implements S
         }
       };
     }
-    if (factory instanceof SchemaAware) {
-      ((SchemaAware)factory).inform(schema);
+    if (factory instanceof SolrCoreAware) {
+      // CodecFactory needs SolrCore before inform() is called on all registered
+      // SolrCoreAware listeners, at the end of the SolrCore constructor
+      ((SolrCoreAware)factory).inform(this);
     } else {
       for (FieldType ft : schema.getFieldTypes().values()) {
         if (null != ft.getPostingsFormat()) {
@@ -1393,7 +1405,8 @@ public final class SolrCore implements S
         }
 
        // for now, turn off caches if this is for a realtime reader (caches take a little while to instantiate)
-        tmp = new SolrIndexSearcher(this, newIndexDir, schema, getSolrConfig().indexConfig, (realtime ? "realtime":"main"), newReader, true, !realtime, true, directoryFactory);
+        tmp = new SolrIndexSearcher(this, newIndexDir, getLatestSchema(), getSolrConfig().indexConfig, 
+            (realtime ? "realtime":"main"), newReader, true, !realtime, true, directoryFactory);
 
       } else {
         // newestSearcher == null at this point
@@ -1403,11 +1416,13 @@ public final class SolrCore implements S
           // so that we pick up any uncommitted changes and so we don't go backwards
           // in time on a core reload
           DirectoryReader newReader = newReaderCreator.call();
-          tmp = new SolrIndexSearcher(this, newIndexDir, schema, getSolrConfig().indexConfig, (realtime ? "realtime":"main"), newReader, true, !realtime, true, directoryFactory);
+          tmp = new SolrIndexSearcher(this, newIndexDir, getLatestSchema(), getSolrConfig().indexConfig, 
+              (realtime ? "realtime":"main"), newReader, true, !realtime, true, directoryFactory);
         } else {
          // normal open that happens at startup
         // verbose("non-reopen START:");
-        tmp = new SolrIndexSearcher(this, newIndexDir, schema, getSolrConfig().indexConfig, "main", true, directoryFactory);
+        tmp = new SolrIndexSearcher(this, newIndexDir, getLatestSchema(), getSolrConfig().indexConfig,
+                                    "main", true, directoryFactory);
         // verbose("non-reopen DONE: searcher=",tmp);
         }
       }

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java?rev=1470539&r1=1470538&r2=1470539&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java Mon Apr 22 14:26:55 2013
@@ -41,6 +41,8 @@ import org.apache.lucene.analysis.util.W
 import org.apache.solr.common.ResourceLoader;
 import org.apache.solr.handler.admin.CoreAdminHandler;
 import org.apache.solr.handler.component.ShardHandlerFactory;
+import org.apache.solr.schema.ManagedIndexSchemaFactory;
+import org.apache.solr.schema.SimilarityFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -730,11 +732,14 @@ public class SolrResourceLoader implemen
     awareCompatibility = new HashMap<Class, Class[]>();
     awareCompatibility.put( 
       SolrCoreAware.class, new Class[] {
-        SolrRequestHandler.class,
+        CodecFactory.class,
+        ManagedIndexSchemaFactory.class,
         QueryResponseWriter.class,
         SearchComponent.class,
-        UpdateRequestProcessorFactory.class,
-        ShardHandlerFactory.class
+        ShardHandlerFactory.class,
+        SimilarityFactory.class,
+        SolrRequestHandler.class,
+        UpdateRequestProcessorFactory.class
       }
     );
 

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/FieldAnalysisRequestHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/FieldAnalysisRequestHandler.java?rev=1470539&r1=1470538&r2=1470539&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/FieldAnalysisRequestHandler.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/FieldAnalysisRequestHandler.java Mon Apr 22 14:26:55 2013
@@ -30,9 +30,10 @@ import org.apache.solr.schema.FieldType;
 import org.apache.solr.schema.IndexSchema;
 import org.apache.commons.io.IOUtils;
 
-import java.util.*;
 import java.io.Reader;
 import java.io.IOException;
+import java.util.Arrays;
+import java.util.Set;
 
 /**
  * Provides the ability to specify multiple field types and field names in the same request. Expected parameters:
@@ -96,7 +97,7 @@ public class FieldAnalysisRequestHandler
   @Override
   protected NamedList doAnalysis(SolrQueryRequest req) throws Exception {
     FieldAnalysisRequest analysisRequest = resolveAnalysisRequest(req);
-    IndexSchema indexSchema = req.getCore().getSchema();
+    IndexSchema indexSchema = req.getSchema();
     return handleAnalysisRequest(analysisRequest, indexSchema);
   }
 

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/admin/SystemInfoHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/admin/SystemInfoHandler.java?rev=1470539&r1=1470538&r2=1470539&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/admin/SystemInfoHandler.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/admin/SystemInfoHandler.java Mon Apr 22 14:26:55 2013
@@ -75,7 +75,7 @@ public class SystemInfoHandler extends R
   @Override
   public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throws Exception
   {
-    rsp.add( "core", getCoreInfo( req.getCore() ) );
+    rsp.add( "core", getCoreInfo( req.getCore(), req.getSchema() ) );
     boolean solrCloudMode = req.getCore().getCoreDescriptor().getCoreContainer().isZooKeeperAware();
     rsp.add( "mode", solrCloudMode ? "solrcloud" : "std");
     rsp.add( "lucene", getLuceneInfo() );
@@ -87,10 +87,9 @@ public class SystemInfoHandler extends R
   /**
    * Get system info
    */
-  private SimpleOrderedMap<Object> getCoreInfo( SolrCore core ) {
+  private SimpleOrderedMap<Object> getCoreInfo( SolrCore core, IndexSchema schema ) {
     SimpleOrderedMap<Object> info = new SimpleOrderedMap<Object>();
     
-    IndexSchema schema = core.getSchema();
     info.add( "schema", schema != null ? schema.getSchemaName():"no schema!" );
     
     // Host

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java?rev=1470539&r1=1470538&r2=1470539&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java Mon Apr 22 14:26:55 2013
@@ -23,7 +23,12 @@ import org.apache.lucene.index.AtomicRea
 import org.apache.lucene.index.IndexReaderContext;
 import org.apache.lucene.index.ReaderUtil;
 import org.apache.lucene.index.Term;
-import org.apache.lucene.search.*;
+import org.apache.lucene.search.BooleanQuery;
+import org.apache.lucene.search.FieldComparator;
+import org.apache.lucene.search.Query;
+import org.apache.lucene.search.ScoreDoc;
+import org.apache.lucene.search.Sort;
+import org.apache.lucene.search.SortField;
 import org.apache.lucene.search.grouping.GroupDocs;
 import org.apache.lucene.search.grouping.SearchGroup;
 import org.apache.lucene.search.grouping.TopGroups;
@@ -43,7 +48,19 @@ import org.apache.solr.response.ResultCo
 import org.apache.solr.response.SolrQueryResponse;
 import org.apache.solr.schema.FieldType;
 import org.apache.solr.schema.SchemaField;
-import org.apache.solr.search.*;
+import org.apache.solr.search.DocIterator;
+import org.apache.solr.search.DocList;
+import org.apache.solr.search.DocListAndSet;
+import org.apache.solr.search.DocSlice;
+import org.apache.solr.search.Grouping;
+import org.apache.solr.search.QParser;
+import org.apache.solr.search.QParserPlugin;
+import org.apache.solr.search.QueryParsing;
+import org.apache.solr.search.ReturnFields;
+import org.apache.solr.search.SolrIndexSearcher;
+import org.apache.solr.search.SolrReturnFields;
+import org.apache.solr.search.SortSpec;
+import org.apache.solr.search.SyntaxError;
 import org.apache.solr.search.grouping.CommandHandler;
 import org.apache.solr.search.grouping.GroupingSpecification;
 import org.apache.solr.search.grouping.distributed.ShardRequestFactory;
@@ -69,7 +86,15 @@ import java.io.IOException;
 import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.net.URL;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
 
 /**
  * TODO!
@@ -101,7 +126,7 @@ public class QueryComponent extends Sear
     }
     rb.setFieldFlags( flags );
 
-    String defType = params.get(QueryParsing.DEFTYPE,QParserPlugin.DEFAULT_QTYPE);
+    String defType = params.get(QueryParsing.DEFTYPE, QParserPlugin.DEFAULT_QTYPE);
 
     // get it from the response builder to give a different component a chance
     // to set it.
@@ -225,7 +250,7 @@ public class QueryComponent extends Sear
     // too if desired).
     String ids = params.get(ShardParams.IDS);
     if (ids != null) {
-      SchemaField idField = req.getSchema().getUniqueKeyField();
+      SchemaField idField = searcher.getSchema().getUniqueKeyField();
       List<String> idArr = StrUtils.splitSmart(ids, ",", true);
       int[] luceneIds = new int[idArr.size()];
       int docs = 0;
@@ -463,7 +488,7 @@ public class QueryComponent extends Sear
         FieldComparator comparator = null;
 
         String fieldname = sortField.getField();
-        FieldType ft = fieldname==null ? null : req.getSchema().getFieldTypeNoEx(fieldname);
+        FieldType ft = fieldname==null ? null : searcher.getSchema().getFieldTypeNoEx(fieldname);
 
         Object[] vals = new Object[nDocs];
         

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/QueryElevationComponent.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/QueryElevationComponent.java?rev=1470539&r1=1470538&r2=1470539&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/QueryElevationComponent.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/QueryElevationComponent.java Mon Apr 22 14:26:55 2013
@@ -20,8 +20,22 @@ package org.apache.solr.handler.componen
 import org.apache.lucene.analysis.Analyzer;
 import org.apache.lucene.analysis.TokenStream;
 import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
-import org.apache.lucene.index.*;
-import org.apache.lucene.search.*;
+import org.apache.lucene.index.AtomicReaderContext;
+import org.apache.lucene.index.DocsEnum;
+import org.apache.lucene.index.Fields;
+import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.Term;
+import org.apache.lucene.index.Terms;
+import org.apache.lucene.index.TermsEnum;
+import org.apache.lucene.search.BooleanClause;
+import org.apache.lucene.search.BooleanQuery;
+import org.apache.lucene.search.DocIdSetIterator;
+import org.apache.lucene.search.FieldComparator;
+import org.apache.lucene.search.FieldComparatorSource;
+import org.apache.lucene.search.Query;
+import org.apache.lucene.search.Sort;
+import org.apache.lucene.search.SortField;
+import org.apache.lucene.search.TermQuery;
 import org.apache.lucene.util.Bits;
 import org.apache.lucene.util.BytesRef;
 import org.apache.lucene.util.SentinelIntSet;
@@ -29,6 +43,7 @@ import org.apache.solr.cloud.ZkControlle
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.params.QueryElevationParams;
 import org.apache.solr.common.params.SolrParams;
+import org.apache.solr.schema.IndexSchema;
 import org.apache.solr.util.DOMUtil;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.util.SimpleOrderedMap;
@@ -60,7 +75,14 @@ import java.io.InputStream;
 import java.io.StringReader;
 import java.net.MalformedURLException;
 import java.net.URL;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.WeakHashMap;
 
 /**
  * A component to elevate some documents to the top of the result set.
@@ -139,9 +161,10 @@ public class QueryElevationComponent ext
 
   @Override
   public void inform(SolrCore core) {
+    IndexSchema schema = core.getLatestSchema();
     String a = initArgs.get(FIELD_TYPE);
     if (a != null) {
-      FieldType ft = core.getSchema().getFieldTypes().get(a);
+      FieldType ft = schema.getFieldTypes().get(a);
       if (ft == null) {
         throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,
             "Unknown FieldType: '" + a + "' used in QueryElevationComponent");
@@ -149,7 +172,7 @@ public class QueryElevationComponent ext
       analyzer = ft.getQueryAnalyzer();
     }
 
-    SchemaField sf = core.getSchema().getUniqueKeyField();
+    SchemaField sf = schema.getUniqueKeyField();
     if( sf == null) {
       throw new SolrException( SolrException.ErrorCode.SERVER_ERROR, 
           "QueryElevationComponent requires the schema to have a uniqueKeyField." );