eagle_search 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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