You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by sa...@apache.org on 2013/06/05 17:27:31 UTC

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

Author: sarowe
Date: Wed Jun  5 15:27:31 2013
New Revision: 1489914

URL: http://svn.apache.org/r1489914
Log:
SOLR-4891: Fix corruption of BigInteger values

Modified:
    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/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=1489914&r1=1489913&r2=1489914&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 Wed Jun  5 15:27:31 2013
@@ -19,15 +19,20 @@ package org.apache.solr.handler.loader;
 import java.io.IOException;
 import java.io.Reader;
 import java.io.StringReader;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
 
 import org.apache.commons.io.IOUtils;
+import org.apache.solr.common.params.SolrParams;
+import org.apache.solr.common.params.UpdateParams;
 import org.noggit.JSONParser;
 import org.noggit.ObjectBuilder;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.common.SolrInputField;
-import org.apache.solr.common.params.*;
 import org.apache.solr.common.util.ContentStream;
 import org.apache.solr.handler.RequestHandlerUtils;
 import org.apache.solr.handler.UpdateRequestHandler;
@@ -516,7 +521,7 @@ public class JsonLoader extends ContentS
         case JSONParser.NUMBER:
           return parser.getDouble();
         case JSONParser.BIGNUMBER:
-          return (new ObjectBuilder(parser)).getBigNumber();
+          return parser.getNumberChars().toString();
         case JSONParser.BOOLEAN:
           return parser.getBoolean();
         case JSONParser.NULL:

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=1489914&r1=1489913&r2=1489914&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 Wed Jun  5 15:27:31 2013
@@ -18,6 +18,7 @@
 package org.apache.solr.handler;
 
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.common.SolrInputField;
 import org.apache.solr.common.util.ContentStreamBase;
@@ -30,6 +31,7 @@ import org.apache.solr.update.DeleteUpda
 import org.apache.solr.update.processor.BufferingRequestProcessor;
 import org.junit.BeforeClass;
 import org.junit.Test;
+import org.xml.sax.SAXException;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
@@ -334,15 +336,15 @@ public class JsonLoaderTest extends Solr
     AddUpdateCommand add = p.addCommands.get(0);
     SolrInputDocument d = add.solrDoc;
     SolrInputField f = d.getField("bd1");                        
-    assertTrue(f.getValue() instanceof BigDecimal);
-    assertEquals(new BigDecimal("0.12345678901234567890123456789012345"), f.getValue());
+    assertTrue(f.getValue() instanceof String);
+    assertEquals("0.12345678901234567890123456789012345", f.getValue());
     f = d.getField("bd2");
-    assertTrue(f.getValue() instanceof BigDecimal);
-    assertEquals(new BigDecimal("12345678901234567890.12345678901234567890"), f.getValue());
+    assertTrue(f.getValue() instanceof String);
+    assertEquals("12345678901234567890.12345678901234567890", f.getValue());
     f = d.getField("bd3");
     assertEquals(2, ((List)f.getValue()).size());
-    assertTrue(((List)f.getValue()).contains(new BigDecimal("0.012345678901234567890123456789012345")));
-    assertTrue(((List)f.getValue()).contains(new BigDecimal("123456789012345678900.012345678901234567890")));
+    assertTrue(((List)f.getValue()).contains("0.012345678901234567890123456789012345"));
+    assertTrue(((List)f.getValue()).contains("123456789012345678900.012345678901234567890"));
 
     req.close();
   }
@@ -362,15 +364,15 @@ public class JsonLoaderTest extends Solr
     AddUpdateCommand add = p.addCommands.get(0);
     SolrInputDocument d = add.solrDoc;
     SolrInputField f = d.getField("bi1");
-    assertTrue(f.getValue() instanceof BigInteger);
-    assertEquals(new BigInteger("123456789012345678901"), f.getValue());
+    assertTrue(f.getValue() instanceof String);
+    assertEquals("123456789012345678901", f.getValue());
     f = d.getField("bi2");
-    assertTrue(f.getValue() instanceof BigInteger);
-    assertEquals(new BigInteger("1098765432109876543210"), f.getValue());
+    assertTrue(f.getValue() instanceof String);
+    assertEquals("1098765432109876543210", f.getValue());
     f = d.getField("bi3");
     assertEquals(2, ((List)f.getValue()).size());
-    assertTrue(((List)f.getValue()).contains(new BigInteger("1234567890123456789012")));
-    assertTrue(((List)f.getValue()).contains(new BigInteger("10987654321098765432109")));
+    assertTrue(((List)f.getValue()).contains("1234567890123456789012"));
+    assertTrue(((List)f.getValue()).contains("10987654321098765432109"));
 
     req.close();
   }
@@ -389,6 +391,49 @@ public class JsonLoaderTest extends Solr
   }
 
 
+  @Test
+  public void testAddBigIntegerValueToTrieField() throws Exception {
+    // Adding a BigInteger to a long field should fail
+    // BigInteger.longValue() returns only the low-order 64 bits.
+    try {
+      updateJ(("[{'id':'1','big_integer_tl':12345678901234567890}]").replace('\'', '"'), null);
+      fail("A BigInteger value should overflow a long field");
+    } catch (SolrException e) {
+      if ( ! (e.getCause() instanceof NumberFormatException)) {
+        throw e;
+      }
+    }
+
+    // Adding a BigInteger to an integer field should fail
+    // BigInteger.intValue() returns only the low-order 32 bits.
+    try {
+      updateJ(("[{'id':'1','big_integer_ti':12345678901234567890}]").replace('\'', '"'), null);
+      fail("A BigInteger value should overflow an integer field");
+    } catch (SolrException e) {
+      if ( ! (e.getCause() instanceof NumberFormatException)) {
+        throw e;
+      }
+    }
+
+  }
+
+  @Test
+  public void testAddBigDecimalValueToTrieField() throws Exception {
+    // Adding a BigDecimal to a double field should succeed by reducing precision
+    updateJ(("[{'id':'1','big_decimal_td':100000000000000000000000000001234567890.0987654321}]").replace('\'', '"'),
+            params("commit", "true"));
+    assertJQ(req("q","id:1", "fl","big_decimal_td"), 
+             "/response/docs/[0]=={'big_decimal_td':[1.0E38]}"
+    );
+
+    // Adding a BigDecimal to a float field should succeed by reducing precision
+    updateJ(("[{'id':'2','big_decimal_tf':100000000000000000000000000001234567890.0987654321}]").replace('\'', '"'),
+            params("commit", "true"));
+    assertJQ(req("q","id:2", "fl","big_decimal_tf"),
+             "/response/docs/[0]=={'big_decimal_tf':[1.0E38]}"
+    );
+  }
+
   // The delete syntax was both extended for simplification in 4.0
   @Test
   public void testDeleteSyntax() throws Exception {