elasticband 0.1.7 → 0.1.8

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,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- ZDhiZDVmMGVmOWE1ZTljZjcyM2VjNzFkNjg4NzVlNjY0YzM0OTU0MQ==
4
+ ZGRjZjQxZjYzZWIxYmM2MTNjODZkOTE5OTM4OGJhZjUyYmZlY2Q4Yw==
5
5
  data.tar.gz: !binary |-
6
- MjkzYTEzMDkyZGQyZTliMTQ5MGI1ZDc5ZDE0ZGQ5MmYwY2RhNmU5MA==
6
+ MjIzZjRkY2YyMjU2ZGFkNWFlNDg2MWZmOGMwNTcyYzRkMTBhNWVhYg==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- ZmY3ZDY3YmY3ZWQ4NDQ5M2M2NjVlMTI4NzdhYThjODhlMGNlNjRhN2U3OWIx
10
- YTU4YjMzODExYjNhNzExOTMxNzc5MGFmZjIwZDdlODk1NzRlOWE3NWQ4ZjNh
11
- OWIyNTRiMmQ5ZTdiMzc3ZGE1Zjg5Mzk4Mjk5ZTUzZmFmN2ZmNjM=
9
+ ZGE5ZmU3YjkyYWM4NWY5MTBhNTVkMzE2NDI2ZWVmNWJlNDEyYmIyMjI1ZjMx
10
+ ZDFhZjQ2YTdkMGZjN2NkY2RmYzlhOTVmODcyYzJiNGUzYTc0MTE5MWI0OTVh
11
+ ZmFkZmZmYzk4NjBiNjBkMGU1ZWRhYmY4MzEyZmI3MWIwYjRjYjU=
12
12
  data.tar.gz: !binary |-
13
- YjQ0ZTJkNTdlMDM3MDUzYTAwOTc5ODE5ZWY1MDU2YTVjMmRlMTA0NjIzOGIw
14
- NWYwY2U1NzRjNGZlZmY0ZjljY2MwYTUxY2JhNTcwZDlkZWY2YmE4ZDlkNzE5
15
- YWRiNjg1YmE1ZWNjYzc5Y2Q0MDkwM2ZkZDc0Y2U1ZTI3ODFlZTg=
13
+ Y2EyNWVjNDM1MDVlYzRiZGEwZjM2Y2EyNGUxNjliZDgyNDc2YzNhYWE1MThl
14
+ YTNlMGI5Y2JmNDVjNDA4OWVmODk5ZGUxZWM4ZDQ0ZWQzZjJlM2JiNDZmNTlm
15
+ N2NmMDFkOWFkMTgwMzEwZjE4ODBjOWQzNTc4NzZmZGY0ZjJjMTk=
@@ -0,0 +1,31 @@
1
+ module Elasticband
2
+ class Filter
3
+ class Range < Filter
4
+ attr_accessor :field, :ranges
5
+
6
+ RANGES = %i(gt gteq lt lteq)
7
+
8
+ def initialize(field, ranges)
9
+ self.field = field.to_sym
10
+ self.ranges = permitted_ranges(ranges)
11
+ end
12
+
13
+ def to_h
14
+ { range: { field => parsed_ranges } }
15
+ end
16
+
17
+ def permitted_ranges(ranges)
18
+ ranges.keep_if { |key, _| RANGES.include?(key) }
19
+ end
20
+
21
+ def parsed_ranges
22
+ translated_range = ranges.dup
23
+
24
+ translated_range[:gte] = translated_range.delete(:gteq) if translated_range.key?(:gteq)
25
+ translated_range[:lte] = translated_range.delete(:lteq) if translated_range.key?(:lteq)
26
+
27
+ translated_range
28
+ end
29
+ end
30
+ end
31
+ end
@@ -1,12 +1,13 @@
1
1
  require 'elasticband/filter/and'
2
2
  require 'elasticband/filter/not'
3
3
  require 'elasticband/filter/query'
4
+ require 'elasticband/filter/range'
4
5
  require 'elasticband/filter/term'
5
6
  require 'elasticband/filter/terms'
6
7
 
7
8
  module Elasticband
8
9
  class Filter
9
- PARSE_FILTERS = %i(only except includes)
10
+ PARSE_FILTERS = %i(only except includes range)
10
11
 
11
12
  def to_h
12
13
  { match_all: {} }
@@ -20,6 +21,7 @@ module Elasticband
20
21
  # * `only:` Filter the search results where the condition is `true`
21
22
  # * `except`: Filter the search results where the condition is `false`.
22
23
  # * `includes:` Filter the search results with a `Match` query.
24
+ # * `range:` Filter the search results where the condition is on the given range.
23
25
  #
24
26
  # #### Examples
25
27
  # ```
@@ -31,6 +33,9 @@ module Elasticband
31
33
  #
32
34
  # Filter.parse(includes: ['company', on: :description])
