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