1// Copyright 2012-2015 Oliver Eilhard. All rights reserved.
2// Use of this source code is governed by a MIT-license.
3// See http://olivere.mit-license.org/license.txt for details.
4
5package elastic
6
7// Histogram Facet
8// See: http://www.elasticsearch.org/guide/reference/api/search/facets/histogram-facet.html
9type HistogramScriptFacet struct {
10	facetFilter    Filter
11	global         *bool
12	nested         string
13	mode           string
14	lang           string
15	keyField       string
16	keyScript      string
17	valueScript    string
18	params         map[string]interface{}
19	interval       int64
20	comparatorType string
21}
22
23func NewHistogramScriptFacet() HistogramScriptFacet {
24	return HistogramScriptFacet{
25		interval: -1,
26		params:   make(map[string]interface{}),
27	}
28}
29
30func (f HistogramScriptFacet) FacetFilter(filter Facet) HistogramScriptFacet {
31	f.facetFilter = filter
32	return f
33}
34
35func (f HistogramScriptFacet) Global(global bool) HistogramScriptFacet {
36	f.global = &global
37	return f
38}
39
40func (f HistogramScriptFacet) Nested(nested string) HistogramScriptFacet {
41	f.nested = nested
42	return f
43}
44
45func (f HistogramScriptFacet) Mode(mode string) HistogramScriptFacet {
46	f.mode = mode
47	return f
48}
49
50func (f HistogramScriptFacet) KeyField(keyField string) HistogramScriptFacet {
51	f.keyField = keyField
52	return f
53}
54
55func (f HistogramScriptFacet) KeyScript(keyScript string) HistogramScriptFacet {
56	f.keyScript = keyScript
57	return f
58}
59
60func (f HistogramScriptFacet) ValueScript(valueScript string) HistogramScriptFacet {
61	f.valueScript = valueScript
62	return f
63}
64
65func (f HistogramScriptFacet) Interval(interval int64) HistogramScriptFacet {
66	f.interval = interval
67	return f
68}
69
70func (f HistogramScriptFacet) Param(name string, value interface{}) HistogramScriptFacet {
71	f.params[name] = value
72	return f
73}
74
75func (f HistogramScriptFacet) Comparator(comparatorType string) HistogramScriptFacet {
76	f.comparatorType = comparatorType
77	return f
78}
79
80func (f HistogramScriptFacet) addFilterFacetAndGlobal(source map[string]interface{}) {
81	if f.facetFilter != nil {
82		source["facet_filter"] = f.facetFilter.Source()
83	}
84	if f.nested != "" {
85		source["nested"] = f.nested
86	}
87	if f.global != nil {
88		source["global"] = *f.global
89	}
90	if f.mode != "" {
91		source["mode"] = f.mode
92	}
93}
94
95func (f HistogramScriptFacet) Source() interface{} {
96	source := make(map[string]interface{})
97	f.addFilterFacetAndGlobal(source)
98	opts := make(map[string]interface{})
99	source["histogram"] = opts
100
101	if f.keyField != "" {
102		opts["key_field"] = f.keyField
103	} else if f.keyScript != "" {
104		opts["key_script"] = f.keyScript
105	}
106	opts["value_script"] = f.valueScript
107	if f.lang != "" {
108		opts["lang"] = f.lang
109	}
110	if f.interval > 0 {
111		opts["interval"] = f.interval
112	}
113	if len(f.params) > 0 {
114		opts["params"] = f.params
115	}
116	if f.comparatorType != "" {
117		opts["comparator"] = f.comparatorType
118	}
119	return source
120}
121