33
35
  # => { query: { match: { description: 'company' } } }
36
+ #
37
+ # Filter.parse(range: { companies_count: { gt: 1, gteq: 1, lt: 1, lteq: 1 } })
38
+ # => { range: { companies_count: { gt: 1, gte: 1, lt: 1, lte: 1 } } }
34
39
  # ```
35
40
  def parse(options = {})
36
41
  return {} if options.blank?
@@ -38,6 +43,7 @@ module Elasticband
38
43
  filter = parse_filters(options[:only])
39
44
  filter += parse_filters(options[:except]).map { |f| Filter::Not.new(f) }
40
45
  filter += parse_includes_filter(options[:includes])
46
+ filter += parse_range_filter(options[:range])
41
47
  join_filters(filter).to_h
42
48
  end
43
49
 
@@ -53,6 +59,12 @@ module Elasticband
53
59
  [Filter::Query.new(Elasticband::Query.parse(*includes_options))]
54
60
  end
55
61
 
62
+ def parse_range_filter(range_options)
63
+ return [] if range_options.blank?
64
+
65
+ [Filter::Range.new(range_options.keys.first, range_options.values.first)]
66
+ end
67
+
56
68
  def parse_filters(options)
57
69
  return [] if options.blank?
58
70
 
@@ -1,3 +1,3 @@
1
1
  module Elasticband
2
- VERSION = '0.1.7'
2
+ VERSION = '0.1.8'
3
3
  end
@@ -0,0 +1,53 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Elasticband::Filter::Range do
4
+ describe '#to_h' do
5
+ subject { described_class.new(:field_name, options).to_h }
6
+
7
+ context 'with `:gt` option' do
8
+ let(:options) { { gt: 1 } }
9
+
10
+ it { is_expected.to eq(range: { field_name: { gt: 1 } }) }
11
+ end
12
+
13
+ context 'with `:gteq` option' do
14
+ let(:options) { { gteq: 1 } }
15
+
16
+ it { is_expected.to eq(range: { field_name: { gte: 1 } }) }
17
+ end
18
+
19
+ context 'with `:lt` option' do
20
+ let(:options) { { lt: 1 } }
21
+
22
+ it { is_expected.to eq(range: { field_name: { lt: 1 } }) }
23
+ end
24
+
25
+ context 'with `:lteq` option' do
26
+ let(:options) { { lteq: 1 } }
27
+
28
+ it { is_expected.to eq(range: { field_name: { lte: 1 } }) }
29
+ end
30
+ end
31
+
32
+ describe '#parsed_ranges' do
33
+ subject { described_class.new(:field_name, options).parsed_ranges }
34
+
35
+ context 'with `:gteq` option' do
36
+ let(:options) { { gteq: 1 } }
37
+
38
+ it { is_expected.to eq(gte: 1) }
39
+ end
40
+
41
+ context 'with `:lteq` option' do
42
+ let(:options) { { lteq: 1 } }
43
+
44
+ it { is_expected.to eq(lte: 1) }
45
+ end
46
+
47
+ context 'with an unpermitted option' do
48
+ let(:options) { { unpermitted: 1 } }
49
+
50
+ it { is_expected.to eq({}) }
51
+ end
52
+ end
53
+ end
data/spec/filter_spec.rb CHANGED
@@ -83,5 +83,19 @@ RSpec.describe Elasticband::Filter do
83
83
 
84
84
  it { is_expected.to eq(query: { name: 'query' }) }
85
85
  end
86
+
87
+ context 'with `:range` option' do
88
+ context 'with one range' do
89
+ let(:options) { { range: { foo: { gt: 1 } } } }
90
+
91
+ it { is_expected.to eq(range: { foo: { gt: 1 } }) }
92
+ end
93
+
94
+ context 'with more than one range' do
95
+ let(:options) { { range: { foo: { gt: 1, lt: 2 } } } }
96
+
97
+ it { is_expected.to eq(range: { foo: { gt: 1, lt: 2 } }) }
98
+ end
99
+ end
86
100
  end
87
101
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: elasticband
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.7
4
+ version: 0.1.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Glauber Campinho
@@ -125,6 +125,7 @@ files:
125
125
  - lib/elasticband/filter/and.rb
126
126
  - lib/elasticband/filter/not.rb
127
127
  - lib/elasticband/filter/query.rb
128
+ - lib/elasticband/filter/range.rb
128
129
  - lib/elasticband/filter/term.rb
129
130
  - lib/elasticband/filter/terms.rb
130
131
  - lib/elasticband/query.rb
@@ -150,6 +151,7 @@ files:
150
151
  - spec/filter/and_spec.rb
151
152
  - spec/filter/not_spec.rb
152
153
  - spec/filter/query_spec.rb
154
+ - spec/filter/range_spec.rb
153
155
  - spec/filter/term_spec.rb
154
156
  - spec/filter/terms_spec.rb
155
157
  - spec/filter_spec.rb