Fix broken parent and child aggregator (backport #63811) (#63892)

In #57892 I broke *some* sub-aggregations inside of the `parent` and
`child` aggregator, specifically any sub-aggregations that do work in
the `postCollect` phase. This fixes it by delaying the post collect
phase of aggs under `parent` and `child` until `beforeBuildingBuckets`
because, well, we haven't done *any* collection until after that phase.
This commit is contained in:
Nik Everett 2020-10-19 13:05:22 -04:00 committed by GitHub
parent c28c3422bb
commit 5583db5a73
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 147 additions and 66 deletions

View File

@ -27,6 +27,6 @@ esplugin {
restResources {
restApi {
includeCore '_common', 'cluster', 'nodes', 'indices', 'index', 'search'
includeCore '_common', 'bulk', 'cluster', 'nodes', 'indices', 'index', 'search'
}
}

View File

@ -112,6 +112,11 @@ public abstract class ParentJoinAggregator extends BucketsAggregator implements
};
}
@Override
public void postCollection() throws IOException {
// Delaying until beforeBuildingBuckets
}
@Override
protected void beforeBuildingBuckets(long[] ordsToCollect) throws IOException {
IndexReader indexReader = context().searcher().getIndexReader();
@ -162,6 +167,7 @@ public abstract class ParentJoinAggregator extends BucketsAggregator implements
}
}
}
super.postCollection(); // Run post collection after collecting the sub-aggs
}
@Override

View File

@ -1,24 +0,0 @@
---
"unconfigured":
- do:
index:
index: test
refresh: true
body:
join:
name: question
body: <p>I have Windows 2003 server and i bought a new Windows 2008 server...,
title: Whats the best way to file transfer my site from server to a newer one?,
tags: [windows-server-2003, windows-server-2008, file-transfer]
- do:
search:
index: test
body:
size: 0
aggs:
to-answers:
children:
type: answer
- match: { hits.total.value: 1 }
- match: { aggregations.to-answers.doc_count: 0 }

View File

@ -3,53 +3,30 @@ setup:
indices.create:
index: test
body:
settings:
number_of_shards: 2 #Two shards proves that we route properly
mappings:
properties:
join_field: { "type": "join", "relations": { "parent": "child", "child": "grand_child" } }
id: { "type": "keyword" }
- do:
index:
bulk:
index: test
id: 1
body: { "id", "1", "join_field": { "name": "parent" } }
- do:
index:
index: test
id: 2
body: { "id", "2", "join_field": { "name": "parent" } }
- do:
index:
index: test
id: 3
routing: 1
body: { "id", "3", "join_field": { "name": "child", "parent": "1" } }
- do:
index:
index: test
id: 4
routing: 1
body: { "id", "4", "join_field": { "name": "child", "parent": "1" } }
- do:
index:
index: test
id: 5
routing: 1
body: { "id", "5", "join_field": { "name": "child", "parent": "2" } }
- do:
index:
index: test
id: 6
routing: 1
body: { "id", "6", "join_field": { "name": "grand_child", "parent": "5" } }
- do:
indices.refresh: {}
refresh: true
body:
- '{ "index": {"_id": "1"}}'
- '{ "id": 1, "join_field": { "name": "parent" } }'
- '{ "index": {"_id": "2"}}'
- '{ "id": 2, "join_field": { "name": "parent" } }'
- '{ "index": {"_id": "3", "routing": "1"}}'
- '{ "id": 3, "join_field": { "name": "child", "parent": "1" } }'
- '{ "index": {"_id": "4", "routing": "1"}}'
- '{ "id": 4, "join_field": { "name": "child", "parent": "1" } }'
- '{ "index": {"_id": "5", "routing": "2"}}'
- '{ "id": 5, "join_field": { "name": "child", "parent": "2" } }'
- '{ "index": {"_id": "6", "routing": "1"}}'
- '{ "id": 6, "join_field": { "name": "grand_child", "parent": "5" } }'
---
teardown:

View File

@ -0,0 +1,119 @@
setup:
- do:
indices.create:
index: test
body:
settings:
number_of_shards: 2 #Two shards proves that we route properly
mappings:
properties:
join_field: { "type": "join", "relations": { "parent": "child", "child": "grand_child" } }
id: { "type": "keyword" }
- do:
bulk:
index: test
refresh: true
body:
- '{ "index": {"_id": "1"}}'
- '{ "tag": "bump", "join_field": { "name": "parent" } }'
- '{ "index": {"_id": "2"}}'
- '{ "tag": "jumble", "join_field": { "name": "parent" } }'
- '{ "index": {"_id": "3", "routing": "1"}}'
- '{ "animal": "dog", "join_field": { "name": "child", "parent": "1" } }'
- '{ "index": {"_id": "4", "routing": "1"}}'
- '{ "animal": "cat", "join_field": { "name": "child", "parent": "1" } }'
- '{ "index": {"_id": "5", "routing": "2"}}'
- '{ "animal": "dog", "join_field": { "name": "child", "parent": "2" } }'
- '{ "index": {"_id": "6", "routing": "1"}}'
- '{ "join_field": { "name": "grand_child", "parent": "5" } }'
---
unconfigured:
- do:
index:
index: test_unconfigured
refresh: true
body:
join:
name: question
body: <p>I have Windows 2003 server and i bought a new Windows 2008 server...,
title: Whats the best way to file transfer my site from server to a newer one?,
tags: [windows-server-2003, windows-server-2008, file-transfer]
- do:
search:
index: test_unconfigured
body:
size: 0
aggs:
to-answers:
children:
type: answer
- match: { hits.total.value: 1 }
- match: { aggregations.to-answers.doc_count: 0 }
---
children:
- do:
search:
index: test
body:
size: 0
aggs:
children:
children:
type: child
- match: { hits.total.value: 6 }
- match: { aggregations.children.doc_count: 3 }
---
children containing cardinality:
- do:
search:
index: test
body:
size: 0
aggs:
children:
children:
type: child
aggs:
cardinality:
cardinality:
field: animal.keyword
- match: { hits.total.value: 6 }
- match: { aggregations.children.doc_count: 3 }
- match: { aggregations.children.cardinality.value: 2 }
---
parent:
- do:
search:
index: test
body:
size: 0
aggs:
parent:
parent:
type: child
- match: { hits.total.value: 6 }
- match: { aggregations.parent.doc_count: 2 }
---
parent cardinality:
- do:
search:
index: test
body:
size: 0
aggs:
parent:
parent:
type: child
aggs:
cardinality:
cardinality:
field: tag.keyword
- match: { hits.total.value: 6 }
- match: { aggregations.parent.doc_count: 2 }

View File

@ -250,9 +250,12 @@ public abstract class AggregatorBase extends Aggregator {
/**
* Called after collection of all document is done.
* <p>
* Warning: this is not final only to allow the parent join aggregator
* to delay this until building buckets.
*/
@Override
public final void postCollection() throws IOException {
public void postCollection() throws IOException {
// post-collect this agg before subs to make it possible to buffer and then replay in postCollection()
doPostCollection();
collectableSubAggregators.postCollection();