elastic-rails 0.1.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (90) hide show
  1. checksums.yaml +4 -4
  2. data/Guardfile +46 -0
  3. data/elastic.gemspec +13 -4
  4. data/lib/elastic/commands/build_agg_from_params.rb +63 -0
  5. data/lib/elastic/commands/build_query_from_params.rb +132 -0
  6. data/lib/elastic/commands/import_index_documents.rb +63 -0
  7. data/lib/elastic/configuration.rb +61 -0
  8. data/lib/elastic/core/adaptor.rb +102 -0
  9. data/lib/elastic/core/base_middleware.rb +43 -0
  10. data/lib/elastic/core/default_middleware.rb +64 -0
  11. data/lib/elastic/core/definition.rb +118 -0
  12. data/lib/elastic/core/mapping_manager.rb +120 -0
  13. data/lib/elastic/core/middleware.rb +26 -0
  14. data/lib/elastic/core/query_assembler.rb +84 -0
  15. data/lib/elastic/core/query_config.rb +25 -0
  16. data/lib/elastic/core/serializer.rb +45 -0
  17. data/lib/elastic/core/source_formatter.rb +40 -0
  18. data/lib/elastic/dsl/bool_query_builder.rb +52 -0
  19. data/lib/elastic/dsl/bool_query_context.rb +42 -0
  20. data/lib/elastic/dsl/metric_builder.rb +34 -0
  21. data/lib/elastic/fields/nested.rb +42 -0
  22. data/lib/elastic/fields/value.rb +60 -0
  23. data/lib/elastic/nested_type.rb +5 -0
  24. data/lib/elastic/nodes/agg/average.rb +7 -0
  25. data/lib/elastic/nodes/agg/base_metric.rb +42 -0
  26. data/lib/elastic/nodes/agg/date_histogram.rb +48 -0
  27. data/lib/elastic/nodes/agg/maximum.rb +7 -0
  28. data/lib/elastic/nodes/agg/minimum.rb +7 -0
  29. data/lib/elastic/nodes/agg/stats.rb +7 -0
  30. data/lib/elastic/nodes/agg/sum.rb +7 -0
  31. data/lib/elastic/nodes/agg/terms.rb +38 -0
  32. data/lib/elastic/nodes/agg/top_hits.rb +17 -0
  33. data/lib/elastic/nodes/and.rb +45 -0
  34. data/lib/elastic/nodes/base.rb +34 -0
  35. data/lib/elastic/nodes/base_agg.rb +32 -0
  36. data/lib/elastic/nodes/boolean.rb +87 -0
  37. data/lib/elastic/nodes/concerns/aggregable.rb +52 -0
  38. data/lib/elastic/nodes/concerns/boostable.rb +25 -0
  39. data/lib/elastic/nodes/concerns/bucketed.rb +17 -0
  40. data/lib/elastic/nodes/concerns/hit_provider.rb +39 -0
  41. data/lib/elastic/nodes/function_score.rb +116 -0
  42. data/lib/elastic/nodes/match.rb +45 -0
  43. data/lib/elastic/nodes/nested.rb +42 -0
  44. data/lib/elastic/nodes/or.rb +9 -0
  45. data/lib/elastic/nodes/range.rb +36 -0
  46. data/lib/elastic/nodes/search.rb +48 -0
  47. data/lib/elastic/nodes/term.rb +58 -0
  48. data/lib/elastic/query.rb +84 -22
  49. data/lib/elastic/railtie.rb +41 -0
  50. data/lib/elastic/railties/ar_helpers.rb +51 -0
  51. data/lib/elastic/railties/ar_middleware.rb +45 -0
  52. data/lib/elastic/{indexable_record.rb → railties/indexable_record.rb} +21 -18
  53. data/lib/elastic/railties/query_extensions.rb +9 -0
  54. data/lib/elastic/railties/rspec.rb +6 -0
  55. data/lib/elastic/railties/tasks/es.rake +19 -0
  56. data/lib/elastic/railties/type_extensions.rb +14 -0
  57. data/lib/elastic/railties/utils.rb +62 -0
  58. data/lib/elastic/results/aggregations.rb +29 -0
  59. data/lib/elastic/results/base.rb +13 -0
  60. data/lib/elastic/results/bucket.rb +15 -0
  61. data/lib/elastic/results/bucket_collection.rb +17 -0
  62. data/lib/elastic/results/grouped_result.rb +37 -0
  63. data/lib/elastic/results/hit.rb +25 -0
  64. data/lib/elastic/results/hit_collection.rb +38 -0
  65. data/lib/elastic/results/metric.rb +13 -0
  66. data/lib/elastic/results/result_group.rb +19 -0
  67. data/lib/elastic/results/root.rb +15 -0
  68. data/lib/elastic/shims/base.rb +23 -0
  69. data/lib/elastic/shims/grouping.rb +23 -0
  70. data/lib/elastic/shims/populating.rb +69 -0
  71. data/lib/elastic/shims/reducing.rb +20 -0
  72. data/lib/elastic/support/command.rb +34 -0
  73. data/lib/elastic/support/transform.rb +37 -0
  74. data/lib/elastic/support/traversable.rb +22 -0
  75. data/lib/elastic/type.rb +56 -84
  76. data/lib/elastic/types/base_type.rb +38 -0
  77. data/lib/elastic/types/faceted_type.rb +16 -0
  78. data/lib/elastic/types/nestable_type.rb +14 -0
  79. data/lib/elastic/version.rb +1 -1
  80. data/lib/elastic.rb +72 -30
  81. data/lib/generators/elastic/index_generator.rb +10 -0
  82. data/lib/generators/elastic/templates/index.rb +17 -0
  83. metadata +222 -16
  84. data/lib/elastic/capabilities/aggregation_builder.rb +0 -64
  85. data/lib/elastic/capabilities/bool_query_builder.rb +0 -74
  86. data/lib/elastic/capabilities/context_handler.rb +0 -31
  87. data/lib/elastic/histogram.rb +0 -49
  88. data/lib/elastic/index.rb +0 -113
  89. data/lib/elastic/indexable.rb +0 -25
  90. data/lib/elastic/value_transform.rb +0 -15
