File: search_queries_template_query.go

package info (click to toggle)
golang-gopkg-olivere-elastic.v3 3.0.41-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 2,364 kB
  • ctags: 3,738
  • sloc: makefile: 16
file content (84 lines) | stat: -rw-r--r-- 2,266 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
// Copyright 2012-2015 Oliver Eilhard. All rights reserved.
// Use of this source code is governed by a MIT-license.
// See http://olivere.mit-license.org/license.txt for details.

package elastic

// TemplateQuery is a query that accepts a query template and a
// map of key/value pairs to fill in template parameters.
//
// For more details, see
// https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-template-query.html
type TemplateQuery struct {
	template     string
	templateType string
	vars         map[string]interface{}
}

// NewTemplateQuery creates and initializes a new TemplateQuery.
func NewTemplateQuery(name string) *TemplateQuery {
	return &TemplateQuery{
		template: name,
		vars:     make(map[string]interface{}),
	}
}

// Template specifies the name of the template.
func (q *TemplateQuery) Template(name string) *TemplateQuery {
	q.template = name
	return q
}

// TemplateType defines which kind of query we use. The values can be:
// inline, indexed, or file. If undefined, inline is used.
func (q *TemplateQuery) TemplateType(typ string) *TemplateQuery {
	q.templateType = typ
	return q
}

// Var sets a single parameter pair.
func (q *TemplateQuery) Var(name string, value interface{}) *TemplateQuery {
	q.vars[name] = value
	return q
}

// Vars sets parameters for the template query.
func (q *TemplateQuery) Vars(vars map[string]interface{}) *TemplateQuery {
	q.vars = vars
	return q
}

// Source returns the JSON serializable content for the search.
func (q *TemplateQuery) Source() (interface{}, error) {
	// {
	//   "template" : {
	//     "query" : {"match_{{template}}": {}},
	//     "params" : {
	//       "template": "all"
	//     }
	//   }
	// }

	query := make(map[string]interface{})

	tmpl := make(map[string]interface{})
	query["template"] = tmpl

	// TODO(oe): Implementation differs from online documentation at http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-template-query.html
	var fieldname string
	switch q.templateType {
	case "file": // file
		fieldname = "file"
	case "indexed", "id": // indexed
		fieldname = "id"
	default: // inline
		fieldname = "query"
	}

	tmpl[fieldname] = q.template
	if len(q.vars) > 0 {
		tmpl["params"] = q.vars
	}

	return query, nil
}