Github user dsmiley commented on a diff in the pull request:

    https://github.com/apache/lucene-solr/pull/455#discussion_r224306892
  
    --- Diff: 
solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java
 ---
    @@ -1360,24 +1385,47 @@ boolean getUpdatedDocument(AddUpdateCommand cmd, 
long versionOnUpdate) throws IO
         }
         
         // full (non-inplace) atomic update
    +    final boolean isNestedSchema = req.getSchema().isUsableForChildDocs();
         SolrInputDocument sdoc = cmd.getSolrInputDocument();
         BytesRef id = cmd.getIndexedId();
    -    SolrInputDocument oldDoc = 
RealTimeGetComponent.getInputDocument(cmd.getReq().getCore(), id);
    +    SolrInputDocument blockDoc = 
RealTimeGetComponent.getInputDocument(cmd.getReq().getCore(), id, null,
    +        false, null, true, true);
     
    -    if (oldDoc == null) {
    -      // create a new doc by default if an old one wasn't found
    -      if (versionOnUpdate <= 0) {
    -        oldDoc = new SolrInputDocument();
    -      } else {
    +    if (blockDoc == null) {
    +      if (versionOnUpdate > 0) {
             // could just let the optimistic locking throw the error
             throw new SolrException(ErrorCode.CONFLICT, "Document not found 
for update.  id=" + cmd.getPrintableId());
           }
         } else {
    -      oldDoc.remove(CommonParams.VERSION_FIELD);
    +      blockDoc.remove(CommonParams.VERSION_FIELD);
         }
     
     
    -    cmd.solrDoc = docMerger.merge(sdoc, oldDoc);
    +    SolrInputDocument mergedDoc;
    +    if(idField == null || blockDoc == null) {
    +      // create a new doc by default if an old one wasn't found
    +      mergedDoc = docMerger.merge(sdoc, new SolrInputDocument());
    +    } else {
    +      if(isNestedSchema && 
req.getSchema().hasExplicitField(IndexSchema.NEST_PATH_FIELD_NAME) &&
    +          blockDoc.containsKey(IndexSchema.ROOT_FIELD_NAME) && 
!id.utf8ToString().equals(blockDoc.getFieldValue(IndexSchema.ROOT_FIELD_NAME))) 
{
    --- End diff --
    
    I don't think we can assume id.utf8ToString() is correct.  I think we have 
to consult the corresponding FieldType to get the "external value".  Also, cast 
blockDoc.getFieldValue as a String to make it clear we expected it to be one.


---

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@lucene.apache.org
For additional commands, e-mail: dev-h...@lucene.apache.org

Reply via email to