data/lib/elastic.rb CHANGED
@@ -1,44 +1,86 @@
1
1
  require "elasticsearch"
2
+
2
3
  require "elastic/version"
4
+ require "elastic/configuration"
3
5
 
4
- require "elastic/capabilities/aggregation_builder"
5
- require "elastic/capabilities/bool_query_builder"
6
- require "elastic/capabilities/context_handler"
6
+ require "elastic/support/command"
7
+ require "elastic/support/transform"
8
+ require "elastic/support/traversable"
7
9
 
8
- require "elastic/index"
9
- require "elastic/type"
10
- require "elastic/query"
11
- require "elastic/histogram"
12
- require "elastic/value_transform"
13
- require "elastic/indexable"
14
- require "elastic/indexable_record"
10
+ require "elastic/commands/import_index_documents"
11
+ require "elastic/commands/build_query_from_params"
12
+ require "elastic/commands/build_agg_from_params"
15
13
 
16
- module Elastic
17
- extend self
14
+ require "elastic/results/base"
15
+ require "elastic/results/aggregations"
16
+ require "elastic/results/hit"
17
+ require "elastic/results/hit_collection"
18
+ require "elastic/results/metric"
19
+ require "elastic/results/bucket_collection"
20
+ require "elastic/results/bucket"
21
+ require "elastic/results/grouped_result"
22
+ require "elastic/results/result_group"
23
+ require "elastic/results/root"
18
24
 
19
- def connect(_index = nil)
20
- Elastic::Index.new api_client, (_index || default_index).to_s
21
- end
25
+ require "elastic/nodes/base"
26
+ require "elastic/nodes/base_agg"
27
+ require "elastic/nodes/search"
28
+ require "elastic/nodes/term"
29
+ require "elastic/nodes/range"
30
+ require "elastic/nodes/match"
31
+ require "elastic/nodes/and"
32
+ require "elastic/nodes/or"
33
+ require "elastic/nodes/boolean"
34
+ require "elastic/nodes/function_score"
35
+ require "elastic/nodes/nested"
36
+ require "elastic/nodes/agg/base_metric"
37
+ require "elastic/nodes/agg/stats"
38
+ require "elastic/nodes/agg/average"
39
+ require "elastic/nodes/agg/minimum"
40
+ require "elastic/nodes/agg/maximum"
41
+ require "elastic/nodes/agg/sum"
42
+ require "elastic/nodes/agg/terms"
43
+ require "elastic/nodes/agg/date_histogram"
44
+ require "elastic/nodes/agg/top_hits"
22
45
 
