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 {