Merge 9cdcdc171a2b8b66c516dc3ed85f7ac20ec4bb57 into 49a92fc25e9dab2ffe10380889ca01b8b21cb557
This commit is contained in:
		
						commit
						8bf383d306
					
				
							
								
								
									
										40
									
								
								query_joining.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								query_joining.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,40 @@
 | 
				
			|||||||
 | 
					package esquery
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// NestedQuery represents a query of type nested as described in:
 | 
				
			||||||
 | 
					// https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-nested-query.html
 | 
				
			||||||
 | 
					type NestedQuery struct {
 | 
				
			||||||
 | 
						path           string
 | 
				
			||||||
 | 
						query          Mappable
 | 
				
			||||||
 | 
						scoreMode      string
 | 
				
			||||||
 | 
						ignoreUnmapped bool
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Nested(path string, query Mappable) *NestedQuery {
 | 
				
			||||||
 | 
						return &NestedQuery{
 | 
				
			||||||
 | 
							path:  path,
 | 
				
			||||||
 | 
							query: query,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (n *NestedQuery) ScoreMode(mode string) *NestedQuery {
 | 
				
			||||||
 | 
						n.scoreMode = mode
 | 
				
			||||||
 | 
						return n
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (n *NestedQuery) IgnoreUnmapped(val bool) *NestedQuery {
 | 
				
			||||||
 | 
						n.ignoreUnmapped = val
 | 
				
			||||||
 | 
						return n
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Map returns a map representation of the query, thus implementing the
 | 
				
			||||||
 | 
					// Mappable interface.
 | 
				
			||||||
 | 
					func (n *NestedQuery) Map() map[string]interface{} {
 | 
				
			||||||
 | 
						innerMap := map[string]interface{}{"path": n.path, "query": n.query.Map()}
 | 
				
			||||||
 | 
						if n.scoreMode != "" {
 | 
				
			||||||
 | 
							innerMap["score_mode"] = n.scoreMode
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if n.ignoreUnmapped == true {
 | 
				
			||||||
 | 
							innerMap["ignore_unmapped"] = n.ignoreUnmapped
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return map[string]interface{}{"nested": innerMap}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										22
									
								
								query_joining_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								query_joining_test.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,22 @@
 | 
				
			|||||||
 | 
					package esquery
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"testing"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestNested(t *testing.T) {
 | 
				
			||||||
 | 
						runMapTests(t, []mapTest{
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								"Nested Query",
 | 
				
			||||||
 | 
								Nested("dns_values", Term("dns_values.type", "A")).ScoreMode("max").IgnoreUnmapped(true),
 | 
				
			||||||
 | 
								map[string]interface{}{
 | 
				
			||||||
 | 
									"nested": map[string]interface{}{
 | 
				
			||||||
 | 
										"path":            "dns_values",
 | 
				
			||||||
 | 
										"query":           Term("dns_values.type", "A").Map(),
 | 
				
			||||||
 | 
										"score_mode":      "max",
 | 
				
			||||||
 | 
										"ignore_unmapped": true,
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										15
									
								
								search.go
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								search.go
									
									
									
									
									
								
							@ -26,6 +26,7 @@ type SearchRequest struct {
 | 
				
			|||||||
	sort        Sort
 | 
						sort        Sort
 | 
				
			||||||
	source      Source
 | 
						source      Source
 | 
				
			||||||
	timeout     *time.Duration
 | 
						timeout     *time.Duration
 | 
				
			||||||
 | 
						collapse    map[string]interface{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -76,6 +77,15 @@ func (req *SearchRequest) Sort(name string, order Order) *SearchRequest {
 | 
				
			|||||||
	return req
 | 
						return req
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Collapse the results
 | 
				
			||||||
 | 
					func (req *SearchRequest) Collapse(field string) *SearchRequest {
 | 
				
			||||||
 | 
						req.collapse = map[string]interface{}{
 | 
				
			||||||
 | 
							"field": field,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return req
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// SearchAfter retrieve the sorted result
 | 
					// SearchAfter retrieve the sorted result
 | 
				
			||||||
func (req *SearchRequest) SearchAfter(s ...interface{}) *SearchRequest {
 | 
					func (req *SearchRequest) SearchAfter(s ...interface{}) *SearchRequest {
 | 
				
			||||||
	req.searchAfter = append(req.searchAfter, s...)
 | 
						req.searchAfter = append(req.searchAfter, s...)
 | 
				
			||||||
@ -113,8 +123,6 @@ func (req *SearchRequest) Highlight(highlight Mappable) *SearchRequest {
 | 
				
			|||||||
	return req
 | 
						return req
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Map implements the Mappable interface. It converts the request to into a
 | 
					// Map implements the Mappable interface. It converts the request to into a
 | 
				
			||||||
// nested map[string]interface{}, as expected by the go-elasticsearch library.
 | 
					// nested map[string]interface{}, as expected by the go-elasticsearch library.
 | 
				
			||||||
func (req *SearchRequest) Map() map[string]interface{} {
 | 
					func (req *SearchRequest) Map() map[string]interface{} {
 | 
				
			||||||
@ -155,6 +163,9 @@ func (req *SearchRequest) Map() map[string]interface{} {
 | 
				
			|||||||
		m["search_after"] = req.searchAfter
 | 
							m["search_after"] = req.searchAfter
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if req.collapse != nil {
 | 
				
			||||||
 | 
							m["collapse"] = req.collapse
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	source := req.source.Map()
 | 
						source := req.source.Map()
 | 
				
			||||||
	if len(source) > 0 {
 | 
						if len(source) > 0 {
 | 
				
			||||||
 | 
				
			|||||||
@ -14,6 +14,16 @@ func TestSearchMaps(t *testing.T) {
 | 
				
			|||||||
				"search_after": []string{"_id", "name"},
 | 
									"search_after": []string{"_id", "name"},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								"a simple query with collapse",
 | 
				
			||||||
 | 
								Search().Query(Term("user.id", "Tony")).Collapse("user.id"),
 | 
				
			||||||
 | 
								map[string]interface{}{
 | 
				
			||||||
 | 
									"query": Term("user.id", "Tony").Map(),
 | 
				
			||||||
 | 
									"collapse": map[string]interface{}{
 | 
				
			||||||
 | 
										"field": "user.id",
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"a simple match_all query with a size and no aggs",
 | 
								"a simple match_all query with a size and no aggs",
 | 
				
			||||||
			Search().Query(MatchAll()).Size(20),
 | 
								Search().Query(MatchAll()).Size(20),
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user