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

Reply via email to