Github user moshebla commented on a diff in the pull request: https://github.com/apache/lucene-solr/pull/385#discussion_r192577005 --- Diff: solr/core/src/java/org/apache/solr/update/AddUpdateCommand.java --- @@ -175,69 +172,83 @@ public String getHashableId() { return id; } - public boolean isBlock() { - return solrDoc.hasChildDocuments(); + /** + * @return String id to hash + */ + public String getHashableId() { + return getHashableId(solrDoc); } - @Override - public Iterator<Document> iterator() { - return new Iterator<Document>() { - Iterator<SolrInputDocument> iter; - - { - List<SolrInputDocument> all = flatten(solrDoc); - - String idField = getHashableId(); - - boolean isVersion = version != 0; - - for (SolrInputDocument sdoc : all) { - sdoc.setField(IndexSchema.ROOT_FIELD_NAME, idField); - if(isVersion) sdoc.setField(CommonParams.VERSION_FIELD, version); - // TODO: if possible concurrent modification exception (if SolrInputDocument not cloned and is being forwarded to replicas) - // then we could add this field to the generated lucene document instead. - } - - iter = all.iterator(); - } + public List<SolrInputDocument> computeFlattenedDocs() { + List<SolrInputDocument> all = flatten(solrDoc); - @Override - public boolean hasNext() { - return iter.hasNext(); - } + String rootId = getHashableId(); - @Override - public Document next() { - return DocumentBuilder.toDocument(iter.next(), req.getSchema()); - } + boolean isVersion = version != 0; - @Override - public void remove() { - throw new UnsupportedOperationException(); + for (SolrInputDocument sdoc : all) { + if (all.size() > 1) { + sdoc.setField(IndexSchema.ROOT_FIELD_NAME, rootId); } - }; + if(isVersion) sdoc.setField(CommonParams.VERSION_FIELD, version); + // TODO: if possible concurrent modification exception (if SolrInputDocument not cloned and is being forwarded to replicas) + // then we could add this field to the generated lucene document instead. + } + return all; } private List<SolrInputDocument> flatten(SolrInputDocument root) { List<SolrInputDocument> unwrappedDocs = new ArrayList<>(); - recUnwrapp(unwrappedDocs, root); + recUnwrapAnonymous(unwrappedDocs, root, true); + recUnwrapRelations(unwrappedDocs, root, true); if (1 < unwrappedDocs.size() && ! req.getSchema().isUsableForChildDocs()) { throw new SolrException (SolrException.ErrorCode.BAD_REQUEST, "Unable to index docs with children: the schema must " + "include definitions for both a uniqueKey field and the '" + IndexSchema.ROOT_FIELD_NAME + "' field, using the exact same fieldType"); } + unwrappedDocs.add(root); return unwrappedDocs; } - private void recUnwrapp(List<SolrInputDocument> unwrappedDocs, SolrInputDocument currentDoc) { + /** Extract all child documents from parent that are saved in keys. */ + private void recUnwrapRelations(List<SolrInputDocument> unwrappedDocs, SolrInputDocument currentDoc, boolean isRoot) { + for (SolrInputField field: currentDoc.values()) { + Object value = field.getFirstValue(); + // check if value is a childDocument + if (value instanceof SolrInputDocument) { + Object val = field.getValue(); + if (!(val instanceof Collection)) { + recUnwrapRelations(unwrappedDocs, ((SolrInputDocument) val)); + continue; + } + Collection<SolrInputDocument> childrenList = ((Collection) val); + for (SolrInputDocument child : childrenList) { + recUnwrapRelations(unwrappedDocs, child); + } + } + } + --- End diff -- True, never mind.
--- --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@lucene.apache.org For additional commands, e-mail: dev-h...@lucene.apache.org