You are viewing a plain text version of this content. The canonical link for it is here.
Posted to solr-commits@lucene.apache.org by ma...@apache.org on 2009/12/15 15:49:20 UTC
svn commit: r890809 [1/2] - in /lucene/solr/branches/cloud: ./
contrib/dataimporthandler/ contrib/dataimporthandler/src/extras/
contrib/dataimporthandler/src/extras/main/
contrib/dataimporthandler/src/extras/main/java/
contrib/dataimporthandler/src/ext...
Author: markrmiller
Date: Tue Dec 15 14:49:18 2009
New Revision: 890809
URL: http://svn.apache.org/viewvc?rev=890809&view=rev
Log:
merge cloud branch up to r890798
Added:
lucene/solr/branches/cloud/contrib/dataimporthandler/solr-dataimporthandler-extras-pom.xml.template
- copied unchanged from r890798, lucene/solr/trunk/contrib/dataimporthandler/solr-dataimporthandler-extras-pom.xml.template
lucene/solr/branches/cloud/contrib/dataimporthandler/src/extras/
- copied from r890798, lucene/solr/trunk/contrib/dataimporthandler/src/extras/
lucene/solr/branches/cloud/contrib/dataimporthandler/src/extras/main/
- copied from r890798, lucene/solr/trunk/contrib/dataimporthandler/src/extras/main/
lucene/solr/branches/cloud/contrib/dataimporthandler/src/extras/main/java/
- copied from r890798, lucene/solr/trunk/contrib/dataimporthandler/src/extras/main/java/
lucene/solr/branches/cloud/contrib/dataimporthandler/src/extras/main/java/org/
- copied from r890798, lucene/solr/trunk/contrib/dataimporthandler/src/extras/main/java/org/
lucene/solr/branches/cloud/contrib/dataimporthandler/src/extras/main/java/org/apache/
- copied from r890798, lucene/solr/trunk/contrib/dataimporthandler/src/extras/main/java/org/apache/
lucene/solr/branches/cloud/contrib/dataimporthandler/src/extras/main/java/org/apache/solr/
- copied from r890798, lucene/solr/trunk/contrib/dataimporthandler/src/extras/main/java/org/apache/solr/
lucene/solr/branches/cloud/contrib/dataimporthandler/src/extras/main/java/org/apache/solr/handler/
- copied from r890798, lucene/solr/trunk/contrib/dataimporthandler/src/extras/main/java/org/apache/solr/handler/
lucene/solr/branches/cloud/contrib/dataimporthandler/src/extras/main/java/org/apache/solr/handler/dataimport/
- copied from r890798, lucene/solr/trunk/contrib/dataimporthandler/src/extras/main/java/org/apache/solr/handler/dataimport/
lucene/solr/branches/cloud/contrib/dataimporthandler/src/extras/main/java/org/apache/solr/handler/dataimport/MailEntityProcessor.java
- copied, changed from r890798, lucene/solr/trunk/contrib/dataimporthandler/src/extras/main/java/org/apache/solr/handler/dataimport/MailEntityProcessor.java
lucene/solr/branches/cloud/contrib/dataimporthandler/src/extras/main/java/org/apache/solr/handler/dataimport/TikaEntityProcessor.java
- copied unchanged from r890798, lucene/solr/trunk/contrib/dataimporthandler/src/extras/main/java/org/apache/solr/handler/dataimport/TikaEntityProcessor.java
lucene/solr/branches/cloud/contrib/dataimporthandler/src/extras/test/
- copied from r890798, lucene/solr/trunk/contrib/dataimporthandler/src/extras/test/
lucene/solr/branches/cloud/contrib/dataimporthandler/src/extras/test/java/
- copied from r890798, lucene/solr/trunk/contrib/dataimporthandler/src/extras/test/java/
lucene/solr/branches/cloud/contrib/dataimporthandler/src/extras/test/java/org/
- copied from r890798, lucene/solr/trunk/contrib/dataimporthandler/src/extras/test/java/org/
lucene/solr/branches/cloud/contrib/dataimporthandler/src/extras/test/java/org/apache/
- copied from r890798, lucene/solr/trunk/contrib/dataimporthandler/src/extras/test/java/org/apache/
lucene/solr/branches/cloud/contrib/dataimporthandler/src/extras/test/java/org/apache/solr/
- copied from r890798, lucene/solr/trunk/contrib/dataimporthandler/src/extras/test/java/org/apache/solr/
lucene/solr/branches/cloud/contrib/dataimporthandler/src/extras/test/java/org/apache/solr/handler/
- copied from r890798, lucene/solr/trunk/contrib/dataimporthandler/src/extras/test/java/org/apache/solr/handler/
lucene/solr/branches/cloud/contrib/dataimporthandler/src/extras/test/java/org/apache/solr/handler/dataimport/
- copied from r890798, lucene/solr/trunk/contrib/dataimporthandler/src/extras/test/java/org/apache/solr/handler/dataimport/
lucene/solr/branches/cloud/contrib/dataimporthandler/src/extras/test/java/org/apache/solr/handler/dataimport/TestMailEntityProcessor.java
- copied, changed from r890798, lucene/solr/trunk/contrib/dataimporthandler/src/extras/test/java/org/apache/solr/handler/dataimport/TestMailEntityProcessor.java
lucene/solr/branches/cloud/contrib/dataimporthandler/src/extras/test/java/org/apache/solr/handler/dataimport/TestTikaEntityProcessor.java
- copied unchanged from r890798, lucene/solr/trunk/contrib/dataimporthandler/src/extras/test/java/org/apache/solr/handler/dataimport/TestTikaEntityProcessor.java
lucene/solr/branches/cloud/contrib/dataimporthandler/src/extras/test/resources/
- copied from r890798, lucene/solr/trunk/contrib/dataimporthandler/src/extras/test/resources/
lucene/solr/branches/cloud/contrib/dataimporthandler/src/extras/test/resources/solr/
- copied from r890798, lucene/solr/trunk/contrib/dataimporthandler/src/extras/test/resources/solr/
lucene/solr/branches/cloud/contrib/dataimporthandler/src/extras/test/resources/solr/conf/
- copied from r890798, lucene/solr/trunk/contrib/dataimporthandler/src/extras/test/resources/solr/conf/
lucene/solr/branches/cloud/contrib/dataimporthandler/src/extras/test/resources/solr/conf/dataimport-schema-no-unique-key.xml
- copied unchanged from r890798, lucene/solr/trunk/contrib/dataimporthandler/src/extras/test/resources/solr/conf/dataimport-schema-no-unique-key.xml
lucene/solr/branches/cloud/contrib/dataimporthandler/src/extras/test/resources/solr/conf/dataimport-solrconfig.xml
- copied unchanged from r890798, lucene/solr/trunk/contrib/dataimporthandler/src/extras/test/resources/solr/conf/dataimport-solrconfig.xml
lucene/solr/branches/cloud/example/example-DIH/solr/tika/
- copied from r890798, lucene/solr/trunk/example/example-DIH/solr/tika/
lucene/solr/branches/cloud/example/example-DIH/solr/tika/conf/
- copied from r890798, lucene/solr/trunk/example/example-DIH/solr/tika/conf/
lucene/solr/branches/cloud/example/example-DIH/solr/tika/conf/schema.xml
- copied unchanged from r890798, lucene/solr/trunk/example/example-DIH/solr/tika/conf/schema.xml
lucene/solr/branches/cloud/example/example-DIH/solr/tika/conf/solrconfig.xml
- copied unchanged from r890798, lucene/solr/trunk/example/example-DIH/solr/tika/conf/solrconfig.xml
lucene/solr/branches/cloud/example/example-DIH/solr/tika/conf/tika-data-config.xml
- copied unchanged from r890798, lucene/solr/trunk/example/example-DIH/solr/tika/conf/tika-data-config.xml
lucene/solr/branches/cloud/example/solr/solr.xml
- copied unchanged from r890798, lucene/solr/trunk/example/solr/solr.xml
lucene/solr/branches/cloud/src/java/org/apache/solr/analysis/PatternReplaceCharFilter.java
- copied unchanged from r890798, lucene/solr/trunk/src/java/org/apache/solr/analysis/PatternReplaceCharFilter.java
lucene/solr/branches/cloud/src/java/org/apache/solr/analysis/PatternReplaceCharFilterFactory.java
- copied unchanged from r890798, lucene/solr/trunk/src/java/org/apache/solr/analysis/PatternReplaceCharFilterFactory.java
lucene/solr/branches/cloud/src/solrj/org/apache/solr/client/solrj/response/TermsResponse.java
- copied unchanged from r890798, lucene/solr/trunk/src/solrj/org/apache/solr/client/solrj/response/TermsResponse.java
lucene/solr/branches/cloud/src/test/org/apache/solr/analysis/TestPatternReplaceCharFilter.java
- copied unchanged from r890798, lucene/solr/trunk/src/test/org/apache/solr/analysis/TestPatternReplaceCharFilter.java
lucene/solr/branches/cloud/src/test/org/apache/solr/client/solrj/response/TermsResponseTest.java
- copied unchanged from r890798, lucene/solr/trunk/src/test/org/apache/solr/client/solrj/response/TermsResponseTest.java
lucene/solr/branches/cloud/src/test/org/apache/solr/handler/component/DistributedTermsComponentTest.java
- copied unchanged from r890798, lucene/solr/trunk/src/test/org/apache/solr/handler/component/DistributedTermsComponentTest.java
lucene/solr/branches/cloud/src/test/org/apache/solr/search/QueryParsingTest.java
- copied unchanged from r890798, lucene/solr/trunk/src/test/org/apache/solr/search/QueryParsingTest.java
lucene/solr/branches/cloud/src/test/org/apache/solr/search/function/SortByFunctionTest.java
- copied unchanged from r890798, lucene/solr/trunk/src/test/org/apache/solr/search/function/SortByFunctionTest.java
Modified:
lucene/solr/branches/cloud/ (props changed)
lucene/solr/branches/cloud/CHANGES.txt
lucene/solr/branches/cloud/build.xml
lucene/solr/branches/cloud/contrib/dataimporthandler/CHANGES.txt
lucene/solr/branches/cloud/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/DataConfig.java
lucene/solr/branches/cloud/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/DataImporter.java
lucene/solr/branches/cloud/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/DocBuilder.java
lucene/solr/branches/cloud/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/PlainTextEntityProcessor.java
lucene/solr/branches/cloud/contrib/dataimporthandler/src/test/java/org/apache/solr/handler/dataimport/TestDocBuilder2.java
lucene/solr/branches/cloud/contrib/dataimporthandler/src/test/java/org/apache/solr/handler/dataimport/TestErrorHandling.java
lucene/solr/branches/cloud/contrib/dataimporthandler/src/test/java/org/apache/solr/handler/dataimport/TestSqlEntityProcessor2.java
lucene/solr/branches/cloud/contrib/dataimporthandler/src/test/java/org/apache/solr/handler/dataimport/TestSqlEntityProcessorDelta.java
lucene/solr/branches/cloud/contrib/dataimporthandler/src/test/java/org/apache/solr/handler/dataimport/TestSqlEntityProcessorDelta2.java
lucene/solr/branches/cloud/contrib/dataimporthandler/src/test/resources/solr/conf/dataimport-solrconfig.xml
lucene/solr/branches/cloud/contrib/dataimporthandler/src/test/resources/solr/conf/single-entity-data-config.xml
lucene/solr/branches/cloud/example/example-DIH/solr/solr.xml
lucene/solr/branches/cloud/example/solr/conf/solrconfig.xml
lucene/solr/branches/cloud/src/common/org/apache/solr/common/params/CoreAdminParams.java
lucene/solr/branches/cloud/src/common/org/apache/solr/common/params/TermsParams.java
lucene/solr/branches/cloud/src/common/org/apache/solr/common/util/ConcurrentLRUCache.java
lucene/solr/branches/cloud/src/java/org/apache/solr/analysis/BaseCharFilterFactory.java
lucene/solr/branches/cloud/src/java/org/apache/solr/core/CoreContainer.java
lucene/solr/branches/cloud/src/java/org/apache/solr/core/SolrResourceLoader.java
lucene/solr/branches/cloud/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java
lucene/solr/branches/cloud/src/java/org/apache/solr/handler/component/ResponseBuilder.java
lucene/solr/branches/cloud/src/java/org/apache/solr/handler/component/ShardRequest.java
lucene/solr/branches/cloud/src/java/org/apache/solr/handler/component/TermsComponent.java
lucene/solr/branches/cloud/src/java/org/apache/solr/search/FastLRUCache.java
lucene/solr/branches/cloud/src/java/org/apache/solr/search/LRUCache.java
lucene/solr/branches/cloud/src/java/org/apache/solr/search/QueryParsing.java
lucene/solr/branches/cloud/src/java/org/apache/solr/search/SolrCache.java
lucene/solr/branches/cloud/src/java/org/apache/solr/search/SolrIndexSearcher.java
lucene/solr/branches/cloud/src/java/org/apache/solr/search/ValueSourceParser.java
lucene/solr/branches/cloud/src/java/org/apache/solr/search/function/ValueSource.java
lucene/solr/branches/cloud/src/java/org/apache/solr/search/function/distance/DistanceUtils.java
lucene/solr/branches/cloud/src/solrj/org/apache/solr/client/solrj/SolrQuery.java
lucene/solr/branches/cloud/src/solrj/org/apache/solr/client/solrj/impl/StreamingUpdateSolrServer.java
lucene/solr/branches/cloud/src/solrj/org/apache/solr/client/solrj/response/QueryResponse.java
lucene/solr/branches/cloud/src/test/org/apache/solr/client/solrj/MultiCoreExampleTestBase.java
lucene/solr/branches/cloud/src/test/org/apache/solr/client/solrj/SolrQueryTest.java
lucene/solr/branches/cloud/src/test/org/apache/solr/handler/component/TermsComponentTest.java
lucene/solr/branches/cloud/src/webapp/web/admin/index.jsp
lucene/solr/branches/cloud/src/webapp/web/index.jsp
Propchange: lucene/solr/branches/cloud/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Dec 15 14:49:18 2009
@@ -1 +1 @@
-/lucene/solr/trunk:888480-888806
+/lucene/solr/trunk:888480-890798
Modified: lucene/solr/branches/cloud/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/solr/branches/cloud/CHANGES.txt?rev=890809&r1=890808&r2=890809&view=diff
==============================================================================
--- lucene/solr/branches/cloud/CHANGES.txt (original)
+++ lucene/solr/branches/cloud/CHANGES.txt Tue Dec 15 14:49:18 2009
@@ -24,6 +24,7 @@
================== 1.5.0-dev ==================
Upgrading from Solr 1.4
----------------------
+The experimental ALIAS command is removed in Solr 1.5 (SOLR-1637).
Versions of Major Components
---------------------
@@ -56,6 +57,20 @@
* SOLR-785: Distributed Search support for SpellCheckComponent
(Matthew Woytowitz, shalin)
+* SOLR-1625: Add regexp support for TermsComponent (Uri Boness via noble)
+
+* SOLR-1297: Add sort by Function capability (gsingers)
+
+* SOLR-1139: Add TermsComponent Query and Response Support in SolrJ (Matt Weber via shalin)
+
+* SOLR-1177: Distributed Search support for TermsComponent (Matt Weber via shalin)
+
+* SOLR-1621: Allow current single core deployments to be specified by solr.xml (Mark Miller , noble)
+
+* SOLR-1532: Allow StreamingUpdateSolrServer to use a provided HttpClient (Gabriele Renzi via shalin)
+
+* SOLR-1653: Add PatternReplaceCharFilter (koji)
+
Optimizations
----------------------
@@ -124,6 +139,9 @@
DOMUtils - notably for plugin init params in solrconfig.xml.
(hossman)
+* SOLR-1651: Fixed Incorrect dataimport handler package name in SolrResourceLoader
+ (Akshay Ukey via shalin)
+
Other Changes
----------------------
@@ -144,6 +162,10 @@
* Upgraded to Lucene 2.9-dev r888785 (shalin)
+* SOLR-1610: Generify SolrCache (Jason Rutherglen via shalin)
+
+* SOLR-1637: Remove ALIAS command
+
Build
----------------------
@@ -909,6 +931,8 @@
Also, HighlightingUtils#getQueryScorer has been removed as it was deprecated and backcompat has been
broken with it anyway. (Mark Miller)
+50. SOLR-1357 SolrInputDocument cannot process dynamic fields (Lars Grote via noble)
+
Build
----------------------
1. SOLR-776: Added in ability to sign artifacts via Ant for releases (gsingers)
Modified: lucene/solr/branches/cloud/build.xml
URL: http://svn.apache.org/viewvc/lucene/solr/branches/cloud/build.xml?rev=890809&r1=890808&r2=890809&view=diff
==============================================================================
--- lucene/solr/branches/cloud/build.xml (original)
+++ lucene/solr/branches/cloud/build.xml Tue Dec 15 14:49:18 2009
@@ -394,6 +394,7 @@
dir="src/test/test-files/"
>
<jvmarg line="${args}"/>
+ <jvmarg line="-Djava.util.logging.config.file=log.properties"/>
<formatter type="brief" usefile="false" if="junit.details"/>
<classpath refid="test.run.classpath"/>
<formatter type="${junit.formatter}"/>
Modified: lucene/solr/branches/cloud/contrib/dataimporthandler/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/solr/branches/cloud/contrib/dataimporthandler/CHANGES.txt?rev=890809&r1=890808&r2=890809&view=diff
==============================================================================
--- lucene/solr/branches/cloud/contrib/dataimporthandler/CHANGES.txt (original)
+++ lucene/solr/branches/cloud/contrib/dataimporthandler/CHANGES.txt Tue Dec 15 14:49:18 2009
@@ -21,18 +21,30 @@
New Features
----------------------
-* SOLR-1525 allow DIH to refer to core properties (noble)
-* SOLR-1547 TemplateTransformer copy objects more intelligently when there when the template is a single variable (noble)
-* SOLR-1627 VariableResolver should be fetched just in time (noble)
-* SOLR-1583 Create DataSources that return InputStream (noble)
+* SOLR-1525 : allow DIH to refer to core properties (noble)
+
+* SOLR-1547 : TemplateTransformer copy objects more intelligently when there when the template is a single variable (noble)
+
+* SOLR-1627 : VariableResolver should be fetched just in time (noble)
+
+* SOLR-1583 : Create DataSources that return InputStream (noble)
+
+* SOLR-1358 : Integration of Tika and DataImportHandler ( Akshay Ukey, noble)
+
+* SOLR-1654 : TikaEntityProcessor example added DIHExample (Akshay Ukey via noble)
+
Optimizations
----------------------
Bug Fixes
----------------------
+* SOLR-1638: Fixed NullPointerException during import if uniqueKey is not specified
+ in schema (Akshay Ukey via shalin)
+* SOLR-1639: Fixed misleading error message when dataimport.properties is not writable (shalin)
+* SOLR-1598: Reader used in PlainTextEntityProcessor is not explicitly closed (Sascha Szott via noble)
Other Changes
----------------------
Copied: lucene/solr/branches/cloud/contrib/dataimporthandler/src/extras/main/java/org/apache/solr/handler/dataimport/MailEntityProcessor.java (from r890798, lucene/solr/trunk/contrib/dataimporthandler/src/extras/main/java/org/apache/solr/handler/dataimport/MailEntityProcessor.java)
URL: http://svn.apache.org/viewvc/lucene/solr/branches/cloud/contrib/dataimporthandler/src/extras/main/java/org/apache/solr/handler/dataimport/MailEntityProcessor.java?p2=lucene/solr/branches/cloud/contrib/dataimporthandler/src/extras/main/java/org/apache/solr/handler/dataimport/MailEntityProcessor.java&p1=lucene/solr/trunk/contrib/dataimporthandler/src/extras/main/java/org/apache/solr/handler/dataimport/MailEntityProcessor.java&r1=890798&r2=890809&rev=890809&view=diff
==============================================================================
(empty)
Copied: lucene/solr/branches/cloud/contrib/dataimporthandler/src/extras/test/java/org/apache/solr/handler/dataimport/TestMailEntityProcessor.java (from r890798, lucene/solr/trunk/contrib/dataimporthandler/src/extras/test/java/org/apache/solr/handler/dataimport/TestMailEntityProcessor.java)
URL: http://svn.apache.org/viewvc/lucene/solr/branches/cloud/contrib/dataimporthandler/src/extras/test/java/org/apache/solr/handler/dataimport/TestMailEntityProcessor.java?p2=lucene/solr/branches/cloud/contrib/dataimporthandler/src/extras/test/java/org/apache/solr/handler/dataimport/TestMailEntityProcessor.java&p1=lucene/solr/trunk/contrib/dataimporthandler/src/extras/test/java/org/apache/solr/handler/dataimport/TestMailEntityProcessor.java&r1=890798&r2=890809&rev=890809&view=diff
==============================================================================
(empty)
Modified: lucene/solr/branches/cloud/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/DataConfig.java
URL: http://svn.apache.org/viewvc/lucene/solr/branches/cloud/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/DataConfig.java?rev=890809&r1=890808&r2=890809&view=diff
==============================================================================
--- lucene/solr/branches/cloud/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/DataConfig.java (original)
+++ lucene/solr/branches/cloud/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/DataConfig.java Tue Dec 15 14:49:18 2009
@@ -279,6 +279,12 @@
dataSources.put(p.getProperty("name"), p);
}
}
+ if(dataSources.get(null) == null){
+ for (Properties properties : dataSources.values()) {
+ dataSources.put(null,properties);
+ break;
+ }
+ }
}
private static String getStringAttribute(Element e, String name, String def) {
Modified: lucene/solr/branches/cloud/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/DataImporter.java
URL: http://svn.apache.org/viewvc/lucene/solr/branches/cloud/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/DataImporter.java?rev=890809&r1=890808&r2=890809&view=diff
==============================================================================
--- lucene/solr/branches/cloud/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/DataImporter.java (original)
+++ lucene/solr/branches/cloud/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/DataImporter.java Tue Dec 15 14:49:18 2009
@@ -149,8 +149,12 @@
}
private void identifyPk(DataConfig.Entity entity) {
- String schemaPk = schema.getUniqueKeyField().getName();
- //if no fields are mentioned . solr uniqeKey is same as dih 'pk'
+ SchemaField uniqueKey = schema.getUniqueKeyField();
+ String schemaPk = "";
+ if (uniqueKey != null)
+ schemaPk = uniqueKey.getName();
+ else return;
+ //if no fields are mentioned . solr uniqueKey is same as dih 'pk'
entity.pkMappingFromSchema = schemaPk;
for (DataConfig.Field field : entity.fields) {
if(field.getName().equals(schemaPk)) {
@@ -267,7 +271,6 @@
}
DataSource getDataSourceInstance(DataConfig.Entity key, String name, Context ctx) {
- if ("null".equals(name)) return new MockDataSource();
Properties p = dataSourceProps.get(name);
if (p == null)
p = config.dataSources.get(name);
@@ -279,15 +282,15 @@
throw new DataImportHandlerException(SEVERE,
"No dataSource :" + name + " available for entity :"
+ key.name);
- String impl = p.getProperty(TYPE);
+ String type = p.getProperty(TYPE);
DataSource dataSrc = null;
- if (impl == null) {
+ if (type == null) {
dataSrc = new JdbcDataSource();
} else {
try {
- dataSrc = (DataSource) DocBuilder.loadClass(impl, getCore()).newInstance();
+ dataSrc = (DataSource) DocBuilder.loadClass(type, getCore()).newInstance();
} catch (Exception e) {
- wrapAndThrow(SEVERE, e, "Invalid type for data source: " + impl);
+ wrapAndThrow(SEVERE, e, "Invalid type for data source: " + type);
}
}
try {
Modified: lucene/solr/branches/cloud/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/DocBuilder.java
URL: http://svn.apache.org/viewvc/lucene/solr/branches/cloud/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/DocBuilder.java?rev=890809&r1=890808&r2=890809&view=diff
==============================================================================
--- lucene/solr/branches/cloud/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/DocBuilder.java (original)
+++ lucene/solr/branches/cloud/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/DocBuilder.java Tue Dec 15 14:49:18 2009
@@ -229,7 +229,13 @@
if (requestParameters.optimize)
addStatusMessage("Optimized");
}
- writer.persist(lastIndexTimeProps);
+ try {
+ writer.persist(lastIndexTimeProps);
+ } catch (Exception e) {
+ LOG.error("Could not write property file", e);
+ statusMessages.put("error", "Could not write property file. Delta imports will not work. " +
+ "Make sure your conf directory is writable");
+ }
}
void rollback() {
Modified: lucene/solr/branches/cloud/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/PlainTextEntityProcessor.java
URL: http://svn.apache.org/viewvc/lucene/solr/branches/cloud/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/PlainTextEntityProcessor.java?rev=890809&r1=890808&r2=890809&view=diff
==============================================================================
--- lucene/solr/branches/cloud/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/PlainTextEntityProcessor.java (original)
+++ lucene/solr/branches/cloud/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/PlainTextEntityProcessor.java Tue Dec 15 14:49:18 2009
@@ -19,6 +19,7 @@
import static org.apache.solr.handler.dataimport.DataImportHandlerException.SEVERE;
import static org.apache.solr.handler.dataimport.DataImportHandlerException.wrapAndThrow;
import static org.apache.solr.handler.dataimport.XPathEntityProcessor.URL;
+import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -77,6 +78,7 @@
Map<String, Object> row = new HashMap<String, Object>();
row.put(PLAIN_TEXT, sw.toString());
ended = true;
+ IOUtils.closeQuietly(r);
return row;
}
Modified: lucene/solr/branches/cloud/contrib/dataimporthandler/src/test/java/org/apache/solr/handler/dataimport/TestDocBuilder2.java
URL: http://svn.apache.org/viewvc/lucene/solr/branches/cloud/contrib/dataimporthandler/src/test/java/org/apache/solr/handler/dataimport/TestDocBuilder2.java?rev=890809&r1=890808&r2=890809&view=diff
==============================================================================
--- lucene/solr/branches/cloud/contrib/dataimporthandler/src/test/java/org/apache/solr/handler/dataimport/TestDocBuilder2.java (original)
+++ lucene/solr/branches/cloud/contrib/dataimporthandler/src/test/java/org/apache/solr/handler/dataimport/TestDocBuilder2.java Tue Dec 15 14:49:18 2009
@@ -298,7 +298,7 @@
" </document>\n" +
"</dataConfig>";
- private final String dataConfigWithDynamicTransformer = "<dataConfig>\n" +
+ private final String dataConfigWithDynamicTransformer = "<dataConfig> <dataSource type=\"MockDataSource\"/>\n" +
" <document>\n" +
" <entity name=\"books\" query=\"select * from x\"" +
" transformer=\"TestDocBuilder2$AddDynamicFieldTransformer\">\n" +
@@ -308,7 +308,7 @@
" </document>\n" +
"</dataConfig>";
- private final String dataConfigForSkipTransform = "<dataConfig>\n" +
+ private final String dataConfigForSkipTransform = "<dataConfig> <dataSource type=\"MockDataSource\"/>\n" +
" <document>\n" +
" <entity name=\"books\" query=\"select * from x\"" +
" transformer=\"TemplateTransformer\">\n" +
@@ -319,7 +319,7 @@
" </document>\n" +
"</dataConfig>";
- private final String dataConfigWithTwoEntities = "<dataConfig>\n" +
+ private final String dataConfigWithTwoEntities = "<dataConfig><dataSource type=\"MockDataSource\"/>\n" +
" <document>\n" +
" <entity name=\"books\" query=\"select * from x\">" +
" <field column=\"id\" />\n" +
@@ -331,7 +331,7 @@
" </document>\n" +
"</dataConfig>";
- private final String dataConfigWithCaseInsensitiveFields = "<dataConfig>\n" +
+ private final String dataConfigWithCaseInsensitiveFields = "<dataConfig> <dataSource type=\"MockDataSource\"/>\n" +
" <document onImportStart=\"TestDocBuilder2$StartEventListener\" onImportEnd=\"TestDocBuilder2$EndEventListener\">\n" +
" <entity name=\"books\" query=\"select * from x\">\n" +
" <field column=\"ID\" />\n" +
@@ -340,7 +340,7 @@
" </document>\n" +
"</dataConfig>";
- private final String dataConfigWithTemplatizedFieldNames = "<dataConfig>\n" +
+ private final String dataConfigWithTemplatizedFieldNames = "<dataConfig><dataSource type=\"MockDataSource\"/>\n" +
" <document>\n" +
" <entity name=\"books\" query=\"select * from x\">\n" +
" <field column=\"mypk\" name=\"${dih.request.mypk}\" />\n" +
Modified: lucene/solr/branches/cloud/contrib/dataimporthandler/src/test/java/org/apache/solr/handler/dataimport/TestErrorHandling.java
URL: http://svn.apache.org/viewvc/lucene/solr/branches/cloud/contrib/dataimporthandler/src/test/java/org/apache/solr/handler/dataimport/TestErrorHandling.java?rev=890809&r1=890808&r2=890809&view=diff
==============================================================================
--- lucene/solr/branches/cloud/contrib/dataimporthandler/src/test/java/org/apache/solr/handler/dataimport/TestErrorHandling.java (original)
+++ lucene/solr/branches/cloud/contrib/dataimporthandler/src/test/java/org/apache/solr/handler/dataimport/TestErrorHandling.java Tue Dec 15 14:49:18 2009
@@ -133,6 +133,7 @@
private String dataConfigWithTransformer = "<dataConfig>\n" +
" <dataSource name=\"str\" type=\"TestErrorHandling$StringDataSource\" />" +
+ "<dataSource type=\"MockDataSource\"/>" +
" <document>\n" +
" <entity name=\"node\" dataSource=\"str\" processor=\"XPathEntityProcessor\" url=\"test\" forEach=\"/root/node\">\n" +
" <field column=\"id\" xpath=\"/root/node/id\" />\n" +
Modified: lucene/solr/branches/cloud/contrib/dataimporthandler/src/test/java/org/apache/solr/handler/dataimport/TestSqlEntityProcessor2.java
URL: http://svn.apache.org/viewvc/lucene/solr/branches/cloud/contrib/dataimporthandler/src/test/java/org/apache/solr/handler/dataimport/TestSqlEntityProcessor2.java?rev=890809&r1=890808&r2=890809&view=diff
==============================================================================
--- lucene/solr/branches/cloud/contrib/dataimporthandler/src/test/java/org/apache/solr/handler/dataimport/TestSqlEntityProcessor2.java (original)
+++ lucene/solr/branches/cloud/contrib/dataimporthandler/src/test/java/org/apache/solr/handler/dataimport/TestSqlEntityProcessor2.java Tue Dec 15 14:49:18 2009
@@ -218,14 +218,14 @@
}
}
- private static String dataConfig_LastIndexTime = "<dataConfig>\n" +
+ private static String dataConfig_LastIndexTime = "<dataConfig><dataSource type=\"MockDataSource\"/>\n" +
"\t<function name=\"checkDateFormat\" class=\"org.apache.solr.handler.dataimport.TestSqlEntityProcessor2$DateFormatValidatingEvaluator\"/>\n" +
"\t<document>\n" +
"\t\t<entity name=\"x\" query=\"select * from x where last_modified > ${dih.functions.checkDateFormat(dih.last_index_time)}\" />\n" +
"\t</document>\n" +
"</dataConfig>";
- private static String dataConfig = "<dataConfig>\n"
+ private static String dataConfig = "<dataConfig><dataSource type=\"MockDataSource\"/>\n"
+ " <document>\n"
+ " <entity name=\"x\" pk=\"id\" query=\"select * from x\" deletedPkQuery=\"select id from x where last_modified > NOW AND deleted='true'\" deltaQuery=\"select id from x where last_modified > NOW\">\n"
+ " <field column=\"id\" />\n"
@@ -234,7 +234,7 @@
+ " </entity>\n" + " </entity>\n"
+ " </document>\n" + "</dataConfig>\n";
- private static String dataConfig_deltaimportquery = "<dataConfig>\n"
+ private static String dataConfig_deltaimportquery = "<dataConfig><dataSource type=\"MockDataSource\"/>\n"
+ " <document>\n"
+ " <entity name=\"x\" deltaImportQuery=\"select * from x where id=${dataimporter.delta.id}\" deltaQuery=\"select id from x where last_modified > NOW\">\n"
+ " <field column=\"id\" />\n"
Modified: lucene/solr/branches/cloud/contrib/dataimporthandler/src/test/java/org/apache/solr/handler/dataimport/TestSqlEntityProcessorDelta.java
URL: http://svn.apache.org/viewvc/lucene/solr/branches/cloud/contrib/dataimporthandler/src/test/java/org/apache/solr/handler/dataimport/TestSqlEntityProcessorDelta.java?rev=890809&r1=890808&r2=890809&view=diff
==============================================================================
--- lucene/solr/branches/cloud/contrib/dataimporthandler/src/test/java/org/apache/solr/handler/dataimport/TestSqlEntityProcessorDelta.java (original)
+++ lucene/solr/branches/cloud/contrib/dataimporthandler/src/test/java/org/apache/solr/handler/dataimport/TestSqlEntityProcessorDelta.java Tue Dec 15 14:49:18 2009
@@ -279,7 +279,7 @@
assertQ(req("desc:goodbye"), "//*[@numFound='1']");
}
- private static String dataConfig_delta = "<dataConfig>\n"
+ private static String dataConfig_delta = "<dataConfig><dataSource type=\"MockDataSource\"/>\n"
+ " <document>\n"
+ " <entity name=\"x\" transformer=\"TemplateTransformer\""
+ " query=\"" + FULLIMPORT_QUERY + "\""
Modified: lucene/solr/branches/cloud/contrib/dataimporthandler/src/test/java/org/apache/solr/handler/dataimport/TestSqlEntityProcessorDelta2.java
URL: http://svn.apache.org/viewvc/lucene/solr/branches/cloud/contrib/dataimporthandler/src/test/java/org/apache/solr/handler/dataimport/TestSqlEntityProcessorDelta2.java?rev=890809&r1=890808&r2=890809&view=diff
==============================================================================
--- lucene/solr/branches/cloud/contrib/dataimporthandler/src/test/java/org/apache/solr/handler/dataimport/TestSqlEntityProcessorDelta2.java (original)
+++ lucene/solr/branches/cloud/contrib/dataimporthandler/src/test/java/org/apache/solr/handler/dataimport/TestSqlEntityProcessorDelta2.java Tue Dec 15 14:49:18 2009
@@ -275,7 +275,7 @@
assertQ(req("desc:goodbye"), "//*[@numFound='1']");
}
- private static String dataConfig_delta2 = "<dataConfig>\n"
+ private static String dataConfig_delta2 = "<dataConfig><dataSource type=\"MockDataSource\"/>\n"
+ " <document>\n"
+ " <entity name=\"x\" transformer=\"TemplateTransformer\""
+ " query=\"" + FULLIMPORT_QUERY + "\""
Modified: lucene/solr/branches/cloud/contrib/dataimporthandler/src/test/resources/solr/conf/dataimport-solrconfig.xml
URL: http://svn.apache.org/viewvc/lucene/solr/branches/cloud/contrib/dataimporthandler/src/test/resources/solr/conf/dataimport-solrconfig.xml?rev=890809&r1=890808&r2=890809&view=diff
==============================================================================
--- lucene/solr/branches/cloud/contrib/dataimporthandler/src/test/resources/solr/conf/dataimport-solrconfig.xml (original)
+++ lucene/solr/branches/cloud/contrib/dataimporthandler/src/test/resources/solr/conf/dataimport-solrconfig.xml Tue Dec 15 14:49:18 2009
@@ -328,11 +328,6 @@
</requestHandler>
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
- <lst name="defaults">
- <lst name="datasource">
- <str name="type">MockDataSource</str>
- </lst>
- </lst>
</requestHandler>
<!--
Modified: lucene/solr/branches/cloud/contrib/dataimporthandler/src/test/resources/solr/conf/single-entity-data-config.xml
URL: http://svn.apache.org/viewvc/lucene/solr/branches/cloud/contrib/dataimporthandler/src/test/resources/solr/conf/single-entity-data-config.xml?rev=890809&r1=890808&r2=890809&view=diff
==============================================================================
--- lucene/solr/branches/cloud/contrib/dataimporthandler/src/test/resources/solr/conf/single-entity-data-config.xml (original)
+++ lucene/solr/branches/cloud/contrib/dataimporthandler/src/test/resources/solr/conf/single-entity-data-config.xml Tue Dec 15 14:49:18 2009
@@ -1,4 +1,5 @@
<dataConfig>
+ <dataSource type="MockDataSource"/>
<document>
<entity name="x" query="select * from x">
<field column="id" />
Modified: lucene/solr/branches/cloud/example/example-DIH/solr/solr.xml
URL: http://svn.apache.org/viewvc/lucene/solr/branches/cloud/example/example-DIH/solr/solr.xml?rev=890809&r1=890808&r2=890809&view=diff
==============================================================================
--- lucene/solr/branches/cloud/example/example-DIH/solr/solr.xml (original)
+++ lucene/solr/branches/cloud/example/example-DIH/solr/solr.xml Tue Dec 15 14:49:18 2009
@@ -1,8 +1,9 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<solr sharedLib="lib" persistent="true">
<cores adminPath="/admin/cores">
- <core default="true" instanceDir="db" name="db"></core>
- <core default="false" instanceDir="rss" name="rss"></core>
- <core default="false" instanceDir="mail" name="mail"></core>
+ <core default="true" instanceDir="db" name="db"/>
+ <core default="false" instanceDir="rss" name="rss"/>
+ <core default="false" instanceDir="mail" name="mail"/>
+ <core default="false" instanceDir="tika" name="tika"/>
</cores>
</solr>
Modified: lucene/solr/branches/cloud/example/solr/conf/solrconfig.xml
URL: http://svn.apache.org/viewvc/lucene/solr/branches/cloud/example/solr/conf/solrconfig.xml?rev=890809&r1=890808&r2=890809&view=diff
==============================================================================
--- lucene/solr/branches/cloud/example/solr/conf/solrconfig.xml (original)
+++ lucene/solr/branches/cloud/example/solr/conf/solrconfig.xml Tue Dec 15 14:49:18 2009
@@ -792,8 +792,7 @@
</requestHandler>
- <!-- A component to return terms and document frequency of those terms.
- This component does not yet support distributed search. -->
+ <!-- A component to return terms and document frequency of those terms. -->
<searchComponent name="termsComponent" class="org.apache.solr.handler.component.TermsComponent"/>
<requestHandler name="/terms" class="org.apache.solr.handler.component.SearchHandler">
Modified: lucene/solr/branches/cloud/src/common/org/apache/solr/common/params/CoreAdminParams.java
URL: http://svn.apache.org/viewvc/lucene/solr/branches/cloud/src/common/org/apache/solr/common/params/CoreAdminParams.java?rev=890809&r1=890808&r2=890809&view=diff
==============================================================================
--- lucene/solr/branches/cloud/src/common/org/apache/solr/common/params/CoreAdminParams.java (original)
+++ lucene/solr/branches/cloud/src/common/org/apache/solr/common/params/CoreAdminParams.java Tue Dec 15 14:49:18 2009
@@ -66,6 +66,7 @@
PERSIST,
SWAP,
RENAME,
+ @Deprecated
ALIAS,
MERGEINDEXES;
Modified: lucene/solr/branches/cloud/src/common/org/apache/solr/common/params/TermsParams.java
URL: http://svn.apache.org/viewvc/lucene/solr/branches/cloud/src/common/org/apache/solr/common/params/TermsParams.java?rev=890809&r1=890808&r2=890809&view=diff
==============================================================================
--- lucene/solr/branches/cloud/src/common/org/apache/solr/common/params/TermsParams.java (original)
+++ lucene/solr/branches/cloud/src/common/org/apache/solr/common/params/TermsParams.java Tue Dec 15 14:49:18 2009
@@ -17,6 +17,7 @@
package org.apache.solr.common.params;
+import java.util.regex.Pattern;
/**
*
@@ -68,7 +69,32 @@
public static final String TERMS_PREFIX_STR = TERMS_PREFIX + "prefix";
- /**
+ public static final String TERMS_REGEXP_STR = TERMS_PREFIX + "regex";
+
+ public static final String TERMS_REGEXP_FLAG = TERMS_REGEXP_STR + ".flag";
+
+ public static enum TermsRegexpFlag {
+ UNIX_LINES(Pattern.UNIX_LINES),
+ CASE_INSENSITIVE(Pattern.CASE_INSENSITIVE),
+ COMMENTS(Pattern.COMMENTS),
+ MULTILINE(Pattern.MULTILINE),
+ LITERAL(Pattern.LITERAL),
+ DOTALL(Pattern.DOTALL),
+ UNICODE_CASE(Pattern.UNICODE_CASE),
+ CANON_EQ(Pattern.CANON_EQ);
+
+ int value;
+
+ TermsRegexpFlag(int value) {
+ this.value = value;
+ }
+
+ public int getValue() {
+ return value;
+ }
+ }
+
+ /**
* Optional. The minimum value of docFreq to be returned. 1 by default
*/
public static final String TERMS_MINCOUNT = TERMS_PREFIX + "mincount";
Modified: lucene/solr/branches/cloud/src/common/org/apache/solr/common/util/ConcurrentLRUCache.java
URL: http://svn.apache.org/viewvc/lucene/solr/branches/cloud/src/common/org/apache/solr/common/util/ConcurrentLRUCache.java?rev=890809&r1=890808&r2=890809&view=diff
==============================================================================
--- lucene/solr/branches/cloud/src/common/org/apache/solr/common/util/ConcurrentLRUCache.java (original)
+++ lucene/solr/branches/cloud/src/common/org/apache/solr/common/util/ConcurrentLRUCache.java Tue Dec 15 14:49:18 2009
@@ -44,7 +44,7 @@
public class ConcurrentLRUCache<K,V> {
private static Logger log = LoggerFactory.getLogger(ConcurrentLRUCache.class);
- private final ConcurrentHashMap<Object, CacheEntry> map;
+ private final ConcurrentHashMap<Object, CacheEntry<K,V>> map;
private final int upperWaterMark, lowerWaterMark;
private final ReentrantLock markAndSweepLock = new ReentrantLock(true);
private boolean isCleaning = false; // not volatile... piggybacked on other volatile vars
@@ -62,7 +62,7 @@
if (upperWaterMark < 1) throw new IllegalArgumentException("upperWaterMark must be > 0");
if (lowerWaterMark >= upperWaterMark)
throw new IllegalArgumentException("lowerWaterMark must be < upperWaterMark");
- map = new ConcurrentHashMap<Object, CacheEntry>(initialSize);
+ map = new ConcurrentHashMap<Object, CacheEntry<K,V>>(initialSize);
newThreadForCleanup = runNewThreadForCleanup;
this.upperWaterMark = upperWaterMark;
this.lowerWaterMark = lowerWaterMark;
@@ -102,10 +102,10 @@
return null;
}
- public Object put(K key, V val) {
+ public V put(K key, V val) {
if (val == null) return null;
- CacheEntry e = new CacheEntry(key, val, stats.accessCounter.incrementAndGet());
- CacheEntry oldCacheEntry = map.put(key, e);
+ CacheEntry<K,V> e = new CacheEntry<K,V>(key, val, stats.accessCounter.incrementAndGet());
+ CacheEntry<K,V> oldCacheEntry = map.put(key, e);
int currentSize;
if (oldCacheEntry == null) {
currentSize = stats.size.incrementAndGet();
@@ -401,7 +401,7 @@
Map<K, V> result = new LinkedHashMap<K, V>();
TreeSet<CacheEntry> tree = new TreeSet<CacheEntry>();
try {
- for (Map.Entry<Object, CacheEntry> entry : map.entrySet()) {
+ for (Map.Entry<Object, CacheEntry<K,V>> entry : map.entrySet()) {
CacheEntry ce = entry.getValue();
ce.lastAccessedCopy = ce.lastAccessed;
if (tree.size() < n) {
@@ -428,8 +428,8 @@
Map<K,V> result = new LinkedHashMap<K,V>();
TreeSet<CacheEntry> tree = new TreeSet<CacheEntry>();
try {
- for (Map.Entry<Object, CacheEntry> entry : map.entrySet()) {
- CacheEntry ce = entry.getValue();
+ for (Map.Entry<Object, CacheEntry<K,V>> entry : map.entrySet()) {
+ CacheEntry<K,V> ce = entry.getValue();
ce.lastAccessedCopy = ce.lastAccessed;
if (tree.size() < n) {
tree.add(ce);
@@ -457,11 +457,11 @@
map.clear();
}
- public Map<Object, CacheEntry> getMap() {
+ public Map<Object, CacheEntry<K,V>> getMap() {
return map;
}
- private static class CacheEntry<K,V> implements Comparable<CacheEntry> {
+ private static class CacheEntry<K,V> implements Comparable<CacheEntry<K,V>> {
K key;
V value;
volatile long lastAccessed = 0;
@@ -478,7 +478,7 @@
this.lastAccessed = lastAccessed;
}
- public int compareTo(CacheEntry that) {
+ public int compareTo(CacheEntry<K,V> that) {
if (this.lastAccessedCopy == that.lastAccessedCopy) return 0;
return this.lastAccessedCopy < that.lastAccessedCopy ? 1 : -1;
}
Modified: lucene/solr/branches/cloud/src/java/org/apache/solr/analysis/BaseCharFilterFactory.java
URL: http://svn.apache.org/viewvc/lucene/solr/branches/cloud/src/java/org/apache/solr/analysis/BaseCharFilterFactory.java?rev=890809&r1=890808&r2=890809&view=diff
==============================================================================
--- lucene/solr/branches/cloud/src/java/org/apache/solr/analysis/BaseCharFilterFactory.java (original)
+++ lucene/solr/branches/cloud/src/java/org/apache/solr/analysis/BaseCharFilterFactory.java Tue Dec 15 14:49:18 2009
@@ -43,4 +43,20 @@
this.args = args;
}
+ protected int getInt(String name) {
+ return getInt(name,-1,false);
+ }
+
+ protected int getInt(String name, int defaultVal) {
+ return getInt(name,defaultVal,true);
+ }
+
+ protected int getInt(String name, int defaultVal, boolean useDefault) {
+ String s = args.get(name);
+ if (s==null) {
+ if (useDefault) return defaultVal;
+ throw new RuntimeException("Configuration Error: missing parameter '" + name + "'");
+ }
+ return Integer.parseInt(s);
+ }
}
Modified: lucene/solr/branches/cloud/src/java/org/apache/solr/core/CoreContainer.java
URL: http://svn.apache.org/viewvc/lucene/solr/branches/cloud/src/java/org/apache/solr/core/CoreContainer.java?rev=890809&r1=890808&r2=890809&view=diff
==============================================================================
--- lucene/solr/branches/cloud/src/java/org/apache/solr/core/CoreContainer.java (original)
+++ lucene/solr/branches/cloud/src/java/org/apache/solr/core/CoreContainer.java Tue Dec 15 14:49:18 2009
@@ -17,14 +17,7 @@
package org.apache.solr.core;
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.io.Writer;
-import java.io.InputStream;
+import java.io.*;
import java.nio.channels.FileChannel;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
@@ -42,7 +35,6 @@
import org.apache.solr.common.params.CoreAdminParams;
import org.apache.solr.common.util.DOMUtil;
import org.apache.solr.common.util.XML;
-import org.apache.solr.common.util.StrUtils;
import org.apache.solr.common.util.FileUtils;
import org.apache.solr.handler.admin.CoreAdminHandler;
import org.apache.solr.schema.IndexSchema;
@@ -58,6 +50,8 @@
*/
public class CoreContainer
{
+ private static final String DEFAULT_CORE_NAME = "DEFAULT_CORE";
+
protected static Logger log = LoggerFactory.getLogger(CoreContainer.class);
protected final Map<String, SolrCore> cores = new LinkedHashMap<String, SolrCore>();
@@ -69,28 +63,31 @@
protected String libDir = null;
protected ClassLoader libLoader = null;
protected SolrResourceLoader loader = null;
+ @Deprecated
protected java.lang.ref.WeakReference<SolrCore> adminCore = null;
protected Properties containerProperties;
protected Map<String ,IndexSchema> indexSchemaCache;
protected String adminHandler;
protected boolean shareSchema;
protected String solrHome;
+ protected String solrConfigFilenameOverride;
+ protected String solrDataDirOverride;
protected static final String collection = System.getProperty("collection", "collection1"); //nocommit: default;
private ZooKeeperController zooKeeperController;
public CoreContainer() {
solrHome = SolrResourceLoader.locateSolrHome();
+ initZooKeeper();
}
- public CoreContainer(ZooKeeperController zooKeeperController) {
- this();
- this.zooKeeperController = zooKeeperController;
- }
-
- public CoreContainer(String solrHome, ZooKeeperController zooKeeperController) {
- this.solrHome = solrHome;
- this.zooKeeperController = zooKeeperController;
+ private void initZooKeeper() {
+ //nocommit: pull zookeeper integration into a new CoreContainer? leaning towards no.
+ String zookeeperHost = System.getProperty("zkHost");
+
+ if (zookeeperHost != null) {
+ zooKeeperController = new ZooKeeperController(zookeeperHost, collection);
+ }
}
public Properties getContainerProperties() {
@@ -102,9 +99,6 @@
protected String solrConfigFilename = null;
protected boolean abortOnConfigurationError = true;
protected String dataDir = null; // override datadir for single core mode
-
- private ZooKeeperController zooKeeperController;
- private String zookeeperHost;
public boolean isAbortOnConfigurationError() {
return abortOnConfigurationError;
@@ -124,78 +118,30 @@
// core container instantiation
public CoreContainer initialize() throws IOException, ParserConfigurationException, SAXException {
- //nocommit: pull zookeeper integration into a new CoreContainer? leaning towards no.
- zookeeperHost = System.getProperty("zkHost");
-
- if (zookeeperHost != null) {
- zooKeeperController = new ZooKeeperController(zookeeperHost, collection);
- }
-
CoreContainer cores = null;
String solrHome = SolrResourceLoader.locateSolrHome();
-
- File fconf = null;
-
- fconf = new File(solrHome, solrConfigFilename == null ? "solr.xml"
+ File fconf = new File(solrHome, solrConfigFilename == null ? "solr.xml"
: solrConfigFilename);
log.info("looking for solr.xml: " + fconf.getAbsolutePath());
-
- if (fconf.exists()) {
- //nocommit: finish ZooKeeper support in multicore case
- if (zookeeperHost == null) {
- cores = new CoreContainer();
- } else {
- cores = new CoreContainer(zooKeeperController);
- }
+ cores = new CoreContainer();
+ cores.solrConfigFilenameOverride = solrConfigFilename;
+ cores.solrDataDirOverride = dataDir;
+ if (fconf.exists())
cores.load(solrHome, fconf);
- abortOnConfigurationError = false;
- // if any core aborts on startup, then abort
- for (SolrCore c : cores.getCores()) {
- if (c.getSolrConfig().getBool("abortOnConfigurationError", false)) {
- abortOnConfigurationError = true;
- break;
- }
+ else {
+ cores.load(solrHome, new ByteArrayInputStream(DEF_SOLR_XML.getBytes()));
+ cores.configFile = fconf;
+ }
+ abortOnConfigurationError = false;
+ // if any core aborts on startup, then abort
+ for (SolrCore c : cores.getCores()) {
+ if (c.getSolrConfig().getBool("abortOnConfigurationError", false)) {
+ abortOnConfigurationError = true;
+ break;
}
- solrConfigFilename = cores.getConfigFile().getName();
- } else {
- // perform compatibility init
- SolrResourceLoader resourceLoader;
- CoreDescriptor dcore;
- if (zookeeperHost == null) {
- cores = new CoreContainer(solrHome);
- new CoreDescriptor(cores, "", ".");
- dcore = new CoreDescriptor(cores, "", ".");
- dcore.setCoreProperties(null);
- resourceLoader = new SolrResourceLoader(solrHome, null, getCoreProps(solrHome, null, dcore.getCoreProperties()));
- } else {
- cores = new CoreContainer(solrHome, zooKeeperController);
- dcore = new CoreDescriptor(cores, "", ".");
- dcore.setCoreProperties(null);
- resourceLoader = new ZKSolrResourceLoader(solrHome, collection, null, getCoreProps(solrHome, null, dcore.getCoreProperties()), zooKeeperController);
- }
-
- cores.loader = resourceLoader;
- SolrConfig cfg;
- IndexSchema schema = null;
- String solrConfigName = solrConfigFilename == null ? SolrConfig.DEFAULT_CONF_FILE : solrConfigFilename;
- if (zookeeperHost == null) {
- cfg = new SolrConfig(resourceLoader, solrConfigName, null);
- } else {
- // found ZooKeeper path, so load config from zookeeper
- log.info("Loading config from ZooKeeper");
- // load solrconfig
- cfg = zooKeeperController.getConfig(solrConfigName, resourceLoader);
- // load schema
- schema = zooKeeperController.getSchema(IndexSchema.DEFAULT_SCHEMA_FILE, cfg, resourceLoader);
- }
-
- SolrCore singlecore = new SolrCore(null, dataDir, cfg, schema, dcore);
- abortOnConfigurationError = cfg.getBool(
- "abortOnConfigurationError", abortOnConfigurationError);
- cores.register("", singlecore, false);
- cores.setPersistent(false);
- solrConfigFilename = cfg.getName();
}
+ solrConfigFilename = cores.getConfigFile().getName();
+
return cores;
}
}
@@ -231,7 +177,7 @@
* @throws IOException
* @throws SAXException
*/
- public CoreContainer(String dir, File configFile ) throws ParserConfigurationException, IOException, SAXException
+ public CoreContainer(String dir, File configFile) throws ParserConfigurationException, IOException, SAXException
{
this.load(dir, configFile);
}
@@ -243,10 +189,12 @@
public CoreContainer(SolrResourceLoader loader) {
this.loader = loader;
this.solrHome = loader.getInstanceDir();
+ initZooKeeper();
}
public CoreContainer(String solrHome) {
this.solrHome = solrHome;
+ initZooKeeper();
}
//-------------------------------------------------------------------
@@ -263,9 +211,23 @@
*/
public void load(String dir, File configFile ) throws ParserConfigurationException, IOException, SAXException {
this.configFile = configFile;
+ this.load(dir, new FileInputStream(configFile));
+ }
+
+ /**
+ * Load a config file listing the available solr cores.
+ *
+ * @param dir the home directory of all resources.
+ * @param cfgis the configuration file InputStream
+ * @param configName
+ * @throws ParserConfigurationException
+ * @throws IOException
+ * @throws SAXException
+ */
+ public void load(String dir, InputStream cfgis)
+ throws ParserConfigurationException, IOException, SAXException {
this.loader = new SolrResourceLoader(dir);
solrHome = loader.getInstanceDir();
- FileInputStream cfgis = new FileInputStream(configFile);
try {
Config cfg = new Config(loader, null, cfgis, null);
@@ -274,7 +236,7 @@
adminPath = cfg.get( "solr/cores/@adminPath", null );
shareSchema = cfg.getBool("solr/cores/@shareSchema", false );
if(shareSchema){
- indexSchemaCache = new ConcurrentHashMap<String,IndexSchema>();
+ indexSchemaCache = new ConcurrentHashMap<String ,IndexSchema>();
}
adminHandler = cfg.get("solr/cores/@adminHandler", null );
managementPath = cfg.get("solr/cores/@managementPath", null );
@@ -301,21 +263,23 @@
}
NodeList nodes = (NodeList)cfg.evaluate("solr/cores/core", XPathConstants.NODESET);
-
+ boolean defaultCoreFound = false;
for (int i=0; i<nodes.getLength(); i++) {
Node node = nodes.item(i);
try {
- String names = DOMUtil.getAttr(node, "name", null);
- List<String> aliases = StrUtils.splitSmart(names,',');
- String name = "";
- if(aliases.size() > 0) {
- name = aliases.get(0);
+ String name = DOMUtil.getAttr(node, "name", null);
+ if(name.equals(DEFAULT_CORE_NAME)){
+ if(defaultCoreFound) throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,"Only one 'DEFAULT_CORE' is allowed ");
+ defaultCoreFound = true;
+ name="";
}
CoreDescriptor p = new CoreDescriptor(this, name, DOMUtil.getAttr(node, "instanceDir", null));
// deal with optional settings
String opt = DOMUtil.getAttr(node, "config", null);
- if (opt != null) {
+ if(solrConfigFilenameOverride != null && name.equals("")) {
+ p.setConfigName(solrConfigFilenameOverride);
+ } else if (opt != null) {
p.setConfigName(opt);
}
opt = DOMUtil.getAttr(node, "schema", null);
@@ -327,19 +291,15 @@
p.setPropertiesName(opt);
}
opt = DOMUtil.getAttr(node, CoreAdminParams.DATA_DIR, null);
- if (opt != null) {
+ if(solrDataDirOverride != null && name.equals("")) {
+ p.setDataDir(solrDataDirOverride);
+ }else if (opt != null) {
p.setDataDir(opt);
}
p.setCoreProperties(readProperties(cfg, node));
SolrCore core = create(p);
-
- for (int a=1; a<aliases.size(); a++) {
- core.open();
- register(aliases.get(a), core, false);
- }
-
register(name, core, false);
}
catch (Throwable ex) {
@@ -455,15 +415,11 @@
*/
public SolrCore create(CoreDescriptor dcore) throws ParserConfigurationException, IOException, SAXException {
// Make the instanceDir relative to the cores instanceDir if not absolute
- String instanceDir = dcore.getInstanceDir();
- File idir;
- idir = new File(instanceDir);
- if (!idir.isAbsolute()) {
- idir = new File(solrHome, instanceDir);
- }
-
- instanceDir = idir.getPath();
- System.out.println("instancedir:" + idir.getAbsolutePath());
+ File idir = new File(dcore.getInstanceDir());
+ if (!idir.isAbsolute()) {
+ idir = new File(solrHome, dcore.getInstanceDir());
+ }
+ String instanceDir = idir.getPath();
// Initialize the solr config
SolrResourceLoader solrLoader ;
@@ -566,6 +522,7 @@
*/
public void reload(String name) throws ParserConfigurationException, IOException, SAXException {
+ name= checkDefault(name);
SolrCore core;
synchronized(cores) {
core = cores.get(name);
@@ -574,19 +531,13 @@
throw new SolrException( SolrException.ErrorCode.BAD_REQUEST, "No such core: " + name );
SolrCore newCore = create(core.getCoreDescriptor());
-
- // point all aliases to the reloaded core
- for (String alias : getCoreNames(core)) {
- if (!name.equals(alias)) {
- newCore.open();
- register(alias, newCore, false);
- }
- }
-
register(name, newCore, false);
}
-
-
+
+ private String checkDefault(String name) {
+ return name.length() == 0 || DEFAULT_CORE_NAME.equals(name) || name.trim().length() == 0 ? "" : name;
+ }
+
/**
* Swaps two SolrCore descriptors.
* @param n0
@@ -596,6 +547,8 @@
if( n0 == null || n1 == null ) {
throw new SolrException( SolrException.ErrorCode.BAD_REQUEST, "Can not swap unnamed cores." );
}
+ n0 = checkDefault(n0);
+ n1 = checkDefault(n1);
synchronized( cores ) {
SolrCore c0 = cores.get(n0);
SolrCore c1 = cores.get(n1);
@@ -607,7 +560,9 @@
cores.put(n1, c0);
c0.setName(n1);
+ c0.getCoreDescriptor().name = n1;
c1.setName(n0);
+ c1.getCoreDescriptor().name = n0;
}
@@ -616,6 +571,7 @@
/** Removes and returns registered core w/o decrementing it's reference count */
public SolrCore remove( String name ) {
+ name = checkDefault(name);
synchronized(cores) {
return cores.remove( name );
}
@@ -629,6 +585,7 @@
* @return the core if found
*/
public SolrCore getCore(String name) {
+ name= checkDefault(name);
synchronized(cores) {
SolrCore core = cores.get(name);
if (core != null)
@@ -795,26 +752,12 @@
if(shareSchema) writeAttribute(w, "shareSchema","true");
w.write(">\n");
- Map<SolrCore, LinkedList<String>> aliases = new HashMap<SolrCore,LinkedList<String>>();
-
synchronized(cores) {
- for (Map.Entry<String, SolrCore> entry : cores.entrySet()) {
- String name = entry.getKey();
- LinkedList<String> a = aliases.get(entry.getValue());
- if (a==null) a = new LinkedList<String>();
- if (name.equals(entry.getValue().getName())) {
- a.addFirst(name);
- } else {
- a.addLast(name);
- }
- aliases.put(entry.getValue(), a);
+ for (SolrCore solrCore : cores.values()) {
+ persist(w,solrCore.getCoreDescriptor());
}
}
- for (Map.Entry<SolrCore, LinkedList<String>> entry : aliases.entrySet()) {
- persist(w, entry.getValue(), entry.getKey().getCoreDescriptor());
- }
-
w.write("</cores>\n");
w.write("</solr>\n");
}
@@ -829,9 +772,9 @@
}
/** Writes the cores configuration node for a given core. */
- void persist(Writer w, List<String> aliases, CoreDescriptor dcore) throws IOException {
+ void persist(Writer w, CoreDescriptor dcore) throws IOException {
w.write(" <core");
- writeAttribute(w,"name",StrUtils.join(aliases,','));
+ writeAttribute(w,"name",dcore.name);
writeAttribute(w,"instanceDir",dcore.getInstanceDir());
//write config (if not default)
String opt = dcore.getConfigName();
@@ -906,13 +849,18 @@
public String getSolrHome() {
return solrHome;
}
-
- //nocommit: consider - used for testing now
+ private static final String DEF_SOLR_XML ="<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n" +
+ "<solr persistent=\"false\">\n" +
+ " <cores adminPath=\"/admin/cores\">\n" +
+ " <core name=\""+ DEFAULT_CORE_NAME + "\" instanceDir=\".\" />\n" +
+ " </cores>\n" +
+ "</solr>";
+
+ // nocommit: consider - for tests now
public boolean isZooKeeperAware() {
return zooKeeperController != null;
}
- // may return null
public ZooKeeperController getZooKeeperController() {
return zooKeeperController;
}
Modified: lucene/solr/branches/cloud/src/java/org/apache/solr/core/SolrResourceLoader.java
URL: http://svn.apache.org/viewvc/lucene/solr/branches/cloud/src/java/org/apache/solr/core/SolrResourceLoader.java?rev=890809&r1=890808&r2=890809&view=diff
==============================================================================
--- lucene/solr/branches/cloud/src/java/org/apache/solr/core/SolrResourceLoader.java (original)
+++ lucene/solr/branches/cloud/src/java/org/apache/solr/core/SolrResourceLoader.java Tue Dec 15 14:49:18 2009
@@ -63,7 +63,7 @@
static final String project = "solr";
static final String base = "org.apache" + "." + project;
- static final String[] packages = {"","analysis.","schema.","handler.","search.","update.","core.","request.","update.processor.","util.", "spelling.", "handler.component.", "handler.dataimport"};
+ static final String[] packages = {"","analysis.","schema.","handler.","search.","update.","core.","request.","update.processor.","util.", "spelling.", "handler.component.", "handler.dataimport."};
protected URLClassLoader classLoader;
private final String instanceDir;
Modified: lucene/solr/branches/cloud/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java
URL: http://svn.apache.org/viewvc/lucene/solr/branches/cloud/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java?rev=890809&r1=890808&r2=890809&view=diff
==============================================================================
--- lucene/solr/branches/cloud/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java (original)
+++ lucene/solr/branches/cloud/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java Tue Dec 15 14:49:18 2009
@@ -41,7 +41,9 @@
import java.io.File;
import java.io.IOException;
+import java.util.ArrayList;
import java.util.Date;
+import java.util.Set;
/**
* @version $Id$
@@ -118,8 +120,8 @@
}
case ALIAS: {
- doPersist = this.handleAliasAction(req, rsp);
- break;
+ throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "'ALIAS' is not supported " +
+ req.getParams().get(CoreAdminParams.ACTION));
}
case UNLOAD: {
@@ -291,6 +293,7 @@
* @return true if a modification has resulted that requires persistance
* of the CoreContainer configuration.
*/
+ @Deprecated
protected boolean handleAliasAction(SolrQueryRequest req, SolrQueryResponse rsp) {
SolrParams params = req.getParams();
Modified: lucene/solr/branches/cloud/src/java/org/apache/solr/handler/component/ResponseBuilder.java
URL: http://svn.apache.org/viewvc/lucene/solr/branches/cloud/src/java/org/apache/solr/handler/component/ResponseBuilder.java?rev=890809&r1=890808&r2=890809&view=diff
==============================================================================
--- lucene/solr/branches/cloud/src/java/org/apache/solr/handler/component/ResponseBuilder.java (original)
+++ lucene/solr/branches/cloud/src/java/org/apache/solr/handler/component/ResponseBuilder.java Tue Dec 15 14:49:18 2009
@@ -45,6 +45,7 @@
public boolean doHighlights;
public boolean doFacets;
public boolean doStats;
+ public boolean doTerms;
private boolean needDocList = false;
private boolean needDocSet = false;
@@ -132,6 +133,7 @@
/* private... components that don't own these shouldn't use them */
SolrDocumentList _responseDocs;
StatsInfo _statsInfo;
+ TermsComponent.TermsHelper _termsHelper;
/**
* Utility function to add debugging info. This will make sure a valid
Modified: lucene/solr/branches/cloud/src/java/org/apache/solr/handler/component/ShardRequest.java
URL: http://svn.apache.org/viewvc/lucene/solr/branches/cloud/src/java/org/apache/solr/handler/component/ShardRequest.java?rev=890809&r1=890808&r2=890809&view=diff
==============================================================================
--- lucene/solr/branches/cloud/src/java/org/apache/solr/handler/component/ShardRequest.java (original)
+++ lucene/solr/branches/cloud/src/java/org/apache/solr/handler/component/ShardRequest.java Tue Dec 15 14:49:18 2009
@@ -36,6 +36,7 @@
public final static int PURPOSE_GET_HIGHLIGHTS = 0x80;
public final static int PURPOSE_GET_DEBUG =0x100;
public final static int PURPOSE_GET_STATS =0x200;
+ public final static int PURPOSE_GET_TERMS =0x400;
public int purpose; // the purpose of this request
Modified: lucene/solr/branches/cloud/src/java/org/apache/solr/handler/component/TermsComponent.java
URL: http://svn.apache.org/viewvc/lucene/solr/branches/cloud/src/java/org/apache/solr/handler/component/TermsComponent.java?rev=890809&r1=890808&r2=890809&view=diff
==============================================================================
--- lucene/solr/branches/cloud/src/java/org/apache/solr/handler/component/TermsComponent.java (original)
+++ lucene/solr/branches/cloud/src/java/org/apache/solr/handler/component/TermsComponent.java Tue Dec 15 14:49:18 2009
@@ -20,17 +20,23 @@
import org.apache.lucene.index.TermEnum;
import org.apache.lucene.util.StringHelper;
import org.apache.solr.common.SolrException;
-import org.apache.solr.common.params.CommonParams;
-import org.apache.solr.common.params.SolrParams;
-import org.apache.solr.common.params.TermsParams;
+import org.apache.solr.common.params.*;
import org.apache.solr.common.util.NamedList;
+import org.apache.solr.common.util.SimpleOrderedMap;
+import org.apache.solr.common.util.StrUtils;
import org.apache.solr.schema.FieldType;
import org.apache.solr.schema.StrField;
import org.apache.solr.request.SimpleFacets.CountPair;
import org.apache.solr.util.BoundedTreeSet;
-import java.io.IOException;
+import org.apache.solr.client.solrj.response.TermsResponse;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.regex.Pattern;
/**
* Return TermEnum information, useful for things like auto suggest.
@@ -40,7 +46,25 @@
*/
public class TermsComponent extends SearchComponent {
public static final int UNLIMITED_MAX_COUNT = -1;
+ public static final String COMPONENT_NAME = "terms";
+ @Override
+ public void prepare(ResponseBuilder rb) throws IOException {
+ SolrParams params = rb.req.getParams();
+ if (params.getBool(TermsParams.TERMS, false)) {
+ rb.doTerms = true;
+ }
+
+ // TODO: temporary... this should go in a different component.
+ String shards = params.get(ShardParams.SHARDS);
+ if (shards != null) {
+ if (params.get(ShardParams.SHARDS_QT) == null) {
+ throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "No shards.qt parameter specified");
+ }
+ List<String> lst = StrUtils.splitSmart(shards, ",", true);
+ rb.shards = lst.toArray(new String[lst.size()]);
+ }
+ }
public void process(ResponseBuilder rb) throws IOException {
SolrParams params = rb.req.getParams();
@@ -65,6 +89,9 @@
freqmax = Integer.MAX_VALUE;
}
String prefix = params.get(TermsParams.TERMS_PREFIX_STR);
+ String regexp = params.get(TermsParams.TERMS_REGEXP_STR);
+ Pattern pattern = regexp != null ? Pattern.compile(regexp, resolveRegexpFlags(params)) : null;
+
boolean raw = params.getBool(TermsParams.TERMS_RAW, false);
for (int j = 0; j < fields.length; j++) {
String field = StringHelper.intern(fields[j]);
@@ -105,6 +132,11 @@
// stop if the prefix doesn't match
if (prefix != null && !indexedText.startsWith(prefix)) break;
+ if (pattern != null && !pattern.matcher(indexedText).matches()) {
+ termEnum.next();
+ continue;
+ }
+
if (upperTerm != null) {
int upperCmp = theTerm.compareTo(upperTerm);
// if we are past the upper term, or equal to it (when don't include upper) then stop.
@@ -146,8 +178,248 @@
}
}
- public void prepare(ResponseBuilder rb) throws IOException {
- //nothing to do
+ int resolveRegexpFlags(SolrParams params) {
+ String[] flagParams = params.getParams(TermsParams.TERMS_REGEXP_FLAG);
+ if (flagParams == null) {
+ return 0;
+ }
+ int flags = 0;
+ for (String flagParam : flagParams) {
+ try {
+ flags |= TermsParams.TermsRegexpFlag.valueOf(flagParam.toUpperCase()).getValue();
+ } catch (IllegalArgumentException iae) {
+ throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "Unknown terms regex flag '" + flagParam + "'");
+ }
+ }
+ return flags;
+ }
+
+ @Override
+ public int distributedProcess(ResponseBuilder rb) throws IOException {
+ if (!rb.doTerms) {
+ return ResponseBuilder.STAGE_DONE;
+ }
+
+ if (rb.stage == ResponseBuilder.STAGE_EXECUTE_QUERY) {
+ TermsHelper th = rb._termsHelper;
+ if (th == null) {
+ th = rb._termsHelper = new TermsHelper();
+ th.init(rb.req.getParams());
+ }
+ ShardRequest sreq = createShardQuery(rb.req.getParams());
+ rb.addRequest(this, sreq);
+ }
+
+ if (rb.stage < ResponseBuilder.STAGE_EXECUTE_QUERY) {
+ return ResponseBuilder.STAGE_EXECUTE_QUERY;
+ } else {
+ return ResponseBuilder.STAGE_DONE;
+ }
+ }
+
+ @Override
+ public void handleResponses(ResponseBuilder rb, ShardRequest sreq) {
+ if (!rb.doTerms || (sreq.purpose & ShardRequest.PURPOSE_GET_TERMS) == 0) {
+ return;
+ }
+ TermsHelper th = rb._termsHelper;
+ if (th != null) {
+ for (ShardResponse srsp : sreq.responses) {
+ th.parse((NamedList) srsp.getSolrResponse().getResponse().get("terms"));
+ }
+ }
+ }
+
+ @Override
+ public void finishStage(ResponseBuilder rb) {
+ if (!rb.doTerms || rb.stage != ResponseBuilder.STAGE_EXECUTE_QUERY) {
+ return;
+ }
+
+ TermsHelper ti = rb._termsHelper;
+ NamedList terms = ti.buildResponse();
+
+ rb.rsp.add("terms", terms);
+ rb._termsHelper = null;
+ }
+
+ private ShardRequest createShardQuery(SolrParams params) {
+ ShardRequest sreq = new ShardRequest();
+ sreq.purpose = ShardRequest.PURPOSE_GET_TERMS;
+
+ // base shard request on original parameters
+ sreq.params = new ModifiableSolrParams(params);
+
+ // don't pass through the shards param
+ sreq.params.remove(ShardParams.SHARDS);
+
+ // remove any limits for shards, we want them to return all possible
+ // responses
+ // we want this so we can calculate the correct counts
+ // dont sort by count to avoid that unnecessary overhead on the shards
+ sreq.params.remove(TermsParams.TERMS_MAXCOUNT);
+ sreq.params.remove(TermsParams.TERMS_MINCOUNT);
+ sreq.params.set(TermsParams.TERMS_LIMIT, -1);
+ sreq.params.set(TermsParams.TERMS_SORT, TermsParams.TERMS_SORT_INDEX);
+
+ // TODO: is there a better way to handle this?
+ String qt = params.get(CommonParams.QT);
+ if (qt != null) {
+ sreq.params.add(CommonParams.QT, qt);
+ }
+ return sreq;
+ }
+
+ public class TermsHelper {
+ // map to store returned terms
+ private HashMap<String, HashMap<String, TermsResponse.Term>> fieldmap;
+ private SolrParams params;
+
+ public TermsHelper() {
+ fieldmap = new HashMap<String, HashMap<String, TermsResponse.Term>>(5);
+ }
+
+ public void init(SolrParams params) {
+ this.params = params;
+ String[] fields = params.getParams(TermsParams.TERMS_FIELD);
+ if (fields != null) {
+ for (String field : fields) {
+ // TODO: not sure 128 is the best starting size
+ // It use it because that is what is used for facets
+ fieldmap.put(field, new HashMap<String, TermsResponse.Term>(128));
+ }
+ }
+ }
+
+ public void parse(NamedList terms) {
+ // exit if there is no terms
+ if (terms == null) {
+ return;
+ }
+
+ TermsResponse termsResponse = new TermsResponse(terms);
+
+ // loop though each field and add each term+freq to map
+ for (String key : fieldmap.keySet()) {
+ HashMap<String, TermsResponse.Term> termmap = fieldmap.get(key);
+ List<TermsResponse.Term> termlist = termsResponse.getTerms(key);
+
+ // skip this field if there are no terms
+ if (termlist == null) {
+ continue;
+ }
+
+ // loop though each term
+ for (TermsResponse.Term tc : termlist) {
+ String term = tc.getTerm();
+ if (termmap.containsKey(term)) {
+ TermsResponse.Term oldtc = termmap.get(term);
+ oldtc.addFrequency(tc.getFrequency());
+ termmap.put(term, oldtc);
+ } else {
+ termmap.put(term, tc);
+ }
+ }
+ }
+ }
+
+ public NamedList buildResponse() {
+ NamedList response = new SimpleOrderedMap();
+
+ // determine if we are going index or count sort
+ boolean sort = !TermsParams.TERMS_SORT_INDEX.equals(params.get(
+ TermsParams.TERMS_SORT, TermsParams.TERMS_SORT_COUNT));
+
+ // init minimum frequency
+ long freqmin = 1;
+ String s = params.get(TermsParams.TERMS_MINCOUNT);
+ if (s != null) freqmin = Long.parseLong(s);
+
+ // init maximum frequency, default to max int
+ long freqmax = -1;
+ s = params.get(TermsParams.TERMS_MAXCOUNT);
+ if (s != null) freqmax = Long.parseLong(s);
+ if (freqmax < 0) {
+ freqmax = Long.MAX_VALUE;
+ }
+
+ // init limit, default to max int
+ long limit = 10;
+ s = params.get(TermsParams.TERMS_LIMIT);
+ if (s != null) limit = Long.parseLong(s);
+ if (limit < 0) {
+ limit = Long.MAX_VALUE;
+ }
+
+ // loop though each field we want terms from
+ for (String key : fieldmap.keySet()) {
+ NamedList fieldterms = new SimpleOrderedMap();
+ TermsResponse.Term[] data = null;
+ if (sort) {
+ data = getCountSorted(fieldmap.get(key));
+ } else {
+ data = getLexSorted(fieldmap.get(key));
+ }
+
+ // loop though each term until we hit limit
+ int cnt = 0;
+ for (TermsResponse.Term tc : data) {
+ if (tc.getFrequency() >= freqmin && tc.getFrequency() <= freqmax) {
+ fieldterms.add(tc.getTerm(), num(tc.getFrequency()));
+ cnt++;
+ }
+
+ if (cnt >= limit) {
+ break;
+ }
+ }
+
+ response.add(key, fieldterms);
+ }
+
+ return response;
+ }
+
+ // use <int> tags for smaller facet counts (better back compatibility)
+ private Number num(long val) {
+ if (val < Integer.MAX_VALUE) return (int) val;
+ else return val;
+ }
+
+ // based on code from facets
+ public TermsResponse.Term[] getLexSorted(HashMap<String, TermsResponse.Term> data) {
+ TermsResponse.Term[] arr = data.values().toArray(new TermsResponse.Term[data.size()]);
+
+ Arrays.sort(arr, new Comparator<TermsResponse.Term>() {
+ public int compare(TermsResponse.Term o1, TermsResponse.Term o2) {
+ return o1.getTerm().compareTo(o2.getTerm());
+ }
+ });
+
+ return arr;
+ }
+
+ // based on code from facets
+ public TermsResponse.Term[] getCountSorted(HashMap<String, TermsResponse.Term> data) {
+ TermsResponse.Term[] arr = data.values().toArray(new TermsResponse.Term[data.size()]);
+
+ Arrays.sort(arr, new Comparator<TermsResponse.Term>() {
+ public int compare(TermsResponse.Term o1, TermsResponse.Term o2) {
+ long freq1 = o1.getFrequency();
+ long freq2 = o2.getFrequency();
+
+ if (freq2 < freq1) {
+ return -1;
+ } else if (freq1 < freq2) {
+ return 1;
+ } else {
+ return o1.getTerm().compareTo(o2.getTerm());
+ }
+ }
+ });
+
+ return arr;
+ }
}
public String getVersion() {
Modified: lucene/solr/branches/cloud/src/java/org/apache/solr/search/FastLRUCache.java
URL: http://svn.apache.org/viewvc/lucene/solr/branches/cloud/src/java/org/apache/solr/search/FastLRUCache.java?rev=890809&r1=890808&r2=890809&view=diff
==============================================================================
--- lucene/solr/branches/cloud/src/java/org/apache/solr/search/FastLRUCache.java (original)
+++ lucene/solr/branches/cloud/src/java/org/apache/solr/search/FastLRUCache.java Tue Dec 15 14:49:18 2009
@@ -43,7 +43,7 @@
* @see org.apache.solr.search.SolrCache
* @since solr 1.4
*/
-public class FastLRUCache implements SolrCache {
+public class FastLRUCache<K,V> implements SolrCache<K,V> {
private List<ConcurrentLRUCache.Stats> cumulativeStats;
@@ -54,7 +54,7 @@
private State state;
private CacheRegenerator regenerator;
private String description = "Concurrent LRU Cache";
- private ConcurrentLRUCache cache;
+ private ConcurrentLRUCache<K,V> cache;
private int showItems = 0;
public Object init(Map args, Object persistence, CacheRegenerator regenerator) {
@@ -101,7 +101,7 @@
}
description += ')';
- cache = new ConcurrentLRUCache(limit, minLimit, acceptableLimit, initialSize, newThread, false, null);
+ cache = new ConcurrentLRUCache<K,V>(limit, minLimit, acceptableLimit, initialSize, newThread, false, null);
cache.setAlive(false);
if (persistence == null) {
@@ -125,11 +125,11 @@
}
- public Object put(Object key, Object value) {
+ public V put(K key, V value) {
return cache.put(key, value);
}
- public Object get(Object key) {
+ public V get(K key) {
return cache.get(key);
}
Modified: lucene/solr/branches/cloud/src/java/org/apache/solr/search/LRUCache.java
URL: http://svn.apache.org/viewvc/lucene/solr/branches/cloud/src/java/org/apache/solr/search/LRUCache.java?rev=890809&r1=890808&r2=890809&view=diff
==============================================================================
--- lucene/solr/branches/cloud/src/java/org/apache/solr/search/LRUCache.java (original)
+++ lucene/solr/branches/cloud/src/java/org/apache/solr/search/LRUCache.java Tue Dec 15 14:49:18 2009
@@ -31,7 +31,7 @@
/**
* @version $Id$
*/
-public class LRUCache implements SolrCache {
+public class LRUCache<K,V> implements SolrCache<K,V> {
/* An instance of this class will be shared across multiple instances
* of an LRUCache at the same time. Make sure everything is thread safe.
@@ -54,7 +54,7 @@
private long warmupTime = 0;
- private Map map;
+ private Map<K,V> map;
private String name;
private int autowarmCount;
private State state;
@@ -79,7 +79,7 @@
}
description += ')';
- map = new LinkedHashMap(initialSize, 0.75f, true) {
+ map = new LinkedHashMap<K,V>(initialSize, 0.75f, true) {
protected boolean removeEldestEntry(Map.Entry eldest) {
if (size() > limit) {
// increment evictions regardless of state.
@@ -113,7 +113,7 @@
}
}
- public Object put(Object key, Object value) {
+ public V put(K key, V value) {
synchronized (map) {
if (state == State.LIVE) {
stats.inserts.incrementAndGet();
@@ -126,9 +126,9 @@
}
}
- public Object get(Object key) {
+ public V get(K key) {
synchronized (map) {
- Object val = map.get(key);
+ V val = map.get(key);
if (state == State.LIVE) {
// only increment lookups and hits if we are live.
lookups++;
@@ -156,10 +156,10 @@
return state;
}
- public void warm(SolrIndexSearcher searcher, SolrCache old) throws IOException {
+ public void warm(SolrIndexSearcher searcher, SolrCache<K,V> old) throws IOException {
if (regenerator==null) return;
long warmingStartTime = System.currentTimeMillis();
- LRUCache other = (LRUCache)old;
+ LRUCache<K,V> other = (LRUCache<K,V>)old;
// warm entries
if (autowarmCount != 0) {
@@ -172,7 +172,7 @@
keys = new Object[sz];
vals = new Object[sz];
- Iterator iter = other.map.entrySet().iterator();
+ Iterator<Map.Entry<K, V>> iter = other.map.entrySet().iterator();
// iteration goes from oldest (least recently used) to most recently used,
// so we need to skip over the oldest entries.
@@ -181,7 +181,7 @@
for (int i=0; i<sz; i++) {
- Map.Entry entry = (Map.Entry)iter.next();
+ Map.Entry<K,V> entry = iter.next();
keys[i]=entry.getKey();
vals[i]=entry.getValue();
}