You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@lucene.apache.org by moshebla <gi...@git.apache.org> on 2018/06/03 04:45:43 UTC
[GitHub] lucene-solr pull request #385: WIP: SOLR-12361
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-unsubscribe@lucene.apache.org
For additional commands, e-mail: dev-help@lucene.apache.org