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: [email protected]
For additional commands, e-mail: [email protected]