23
- private
46
+ require "elastic/shims/base"
47
+ require "elastic/shims/populating"
48
+ require "elastic/shims/grouping"
49
+ require "elastic/shims/reducing"
24
50
 
25
- def config
26
- Rails.application.config_for(:elastic)
27
- end
51
+ require "elastic/fields/value"
52
+ require "elastic/fields/nested"
28
53
 
29
- def default_index
30
- config['index']
31
- end
54
+ require "elastic/core/definition"
55
+ require "elastic/core/adaptor"
56
+ require "elastic/core/mapping_manager"
57
+ require "elastic/core/serializer"
58
+ require "elastic/core/middleware"
59
+ require "elastic/core/base_middleware"
60
+ require "elastic/core/default_middleware"
61
+ require "elastic/core/source_formatter"
62
+ require "elastic/core/query_config"
63
+ require "elastic/core/query_assembler"
32
64
 
33
- def api_client
34
- @api_client ||= load_api_client
65
+ require "elastic/dsl/bool_query_builder"
66
+ require "elastic/dsl/bool_query_context"
67
+ require "elastic/dsl/metric_builder"
68
+
69
+ require "elastic/types/base_type"
70
+ require "elastic/types/faceted_type"
71
+ require "elastic/types/nestable_type"
72
+ require "elastic/type"
73
+ require "elastic/nested_type"
74
+ require "elastic/query"
75
+
76
+ module Elastic
77
+ def self.configure(*_args)
78
+ Configuration.configure(*_args)
35
79
  end
36
80
 
37
- def load_api_client
38
- uri = config['url'] ? URI(config['url']) : nil
39
- Elasticsearch::Client.new(
40
- host: uri ? uri.host : config['host'],
41
- port: uri ? uri.port : config['port']
42
- )
81
+ def self.register_middleware(_middleware)
82
+ Core::Middleware.register _middleware
43
83
  end
44
84
  end
85
+
86
+ require "elastic/railtie" if defined? Rails
@@ -0,0 +1,10 @@
1
+ module Elastic
2
+ class IndexGenerator < Rails::Generators::NamedBase
3
+ source_root File.expand_path("../templates", __FILE__)
4
+
5
+ desc "This generator creates a new model index definition at app/indices"
6
+ def create_index
7
+ template('index.rb', "app/indices/#{file_name.underscore}_index.rb")
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,17 @@
1
+ class <%= class_name %>Index < Elastic::Type
2
+ # Index model fields by adding field definitions.
3
+ #
4
+ # Some examples:
5
+ #
6
+ # fields :foo, :bar
7
+ # field :timestamp, type: :date
8
+ # field :category, type: :term
9
+ # field :complex, transform: -> { "#{property_1}/#{property_2}" }
10
+ # field :custom
11
+ #
12
+ # def custom
13
+ # "foobar"
14
+ # end
15
+ #
16
+ end
17
+
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: elastic-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ignacio Baixas
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-06-07 00:00:00.000000000 Z
11
+ date: 2016-07-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: elasticsearch
@@ -17,6 +17,9 @@ dependencies:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.0'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 1.0.18
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -24,48 +27,183 @@ dependencies:
24
27
  - - "~>"
25
28
  - !ruby/object:Gem::Version
26
29
  version: '1.0'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 1.0.18
33
+ - !ruby/object:Gem::Dependency
34
+ name: activesupport
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
27
47
  - !ruby/object:Gem::Dependency
28
48
  name: bundler
29
49
  requirement: !ruby/object:Gem::Requirement
30
50
  requirements:
31
51
  - - "~>"
