lucene-solr-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Prasanna Ranganathan (JIRA)" <j...@apache.org>
Subject [jira] Updated: (SOLR-1870) 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)
Date Thu, 08 Apr 2010 19:35:36 GMT

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

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

    Component/s: clients - java
       Priority: Major  (was: Minor)

> 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: clients - java, update
>    Affects Versions: 1.4
>            Reporter: Prasanna Ranganathan
>
> 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.


Mime
View raw message