Thanks for your reply Alexandre.

I have "_root_" and "_nest_path_" fields in my schema but not
"_nest_parent_".


<!-- If you don't use child/nested documents, then you should remove the
next two fields:  -->
<!-- for nested documents (minimal; points to root document) -->
<field name="_root_" type="string" indexed="true" stored="true"
docValues="false" />
<!-- for nested documents (relationship tracking) -->
<field name="_nest_path_" type="_nest_path_" /><fieldType
name="_nest_path_" class="solr.NestPathField" />

I ran my test after adding the "_nest_parent_" field and I am not getting
NPE any more which is good. Thanks!

But looking at the documents in the index, I see that after the atomic
update, now there are two children documents with the same id. One document
has old values and another one has new values. Shouldn't they be merged
based on the "id"? Do we need to specify anything else in the request to
ensure that documents are merged/updated and not duplicated?

For your reference, below is the test I am running now.

            // update field of one child doc
            SolrInputDocument sdoc = new SolrInputDocument(  );
            sdoc.addField( "id", testChildPOJO.id() );
            sdoc.addField( "conceptid", testChildPOJO.conceptid() );
            sdoc.addField( "storeid", "foo" );
            sdoc.setField( "fieldName",
java.util.Collections.singletonMap("set", Collections.list("bar" ) ));

            final UpdateRequest req = new UpdateRequest();
            req.withRoute( pojo1.id() );    // parent id
            req.add(sdoc);

            collection.client.request( req, collection.getCollectionName()
);
            collection.client.commit();


Resulting documents :

{id=c1_child1, conceptid=c1, storeid=s1, fieldName=c1_child1_field_value1,
startTime=Mon Sep 07 12:40:37 EDT 2020, integerField_iDF=10,
booleanField_bDF=true, _root_=abcd, _version_=1678099970090074112}
{id=c1_child1, conceptid=c1, storeid=foo, fieldName=bar, startTime=Mon Sep
07 12:40:37 EDT 2020, integerField_iDF=10, booleanField_bDF=true,
_root_=abcd, _version_=1678099970405695488}






On Thu, Sep 17, 2020 at 12:01 PM Alexandre Rafalovitch <arafa...@gmail.com>
wrote:

