[ 
https://issues.apache.org/jira/browse/SOLR-1870?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Prasanna Ranganathan updated SOLR-1870:
---------------------------------------

    Summary: Binary Update Request (javabin) fails when the field type of a 
multivalued SolrInputDocument field is a Set (or any type that is identified as 
an instance of iterable)   (was: JavaBinUpdateRequestCodec (and javabin codec) 
fails when the field type of a multivalued field is a Set (or any type that is 
identified as an instance of iterable) )

> Binary Update Request (javabin) fails when the field type of a multivalued 
> SolrInputDocument field is a Set (or any type that is identified as an 
> instance of iterable) 
> ------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: SOLR-1870
>                 URL: https://issues.apache.org/jira/browse/SOLR-1870
>             Project: Solr
>          Issue Type: Bug
>          Components: update
>    Affects Versions: 1.4
>            Reporter: Prasanna Ranganathan
>            Priority: Minor
>
> When the field type of a field in a SolrInputDocument is a Collection based 
> on the Set interface, the JavaBinUpdate request fails. It works when sending 
> the document data over XML.
> I encountered this error when updating my indexer to write documents in the 
> binary format. I initially got a ClassCastException and after digging into it 
> found the likely cause for it.
> The following piece of code added to 'public void simple() throws 
> IOException' method in TestUpdateRequestCodec.java illustrates the error.
>     doc = new SolrInputDocument(); 
>     Collection<String> foobar = new HashSet<String>();
>     foobar.add("baz1");
>     foobar.add("baz2");    
>     doc.addField("foobar",foobar);
>     updateRequest.add(doc);
>  The test fails for any Collection derived from the Set interface but will 
> work if the Collection is a List / Array or other types. The stack trace is 
> as follows:
>  java.lang.ClassCastException: java.lang.String
>       at 
> org.apache.solr.client.solrj.request.JavaBinUpdateRequestCodec$2.readIterator(JavaBinUpdateRequestCodec.java:121)
>       at 
> org.apache.solr.common.util.JavaBinCodec.readVal(JavaBinCodec.java:210)
>       at 
> org.apache.solr.client.solrj.request.JavaBinUpdateRequestCodec$2.readNamedList(JavaBinUpdateRequestCodec.java:107)
>       at 
> org.apache.solr.common.util.JavaBinCodec.readVal(JavaBinCodec.java:175)
>       at 
> org.apache.solr.common.util.JavaBinCodec.readArray(JavaBinCodec.java:405)
>       at 
> org.apache.solr.common.util.JavaBinCodec.readVal(JavaBinCodec.java:171)
>       at 
> org.apache.solr.client.solrj.request.JavaBinUpdateRequestCodec$2.readIterator(JavaBinUpdateRequestCodec.java:119)
>       at 
> org.apache.solr.common.util.JavaBinCodec.readVal(JavaBinCodec.java:210)
>       at 
> org.apache.solr.client.solrj.request.JavaBinUpdateRequestCodec$2.readNamedList(JavaBinUpdateRequestCodec.java:107)
>       at 
> org.apache.solr.common.util.JavaBinCodec.readVal(JavaBinCodec.java:175)
>       at 
> org.apache.solr.common.util.JavaBinCodec.unmarshal(JavaBinCodec.java:101)
>       at 
> org.apache.solr.client.solrj.request.JavaBinUpdateRequestCodec.unmarshal(JavaBinUpdateRequestCodec.java:126)
>       at 
> org.apache.solr.client.solrj.request.TestUpdateRequestCodec.simple(TestUpdateRequestCodec.java:82)
>       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>       at 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>       at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>       at 
> org.junit.internal.runners.TestMethodRunner.executeMethodBody(TestMethodRunner.java:99)
>       at 
> org.junit.internal.runners.TestMethodRunner.runUnprotected(TestMethodRunner.java:81)
>       at 
> org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
>       at 
> org.junit.internal.runners.TestMethodRunner.runMethod(TestMethodRunner.java:75)
>       at 
> org.junit.internal.runners.TestMethodRunner.run(TestMethodRunner.java:45)
>       at 
> org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod(TestClassMethodsRunner.java:66)
>       at 
> org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRunner.java:35)
>       at 
> org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42)
>       at 
> org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
>       at 
> org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52)
>       at com.intellij.rt.junit4.Junit4ClassSuite.run(Junit4ClassSuite.java:99)
>       at 
> com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:40)
>  The error most likely is in the way javabin codec encodes Sets. In the 
> public boolean writeKnownType(Object val) method in JavaBinCodec.java, a Set 
> is recognized as an instance of iterable and the writeIterator method is 
> called. 
>  I briefly looked at the writeIterator and readIterator methods and was 
> unable to pinpoint the error. I also looked at the javabin encoded byte 
> stream (not exactly a good way to debug..) and it did not look like it was 
> right. 

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to