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 19:59:59 UTC

svn commit: r1346494 - 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 17:59:59 2012
New Revision: 1346494

URL: http://svn.apache.org/viewvc?rev=1346494&view=rev
Log:
SOLR-3508: allow _version_ on JSON delete cmd

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=1346494&r1=1346493&r2=1346494&view=diff
==============================================================================
--- lucene/dev/trunk/solr/CHANGES.txt (original)
+++ lucene/dev/trunk/solr/CHANGES.txt Tue Jun  5 17:59:59 2012
@@ -344,9 +344,11 @@ 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"]}
+* SOLR-3508: Simplify JSON update format for deletes as well as allow
+  version specification for optimistic locking.  Examples:
+    {"delete":"myid"}
+    {"delete":["id1","id2","id3"]}
+    {"delete":{"id":"myid", "_version_":123456789})
   (yonik)
 
 

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=1346494&r1=1346493&r2=1346494&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 17:59:59 2012
@@ -191,36 +191,41 @@ public class JsonLoader extends ContentS
       }
     }
 
-    void handleSingleDelete(int ev) throws IOException {
-      DeleteUpdateCommand cmd = new DeleteUpdateCommand(req);
-      cmd.commitWithin = commitWithin;
-
-      String id = null;
+    // returns the string value for a primitive value, or null for the null value
+    String getString(int ev) throws IOException {
       switch (ev) {
         case JSONParser.STRING:
-          id = parser.getString();
-          break;
+          return parser.getString();
         case JSONParser.BIGNUMBER:
         case JSONParser.NUMBER:
         case JSONParser.LONG:
-          id = parser.getNumberChars().toString();
-          break;
-        case JSONParser.OBJECT_START:
-          handleDeleteMap(ev);
-          return;
+          return parser.getNumberChars().toString();
+        case JSONParser.BOOLEAN:
+          return Boolean.toString(parser.getBoolean());
+        case JSONParser.NULL:
+          return null;
         default:
           throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
-              "Got: "+JSONParser.getEventString( ev  )
+              "Expected primitive JSON value but got: "+JSONParser.getEventString( ev  )
                   +" at ["+parser.getPosition()+"]" );
       }
+    }
+
 
-      cmd.setId(id);
-      processor.processDelete(cmd);
+    void handleSingleDelete(int ev) throws IOException {
+      if (ev == JSONParser.OBJECT_START) {
+        handleDeleteMap(ev);
+      } else {
+        DeleteUpdateCommand cmd = new DeleteUpdateCommand(req);
+        cmd.commitWithin = commitWithin;
+        String id = getString(ev);
+        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;
@@ -240,13 +245,13 @@ public class JsonLoader extends ContentS
           String key = parser.getString();
           if( parser.wasKey() ) {
             if( "id".equals( key ) ) {
-              cmd.setId(parser.getString());
-            }
-            else if( "query".equals(key) ) {
+              cmd.setId(getString(parser.nextEvent()));
+            } else if( "query".equals(key) ) {
               cmd.setQuery(parser.getString());
-            }
-            else if( "commitWithin".equals(key) ) {
-              cmd.commitWithin = Integer.parseInt(parser.getString());
+            } else if( "commitWithin".equals(key) ) {
+              cmd.commitWithin = (int)parser.getLong();
+            } else if( "_version_".equals(key) ) {
+              cmd.setVersion(parser.getLong());
             } else {
               throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "Unknown key: "+key+" ["+parser.getPosition()+"]" );
             }

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=1346494&r1=1346493&r2=1346494&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 17:59:59 2012
@@ -71,9 +71,9 @@ public class JsonLoaderTest extends Solr
       "'optimize': { 'waitSearcher':false, 'openSearcher':false },\n" +
       "\n" +
       "'delete': { 'id':'ID' },\n" +
-      "'delete': { 'id':'ID', 'commitWithin':'500' },\n" +
+      "'delete': { 'id':'ID', 'commitWithin':500 },\n" +
       "'delete': { 'query':'QUERY' },\n" +
-      "'delete': { 'query':'QUERY', 'commitWithin':'500' },\n" +
+      "'delete': { 'query':'QUERY', 'commitWithin':500 },\n" +
       "'rollback': {}\n" +
       "\n" +
       "}\n" +
@@ -243,6 +243,8 @@ public class JsonLoaderTest extends Solr
     String str = "{'delete':10"
         +"\n ,'delete':'20'"
         +"\n ,'delete':['30','40']"
+        +"\n ,'delete':{'id':50, '_version_':12345}"
+        +"\n ,'delete':[{'id':60, '_version_':67890}, {'id':70, '_version_':77777}, {'query':'id:80', '_version_':88888}]"
         + "\n}\n";
     str = str.replace('\'', '"');
     SolrQueryRequest req = req();
@@ -252,7 +254,7 @@ public class JsonLoaderTest extends Solr
     loader.load(req, rsp, new ContentStreamBase.StringStream(str), p);
 
     // DELETE COMMANDS
-    assertEquals( 4, p.deleteCommands.size() );
+    assertEquals( 8, p.deleteCommands.size() );
     DeleteUpdateCommand delete = p.deleteCommands.get( 0 );
     assertEquals( delete.id, "10" );
     assertEquals( delete.query, null );
@@ -273,6 +275,26 @@ public class JsonLoaderTest extends Solr
     assertEquals( delete.query, null );
     assertEquals( delete.commitWithin, -1);
 
+    delete = p.deleteCommands.get( 4 );
+    assertEquals( delete.id, "50" );
+    assertEquals( delete.query, null );
+    assertEquals( delete.getVersion(), 12345L);
+
+    delete = p.deleteCommands.get( 5 );
+    assertEquals( delete.id, "60" );
+    assertEquals( delete.query, null );
+    assertEquals( delete.getVersion(), 67890L);
+
+    delete = p.deleteCommands.get( 6 );
+    assertEquals( delete.id, "70" );
+    assertEquals( delete.query, null );
+    assertEquals( delete.getVersion(), 77777L);
+
+    delete = p.deleteCommands.get( 7 );
+    assertEquals( delete.id, null );
+    assertEquals( delete.query, "id:80" );
+    assertEquals( delete.getVersion(), 88888L);
+
     req.close();
   }