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// A specific histogram facet that can work with date field types
8// enhancing it over the regular histogram facet.
9// See:
10// http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-facets-date-histogram-facet.html
11type DateHistogramFacet struct {
12	facetFilter                Filter
13	global                     *bool
14	nested                     string
15	mode                       string
16	keyField                   string
17	valueField                 *string
18	interval                   string
19	preZone                    string
20	preZoneAdjustLargeInterval *bool
21	postZone                   string
22	preOffset                  string
23	postOffset                 string
24	factor                     *float32
25	comparatorType             string
26	valueScript                string
27	params                     map[string]interface{}
28	lang                       string
29}
30
31func NewDateHistogramFacet() DateHistogramFacet {
32	return DateHistogramFacet{
33		params: make(map[string]interface{}),
34	}
35}
36
37func (f DateHistogramFacet) FacetFilter(filter Facet) DateHistogramFacet {
38	f.facetFilter = filter
39	return f
40}
41
42func (f DateHistogramFacet) Global(global bool) DateHistogramFacet {
43	f.global = &global
44	return f
45}
46
47func (f DateHistogramFacet) Nested(nested string) DateHistogramFacet {
48	f.nested = nested
49	return f
50}
51
52func (f DateHistogramFacet) Mode(mode string) DateHistogramFacet {
53	f.mode = mode
54	return f
55}
56
57func (f DateHistogramFacet) Field(field string) DateHistogramFacet {
58	f.keyField = field
59	return f
60}
61
62func (f DateHistogramFacet) KeyField(keyField string) DateHistogramFacet {
63	f.keyField = keyField
64	return f
65}
66
67func (f DateHistogramFacet) ValueField(valueField string) DateHistogramFacet {
68	f.valueField = &valueField
69	return f
70}
71
72func (f DateHistogramFacet) ValueScript(valueScript string) DateHistogramFacet {
73	f.valueScript = valueScript
74	return f
75}
76
77func (f DateHistogramFacet) Param(name string, value interface{}) DateHistogramFacet {
78	f.params[name] = value
79	return f
80}
81
82func (f DateHistogramFacet) Lang(lang string) DateHistogramFacet {
83	f.lang = lang
84	return f
85}
86
87// Allowed values are: "year", "quarter", "month", "week", "day",
88// "hour", "minute". It also supports time settings like "1.5h"
89// (up to "w" for weeks).
90func (f DateHistogramFacet) Interval(interval string) DateHistogramFacet {
91	f.interval = interval
92	return f
93}
94
95func (f DateHistogramFacet) PreZoneAdjustLargeInterval(preZoneAdjustLargeInterval bool) DateHistogramFacet {
96	f.preZoneAdjustLargeInterval = &preZoneAdjustLargeInterval
97	return f
98}
99
100func (f DateHistogramFacet) PreZone(preZone string) DateHistogramFacet {
101	f.preZone = preZone
102	return f
103}
104
105func (f DateHistogramFacet) PostZone(postZone string) DateHistogramFacet {
106	f.postZone = postZone
107	return f
108}
109
110func (f DateHistogramFacet) PreOffset(preOffset string) DateHistogramFacet {
111	f.preOffset = preOffset
112	return f
113}
114
115func (f DateHistogramFacet) PostOffset(postOffset string) DateHistogramFacet {
116	f.postOffset = postOffset
117	return f
118}
119
120func (f DateHistogramFacet) Factor(factor float32) DateHistogramFacet {
121	f.factor = &factor
122	return f
123}
124
125func (f DateHistogramFacet) Comparator(comparator string) DateHistogramFacet {
126	f.comparatorType = comparator
127	return f
128}
129
130func (f DateHistogramFacet) addFilterFacetAndGlobal(source map[string]interface{}) {
131	if f.facetFilter != nil {
132		source["facet_filter"] = f.facetFilter.Source()
133	}
134	if f.nested != "" {
135		source["nested"] = f.nested
136	}
137	if f.global != nil {
138		source["global"] = *f.global
139	}
140	if f.mode != "" {
141		source["mode"] = f.mode
142	}
143}
144
145func (f DateHistogramFacet) Source() interface{} {
146	/*
147			"histo1" : {
148		    "date_histogram" : {
149		        "field" : "field_name",
150		        "interval" : "day"
151		    }
152		  }
153	*/
154	source := make(map[string]interface{})
155	f.addFilterFacetAndGlobal(source)
156	facet := make(map[string]interface{})
157	source["date_histogram"] = facet
158
159	if f.valueField != nil {
160		facet["key_field"] = f.keyField
161		facet["value_field"] = *f.valueField
162	} else {
163		facet["field"] = f.keyField
164	}
165
166	if f.valueScript != "" {
167		facet["value_script"] = f.valueScript
168		if f.lang != "" {
169			facet["lang"] = f.lang
170		}
171		if len(f.params) > 0 {
172			facet["params"] = f.params
173		}
174	}
175	facet["interval"] = f.interval
176	if f.preZone != "" {
177		facet["pre_zone"] = f.preZone
178	}
179	if f.preZoneAdjustLargeInterval != nil {
180		facet["pre_zone_adjust_large_interval"] = *f.preZoneAdjustLargeInterval
181	}
182	if f.postZone != "" {
183		facet["post_zone"] = f.postZone
184	}
185	if f.preOffset != "" {
186		facet["pre_offset"] = f.preOffset
187	}
188	if f.postOffset != "" {
189		facet["post_offset"] = f.postOffset
190	}
191	if f.factor != nil {
192		facet["factor"] = *f.factor
193	}
194	if f.comparatorType != "" {
195		facet["comparator"] = f.comparatorType
196	}
197	return source
198}
199