You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by bu...@apache.org on 2011/02/22 02:01:11 UTC
svn commit: r1073192 [28/32] - in /lucene/dev/branches/realtime_search: ./
dev-tools/eclipse/ dev-tools/idea/.idea/ dev-tools/idea/lucene/contrib/ant/
dev-tools/idea/lucene/contrib/demo/
dev-tools/idea/lucene/contrib/highlighter/ dev-tools/idea/lucene/...
Modified: lucene/dev/branches/realtime_search/solr/src/java/org/apache/solr/util/SimplePostTool.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/realtime_search/solr/src/java/org/apache/solr/util/SimplePostTool.java?rev=1073192&r1=1073191&r2=1073192&view=diff
==============================================================================
--- lucene/dev/branches/realtime_search/solr/src/java/org/apache/solr/util/SimplePostTool.java (original)
+++ lucene/dev/branches/realtime_search/solr/src/java/org/apache/solr/util/SimplePostTool.java Tue Feb 22 01:00:39 2011
@@ -22,14 +22,9 @@ import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
-import java.io.InputStreamReader;
+import java.io.ByteArrayInputStream;
import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.Reader;
-import java.io.StringReader;
-import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
-import java.io.Writer;
import java.util.Set;
import java.util.HashSet;
import java.net.HttpURLConnection;
@@ -44,12 +39,14 @@ import java.net.URL;
*/
public class SimplePostTool {
public static final String DEFAULT_POST_URL = "http://localhost:8983/solr/update";
- public static final String POST_ENCODING = "UTF-8";
- public static final String VERSION_OF_THIS_TOOL = "1.2";
+ public static final String VERSION_OF_THIS_TOOL = "1.3";
private static final String SOLR_OK_RESPONSE_EXCERPT = "<int name=\"status\">0</int>";
private static final String DEFAULT_COMMIT = "yes";
-
+ private static final String DEFAULT_OUT = "no";
+
+ private static final String DEFAULT_DATA_TYPE = "application/xml";
+
private static final String DATA_MODE_FILES = "files";
private static final String DATA_MODE_ARGS = "args";
private static final String DATA_MODE_STDIN = "stdin";
@@ -61,37 +58,35 @@ public class SimplePostTool {
DATA_MODES.add(DATA_MODE_ARGS);
DATA_MODES.add(DATA_MODE_STDIN);
}
-
+
protected URL solrUrl;
- private class PostException extends RuntimeException {
- PostException(String reason,Throwable cause) {
- super(reason + " (POST URL=" + solrUrl + ")",cause);
- }
- }
-
public static void main(String[] args) {
info("version " + VERSION_OF_THIS_TOOL);
if (0 < args.length && "-help".equals(args[0])) {
System.out.println
- ("This is a simple command line tool for POSTing raw XML to a Solr\n"+
- "port. XML data can be read from files specified as commandline\n"+
- "args; as raw commandline arg strings; or via STDIN.\n"+
+ ("This is a simple command line tool for POSTing raw data to a Solr\n"+
+ "port. Data can be read from files specified as commandline args,\n"+
+ "as raw commandline arg strings, or via STDIN.\n"+
"Examples:\n"+
" java -Ddata=files -jar post.jar *.xml\n"+
" java -Ddata=args -jar post.jar '<delete><id>42</id></delete>'\n"+
" java -Ddata=stdin -jar post.jar < hd.xml\n"+
"Other options controlled by System Properties include the Solr\n"+
- "URL to POST to, and whether a commit should be executed. These\n"+
- "are the defaults for all System Properties...\n"+
+ "URL to POST to, the Content-Type of the data, whether a commit\n"+
+ "should be executed, and whether the response should be written\n"+
+ "to STDOUT. These are the defaults for all System Properties...\n"+
" -Ddata=" + DEFAULT_DATA_MODE + "\n"+
+ " -Dtype=" + DEFAULT_DATA_TYPE + "\n"+
" -Durl=" + DEFAULT_POST_URL + "\n"+
- " -Dcommit=" + DEFAULT_COMMIT + "\n");
+ " -Dcommit=" + DEFAULT_COMMIT + "\n"+
+ " -Dout=" + DEFAULT_OUT + "\n");
return;
}
-
+ OutputStream out = null;
+
URL u = null;
try {
u = new URL(System.getProperty("url", DEFAULT_POST_URL));
@@ -105,53 +100,49 @@ public class SimplePostTool {
fatal("System Property 'data' is not valid for this tool: " + mode);
}
+ final String doOut = System.getProperty("out", DEFAULT_OUT);
+ if ("yes".equals(System.getProperty("out", DEFAULT_OUT))) {
+ out = System.out;
+ }
+
try {
if (DATA_MODE_FILES.equals(mode)) {
if (0 < args.length) {
info("POSTing files to " + u + "..");
- final int posted = t.postFiles(args,0);
+ final int posted = t.postFiles(args, 0, out);
}
} else if (DATA_MODE_ARGS.equals(mode)) {
if (0 < args.length) {
info("POSTing args to " + u + "..");
for (String a : args) {
- final StringWriter sw = new StringWriter();
- t.postData(new StringReader(a), sw);
- warnIfNotExpectedResponse(sw.toString(),SOLR_OK_RESPONSE_EXCERPT);
+ t.postData(t.stringToStream(a), null, out);
}
}
} else if (DATA_MODE_STDIN.equals(mode)) {
info("POSTing stdin to " + u + "..");
- final StringWriter sw = new StringWriter();
- t.postData(new InputStreamReader(System.in,POST_ENCODING), sw);
- warnIfNotExpectedResponse(sw.toString(),SOLR_OK_RESPONSE_EXCERPT);
+ t.postData(System.in, null, out);
}
if ("yes".equals(System.getProperty("commit",DEFAULT_COMMIT))) {
info("COMMITting Solr index changes..");
- final StringWriter sw = new StringWriter();
- t.commit(sw);
- warnIfNotExpectedResponse(sw.toString(),SOLR_OK_RESPONSE_EXCERPT);
+ t.commit(out);
}
- } catch(IOException ioe) {
- fatal("Unexpected IOException " + ioe);
+ } catch(RuntimeException e) {
+ fatal("RuntimeException " + e);
}
}
/** Post all filenames provided in args, return the number of files posted*/
- int postFiles(String [] args,int startIndexInArgs) throws IOException {
+ int postFiles(String [] args,int startIndexInArgs, OutputStream out) {
int filesPosted = 0;
for (int j = startIndexInArgs; j < args.length; j++) {
File srcFile = new File(args[j]);
- final StringWriter sw = new StringWriter();
-
if (srcFile.canRead()) {
info("POSTing file " + srcFile.getName());
- postFile(srcFile, sw);
+ postFile(srcFile, out);
filesPosted++;
- warnIfNotExpectedResponse(sw.toString(),SOLR_OK_RESPONSE_EXCERPT);
} else {
warn("Cannot read input file: " + srcFile);
}
@@ -159,15 +150,6 @@ public class SimplePostTool {
return filesPosted;
}
- /** Check what Solr replied to a POST, and complain if it's not what we expected.
- * TODO: parse the response and check it XMLwise, here we just check it as an unparsed String
- */
- static void warnIfNotExpectedResponse(String actual,String expected) {
- if(actual.indexOf(expected) < 0) {
- warn("Unexpected response from Solr: '" + actual + "' does not contain '" + expected + "'");
- }
- }
-
static void warn(String msg) {
System.err.println("SimplePostTool: WARNING: " + msg);
}
@@ -187,15 +169,13 @@ public class SimplePostTool {
*/
public SimplePostTool(URL solrUrl) {
this.solrUrl = solrUrl;
- warn("Make sure your XML documents are encoded in " + POST_ENCODING
- + ", other encodings are not currently supported");
}
/**
* Does a simple commit operation
*/
- public void commit(Writer output) throws IOException {
- postData(new StringReader("<commit/>"), output);
+ public void commit(OutputStream output) {
+ postData(stringToStream("<commit/>"), null, output);
}
/**
@@ -203,85 +183,103 @@ public class SimplePostTool {
* writes to response to output.
* @throws UnsupportedEncodingException
*/
- public void postFile(File file, Writer output)
- throws FileNotFoundException, UnsupportedEncodingException {
+ public void postFile(File file, OutputStream output) {
- // FIXME; use a real XML parser to read files, so as to support various encodings
- // (and we can only post well-formed XML anyway)
- Reader reader = new InputStreamReader(new FileInputStream(file),POST_ENCODING);
+ InputStream is = null;
try {
- postData(reader, output);
+ is = new FileInputStream(file);
+ postData(is, (int)file.length(), output);
+ } catch (IOException e) {
+ fatal("Can't open/read file: " + file);
} finally {
try {
- if(reader!=null) reader.close();
+ if(is!=null) is.close();
} catch (IOException e) {
- throw new PostException("IOException while closing file", e);
+ fatal("IOException while closing file: "+ e);
}
}
}
/**
- * Reads data from the data reader and posts it to solr,
+ * Reads data from the data stream and posts it to solr,
* writes to the response to output
*/
- public void postData(Reader data, Writer output) {
+ public void postData(InputStream data, Integer length, OutputStream output) {
+
+ final String type = System.getProperty("type", DEFAULT_DATA_TYPE);
HttpURLConnection urlc = null;
try {
- urlc = (HttpURLConnection) solrUrl.openConnection();
try {
- urlc.setRequestMethod("POST");
- } catch (ProtocolException e) {
- throw new PostException("Shouldn't happen: HttpURLConnection doesn't support POST??", e);
+ urlc = (HttpURLConnection) solrUrl.openConnection();
+ try {
+ urlc.setRequestMethod("POST");
+ } catch (ProtocolException e) {
+ fatal("Shouldn't happen: HttpURLConnection doesn't support POST??"+e);
+
+ }
+ urlc.setDoOutput(true);
+ urlc.setDoInput(true);
+ urlc.setUseCaches(false);
+ urlc.setAllowUserInteraction(false);
+ urlc.setRequestProperty("Content-type", type);
+
+ if (null != length) urlc.setFixedLengthStreamingMode(length);
+
+ } catch (IOException e) {
+ fatal("Connection error (is Solr running at " + solrUrl + " ?): " + e);
}
- urlc.setDoOutput(true);
- urlc.setDoInput(true);
- urlc.setUseCaches(false);
- urlc.setAllowUserInteraction(false);
- urlc.setRequestProperty("Content-type", "text/xml; charset=" + POST_ENCODING);
-
- OutputStream out = urlc.getOutputStream();
+ OutputStream out = null;
try {
- Writer writer = new OutputStreamWriter(out, POST_ENCODING);
- pipe(data, writer);
- writer.close();
+ out = urlc.getOutputStream();
+ pipe(data, out);
} catch (IOException e) {
- throw new PostException("IOException while posting data", e);
+ fatal("IOException while posting data: " + e);
} finally {
- if(out!=null) out.close();
+ try { if(out!=null) out.close(); } catch (IOException x) { /*NOOP*/ }
}
- InputStream in = urlc.getInputStream();
+ InputStream in = null;
try {
- Reader reader = new InputStreamReader(in);
- pipe(reader, output);
- reader.close();
+ if (HttpURLConnection.HTTP_OK != urlc.getResponseCode()) {
+ fatal("Solr returned an error #" + urlc.getResponseCode() +
+ " " + urlc.getResponseMessage());
+ }
+
+ in = urlc.getInputStream();
+ pipe(in, output);
} catch (IOException e) {
- throw new PostException("IOException while reading response", e);
+ fatal("IOException while reading response: " + e);
} finally {
- if(in!=null) in.close();
+ try { if(in!=null) in.close(); } catch (IOException x) { /*NOOP*/ }
}
- } catch (IOException e) {
- try {
- fatal("Solr returned an error: " + urlc.getResponseMessage());
- } catch (IOException f) { }
- fatal("Connection error (is Solr running at " + solrUrl + " ?): " + e);
} finally {
if(urlc!=null) urlc.disconnect();
}
}
+ private static InputStream stringToStream(String s) {
+ InputStream is = null;
+ try {
+ is = new ByteArrayInputStream(s.getBytes("UTF-8"));
+ } catch (UnsupportedEncodingException e) {
+ fatal("Shouldn't happen: UTF-8 not supported?!?!?!");
+ }
+ return is;
+ }
+
/**
- * Pipes everything from the reader to the writer via a buffer
+ * Pipes everything from the source to the dest. If dest is null,
+ * then everything is read fro msource and thrown away.
*/
- private static void pipe(Reader reader, Writer writer) throws IOException {
- char[] buf = new char[1024];
+ private static void pipe(InputStream source, OutputStream dest) throws IOException {
+ byte[] buf = new byte[1024];
int read = 0;
- while ( (read = reader.read(buf) ) >= 0) {
- writer.write(buf, 0, read);
+ while ( (read = source.read(buf) ) >= 0) {
+ if (null != dest) dest.write(buf, 0, read);
}
- writer.flush();
+ if (null != dest) dest.flush();
}
}
Modified: lucene/dev/branches/realtime_search/solr/src/java/org/apache/solr/util/SolrPluginUtils.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/realtime_search/solr/src/java/org/apache/solr/util/SolrPluginUtils.java?rev=1073192&r1=1073191&r2=1073192&view=diff
==============================================================================
--- lucene/dev/branches/realtime_search/solr/src/java/org/apache/solr/util/SolrPluginUtils.java (original)
+++ lucene/dev/branches/realtime_search/solr/src/java/org/apache/solr/util/SolrPluginUtils.java Tue Feb 22 01:00:39 2011
@@ -703,6 +703,7 @@ public class SolrPluginUtils {
* DisjunctionMaxQuery. (so yes: aliases which point at other
* aliases should work)
*/
+ @Override
protected Query getFieldQuery(String field, String queryText, boolean quoted)
throws ParseException {
Modified: lucene/dev/branches/realtime_search/solr/src/solrj/org/apache/solr/client/solrj/impl/BinaryRequestWriter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/realtime_search/solr/src/solrj/org/apache/solr/client/solrj/impl/BinaryRequestWriter.java?rev=1073192&r1=1073191&r2=1073192&view=diff
==============================================================================
--- lucene/dev/branches/realtime_search/solr/src/solrj/org/apache/solr/client/solrj/impl/BinaryRequestWriter.java (original)
+++ lucene/dev/branches/realtime_search/solr/src/solrj/org/apache/solr/client/solrj/impl/BinaryRequestWriter.java Tue Feb 22 01:00:39 2011
@@ -36,6 +36,7 @@ import java.util.List;
*/
public class BinaryRequestWriter extends RequestWriter {
+ @Override
public Collection<ContentStream> getContentStreams(SolrRequest req) throws IOException {
if (req instanceof UpdateRequest) {
UpdateRequest updateRequest = (UpdateRequest) req;
@@ -55,10 +56,12 @@ public class BinaryRequestWriter extends
}
+ @Override
public String getUpdateContentType() {
return "application/octet-stream";
}
+ @Override
public ContentStream getContentStream(final UpdateRequest request) throws IOException {
final BAOS baos = new BAOS();
new JavaBinUpdateRequestCodec().marshal(request, baos);
@@ -91,6 +94,7 @@ public class BinaryRequestWriter extends
}
+ @Override
public void write(SolrRequest request, OutputStream os) throws IOException {
if (request instanceof UpdateRequest) {
UpdateRequest updateRequest = (UpdateRequest) request;
@@ -106,6 +110,7 @@ public class BinaryRequestWriter extends
}
}
+ @Override
public String getPath(SolrRequest req) {
if (req instanceof UpdateRequest) {
return "/update/javabin";
Modified: lucene/dev/branches/realtime_search/solr/src/solrj/org/apache/solr/client/solrj/impl/BinaryResponseParser.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/realtime_search/solr/src/solrj/org/apache/solr/client/solrj/impl/BinaryResponseParser.java?rev=1073192&r1=1073191&r2=1073192&view=diff
==============================================================================
--- lucene/dev/branches/realtime_search/solr/src/solrj/org/apache/solr/client/solrj/impl/BinaryResponseParser.java (original)
+++ lucene/dev/branches/realtime_search/solr/src/solrj/org/apache/solr/client/solrj/impl/BinaryResponseParser.java Tue Feb 22 01:00:39 2011
@@ -30,10 +30,12 @@ import java.io.Reader;
* @since solr 1.3
*/
public class BinaryResponseParser extends ResponseParser {
+ @Override
public String getWriterType() {
return "javabin";
}
+ @Override
public NamedList<Object> processResponse(InputStream body, String encoding) {
try {
return (NamedList<Object>) new JavaBinCodec().unmarshal(body);
@@ -44,10 +46,12 @@ public class BinaryResponseParser extend
}
+ @Override
public String getVersion() {
return "2";
}
+ @Override
public NamedList<Object> processResponse(Reader reader) {
throw new RuntimeException("Cannot handle character stream");
}
Modified: lucene/dev/branches/realtime_search/solr/src/solrj/org/apache/solr/client/solrj/impl/CloudSolrServer.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/realtime_search/solr/src/solrj/org/apache/solr/client/solrj/impl/CloudSolrServer.java?rev=1073192&r1=1073191&r2=1073192&view=diff
==============================================================================
--- lucene/dev/branches/realtime_search/solr/src/solrj/org/apache/solr/client/solrj/impl/CloudSolrServer.java (original)
+++ lucene/dev/branches/realtime_search/solr/src/solrj/org/apache/solr/client/solrj/impl/CloudSolrServer.java Tue Feb 22 01:00:39 2011
@@ -1,5 +1,22 @@
package org.apache.solr.client.solrj.impl;
+/**
+ * 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.
+ */
+
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.ArrayList;
Modified: lucene/dev/branches/realtime_search/solr/src/solrj/org/apache/solr/client/solrj/impl/CommonsHttpSolrServer.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/realtime_search/solr/src/solrj/org/apache/solr/client/solrj/impl/CommonsHttpSolrServer.java?rev=1073192&r1=1073191&r2=1073192&view=diff
==============================================================================
--- lucene/dev/branches/realtime_search/solr/src/solrj/org/apache/solr/client/solrj/impl/CommonsHttpSolrServer.java (original)
+++ lucene/dev/branches/realtime_search/solr/src/solrj/org/apache/solr/client/solrj/impl/CommonsHttpSolrServer.java Tue Feb 22 01:00:39 2011
@@ -20,7 +20,6 @@ package org.apache.solr.client.solrj.imp
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
-import java.io.Reader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.*;
@@ -62,6 +61,8 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
+ * The {@link CommonsHttpSolrServer} uses the Apache Commons HTTP Client to connect to solr.
+ * <pre class="prettyprint" >SolrServer server = new CommonsHttpSolrServer( url );</pre>
*
* @version $Id$
* @since solr 1.3
@@ -335,11 +336,11 @@ public class CommonsHttpSolrServer exten
@Override
protected void sendData(OutputStream out)
throws IOException {
- Reader reader = c.getReader();
+ InputStream in = c.getStream();
try {
- IOUtils.copy(reader, out);
+ IOUtils.copy(in, out);
} finally {
- reader.close();
+ in.close();
}
}
});
Modified: lucene/dev/branches/realtime_search/solr/src/solrj/org/apache/solr/client/solrj/impl/LBHttpSolrServer.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/realtime_search/solr/src/solrj/org/apache/solr/client/solrj/impl/LBHttpSolrServer.java?rev=1073192&r1=1073191&r2=1073192&view=diff
==============================================================================
--- lucene/dev/branches/realtime_search/solr/src/solrj/org/apache/solr/client/solrj/impl/LBHttpSolrServer.java (original)
+++ lucene/dev/branches/realtime_search/solr/src/solrj/org/apache/solr/client/solrj/impl/LBHttpSolrServer.java Tue Feb 22 01:00:39 2011
@@ -105,6 +105,7 @@ public class LBHttpSolrServer extends So
this.solrServer = solrServer;
}
+ @Override
public String toString() {
return solrServer.getBaseURL();
}
@@ -149,7 +150,7 @@ public class LBHttpSolrServer extends So
return numDeadServersToTry;
}
- /** @return The number of dead servers to try if there are no live servers left.
+ /** @param numDeadServersToTry The number of dead servers to try if there are no live servers left.
* Defaults to the number of servers in this request. */
public void setNumDeadServersToTry(int numDeadServersToTry) {
this.numDeadServersToTry = numDeadServersToTry;
@@ -376,6 +377,7 @@ public class LBHttpSolrServer extends So
* @throws SolrServerException
* @throws IOException
*/
+ @Override
public NamedList<Object> request(final SolrRequest request)
throws SolrServerException, IOException {
Exception ex = null;
@@ -535,6 +537,7 @@ public class LBHttpSolrServer extends So
return httpClient;
}
+ @Override
protected void finalize() throws Throwable {
try {
if(this.aliveCheckExecutor!=null)
Modified: lucene/dev/branches/realtime_search/solr/src/solrj/org/apache/solr/client/solrj/impl/StreamingBinaryResponseParser.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/realtime_search/solr/src/solrj/org/apache/solr/client/solrj/impl/StreamingBinaryResponseParser.java?rev=1073192&r1=1073191&r2=1073192&view=diff
==============================================================================
--- lucene/dev/branches/realtime_search/solr/src/solrj/org/apache/solr/client/solrj/impl/StreamingBinaryResponseParser.java (original)
+++ lucene/dev/branches/realtime_search/solr/src/solrj/org/apache/solr/client/solrj/impl/StreamingBinaryResponseParser.java Tue Feb 22 01:00:39 2011
@@ -48,12 +48,14 @@ public class StreamingBinaryResponsePars
try {
JavaBinCodec codec = new JavaBinCodec() {
+ @Override
public SolrDocument readSolrDocument(FastInputStream dis) throws IOException {
SolrDocument doc = super.readSolrDocument(dis);
callback.streamSolrDocument( doc );
return null;
}
+ @Override
public SolrDocumentList readSolrDocumentList(FastInputStream dis) throws IOException {
SolrDocumentList solrDocs = new SolrDocumentList();
List list = (List) readVal(dis);
Modified: lucene/dev/branches/realtime_search/solr/src/solrj/org/apache/solr/client/solrj/impl/StreamingUpdateSolrServer.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/realtime_search/solr/src/solrj/org/apache/solr/client/solrj/impl/StreamingUpdateSolrServer.java?rev=1073192&r1=1073191&r2=1073192&view=diff
==============================================================================
--- lucene/dev/branches/realtime_search/solr/src/solrj/org/apache/solr/client/solrj/impl/StreamingUpdateSolrServer.java (original)
+++ lucene/dev/branches/realtime_search/solr/src/solrj/org/apache/solr/client/solrj/impl/StreamingUpdateSolrServer.java Tue Feb 22 01:00:39 2011
@@ -173,12 +173,22 @@ public class StreamingUpdateSolrServer e
}
catch (Throwable e) {
handleError( e );
- }
+ }
finally {
- // remove it from the list of running things...
+
+ // remove it from the list of running things unless we are the last runner and the queue is full...
+ // in which case, the next queue.put() would block and there would be no runners to handle it.
+ // This case has been further handled by using offer instead of put, and using a retry loop
+ // to avoid blocking forever (see request()).
synchronized (runners) {
- runners.remove( this );
+ if (runners.size() == 1 && queue.remainingCapacity() == 0) {
+ // keep this runner alive
+ scheduler.execute(this);
+ } else {
+ runners.remove( this );
+ }
}
+
log.info( "finished: {}" , this );
runnerLock.unlock();
}
@@ -208,26 +218,48 @@ public class StreamingUpdateSolrServer e
return super.request( request );
}
}
-
+
try {
CountDownLatch tmpLock = lock;
if( tmpLock != null ) {
tmpLock.await();
}
- queue.put( req );
-
+ boolean success = queue.offer(req);
+
+ for(;;) {
synchronized( runners ) {
- if( runners.isEmpty()
- || (queue.remainingCapacity() < queue.size()
- && runners.size() < threadCount) )
- {
- Runner r = new Runner();
- scheduler.execute( r );
- runners.add( r );
+ if( runners.isEmpty()
+ || (queue.remainingCapacity() < queue.size() // queue is half full and we can add more runners
+ && runners.size() < threadCount) )
+ {
+ // We need more runners, so start a new one.
+ Runner r = new Runner();
+ runners.add( r );
+ scheduler.execute( r );
+ } else {
+ // break out of the retry loop if we added the element to the queue successfully, *and*
+ // while we are still holding the runners lock to prevent race conditions.
+ // race conditions.
+ if (success) break;
+ }
}
+
+ // Retry to add to the queue w/o the runners lock held (else we risk temporary deadlock)
+ // This retry could also fail because
+ // 1) existing runners were not able to take off any new elements in the queue
+ // 2) the queue was filled back up since our last try
+ // If we succeed, the queue may have been completely emptied, and all runners stopped.
+ // In all cases, we should loop back to the top to see if we need to start more runners.
+ //
+ if (!success) {
+ success = queue.offer(req, 100, TimeUnit.MILLISECONDS);
+ }
+
}
- }
+
+
+ }
catch (InterruptedException e) {
log.error( "interrupted", e );
throw new IOException( e.getLocalizedMessage() );
Modified: lucene/dev/branches/realtime_search/solr/src/solrj/org/apache/solr/client/solrj/request/JavaBinUpdateRequestCodec.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/realtime_search/solr/src/solrj/org/apache/solr/client/solrj/request/JavaBinUpdateRequestCodec.java?rev=1073192&r1=1073191&r2=1073192&view=diff
==============================================================================
--- lucene/dev/branches/realtime_search/solr/src/solrj/org/apache/solr/client/solrj/request/JavaBinUpdateRequestCodec.java (original)
+++ lucene/dev/branches/realtime_search/solr/src/solrj/org/apache/solr/client/solrj/request/JavaBinUpdateRequestCodec.java Tue Feb 22 01:00:39 2011
@@ -67,6 +67,7 @@ public class JavaBinUpdateRequestCodec {
nl.add("delByQ", updateRequest.getDeleteQuery());
nl.add("docs", docIter);
new JavaBinCodec(){
+ @Override
public void writeMap(Map val) throws IOException {
if (val instanceof SolrInputDocument) {
writeVal(solrInputDocumentToList((SolrInputDocument) val));
@@ -101,6 +102,7 @@ public class JavaBinUpdateRequestCodec {
// is ever refactored, this will not work.
private boolean seenOuterMostDocIterator = false;
+ @Override
public NamedList readNamedList(FastInputStream dis) throws IOException {
int sz = readSize(dis);
NamedList nl = new NamedList();
@@ -115,6 +117,7 @@ public class JavaBinUpdateRequestCodec {
return nl;
}
+ @Override
public List readIterator(FastInputStream fis) throws IOException {
// default behavior for reading any regular Iterator in the stream
Modified: lucene/dev/branches/realtime_search/solr/src/solrj/org/apache/solr/client/solrj/response/FieldStatsInfo.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/realtime_search/solr/src/solrj/org/apache/solr/client/solrj/response/FieldStatsInfo.java?rev=1073192&r1=1073191&r2=1073192&view=diff
==============================================================================
--- lucene/dev/branches/realtime_search/solr/src/solrj/org/apache/solr/client/solrj/response/FieldStatsInfo.java (original)
+++ lucene/dev/branches/realtime_search/solr/src/solrj/org/apache/solr/client/solrj/response/FieldStatsInfo.java Tue Feb 22 01:00:39 2011
@@ -94,6 +94,7 @@ public class FieldStatsInfo implements S
}
}
+ @Override
public String toString()
{
StringBuilder sb = new StringBuilder();
Modified: lucene/dev/branches/realtime_search/solr/src/solrj/org/apache/solr/client/solrj/response/QueryResponse.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/realtime_search/solr/src/solrj/org/apache/solr/client/solrj/response/QueryResponse.java?rev=1073192&r1=1073191&r2=1073192&view=diff
==============================================================================
--- lucene/dev/branches/realtime_search/solr/src/solrj/org/apache/solr/client/solrj/response/QueryResponse.java (original)
+++ lucene/dev/branches/realtime_search/solr/src/solrj/org/apache/solr/client/solrj/response/QueryResponse.java Tue Feb 22 01:00:39 2011
@@ -105,7 +105,8 @@ public class QueryResponse extends SolrR
}
else if( "facet_counts".equals( n ) ) {
_facetInfo = (NamedList<Object>) res.getVal( i );
- extractFacetInfo( _facetInfo );
+ // extractFacetInfo inspects _results, so defer calling it
+ // in case it hasn't been populated yet.
}
else if( "debug".equals( n ) ) {
_debugInfo = (NamedList<Object>) res.getVal( i );
@@ -128,6 +129,7 @@ public class QueryResponse extends SolrR
extractTermsInfo( _termsInfo );
}
}
+ if(_facetInfo != null) extractFacetInfo( _facetInfo );
}
private void extractSpellCheckInfo(NamedList<NamedList<Object>> spellInfo) {
Modified: lucene/dev/branches/realtime_search/solr/src/solrj/org/apache/solr/client/solrj/response/SpellCheckResponse.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/realtime_search/solr/src/solrj/org/apache/solr/client/solrj/response/SpellCheckResponse.java?rev=1073192&r1=1073191&r2=1073192&view=diff
==============================================================================
--- lucene/dev/branches/realtime_search/solr/src/solrj/org/apache/solr/client/solrj/response/SpellCheckResponse.java (original)
+++ lucene/dev/branches/realtime_search/solr/src/solrj/org/apache/solr/client/solrj/response/SpellCheckResponse.java Tue Feb 22 01:00:39 2011
@@ -115,7 +115,7 @@ public class SpellCheckResponse {
* <p>
* Return the first collated query string. For convenience and backwards-compatibility. Use getCollatedResults() for full data.
* </p>
- * @return
+ * @return first collated query string
*/
public String getCollatedResult() {
return collations==null || collations.size()==0 ? null : collations.get(0).collationQueryString;
@@ -126,7 +126,7 @@ public class SpellCheckResponse {
* Return all collations.
* Will include # of hits and misspelling-to-correction details if "spellcheck.collateExtendedResults was true.
* </p>
- * @return
+ * @return all collations
*/
public List<Collation> getCollatedResults() {
return collations;
Modified: lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/schema.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/schema.xml?rev=1073192&r1=1073191&r2=1073192&view=diff
==============================================================================
--- lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/schema.xml (original)
+++ lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/schema.xml Tue Feb 22 01:00:39 2011
@@ -385,7 +385,7 @@
<fieldType name="x" class="solr.PointType" dimension="1" subFieldType="double"/>
<fieldType name="tenD" class="solr.PointType" dimension="10" subFieldType="double"/>
<!-- Use the sub field suffix -->
- <fieldType name="xyd" class="solr.PointType" dimension="2" subFieldSuffix="*_d"/>
+ <fieldType name="xyd" class="solr.PointType" dimension="2" subFieldSuffix="_d1"/>
<fieldtype name="geohash" class="solr.GeoHashField"/>
@@ -402,8 +402,8 @@
<field name="text" type="text" indexed="true" stored="false"/>
<field name="subject" type="text" indexed="true" stored="true"/>
<field name="title" type="nametext" indexed="true" stored="true"/>
- <field name="weight" type="float" indexed="true" stored="true"/>
- <field name="bday" type="date" indexed="true" stored="true"/>
+ <field name="weight" type="float" indexed="true" stored="true" multiValued="false"/>
+ <field name="bday" type="date" indexed="true" stored="true" multiValued="false"/>
<field name="title_stemmed" type="text" indexed="true" stored="false"/>
<field name="title_lettertok" type="lettertok" indexed="true" stored="false"/>
@@ -480,9 +480,10 @@
<field name="numberpartfail" type="failtype1" indexed="true" stored="true"/>
- <field name="nullfirst" type="string" indexed="true" stored="true" sortMissingFirst="true"/>
+ <field name="nullfirst" type="string" indexed="true" stored="true" sortMissingFirst="true" multiValued="false"/>
<field name="subword" type="subword" indexed="true" stored="true"/>
+ <field name="subword_offsets" type="subword" indexed="true" stored="true" termOffsets="true"/>
<field name="numericsubword" type="numericsubword" indexed="true" stored="true"/>
<field name="protectedsubword" type="protectedsubword" indexed="true" stored="true"/>
@@ -507,27 +508,41 @@
both match, the first appearing in the schema will be used.
-->
<dynamicField name="*_i" type="int" indexed="true" stored="true"/>
+ <dynamicField name="*_i1" type="int" indexed="true" stored="true" multiValued="false"/>
+
<dynamicField name="*_s" type="string" indexed="true" stored="true"/>
<dynamicField name="*_s1" type="string" indexed="true" stored="true" multiValued="false"/>
<dynamicField name="*_l" type="long" indexed="true" stored="true"/>
+ <dynamicField name="*_l1" type="long" indexed="true" stored="true" multiValued="false"/>
<dynamicField name="*_t" type="text" indexed="true" stored="true"/>
<dynamicField name="*_b" type="boolean" indexed="true" stored="true"/>
<dynamicField name="*_f" type="float" indexed="true" stored="true"/>
+ <dynamicField name="*_f1" type="float" indexed="true" stored="true" multiValued="false"/>
<dynamicField name="*_d" type="double" indexed="true" stored="true"/>
+ <dynamicField name="*_d1" type="double" indexed="true" stored="true" multiValued="false"/>
<dynamicField name="*_dt" type="date" indexed="true" stored="true"/>
+ <dynamicField name="*_dt1" type="date" indexed="true" stored="true" multiValued="false"/>
<dynamicField name="*_bcd" type="bcdstr" indexed="true" stored="true"/>
<!-- some trie-coded dynamic fields for faster range queries -->
<dynamicField name="*_ti" type="tint" indexed="true" stored="true"/>
+ <dynamicField name="*_ti1" type="tint" indexed="true" stored="true" multiValued="false"/>
<dynamicField name="*_tl" type="tlong" indexed="true" stored="true"/>
+ <dynamicField name="*_tl1" type="tlong" indexed="true" stored="true" multiValued="false"/>
<dynamicField name="*_tf" type="tfloat" indexed="true" stored="true"/>
+ <dynamicField name="*_tf1" type="tfloat" indexed="true" stored="true" multiValued="false"/>
<dynamicField name="*_td" type="tdouble" indexed="true" stored="true"/>
+ <dynamicField name="*_td1" type="tdouble" indexed="true" stored="true" multiValued="false"/>
+ <dynamicField name="*_tds" type="tdouble" indexed="true" stored="true" multiValued="false"/>
<dynamicField name="*_tdt" type="tdate" indexed="true" stored="true"/>
+ <dynamicField name="*_tdt1" type="tdate" indexed="true" stored="true" multiValued="false"/>
- <dynamicField name="*_si" type="sint" indexed="true" stored="true"/>
+ <dynamicField name="*_si" type="sint" indexed="true" stored="true" multiValued="false"/>
<dynamicField name="*_sl" type="slong" indexed="true" stored="true"/>
<dynamicField name="*_sf" type="sfloat" indexed="true" stored="true"/>
+ <dynamicField name="*_sf1" type="sfloat" indexed="true" stored="true" multiValued="false"/>
<dynamicField name="*_sd" type="sdouble" indexed="true" stored="true"/>
+ <dynamicField name="*_sd1" type="sdouble" indexed="true" stored="true" multiValued="false"/>
<dynamicField name="*_pi" type="pint" indexed="true" stored="true"/>
<dynamicField name="*_pf" type="pfloat" indexed="true" stored="true"/>
Modified: lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/schema12.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/schema12.xml?rev=1073192&r1=1073191&r2=1073192&view=diff
==============================================================================
--- lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/schema12.xml (original)
+++ lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/schema12.xml Tue Feb 22 01:00:39 2011
@@ -545,6 +545,8 @@
<dynamicField name="*_i" type="int" indexed="true" stored="true"/>
<dynamicField name="*_is" type="int" indexed="true" stored="true" multiValued="true"/>
+ <dynamicField name="*_s1" type="string" indexed="true" stored="true" multiValued="false"/>
+ <!-- :TODO: why are these identical?!?!?! -->
<dynamicField name="*_s" type="string" indexed="true" stored="true" multiValued="true"/>
<dynamicField name="*_ss" type="string" indexed="true" stored="true" multiValued="true"/>
<dynamicField name="*_l" type="long" indexed="true" stored="true"/>
Modified: lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/solrconfig-elevate.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/solrconfig-elevate.xml?rev=1073192&r1=1073191&r2=1073192&view=diff
==============================================================================
--- lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/solrconfig-elevate.xml (original)
+++ lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/solrconfig-elevate.xml Tue Feb 22 01:00:39 2011
@@ -29,7 +29,7 @@
<!-- Used to specify an alternate directory to hold all index data.
It defaults to "index" if not present, and should probably
not be changed if replication is in use. -->
- <dataDir>${solr.data.dir:./solr/data}</dataDir>
+ <dataDir>${solr.data.dir:}</dataDir>
<!-- The DirectoryFactory to use for indexes.
solr.StandardDirectoryFactory, the default, is filesystem based.
Modified: lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/solrconfig-enableplugin.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/solrconfig-enableplugin.xml?rev=1073192&r1=1073191&r2=1073192&view=diff
==============================================================================
--- lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/solrconfig-enableplugin.xml (original)
+++ lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/solrconfig-enableplugin.xml Tue Feb 22 01:00:39 2011
@@ -24,7 +24,7 @@
<config>
<luceneMatchVersion>${tests.luceneMatchVersion:LUCENE_CURRENT}</luceneMatchVersion>
- <dataDir>${solr.data.dir:./solr/data}</dataDir>
+ <dataDir>${solr.data.dir:}</dataDir>
<!-- The DirectoryFactory to use for indexes.
solr.StandardDirectoryFactory, the default, is filesystem based.
Modified: lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/solrconfig-master.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/solrconfig-master.xml?rev=1073192&r1=1073191&r2=1073192&view=diff
==============================================================================
--- lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/solrconfig-master.xml (original)
+++ lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/solrconfig-master.xml Tue Feb 22 01:00:39 2011
@@ -25,7 +25,7 @@
<config>
<luceneMatchVersion>${tests.luceneMatchVersion:LUCENE_CURRENT}</luceneMatchVersion>
- <dataDir>${solr.data.dir:./solr/data}</dataDir>
+ <dataDir>${solr.data.dir:}</dataDir>
<indexDefaults>
<useCompoundFile>false</useCompoundFile>
Modified: lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/solrconfig-master1.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/solrconfig-master1.xml?rev=1073192&r1=1073191&r2=1073192&view=diff
==============================================================================
--- lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/solrconfig-master1.xml (original)
+++ lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/solrconfig-master1.xml Tue Feb 22 01:00:39 2011
@@ -24,7 +24,7 @@
<config>
<luceneMatchVersion>${tests.luceneMatchVersion:LUCENE_CURRENT}</luceneMatchVersion>
- <dataDir>${solr.data.dir:./solr/data}</dataDir>
+ <dataDir>${solr.data.dir:}</dataDir>
<indexDefaults>
<useCompoundFile>false</useCompoundFile>
Modified: lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/solrconfig-master2.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/solrconfig-master2.xml?rev=1073192&r1=1073191&r2=1073192&view=diff
==============================================================================
--- lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/solrconfig-master2.xml (original)
+++ lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/solrconfig-master2.xml Tue Feb 22 01:00:39 2011
@@ -24,7 +24,7 @@
<config>
<luceneMatchVersion>${tests.luceneMatchVersion:LUCENE_CURRENT}</luceneMatchVersion>
- <dataDir>${solr.data.dir:./solr/data}</dataDir>
+ <dataDir>${solr.data.dir:}</dataDir>
<indexDefaults>
<useCompoundFile>false</useCompoundFile>
Added: lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/solrconfig-repeater.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/solrconfig-repeater.xml?rev=1073192&view=auto
==============================================================================
--- lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/solrconfig-repeater.xml (added)
+++ lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/solrconfig-repeater.xml Tue Feb 22 01:00:39 2011
@@ -0,0 +1,93 @@
+<?xml version="1.0" ?>
+
+<!--
+ 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.
+-->
+
+<!-- $Id: solrconfig-repeater.xml 1063339 2011-01-25 16:28:04Z hossman $
+ $Source$
+ $Name$
+ -->
+
+<config>
+ <luceneMatchVersion>${tests.luceneMatchVersion:LUCENE_CURRENT}</luceneMatchVersion>
+
+ <dataDir>${solr.data.dir:./solr/data}</dataDir>
+
+ <indexDefaults>
+ <useCompoundFile>false</useCompoundFile>
+ <mergeFactor>10</mergeFactor>
+ <ramBufferSizeMB>32</ramBufferSizeMB>
+ <maxMergeDocs>2147483647</maxMergeDocs>
+ <maxFieldLength>10000</maxFieldLength>
+ <writeLockTimeout>1000</writeLockTimeout>
+ <commitLockTimeout>10000</commitLockTimeout>
+
+ <writeLockTimeout>1000</writeLockTimeout>
+ <commitLockTimeout>10000</commitLockTimeout>
+
+ <lockType>single</lockType>
+ </indexDefaults>
+
+ <mainIndex>
+ <useCompoundFile>false</useCompoundFile>
+ <mergeFactor>10</mergeFactor>
+ <ramBufferSizeMB>32</ramBufferSizeMB>
+ <maxMergeDocs>2147483647</maxMergeDocs>
+ <maxFieldLength>10000</maxFieldLength>
+
+ <unlockOnStartup>true</unlockOnStartup>
+ </mainIndex>
+
+ <updateHandler class="solr.DirectUpdateHandler2">
+ </updateHandler>
+
+ <requestHandler name="standard" class="solr.StandardRequestHandler">
+ <bool name="httpCaching">true</bool>
+ </requestHandler>
+
+ <!-- test query parameter defaults -->
+ <requestHandler name="defaults" class="solr.StandardRequestHandler">
+
+ </requestHandler>
+
+ <!-- test query parameter defaults -->
+ <requestHandler name="lazy" class="solr.StandardRequestHandler" startup="lazy">
+ </requestHandler>
+
+ <requestHandler name="/update" class="solr.XmlUpdateRequestHandler"/>
+
+ <requestHandler name="/replication" class="solr.ReplicationHandler">
+ <lst name="master">
+ <str name="replicateAfter">commit</str>
+ <str name="confFiles">schema.xml</str>
+ </lst>
+ <lst name="slave">
+ <str name="masterUrl">http://localhost:TEST_PORT/solr/replication</str>
+ <str name="pollInterval">00:00:01</str>
+ </lst>
+ </requestHandler>
+
+
+ <!-- enable streaming for testing... -->
+ <requestDispatcher handleSelect="true">
+ <requestParsers enableRemoteStreaming="true" multipartUploadLimitInKB="2048"/>
+ <httpCaching lastModifiedFrom="openTime" etagSeed="Solr" never304="false">
+ <cacheControl>max-age=30, public</cacheControl>
+ </httpCaching>
+ </requestDispatcher>
+
+</config>
Modified: lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/solrconfig-slave.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/solrconfig-slave.xml?rev=1073192&r1=1073191&r2=1073192&view=diff
==============================================================================
--- lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/solrconfig-slave.xml (original)
+++ lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/solrconfig-slave.xml Tue Feb 22 01:00:39 2011
@@ -25,7 +25,7 @@
<config>
<luceneMatchVersion>${tests.luceneMatchVersion:LUCENE_CURRENT}</luceneMatchVersion>
- <dataDir>${solr.data.dir:./solr/data}</dataDir>
+ <dataDir>${solr.data.dir:}</dataDir>
<indexDefaults>
<useCompoundFile>false</useCompoundFile>
Modified: lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/solrconfig-slave1.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/solrconfig-slave1.xml?rev=1073192&r1=1073191&r2=1073192&view=diff
==============================================================================
--- lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/solrconfig-slave1.xml (original)
+++ lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/solrconfig-slave1.xml Tue Feb 22 01:00:39 2011
@@ -24,7 +24,7 @@
<config>
<luceneMatchVersion>${tests.luceneMatchVersion:LUCENE_CURRENT}</luceneMatchVersion>
- <dataDir>${solr.data.dir:./solr/data}</dataDir>
+ <dataDir>${solr.data.dir:}</dataDir>
<indexDefaults>
<useCompoundFile>false</useCompoundFile>
Modified: lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/solrconfig-solcoreproperties.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/solrconfig-solcoreproperties.xml?rev=1073192&r1=1073191&r2=1073192&view=diff
==============================================================================
--- lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/solrconfig-solcoreproperties.xml (original)
+++ lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/solrconfig-solcoreproperties.xml Tue Feb 22 01:00:39 2011
@@ -24,7 +24,7 @@
<config>
<luceneMatchVersion>${tests.luceneMatchVersion:LUCENE_CURRENT}</luceneMatchVersion>
- <dataDir>${solr.data.dir:./solr/data}</dataDir>
+ <dataDir>${solr.data.dir:}</dataDir>
<!-- The DirectoryFactory to use for indexes.
solr.StandardDirectoryFactory, the default, is filesystem based.
Modified: lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/solrconfig-spellcheckcomponent.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/solrconfig-spellcheckcomponent.xml?rev=1073192&r1=1073191&r2=1073192&view=diff
==============================================================================
--- lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/solrconfig-spellcheckcomponent.xml (original)
+++ lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/solrconfig-spellcheckcomponent.xml Tue Feb 22 01:00:39 2011
@@ -32,7 +32,7 @@ Config for testing spellcheck component
<!-- Used to specify an alternate directory to hold all index data.
It defaults to "index" if not present, and should probably
not be changed if replication is in use. -->
- <dataDir>${solr.data.dir:./solr/data}</dataDir>
+ <dataDir>${solr.data.dir:}</dataDir>
<!-- The DirectoryFactory to use for indexes.
solr.StandardDirectoryFactory, the default, is filesystem based.
Modified: lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/solrconfig.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/solrconfig.xml?rev=1073192&r1=1073191&r2=1073192&view=diff
==============================================================================
--- lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/solrconfig.xml (original)
+++ lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/solrconfig.xml Tue Feb 22 01:00:39 2011
@@ -43,7 +43,7 @@
<!-- Used to specify an alternate directory to hold all index data.
It defaults to "index" if not present, and should probably
not be changed if replication is in use. -->
- <dataDir>${solr.data.dir:./solr/data}</dataDir>
+ <dataDir>${solr.data.dir:}</dataDir>
<!-- The DirectoryFactory to use for indexes.
solr.StandardDirectoryFactory, the default, is filesystem based.
Modified: lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/solrconfig_perf.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/solrconfig_perf.xml?rev=1073192&r1=1073191&r2=1073192&view=diff
==============================================================================
--- lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/solrconfig_perf.xml (original)
+++ lucene/dev/branches/realtime_search/solr/src/test-files/solr/conf/solrconfig_perf.xml Tue Feb 22 01:00:39 2011
@@ -21,7 +21,7 @@
<!-- Used to specify an alternate directory to hold all index data
other than the default ./data under the Solr home.
If replication is in use, this should match the replication configuration. -->
- <dataDir>${solr.data.dir:./solr/data}</dataDir>
+ <dataDir>${solr.data.dir:}</dataDir>
<!-- The DirectoryFactory to use for indexes.
solr.StandardDirectoryFactory, the default, is filesystem based.
Modified: lucene/dev/branches/realtime_search/solr/src/test/org/apache/solr/BaseDistributedSearchTestCase.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/realtime_search/solr/src/test/org/apache/solr/BaseDistributedSearchTestCase.java?rev=1073192&r1=1073191&r2=1073192&view=diff
==============================================================================
--- lucene/dev/branches/realtime_search/solr/src/test/org/apache/solr/BaseDistributedSearchTestCase.java (original)
+++ lucene/dev/branches/realtime_search/solr/src/test/org/apache/solr/BaseDistributedSearchTestCase.java Tue Feb 22 01:00:39 2011
@@ -1,5 +1,22 @@
package org.apache.solr;
+/**
+ * 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.
+ */
+
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
@@ -81,24 +98,28 @@ public abstract class BaseDistributedSea
public static Logger log = LoggerFactory.getLogger(BaseDistributedSearchTestCase.class);
public static RandVal rint = new RandVal() {
+ @Override
public Object val() {
return r.nextInt();
}
};
public static RandVal rlong = new RandVal() {
+ @Override
public Object val() {
return r.nextLong();
}
};
public static RandVal rfloat = new RandVal() {
+ @Override
public Object val() {
return r.nextFloat();
}
};
public static RandVal rdouble = new RandVal() {
+ @Override
public Object val() {
return r.nextDouble();
}
@@ -113,7 +134,7 @@ public abstract class BaseDistributedSea
*/
public abstract void doTest() throws Exception;
- public static String[] fieldNames = new String[]{"n_ti", "n_f", "n_tf", "n_d", "n_td", "n_l", "n_tl", "n_dt", "n_tdt"};
+ public static String[] fieldNames = new String[]{"n_ti1", "n_f1", "n_tf1", "n_d1", "n_td1", "n_l1", "n_tl1", "n_dt1", "n_tdt1"};
public static RandVal[] randVals = new RandVal[]{rint, rfloat, rfloat, rdouble, rdouble, rlong, rlong, rdate, rdate};
protected String[] getFieldNames() {
@@ -320,6 +341,7 @@ public abstract class BaseDistributedSea
Thread[] threads = new Thread[nThreads];
for (int i = 0; i < threads.length; i++) {
threads[i] = new Thread() {
+ @Override
public void run() {
for (int j = 0; j < stress; j++) {
int which = r.nextInt(clients.size());
@@ -606,6 +628,7 @@ public abstract class BaseDistributedSea
public static class RandDate extends RandVal {
public static TrieDateField df = new TrieDateField();
+ @Override
public Object val() {
long v = r.nextLong();
Date d = new Date(v);
Modified: lucene/dev/branches/realtime_search/solr/src/test/org/apache/solr/BasicFunctionalityTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/realtime_search/solr/src/test/org/apache/solr/BasicFunctionalityTest.java?rev=1073192&r1=1073191&r2=1073192&view=diff
==============================================================================
--- lucene/dev/branches/realtime_search/solr/src/test/org/apache/solr/BasicFunctionalityTest.java (original)
+++ lucene/dev/branches/realtime_search/solr/src/test/org/apache/solr/BasicFunctionalityTest.java Tue Feb 22 01:00:39 2011
@@ -29,6 +29,8 @@ import javax.xml.parsers.DocumentBuilder
import org.apache.lucene.document.Field;
import org.apache.lucene.document.Fieldable;
import org.apache.lucene.index.LogMergePolicy;
+import org.apache.solr.common.SolrException;
+import org.apache.solr.common.SolrException.ErrorCode;
import org.apache.solr.common.params.AppendedSolrParams;
import org.apache.solr.common.params.CommonParams;
import org.apache.solr.common.params.DefaultSolrParams;
@@ -47,6 +49,8 @@ import org.apache.solr.schema.SchemaFiel
import org.apache.solr.search.DocIterator;
import org.apache.solr.search.DocList;
import org.apache.solr.update.SolrIndexWriter;
+
+
import org.junit.BeforeClass;
import org.junit.Test;
@@ -221,10 +225,15 @@ public class BasicFunctionalityTest exte
public void testRequestHandlerBaseException() {
final String tmp = "BOO! ignore_exception";
SolrRequestHandler handler = new RequestHandlerBase() {
+ @Override
public String getDescription() { return tmp; }
+ @Override
public String getSourceId() { return tmp; }
+ @Override
public String getSource() { return tmp; }
+ @Override
public String getVersion() { return tmp; }
+ @Override
public void handleRequestBody
( SolrQueryRequest req, SolrQueryResponse rsp ) {
throw new RuntimeException(tmp);
@@ -653,6 +662,39 @@ public class BasicFunctionalityTest exte
"*[count(//doc)=1]");
}
+ @Test
+ public void testAbuseOfSort() {
+
+ assertU(adoc("id", "9999991",
+ "sortabuse_b", "true",
+ "sortabuse_t", "zzz xxx ccc vvv bbb nnn aaa sss ddd fff ggg"));
+ assertU(adoc("id", "9999992",
+ "sortabuse_b", "true",
+ "sortabuse_t", "zzz xxx ccc vvv bbb nnn qqq www eee rrr ttt"));
+
+ assertU(commit());
+
+ try {
+ assertQ("sort on something that shouldn't work",
+ req("q", "sortabuse_b:true",
+ "sort", "sortabuse_t asc"),
+ "*[count(//doc)=2]");
+ fail("no error encountered when sorting on sortabuse_t");
+ } catch (Exception outer) {
+ // EXPECTED
+ Throwable root = getRootCause(outer);
+ assertEquals("sort exception root cause",
+ SolrException.class, root.getClass());
+ SolrException e = (SolrException) root;
+ assertEquals("incorrect error type",
+ SolrException.ErrorCode.BAD_REQUEST,
+ SolrException.ErrorCode.getErrorCode(e.code()));
+ assertTrue("exception doesn't contain field name",
+ -1 != e.getMessage().indexOf("sortabuse_t"));
+ }
+ }
+
+
// /** this doesn't work, but if it did, this is how we'd test it. */
// public void testOverwriteFalse() {
Modified: lucene/dev/branches/realtime_search/solr/src/test/org/apache/solr/ConvertedLegacyTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/realtime_search/solr/src/test/org/apache/solr/ConvertedLegacyTest.java?rev=1073192&r1=1073191&r2=1073192&view=diff
==============================================================================
--- lucene/dev/branches/realtime_search/solr/src/test/org/apache/solr/ConvertedLegacyTest.java (original)
+++ lucene/dev/branches/realtime_search/solr/src/test/org/apache/solr/ConvertedLegacyTest.java Tue Feb 22 01:00:39 2011
@@ -123,9 +123,9 @@ public class ConvertedLegacyTest extends
// test range
assertU("<delete><id>44</id></delete>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"val_s\">apple</field></doc></add>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"val_s\">banana</field></doc></add>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"val_s\">pear</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"val_s\">apple</field><field name=\"val_s1\">apple</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"val_s\">banana</field><field name=\"val_s1\">banana</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"val_s\">pear</field><field name=\"val_s1\">pear</field></doc></add>");
assertU("<commit/>");
assertQ(req("val_s:[a TO z]")
,"//*[@numFound='3'] "
@@ -228,7 +228,7 @@ public class ConvertedLegacyTest extends
args = new HashMap<String,String>();
args.put("version","2.0");
args.put("defType","lucenePlusSort");
- req = new LocalSolrQueryRequest(h.getCore(), "val_s:[a TO z];val_s asc",
+ req = new LocalSolrQueryRequest(h.getCore(), "val_s:[a TO z];val_s1 asc",
"standard", 0, 0 , args);
assertQ(req
,"//*[@numFound='3'] "
@@ -237,7 +237,7 @@ public class ConvertedLegacyTest extends
args = new HashMap<String,String>();
args.put("version","2.0");
args.put("defType","lucenePlusSort");
- req = new LocalSolrQueryRequest(h.getCore(), "val_s:[a TO z];val_s desc",
+ req = new LocalSolrQueryRequest(h.getCore(), "val_s:[a TO z];val_s1 desc",
"standard", 0, 0 , args);
assertQ(req
,"//*[@numFound='3'] "
@@ -509,133 +509,133 @@ public class ConvertedLegacyTest extends
// test integer ranges and sorting
assertU("<delete><id>44</id></delete>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_i\">1234567890</field></doc></add>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_i\">10</field></doc></add>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_i\">1</field></doc></add>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_i\">2</field></doc></add>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_i\">15</field></doc></add>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_i\">-1</field></doc></add>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_i\">-987654321</field></doc></add>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_i\">2147483647</field></doc></add>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_i\">-2147483648</field></doc></add>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_i\">0</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_i1\">1234567890</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_i1\">10</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_i1\">1</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_i1\">2</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_i1\">15</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_i1\">-1</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_i1\">-987654321</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_i1\">2147483647</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_i1\">-2147483648</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_i1\">0</field></doc></add>");
assertU("<commit/>");
assertQ(req("id:44")
,"*[count(//doc)=10]"
);
- assertQ(req("num_i:2147483647")
+ assertQ(req("num_i1:2147483647")
,"//@numFound[.='1'] "
,"//int[.='2147483647']"
);
- assertQ(req("num_i:\"-2147483648\"")
+ assertQ(req("num_i1:\"-2147483648\"")
,"//@numFound[.='1'] "
,"//int[.='-2147483648']"
);
- assertQ(req("id:44;num_i asc;")
+ assertQ(req("id:44;num_i1 asc;")
,"//doc[1]/int[.='-2147483648'] "
,"//doc[last()]/int[.='2147483647']"
);
- assertQ(req("id:44;num_i desc;")
+ assertQ(req("id:44;num_i1 desc;")
,"//doc[1]/int[.='2147483647'] "
,"//doc[last()]/int[.='-2147483648']"
);
- assertQ(req("num_i:[0 TO 9]")
+ assertQ(req("num_i1:[0 TO 9]")
,"*[count(//doc)=3]"
);
- assertQ(req("num_i:[-2147483648 TO 2147483647]")
+ assertQ(req("num_i1:[-2147483648 TO 2147483647]")
,"*[count(//doc)=10]"
);
- assertQ(req("num_i:[-10 TO -1]")
+ assertQ(req("num_i1:[-10 TO -1]")
,"*[count(//doc)=1]"
);
// test long ranges and sorting
assertU("<delete><id>44</id></delete>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_l\">1234567890</field></doc></add>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_l\">10</field></doc></add>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_l\">1</field></doc></add>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_l\">2</field></doc></add>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_l\">15</field></doc></add>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_l\">-1</field></doc></add>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_l\">-987654321</field></doc></add>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_l\">9223372036854775807</field></doc></add>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_l\">-9223372036854775808</field></doc></add>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_l\">0</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_l1\">1234567890</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_l1\">10</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_l1\">1</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_l1\">2</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_l1\">15</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_l1\">-1</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_l1\">-987654321</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_l1\">9223372036854775807</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_l1\">-9223372036854775808</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_l1\">0</field></doc></add>");
assertU("<commit/>");
assertQ(req("id:44")
,"*[count(//doc)=10]"
);
- assertQ(req("num_l:9223372036854775807")
+ assertQ(req("num_l1:9223372036854775807")
,"//@numFound[.='1'] "
,"//long[.='9223372036854775807']"
);
- assertQ(req("num_l:\"-9223372036854775808\"")
+ assertQ(req("num_l1:\"-9223372036854775808\"")
,"//@numFound[.='1'] "
,"//long[.='-9223372036854775808']"
);
- assertQ(req("id:44;num_l asc;")
+ assertQ(req("id:44;num_l1 asc;")
,"//doc[1]/long[.='-9223372036854775808'] "
,"//doc[last()]/long[.='9223372036854775807']"
);
- assertQ(req("id:44;num_l desc;")
+ assertQ(req("id:44;num_l1 desc;")
,"//doc[1]/long[.='9223372036854775807'] "
,"//doc[last()]/long[.='-9223372036854775808']"
);
- assertQ(req("num_l:[-1 TO 9]")
+ assertQ(req("num_l1:[-1 TO 9]")
,"*[count(//doc)=4]"
);
- assertQ(req("num_l:[-9223372036854775808 TO 9223372036854775807]")
+ assertQ(req("num_l1:[-9223372036854775808 TO 9223372036854775807]")
,"*[count(//doc)=10]"
);
- assertQ(req("num_l:[-10 TO -1]")
+ assertQ(req("num_l1:[-10 TO -1]")
,"*[count(//doc)=1]"
);
// test binary float ranges and sorting
assertU("<delete><id>44</id></delete>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_sf\">1.4142135</field></doc></add>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_sf\">Infinity</field></doc></add>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_sf\">-Infinity</field></doc></add>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_sf\">NaN</field></doc></add>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_sf\">2</field></doc></add>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_sf\">-1</field></doc></add>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_sf\">-987654321</field></doc></add>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_sf\">-999999.99</field></doc></add>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_sf\">-1e20</field></doc></add>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_sf\">0</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_sf1\">1.4142135</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_sf1\">Infinity</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_sf1\">-Infinity</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_sf1\">NaN</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_sf1\">2</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_sf1\">-1</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_sf1\">-987654321</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_sf1\">-999999.99</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_sf1\">-1e20</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_sf1\">0</field></doc></add>");
assertU("<commit/>");
assertQ(req("id:44")
,"*[count(//doc)=10]"
);
- assertQ(req("num_sf:Infinity")
+ assertQ(req("num_sf1:Infinity")
,"//@numFound[.='1'] "
,"//float[.='Infinity']"
);
- assertQ(req("num_sf:\"-Infinity\"")
+ assertQ(req("num_sf1:\"-Infinity\"")
,"//@numFound[.='1'] "
,"//float[.='-Infinity']"
);
- assertQ(req("num_sf:\"NaN\"")
+ assertQ(req("num_sf1:\"NaN\"")
,"//@numFound[.='1'] "
,"//float[.='NaN']"
);
- assertQ(req("num_sf:\"-1e20\"")
+ assertQ(req("num_sf1:\"-1e20\"")
,"//@numFound[.='1']"
);
- assertQ(req("id:44;num_sf asc;")
+ assertQ(req("id:44;num_sf1 asc;")
,"//doc[1]/float[.='-Infinity'] "
,"//doc[last()]/float[.='NaN']"
);
- assertQ(req("id:44;num_sf desc;")
+ assertQ(req("id:44;num_sf1 desc;")
,"//doc[1]/float[.='NaN'] "
,"//doc[last()]/float[.='-Infinity']"
);
- assertQ(req("num_sf:[-1 TO 2]")
+ assertQ(req("num_sf1:[-1 TO 2]")
,"*[count(//doc)=4]"
);
- assertQ(req("num_sf:[-Infinity TO Infinity]")
+ assertQ(req("num_sf1:[-Infinity TO Infinity]")
,"*[count(//doc)=9]"
);
@@ -644,50 +644,50 @@ public class ConvertedLegacyTest extends
// test binary double ranges and sorting
assertU("<delete><id>44</id></delete>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_sd\">1.4142135</field></doc></add>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_sd\">Infinity</field></doc></add>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_sd\">-Infinity</field></doc></add>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_sd\">NaN</field></doc></add>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_sd\">2</field></doc></add>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_sd\">-1</field></doc></add>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_sd\">1e-100</field></doc></add>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_sd\">-999999.99</field></doc></add>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_sd\">-1e100</field></doc></add>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_sd\">0</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_sd1\">1.4142135</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_sd1\">Infinity</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_sd1\">-Infinity</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_sd1\">NaN</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_sd1\">2</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_sd1\">-1</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_sd1\">1e-100</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_sd1\">-999999.99</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_sd1\">-1e100</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"num_sd1\">0</field></doc></add>");
assertU("<commit/>");
assertQ(req("id:44")
,"*[count(//doc)=10]"
);
- assertQ(req("num_sd:Infinity")
+ assertQ(req("num_sd1:Infinity")
,"//@numFound[.='1'] "
,"//double[.='Infinity']"
);
- assertQ(req("num_sd:\"-Infinity\"")
+ assertQ(req("num_sd1:\"-Infinity\"")
,"//@numFound[.='1'] "
,"//double[.='-Infinity']"
);
- assertQ(req("num_sd:\"NaN\"")
+ assertQ(req("num_sd1:\"NaN\"")
,"//@numFound[.='1'] "
,"//double[.='NaN']"
);
- assertQ(req("num_sd:\"-1e100\"")
+ assertQ(req("num_sd1:\"-1e100\"")
,"//@numFound[.='1']"
);
- assertQ(req("num_sd:\"1e-100\"")
+ assertQ(req("num_sd1:\"1e-100\"")
,"//@numFound[.='1']"
);
- assertQ(req("id:44;num_sd asc;")
+ assertQ(req("id:44;num_sd1 asc;")
,"//doc[1]/double[.='-Infinity'] "
,"//doc[last()]/double[.='NaN']"
);
- assertQ(req("id:44;num_sd desc;")
+ assertQ(req("id:44;num_sd1 desc;")
,"//doc[1]/double[.='NaN'] "
,"//doc[last()]/double[.='-Infinity']"
);
- assertQ(req("num_sd:[-1 TO 2]")
+ assertQ(req("num_sd1:[-1 TO 2]")
,"*[count(//doc)=5]"
);
- assertQ(req("num_sd:[-Infinity TO Infinity]")
+ assertQ(req("num_sd1:[-Infinity TO Infinity]")
,"*[count(//doc)=9]"
);
@@ -695,38 +695,38 @@ public class ConvertedLegacyTest extends
// test sorting on multiple fields
assertU("<delete><id>44</id></delete>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"a_i\">10</field></doc></add>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"a_i\">1</field><field name=\"b_i\">100</field></doc></add>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"a_i\">-1</field></doc></add>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"a_i\">15</field></doc></add>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"a_i\">1</field><field name=\"b_i\">50</field></doc></add>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"a_i\">0</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"a_i1\">10</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"a_i1\">1</field><field name=\"b_i1\">100</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"a_i1\">-1</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"a_i1\">15</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"a_i1\">1</field><field name=\"b_i1\">50</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id\">44</field><field name=\"a_i1\">0</field></doc></add>");
assertU("<commit/>");
assertQ(req("id:44")
,"*[count(//doc)=6]"
);
- assertQ(req("id:44; a_i asc,b_i desc")
+ assertQ(req("id:44; a_i1 asc,b_i1 desc")
,"*[count(//doc)=6] "
,"//doc[3]/int[.='100'] "
,"//doc[4]/int[.='50']"
);
- assertQ(req("id:44;a_i asc , b_i asc;")
+ assertQ(req("id:44;a_i1 asc , b_i1 asc;")
,"*[count(//doc)=6] "
,"//doc[3]/int[.='50'] "
,"//doc[4]/int[.='100']"
);
- assertQ(req("id:44;a_i asc;")
+ assertQ(req("id:44;a_i1 asc;")
,"*[count(//doc)=6] "
,"//doc[1]/int[.='-1'] "
,"//doc[last()]/int[.='15']"
);
- assertQ(req("id:44;a_i asc , score top;")
+ assertQ(req("id:44;a_i1 asc , score top;")
,"*[count(//doc)=6] "
,"//doc[1]/int[.='-1'] "
,"//doc[last()]/int[.='15']"
);
- assertQ(req("id:44; score top , a_i top, b_i bottom ;")
+ assertQ(req("id:44; score top , a_i1 top, b_i1 bottom ;")
,"*[count(//doc)=6] "
,"//doc[last()]/int[.='-1'] "
,"//doc[1]/int[.='15'] "
@@ -738,13 +738,13 @@ public class ConvertedLegacyTest extends
// test sorting with some docs missing the sort field
assertU("<delete><query>id_i:[1000 TO 1010]</query></delete>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id_i\">1000</field><field name=\"a_i\">1</field><field name=\"nullfirst\">Z</field></doc></add>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id_i\">1001</field><field name=\"a_i\">10</field><field name=\"nullfirst\">A</field></doc></add>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id_i\">1002</field><field name=\"a_i\">1</field><field name=\"b_si\">100</field></doc></add>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id_i\">1003</field><field name=\"a_i\">-1</field></doc></add>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id_i\">1004</field><field name=\"a_i\">15</field></doc></add>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id_i\">1005</field><field name=\"a_i\">1</field><field name=\"b_si\">50</field></doc></add>");
- assertU("<add overwrite=\"false\"><doc><field name=\"id_i\">1006</field><field name=\"a_i\">0</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id_i\">1000</field><field name=\"a_i1\">1</field><field name=\"nullfirst\">Z</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id_i\">1001</field><field name=\"a_i1\">10</field><field name=\"nullfirst\">A</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id_i\">1002</field><field name=\"a_i1\">1</field><field name=\"b_si\">100</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id_i\">1003</field><field name=\"a_i1\">-1</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id_i\">1004</field><field name=\"a_i1\">15</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id_i\">1005</field><field name=\"a_i1\">1</field><field name=\"b_si\">50</field></doc></add>");
+ assertU("<add overwrite=\"false\"><doc><field name=\"id_i\">1006</field><field name=\"a_i1\">0</field></doc></add>");
assertU("<commit/>");
assertQ(req("id_i:[1000 TO 1010]")
,"*[count(//doc)=7]"
@@ -759,13 +759,13 @@ public class ConvertedLegacyTest extends
,"//doc[1]/int[.='100'] "
,"//doc[2]/int[.='50']"
);
- assertQ(req("id_i:[1000 TO 1010]; a_i asc,b_si desc")
+ assertQ(req("id_i:[1000 TO 1010]; a_i1 asc,b_si desc")
,"*[count(//doc)=7] "
,"//doc[3]/int[.='100'] "
,"//doc[4]/int[.='50'] "
,"//doc[5]/int[.='1000']"
);
- assertQ(req("id_i:[1000 TO 1010]; a_i asc,b_si asc")
+ assertQ(req("id_i:[1000 TO 1010]; a_i1 asc,b_si asc")
,"*[count(//doc)=7] "
,"//doc[3]/int[.='50'] "
,"//doc[4]/int[.='100'] "
Modified: lucene/dev/branches/realtime_search/solr/src/test/org/apache/solr/JSONTestUtil.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/realtime_search/solr/src/test/org/apache/solr/JSONTestUtil.java?rev=1073192&r1=1073191&r2=1073192&view=diff
==============================================================================
--- lucene/dev/branches/realtime_search/solr/src/test/org/apache/solr/JSONTestUtil.java (original)
+++ lucene/dev/branches/realtime_search/solr/src/test/org/apache/solr/JSONTestUtil.java Tue Feb 22 01:00:39 2011
@@ -135,14 +135,16 @@ class CollectionTester {
if (!expected.equals(val)) {
// make an exception for some numerics
- if (expected instanceof Integer && val instanceof Long || expected instanceof Long && val instanceof Integer
+ if ((expected instanceof Integer && val instanceof Long || expected instanceof Long && val instanceof Integer)
&& ((Number)expected).longValue() == ((Number)val).longValue())
{
- // OK
- } else if (expected instanceof Float && val instanceof Double || expected instanceof Double && val instanceof Float
- && ((Number)expected).doubleValue() == ((Number)val).doubleValue())
- {
- // OK
+ return true;
+ } else if ((expected instanceof Float && val instanceof Double || expected instanceof Double && val instanceof Float)) {
+ double a = ((Number)expected).doubleValue();
+ double b = ((Number)val).doubleValue();
+ if (Double.compare(a,b) == 0) return true;
+ if (Math.abs(a-b) < 1e-5) return true;
+ return false;
} else {
setErr("mismatch: '" + expected + "'!='" + val + "'");
return false;
Modified: lucene/dev/branches/realtime_search/solr/src/test/org/apache/solr/SolrTestCaseJ4.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/realtime_search/solr/src/test/org/apache/solr/SolrTestCaseJ4.java?rev=1073192&r1=1073191&r2=1073192&view=diff
==============================================================================
--- lucene/dev/branches/realtime_search/solr/src/test/org/apache/solr/SolrTestCaseJ4.java (original)
+++ lucene/dev/branches/realtime_search/solr/src/test/org/apache/solr/SolrTestCaseJ4.java Tue Feb 22 01:00:39 2011
@@ -22,6 +22,7 @@ package org.apache.solr;
import org.apache.lucene.util.LuceneTestCase;
import org.apache.noggit.CharArr;
import org.apache.noggit.JSONUtil;
+import org.apache.noggit.ObjectBuilder;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.SolrInputDocument;
import org.apache.solr.common.SolrInputField;
@@ -602,6 +603,7 @@ public abstract class SolrTestCaseJ4 ext
/** Neccessary to make method signatures un-ambiguous */
public static class XmlDoc {
public String xml;
+ @Override
public String toString() { return xml; }
}
@@ -727,6 +729,7 @@ public abstract class SolrTestCaseJ4 ext
public int order; // the order this document was added to the index
+ @Override
public String toString() {
return "Doc("+order+"):"+fields.toString();
}
@@ -780,6 +783,7 @@ public abstract class SolrTestCaseJ4 ext
public static class Fld {
public FldType ftype;
public List<Comparable> vals;
+ @Override
public String toString() {
return ftype.fname + "=" + (vals.size()==1 ? vals.get(0).toString() : vals.toString());
}
@@ -834,17 +838,9 @@ public abstract class SolrTestCaseJ4 ext
// commit an average of 10 times for large sets, or 10% of the time for small sets
int commitOneOutOf = Math.max(nDocs/10, 10);
-
- // find the max order (docid) and start from there
- int order = -1;
- for (Doc doc : model.values()) {
- order = Math.max(order, doc.order);
- }
- order++;
-
for (int i=0; i<nDocs; i++) {
Doc doc = createDoc(descriptor);
- doc.order = order++;
+ // doc.order = order++;
updateJ(toJSON(doc), null);
model.put(doc.id, doc);
@@ -867,6 +863,25 @@ public abstract class SolrTestCaseJ4 ext
assertU(commit());
}
+ // merging segments no longer selects just adjacent segments hence ids (doc.order) can be shuffled.
+ // we need to look at the index to determine the order.
+ String responseStr = h.query(req("q","*:*", "fl","id", "sort","_docid_ asc", "rows",Integer.toString(model.size()*2), "wt","json", "indent","true"));
+ Object response = ObjectBuilder.fromJSON(responseStr);
+
+ response = ((Map)response).get("response");
+ response = ((Map)response).get("docs");
+ List<Map> docList = (List<Map>)response;
+ int order = 0;
+ for (Map doc : docList) {
+ Object id = doc.get("id");
+ Doc modelDoc = model.get(id);
+ if (modelDoc == null) continue; // may be some docs in the index that aren't modeled
+ modelDoc.order = order++;
+ }
+
+ // make sure we updated the order of all docs in the model
+ assertEquals(order, model.size());
+
return model;
}
@@ -1058,4 +1073,12 @@ public abstract class SolrTestCaseJ4 ext
}
return new File(base, "solr/").getAbsolutePath();
}
+
+ public static Throwable getRootCause(Throwable t) {
+ Throwable result = t;
+ for (Throwable cause = t; null != cause; cause = cause.getCause()) {
+ result = cause;
+ }
+ return result;
+ }
}