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 2011/08/30 22:46:25 UTC

svn commit: r1163370 - in /lucene/dev/trunk/solr: CHANGES.txt core/src/java/org/apache/solr/handler/JsonLoader.java core/src/test/org/apache/solr/handler/JsonLoaderTest.java

Author: yonik
Date: Tue Aug 30 20:46:24 2011
New Revision: 1163370

URL: http://svn.apache.org/viewvc?rev=1163370&view=rev
Log:
SOLR-2714: drop null field values in json update format

Modified:
    lucene/dev/trunk/solr/CHANGES.txt
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/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=1163370&r1=1163369&r2=1163370&view=diff
==============================================================================
--- lucene/dev/trunk/solr/CHANGES.txt (original)
+++ lucene/dev/trunk/solr/CHANGES.txt Tue Aug 30 20:46:24 2011
@@ -382,6 +382,10 @@ New Features
   specified when CREATEing a new SolrCore using property.* request
   params.  (Yury Kats, hossman)
 
+* SOLR-2714: JSON update format - "null" field values are now dropped
+  instead of causing an exception. (Trygve Laugstøl, yonik)
+
+
 Optimizations
 ----------------------
 

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=1163370&r1=1163369&r2=1163370&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 Aug 30 20:46:24 2011
@@ -132,6 +132,7 @@ class JsonLoader extends ContentStreamLo
       case JSONParser.NUMBER:
       case JSONParser.BIGNUMBER:
       case JSONParser.BOOLEAN:
+      case JSONParser.NULL:
         log.info( "can't have a value here! "
             +JSONParser.getEventString(ev)+" "+parser.getPosition() );
         
@@ -321,7 +322,7 @@ class JsonLoader extends ContentStreamLo
     Stack<Object> stack = new Stack<Object>();
     Object obj = null;
     boolean inArray = false;
-    
+
     if( ev != JSONParser.OBJECT_START ) {
       throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "object should already be started" );
     }
@@ -343,7 +344,7 @@ class JsonLoader extends ContentStreamLo
                     ev != JSONParser.BIGNUMBER ) {
                   throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "boost should have number! "+JSONParser.getEventString(ev) );
                 }
-                field.setBoost( Float.valueOf( parser.getNumberChars().toString() ) );
+                field.setBoost((float)parser.getDouble());
               }
               else if( "value".equals( v  ) ) {
                 // nothing special...
@@ -380,7 +381,25 @@ class JsonLoader extends ContentStreamLo
         case JSONParser.BOOLEAN:
           addValToField(stack, parser.getBoolean(),inArray, parser);
           break;
-          
+
+        case JSONParser.NULL:
+          parser.getNull();
+          /*** if we wanted to remove the field from the document now...
+          if (!inArray) {
+            Object o = stack.peek();
+            // if null was only value in the field, then remove the field
+            if (o instanceof SolrInputField) {
+              SolrInputField sif = (SolrInputField)o;
+              if (sif.getValueCount() == 0) {
+                sdoc.remove(sif.getName());
+              }
+            }
+          }
+          ***/
+
+          addValToField(stack, null, inArray, parser);
+          break;
+
         case JSONParser.OBJECT_START:
           if( stack.isEmpty() ) {
             stack.push( new SolrInputDocument() );
@@ -395,7 +414,6 @@ class JsonLoader extends ContentStreamLo
             }
           }
           break;
-          
         case JSONParser.OBJECT_END:
           obj = stack.pop();
           if( obj instanceof SolrInputDocument ) {
@@ -436,11 +454,13 @@ class JsonLoader extends ContentStreamLo
     if( !(obj instanceof SolrInputField) ) {
       throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "hymmm ["+parser.getPosition()+"]" );
     }
-    
+
     SolrInputField f = inArray
       ? (SolrInputField)obj
       : (SolrInputField)stack.pop();
-   
+
+    if (val == null) return;
+
     float boost = (f.getValue()==null)?f.getBoost():1.0f;
     f.addValue( val,boost );
   }

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=1163370&r1=1163369&r2=1163370&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 Aug 30 20:46:24 2011
@@ -34,6 +34,7 @@ import org.apache.solr.update.DeleteUpda
 import org.apache.solr.update.RollbackUpdateCommand;
 import org.apache.solr.update.processor.UpdateRequestProcessor;
 import org.junit.BeforeClass;
+import org.junit.Test;
 
 public class JsonLoaderTest extends SolrTestCaseJ4 {
   @BeforeClass
@@ -64,7 +65,8 @@ public class JsonLoaderTest extends Solr
       "  'boost': 3.45,\n" +
       "  'doc': {\n" +
       "    'f1': 'v1',\n" +
-      "    'f1': 'v2'\n" +
+      "    'f1': 'v2',\n" +
+      "    'f2': null\n" +
       "  }\n" +
       "},\n" +
       "\n" +
@@ -102,7 +104,8 @@ public class JsonLoaderTest extends Solr
     assertEquals(2, f.getValues().size());
     assertEquals(3.45f, d.getDocumentBoost());
     assertEquals(false, add.overwrite);
-    
+
+    assertEquals(0, d.getField("f2").getValueCount());
 
     // parse the commit commands
     assertEquals( 2, p.commitCommands.size() );
@@ -188,6 +191,14 @@ public class JsonLoaderTest extends Solr
     req.close();
   }
 
+  @Test
+  public void testNullValues() throws Exception {
+    updateJ("[{'id':'10','foo_s':null,'foo2_s':['hi',null,'there']}]".replace('\'', '"'), params("commit","true"));
+    assertJQ(req("q","id:10", "fl","foo_s,foo2_s")
+        ,"/response/docs/[0]=={'foo2_s':['hi','there']}"
+    );
+  }
+
 }