32
52
  - !ruby/object:Gem::Version
33
- version: '1.12'
53
+ version: '1.6'
34
54
  type: :development
35
55
  prerelease: false
36
56
  version_requirements: !ruby/object:Gem::Requirement
37
57
  requirements:
38
58
  - - "~>"
39
59
  - !ruby/object:Gem::Version
40
- version: '1.12'
60
+ version: '1.6'
41
61
  - !ruby/object:Gem::Dependency
42
62
  name: rake
43
63
  requirement: !ruby/object:Gem::Requirement
44
64
  requirements:
45
65
  - - "~>"
46
66
  - !ruby/object:Gem::Version
47
- version: '10.0'
67
+ version: '10.4'
48
68
  type: :development
49
69
  prerelease: false
50
70
  version_requirements: !ruby/object:Gem::Requirement
51
71
  requirements:
52
72
  - - "~>"
53
73
  - !ruby/object:Gem::Version
54
- version: '10.0'
74
+ version: '10.4'
55
75
  - !ruby/object:Gem::Dependency
56
76
  name: rspec
57
77
  requirement: !ruby/object:Gem::Requirement
58
78
  requirements:
59
79
  - - "~>"
60
80
  - !ruby/object:Gem::Version
61
- version: '3.0'
81
+ version: '3.1'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '3.1'
89
+ - !ruby/object:Gem::Dependency
90
+ name: rspec-nc
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '0.2'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '0.2'
103
+ - !ruby/object:Gem::Dependency
104
+ name: guard
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '2.11'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '2.11'
117
+ - !ruby/object:Gem::Dependency
118
+ name: guard-rspec
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '4.5'
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '4.5'
131
+ - !ruby/object:Gem::Dependency
132
+ name: terminal-notifier-guard
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '1.6'
138
+ - - ">="
139
+ - !ruby/object:Gem::Version
140
+ version: 1.6.1
141
+ type: :development
142
+ prerelease: false
143
+ version_requirements: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - "~>"
146
+ - !ruby/object:Gem::Version
147
+ version: '1.6'
148
+ - - ">="
149
+ - !ruby/object:Gem::Version
150
+ version: 1.6.1
151
+ - !ruby/object:Gem::Dependency
152
+ name: pry
153
+ requirement: !ruby/object:Gem::Requirement
154
+ requirements:
155
+ - - "~>"
156
+ - !ruby/object:Gem::Version
157
+ version: '0.10'
158
+ type: :development
159
+ prerelease: false
160
+ version_requirements: !ruby/object:Gem::Requirement
161
+ requirements:
162
+ - - "~>"
163
+ - !ruby/object:Gem::Version
164
+ version: '0.10'
165
+ - !ruby/object:Gem::Dependency
166
+ name: pry-remote
167
+ requirement: !ruby/object:Gem::Requirement
168
+ requirements:
169
+ - - "~>"
170
+ - !ruby/object:Gem::Version
171
+ version: '0.1'
172
+ type: :development
173
+ prerelease: false
174
+ version_requirements: !ruby/object:Gem::Requirement
175
+ requirements:
176
+ - - "~>"
177
+ - !ruby/object:Gem::Version
178
+ version: '0.1'
179
+ - !ruby/object:Gem::Dependency
180
+ name: pry-byebug
181
+ requirement: !ruby/object:Gem::Requirement
182
+ requirements:
183
+ - - "~>"
184
+ - !ruby/object:Gem::Version
185
+ version: '3.2'
186
+ type: :development
187
+ prerelease: false
188
+ version_requirements: !ruby/object:Gem::Requirement
189
+ requirements:
190
+ - - "~>"
191
+ - !ruby/object:Gem::Version
192
+ version: '3.2'
193
+ - !ruby/object:Gem::Dependency
194
+ name: pry-nav
195
+ requirement: !ruby/object:Gem::Requirement
196
+ requirements:
197
+ - - "~>"
198
+ - !ruby/object:Gem::Version
199
+ version: '0.2'
62
200
  type: :development
63
201
  prerelease: false
64
202
  version_requirements: !ruby/object:Gem::Requirement
65
203
  requirements:
