Skip to content

Commit b248120

Browse files
CBB-1170: add collapse support (#13)
* CBB-1170: add collapse support * CBB-1170: add constructor
1 parent 91b3efc commit b248120

File tree

4 files changed

+65
-0
lines changed

4 files changed

+65
-0
lines changed

Diff for: collapse.go

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package query
2+
3+
// CollapseRequest represents the "collapse" param that can be applied to a request
4+
// see: https://www.elastic.co/guide/en/elasticsearch/reference/current/collapse-search-results.html
5+
type CollapseRequest struct {
6+
field string
7+
}
8+
9+
// Collapse creates a new collapse request
10+
func Collapse(field string) *CollapseRequest {
11+
return &CollapseRequest{
12+
field: field,
13+
}
14+
}
15+
16+
// Map returns a map representation of the Source object.
17+
func (source CollapseRequest) Map() map[string]interface{} {
18+
return map[string]interface{}{
19+
"field": source.field,
20+
}
21+
}

Diff for: collapse_test.go

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package query
2+
3+
import (
4+
"testing"
5+
)
6+
7+
func TestCollapse_Map(t *testing.T) {
8+
runMapTests(
9+
t,
10+
[]mapTest{
11+
{
12+
name: "collapse",
13+
q: Collapse("collapse_field"),
14+
exp: map[string]interface{}{
15+
"field": "collapse_field",
16+
},
17+
},
18+
},
19+
)
20+
}

Diff for: search.go

+11
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ type SearchRequest struct {
2626
sorts Sorts
2727
source Source
2828
timeout *time.Duration
29+
collapse *CollapseRequest
2930
}
3031

3132
// Search creates a new SearchRequest object, to be filled via method chaining.
@@ -107,6 +108,13 @@ func (req *SearchRequest) Highlight(highlight Mappable) *SearchRequest {
107108
return req
108109
}
109110

111+
// Collapse sets the collapse param for the request.
112+
// See:https://www.elastic.co/guide/en/elasticsearch/reference/current/collapse-search-results.html
113+
func (req *SearchRequest) Collapse(collapse *CollapseRequest) *SearchRequest {
114+
req.collapse = collapse
115+
return req
116+
}
117+
110118
// Map implements the Mappable interface. It converts the request to into a
111119
// nested map[string]interface{}, as expected by the go-elasticsearch library.
112120
func (req *SearchRequest) Map() map[string]interface{} {
@@ -146,6 +154,9 @@ func (req *SearchRequest) Map() map[string]interface{} {
146154
if req.searchAfter != nil {
147155
m["search_after"] = req.searchAfter
148156
}
157+
if req.collapse != nil {
158+
m["collapse"] = req.collapse.Map()
159+
}
149160

150161
source := req.source.Map()
151162
if len(source) > 0 {

Diff for: search_test.go

+13
Original file line numberDiff line numberDiff line change
@@ -132,5 +132,18 @@ func TestSearchMaps(t *testing.T) {
132132
},
133133
},
134134
},
135+
{
136+
"a simple match_all query with a size and collapse",
137+
Search().Query(MatchAll()).Size(20).Collapse(&CollapseRequest{field: "collapse_field"}),
138+
map[string]interface{}{
139+
"query": map[string]interface{}{
140+
"match_all": map[string]interface{}{},
141+
},
142+
"collapse": map[string]interface{}{
143+
"field": "collapse_field",
144+
},
145+
"size": 20,
146+
},
147+
},
135148
})
136149
}

0 commit comments

Comments
 (0)