mirror of https://github.com/apache/lucene.git
SOLR-793: Add 'commitWithin' argument to the update add command. This behaves similar to the global autoCommit maxTime argument except that it is set for each request.
git-svn-id: https://svn.apache.org/repos/asf/lucene/solr/trunk@704288 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
25813774b2
commit
97e369ace8
|
@ -49,6 +49,10 @@ New Features
|
||||||
4. SOLR-658: Allow Solr to load index from arbitrary directory in dataDir
|
4. SOLR-658: Allow Solr to load index from arbitrary directory in dataDir
|
||||||
(Noble Paul, Akshay Ukey via shalin)
|
(Noble Paul, Akshay Ukey via shalin)
|
||||||
|
|
||||||
|
5. SOLR-793: Add 'commitWithin' argument to the update add command. This behaves
|
||||||
|
similar to the global autoCommit maxTime argument except that it is set for
|
||||||
|
each request. (ryan)
|
||||||
|
|
||||||
|
|
||||||
Optimizations
|
Optimizations
|
||||||
----------------------
|
----------------------
|
||||||
|
|
|
@ -0,0 +1,287 @@
|
||||||
|
Index: src/java/org/apache/solr/request/VelocityResponseWriter.java
|
||||||
|
===================================================================
|
||||||
|
--- src/java/org/apache/solr/request/VelocityResponseWriter.java (Revision 0)
|
||||||
|
+++ src/java/org/apache/solr/request/VelocityResponseWriter.java (Revision 0)
|
||||||
|
@@ -0,0 +1,222 @@
|
||||||
|
+/**
|
||||||
|
+ * Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
+ * contributor license agreements. See the NOTICE file distributed with
|
||||||
|
+ * this work for additional information regarding copyright ownership.
|
||||||
|
+ * The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
+ * (the "License"); you may not use this file except in compliance with
|
||||||
|
+ * the License. You may obtain a copy of the License at
|
||||||
|
+ *
|
||||||
|
+ * http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
+ *
|
||||||
|
+ * Unless required by applicable law or agreed to in writing, software
|
||||||
|
+ * distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
+ * See the License for the specific language governing permissions and
|
||||||
|
+ * limitations under the License.
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+package org.apache.solr.request;
|
||||||
|
+
|
||||||
|
+import java.io.File;
|
||||||
|
+import java.io.IOException;
|
||||||
|
+import java.io.StringWriter;
|
||||||
|
+import java.io.Writer;
|
||||||
|
+import java.util.Iterator;
|
||||||
|
+
|
||||||
|
+import org.apache.lucene.document.Document;
|
||||||
|
+import org.apache.lucene.index.CorruptIndexException;
|
||||||
|
+import org.apache.lucene.search.Searcher;
|
||||||
|
+import org.apache.solr.client.solrj.SolrResponse;
|
||||||
|
+import org.apache.solr.client.solrj.embedded.EmbeddedSolrServer;
|
||||||
|
+import org.apache.solr.common.SolrDocument;
|
||||||
|
+import org.apache.solr.common.util.NamedList;
|
||||||
|
+import org.apache.solr.search.DocSlice;
|
||||||
|
+import org.apache.solr.update.DocumentBuilder;
|
||||||
|
+import org.apache.velocity.Template;
|
||||||
|
+import org.apache.velocity.VelocityContext;
|
||||||
|
+import org.apache.velocity.app.VelocityEngine;
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * <p> A response writer that uses velocity template for response creation.
|
||||||
|
+ * Possible request parameters: </p>
|
||||||
|
+ * <ul>
|
||||||
|
+ * <li>
|
||||||
|
+ * <b>vl.template:</b>
|
||||||
|
+ * The name of the template file without .vm suffix. </li>
|
||||||
|
+ * <li>
|
||||||
|
+ * <b>vl.json:</b>
|
||||||
|
+ * A name of a Javascript method. If set, the response is wrapped into this object.
|
||||||
|
+ * useful for JSON requests.
|
||||||
|
+ * </li>
|
||||||
|
+ * <li>
|
||||||
|
+ * <b>vl.content:</b>
|
||||||
|
+ * Specify a custom content type for the response. Default is "text/html" for standard requests,
|
||||||
|
+ * and "text/x-json" for JSON requests.
|
||||||
|
+ * </li>
|
||||||
|
+ * <li>
|
||||||
|
+ * <b>vl.response:</b>
|
||||||
|
+ * To provide an implementation of {@link SolrResponse} inside the template,
|
||||||
|
+ * specify the class name of the implementation. For convenience, it looks
|
||||||
|
+ * inside the package "org.apache.solr.client.solrj.response", so you only
|
||||||
|
+ * have to choose eg. <i>QueryResponse, LikeResponse, MultiCoreResponse</i>.
|
||||||
|
+ * Custom classes may be accessed using the full qualified class name,
|
||||||
|
+ * eg. <i>my.custom.package.CustomResponse</i>
|
||||||
|
+ * </li>
|
||||||
|
+ * </ul>
|
||||||
|
+ */
|
||||||
|
+public class VelocityResponseWriter implements QueryResponseWriter {
|
||||||
|
+
|
||||||
|
+ private static final String PARAMETER_TEMPLATE="vl.template";
|
||||||
|
+ private static final String PARAMETER_JSON="vl.json";
|
||||||
|
+ private static final String PARAMETER_RESPONSE="vl.response";
|
||||||
|
+ private static final String PARAMETER_CONTENT_TYPE="vl.content";
|
||||||
|
+
|
||||||
|
+ public void write(Writer writer, SolrQueryRequest request,
|
||||||
|
+ SolrQueryResponse response) throws IOException {
|
||||||
|
+
|
||||||
|
+ // init velocity and get template
|
||||||
|
+ VelocityEngine engine = new VelocityEngine();
|
||||||
|
+ File baseDir = new File(request.getCore().getResourceLoader().getConfigDir(), "velocity");
|
||||||
|
+ engine.setProperty(VelocityEngine.FILE_RESOURCE_LOADER_PATH, baseDir.getAbsolutePath());
|
||||||
|
+ engine.setProperty(VelocityEngine.RESOURCE_LOADER, "file");
|
||||||
|
+ Template template;
|
||||||
|
+ try {
|
||||||
|
+ template = engine.getTemplate(request.getParams().get(PARAMETER_TEMPLATE, "default") + ".vm");
|
||||||
|
+ } catch (Exception e) {
|
||||||
|
+ throw new IOException(e.getMessage());
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ // put raw response into context
|
||||||
|
+ VelocityContext context = new VelocityContext();
|
||||||
|
+ context.put("rawResponse", new RawResponseHelper(request, response));
|
||||||
|
+
|
||||||
|
+ // convert response if a class is specified
|
||||||
|
+ if (request.getParams().get(PARAMETER_RESPONSE) != null) {
|
||||||
|
+ String className = request.getParams().get(PARAMETER_RESPONSE);
|
||||||
|
+
|
||||||
|
+ // create SolrResponse using reflection
|
||||||
|
+ SolrResponse solrResponse;
|
||||||
|
+ Object object;
|
||||||
|
+ try {
|
||||||
|
+ object = request.getCore().getResourceLoader().newInstance(className, "client.solrj.response.");
|
||||||
|
+ } catch (RuntimeException e) {
|
||||||
|
+ throw new IOException("Unable to resolve response class \"" + className + "\": " + e.getMessage());
|
||||||
|
+ }
|
||||||
|
+ if (!(object instanceof SolrResponse)) {
|
||||||
|
+ throw new IOException("Class \"" + className + "\" doesn't implement SolrResponse!");
|
||||||
|
+ }
|
||||||
|
+ solrResponse = (SolrResponse) object;
|
||||||
|
+
|
||||||
|
+ // inject the request into the response
|
||||||
|
+ solrResponse.setResponse(new EmbeddedSolrServer(request.getCore()).getParsedResponse(request, response));
|
||||||
|
+
|
||||||
|
+ // put it into the context
|
||||||
|
+ context.put("response", solrResponse);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ // create output, optionally wrap it into a json object
|
||||||
|
+ if (isWrappedResponse(request)) {
|
||||||
|
+ StringWriter stringWriter = new StringWriter();
|
||||||
|
+ template.merge(context, stringWriter);
|
||||||
|
+ writer.write(request.getParams().get(PARAMETER_JSON) + "(");
|
||||||
|
+ writer.write(getJSONWrap(stringWriter.toString()));
|
||||||
|
+ writer.write(')');
|
||||||
|
+ } else {
|
||||||
|
+ template.merge(context, writer);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ public String getContentType(SolrQueryRequest request,
|
||||||
|
+ SolrQueryResponse response) {
|
||||||
|
+ if (request.getParams().get(PARAMETER_CONTENT_TYPE) != null) {
|
||||||
|
+ return request.getParams().get(PARAMETER_CONTENT_TYPE);
|
||||||
|
+ }
|
||||||
|
+ if (isWrappedResponse(request)) {
|
||||||
|
+ return JSONResponseWriter.CONTENT_TYPE_JSON_UTF8;
|
||||||
|
+ }
|
||||||
|
+ return "text/html";
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ public void init(NamedList args) {
|
||||||
|
+ // TODO
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ private boolean isWrappedResponse(SolrQueryRequest request) {
|
||||||
|
+ return request.getParams().get(PARAMETER_JSON) != null;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ public String getJSONWrap(String xmlResult) {
|
||||||
|
+ // escape the double quotes and backslashes
|
||||||
|
+ String replace1 = xmlResult.replaceAll("\\\\", "\\\\\\\\");
|
||||||
|
+ replace1 = replace1.replaceAll("\\n", "\\\\n");
|
||||||
|
+ replace1 = replace1.replaceAll("\\r", "\\\\r");
|
||||||
|
+ String replaced = replace1.replaceAll("\"", "\\\\\"");
|
||||||
|
+ // wrap it in a JSON object
|
||||||
|
+ return "{\"result\":\"" + replaced + "\"}";
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /**
|
||||||
|
+ * A helper class that provides convenient methods for the raw solr response.
|
||||||
|
+ */
|
||||||
|
+ public class RawResponseHelper {
|
||||||
|
+
|
||||||
|
+ private Searcher searcher;
|
||||||
|
+ private SolrQueryResponse response;
|
||||||
|
+ private SolrQueryRequest request;
|
||||||
|
+
|
||||||
|
+ public RawResponseHelper(SolrQueryRequest request,
|
||||||
|
+ SolrQueryResponse response) {
|
||||||
|
+ this.searcher = request.getSearcher();
|
||||||
|
+ this.response = response;
|
||||||
|
+ this.request = request;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ public Iterator<SolrDocument> getResultIterator() {
|
||||||
|
+ final Iterator<Integer> iterator = ((DocSlice) response.getValues()
|
||||||
|
+ .get("response")).iterator();
|
||||||
|
+ return new Iterator<SolrDocument>() {
|
||||||
|
+
|
||||||
|
+ public boolean hasNext() {
|
||||||
|
+ return iterator.hasNext();
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ public SolrDocument next() {
|
||||||
|
+ Document document = null;
|
||||||
|
+ SolrDocument solrDocument = new SolrDocument();
|
||||||
|
+ try {
|
||||||
|
+ document = searcher.doc(iterator.next());
|
||||||
|
+ new DocumentBuilder(request.getSchema()).loadStoredFields(solrDocument, document);
|
||||||
|
+ } catch (CorruptIndexException e) {
|
||||||
|
+ throw new RuntimeException("Error converting lucene document into solr document!");
|
||||||
|
+ } catch (IOException e) {
|
||||||
|
+ throw new RuntimeException("Error converting lucene document into solr document!");
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return solrDocument;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ public void remove() {
|
||||||
|
+
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ };
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ public String getRequestParameter(String param) {
|
||||||
|
+ return request.getParams().get(param);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ public SolrQueryRequest getRequest() {
|
||||||
|
+ return request;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ public SolrQueryResponse getResponse() {
|
||||||
|
+ return response;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+}
|
||||||
|
Index: example/solr/conf/solrconfig.xml
|
||||||
|
===================================================================
|
||||||
|
--- example/solr/conf/solrconfig.xml (Revision 679745)
|
||||||
|
+++ example/solr/conf/solrconfig.xml (Arbeitskopie)
|
||||||
|
@@ -726,7 +726,9 @@
|
||||||
|
-->
|
||||||
|
<queryResponseWriter name="xslt" class="org.apache.solr.request.XSLTResponseWriter">
|
||||||
|
<int name="xsltCacheLifetimeSeconds">5</int>
|
||||||
|
- </queryResponseWriter>
|
||||||
|
+ </queryResponseWriter>
|
||||||
|
+
|
||||||
|
+ <queryResponseWriter name="velocity" class="org.apache.solr.request.VelocityResponseWriter"/>
|
||||||
|
|
||||||
|
<!-- config for the admin interface -->
|
||||||
|
<admin>
|
||||||
|
Index: example/solr/conf/velocity/default.vm
|
||||||
|
===================================================================
|
||||||
|
--- example/solr/conf/velocity/default.vm (Revision 0)
|
||||||
|
+++ example/solr/conf/velocity/default.vm (Revision 0)
|
||||||
|
@@ -0,0 +1,40 @@
|
||||||
|
+#set($iterator=$rawResponse.getResultIterator())
|
||||||
|
+#set($request=$rawResponse.request)
|
||||||
|
+#set($core=$request.core)
|
||||||
|
+#set($schema=$core.schema)
|
||||||
|
+
|
||||||
|
+<html>
|
||||||
|
+ <title>Default VelocityResponseWriter Response</title>
|
||||||
|
+ <body>
|
||||||
|
+
|
||||||
|
+ <p>
|
||||||
|
+ A default response using only the raw solr response. The "rawResponse" object is a helper that provides access to the
|
||||||
|
+ SolrQueryRequest, SolrQueryResponse, as well as convenience methods like getResultIterator() and getRequestParam()
|
||||||
|
+ </p>
|
||||||
|
+ <p>
|
||||||
|
+ If you want to use an instance of SolrResponse of solrj inside a template, use eg. vl.response=QueryResponse.
|
||||||
|
+ This object then is avalaible as "response" in the context.
|
||||||
|
+ </p>
|
||||||
|
+ <hr/>
|
||||||
|
+
|
||||||
|
+ #foreach($document in $iterator)
|
||||||
|
+ #foreach($field in $document.getFieldNames())
|
||||||
|
+ <p>$field: $document.getFieldValue($field)</p>
|
||||||
|
+ #end
|
||||||
|
+ <hr/>
|
||||||
|
+ #end
|
||||||
|
+
|
||||||
|
+ <pre>
|
||||||
|
+ header = $rawResponse.$response.responseHeader
|
||||||
|
+
|
||||||
|
+ values = $rawResponse.$response.values
|
||||||
|
+
|
||||||
|
+ request = $request
|
||||||
|
+
|
||||||
|
+ core = $core
|
||||||
|
+
|
||||||
|
+ schema = $schema
|
||||||
|
+ </pre>
|
||||||
|
+
|
||||||
|
+ </body>
|
||||||
|
+</html>
|
|
@ -0,0 +1,675 @@
|
||||||
|
diff --git a/src/java/org/apache/solr/analysis/SynonymFilterFactory.java b/src/java/org/apache/solr/analysis/SynonymFilterFactory.java
|
||||||
|
index 41cee1f..6cc6c4a 100644
|
||||||
|
--- a/src/java/org/apache/solr/analysis/SynonymFilterFactory.java
|
||||||
|
+++ b/src/java/org/apache/solr/analysis/SynonymFilterFactory.java
|
||||||
|
@@ -134,7 +134,7 @@ public class SynonymFilterFactory extends BaseTokenFilterFactory implements Reso
|
||||||
|
List<String> tokList = new ArrayList<String>();
|
||||||
|
try {
|
||||||
|
for( Token token = ts.next(); token != null; token = ts.next() ){
|
||||||
|
- String text = token.termText();
|
||||||
|
+ String text = new String(token.termBuffer(), 0, token.termLength());
|
||||||
|
if( text.length() > 0 )
|
||||||
|
tokList.add( text );
|
||||||
|
}
|
||||||
|
diff --git a/src/java/org/apache/solr/core/QuerySenderListener.java b/src/java/org/apache/solr/core/QuerySenderListener.java
|
||||||
|
index 78777cf..f24c532 100644
|
||||||
|
--- a/src/java/org/apache/solr/core/QuerySenderListener.java
|
||||||
|
+++ b/src/java/org/apache/solr/core/QuerySenderListener.java
|
||||||
|
@@ -20,6 +20,7 @@ package org.apache.solr.core;
|
||||||
|
import org.apache.solr.search.SolrIndexSearcher;
|
||||||
|
import org.apache.solr.search.DocList;
|
||||||
|
import org.apache.solr.search.DocIterator;
|
||||||
|
+import org.apache.solr.common.params.CommonParams;
|
||||||
|
import org.apache.solr.common.util.NamedList;
|
||||||
|
import org.apache.solr.request.LocalSolrQueryRequest;
|
||||||
|
import org.apache.solr.request.SolrQueryResponse;
|
||||||
|
@@ -47,7 +48,7 @@ class QuerySenderListener extends AbstractSolrEventListener {
|
||||||
|
};
|
||||||
|
|
||||||
|
SolrQueryResponse rsp = new SolrQueryResponse();
|
||||||
|
- core.execute(req,rsp);
|
||||||
|
+ core.execute(core.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
|
||||||
|
diff --git a/src/java/org/apache/solr/core/SolrCore.java b/src/java/org/apache/solr/core/SolrCore.java
|
||||||
|
index 0f1e656..c2f2169 100644
|
||||||
|
--- a/src/java/org/apache/solr/core/SolrCore.java
|
||||||
|
+++ b/src/java/org/apache/solr/core/SolrCore.java
|
||||||
|
@@ -38,7 +38,7 @@ import org.apache.solr.schema.IndexSchema;
|
||||||
|
import org.apache.solr.search.QParserPlugin;
|
||||||
|
import org.apache.solr.search.SolrIndexSearcher;
|
||||||
|
import org.apache.solr.search.ValueSourceParser;
|
||||||
|
-import org.apache.solr.update.DirectUpdateHandler;
|
||||||
|
+import org.apache.solr.update.DirectUpdateHandler2;
|
||||||
|
import org.apache.solr.update.SolrIndexWriter;
|
||||||
|
import org.apache.solr.update.UpdateHandler;
|
||||||
|
import org.apache.solr.update.processor.LogUpdateProcessorFactory;
|
||||||
|
@@ -470,7 +470,7 @@ public final class SolrCore implements SolrInfoMBean {
|
||||||
|
getSearcher(false,false,null);
|
||||||
|
|
||||||
|
updateHandler = createUpdateHandler(
|
||||||
|
- solrConfig.get("updateHandler/@class", DirectUpdateHandler.class.getName())
|
||||||
|
+ solrConfig.get("updateHandler/@class", DirectUpdateHandler2.class.getName())
|
||||||
|
);
|
||||||
|
|
||||||
|
infoRegistry.put("updateHandler", updateHandler);
|
||||||
|
@@ -1190,8 +1190,8 @@ public final class SolrCore implements SolrInfoMBean {
|
||||||
|
|
||||||
|
public void execute(SolrRequestHandler handler, SolrQueryRequest req, SolrQueryResponse rsp) {
|
||||||
|
if (handler==null) {
|
||||||
|
- log.warning(logid+"Null Request Handler '" + req.getQueryType() +"' :" + req);
|
||||||
|
- throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,"Null Request Handler '" + req.getQueryType() + "'", true);
|
||||||
|
+ log.warning(logid+"Null Request Handler '" + req.getParams().get(CommonParams.QT) +"' :" + req);
|
||||||
|
+ throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,"Null Request Handler '" + req.getParams().get(CommonParams.QT) + "'", true);
|
||||||
|
}
|
||||||
|
// setup response header and handle request
|
||||||
|
final NamedList<Object> responseHeader = new SimpleOrderedMap<Object>();
|
||||||
|
@@ -1320,7 +1320,7 @@ public final class SolrCore implements SolrInfoMBean {
|
||||||
|
* 'wt' parameter, attempts to find that one; otherwise return the default writer.
|
||||||
|
*/
|
||||||
|
public final QueryResponseWriter getQueryResponseWriter(SolrQueryRequest request) {
|
||||||
|
- return getQueryResponseWriter(request.getParam("wt"));
|
||||||
|
+ return getQueryResponseWriter(request.getParams().get(CommonParams.WT));
|
||||||
|
}
|
||||||
|
|
||||||
|
private final Map<String, QParserPlugin> qParserPlugins = new HashMap<String, QParserPlugin>();
|
||||||
|
diff --git a/src/java/org/apache/solr/handler/admin/LukeRequestHandler.java b/src/java/org/apache/solr/handler/admin/LukeRequestHandler.java
|
||||||
|
index 046cbc2..ead5c65 100644
|
||||||
|
--- a/src/java/org/apache/solr/handler/admin/LukeRequestHandler.java
|
||||||
|
+++ b/src/java/org/apache/solr/handler/admin/LukeRequestHandler.java
|
||||||
|
@@ -376,7 +376,7 @@ public class LukeRequestHandler extends RequestHandlerBase
|
||||||
|
finfo.add("fields", fields);
|
||||||
|
finfo.add("dynamicFields", dynamicFields);
|
||||||
|
finfo.add("uniqueKeyField", uniqueField.getName());
|
||||||
|
- finfo.add("defaultSearchField", schema.getDefaultSearchFieldName());
|
||||||
|
+ finfo.add("defaultSearchField", schema.getSolrQueryParser(null).getField());
|
||||||
|
finfo.add("types", types);
|
||||||
|
return finfo;
|
||||||
|
}
|
||||||
|
diff --git a/src/java/org/apache/solr/handler/admin/SystemInfoHandler.java b/src/java/org/apache/solr/handler/admin/SystemInfoHandler.java
|
||||||
|
index ba2adda..51ad696 100644
|
||||||
|
--- a/src/java/org/apache/solr/handler/admin/SystemInfoHandler.java
|
||||||
|
+++ b/src/java/org/apache/solr/handler/admin/SystemInfoHandler.java
|
||||||
|
@@ -73,7 +73,7 @@ public class SystemInfoHandler extends RequestHandlerBase
|
||||||
|
SimpleOrderedMap<Object> info = new SimpleOrderedMap<Object>();
|
||||||
|
|
||||||
|
IndexSchema schema = core.getSchema();
|
||||||
|
- info.add( "schema", schema != null ? schema.getName():"no schema!" );
|
||||||
|
+ info.add( "schema", schema != null ? schema.getSchemaName():"no schema!" );
|
||||||
|
|
||||||
|
// Host
|
||||||
|
InetAddress addr = InetAddress.getLocalHost();
|
||||||
|
diff --git a/src/java/org/apache/solr/handler/component/QueryElevationComponent.java b/src/java/org/apache/solr/handler/component/QueryElevationComponent.java
|
||||||
|
index 5cbd5f6..a12d140 100644
|
||||||
|
--- a/src/java/org/apache/solr/handler/component/QueryElevationComponent.java
|
||||||
|
+++ b/src/java/org/apache/solr/handler/component/QueryElevationComponent.java
|
||||||
|
@@ -299,7 +299,7 @@ public class QueryElevationComponent extends SearchComponent implements SolrCore
|
||||||
|
TokenStream tokens = analyzer.tokenStream( null, new StringReader( query ) );
|
||||||
|
Token token = tokens.next();
|
||||||
|
while( token != null ) {
|
||||||
|
- norm.append( token.termText() );
|
||||||
|
+ norm.append( new String(token.termBuffer(), 0, token.termLength()) );
|
||||||
|
token = tokens.next();
|
||||||
|
}
|
||||||
|
return norm.toString();
|
||||||
|
diff --git a/src/java/org/apache/solr/request/TextResponseWriter.java b/src/java/org/apache/solr/request/TextResponseWriter.java
|
||||||
|
index f7a21c6..b377650 100644
|
||||||
|
--- a/src/java/org/apache/solr/request/TextResponseWriter.java
|
||||||
|
+++ b/src/java/org/apache/solr/request/TextResponseWriter.java
|
||||||
|
@@ -18,6 +18,7 @@
|
||||||
|
package org.apache.solr.request;
|
||||||
|
|
||||||
|
import org.apache.lucene.document.Document;
|
||||||
|
+import org.apache.solr.common.params.CommonParams;
|
||||||
|
import org.apache.solr.common.util.NamedList;
|
||||||
|
import org.apache.solr.common.util.FastWriter;
|
||||||
|
import org.apache.solr.common.SolrDocument;
|
||||||
|
@@ -54,7 +55,7 @@ public abstract class TextResponseWriter {
|
||||||
|
this.schema = req.getSchema();
|
||||||
|
this.req = req;
|
||||||
|
this.rsp = rsp;
|
||||||
|
- String indent = req.getParam("indent");
|
||||||
|
+ String indent = req.getParams().get("indent");
|
||||||
|
if (indent != null && !"".equals(indent) && !"off".equals(indent)) {
|
||||||
|
doIndent=true;
|
||||||
|
}
|
||||||
|
diff --git a/src/java/org/apache/solr/request/XMLWriter.java b/src/java/org/apache/solr/request/XMLWriter.java
|
||||||
|
index 1735159..c6f5a05 100644
|
||||||
|
--- a/src/java/org/apache/solr/request/XMLWriter.java
|
||||||
|
+++ b/src/java/org/apache/solr/request/XMLWriter.java
|
||||||
|
@@ -19,6 +19,7 @@ package org.apache.solr.request;
|
||||||
|
|
||||||
|
import org.apache.solr.common.SolrDocument;
|
||||||
|
import org.apache.solr.common.SolrDocumentList;
|
||||||
|
+import org.apache.solr.common.params.CommonParams;
|
||||||
|
import org.apache.solr.common.util.NamedList;
|
||||||
|
import org.apache.solr.common.util.XML;
|
||||||
|
import org.apache.solr.search.SolrIndexSearcher;
|
||||||
|
@@ -61,18 +62,18 @@ final public class XMLWriter {
|
||||||
|
|
||||||
|
public static void writeResponse(Writer writer, SolrQueryRequest req, SolrQueryResponse rsp) throws IOException {
|
||||||
|
|
||||||
|
- String ver = req.getParam("version");
|
||||||
|
+ String ver = req.getParams().get(CommonParams.VERSION);
|
||||||
|
|
||||||
|
writer.write(XML_START1);
|
||||||
|
|
||||||
|
- String stylesheet = req.getParam("stylesheet");
|
||||||
|
+ String stylesheet = req.getParams().get("stylesheet");
|
||||||
|
if (stylesheet != null && stylesheet.length() > 0) {
|
||||||
|
writer.write(XML_STYLESHEET);
|
||||||
|
writer.write(stylesheet);
|
||||||
|
writer.write(XML_STYLESHEET_END);
|
||||||
|
}
|
||||||
|
|
||||||
|
- String noSchema = req.getParam("noSchema");
|
||||||
|
+ String noSchema = req.getParams().get("noSchema");
|
||||||
|
// todo - change when schema becomes available?
|
||||||
|
if (false && noSchema == null)
|
||||||
|
writer.write(XML_START2_SCHEMA);
|
||||||
|
@@ -87,7 +88,7 @@ final public class XMLWriter {
|
||||||
|
XMLWriter xw = new XMLWriter(writer, req.getSchema(), req, ver);
|
||||||
|
xw.defaultFieldList = rsp.getReturnFields();
|
||||||
|
|
||||||
|
- String indent = req.getParam("indent");
|
||||||
|
+ String indent = req.getParams().get("indent");
|
||||||
|
if (indent != null) {
|
||||||
|
if ("".equals(indent) || "off".equals(indent)) {
|
||||||
|
xw.setIndent(false);
|
||||||
|
diff --git a/src/java/org/apache/solr/search/FieldQParserPlugin.java b/src/java/org/apache/solr/search/FieldQParserPlugin.java
|
||||||
|
index ed3c5ba..1dca87a 100644
|
||||||
|
--- a/src/java/org/apache/solr/search/FieldQParserPlugin.java
|
||||||
|
+++ b/src/java/org/apache/solr/search/FieldQParserPlugin.java
|
||||||
|
@@ -97,7 +97,7 @@ public class FieldQParserPlugin extends QParserPlugin {
|
||||||
|
return null;
|
||||||
|
else if (lst.size() == 1) {
|
||||||
|
t = lst.get(0);
|
||||||
|
- return new TermQuery(new Term(field, t.termText()));
|
||||||
|
+ return new TermQuery(new Term(field, new String(t.termBuffer(), 0, t.termLength())));
|
||||||
|
} else {
|
||||||
|
if (severalTokensAtSamePosition) {
|
||||||
|
if (positionCount == 1) {
|
||||||
|
@@ -106,7 +106,7 @@ public class FieldQParserPlugin extends QParserPlugin {
|
||||||
|
for (int i = 0; i < lst.size(); i++) {
|
||||||
|
t = (org.apache.lucene.analysis.Token) lst.get(i);
|
||||||
|
TermQuery currentQuery = new TermQuery(
|
||||||
|
- new Term(field, t.termText()));
|
||||||
|
+ new Term(field, new String(t.termBuffer(), 0, t.termLength())));
|
||||||
|
q.add(currentQuery, BooleanClause.Occur.SHOULD);
|
||||||
|
}
|
||||||
|
return q;
|
||||||
|
@@ -122,7 +122,7 @@ public class FieldQParserPlugin extends QParserPlugin {
|
||||||
|
mpq.add((Term[])multiTerms.toArray(new Term[0]));
|
||||||
|
multiTerms.clear();
|
||||||
|
}
|
||||||
|
- multiTerms.add(new Term(field, t.termText()));
|
||||||
|
+ multiTerms.add(new Term(field, new String(t.termBuffer(), 0, t.termLength())));
|
||||||
|
}
|
||||||
|
mpq.add((Term[])multiTerms.toArray(new Term[0]));
|
||||||
|
return mpq;
|
||||||
|
@@ -132,7 +132,8 @@ public class FieldQParserPlugin extends QParserPlugin {
|
||||||
|
PhraseQuery q = new PhraseQuery();
|
||||||
|
q.setSlop(phraseSlop);
|
||||||
|
for (int i = 0; i < lst.size(); i++) {
|
||||||
|
- q.add(new Term(field, lst.get(i).termText()));
|
||||||
|
+ Token token = lst.get(i);
|
||||||
|
+ q.add(new Term(field, new String(token.termBuffer(), 0, token.termLength())));
|
||||||
|
}
|
||||||
|
return q;
|
||||||
|
}
|
||||||
|
diff --git a/src/java/org/apache/solr/search/LuceneQParserPlugin.java b/src/java/org/apache/solr/search/LuceneQParserPlugin.java
|
||||||
|
index 33a1fbe..5ae9cd6 100755
|
||||||
|
--- a/src/java/org/apache/solr/search/LuceneQParserPlugin.java
|
||||||
|
+++ b/src/java/org/apache/solr/search/LuceneQParserPlugin.java
|
||||||
|
@@ -61,7 +61,7 @@ class LuceneQParser extends QParser {
|
||||||
|
|
||||||
|
String defaultField = getParam(CommonParams.DF);
|
||||||
|
if (defaultField==null) {
|
||||||
|
- defaultField = getReq().getSchema().getDefaultSearchFieldName();
|
||||||
|
+ defaultField = getReq().getSchema().getSolrQueryParser(null).getField();
|
||||||
|
}
|
||||||
|
lparser = new SolrQueryParser(this, defaultField);
|
||||||
|
|
||||||
|
@@ -71,7 +71,7 @@ class LuceneQParser extends QParser {
|
||||||
|
lparser.setDefaultOperator("AND".equals(opParam) ? QueryParser.Operator.AND : QueryParser.Operator.OR);
|
||||||
|
} else {
|
||||||
|
// try to get default operator from schema
|
||||||
|
- String operator = getReq().getSchema().getQueryParserDefaultOperator();
|
||||||
|
+ String operator = getReq().getSchema().getSolrQueryParser(null).getField();
|
||||||
|
lparser.setDefaultOperator("AND".equals(operator) ?
|
||||||
|
QueryParser.Operator.AND : QueryParser.Operator.OR);
|
||||||
|
}
|
||||||
|
diff --git a/src/java/org/apache/solr/search/LuceneQueryOptimizer.java b/src/java/org/apache/solr/search/LuceneQueryOptimizer.java
|
||||||
|
index df9020f..758c351 100644
|
||||||
|
--- a/src/java/org/apache/solr/search/LuceneQueryOptimizer.java
|
||||||
|
+++ b/src/java/org/apache/solr/search/LuceneQueryOptimizer.java
|
||||||
|
@@ -97,7 +97,7 @@ if (c.query instanceof TermQuery) {
|
||||||
|
filter = (Filter)cache.get(filterQuery);
|
||||||
|
}
|
||||||
|
if (filter == null) { // miss
|
||||||
|
- filter = new QueryFilter(filterQuery); // construct new entry
|
||||||
|
+ filter = new CachingWrapperFilter(new QueryWrapperFilter(filterQuery)); // construct new entry
|
||||||
|
synchronized (cache) {
|
||||||
|
cache.put(filterQuery, filter); // cache it
|
||||||
|
}
|
||||||
|
diff --git a/src/java/org/apache/solr/util/HighlightingUtils.java b/src/java/org/apache/solr/util/HighlightingUtils.java
|
||||||
|
index b2a5aae..04ac761 100644
|
||||||
|
--- a/src/java/org/apache/solr/util/HighlightingUtils.java
|
||||||
|
+++ b/src/java/org/apache/solr/util/HighlightingUtils.java
|
||||||
|
@@ -325,7 +325,7 @@ class MultiValueTokenStream extends TokenStream {
|
||||||
|
}
|
||||||
|
// create an modified token which is the offset into the concatenated
|
||||||
|
// string of all values
|
||||||
|
- Token offsetToken = new Token(nextToken.termText(),
|
||||||
|
+ Token offsetToken = new Token(new String(nextToken.termBuffer(), 0, nextToken.termLength()),
|
||||||
|
nextToken.startOffset() + curOffset,
|
||||||
|
nextToken.endOffset() + curOffset);
|
||||||
|
offsetToken.setPositionIncrement(nextToken.getPositionIncrement() + extra*10);
|
||||||
|
diff --git a/src/java/org/apache/solr/util/SolrPluginUtils.java b/src/java/org/apache/solr/util/SolrPluginUtils.java
|
||||||
|
index c0b5b0b..eef0904 100644
|
||||||
|
--- a/src/java/org/apache/solr/util/SolrPluginUtils.java
|
||||||
|
+++ b/src/java/org/apache/solr/util/SolrPluginUtils.java
|
||||||
|
@@ -180,7 +180,7 @@ public class SolrPluginUtils {
|
||||||
|
public static int setReturnFields(SolrQueryRequest req,
|
||||||
|
SolrQueryResponse res) {
|
||||||
|
|
||||||
|
- return setReturnFields(req.getParam(FL), res);
|
||||||
|
+ return setReturnFields(req.getParams().get(org.apache.solr.common.params.CommonParams.FL), res);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
@@ -382,14 +382,14 @@ public class SolrPluginUtils {
|
||||||
|
DocList results)
|
||||||
|
throws IOException {
|
||||||
|
|
||||||
|
- String debug = req.getParam(org.apache.solr.common.params.CommonParams.DEBUG_QUERY);
|
||||||
|
+ String debug = req.getParams().get(org.apache.solr.common.params.CommonParams.DEBUG_QUERY);
|
||||||
|
|
||||||
|
NamedList dbg = null;
|
||||||
|
if (debug!=null) {
|
||||||
|
dbg = new SimpleOrderedMap();
|
||||||
|
|
||||||
|
/* userQuery may have been pre-processes .. expose that */
|
||||||
|
- dbg.add("rawquerystring", req.getQueryString());
|
||||||
|
+ dbg.add("rawquerystring", req.getParams().get(org.apache.solr.common.params.CommonParams.Q));
|
||||||
|
dbg.add("querystring", userQuery);
|
||||||
|
|
||||||
|
/* QueryParsing.toString isn't perfect, use it to see converted
|
||||||
|
@@ -401,7 +401,7 @@ public class SolrPluginUtils {
|
||||||
|
|
||||||
|
dbg.add("explain", getExplainList
|
||||||
|
(query, results, req.getSearcher(), req.getSchema()));
|
||||||
|
- String otherQueryS = req.getParam("explainOther");
|
||||||
|
+ String otherQueryS = req.getParams().get(org.apache.solr.common.params.CommonParams.EXPLAIN_OTHER);
|
||||||
|
if (otherQueryS != null && otherQueryS.length() > 0) {
|
||||||
|
DocList otherResults = doSimpleQuery
|
||||||
|
(otherQueryS,req.getSearcher(), req.getSchema(),0,10);
|
||||||
|
@@ -804,7 +804,7 @@ public class SolrPluginUtils {
|
||||||
|
*/
|
||||||
|
public static Sort getSort(SolrQueryRequest req) {
|
||||||
|
|
||||||
|
- String sort = req.getParam(org.apache.solr.common.params.CommonParams.SORT);
|
||||||
|
+ String sort = req.getParams().get(org.apache.solr.common.params.CommonParams.SORT);
|
||||||
|
if (null == sort || sort.equals("")) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
diff --git a/src/java/org/apache/solr/util/SuggestMissingFactories.java b/src/java/org/apache/solr/util/SuggestMissingFactories.java
|
||||||
|
index 9556c1e..b8d0625 100644
|
||||||
|
--- a/src/java/org/apache/solr/util/SuggestMissingFactories.java
|
||||||
|
+++ b/src/java/org/apache/solr/util/SuggestMissingFactories.java
|
||||||
|
@@ -131,7 +131,7 @@ class FindClasses {
|
||||||
|
try {
|
||||||
|
for (int i =0; i < jars.length; i++) {
|
||||||
|
jarFiles[i] = new JarFile(jars[i]);
|
||||||
|
- urls[i] = jars[i].toURL();
|
||||||
|
+ urls[i] = jars[i].toURI().toURL();
|
||||||
|
}
|
||||||
|
} catch (MalformedURLException e) {
|
||||||
|
throw new RuntimeException
|
||||||
|
diff --git a/src/java/org/apache/solr/util/TestHarness.java b/src/java/org/apache/solr/util/TestHarness.java
|
||||||
|
index 35ed671..7a81034 100644
|
||||||
|
--- a/src/java/org/apache/solr/util/TestHarness.java
|
||||||
|
+++ b/src/java/org/apache/solr/util/TestHarness.java
|
||||||
|
@@ -17,6 +17,7 @@
|
||||||
|
|
||||||
|
package org.apache.solr.util;
|
||||||
|
|
||||||
|
+import org.apache.solr.common.params.CommonParams;
|
||||||
|
import org.apache.solr.common.util.NamedList;
|
||||||
|
import org.apache.solr.common.util.XML;
|
||||||
|
import org.apache.solr.core.SolrConfig;
|
||||||
|
@@ -117,7 +118,7 @@ public class TestHarness {
|
||||||
|
public TestHarness( String dataDirectory,
|
||||||
|
SolrConfig solrConfig,
|
||||||
|
String schemaFile) {
|
||||||
|
- this( dataDirectory, solrConfig, new IndexSchema(solrConfig, schemaFile));
|
||||||
|
+ this( dataDirectory, solrConfig, new IndexSchema(solrConfig, schemaFile, null));
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @param dataDirectory path for index data, will not be cleaned up
|
||||||
|
@@ -300,7 +301,7 @@ public class TestHarness {
|
||||||
|
* @see LocalSolrQueryRequest
|
||||||
|
*/
|
||||||
|
public String query(SolrQueryRequest req) throws IOException, Exception {
|
||||||
|
- return query(req.getQueryType(), req);
|
||||||
|
+ return query(req.getParams().get(CommonParams.QT), req);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
diff --git a/src/test/org/apache/solr/BasicFunctionalityTest.java b/src/test/org/apache/solr/BasicFunctionalityTest.java
|
||||||
|
index cf91a02..ce45cd2 100644
|
||||||
|
--- a/src/test/org/apache/solr/BasicFunctionalityTest.java
|
||||||
|
+++ b/src/test/org/apache/solr/BasicFunctionalityTest.java
|
||||||
|
@@ -21,6 +21,7 @@ import org.apache.lucene.document.*;
|
||||||
|
import org.apache.lucene.search.Query;
|
||||||
|
import org.apache.lucene.search.BooleanQuery;
|
||||||
|
import org.apache.solr.common.params.AppendedSolrParams;
|
||||||
|
+import org.apache.solr.common.params.CommonParams;
|
||||||
|
import org.apache.solr.common.params.DefaultSolrParams;
|
||||||
|
import org.apache.solr.common.params.MapSolrParams;
|
||||||
|
import org.apache.solr.common.params.SolrParams;
|
||||||
|
@@ -297,14 +298,14 @@ public class BasicFunctionalityTest extends AbstractSolrTestCase {
|
||||||
|
args.put("string", "string value");
|
||||||
|
args.put("array", new String[] {"array", "value"});
|
||||||
|
SolrQueryRequest req = new LocalSolrQueryRequest(null, null, null, 0, 20, args);
|
||||||
|
- assertEquals("string value", req.getParam("string"));
|
||||||
|
- assertEquals("array", req.getParam("array"));
|
||||||
|
+ assertEquals("string value", req.getParams().get("string"));
|
||||||
|
+ assertEquals("array", req.getParams().get("array"));
|
||||||
|
|
||||||
|
- String[] stringParams = req.getParams("string");
|
||||||
|
+ String[] stringParams = req.getParams().getParams("string");
|
||||||
|
assertEquals(1, stringParams.length);
|
||||||
|
assertEquals("string value", stringParams[0]);
|
||||||
|
|
||||||
|
- String[] arrayParams = req.getParams("array");
|
||||||
|
+ String[] arrayParams = req.getParams().getParams("array");
|
||||||
|
assertEquals(2, arrayParams.length);
|
||||||
|
assertEquals("array", arrayParams[0]);
|
||||||
|
assertEquals("value", arrayParams[1]);
|
||||||
|
@@ -337,7 +338,7 @@ public class BasicFunctionalityTest extends AbstractSolrTestCase {
|
||||||
|
|
||||||
|
public void testTermVectorFields() {
|
||||||
|
|
||||||
|
- IndexSchema ischema = new IndexSchema(solrConfig, getSchemaFile());
|
||||||
|
+ IndexSchema ischema = new IndexSchema(solrConfig, getSchemaFile(), null);
|
||||||
|
SchemaField f; // Solr field type
|
||||||
|
Field luf; // Lucene field
|
||||||
|
|
||||||
|
@@ -506,7 +507,7 @@ public class BasicFunctionalityTest extends AbstractSolrTestCase {
|
||||||
|
}
|
||||||
|
public void testCompressableFieldType() {
|
||||||
|
|
||||||
|
- IndexSchema ischema = new IndexSchema(solrConfig, getSchemaFile());
|
||||||
|
+ IndexSchema ischema = new IndexSchema(solrConfig, getSchemaFile(), null);
|
||||||
|
SchemaField f; // Solr field type
|
||||||
|
Field luf; // Lucene field
|
||||||
|
|
||||||
|
@@ -538,7 +539,7 @@ public class BasicFunctionalityTest extends AbstractSolrTestCase {
|
||||||
|
|
||||||
|
SolrQueryRequest req = req("q", "title:keyword", "fl", "id,title,test_hlt");
|
||||||
|
SolrQueryResponse rsp = new SolrQueryResponse();
|
||||||
|
- core.execute(req, rsp);
|
||||||
|
+ core.execute(core.getRequestHandler(req.getParams().get(CommonParams.QT)), req, rsp);
|
||||||
|
|
||||||
|
DocList dl = (DocList) rsp.getValues().get("response");
|
||||||
|
org.apache.lucene.document.Document d = req.getSearcher().doc(dl.iterator().nextDoc());
|
||||||
|
@@ -558,7 +559,7 @@ public class BasicFunctionalityTest extends AbstractSolrTestCase {
|
||||||
|
|
||||||
|
SolrQueryRequest req = req("q", "title:keyword", "fl", "id,title");
|
||||||
|
SolrQueryResponse rsp = new SolrQueryResponse();
|
||||||
|
- core.execute(req, rsp);
|
||||||
|
+ core.execute(core.getRequestHandler(req.getParams().get(CommonParams.QT)), req, rsp);
|
||||||
|
|
||||||
|
DocList dl = (DocList) rsp.getValues().get("response");
|
||||||
|
DocIterator di = dl.iterator();
|
||||||
|
diff --git a/src/test/org/apache/solr/analysis/BaseTokenTestCase.java b/src/test/org/apache/solr/analysis/BaseTokenTestCase.java
|
||||||
|
index 2487ca3..322b19f 100644
|
||||||
|
--- a/src/test/org/apache/solr/analysis/BaseTokenTestCase.java
|
||||||
|
+++ b/src/test/org/apache/solr/analysis/BaseTokenTestCase.java
|
||||||
|
@@ -37,10 +37,10 @@ public abstract class BaseTokenTestCase extends AnalysisTestCase
|
||||||
|
StringBuffer out = new StringBuffer();
|
||||||
|
Token t = in.next();
|
||||||
|
if (null != t)
|
||||||
|
- out.append(t.termText());
|
||||||
|
+ out.append(new String(t.termBuffer(), 0, t.termLength()));
|
||||||
|
|
||||||
|
for (t = in.next(); null != t; t = in.next()) {
|
||||||
|
- out.append(" ").append(t.termText());
|
||||||
|
+ out.append(" ").append(new String(t.termBuffer(), 0, t.termLength()));
|
||||||
|
}
|
||||||
|
in.close();
|
||||||
|
return out.toString();
|
||||||
|
@@ -49,7 +49,7 @@ public abstract class BaseTokenTestCase extends AnalysisTestCase
|
||||||
|
public List<String> tok2str(Iterable<Token> tokLst) {
|
||||||
|
ArrayList<String> lst = new ArrayList<String>();
|
||||||
|
for ( Token t : tokLst ) {
|
||||||
|
- lst.add( t.termText());
|
||||||
|
+ lst.add( new String(t.termBuffer(), 0, t.termLength()));
|
||||||
|
}
|
||||||
|
return lst;
|
||||||
|
}
|
||||||
|
@@ -70,7 +70,7 @@ public abstract class BaseTokenTestCase extends AnalysisTestCase
|
||||||
|
for (Iterator iter = a.iterator(); iter.hasNext();) {
|
||||||
|
Token tok = (Token)iter.next();
|
||||||
|
pos += tok.getPositionIncrement();
|
||||||
|
- if (!tokAt(b, tok.termText(), pos
|
||||||
|
+ if (!tokAt(b, new String(tok.termBuffer(), 0, tok.termLength()), pos
|
||||||
|
, checkOff ? tok.startOffset() : -1
|
||||||
|
, checkOff ? tok.endOffset() : -1
|
||||||
|
))
|
||||||
|
@@ -85,7 +85,7 @@ public abstract class BaseTokenTestCase extends AnalysisTestCase
|
||||||
|
for (Iterator iter = lst.iterator(); iter.hasNext();) {
|
||||||
|
Token tok = (Token)iter.next();
|
||||||
|
pos += tok.getPositionIncrement();
|
||||||
|
- if (pos==tokPos && tok.termText().equals(val)
|
||||||
|
+ if (pos==tokPos && new String(tok.termBuffer(), 0, tok.termLength()).equals(val)
|
||||||
|
&& (startOff==-1 || tok.startOffset()==startOff)
|
||||||
|
&& (endOff ==-1 || tok.endOffset() ==endOff )
|
||||||
|
)
|
||||||
|
diff --git a/src/test/org/apache/solr/analysis/TestBufferedTokenStream.java b/src/test/org/apache/solr/analysis/TestBufferedTokenStream.java
|
||||||
|
index 6226a10..b24c2a4 100644
|
||||||
|
--- a/src/test/org/apache/solr/analysis/TestBufferedTokenStream.java
|
||||||
|
+++ b/src/test/org/apache/solr/analysis/TestBufferedTokenStream.java
|
||||||
|
@@ -33,9 +33,9 @@ public class TestBufferedTokenStream extends BaseTokenTestCase {
|
||||||
|
public static class AB_Q_Stream extends BufferedTokenStream {
|
||||||
|
public AB_Q_Stream(TokenStream input) {super(input);}
|
||||||
|
protected Token process(Token t) throws IOException {
|
||||||
|
- if ("A".equals(t.termText())) {
|
||||||
|
+ if ("A".equals(new String(t.termBuffer(), 0, t.termLength()))) {
|
||||||
|
Token t2 = read();
|
||||||
|
- if (t2!=null && "B".equals(t2.termText())) t.setTermText("Q");
|
||||||
|
+ if (t2!=null && "B".equals(new String(t2.termBuffer(), 0, t2.termLength()))) t.setTermText("Q");
|
||||||
|
if (t2!=null) pushBack(t2);
|
||||||
|
}
|
||||||
|
return t;
|
||||||
|
@@ -46,7 +46,8 @@ public class TestBufferedTokenStream extends BaseTokenTestCase {
|
||||||
|
public static class AB_AAB_Stream extends BufferedTokenStream {
|
||||||
|
public AB_AAB_Stream(TokenStream input) {super(input);}
|
||||||
|
protected Token process(Token t) throws IOException {
|
||||||
|
- if ("A".equals(t.termText()) && "B".equals(peek(1).termText()))
|
||||||
|
+ if ("A".equals(new String(t.termBuffer(), 0, t.termLength())) &&
|
||||||
|
+ "B".equals(new String(peek(1).termBuffer(), 0, peek(1).termLength())))
|
||||||
|
write(t);
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
diff --git a/src/test/org/apache/solr/analysis/TestPatternTokenizerFactory.java b/src/test/org/apache/solr/analysis/TestPatternTokenizerFactory.java
|
||||||
|
index 4ddeaf3..4727a6a 100644
|
||||||
|
--- a/src/test/org/apache/solr/analysis/TestPatternTokenizerFactory.java
|
||||||
|
+++ b/src/test/org/apache/solr/analysis/TestPatternTokenizerFactory.java
|
||||||
|
@@ -65,7 +65,7 @@ public class TestPatternTokenizerFactory extends AnalysisTestCase
|
||||||
|
int i=0;
|
||||||
|
for( Token t = stream.next(); null != t; t = stream.next() )
|
||||||
|
{
|
||||||
|
- assertEquals( "split: "+test[1] + " "+i, split[i++], t.termText() );
|
||||||
|
+ assertEquals( "split: "+test[1] + " "+i, split[i++], new String(t.termBuffer(), 0, t.termLength()) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
diff --git a/src/test/org/apache/solr/analysis/TestSynonymMap.java b/src/test/org/apache/solr/analysis/TestSynonymMap.java
|
||||||
|
index fb627db..e0bd7c8 100644
|
||||||
|
--- a/src/test/org/apache/solr/analysis/TestSynonymMap.java
|
||||||
|
+++ b/src/test/org/apache/solr/analysis/TestSynonymMap.java
|
||||||
|
@@ -259,7 +259,7 @@ public class TestSynonymMap extends AnalysisTestCase {
|
||||||
|
Token[] tokens = ((SynonymMap)map.submap.get( src )).synonyms;
|
||||||
|
boolean inc = false;
|
||||||
|
for( Token token : tokens ){
|
||||||
|
- if( exp.equals( token.termText() ) )
|
||||||
|
+ if( exp.equals( new String(token.termBuffer(), 0, token.termLength()) ) )
|
||||||
|
inc = true;
|
||||||
|
}
|
||||||
|
assertTrue( inc );
|
||||||
|
diff --git a/src/test/org/apache/solr/analysis/TestWordDelimiterFilter.java b/src/test/org/apache/solr/analysis/TestWordDelimiterFilter.java
|
||||||
|
index 0b34fdc..1b8084e 100644
|
||||||
|
--- a/src/test/org/apache/solr/analysis/TestWordDelimiterFilter.java
|
||||||
|
+++ b/src/test/org/apache/solr/analysis/TestWordDelimiterFilter.java
|
||||||
|
@@ -147,17 +147,18 @@ public class TestWordDelimiterFilter extends AbstractSolrTestCase {
|
||||||
|
|
||||||
|
int i=0;
|
||||||
|
for(Token t; (t=wdf.next())!=null;) {
|
||||||
|
- if (t.termText().equals("foo")) {
|
||||||
|
+ String termText = new String(t.termBuffer(), 0, t.termLength());
|
||||||
|
+ if (termText.equals("foo")) {
|
||||||
|
assertEquals(5, t.startOffset());
|
||||||
|
assertEquals(8, t.endOffset());
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
- if (t.termText().equals("bar")) {
|
||||||
|
+ if (termText.equals("bar")) {
|
||||||
|
assertEquals(9, t.startOffset());
|
||||||
|
assertEquals(12, t.endOffset());
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
- if (t.termText().equals("foobar")) {
|
||||||
|
+ if (termText.equals("foobar")) {
|
||||||
|
assertEquals(5, t.startOffset());
|
||||||
|
assertEquals(12, t.endOffset());
|
||||||
|
i++;
|
||||||
|
diff --git a/src/test/org/apache/solr/highlight/HighlighterConfigTest.java b/src/test/org/apache/solr/highlight/HighlighterConfigTest.java
|
||||||
|
index a0e58db..e38ff63 100644
|
||||||
|
--- a/src/test/org/apache/solr/highlight/HighlighterConfigTest.java
|
||||||
|
+++ b/src/test/org/apache/solr/highlight/HighlighterConfigTest.java
|
||||||
|
@@ -35,7 +35,7 @@ public class HighlighterConfigTest extends AbstractSolrTestCase {
|
||||||
|
|
||||||
|
public void testConfig()
|
||||||
|
{
|
||||||
|
- SolrHighlighter highlighter = SolrCore.getSolrCore().getHighlighter();
|
||||||
|
+ SolrHighlighter highlighter = h.getCore().getHighlighter();
|
||||||
|
System.out.println( "highlighter" );
|
||||||
|
|
||||||
|
assertTrue( highlighter instanceof DummyHighlighter );
|
||||||
|
diff --git a/src/test/org/apache/solr/highlight/HighlighterTest.java b/src/test/org/apache/solr/highlight/HighlighterTest.java
|
||||||
|
index fab092a..2ebeb9f 100755
|
||||||
|
--- a/src/test/org/apache/solr/highlight/HighlighterTest.java
|
||||||
|
+++ b/src/test/org/apache/solr/highlight/HighlighterTest.java
|
||||||
|
@@ -54,7 +54,7 @@ public class HighlighterTest extends AbstractSolrTestCase {
|
||||||
|
|
||||||
|
public void testConfig()
|
||||||
|
{
|
||||||
|
- SolrHighlighter highlighter = SolrCore.getSolrCore().getHighlighter();
|
||||||
|
+ SolrHighlighter highlighter = h.getCore().getHighlighter();
|
||||||
|
System.out.println( "highlighter" );
|
||||||
|
|
||||||
|
// Make sure we loaded the one formatter
|
||||||
|
diff --git a/src/test/org/apache/solr/schema/DateFieldTest.java b/src/test/org/apache/solr/schema/DateFieldTest.java
|
||||||
|
index 785db52..d672023 100644
|
||||||
|
--- a/src/test/org/apache/solr/schema/DateFieldTest.java
|
||||||
|
+++ b/src/test/org/apache/solr/schema/DateFieldTest.java
|
||||||
|
@@ -99,11 +99,10 @@ public class DateFieldTest extends LegacyDateFieldTest {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testFormatter() {
|
||||||
|
- DateFormat fmt = f.getThreadLocalDateFormat();
|
||||||
|
- assertEquals("1970-01-01T00:00:00.005", fmt.format(new Date(5)));
|
||||||
|
- assertEquals("1970-01-01T00:00:00", fmt.format(new Date(0)));
|
||||||
|
- assertEquals("1970-01-01T00:00:00.37", fmt.format(new Date(370)));
|
||||||
|
- assertEquals("1970-01-01T00:00:00.9", fmt.format(new Date(900)));
|
||||||
|
+ assertEquals("1970-01-01T00:00:00.005", f.formatDate(new Date(5)));
|
||||||
|
+ assertEquals("1970-01-01T00:00:00", f.formatDate(new Date(0)));
|
||||||
|
+ assertEquals("1970-01-01T00:00:00.37", f.formatDate(new Date(370)));
|
||||||
|
+ assertEquals("1970-01-01T00:00:00.9", f.formatDate(new Date(900)));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
diff --git a/src/test/org/apache/solr/schema/LegacyDateFieldTest.java b/src/test/org/apache/solr/schema/LegacyDateFieldTest.java
|
||||||
|
index 201db56..4d3e6bb 100644
|
||||||
|
--- a/src/test/org/apache/solr/schema/LegacyDateFieldTest.java
|
||||||
|
+++ b/src/test/org/apache/solr/schema/LegacyDateFieldTest.java
|
||||||
|
@@ -95,11 +95,10 @@ public class LegacyDateFieldTest extends TestCase {
|
||||||
|
assertItoR("1995-12-31T23:59:59Z", "1995-12-31T23:59:59");
|
||||||
|
}
|
||||||
|
public void testFormatter() {
|
||||||
|
- DateFormat fmt = f.getThreadLocalDateFormat();
|
||||||
|
- assertEquals("1970-01-01T00:00:00.005", fmt.format(new Date(5)));
|
||||||
|
+ assertEquals("1970-01-01T00:00:00.005", f.formatDate(new Date(5)));
|
||||||
|
// all of this is broken behavior
|
||||||
|
- assertEquals("1970-01-01T00:00:00.000", fmt.format(new Date(0)));
|
||||||
|
- assertEquals("1970-01-01T00:00:00.370", fmt.format(new Date(370)));
|
||||||
|
- assertEquals("1970-01-01T00:00:00.900", fmt.format(new Date(900)));
|
||||||
|
+ assertEquals("1970-01-01T00:00:00.000", f.formatDate(new Date(0)));
|
||||||
|
+ assertEquals("1970-01-01T00:00:00.370", f.formatDate(new Date(370)));
|
||||||
|
+ assertEquals("1970-01-01T00:00:00.900", f.formatDate(new Date(900)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
diff --git a/src/test/org/apache/solr/servlet/SolrRequestParserTest.java b/src/test/org/apache/solr/servlet/SolrRequestParserTest.java
|
||||||
|
index f2f2ac7..ad9bc47 100644
|
||||||
|
--- a/src/test/org/apache/solr/servlet/SolrRequestParserTest.java
|
||||||
|
+++ b/src/test/org/apache/solr/servlet/SolrRequestParserTest.java
|
||||||
|
@@ -56,7 +56,7 @@ public class SolrRequestParserTest extends AbstractSolrTestCase {
|
||||||
|
String body2 = "qwertasdfgzxcvb";
|
||||||
|
String body3 = "1234567890";
|
||||||
|
|
||||||
|
- SolrCore core = SolrCore.getSolrCore();
|
||||||
|
+ SolrCore core = h.getCore();
|
||||||
|
|
||||||
|
Map<String,String[]> args = new HashMap<String, String[]>();
|
||||||
|
args.put( CommonParams.STREAM_BODY, new String[] {body1} );
|
||||||
|
@@ -110,7 +110,7 @@ public class SolrRequestParserTest extends AbstractSolrTestCase {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
- SolrCore core = SolrCore.getSolrCore();
|
||||||
|
+ SolrCore core = h.getCore();
|
||||||
|
|
||||||
|
Map<String,String[]> args = new HashMap<String, String[]>();
|
||||||
|
args.put( CommonParams.STREAM_URL, new String[] {url} );
|
||||||
|
diff --git a/src/test/org/apache/solr/update/DirectUpdateHandlerTest.java b/src/test/org/apache/solr/update/DirectUpdateHandlerTest.java
|
||||||
|
index 93d2921..eeee6a7 100644
|
||||||
|
--- a/src/test/org/apache/solr/update/DirectUpdateHandlerTest.java
|
||||||
|
+++ b/src/test/org/apache/solr/update/DirectUpdateHandlerTest.java
|
||||||
|
@@ -37,7 +37,7 @@ public class DirectUpdateHandlerTest extends AbstractSolrTestCase {
|
||||||
|
|
||||||
|
public void testRequireUniqueKey() throws Exception
|
||||||
|
{
|
||||||
|
- SolrCore core = SolrCore.getSolrCore();
|
||||||
|
+ SolrCore core = h.getCore();
|
||||||
|
|
||||||
|
UpdateHandler updater = core.getUpdateHandler();
|
||||||
|
|
||||||
|
diff --git a/src/test/org/apache/solr/update/DocumentBuilderTest.java b/src/test/org/apache/solr/update/DocumentBuilderTest.java
|
||||||
|
index 0174501..45f14a3 100644
|
||||||
|
--- a/src/test/org/apache/solr/update/DocumentBuilderTest.java
|
||||||
|
+++ b/src/test/org/apache/solr/update/DocumentBuilderTest.java
|
||||||
|
@@ -51,7 +51,7 @@ public class DocumentBuilderTest extends AbstractSolrTestCase {
|
||||||
|
|
||||||
|
public void testNullField()
|
||||||
|
{
|
||||||
|
- SolrCore core = SolrCore.getSolrCore();
|
||||||
|
+ SolrCore core = h.getCore();
|
||||||
|
|
||||||
|
// make sure a null value is not indexed
|
||||||
|
SolrInputDocument doc = new SolrInputDocument();
|
||||||
|
diff --git a/src/test/org/apache/solr/util/SolrPluginUtilsTest.java b/src/test/org/apache/solr/util/SolrPluginUtilsTest.java
|
||||||
|
index 4bbc2fd..0098635 100644
|
||||||
|
--- a/src/test/org/apache/solr/util/SolrPluginUtilsTest.java
|
||||||
|
+++ b/src/test/org/apache/solr/util/SolrPluginUtilsTest.java
|
||||||
|
@@ -133,7 +133,7 @@ public class SolrPluginUtilsTest extends AbstractSolrTestCase {
|
||||||
|
assertTrue(t+" sanity test isn't TermQuery: " + out.getClass(),
|
||||||
|
out instanceof TermQuery);
|
||||||
|
assertEquals(t+" sanity test is wrong field",
|
||||||
|
- h.getCore().getSchema().getDefaultSearchFieldName(),
|
||||||
|
+ h.getCore().getSchema().getSolrQueryParser(null).getField(),
|
||||||
|
((TermQuery)out).getTerm().field());
|
||||||
|
|
||||||
|
t = "subject:XXXXXXXX";
|
|
@ -0,0 +1,221 @@
|
||||||
|
Index: src/java/org/apache/solr/update/AddUpdateCommand.java
|
||||||
|
===================================================================
|
||||||
|
--- src/java/org/apache/solr/update/AddUpdateCommand.java (revision 701732)
|
||||||
|
+++ src/java/org/apache/solr/update/AddUpdateCommand.java (working copy)
|
||||||
|
@@ -42,6 +42,10 @@
|
||||||
|
public boolean allowDups;
|
||||||
|
public boolean overwritePending;
|
||||||
|
public boolean overwriteCommitted;
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+ public int commitWithin = -1;
|
||||||
|
+
|
||||||
|
|
||||||
|
/** Reset state to reuse this object with a different document in the same request */
|
||||||
|
public void clear() {
|
||||||
|
Index: src/java/org/apache/solr/update/DirectUpdateHandler2.java
|
||||||
|
===================================================================
|
||||||
|
--- src/java/org/apache/solr/update/DirectUpdateHandler2.java (revision 701732)
|
||||||
|
+++ src/java/org/apache/solr/update/DirectUpdateHandler2.java (working copy)
|
||||||
|
@@ -198,7 +198,7 @@
|
||||||
|
synchronized (this) {
|
||||||
|
// adding document -- prep writer
|
||||||
|
openWriter();
|
||||||
|
- tracker.addedDocument();
|
||||||
|
+ tracker.addedDocument( cmd.commitWithin );
|
||||||
|
} // end synchronized block
|
||||||
|
|
||||||
|
// this is the only unsynchronized code in the iwAccess block, which
|
||||||
|
@@ -424,7 +424,7 @@
|
||||||
|
SolrCore.log.info("AutoCommit: " + this);
|
||||||
|
}
|
||||||
|
|
||||||
|
- /** schedeule individual commits */
|
||||||
|
+ /** schedule individual commits */
|
||||||
|
public synchronized void scheduleCommitWithin(long commitMaxTime)
|
||||||
|
{
|
||||||
|
// Check if there is a commit already scheduled for longer then this time
|
||||||
|
@@ -443,30 +443,22 @@
|
||||||
|
|
||||||
|
/** Indicate that documents have been added
|
||||||
|
*/
|
||||||
|
- public void addedDocument() {
|
||||||
|
+ public void addedDocument( int commitWithin ) {
|
||||||
|
docsSinceCommit++;
|
||||||
|
lastAddedTime = System.currentTimeMillis();
|
||||||
|
// maxDocs-triggered autoCommit
|
||||||
|
if( docsUpperBound > 0 && (docsSinceCommit > docsUpperBound) ) {
|
||||||
|
- if (pending != null &&
|
||||||
|
- pending.getDelay(TimeUnit.MILLISECONDS) > DOC_COMMIT_DELAY_MS) {
|
||||||
|
- // another commit is pending, but too far away (probably due to
|
||||||
|
- // maxTime)
|
||||||
|
- pending.cancel(false);
|
||||||
|
- pending = null;
|
||||||
|
- }
|
||||||
|
- if (pending == null) {
|
||||||
|
- // 1/4 second seems fast enough for anyone using maxDocs
|
||||||
|
- pending = scheduler.schedule(this, DOC_COMMIT_DELAY_MS,
|
||||||
|
- TimeUnit.MILLISECONDS);
|
||||||
|
- }
|
||||||
|
+ scheduleCommitWithin( DOC_COMMIT_DELAY_MS );
|
||||||
|
}
|
||||||
|
+
|
||||||
|
// maxTime-triggered autoCommit
|
||||||
|
- if( pending == null && timeUpperBound > 0 ) {
|
||||||
|
- // Don't start a new event if one is already waiting
|
||||||
|
- pending = scheduler.schedule( this, timeUpperBound, TimeUnit.MILLISECONDS );
|
||||||
|
+ long ctime = timeUpperBound;
|
||||||
|
+ if( commitWithin > 0 && (ctime < 0 || commitWithin < ctime) ) {
|
||||||
|
+ ctime = commitWithin;
|
||||||
|
}
|
||||||
|
-
|
||||||
|
+ if( ctime > 0 ) {
|
||||||
|
+ scheduleCommitWithin( ctime );
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Inform tracker that a commit has occurred, cancel any pending commits */
|
||||||
|
Index: src/java/org/apache/solr/handler/XmlUpdateRequestHandler.java
|
||||||
|
===================================================================
|
||||||
|
--- src/java/org/apache/solr/handler/XmlUpdateRequestHandler.java (revision 701732)
|
||||||
|
+++ src/java/org/apache/solr/handler/XmlUpdateRequestHandler.java (working copy)
|
||||||
|
@@ -19,6 +19,7 @@
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.Reader;
|
||||||
|
+import java.io.StringReader;
|
||||||
|
import java.io.Writer;
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.HashMap;
|
||||||
|
@@ -72,6 +73,7 @@
|
||||||
|
public static final String WAIT_FLUSH = "waitFlush";
|
||||||
|
|
||||||
|
public static final String OVERWRITE = "overwrite";
|
||||||
|
+ public static final String COMMIT_WITHIN = "commitWithin";
|
||||||
|
public static final String OVERWRITE_COMMITTED = "overwriteCommitted"; // @Deprecated
|
||||||
|
public static final String OVERWRITE_PENDING = "overwritePending"; // @Deprecated
|
||||||
|
public static final String ALLOW_DUPS = "allowDups";
|
||||||
|
@@ -120,6 +122,12 @@
|
||||||
|
for( ContentStream stream : req.getContentStreams() ) {
|
||||||
|
Reader reader = stream.getReader();
|
||||||
|
try {
|
||||||
|
+ if( log.isTraceEnabled() ) {
|
||||||
|
+ String body = IOUtils.toString( reader );
|
||||||
|
+ log.trace( "body", body );
|
||||||
|
+ reader = new StringReader( body );
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
XMLStreamReader parser = inputFactory.createXMLStreamReader(reader);
|
||||||
|
this.processUpdate( processor, parser );
|
||||||
|
}
|
||||||
|
@@ -169,6 +177,8 @@
|
||||||
|
overwrite = StrUtils.parseBoolean(attrVal);
|
||||||
|
} else if (ALLOW_DUPS.equals(attrName)) {
|
||||||
|
overwrite = !StrUtils.parseBoolean(attrVal);
|
||||||
|
+ } else if ( COMMIT_WITHIN.equals(attrName) ) {
|
||||||
|
+ addCmd.commitWithin = Integer.parseInt( attrVal );
|
||||||
|
} else if ( OVERWRITE_PENDING.equals(attrName) ) {
|
||||||
|
overwritePending = StrUtils.parseBoolean(attrVal);
|
||||||
|
} else if ( OVERWRITE_COMMITTED.equals(attrName) ) {
|
||||||
|
Index: client/java/solrj/test/org/apache/solr/client/solrj/SolrExampleTests.java
|
||||||
|
===================================================================
|
||||||
|
--- client/java/solrj/test/org/apache/solr/client/solrj/SolrExampleTests.java (revision 701732)
|
||||||
|
+++ client/java/solrj/test/org/apache/solr/client/solrj/SolrExampleTests.java (working copy)
|
||||||
|
@@ -29,6 +29,7 @@
|
||||||
|
import org.apache.solr.client.solrj.request.DirectXmlRequest;
|
||||||
|
import org.apache.solr.client.solrj.request.LukeRequest;
|
||||||
|
import org.apache.solr.client.solrj.request.SolrPing;
|
||||||
|
+import org.apache.solr.client.solrj.request.UpdateRequest;
|
||||||
|
import org.apache.solr.client.solrj.response.LukeResponse;
|
||||||
|
import org.apache.solr.client.solrj.response.QueryResponse;
|
||||||
|
import org.apache.solr.client.solrj.response.FacetField;
|
||||||
|
@@ -149,8 +150,8 @@
|
||||||
|
Assert.assertEquals(2, response.getResults().getNumFound() );
|
||||||
|
Assert.assertFalse(query.getFilterQueries() == query2.getFilterQueries());
|
||||||
|
}
|
||||||
|
-
|
||||||
|
|
||||||
|
+
|
||||||
|
/**
|
||||||
|
* query the example
|
||||||
|
*/
|
||||||
|
@@ -195,8 +196,40 @@
|
||||||
|
rsp = server.query( query );
|
||||||
|
Assert.assertEquals( 2, rsp.getResults().getNumFound() );
|
||||||
|
System.out.println( rsp.getResults() );
|
||||||
|
+
|
||||||
|
}
|
||||||
|
|
||||||
|
+ /**
|
||||||
|
+ * query the example
|
||||||
|
+ */
|
||||||
|
+ public void testCommitWithin() throws Exception
|
||||||
|
+ {
|
||||||
|
+ // make sure it is empty...
|
||||||
|
+ SolrServer server = getSolrServer();
|
||||||
|
+ QueryResponse rsp = server.query( new SolrQuery( "*:*") );
|
||||||
|
+ Assert.assertEquals( 0, rsp.getResults().getNumFound() );
|
||||||
|
+
|
||||||
|
+ // Now try a timed commit...
|
||||||
|
+ SolrInputDocument doc3 = new SolrInputDocument();
|
||||||
|
+ doc3.addField( "id", "id3", 1.0f );
|
||||||
|
+ doc3.addField( "name", "doc3", 1.0f );
|
||||||
|
+ doc3.addField( "price", 10 );
|
||||||
|
+ UpdateRequest up = new UpdateRequest();
|
||||||
|
+ up.add( doc3 );
|
||||||
|
+ up.setCommitWithin( 5 );
|
||||||
|
+ up.process( server );
|
||||||
|
+
|
||||||
|
+ rsp = server.query( new SolrQuery( "*:*") );
|
||||||
|
+ Assert.assertEquals( 0, rsp.getResults().getNumFound() );
|
||||||
|
+
|
||||||
|
+ Thread.sleep( 500 ); // wait 1/2 seconds...
|
||||||
|
+
|
||||||
|
+ // now check that it comes out...
|
||||||
|
+ rsp = server.query( new SolrQuery( "id:id3") );
|
||||||
|
+ Assert.assertEquals( 1, rsp.getResults().getNumFound() );
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+
|
||||||
|
protected void assertNumFound( String query, int num ) throws SolrServerException, IOException
|
||||||
|
{
|
||||||
|
QueryResponse rsp = getSolrServer().query( new SolrQuery( query ) );
|
||||||
|
Index: client/java/solrj/src/org/apache/solr/client/solrj/request/UpdateRequest.java
|
||||||
|
===================================================================
|
||||||
|
--- client/java/solrj/src/org/apache/solr/client/solrj/request/UpdateRequest.java (revision 701732)
|
||||||
|
+++ client/java/solrj/src/org/apache/solr/client/solrj/request/UpdateRequest.java (working copy)
|
||||||
|
@@ -51,6 +51,7 @@
|
||||||
|
private List<String> deleteQuery = null;
|
||||||
|
|
||||||
|
private ModifiableSolrParams params;
|
||||||
|
+ private int commitWithin = -1;
|
||||||
|
|
||||||
|
public UpdateRequest()
|
||||||
|
{
|
||||||
|
@@ -163,7 +164,12 @@
|
||||||
|
public String getXML() throws IOException {
|
||||||
|
StringWriter writer = new StringWriter();
|
||||||
|
if( documents != null && documents.size() > 0 ) {
|
||||||
|
- writer.write("<add>");
|
||||||
|
+ if( commitWithin > 0 ) {
|
||||||
|
+ writer.write("<add commitWithin=\""+commitWithin+"\">");
|
||||||
|
+ }
|
||||||
|
+ else {
|
||||||
|
+ writer.write("<add>");
|
||||||
|
+ }
|
||||||
|
for (SolrInputDocument doc : documents ) {
|
||||||
|
if( doc != null ) {
|
||||||
|
ClientUtils.writeXML( doc, writer );
|
||||||
|
@@ -245,4 +251,12 @@
|
||||||
|
public void setWaitSearcher(boolean waitSearcher) {
|
||||||
|
setParam( UpdateParams.WAIT_SEARCHER, waitSearcher+"" );
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ public int getCommitWithin() {
|
||||||
|
+ return commitWithin;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ public void setCommitWithin(int commitWithin) {
|
||||||
|
+ this.commitWithin = commitWithin;
|
||||||
|
+ }
|
||||||
|
}
|
|
@ -0,0 +1,221 @@
|
||||||
|
Index: src/java/org/apache/solr/update/AddUpdateCommand.java
|
||||||
|
===================================================================
|
||||||
|
--- src/java/org/apache/solr/update/AddUpdateCommand.java (revision 701732)
|
||||||
|
+++ src/java/org/apache/solr/update/AddUpdateCommand.java (working copy)
|
||||||
|
@@ -42,6 +42,10 @@
|
||||||
|
public boolean allowDups;
|
||||||
|
public boolean overwritePending;
|
||||||
|
public boolean overwriteCommitted;
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+ public int commitWithin = -1;
|
||||||
|
+
|
||||||
|
|
||||||
|
/** Reset state to reuse this object with a different document in the same request */
|
||||||
|
public void clear() {
|
||||||
|
Index: src/java/org/apache/solr/update/DirectUpdateHandler2.java
|
||||||
|
===================================================================
|
||||||
|
--- src/java/org/apache/solr/update/DirectUpdateHandler2.java (revision 701732)
|
||||||
|
+++ src/java/org/apache/solr/update/DirectUpdateHandler2.java (working copy)
|
||||||
|
@@ -198,7 +198,7 @@
|
||||||
|
synchronized (this) {
|
||||||
|
// adding document -- prep writer
|
||||||
|
openWriter();
|
||||||
|
- tracker.addedDocument();
|
||||||
|
+ tracker.addedDocument( cmd.commitWithin );
|
||||||
|
} // end synchronized block
|
||||||
|
|
||||||
|
// this is the only unsynchronized code in the iwAccess block, which
|
||||||
|
@@ -424,7 +424,7 @@
|
||||||
|
SolrCore.log.info("AutoCommit: " + this);
|
||||||
|
}
|
||||||
|
|
||||||
|
- /** schedeule individual commits */
|
||||||
|
+ /** schedule individual commits */
|
||||||
|
public synchronized void scheduleCommitWithin(long commitMaxTime)
|
||||||
|
{
|
||||||
|
// Check if there is a commit already scheduled for longer then this time
|
||||||
|
@@ -443,30 +443,22 @@
|
||||||
|
|
||||||
|
/** Indicate that documents have been added
|
||||||
|
*/
|
||||||
|
- public void addedDocument() {
|
||||||
|
+ public void addedDocument( int commitWithin ) {
|
||||||
|
docsSinceCommit++;
|
||||||
|
lastAddedTime = System.currentTimeMillis();
|
||||||
|
// maxDocs-triggered autoCommit
|
||||||
|
if( docsUpperBound > 0 && (docsSinceCommit > docsUpperBound) ) {
|
||||||
|
- if (pending != null &&
|
||||||
|
- pending.getDelay(TimeUnit.MILLISECONDS) > DOC_COMMIT_DELAY_MS) {
|
||||||
|
- // another commit is pending, but too far away (probably due to
|
||||||
|
- // maxTime)
|
||||||
|
- pending.cancel(false);
|
||||||
|
- pending = null;
|
||||||
|
- }
|
||||||
|
- if (pending == null) {
|
||||||
|
- // 1/4 second seems fast enough for anyone using maxDocs
|
||||||
|
- pending = scheduler.schedule(this, DOC_COMMIT_DELAY_MS,
|
||||||
|
- TimeUnit.MILLISECONDS);
|
||||||
|
- }
|
||||||
|
+ scheduleCommitWithin( DOC_COMMIT_DELAY_MS );
|
||||||
|
}
|
||||||
|
+
|
||||||
|
// maxTime-triggered autoCommit
|
||||||
|
- if( pending == null && timeUpperBound > 0 ) {
|
||||||
|
- // Don't start a new event if one is already waiting
|
||||||
|
- pending = scheduler.schedule( this, timeUpperBound, TimeUnit.MILLISECONDS );
|
||||||
|
+ long ctime = timeUpperBound;
|
||||||
|
+ if( commitWithin > 0 && (ctime < 0 || commitWithin < ctime) ) {
|
||||||
|
+ ctime = commitWithin;
|
||||||
|
}
|
||||||
|
-
|
||||||
|
+ if( ctime > 0 ) {
|
||||||
|
+ scheduleCommitWithin( ctime );
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Inform tracker that a commit has occurred, cancel any pending commits */
|
||||||
|
Index: src/java/org/apache/solr/handler/XmlUpdateRequestHandler.java
|
||||||
|
===================================================================
|
||||||
|
--- src/java/org/apache/solr/handler/XmlUpdateRequestHandler.java (revision 701732)
|
||||||
|
+++ src/java/org/apache/solr/handler/XmlUpdateRequestHandler.java (working copy)
|
||||||
|
@@ -19,6 +19,7 @@
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.Reader;
|
||||||
|
+import java.io.StringReader;
|
||||||
|
import java.io.Writer;
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.HashMap;
|
||||||
|
@@ -72,6 +73,7 @@
|
||||||
|
public static final String WAIT_FLUSH = "waitFlush";
|
||||||
|
|
||||||
|
public static final String OVERWRITE = "overwrite";
|
||||||
|
+ public static final String COMMIT_WITHIN = "commitWithin";
|
||||||
|
public static final String OVERWRITE_COMMITTED = "overwriteCommitted"; // @Deprecated
|
||||||
|
public static final String OVERWRITE_PENDING = "overwritePending"; // @Deprecated
|
||||||
|
public static final String ALLOW_DUPS = "allowDups";
|
||||||
|
@@ -120,6 +122,12 @@
|
||||||
|
for( ContentStream stream : req.getContentStreams() ) {
|
||||||
|
Reader reader = stream.getReader();
|
||||||
|
try {
|
||||||
|
+ if( log.isTraceEnabled() ) {
|
||||||
|
+ String body = IOUtils.toString( reader );
|
||||||
|
+ log.trace( "body", body );
|
||||||
|
+ reader = new StringReader( body );
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
XMLStreamReader parser = inputFactory.createXMLStreamReader(reader);
|
||||||
|
this.processUpdate( processor, parser );
|
||||||
|
}
|
||||||
|
@@ -169,6 +177,8 @@
|
||||||
|
overwrite = StrUtils.parseBoolean(attrVal);
|
||||||
|
} else if (ALLOW_DUPS.equals(attrName)) {
|
||||||
|
overwrite = !StrUtils.parseBoolean(attrVal);
|
||||||
|
+ } else if ( COMMIT_WITHIN.equals(attrName) ) {
|
||||||
|
+ addCmd.commitWithin = Integer.parseInt( attrVal );
|
||||||
|
} else if ( OVERWRITE_PENDING.equals(attrName) ) {
|
||||||
|
overwritePending = StrUtils.parseBoolean(attrVal);
|
||||||
|
} else if ( OVERWRITE_COMMITTED.equals(attrName) ) {
|
||||||
|
Index: client/java/solrj/test/org/apache/solr/client/solrj/SolrExampleTests.java
|
||||||
|
===================================================================
|
||||||
|
--- client/java/solrj/test/org/apache/solr/client/solrj/SolrExampleTests.java (revision 701732)
|
||||||
|
+++ client/java/solrj/test/org/apache/solr/client/solrj/SolrExampleTests.java (working copy)
|
||||||
|
@@ -29,6 +29,7 @@
|
||||||
|
import org.apache.solr.client.solrj.request.DirectXmlRequest;
|
||||||
|
import org.apache.solr.client.solrj.request.LukeRequest;
|
||||||
|
import org.apache.solr.client.solrj.request.SolrPing;
|
||||||
|
+import org.apache.solr.client.solrj.request.UpdateRequest;
|
||||||
|
import org.apache.solr.client.solrj.response.LukeResponse;
|
||||||
|
import org.apache.solr.client.solrj.response.QueryResponse;
|
||||||
|
import org.apache.solr.client.solrj.response.FacetField;
|
||||||
|
@@ -149,8 +150,8 @@
|
||||||
|
Assert.assertEquals(2, response.getResults().getNumFound() );
|
||||||
|
Assert.assertFalse(query.getFilterQueries() == query2.getFilterQueries());
|
||||||
|
}
|
||||||
|
-
|
||||||
|
|
||||||
|
+
|
||||||
|
/**
|
||||||
|
* query the example
|
||||||
|
*/
|
||||||
|
@@ -195,8 +196,40 @@
|
||||||
|
rsp = server.query( query );
|
||||||
|
Assert.assertEquals( 2, rsp.getResults().getNumFound() );
|
||||||
|
System.out.println( rsp.getResults() );
|
||||||
|
+
|
||||||
|
}
|
||||||
|
|
||||||
|
+ /**
|
||||||
|
+ * query the example
|
||||||
|
+ */
|
||||||
|
+ public void testCommitWithin() throws Exception
|
||||||
|
+ {
|
||||||
|
+ // make sure it is empty...
|
||||||
|
+ SolrServer server = getSolrServer();
|
||||||
|
+ QueryResponse rsp = server.query( new SolrQuery( "*:*") );
|
||||||
|
+ Assert.assertEquals( 0, rsp.getResults().getNumFound() );
|
||||||
|
+
|
||||||
|
+ // Now try a timed commit...
|
||||||
|
+ SolrInputDocument doc3 = new SolrInputDocument();
|
||||||
|
+ doc3.addField( "id", "id3", 1.0f );
|
||||||
|
+ doc3.addField( "name", "doc3", 1.0f );
|
||||||
|
+ doc3.addField( "price", 10 );
|
||||||
|
+ UpdateRequest up = new UpdateRequest();
|
||||||
|
+ up.add( doc3 );
|
||||||
|
+ up.setCommitWithin( 5 );
|
||||||
|
+ up.process( server );
|
||||||
|
+
|
||||||
|
+ rsp = server.query( new SolrQuery( "*:*") );
|
||||||
|
+ Assert.assertEquals( 0, rsp.getResults().getNumFound() );
|
||||||
|
+
|
||||||
|
+ Thread.sleep( 500 ); // wait 1/2 seconds...
|
||||||
|
+
|
||||||
|
+ // now check that it comes out...
|
||||||
|
+ rsp = server.query( new SolrQuery( "id:id3") );
|
||||||
|
+ Assert.assertEquals( 1, rsp.getResults().getNumFound() );
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+
|
||||||
|
protected void assertNumFound( String query, int num ) throws SolrServerException, IOException
|
||||||
|
{
|
||||||
|
QueryResponse rsp = getSolrServer().query( new SolrQuery( query ) );
|
||||||
|
Index: client/java/solrj/src/org/apache/solr/client/solrj/request/UpdateRequest.java
|
||||||
|
===================================================================
|
||||||
|
--- client/java/solrj/src/org/apache/solr/client/solrj/request/UpdateRequest.java (revision 701732)
|
||||||
|
+++ client/java/solrj/src/org/apache/solr/client/solrj/request/UpdateRequest.java (working copy)
|
||||||
|
@@ -51,6 +51,7 @@
|
||||||
|
private List<String> deleteQuery = null;
|
||||||
|
|
||||||
|
private ModifiableSolrParams params;
|
||||||
|
+ private int commitWithin = -1;
|
||||||
|
|
||||||
|
public UpdateRequest()
|
||||||
|
{
|
||||||
|
@@ -163,7 +164,12 @@
|
||||||
|
public String getXML() throws IOException {
|
||||||
|
StringWriter writer = new StringWriter();
|
||||||
|
if( documents != null && documents.size() > 0 ) {
|
||||||
|
- writer.write("<add>");
|
||||||
|
+ if( commitWithin > 0 ) {
|
||||||
|
+ writer.write("<add commitWithin=\""+commitWithin+"\">");
|
||||||
|
+ }
|
||||||
|
+ else {
|
||||||
|
+ writer.write("<add>");
|
||||||
|
+ }
|
||||||
|
for (SolrInputDocument doc : documents ) {
|
||||||
|
if( doc != null ) {
|
||||||
|
ClientUtils.writeXML( doc, writer );
|
||||||
|
@@ -245,4 +251,12 @@
|
||||||
|
public void setWaitSearcher(boolean waitSearcher) {
|
||||||
|
setParam( UpdateParams.WAIT_SEARCHER, waitSearcher+"" );
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ public int getCommitWithin() {
|
||||||
|
+ return commitWithin;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ public void setCommitWithin(int commitWithin) {
|
||||||
|
+ this.commitWithin = commitWithin;
|
||||||
|
+ }
|
||||||
|
}
|
|
@ -51,6 +51,7 @@ public class UpdateRequest extends SolrRequest
|
||||||
private List<String> deleteQuery = null;
|
private List<String> deleteQuery = null;
|
||||||
|
|
||||||
private ModifiableSolrParams params;
|
private ModifiableSolrParams params;
|
||||||
|
private int commitWithin = -1;
|
||||||
|
|
||||||
public UpdateRequest()
|
public UpdateRequest()
|
||||||
{
|
{
|
||||||
|
@ -163,7 +164,12 @@ public class UpdateRequest extends SolrRequest
|
||||||
public String getXML() throws IOException {
|
public String getXML() throws IOException {
|
||||||
StringWriter writer = new StringWriter();
|
StringWriter writer = new StringWriter();
|
||||||
if( documents != null && documents.size() > 0 ) {
|
if( documents != null && documents.size() > 0 ) {
|
||||||
|
if( commitWithin > 0 ) {
|
||||||
|
writer.write("<add commitWithin=\""+commitWithin+"\">");
|
||||||
|
}
|
||||||
|
else {
|
||||||
writer.write("<add>");
|
writer.write("<add>");
|
||||||
|
}
|
||||||
for (SolrInputDocument doc : documents ) {
|
for (SolrInputDocument doc : documents ) {
|
||||||
if( doc != null ) {
|
if( doc != null ) {
|
||||||
ClientUtils.writeXML( doc, writer );
|
ClientUtils.writeXML( doc, writer );
|
||||||
|
@ -245,4 +251,12 @@ public class UpdateRequest extends SolrRequest
|
||||||
public void setWaitSearcher(boolean waitSearcher) {
|
public void setWaitSearcher(boolean waitSearcher) {
|
||||||
setParam( UpdateParams.WAIT_SEARCHER, waitSearcher+"" );
|
setParam( UpdateParams.WAIT_SEARCHER, waitSearcher+"" );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getCommitWithin() {
|
||||||
|
return commitWithin;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCommitWithin(int commitWithin) {
|
||||||
|
this.commitWithin = commitWithin;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,6 +29,7 @@ import junit.framework.Assert;
|
||||||
import org.apache.solr.client.solrj.request.DirectXmlRequest;
|
import org.apache.solr.client.solrj.request.DirectXmlRequest;
|
||||||
import org.apache.solr.client.solrj.request.LukeRequest;
|
import org.apache.solr.client.solrj.request.LukeRequest;
|
||||||
import org.apache.solr.client.solrj.request.SolrPing;
|
import org.apache.solr.client.solrj.request.SolrPing;
|
||||||
|
import org.apache.solr.client.solrj.request.UpdateRequest;
|
||||||
import org.apache.solr.client.solrj.response.LukeResponse;
|
import org.apache.solr.client.solrj.response.LukeResponse;
|
||||||
import org.apache.solr.client.solrj.response.QueryResponse;
|
import org.apache.solr.client.solrj.response.QueryResponse;
|
||||||
import org.apache.solr.client.solrj.response.FacetField;
|
import org.apache.solr.client.solrj.response.FacetField;
|
||||||
|
@ -195,8 +196,42 @@ abstract public class SolrExampleTests extends SolrExampleTestBase
|
||||||
rsp = server.query( query );
|
rsp = server.query( query );
|
||||||
Assert.assertEquals( 2, rsp.getResults().getNumFound() );
|
Assert.assertEquals( 2, rsp.getResults().getNumFound() );
|
||||||
System.out.println( rsp.getResults() );
|
System.out.println( rsp.getResults() );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* query the example
|
||||||
|
*/
|
||||||
|
public void testCommitWithin() throws Exception
|
||||||
|
{
|
||||||
|
// make sure it is empty...
|
||||||
|
SolrServer server = getSolrServer();
|
||||||
|
server.deleteByQuery( "*:*" );// delete everything!
|
||||||
|
server.commit();
|
||||||
|
QueryResponse rsp = server.query( new SolrQuery( "*:*") );
|
||||||
|
Assert.assertEquals( 0, rsp.getResults().getNumFound() );
|
||||||
|
|
||||||
|
// Now try a timed commit...
|
||||||
|
SolrInputDocument doc3 = new SolrInputDocument();
|
||||||
|
doc3.addField( "id", "id3", 1.0f );
|
||||||
|
doc3.addField( "name", "doc3", 1.0f );
|
||||||
|
doc3.addField( "price", 10 );
|
||||||
|
UpdateRequest up = new UpdateRequest();
|
||||||
|
up.add( doc3 );
|
||||||
|
up.setCommitWithin( 10 );
|
||||||
|
up.process( server );
|
||||||
|
|
||||||
|
rsp = server.query( new SolrQuery( "*:*") );
|
||||||
|
Assert.assertEquals( 0, rsp.getResults().getNumFound() );
|
||||||
|
|
||||||
|
Thread.sleep( 500 ); // wait 1/2 seconds...
|
||||||
|
|
||||||
|
// now check that it comes out...
|
||||||
|
rsp = server.query( new SolrQuery( "id:id3") );
|
||||||
|
Assert.assertEquals( 1, rsp.getResults().getNumFound() );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
protected void assertNumFound( String query, int num ) throws SolrServerException, IOException
|
protected void assertNumFound( String query, int num ) throws SolrServerException, IOException
|
||||||
{
|
{
|
||||||
QueryResponse rsp = getSolrServer().query( new SolrQuery( query ) );
|
QueryResponse rsp = getSolrServer().query( new SolrQuery( query ) );
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
#set($iterator=$rawResponse.getResultIterator())
|
||||||
|
#set($request=$rawResponse.request)
|
||||||
|
#set($core=$request.core)
|
||||||
|
#set($schema=$core.schema)
|
||||||
|
|
||||||
|
<html>
|
||||||
|
<title>Default VelocityResponseWriter Response</title>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
A default response using only the raw solr response. The "rawResponse" object is a helper that provides access to the
|
||||||
|
SolrQueryRequest, SolrQueryResponse, as well as convenience methods like getResultIterator() and getRequestParam()
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
If you want to use an instance of SolrResponse of solrj inside a template, use eg. vl.response=QueryResponse.
|
||||||
|
This object then is avalaible as "response" in the context.
|
||||||
|
</p>
|
||||||
|
<hr/>
|
||||||
|
|
||||||
|
#foreach($document in $iterator)
|
||||||
|
#foreach($field in $document.getFieldNames())
|
||||||
|
<p>$field: $document.getFieldValue($field)</p>
|
||||||
|
#end
|
||||||
|
<hr/>
|
||||||
|
#end
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
header = $rawResponse.$response.responseHeader
|
||||||
|
|
||||||
|
values = $rawResponse.$response.values
|
||||||
|
|
||||||
|
request = $request
|
||||||
|
|
||||||
|
core = $core
|
||||||
|
|
||||||
|
schema = $schema
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,2 @@
|
||||||
|
AnyObjectId[75580be255065727b20b41c2d338b14792bb35cd] was removed in git history.
|
||||||
|
Apache SVN contains full history.
|
|
@ -0,0 +1,2 @@
|
||||||
|
AnyObjectId[ce0ca22c8d29a9be736d775fe50bfdc6ce770186] was removed in git history.
|
||||||
|
Apache SVN contains full history.
|
|
@ -0,0 +1,2 @@
|
||||||
|
AnyObjectId[1454e77a8a5b60bb95b316d5e991783f940c4d56] was removed in git history.
|
||||||
|
Apache SVN contains full history.
|
|
@ -19,6 +19,7 @@ package org.apache.solr.handler;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.Reader;
|
import java.io.Reader;
|
||||||
|
import java.io.StringReader;
|
||||||
import java.io.Writer;
|
import java.io.Writer;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
@ -72,6 +73,7 @@ public class XmlUpdateRequestHandler extends RequestHandlerBase
|
||||||
public static final String WAIT_FLUSH = "waitFlush";
|
public static final String WAIT_FLUSH = "waitFlush";
|
||||||
|
|
||||||
public static final String OVERWRITE = "overwrite";
|
public static final String OVERWRITE = "overwrite";
|
||||||
|
public static final String COMMIT_WITHIN = "commitWithin";
|
||||||
public static final String OVERWRITE_COMMITTED = "overwriteCommitted"; // @Deprecated
|
public static final String OVERWRITE_COMMITTED = "overwriteCommitted"; // @Deprecated
|
||||||
public static final String OVERWRITE_PENDING = "overwritePending"; // @Deprecated
|
public static final String OVERWRITE_PENDING = "overwritePending"; // @Deprecated
|
||||||
public static final String ALLOW_DUPS = "allowDups";
|
public static final String ALLOW_DUPS = "allowDups";
|
||||||
|
@ -120,6 +122,12 @@ public class XmlUpdateRequestHandler extends RequestHandlerBase
|
||||||
for( ContentStream stream : req.getContentStreams() ) {
|
for( ContentStream stream : req.getContentStreams() ) {
|
||||||
Reader reader = stream.getReader();
|
Reader reader = stream.getReader();
|
||||||
try {
|
try {
|
||||||
|
if( log.isTraceEnabled() ) {
|
||||||
|
String body = IOUtils.toString( reader );
|
||||||
|
log.trace( "body", body );
|
||||||
|
reader = new StringReader( body );
|
||||||
|
}
|
||||||
|
|
||||||
XMLStreamReader parser = inputFactory.createXMLStreamReader(reader);
|
XMLStreamReader parser = inputFactory.createXMLStreamReader(reader);
|
||||||
this.processUpdate( processor, parser );
|
this.processUpdate( processor, parser );
|
||||||
}
|
}
|
||||||
|
@ -169,6 +177,8 @@ public class XmlUpdateRequestHandler extends RequestHandlerBase
|
||||||
overwrite = StrUtils.parseBoolean(attrVal);
|
overwrite = StrUtils.parseBoolean(attrVal);
|
||||||
} else if (ALLOW_DUPS.equals(attrName)) {
|
} else if (ALLOW_DUPS.equals(attrName)) {
|
||||||
overwrite = !StrUtils.parseBoolean(attrVal);
|
overwrite = !StrUtils.parseBoolean(attrVal);
|
||||||
|
} else if ( COMMIT_WITHIN.equals(attrName) ) {
|
||||||
|
addCmd.commitWithin = Integer.parseInt( attrVal );
|
||||||
} else if ( OVERWRITE_PENDING.equals(attrName) ) {
|
} else if ( OVERWRITE_PENDING.equals(attrName) ) {
|
||||||
overwritePending = StrUtils.parseBoolean(attrVal);
|
overwritePending = StrUtils.parseBoolean(attrVal);
|
||||||
} else if ( OVERWRITE_COMMITTED.equals(attrName) ) {
|
} else if ( OVERWRITE_COMMITTED.equals(attrName) ) {
|
||||||
|
|
|
@ -0,0 +1,222 @@
|
||||||
|
/**
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
* (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.solr.request;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.StringWriter;
|
||||||
|
import java.io.Writer;
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
import org.apache.lucene.document.Document;
|
||||||
|
import org.apache.lucene.index.CorruptIndexException;
|
||||||
|
import org.apache.lucene.search.Searcher;
|
||||||
|
import org.apache.solr.client.solrj.SolrResponse;
|
||||||
|
import org.apache.solr.client.solrj.embedded.EmbeddedSolrServer;
|
||||||
|
import org.apache.solr.common.SolrDocument;
|
||||||
|
import org.apache.solr.common.util.NamedList;
|
||||||
|
import org.apache.solr.search.DocSlice;
|
||||||
|
import org.apache.solr.update.DocumentBuilder;
|
||||||
|
import org.apache.velocity.Template;
|
||||||
|
import org.apache.velocity.VelocityContext;
|
||||||
|
import org.apache.velocity.app.VelocityEngine;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p> A response writer that uses velocity template for response creation.
|
||||||
|
* Possible request parameters: </p>
|
||||||
|
* <ul>
|
||||||
|
* <li>
|
||||||
|
* <b>vl.template:</b>
|
||||||
|
* The name of the template file without .vm suffix. </li>
|
||||||
|
* <li>
|
||||||
|
* <b>vl.json:</b>
|
||||||
|
* A name of a Javascript method. If set, the response is wrapped into this object.
|
||||||
|
* useful for JSON requests.
|
||||||
|
* </li>
|
||||||
|
* <li>
|
||||||
|
* <b>vl.content:</b>
|
||||||
|
* Specify a custom content type for the response. Default is "text/html" for standard requests,
|
||||||
|
* and "text/x-json" for JSON requests.
|
||||||
|
* </li>
|
||||||
|
* <li>
|
||||||
|
* <b>vl.response:</b>
|
||||||
|
* To provide an implementation of {@link SolrResponse} inside the template,
|
||||||
|
* specify the class name of the implementation. For convenience, it looks
|
||||||
|
* inside the package "org.apache.solr.client.solrj.response", so you only
|
||||||
|
* have to choose eg. <i>QueryResponse, LikeResponse, MultiCoreResponse</i>.
|
||||||
|
* Custom classes may be accessed using the full qualified class name,
|
||||||
|
* eg. <i>my.custom.package.CustomResponse</i>
|
||||||
|
* </li>
|
||||||
|
* </ul>
|
||||||
|
*/
|
||||||
|
public class VelocityResponseWriter implements QueryResponseWriter {
|
||||||
|
|
||||||
|
private static final String PARAMETER_TEMPLATE="vl.template";
|
||||||
|
private static final String PARAMETER_JSON="vl.json";
|
||||||
|
private static final String PARAMETER_RESPONSE="vl.response";
|
||||||
|
private static final String PARAMETER_CONTENT_TYPE="vl.content";
|
||||||
|
|
||||||
|
public void write(Writer writer, SolrQueryRequest request,
|
||||||
|
SolrQueryResponse response) throws IOException {
|
||||||
|
|
||||||
|
// init velocity and get template
|
||||||
|
VelocityEngine engine = new VelocityEngine();
|
||||||
|
File baseDir = new File(request.getCore().getResourceLoader().getConfigDir(), "velocity");
|
||||||
|
engine.setProperty(VelocityEngine.FILE_RESOURCE_LOADER_PATH, baseDir.getAbsolutePath());
|
||||||
|
engine.setProperty(VelocityEngine.RESOURCE_LOADER, "file");
|
||||||
|
Template template;
|
||||||
|
try {
|
||||||
|
template = engine.getTemplate(request.getParams().get(PARAMETER_TEMPLATE, "default") + ".vm");
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new IOException(e.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
// put raw response into context
|
||||||
|
VelocityContext context = new VelocityContext();
|
||||||
|
context.put("rawResponse", new RawResponseHelper(request, response));
|
||||||
|
|
||||||
|
// convert response if a class is specified
|
||||||
|
if (request.getParams().get(PARAMETER_RESPONSE) != null) {
|
||||||
|
String className = request.getParams().get(PARAMETER_RESPONSE);
|
||||||
|
|
||||||
|
// create SolrResponse using reflection
|
||||||
|
SolrResponse solrResponse;
|
||||||
|
Object object;
|
||||||
|
try {
|
||||||
|
object = request.getCore().getResourceLoader().newInstance(className, "client.solrj.response.");
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
throw new IOException("Unable to resolve response class \"" + className + "\": " + e.getMessage());
|
||||||
|
}
|
||||||
|
if (!(object instanceof SolrResponse)) {
|
||||||
|
throw new IOException("Class \"" + className + "\" doesn't implement SolrResponse!");
|
||||||
|
}
|
||||||
|
solrResponse = (SolrResponse) object;
|
||||||
|
|
||||||
|
// inject the request into the response
|
||||||
|
solrResponse.setResponse(new EmbeddedSolrServer(request.getCore()).getParsedResponse(request, response));
|
||||||
|
|
||||||
|
// put it into the context
|
||||||
|
context.put("response", solrResponse);
|
||||||
|
}
|
||||||
|
|
||||||
|
// create output, optionally wrap it into a json object
|
||||||
|
if (isWrappedResponse(request)) {
|
||||||
|
StringWriter stringWriter = new StringWriter();
|
||||||
|
template.merge(context, stringWriter);
|
||||||
|
writer.write(request.getParams().get(PARAMETER_JSON) + "(");
|
||||||
|
writer.write(getJSONWrap(stringWriter.toString()));
|
||||||
|
writer.write(')');
|
||||||
|
} else {
|
||||||
|
template.merge(context, writer);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getContentType(SolrQueryRequest request,
|
||||||
|
SolrQueryResponse response) {
|
||||||
|
if (request.getParams().get(PARAMETER_CONTENT_TYPE) != null) {
|
||||||
|
return request.getParams().get(PARAMETER_CONTENT_TYPE);
|
||||||
|
}
|
||||||
|
if (isWrappedResponse(request)) {
|
||||||
|
return JSONResponseWriter.CONTENT_TYPE_JSON_UTF8;
|
||||||
|
}
|
||||||
|
return "text/html";
|
||||||
|
}
|
||||||
|
|
||||||
|
public void init(NamedList args) {
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isWrappedResponse(SolrQueryRequest request) {
|
||||||
|
return request.getParams().get(PARAMETER_JSON) != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getJSONWrap(String xmlResult) {
|
||||||
|
// escape the double quotes and backslashes
|
||||||
|
String replace1 = xmlResult.replaceAll("\\\\", "\\\\\\\\");
|
||||||
|
replace1 = replace1.replaceAll("\\n", "\\\\n");
|
||||||
|
replace1 = replace1.replaceAll("\\r", "\\\\r");
|
||||||
|
String replaced = replace1.replaceAll("\"", "\\\\\"");
|
||||||
|
// wrap it in a JSON object
|
||||||
|
return "{\"result\":\"" + replaced + "\"}";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A helper class that provides convenient methods for the raw solr response.
|
||||||
|
*/
|
||||||
|
public class RawResponseHelper {
|
||||||
|
|
||||||
|
private Searcher searcher;
|
||||||
|
private SolrQueryResponse response;
|
||||||
|
private SolrQueryRequest request;
|
||||||
|
|
||||||
|
public RawResponseHelper(SolrQueryRequest request,
|
||||||
|
SolrQueryResponse response) {
|
||||||
|
this.searcher = request.getSearcher();
|
||||||
|
this.response = response;
|
||||||
|
this.request = request;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Iterator<SolrDocument> getResultIterator() {
|
||||||
|
final Iterator<Integer> iterator = ((DocSlice) response.getValues()
|
||||||
|
.get("response")).iterator();
|
||||||
|
return new Iterator<SolrDocument>() {
|
||||||
|
|
||||||
|
public boolean hasNext() {
|
||||||
|
return iterator.hasNext();
|
||||||
|
}
|
||||||
|
|
||||||
|
public SolrDocument next() {
|
||||||
|
Document document = null;
|
||||||
|
SolrDocument solrDocument = new SolrDocument();
|
||||||
|
try {
|
||||||
|
document = searcher.doc(iterator.next());
|
||||||
|
new DocumentBuilder(request.getSchema()).loadStoredFields(solrDocument, document);
|
||||||
|
} catch (CorruptIndexException e) {
|
||||||
|
throw new RuntimeException("Error converting lucene document into solr document!");
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException("Error converting lucene document into solr document!");
|
||||||
|
}
|
||||||
|
|
||||||
|
return solrDocument;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void remove() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRequestParameter(String param) {
|
||||||
|
return request.getParams().get(param);
|
||||||
|
}
|
||||||
|
|
||||||
|
public SolrQueryRequest getRequest() {
|
||||||
|
return request;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SolrQueryResponse getResponse() {
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -43,6 +43,10 @@ public class AddUpdateCommand extends UpdateCommand {
|
||||||
public boolean overwritePending;
|
public boolean overwritePending;
|
||||||
public boolean overwriteCommitted;
|
public boolean overwriteCommitted;
|
||||||
|
|
||||||
|
|
||||||
|
public int commitWithin = -1;
|
||||||
|
|
||||||
|
|
||||||
/** Reset state to reuse this object with a different document in the same request */
|
/** Reset state to reuse this object with a different document in the same request */
|
||||||
public void clear() {
|
public void clear() {
|
||||||
doc = null;
|
doc = null;
|
||||||
|
|
|
@ -198,7 +198,7 @@ public class DirectUpdateHandler2 extends UpdateHandler {
|
||||||
synchronized (this) {
|
synchronized (this) {
|
||||||
// adding document -- prep writer
|
// adding document -- prep writer
|
||||||
openWriter();
|
openWriter();
|
||||||
tracker.addedDocument();
|
tracker.addedDocument( cmd.commitWithin );
|
||||||
} // end synchronized block
|
} // end synchronized block
|
||||||
|
|
||||||
// this is the only unsynchronized code in the iwAccess block, which
|
// this is the only unsynchronized code in the iwAccess block, which
|
||||||
|
@ -424,7 +424,7 @@ public class DirectUpdateHandler2 extends UpdateHandler {
|
||||||
SolrCore.log.info("AutoCommit: " + this);
|
SolrCore.log.info("AutoCommit: " + this);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** schedeule individual commits */
|
/** schedule individual commits */
|
||||||
public synchronized void scheduleCommitWithin(long commitMaxTime)
|
public synchronized void scheduleCommitWithin(long commitMaxTime)
|
||||||
{
|
{
|
||||||
// Check if there is a commit already scheduled for longer then this time
|
// Check if there is a commit already scheduled for longer then this time
|
||||||
|
@ -443,30 +443,19 @@ public class DirectUpdateHandler2 extends UpdateHandler {
|
||||||
|
|
||||||
/** Indicate that documents have been added
|
/** Indicate that documents have been added
|
||||||
*/
|
*/
|
||||||
public void addedDocument() {
|
public void addedDocument( int commitWithin ) {
|
||||||
docsSinceCommit++;
|
docsSinceCommit++;
|
||||||
lastAddedTime = System.currentTimeMillis();
|
lastAddedTime = System.currentTimeMillis();
|
||||||
// maxDocs-triggered autoCommit
|
// maxDocs-triggered autoCommit
|
||||||
if( docsUpperBound > 0 && (docsSinceCommit > docsUpperBound) ) {
|
if( docsUpperBound > 0 && (docsSinceCommit > docsUpperBound) ) {
|
||||||
if (pending != null &&
|
scheduleCommitWithin( DOC_COMMIT_DELAY_MS );
|
||||||
pending.getDelay(TimeUnit.MILLISECONDS) > DOC_COMMIT_DELAY_MS) {
|
|
||||||
// another commit is pending, but too far away (probably due to
|
|
||||||
// maxTime)
|
|
||||||
pending.cancel(false);
|
|
||||||
pending = null;
|
|
||||||
}
|
|
||||||
if (pending == null) {
|
|
||||||
// 1/4 second seems fast enough for anyone using maxDocs
|
|
||||||
pending = scheduler.schedule(this, DOC_COMMIT_DELAY_MS,
|
|
||||||
TimeUnit.MILLISECONDS);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// maxTime-triggered autoCommit
|
|
||||||
if( pending == null && timeUpperBound > 0 ) {
|
|
||||||
// Don't start a new event if one is already waiting
|
|
||||||
pending = scheduler.schedule( this, timeUpperBound, TimeUnit.MILLISECONDS );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// maxTime-triggered autoCommit
|
||||||
|
long ctime = (commitWithin>0) ? commitWithin : timeUpperBound;
|
||||||
|
if( ctime > 0 ) {
|
||||||
|
scheduleCommitWithin( ctime );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Inform tracker that a commit has occurred, cancel any pending commits */
|
/** Inform tracker that a commit has occurred, cancel any pending commits */
|
||||||
|
|
Loading…
Reference in New Issue