search_facets_date_histogram.go 4.8 KB

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