66
204
  - - "~>"
67
205
  - !ruby/object:Gem::Version
68
- version: '3.0'
206
+ version: '0.2'
69
207
  description: Elasticsearch integration for Ruby on Rails by Platanus
70
208
  email:
71
209
  - ignacio@platan.us
@@ -78,6 +216,7 @@ files:
78
216
  - ".travis.yml"
79
217
  - CODE_OF_CONDUCT.md
80
218
  - Gemfile
219
+ - Guardfile
81
220
  - LICENSE.txt
82
221
  - README.md
83
222
  - Rakefile
@@ -86,17 +225,84 @@ files:
86
225
  - elastic.gemspec
87
226
  - lib/elastic-rails.rb
88
227
  - lib/elastic.rb
89
- - lib/elastic/capabilities/aggregation_builder.rb
90
- - lib/elastic/capabilities/bool_query_builder.rb
91
- - lib/elastic/capabilities/context_handler.rb
92
- - lib/elastic/histogram.rb
93
- - lib/elastic/index.rb
94
- - lib/elastic/indexable.rb
95
- - lib/elastic/indexable_record.rb
228
+ - lib/elastic/commands/build_agg_from_params.rb
229
+ - lib/elastic/commands/build_query_from_params.rb
230
+ - lib/elastic/commands/import_index_documents.rb
231
+ - lib/elastic/configuration.rb
232
+ - lib/elastic/core/adaptor.rb
233
+ - lib/elastic/core/base_middleware.rb
234
+ - lib/elastic/core/default_middleware.rb
235
+ - lib/elastic/core/definition.rb
236
+ - lib/elastic/core/mapping_manager.rb
237
+ - lib/elastic/core/middleware.rb
238
+ - lib/elastic/core/query_assembler.rb
239
+ - lib/elastic/core/query_config.rb
240
+ - lib/elastic/core/serializer.rb
241
+ - lib/elastic/core/source_formatter.rb
242
+ - lib/elastic/dsl/bool_query_builder.rb
243
+ - lib/elastic/dsl/bool_query_context.rb
244
+ - lib/elastic/dsl/metric_builder.rb
245
+ - lib/elastic/fields/nested.rb
246
+ - lib/elastic/fields/value.rb
247
+ - lib/elastic/nested_type.rb
248
+ - lib/elastic/nodes/agg/average.rb
249
+ - lib/elastic/nodes/agg/base_metric.rb
250
+ - lib/elastic/nodes/agg/date_histogram.rb
251
+ - lib/elastic/nodes/agg/maximum.rb
252
+ - lib/elastic/nodes/agg/minimum.rb
253
+ - lib/elastic/nodes/agg/stats.rb
254
+ - lib/elastic/nodes/agg/sum.rb
255
+ - lib/elastic/nodes/agg/terms.rb
256
+ - lib/elastic/nodes/agg/top_hits.rb
257
+ - lib/elastic/nodes/and.rb
258
+ - lib/elastic/nodes/base.rb
259
+ - lib/elastic/nodes/base_agg.rb
260
+ - lib/elastic/nodes/boolean.rb
261
+ - lib/elastic/nodes/concerns/aggregable.rb
262
+ - lib/elastic/nodes/concerns/boostable.rb
263
+ - lib/elastic/nodes/concerns/bucketed.rb
264
+ - lib/elastic/nodes/concerns/hit_provider.rb
265
+ - lib/elastic/nodes/function_score.rb
266
+ - lib/elastic/nodes/match.rb
267
+ - lib/elastic/nodes/nested.rb
268
+ - lib/elastic/nodes/or.rb
269
+ - lib/elastic/nodes/range.rb
270
+ - lib/elastic/nodes/search.rb
271
+ - lib/elastic/nodes/term.rb
96
272
  - lib/elastic/query.rb
