Looking at some other unit tests in repo, I tried an approach using UpdateRequest as follows.
SolrInputDocument sdoc = new SolrInputDocument( ); > sdoc.addField( "id", testChildPOJO.id() ); > sdoc.setField( "fieldName", > java.util.Collections.singletonMap("set", testChildPOJO.fieldName() + > postfix) ); > final UpdateRequest req = new UpdateRequest(); > req.withRoute( pojo1.id() ); > req.add(sdoc); > > collection.client.request( req, collection.getCollectionName() > ); > req.commit( collection.client, collection.getCollectionName()); But this also results in the SAME Null Pointer Exception. Looking at the source code, it looks like "fieldPath" is null below. > AtomicUpdateDocumentMerger.getFieldFromHierarchy(SolrInputDocument > completeHierarchy, String fieldPath) { > final List<String> docPaths = > StrUtils.splitSmart(fieldPath.substring(1), '/'); > ...... > } Any idea what's wrong here? Thanks On Wed, Sep 16, 2020 at 1:27 PM 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. > >