You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ja...@apache.org on 2012/01/24 16:41:17 UTC
svn commit: r1235305 - in /lucene/dev/trunk/solr: ./
core/src/java/org/apache/solr/handler/ core/src/java/org/apache/solr/update/
core/src/test/org/apache/solr/handler/ core/src/test/org/apache/solr/update/
solrj/src/java/org/apache/solr/client/solrj/ ...
Author: janhoy
Date: Tue Jan 24 15:41:16 2012
New Revision: 1235305
URL: http://svn.apache.org/viewvc?rev=1235305&view=rev
Log:
SOLR-2280: commitWithin ignored for a delete query
Modified:
lucene/dev/trunk/solr/CHANGES.txt
lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/BinaryUpdateRequestHandler.java
lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/JsonLoader.java
lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/XMLLoader.java
lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/XmlUpdateRequestHandler.java
lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/CommitTracker.java
lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/DeleteUpdateCommand.java
lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/DirectUpdateHandler2.java
lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/JsonLoaderTest.java
lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/XmlUpdateRequestHandlerTest.java
lucene/dev/trunk/solr/core/src/test/org/apache/solr/update/AutoCommitTest.java
lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/SolrServer.java
lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/request/JavaBinUpdateRequestCodec.java
lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/request/UpdateRequest.java
lucene/dev/trunk/solr/solrj/src/test/org/apache/solr/client/solrj/SolrExampleTests.java
lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/util/AbstractSolrTestCase.java
lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/util/TestHarness.java
Modified: lucene/dev/trunk/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/CHANGES.txt?rev=1235305&r1=1235304&r2=1235305&view=diff
==============================================================================
--- lucene/dev/trunk/solr/CHANGES.txt (original)
+++ lucene/dev/trunk/solr/CHANGES.txt Tue Jan 24 15:41:16 2012
@@ -539,6 +539,8 @@ Bug Fixes
HyphenatedWordsFilter where they would create invalid offsets in
some situations, leading to problems in highlighting. (Robert Muir)
+* SOLR-2280: commitWithin ignored for a delete query (Juan Grande via janhoy)
+
Other Changes
----------------------
* SOLR-2922: Upgrade commons-io and commons-lang to 2.1 and 2.6, respectively. (koji)
Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/BinaryUpdateRequestHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/BinaryUpdateRequestHandler.java?rev=1235305&r1=1235304&r2=1235305&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/BinaryUpdateRequestHandler.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/BinaryUpdateRequestHandler.java Tue Jan 24 15:41:16 2012
@@ -104,11 +104,8 @@ public class BinaryUpdateRequestHandler
log.error("Exception while processing update request", e);
break;
}
- if (update.getDeleteById() != null) {
- delete(req, update.getDeleteById(), processor, true);
- }
- if (update.getDeleteQuery() != null) {
- delete(req, update.getDeleteQuery(), processor, false);
+ if (update.getDeleteById() != null || update.getDeleteQuery() != null) {
+ delete(req, update, processor);
}
}
}
@@ -121,18 +118,28 @@ public class BinaryUpdateRequestHandler
return addCmd;
}
- private void delete(SolrQueryRequest req, List<String> l, UpdateRequestProcessor processor, boolean isId) throws IOException {
- for (String s : l) {
- DeleteUpdateCommand delcmd = new DeleteUpdateCommand(req);
- if (isId) {
+ private void delete(SolrQueryRequest req, UpdateRequest update, UpdateRequestProcessor processor) throws IOException {
+ SolrParams params = update.getParams();
+ DeleteUpdateCommand delcmd = new DeleteUpdateCommand(req);
+ if(params != null) {
+ delcmd.commitWithin = params.getInt(UpdateParams.COMMIT_WITHIN, -1);
+ }
+
+ if(update.getDeleteById() != null) {
+ for (String s : update.getDeleteById()) {
delcmd.id = s;
- } else {
+ processor.processDelete(delcmd);
+ }
+ delcmd.id = null;
+ }
+
+ if(update.getDeleteQuery() != null) {
+ for (String s : update.getDeleteQuery()) {
delcmd.query = s;
+ processor.processDelete(delcmd);
}
- processor.processDelete(delcmd);
}
}
-
@Override
public String getDescription() {
return "Add/Update multiple documents with javabin format";
Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/JsonLoader.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/JsonLoader.java?rev=1235305&r1=1235304&r2=1235305&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/JsonLoader.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/JsonLoader.java Tue Jan 24 15:41:16 2012
@@ -155,6 +155,7 @@ class JsonLoader extends ContentStreamLo
assertNextEvent( JSONParser.OBJECT_START );
DeleteUpdateCommand cmd = new DeleteUpdateCommand(req);
+ cmd.commitWithin = commitWithin;
while( true ) {
int ev = parser.nextEvent();
@@ -167,7 +168,9 @@ class JsonLoader extends ContentStreamLo
else if( "query".equals(key) ) {
cmd.query = parser.getString();
}
- else {
+ else if( "commitWithin".equals(key) ) {
+ cmd.commitWithin = Integer.parseInt(parser.getString());
+ } else {
throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "Unknown key: "+key+" ["+parser.getPosition()+"]" );
}
}
Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/XMLLoader.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/XMLLoader.java?rev=1235305&r1=1235304&r2=1235305&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/XMLLoader.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/XMLLoader.java Tue Jan 24 15:41:16 2012
@@ -181,6 +181,10 @@ class XMLLoader extends ContentStreamLoa
// Parse the command
DeleteUpdateCommand deleteCmd = new DeleteUpdateCommand(req);
+ // First look for commitWithin parameter on the request, will be overwritten for individual <delete>'s
+ SolrParams params = req.getParams();
+ deleteCmd.commitWithin = params.getInt(UpdateParams.COMMIT_WITHIN, -1);
+
for (int i = 0; i < parser.getAttributeCount(); i++) {
String attrName = parser.getAttributeLocalName(i);
String attrVal = parser.getAttributeValue(i);
@@ -188,6 +192,8 @@ class XMLLoader extends ContentStreamLoa
// deprecated
} else if ("fromCommitted".equals(attrName)) {
// deprecated
+ } else if (XmlUpdateRequestHandler.COMMIT_WITHIN.equals(attrName)) {
+ deleteCmd.commitWithin = Integer.parseInt(attrVal);
} else {
XmlUpdateRequestHandler.log.warn("unexpected attribute delete/@" + attrName);
}
Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/XmlUpdateRequestHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/XmlUpdateRequestHandler.java?rev=1235305&r1=1235304&r2=1235305&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/XmlUpdateRequestHandler.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/XmlUpdateRequestHandler.java Tue Jan 24 15:41:16 2012
@@ -47,7 +47,6 @@ public class XmlUpdateRequestHandler ext
// NOTE: This constant is for use with the <add> XML tag, not the HTTP param with same name
public static final String COMMIT_WITHIN = "commitWithin";
-
XMLInputFactory inputFactory;
Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/CommitTracker.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/CommitTracker.java?rev=1235305&r1=1235304&r2=1235305&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/CommitTracker.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/CommitTracker.java Tue Jan 24 15:41:16 2012
@@ -91,6 +91,14 @@ final class CommitTracker implements Run
public void scheduleCommitWithin(long commitMaxTime) {
_scheduleCommitWithin(commitMaxTime);
}
+
+ private void _scheduleCommitWithinIfNeeded(long commitWithin) {
+ long ctime = (commitWithin > 0) ? commitWithin : timeUpperBound;
+
+ if (ctime > 0) {
+ _scheduleCommitWithin(ctime);
+ }
+ }
private void _scheduleCommitWithin(long commitMaxTime) {
if (commitMaxTime <= 0) return;
@@ -139,11 +147,14 @@ final class CommitTracker implements Run
}
// maxTime-triggered autoCommit
- long ctime = (commitWithin > 0) ? commitWithin : timeUpperBound;
-
- if (ctime > 0) {
- _scheduleCommitWithin(ctime);
- }
+ _scheduleCommitWithinIfNeeded(commitWithin);
+ }
+
+ /**
+ * Indicate that documents have been deleted
+ */
+ public void deletedDocument( int commitWithin ) {
+ _scheduleCommitWithinIfNeeded(commitWithin);
}
/** Inform tracker that a commit has occurred */
Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/DeleteUpdateCommand.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/DeleteUpdateCommand.java?rev=1235305&r1=1235304&r2=1235305&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/DeleteUpdateCommand.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/DeleteUpdateCommand.java Tue Jan 24 15:41:16 2012
@@ -18,7 +18,6 @@
package org.apache.solr.update;
import org.apache.lucene.util.BytesRef;
-import org.apache.solr.common.SolrInputField;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.schema.IndexSchema;
import org.apache.solr.schema.SchemaField;
@@ -30,6 +29,7 @@ public class DeleteUpdateCommand extends
public String id; // external (printable) id, for delete-by-id
public String query; // query string for delete-by-query
private BytesRef indexedId;
+ public int commitWithin = -1;
public DeleteUpdateCommand(SolrQueryRequest req) {
@@ -62,6 +62,7 @@ public class DeleteUpdateCommand extends
sb.append(':');
if (id!=null) sb.append("id=").append(id);
else sb.append("query=`").append(query).append('`');
+ sb.append(",commitWithin=").append(commitWithin);
return sb.toString();
}
}
Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/DirectUpdateHandler2.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/DirectUpdateHandler2.java?rev=1235305&r1=1235304&r2=1235305&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/DirectUpdateHandler2.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/update/DirectUpdateHandler2.java Tue Jan 24 15:41:16 2012
@@ -203,6 +203,7 @@ public class DirectUpdateHandler2 extend
Term deleteTerm = new Term(idField.getName(), cmd.getIndexedId());
// SolrCore.verbose("deleteDocuments",deleteTerm,writer);
+ commitTracker.deletedDocument( cmd.commitWithin );
writer.deleteDocuments(deleteTerm);
// SolrCore.verbose("deleteDocuments",deleteTerm,"DONE");
@@ -234,6 +235,8 @@ public class DirectUpdateHandler2 extend
boolean delAll = MatchAllDocsQuery.class == q.getClass();
+ commitTracker.deletedDocument(cmd.commitWithin);
+
if (delAll) {
deleteAll();
} else {
Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/JsonLoaderTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/JsonLoaderTest.java?rev=1235305&r1=1235304&r2=1235305&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/JsonLoaderTest.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/JsonLoaderTest.java Tue Jan 24 15:41:16 2012
@@ -68,7 +68,9 @@ public class JsonLoaderTest extends Solr
"'optimize': { 'waitSearcher':false },\n" +
"\n" +
"'delete': { 'id':'ID' },\n" +
+ "'delete': { 'id':'ID', 'commitWithin':'500' },\n" +
"'delete': { 'query':'QUERY' },\n" +
+ "'delete': { 'query':'QUERY', 'commitWithin':'500' },\n" +
"'rollback': {}\n" +
"\n" +
"}\n" +
@@ -113,14 +115,26 @@ public class JsonLoaderTest extends Solr
// DELETE COMMANDS
- assertEquals( 2, p.deleteCommands.size() );
+ assertEquals( 4, p.deleteCommands.size() );
DeleteUpdateCommand delete = p.deleteCommands.get( 0 );
assertEquals( delete.id, "ID" );
assertEquals( delete.query, null );
+ assertEquals( delete.commitWithin, -1);
delete = p.deleteCommands.get( 1 );
+ assertEquals( delete.id, "ID" );
+ assertEquals( delete.query, null );
+ assertEquals( delete.commitWithin, 500);
+
+ delete = p.deleteCommands.get( 2 );
+ assertEquals( delete.id, null );
+ assertEquals( delete.query, "QUERY" );
+ assertEquals( delete.commitWithin, -1);
+
+ delete = p.deleteCommands.get( 3 );
assertEquals( delete.id, null );
assertEquals( delete.query, "QUERY" );
+ assertEquals( delete.commitWithin, 500);
// ROLLBACK COMMANDS
assertEquals( 1, p.rollbackCommands.size() );
Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/XmlUpdateRequestHandlerTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/XmlUpdateRequestHandlerTest.java?rev=1235305&r1=1235304&r2=1235305&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/XmlUpdateRequestHandlerTest.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/XmlUpdateRequestHandlerTest.java Tue Jan 24 15:41:16 2012
@@ -17,21 +17,27 @@
package org.apache.solr.handler;
import org.apache.solr.SolrTestCaseJ4;
-import java.io.StringReader;
-import java.util.Collection;
-
-import javax.xml.stream.XMLInputFactory;
-import javax.xml.stream.XMLStreamReader;
-
+import org.apache.commons.lang.ObjectUtils;
import org.apache.solr.common.SolrInputDocument;
import org.apache.solr.common.util.ContentStreamBase;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.response.SolrQueryResponse;
import org.apache.solr.update.AddUpdateCommand;
+import org.apache.solr.update.DeleteUpdateCommand;
import org.apache.solr.update.processor.BufferingRequestProcessor;
+import org.apache.solr.update.processor.UpdateRequestProcessor;
import org.junit.BeforeClass;
import org.junit.Test;
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.Queue;
+
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamReader;
+
public class XmlUpdateRequestHandlerTest extends SolrTestCaseJ4 {
private static XMLInputFactory inputFactory = XMLInputFactory.newInstance();
protected static XmlUpdateRequestHandler handler;
@@ -102,5 +108,68 @@ public class XmlUpdateRequestHandlerTest
assertEquals(false, add.overwrite);
req.close();
}
+
+ @Test
+ public void testReadDelete() throws Exception {
+ String xml =
+ "<update>" +
+ " <delete>" +
+ " <query>id:150</query>" +
+ " <id>150</id>" +
+ " <id>200</id>" +
+ " <query>id:200</query>" +
+ " </delete>" +
+ " <delete commitWithin=\"500\">" +
+ " <query>id:150</query>" +
+ " </delete>" +
+ " <delete>" +
+ " <id>150</id>" +
+ " </delete>" +
+ "</update>";
+
+ MockUpdateRequestProcessor p = new MockUpdateRequestProcessor(null);
+ p.expectDelete(null, "id:150", -1);
+ p.expectDelete("150", null, -1);
+ p.expectDelete("200", null, -1);
+ p.expectDelete(null, "id:200", -1);
+ p.expectDelete(null, "id:150", 500);
+ p.expectDelete("150", null, -1);
+
+ XMLLoader loader = new XMLLoader(p, inputFactory);
+ loader.load(req(), new SolrQueryResponse(), new ContentStreamBase.StringStream(xml));
+
+ p.assertNoCommandsPending();
+ }
+
+ private class MockUpdateRequestProcessor extends UpdateRequestProcessor {
+
+ private Queue<DeleteUpdateCommand> deleteCommands = new LinkedList<DeleteUpdateCommand>();
+
+ public MockUpdateRequestProcessor(UpdateRequestProcessor next) {
+ super(next);
+ }
+
+ public void expectDelete(String id, String query, int commitWithin) {
+ DeleteUpdateCommand cmd = new DeleteUpdateCommand(null);
+ cmd.id = id;
+ cmd.query = query;
+ cmd.commitWithin = commitWithin;
+ deleteCommands.add(cmd);
+ }
+
+ public void assertNoCommandsPending() {
+ assertTrue(deleteCommands.isEmpty());
+ }
+
+ @Override
+ public void processDelete(DeleteUpdateCommand cmd) throws IOException {
+ DeleteUpdateCommand expected = deleteCommands.poll();
+ assertNotNull("Unexpected delete command: [" + cmd + "]", expected);
+ assertTrue("Expected [" + expected + "] but found [" + cmd + "]",
+ ObjectUtils.equals(expected.id, cmd.id) &&
+ ObjectUtils.equals(expected.query, cmd.query) &&
+ expected.commitWithin==cmd.commitWithin);
+ }
+ }
}
Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/update/AutoCommitTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/update/AutoCommitTest.java?rev=1235305&r1=1235304&r2=1235305&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/update/AutoCommitTest.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/update/AutoCommitTest.java Tue Jan 24 15:41:16 2012
@@ -258,5 +258,85 @@ public class AutoCommitTest extends Abst
assertQ("now it should", req("id:500") ,"//result[@numFound=1]" );
}
+
+ public void testCommitWithin() throws Exception {
+ SolrCore core = h.getCore();
+ NewSearcherListener trigger = new NewSearcherListener();
+ core.registerNewSearcherListener(trigger);
+ DirectUpdateHandler2 updater = (DirectUpdateHandler2) core.getUpdateHandler();
+ CommitTracker tracker = updater.commitTracker;
+ tracker.setTimeUpperBound(0);
+ tracker.setDocsUpperBound(-1);
+
+ XmlUpdateRequestHandler handler = new XmlUpdateRequestHandler();
+ handler.init( null );
+
+ MapSolrParams params = new MapSolrParams( new HashMap<String, String>() );
+
+ // Add a single document with commitWithin == 1 second
+ SolrQueryResponse rsp = new SolrQueryResponse();
+ SolrQueryRequestBase req = new SolrQueryRequestBase( core, params ) {};
+ req.setContentStreams( toContentStreams(
+ adoc(1000, "id", "529", "field_t", "what's inside?", "subject", "info"), null ) );
+ trigger.reset();
+ handler.handleRequest( req, rsp );
+
+ // Check it isn't in the index
+ assertQ("shouldn't find any", req("id:529") ,"//result[@numFound=0]" );
+
+ // Wait longer than the commitWithin time
+ assertTrue("commitWithin failed to commit", trigger.waitForNewSearcher(30000));
+
+ // Add one document without commitWithin
+ req.setContentStreams( toContentStreams(
+ adoc("id", "530", "field_t", "what's inside?", "subject", "info"), null ) );
+ trigger.reset();
+ handler.handleRequest( req, rsp );
+
+ // Check it isn't in the index
+ assertQ("shouldn't find any", req("id:530") ,"//result[@numFound=0]" );
+
+ // Delete one document with commitWithin
+ req.setContentStreams( toContentStreams(
+ delI("529", "commitWithin", "1000"), null ) );
+ trigger.reset();
+ handler.handleRequest( req, rsp );
+
+ // Now make sure we can find it
+ assertQ("should find one", req("id:529") ,"//result[@numFound=1]" );
+
+ // Wait for the commit to happen
+ assertTrue("commitWithin failed to commit", trigger.waitForNewSearcher(30000));
+
+ // Now we shouldn't find it
+ assertQ("should find none", req("id:529") ,"//result[@numFound=0]" );
+ // ... but we should find the new one
+ assertQ("should find one", req("id:530") ,"//result[@numFound=1]" );
+
+ trigger.reset();
+
+ // now make the call 10 times really fast and make sure it
+ // only commits once
+ req.setContentStreams( toContentStreams(
+ adoc(1000, "id", "500" ), null ) );
+ for( int i=0;i<10; i++ ) {
+ handler.handleRequest( req, rsp );
+ }
+ assertQ("should not be there yet", req("id:500") ,"//result[@numFound=0]" );
+
+ // the same for the delete
+ req.setContentStreams( toContentStreams(
+ delI("530", "commitWithin", "1000"), null ) );
+ for( int i=0;i<10; i++ ) {
+ handler.handleRequest( req, rsp );
+ }
+ assertQ("should be there", req("id:530") ,"//result[@numFound=1]" );
+
+ assertTrue("commitWithin failed to commit", trigger.waitForNewSearcher(30000));
+ assertQ("should be there", req("id:500") ,"//result[@numFound=1]" );
+ assertQ("should not be there", req("id:530") ,"//result[@numFound=0]" );
+
+ assertEquals(3, tracker.getCommitCount());
+ }
}
Modified: lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/SolrServer.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/SolrServer.java?rev=1235305&r1=1235304&r2=1235305&view=diff
==============================================================================
--- lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/SolrServer.java (original)
+++ lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/SolrServer.java Tue Jan 24 15:41:16 2012
@@ -226,7 +226,22 @@ public abstract class SolrServer impleme
* @throws IOException
*/
public UpdateResponse deleteById(String id) throws SolrServerException, IOException {
- return new UpdateRequest().deleteById( id ).process( this );
+ return deleteById(id, -1);
+ }
+
+ /**
+ * Deletes a single document by unique ID, specifying max time before commit
+ * @param id the ID of the document to delete
+ * @param commitWithinMs max time (in ms) before a commit will happen
+ * @throws SolrServerException
+ * @throws IOException
+ * @since 3.6
+ */
+ public UpdateResponse deleteById(String id, int commitWithinMs) throws SolrServerException, IOException {
+ UpdateRequest req = new UpdateRequest();
+ req.deleteById(id);
+ req.setCommitWithin(commitWithinMs);
+ return req.process(this);
}
/**
@@ -236,7 +251,22 @@ public abstract class SolrServer impleme
* @throws IOException
*/
public UpdateResponse deleteById(List<String> ids) throws SolrServerException, IOException {
- return new UpdateRequest().deleteById( ids ).process( this );
+ return deleteById(ids, -1);
+ }
+
+ /**
+ * Deletes a list of documents by unique ID, specifying max time before commit
+ * @param ids the list of document IDs to delete
+ * @param commitWithinMs max time (in ms) before a commit will happen
+ * @throws SolrServerException
+ * @throws IOException
+ * @since 3.6
+ */
+ public UpdateResponse deleteById(List<String> ids, int commitWithinMs) throws SolrServerException, IOException {
+ UpdateRequest req = new UpdateRequest();
+ req.deleteById(ids);
+ req.setCommitWithin(commitWithinMs);
+ return req.process(this);
}
/**
@@ -246,7 +276,22 @@ public abstract class SolrServer impleme
* @throws IOException
*/
public UpdateResponse deleteByQuery(String query) throws SolrServerException, IOException {
- return new UpdateRequest().deleteByQuery( query ).process( this );
+ return deleteByQuery(query, -1);
+ }
+
+ /**
+ * Deletes documents from the index based on a query, specifying max time before commit
+ * @param query the query expressing what documents to delete
+ * @param commitWithinMs max time (in ms) before a commit will happen
+ * @throws SolrServerException
+ * @throws IOException
+ * @since 3.6
+ */
+ public UpdateResponse deleteByQuery(String query, int commitWithinMs) throws SolrServerException, IOException {
+ UpdateRequest req = new UpdateRequest();
+ req.deleteByQuery(query);
+ req.setCommitWithin(commitWithinMs);
+ return req.process(this);
}
/**
Modified: lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/request/JavaBinUpdateRequestCodec.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/request/JavaBinUpdateRequestCodec.java?rev=1235305&r1=1235304&r2=1235305&view=diff
==============================================================================
--- lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/request/JavaBinUpdateRequestCodec.java (original)
+++ lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/request/JavaBinUpdateRequestCodec.java Tue Jan 24 15:41:16 2012
@@ -145,6 +145,15 @@ public class JavaBinUpdateRequestCodec {
codec.unmarshal(is);
+
+ // NOTE: if the update request contains only delete commands the params
+ // must be loaded now
+ if(updateRequest.getParams()==null) {
+ NamedList params = (NamedList) namedList[0].get("params");
+ if(params!=null) {
+ updateRequest.setParams(new ModifiableSolrParams(SolrParams.toSolrParams(params)));
+ }
+ }
delById = (List<String>) namedList[0].get("delById");
delByQ = (List<String>) namedList[0].get("delByQ");
doclist = (List) namedList[0].get("docs");
Modified: lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/request/UpdateRequest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/request/UpdateRequest.java?rev=1235305&r1=1235304&r2=1235305&view=diff
==============================================================================
--- lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/request/UpdateRequest.java (original)
+++ lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/request/UpdateRequest.java Tue Jan 24 15:41:16 2012
@@ -228,7 +228,11 @@ public class UpdateRequest extends Abstr
boolean deleteI = deleteById != null && deleteById.size() > 0;
boolean deleteQ = deleteQuery != null && deleteQuery.size() > 0;
if( deleteI || deleteQ ) {
- writer.append( "<delete>" );
+ if(commitWithin>0) {
+ writer.append( "<delete commitWithin=\"" + commitWithin + "\">" );
+ } else {
+ writer.append( "<delete>" );
+ }
if( deleteI ) {
for( String id : deleteById ) {
writer.append( "<id>" );
Modified: lucene/dev/trunk/solr/solrj/src/test/org/apache/solr/client/solrj/SolrExampleTests.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/solrj/src/test/org/apache/solr/client/solrj/SolrExampleTests.java?rev=1235305&r1=1235304&r2=1235305&view=diff
==============================================================================
--- lucene/dev/trunk/solr/solrj/src/test/org/apache/solr/client/solrj/SolrExampleTests.java (original)
+++ lucene/dev/trunk/solr/solrj/src/test/org/apache/solr/client/solrj/SolrExampleTests.java Tue Jan 24 15:41:16 2012
@@ -343,7 +343,7 @@ abstract public class SolrExampleTests e
* query the example
*/
@Test
- public void testCommitWithin() throws Exception
+ public void testCommitWithinOnAdd() throws Exception
{
// make sure it is empty...
SolrServer server = getSolrServer();
@@ -388,7 +388,6 @@ abstract public class SolrExampleTests e
Assert.assertEquals( 1, rsp.getResults().getNumFound() );
-
// Now test the new convenience parameter on the add() for commitWithin
SolrInputDocument doc4 = new SolrInputDocument();
doc4.addField( "id", "id4", 1.0f );
@@ -416,7 +415,52 @@ abstract public class SolrExampleTests e
}
Assert.assertEquals( 1, rsp.getResults().getNumFound() );
+ }
+
+ @Test
+ public void testCommitWithinOnDelete() 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 add one document...
+ SolrInputDocument doc3 = new SolrInputDocument();
+ doc3.addField( "id", "id3", 1.0f );
+ doc3.addField( "name", "doc3", 1.0f );
+ doc3.addField( "price", 10 );
+ server.add(doc3);
+ server.commit();
+
+ // now check that it comes out...
+ rsp = server.query( new SolrQuery( "id:id3") );
+ Assert.assertEquals( 1, rsp.getResults().getNumFound() );
+
+ // now test commitWithin on a delete
+ UpdateRequest up = new UpdateRequest();
+ up.setCommitWithin(1000);
+ up.deleteById("id3");
+ up.process( server );
+
+ // the document should still be there
+ rsp = server.query( new SolrQuery( "id:id3") );
+ Assert.assertEquals( 1, rsp.getResults().getNumFound() );
+
+ // check if the doc has been deleted every 250 ms for 30 seconds
+ long timeout = System.currentTimeMillis() + 30000;
+ do {
+ Thread.sleep( 250 ); // wait 250 ms
+
+ rsp = server.query( new SolrQuery( "id:id3") );
+ if(rsp.getResults().getNumFound()==0) {
+ return;
+ }
+ } while(System.currentTimeMillis()<timeout);
+
+ Assert.fail("commitWithin failed to commit");
}
Modified: lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/util/AbstractSolrTestCase.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/util/AbstractSolrTestCase.java?rev=1235305&r1=1235304&r2=1235305&view=diff
==============================================================================
--- lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/util/AbstractSolrTestCase.java (original)
+++ lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/util/AbstractSolrTestCase.java Tue Jan 24 15:41:16 2012
@@ -316,6 +316,20 @@ public abstract class AbstractSolrTestCa
Doc d = doc(fieldsAndValues);
return add(d);
}
+
+ /**
+ * Generates a simple <add><doc>... XML String with the
+ * commitWithin attribute.
+ *
+ * @param commitWithin the value of the commitWithin attribute
+ * @param fieldsAndValues 0th and Even numbered args are fields names odds are field values.
+ * @see #add
+ * @see #doc
+ */
+ public String adoc(int commitWithin, String... fieldsAndValues) {
+ Doc d = doc(fieldsAndValues);
+ return add(d, "commitWithin", String.valueOf(commitWithin));
+ }
/**
* Generates a simple <add><doc>... XML String with no options
@@ -366,16 +380,17 @@ public abstract class AbstractSolrTestCa
*
* @see TestHarness#deleteById
*/
- public String delI(String id) {
- return h.deleteById(id);
+ public String delI(String id, String... args) {
+ return h.deleteById(id, args);
}
+
/**
* Generates a <delete>... XML string for an query
*
* @see TestHarness#deleteByQuery
*/
- public String delQ(String q) {
- return h.deleteByQuery(q);
+ public String delQ(String q, String... args) {
+ return h.deleteByQuery(q, args);
}
/**
Modified: lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/util/TestHarness.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/util/TestHarness.java?rev=1235305&r1=1235304&r2=1235305&view=diff
==============================================================================
--- lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/util/TestHarness.java (original)
+++ lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/util/TestHarness.java Tue Jan 24 15:41:16 2012
@@ -453,32 +453,46 @@ public class TestHarness {
/**
* Generates a delete by query xml string
* @param q Query that has not already been xml escaped
+ * @param args The attributes of the delete tag
*/
- public static String deleteByQuery(String q) {
- return delete("query", q);
+ public static String deleteByQuery(String q, String... args) {
+ try {
+ StringWriter r = new StringWriter();
+ XML.writeXML(r, "query", q);
+ return delete(r.getBuffer().toString(), args);
+ } catch(IOException e) {
+ throw new RuntimeException
+ ("this should never happen with a StringWriter", e);
+ }
}
+
/**
* Generates a delete by id xml string
* @param id ID that has not already been xml escaped
+ * @param args The attributes of the delete tag
*/
- public static String deleteById(String id) {
- return delete("id", id);
+ public static String deleteById(String id, String... args) {
+ try {
+ StringWriter r = new StringWriter();
+ XML.writeXML(r, "id", id);
+ return delete(r.getBuffer().toString(), args);
+ } catch(IOException e) {
+ throw new RuntimeException
+ ("this should never happen with a StringWriter", e);
+ }
}
/**
* Generates a delete xml string
* @param val text that has not already been xml escaped
+ * @param args 0 and Even numbered args are params, Odd numbered args are XML escaped values.
*/
- private static String delete(String deltype, String val) {
+ private static String delete(String val, String... args) {
try {
StringWriter r = new StringWriter();
-
- r.write("<delete>");
- XML.writeXML(r, deltype, val);
- r.write("</delete>");
-
+ XML.writeUnescapedXML(r, "delete", val, (Object[])args);
return r.getBuffer().toString();
- } catch (IOException e) {
+ } catch(IOException e) {
throw new RuntimeException
("this should never happen with a StringWriter", e);
}