Skip to content

Commit 932871c

Browse files
committed
Allow multiple inner hits with CollapseBuilder
The `CollapseBuilder` now accepts multiple inner hits. Close #1553
1 parent 6a274a2 commit 932871c

File tree

2 files changed

+35
-11
lines changed

2 files changed

+35
-11
lines changed

search_collapse_builder.go

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ package elastic
99
// for details.
1010
type CollapseBuilder struct {
1111
field string
12-
innerHit *InnerHit
12+
innerHits []*InnerHit
1313
maxConcurrentGroupRequests *int
1414
}
1515

@@ -25,8 +25,8 @@ func (b *CollapseBuilder) Field(field string) *CollapseBuilder {
2525
}
2626

2727
// InnerHit option to expand the collapsed results.
28-
func (b *CollapseBuilder) InnerHit(innerHit *InnerHit) *CollapseBuilder {
29-
b.innerHit = innerHit
28+
func (b *CollapseBuilder) InnerHit(innerHits ...*InnerHit) *CollapseBuilder {
29+
b.innerHits = append(b.innerHits, innerHits...)
3030
return b
3131
}
3232

@@ -41,23 +41,27 @@ func (b *CollapseBuilder) MaxConcurrentGroupRequests(max int) *CollapseBuilder {
4141
func (b *CollapseBuilder) Source() (interface{}, error) {
4242
// {
4343
// "field": "user",
44-
// "inner_hits": {
44+
// "inner_hits": [{
4545
// "name": "last_tweets",
4646
// "size": 5,
4747
// "sort": [{ "date": "asc" }]
48-
// },
48+
// }],
4949
// "max_concurrent_group_searches": 4
5050
// }
5151
src := map[string]interface{}{
5252
"field": b.field,
5353
}
5454

55-
if b.innerHit != nil {
56-
hits, err := b.innerHit.Source()
57-
if err != nil {
58-
return nil, err
55+
if len(b.innerHits) > 0 {
56+
var innerHits []interface{}
57+
for _, h := range b.innerHits {
58+
hits, err := h.Source()
59+
if err != nil {
60+
return nil, err
61+
}
62+
innerHits = append(innerHits, hits)
5963
}
60-
src["inner_hits"] = hits
64+
src["inner_hits"] = innerHits
6165
}
6266

6367
if b.maxConcurrentGroupRequests != nil {

search_collapse_builder_test.go

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,27 @@ func TestCollapseBuilderSource(t *testing.T) {
2222
t.Fatalf("marshaling to JSON failed: %v", err)
2323
}
2424
got := string(data)
25-
expected := `{"field":"user","inner_hits":{"name":"last_tweets","size":5,"sort":[{"date":{"order":"asc"}}]},"max_concurrent_group_searches":4}`
25+
expected := `{"field":"user","inner_hits":[{"name":"last_tweets","size":5,"sort":[{"date":{"order":"asc"}}]}],"max_concurrent_group_searches":4}`
26+
if got != expected {
27+
t.Errorf("expected\n%s\n,got:\n%s", expected, got)
28+
}
29+
}
30+
31+
func TestCollapseBuilderSourceMultipleInnerHits(t *testing.T) {
32+
b := NewCollapseBuilder("user.id").
33+
InnerHit(NewInnerHit().Name("largest_responses").Size(3).Sort("http.response.bytes", false)).
34+
InnerHit(NewInnerHit().Name("most_recent").Size(4).Sort("@timestamp", false)).
35+
MaxConcurrentGroupRequests(5)
36+
src, err := b.Source()
37+
if err != nil {
38+
t.Fatal(err)
39+
}
40+
data, err := json.Marshal(src)
41+
if err != nil {
42+
t.Fatalf("marshaling to JSON failed: %v", err)
43+
}
44+
got := string(data)
45+
expected := `{"field":"user.id","inner_hits":[{"name":"largest_responses","size":3,"sort":[{"http.response.bytes":{"order":"desc"}}]},{"name":"most_recent","size":4,"sort":[{"@timestamp":{"order":"desc"}}]}],"max_concurrent_group_searches":5}`
2646
if got != expected {
2747
t.Errorf("expected\n%s\n,got:\n%s", expected, got)
2848
}

0 commit comments

Comments
 (0)