273
+ - lib/elastic/railtie.rb
274
+ - lib/elastic/railties/ar_helpers.rb
275
+ - lib/elastic/railties/ar_middleware.rb
276
+ - lib/elastic/railties/indexable_record.rb
277
+ - lib/elastic/railties/query_extensions.rb
278
+ - lib/elastic/railties/rspec.rb
279
+ - lib/elastic/railties/tasks/es.rake
280
+ - lib/elastic/railties/type_extensions.rb
281
+ - lib/elastic/railties/utils.rb
282
+ - lib/elastic/results/aggregations.rb
283
+ - lib/elastic/results/base.rb
284
+ - lib/elastic/results/bucket.rb
285
+ - lib/elastic/results/bucket_collection.rb
286
+ - lib/elastic/results/grouped_result.rb
287
+ - lib/elastic/results/hit.rb
288
+ - lib/elastic/results/hit_collection.rb
289
+ - lib/elastic/results/metric.rb
290
+ - lib/elastic/results/result_group.rb
291
+ - lib/elastic/results/root.rb
292
+ - lib/elastic/shims/base.rb
293
+ - lib/elastic/shims/grouping.rb
294
+ - lib/elastic/shims/populating.rb
295
+ - lib/elastic/shims/reducing.rb
296
+ - lib/elastic/support/command.rb
297
+ - lib/elastic/support/transform.rb
298
+ - lib/elastic/support/traversable.rb
97
299
  - lib/elastic/type.rb
98
- - lib/elastic/value_transform.rb
300
+ - lib/elastic/types/base_type.rb
301
+ - lib/elastic/types/faceted_type.rb
302
+ - lib/elastic/types/nestable_type.rb
99
303
  - lib/elastic/version.rb
304
+ - lib/generators/elastic/index_generator.rb
305
+ - lib/generators/elastic/templates/index.rb
100
306
  homepage: https://github.com/surbtc/elastic-rails
101
307
  licenses:
102
308
  - MIT