> Can you double-check your schema to see if you have all the fields
> required to support nested documents. You are supposed to get away
> with just _root_, but really you should also include _nest_path and
> _nest_parent_. Your particular exception seems to be triggering
> something (maybe a bug) related to - possibly - missing _nest_path_
> field.
>
> See:
> https://lucene.apache.org/solr/guide/8_5/indexing-nested-documents.html#indexing-nested-documents
>
> Regards,
>    Alex.
>
> On Wed, 16 Sep 2020 at 13:28, Pratik Patel <pra...@semandex.net> wrote:
> >
> > Hello Everyone,
> >
> > I am trying to update a field of a child document using atomic updates
> > feature. I am using solr and solrJ version 8.5.0
> >
> > I have ensured that my schema satisfies the conditions for atomic updates
> > and I am able to do atomic updates on normal documents but with nested
> > child documents, I am getting a Null Pointer Exception. Following is the
> > simple test which I am trying.
> >
> > TestPojo      pojo1          = new TestPojo().cId( "abcd" )
> > >                                                  .conceptid( "c1" )
> > >                                                  .storeid( storeId )
> > >                                                  .testChildPojos(
> > > Collections.list( testChildPOJO, testChildPOJO2,
> > >
> testChildPOJO3 )
> > > );
> > > TestChildPOJO                testChildPOJO = new TestChildPOJO().cId(
> > > "c1_child1" )
> > >                                                       .conceptid( "c1"
> )
> > >                                                       .storeid(
> storeId )
> > >                                                       .fieldName(
> > > "c1_child1_field_value1" )
> > >                                                       .startTime(
> > > Date.from( now.minus( 10, ChronoUnit.DAYS ) ) )
> > >
>  .integerField_iDF(
> > > 10 )
> > >
> > > .booleanField_bDF(true);
> > > // index pojo1 with child testChildPOJO
> > > SolrInputDocument sdoc = new SolrInputDocument();
> > > sdoc.addField( "_route_", pojo1.cId() );
> > > sdoc.addField( "id", testChildPOJO.cId() );
> > > sdoc.addField( "conceptid", testChildPOJO.conceptid() );
> > > sdoc.addField( "storeid", testChildPOJO.cId() );
> > > sdoc.setField( "fieldName", java.util.Collections.singletonMap("set",
> > > Collections.list(testChildPOJO.fieldName() + postfix) ) ); // modify
> field
> > > "fieldName"
> > > collection.client.add( sdoc );   // results in NPE!
> >
> >
> > Stack Trace:
> >
> > ERROR org.apache.solr.client.solrj.impl.BaseCloudSolrClient - Request to
> > > collection [collectionTest2] failed due to (500)
> > > org.apache.solr.client.solrj.impl.HttpSolrClient$RemoteSolrException:
> Error
> > > from server at
> > > http://172.15.1.100:8081/solr/collectionTest2_shard1_replica_n1:
> > > java.lang.NullPointerException
> > > at
> > >
> org.apache.solr.update.processor.AtomicUpdateDocumentMerger.getFieldFromHierarchy(AtomicUpdateDocumentMerger.java:308)
> > > at
> > >
> org.apache.solr.update.processor.AtomicUpdateDocumentMerger.mergeChildDoc(AtomicUpdateDocumentMerger.java:405)
> > > at
> > >
> org.apache.solr.update.processor.DistributedUpdateProcessor.getUpdatedDocument(DistributedUpdateProcessor.java:711)
> > > at
> > >
> org.apache.solr.update.processor.DistributedUpdateProcessor.doVersionAdd(DistributedUpdateProcessor.java:374)
> > > at
> > >
> org.apache.solr.update.processor.DistributedUpdateProcessor.lambda$versionAdd$0(DistributedUpdateProcessor.java:339)
> > > at
> org.apache.solr.update.VersionBucket.runWithLock(VersionBucket.java:50)
> > > at
> > >
> org.apache.solr.update.processor.DistributedUpdateProcessor.versionAdd(DistributedUpdateProcessor.java:339)
> > > at
> > >
> org.apache.solr.update.processor.DistributedUpdateProcessor.processAdd(DistributedUpdateProcessor.java:225)
> > > at
> > >
> org.apache.solr.update.processor.DistributedZkUpdateProcessor.processAdd(DistributedZkUpdateProcessor.java:245)
> > > at
> > >
> org.apache.solr.update.processor.LogUpdateProcessorFactory$LogUpdateProcessor.processAdd(LogUpdateProcessorFactory.java:103)
> > > at
> > >
> org.apache.solr.handler.loader.JavabinLoader$1.update(JavabinLoader.java:110)
> > > at
> > >
> org.apache.solr.client.solrj.request.JavaBinUpdateRequestCodec$StreamingCodec.readOuterMostDocIterator(JavaBinUpdateRequestCodec.java:332)
> > > at
> > >
> org.apache.solr.client.solrj.request.JavaBinUpdateRequestCodec$StreamingCodec.readIterator(JavaBinUpdateRequestCodec.java:281)
> > > at
> > >
> org.apache.solr.common.util.JavaBinCodec.readObject(JavaBinCodec.java:338)
> > > at
> org.apache.solr.common.util.JavaBinCodec.readVal(JavaBinCodec.java:283)
> > > at
> > >
> org.apache.solr.client.solrj.request.JavaBinUpdateRequestCodec$StreamingCodec.readNamedList(JavaBinUpdateRequestCodec.java:236)
> > > at
> > >
> org.apache.solr.common.util.JavaBinCodec.readObject(JavaBinCodec.java:303)
> > > at
> org.apache.solr.common.util.JavaBinCodec.readVal(JavaBinCodec.java:283)
> > > at
> > >
> org.apache.solr.common.util.JavaBinCodec.unmarshal(JavaBinCodec.java:196)
> > > at
> > >
> org.apache.solr.client.solrj.request.JavaBinUpdateRequestCodec.unmarshal(JavaBinUpdateRequestCodec.java:127)
> > > at
> > >
> org.apache.solr.handler.loader.JavabinLoader.parseAndLoadDocs(JavabinLoader.java:122)
> > > at
> org.apache.solr.handler.loader.JavabinLoader.load(JavabinLoader.java:70)
> > > at
> > >
> org.apache.solr.handler.UpdateRequestHandler$1.load(UpdateRequestHandler.java:97)
> > > at
> > >
> org.apache.solr.handler.ContentStreamHandlerBase.handleRequestBody(ContentStreamHandlerBase.java:68)
> > > at
> > >
> org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:211)
> > > at org.apache.solr.core.SolrCore.execute(SolrCore.java:2596)
> > > at org.apache.solr.servlet.HttpSolrCall.execute(HttpSolrCall.java:802)
> > > at org.apache.solr.servlet.HttpSolrCall.call(HttpSolrCall.java:579)
> > > at
> > >
> org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:420)
> > > at
> > >
> org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:352)
> > > at
> > >
> org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1596)
> > > at
> > >
> org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:545)
> > > at
> > >
> org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
> > > at
> > >
> org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:590)
> > > at
> > >
> org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
> > > at
> > >
> org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:235)
> > > at
> > >
> org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1607)
> > > at
> > >
> org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233)
> > > at
> > >
> org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1297)
> > > at
> > >
> org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188)
> > > at
> > >
> org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:485)
> > > at
> > >
> org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1577)
> > > at
> > >
> org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186)
> > > at
> > >
> org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1212)
> > > at
> > >
> org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
> > > at
> > >
> org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:221)
> > > at
> > >
> org.eclipse.jetty.server.handler.InetAccessHandler.handle(InetAccessHandler.java:177)
> > > at
> > >
> org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:146)
> > > at
> > >
> org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
> > > at
> > >
> org.eclipse.jetty.rewrite.handler.RewriteHandler.handle(RewriteHandler.java:322)
> > > at
> > >
> org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
> > > at org.eclipse.jetty.server.Server.handle(Server.java:500)
> > > at
> > >
> org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:383)
> > > at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:547)
> > > at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:375)
> > > at
> > >
> org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:270)
> > > at
> > > org.eclipse.jetty.io
> .AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311)
> > > at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103)
> > > at org.eclipse.jetty.io
> .ChannelEndPoint$2.run(ChannelEndPoint.java:117)
> > > at
> > >
> org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:336)
> > > at
> > >
> org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:313)
> > > at
> > >
> org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:171)
> > > at
> > >
> org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:129)
> > > at
> > >
> org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:388)
> > > at
> > >
> org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:806)
> > > at
> > >
> org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:938)
> > > at java.lang.Thread.run(Thread.java:745)
> > > , retry=0 commError=false errorCode=500
> >
> >
> >
> >
> > I am able to add a parent child block successfully but with nested docs
> the
> > field update fails.  I saw a similar looking JIRA
> > https://issues.apache.org/jira/browse/SOLR-13523 but it looks like its
> > already fixed in 8.5.0.
> >
> > Any idea what's wrong here?
> >
> > Thanks.
>

Reply via email to