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