You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by yo...@apache.org on 2012/06/05 17:04:24 UTC
svn commit: r1346407 - in /lucene/dev/trunk/solr: CHANGES.txt
core/src/java/org/apache/solr/handler/loader/JsonLoader.java
core/src/test/org/apache/solr/handler/JsonLoaderTest.java
Author: yonik
Date: Tue Jun 5 15:04:23 2012
New Revision: 1346407
URL: http://svn.apache.org/viewvc?rev=1346407&view=rev
Log:
SOLR-3508: Improve JSON update format for deletes
Modified:
lucene/dev/trunk/solr/CHANGES.txt
lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/loader/JsonLoader.java
lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/JsonLoaderTest.java
Modified: lucene/dev/trunk/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/CHANGES.txt?rev=1346407&r1=1346406&r2=1346407&view=diff
==============================================================================
--- lucene/dev/trunk/solr/CHANGES.txt (original)
+++ lucene/dev/trunk/solr/CHANGES.txt Tue Jun 5 15:04:23 2012
@@ -344,6 +344,12 @@ New Features
are combined and collations can contain a mix of corrections from both spellcheckers.
(James Dyer)
+* SOLR-3508: Improve JSON update format for deletes, allowing syntax of the form
+ {"delete":"myid"} AND
+ {"delete":["id1","id2"]}
+ (yonik)
+
+
Optimizations
----------------------
Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/loader/JsonLoader.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/loader/JsonLoader.java?rev=1346407&r1=1346406&r2=1346407&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/loader/JsonLoader.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/loader/JsonLoader.java Tue Jun 5 15:04:23 2012
@@ -23,7 +23,6 @@ import java.util.*;
import org.apache.commons.io.IOUtils;
import org.apache.noggit.JSONParser;
-import org.apache.noggit.JSONUtil;
import org.apache.noggit.ObjectBuilder;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.SolrInputDocument;
@@ -138,7 +137,7 @@ public class JsonLoader extends ContentS
processor.processCommit( cmd );
}
else if( v.equals( UpdateRequestHandler.DELETE ) ) {
- processor.processDelete( parseDelete() );
+ handleDeleteCommand();
}
else if( v.equals( UpdateRequestHandler.ROLLBACK ) ) {
processor.processRollback( parseRollback() );
@@ -171,15 +170,72 @@ public class JsonLoader extends ContentS
ev = parser.nextEvent();
}
}
-
- DeleteUpdateCommand parseDelete() throws IOException {
- assertNextEvent( JSONParser.OBJECT_START );
-
+
+ //
+ // "delete":"id"
+ // "delete":["id1","id2"]
+ // "delete":{"id":"foo"}
+ // "delete":{"query":"myquery"}
+ //
+ void handleDeleteCommand() throws IOException {
+ int ev = parser.nextEvent();
+ switch (ev) {
+ case JSONParser.ARRAY_START:
+ handleDeleteArray(ev);
+ break;
+ case JSONParser.OBJECT_START:
+ handleDeleteMap(ev);
+ break;
+ default:
+ handleSingleDelete(ev);
+ }
+ }
+
+ void handleSingleDelete(int ev) throws IOException {
DeleteUpdateCommand cmd = new DeleteUpdateCommand(req);
cmd.commitWithin = commitWithin;
-
+
+ String id = null;
+ switch (ev) {
+ case JSONParser.STRING:
+ id = parser.getString();
+ break;
+ case JSONParser.BIGNUMBER:
+ case JSONParser.NUMBER:
+ case JSONParser.LONG:
+ id = parser.getNumberChars().toString();
+ break;
+ case JSONParser.OBJECT_START:
+ handleDeleteMap(ev);
+ return;
+ default:
+ throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
+ "Got: "+JSONParser.getEventString( ev )
+ +" at ["+parser.getPosition()+"]" );
+ }
+
+ cmd.setId(id);
+ processor.processDelete(cmd);
+ }
+
+ void handleDeleteArray(int ev) throws IOException {
+ assert ev == JSONParser.ARRAY_START;
+
+ for (;;) {
+ ev = parser.nextEvent();
+ if (ev == JSONParser.ARRAY_END) return;
+ handleSingleDelete(ev);
+ }
+ }
+
+ void handleDeleteMap(int ev) throws IOException {
+ assert ev == JSONParser.OBJECT_START;
+
+ DeleteUpdateCommand cmd = new DeleteUpdateCommand(req);
+ cmd.commitWithin = commitWithin;
+
while( true ) {
- int ev = parser.nextEvent();
+ ev = parser.nextEvent();
if( ev == JSONParser.STRING ) {
String key = parser.getString();
if( parser.wasKey() ) {
@@ -189,7 +245,7 @@ public class JsonLoader extends ContentS
else if( "query".equals(key) ) {
cmd.setQuery(parser.getString());
}
- else if( "commitWithin".equals(key) ) {
+ else if( "commitWithin".equals(key) ) {
cmd.commitWithin = Integer.parseInt(parser.getString());
} else {
throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "Unknown key: "+key+" ["+parser.getPosition()+"]" );
@@ -197,23 +253,28 @@ public class JsonLoader extends ContentS
}
else {
throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
- "invalid string: " + key
- +" at ["+parser.getPosition()+"]" );
+ "invalid string: " + key
+ +" at ["+parser.getPosition()+"]" );
}
}
else if( ev == JSONParser.OBJECT_END ) {
if( cmd.getId() == null && cmd.getQuery() == null ) {
throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "Missing id or query for delete ["+parser.getPosition()+"]" );
}
- return cmd;
+
+ processor.processDelete(cmd);
+ return;
}
else {
throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
"Got: "+JSONParser.getEventString( ev )
- +" at ["+parser.getPosition()+"]" );
+ +" at ["+parser.getPosition()+"]" );
}
}
}
+
+
+
RollbackUpdateCommand parseRollback() throws IOException {
assertNextEvent( JSONParser.OBJECT_START );
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=1346407&r1=1346406&r2=1346407&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 Jun 5 15:04:23 2012
@@ -237,4 +237,44 @@ public class JsonLoaderTest extends Solr
);
}
+ // The delete syntax was both extended for simplification in 4.0
+ @Test
+ public void testDeleteSyntax() throws Exception {
+ String str = "{'delete':10"
+ +"\n ,'delete':'20'"
+ +"\n ,'delete':['30','40']"
+ + "\n}\n";
+ str = str.replace('\'', '"');
+ SolrQueryRequest req = req();
+ SolrQueryResponse rsp = new SolrQueryResponse();
+ BufferingRequestProcessor p = new BufferingRequestProcessor(null);
+ JsonLoader loader = new JsonLoader();
+ loader.load(req, rsp, new ContentStreamBase.StringStream(str), p);
+
+ // DELETE COMMANDS
+ assertEquals( 4, p.deleteCommands.size() );
+ DeleteUpdateCommand delete = p.deleteCommands.get( 0 );
+ assertEquals( delete.id, "10" );
+ assertEquals( delete.query, null );
+ assertEquals( delete.commitWithin, -1);
+
+ delete = p.deleteCommands.get( 1 );
+ assertEquals( delete.id, "20" );
+ assertEquals( delete.query, null );
+ assertEquals( delete.commitWithin, -1);
+
+ delete = p.deleteCommands.get( 2 );
+ assertEquals( delete.id, "30" );
+ assertEquals( delete.query, null );
+ assertEquals( delete.commitWithin, -1);
+
+ delete = p.deleteCommands.get( 3 );
+ assertEquals( delete.id, "40" );
+ assertEquals( delete.query, null );
+ assertEquals( delete.commitWithin, -1);
+
+ req.close();
+ }
+
+
}
\ No newline at end of file