@@ -1,64 +0,0 @@
1
- module Elastic::Capabilities
2
- module AggregationBuilder
3
- def aggregate_in(_name)
4
- set_context(:aggregate, _name)
5
- end
6
-
7
- def aggregate
8
- set_context(:aggregate, nil)
9
- end
10
-
11
- def sum_of(_field)
12
- with_context(:aggregate, :sum_of) do |name|
13
- register_aggregation(name || _field, { "sum" => { "field" => _field } })
14
- end
15
- end
16
-
17
- def minimum_for(_field)
18
- with_context(:aggregate, :minimum_for) do |name|
19
- register_aggregation(name || _field, { "min" => { "field" => _field } })
20
- end
21
- end
22
-
23
- def maximum_for(_field)
24
- with_context(:aggregate, :maximum_for) do |name|
25
- register_aggregation(name || _field, { "max" => { "field" => _field } })
26
- end
27
- end
28
-
29
- def average_for(_field)
30
- with_context(:aggregate, :average_for) do |name|
31
- register_aggregation(name || _field, { "avg" => { "field" => _field } })
32
- end
33
- end
34
-
35
- def date_histogram_for(_field, resolution: '1d', &_block)
36
- with_context(:aggregate, :date_histogram_for) do |name|
37
- histogram = Elastic::Histogram.new _field, resolution
38
- _block.call(histogram) if _block
39
- register_aggregation(name || _field, histogram)
40
- return histogram unless _block
41
- end
42
- end
43
-
44
- private
45
-
46
- def aggregations
47
- @aggregations ||= []
48
- end
49
-
50
- def register_aggregation(_name, _definition)
51
- aggregations << [_name, _definition]
52
- end
53
-
54
- def render_aggregations_to(_to)
55
- return if aggregations.length == 0
56
-
57
- _to['aggs'] = aggs = {}
58
-
59
- aggregations.each do |name, definition|
60
- aggs[name] = definition.respond_to?(:render) ? definition.render : definition
61
- end
62
- end
63
- end
64
- end
@@ -1,74 +0,0 @@
1
- module Elastic::Capabilities
2
- module BoolQueryBuilder
3
- def minimum_should_match
4
- @minimum_should_match || 1
5
- end
6
-
7
- def minimum_should_match=(_value)
8
- @minimum_should_match = _value
9
- end
10
-
11
- def should_have(_field)
12
- set_context(:should_have, [should_parts, _field])
13
- end
14
-
15
- def must_have(_field)
16
- set_context(:must_have, [must_parts, _field])
17
- end
18
-
19
- def in(*_terms)
20
- with_context([:should_have, :must_have], :in) do |context, field|
21
- raise ArgumentError, 'must provide at least one term' if _terms.length == 0
22
-
23
- _terms = _terms.map { |t| transform_input(field, t) }
24
-
25
- context << (_terms.length > 1 ?
26
- { "terms" => { field.to_s => _terms } } :
27
- { "term" => { field.to_s => _terms.first } }
28
- )
29
- end
30
- end
31
-
32
- alias :equal_to :in
33
-
34
- def in_range(_range)
35
- with_context([:should_have, :must_have], :in_range) do |context, field|
36
- options = { }
37
-
38
- case _range
39
- when Range
40
- options['gte'] = _range.begin
41
- options['lt'] = _range.end if _range.exclude_end?
42
- options['lte'] = _range.end if !_range.exclude_end?
43
- when Hash
44
- [:gte, :gt, :lte, :lt].each do |opt|
45
- options[opt.to_s] = _range[opt] if _range.key? opt
46
- end
47
- else
48
- raise ArgumentError, 'must provide a range or a set of options'
49
- end
50
-
51
- context << { "range" => { field.to_s => options } }
52
- end
53
- end
54
-
55
- private
56
-
57
- def must_parts
58
- @must_parts ||= []
59
- end
60
-
61
- def should_parts
62
- @should_parts ||= []
63
- end
64
-
65
- def render_bool_query_to(_to)
66
- return if should_parts.length == 0 && must_parts.length == 0
67
-
68
- bool = _to['bool'] = {}
69
- bool['must'] = must_parts if must_parts.length > 0
70
- bool['should'] = should_parts if should_parts.length > 0
71
- bool['minimum_should_match'] = minimum_should_match if should_parts.length > 0
72
- end
73
- end
74
- end
@@ -1,31 +0,0 @@
1
- module Elastic::Capabilities
2
- module ContextHandler
3
- private
4
-
5
- def set_context(_name, _data)
6
- unless @context_name.nil?
7
- raise ArgumentError, "#{_name} should not be called right after #{@context_name}"
8
- end
9
-
10
- @context_name = _name.to_sym
11
- @context_data = _data
12
- self
13
- end
14
-
15
- def with_context(_names, _caller)
16
- _names = [_names] unless _names.is_a? Array
17
- _names = _names.map(&:to_sym)
18
-
19
- if @context_name.nil?
20
- raise ArgumentError, "#{_caller} should be called after #{_names.join(' or ')}"
21
- elsif !_names.include? @context_name
22
- raise ArgumentError, "#{_caller} should not be called after #{@context_name}"
23
- end
24
-
25
- yield @context_data
26
- return self
27
- ensure
28
- @context_name = @context_data = nil
29
- end
30
- end
31
- end
@@ -1,49 +0,0 @@
1
- module Elastic
2
- class Histogram
3
- include Capabilities::ContextHandler
4
- include Capabilities::AggregationBuilder
5
-
6
- attr_accessor :resolution
7
-
8
- def initialize(_time_field, _resolution)
9
- @time_field = _time_field
10
- @resolution = _resolution
11
- end
12
-
13
- def open_for(_field)
14
- with_context(:aggregate, :open_for) do |name|
15
- register_aggregation(name, {
16
- top_hits: {
17
- sort: [{ @time_field => { order: "asc" } }],
18
- _source: { include: [ _field ] },
19
- size: 1
20
- }
21
- })
22
- end
23
- end
24
-
25
- def close_for(_field)
26
- with_context(:aggregate, :close_for) do |name|
27
- register_aggregation(name, {
28
- top_hits: {
29
- sort: [{ @time_field => { order: "desc" } }],
30
- _source: { include: [ _field ] },
31
- size: 1
32
- }
33
- })
34
- end
35
- end
36
-
37
- def render
38
- json = {
39
- date_histogram: {
40
- field: @time_field,
41
- interval: @resolution,
42
- }
43
- }
44
-
45
- render_aggregations_to json
46
- json
47
- end
48
- end
49
- end