eagle_search 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 95f2c540d8392becd307b86370b410a014938ad8
4
- data.tar.gz: 08278f066fe793bf2d8e13bcc41830d5b19dbb6d
3
+ metadata.gz: 3e21ce462612e7c5a124aa8781336ebba2c89edc
4
+ data.tar.gz: 48b7434bd94a89894b021d1382c249e27cd5bafc
5
5
  SHA512:
6
- metadata.gz: 0f63b0ca08028e9fd056220efa3731aaf6a902bc5152b2ec6f73887bdb1fecfc75f4e809bfd16ce5fb1846a86799cba7d2fc549be88274d30c4a20b569e1e6ed
7
- data.tar.gz: b460acef98b7274ae245c4c8f75f565d07d7e710d8c1726bb35e35d0e9c80bf405f3d7c8b6e317c4cd248c0e8293dbabd42d52ededec6ff2c925679827ea534d
6
+ metadata.gz: 45a6fc3434a82ae76d15a18b92582c5d56dabd9a3bda886c4fb8d82c8a0080de7a084f278235c3d8a85ce871dad2a061f3d1119f440f0732a943d5891b962b0b
7
+ data.tar.gz: 33b30abb5aec2dc362e68a8663eed49dd1b02c2bd5e948aad9f185517ac489a8a61462d19a6f68cae7fa23395a8214798244e1662947f4409c65532ed90cd103
@@ -0,0 +1,87 @@
1
+ module EagleSearch
2
+ class Interpreter::Aggregation
3
+ def initialize(aggregations)
4
+ @aggregations = aggregations
5
+ end
6
+
7
+ def payload
8
+ @payload ||= build_aggregation(@aggregations)
9
+ end
10
+
11
+ private
12
+ def build_aggregation(aggregation)
13
+ payload = {}
14
+
15
+ if terms_aggregation?(aggregation)
16
+ return { aggregation => build_terms_aggregation(aggregation) }
17
+ elsif aggregation.is_a?(Array)
18
+ aggregation.each do |agg|
19
+ payload.merge!(build_aggregation(agg))
20
+ end
21
+ elsif aggregation.is_a?(Hash)
22
+ aggregation.each do |field_name, aggregation_body|
23
+ if stats_aggregation?(aggregation_body)
24
+ payload.merge!({ field_name => build_stats_aggregation(field_name) })
25
+ elsif range_aggregation?(aggregation_body)
26
+ payload.merge!({ field_name => build_range_aggregation(field_name, aggregation_body) })
27
+ else
28
+ payload.merge!(build_aggregation(field_name))
29
+ payload[field_name].merge!(aggregations: build_aggregation(aggregation_body))
30
+ end
31
+ end
32
+ end
33
+
34
+ payload
35
+ end
36
+
37
+ def build_terms_aggregation(field)
38
+ {
39
+ terms: {
40
+ field: field
41
+ }
42
+ }
43
+ end
44
+
45
+ def build_stats_aggregation(field)
46
+ {
47
+ stats: {
48
+ field: field
49
+ }
50
+ }
51
+ end
52
+
53
+ def build_range_aggregation(field, range_aggregation)
54
+ agg = {
55
+ range: {
56
+ field: field,
57
+ ranges: []
58
+ }
59
+ }
60
+
61
+ range_aggregation[:ranges].each do |range|
62
+ if range.is_a?(Range)
63
+ agg[:range][:ranges] << {
64
+ from: range.min,
65
+ to: range.max
66
+ }
67
+ else
68
+ agg[:range][:ranges] << range
69
+ end
70
+ end
71
+
72
+ agg
73
+ end
74
+
75
+ def stats_aggregation?(aggregation)
76
+ aggregation.is_a?(Hash) && aggregation[:type] == "stats"
77
+ end
78
+
79
+ def terms_aggregation?(aggregation)
80
+ aggregation.is_a?(Symbol) || aggregation.is_a?(String)
81
+ end
82
+
83
+ def range_aggregation?(aggregation)
84
+ aggregation.is_a?(Hash) && aggregation[:ranges]
85
+ end
86
+ end
87
+ end
@@ -1,7 +1,5 @@
1
1
  module EagleSearch
2
2
  class Interpreter::Filter
3
- attr_reader :payload
4
-
5
3
  LOGICAL_OPERATORS = { and: :must, not: :must_not, or: :should }
6
4
 
7
5
  def initialize(filters)
@@ -47,6 +45,8 @@ module EagleSearch
47
45
  { range: { field => { gte: field_value.min, lte: field_value.max } } }
48
46
  when Regexp
49
47
  { regexp: { field => field_value.source } }
48
+ when nil
49
+ { missing: { field: field } }
50
50
  else
51
51
  { term: { field => field_value } }
52
52
  end
@@ -1,6 +1,5 @@
1
1
  module EagleSearch
2
2
  class Interpreter::Query
3
-
4
3
  def initialize(index, query, options)
5
4
  @index = index
6
5
  @query = query
@@ -17,7 +17,8 @@ module EagleSearch
17
17
  query: query_payload,
18
18
  filter: filter_payload
19
19
  }
20
- }
20
+ },
21
+ aggregations: aggregations_payload
21
22
  }
22
23
 
23
24
  payload.merge!({ sort: @options[:sort] }) if @options[:sort]
@@ -52,5 +53,10 @@ module EagleSearch
52
53
  {}
53
54
  end
54
55
  end
56
+
57
+ def aggregations_payload
58
+ return {} unless @options[:aggregations]
59
+ EagleSearch::Interpreter::Aggregation.new(@options[:aggregations]).payload
60
+ end
55
61
  end
56
62
  end
@@ -29,6 +29,10 @@ module EagleSearch
29
29
  @response["hits"]["hits"]
30
30
  end
31
31
 
32
+ def aggregations
33
+ @response["aggregations"]
34
+ end
35
+
32
36
  def current_page
33
37
  @options[:page] || 1
34
38
  end
@@ -1,3 +1,3 @@
1
1
  module EagleSearch
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
data/lib/eagle_search.rb CHANGED
@@ -6,6 +6,7 @@ require "eagle_search/response"
6
6
  require "eagle_search/interpreter"
7
7
  require "eagle_search/interpreter/query"
8
8
  require "eagle_search/interpreter/filter"
9
+ require "eagle_search/interpreter/aggregation"
9
10
  require "elasticsearch"
10
11
 
11
12
  module EagleSearch
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: eagle_search
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Igor Belo
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-11-19 00:00:00.000000000 Z
11
+ date: 2015-11-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: elasticsearch
@@ -106,6 +106,7 @@ files:
106
106
  - lib/eagle_search/field.rb
107
107
  - lib/eagle_search/index.rb
108
108
  - lib/eagle_search/interpreter.rb
109
+ - lib/eagle_search/interpreter/aggregation.rb
109
110
  - lib/eagle_search/interpreter/filter.rb
110
111
  - lib/eagle_search/interpreter/query.rb
111
112
  - lib/eagle_search/model.rb