chewy 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +13 -5
- data/.gitignore +1 -0
- data/.travis.yml +5 -3
- data/CHANGELOG.md +75 -0
- data/README.md +487 -92
- data/Rakefile +3 -2
- data/chewy.gemspec +2 -2
- data/filters +76 -0
- data/lib/chewy.rb +5 -3
- data/lib/chewy/config.rb +36 -19
- data/lib/chewy/fields/base.rb +5 -1
- data/lib/chewy/index.rb +22 -10
- data/lib/chewy/index/actions.rb +13 -13
- data/lib/chewy/index/search.rb +7 -2
- data/lib/chewy/query.rb +382 -64
- data/lib/chewy/query/context.rb +174 -0
- data/lib/chewy/query/criteria.rb +127 -34
- data/lib/chewy/query/loading.rb +9 -9
- data/lib/chewy/query/nodes/and.rb +25 -0
- data/lib/chewy/query/nodes/base.rb +17 -0
- data/lib/chewy/query/nodes/bool.rb +32 -0
- data/lib/chewy/query/nodes/equal.rb +34 -0
- data/lib/chewy/query/nodes/exists.rb +20 -0
- data/lib/chewy/query/nodes/expr.rb +28 -0
- data/lib/chewy/query/nodes/field.rb +106 -0
- data/lib/chewy/query/nodes/missing.rb +20 -0
- data/lib/chewy/query/nodes/not.rb +25 -0
- data/lib/chewy/query/nodes/or.rb +25 -0
- data/lib/chewy/query/nodes/prefix.rb +18 -0
- data/lib/chewy/query/nodes/query.rb +20 -0
- data/lib/chewy/query/nodes/range.rb +63 -0
- data/lib/chewy/query/nodes/raw.rb +15 -0
- data/lib/chewy/query/nodes/regexp.rb +31 -0
- data/lib/chewy/query/nodes/script.rb +20 -0
- data/lib/chewy/query/pagination.rb +28 -22
- data/lib/chewy/railtie.rb +23 -0
- data/lib/chewy/rspec/update_index.rb +20 -3
- data/lib/chewy/type/adapter/active_record.rb +78 -5
- data/lib/chewy/type/adapter/base.rb +46 -0
- data/lib/chewy/type/adapter/object.rb +40 -8
- data/lib/chewy/type/base.rb +1 -1
- data/lib/chewy/type/import.rb +18 -44
- data/lib/chewy/type/observe.rb +24 -14
- data/lib/chewy/version.rb +1 -1
- data/lib/tasks/chewy.rake +27 -0
- data/spec/chewy/config_spec.rb +30 -12
- data/spec/chewy/fields/base_spec.rb +11 -5
- data/spec/chewy/index/actions_spec.rb +20 -20
- data/spec/chewy/index/search_spec.rb +5 -5
- data/spec/chewy/index_spec.rb +28 -8
- data/spec/chewy/query/context_spec.rb +173 -0
- data/spec/chewy/query/criteria_spec.rb +219 -12
- data/spec/chewy/query/loading_spec.rb +6 -4
- data/spec/chewy/query/nodes/and_spec.rb +16 -0
- data/spec/chewy/query/nodes/bool_spec.rb +22 -0
- data/spec/chewy/query/nodes/equal_spec.rb +32 -0
- data/spec/chewy/query/nodes/exists_spec.rb +18 -0
- data/spec/chewy/query/nodes/missing_spec.rb +15 -0
- data/spec/chewy/query/nodes/not_spec.rb +16 -0
- data/spec/chewy/query/nodes/or_spec.rb +16 -0
- data/spec/chewy/query/nodes/prefix_spec.rb +16 -0
- data/spec/chewy/query/nodes/query_spec.rb +12 -0
- data/spec/chewy/query/nodes/range_spec.rb +32 -0
- data/spec/chewy/query/nodes/raw_spec.rb +11 -0
- data/spec/chewy/query/nodes/regexp_spec.rb +31 -0
- data/spec/chewy/query/nodes/script_spec.rb +15 -0
- data/spec/chewy/query/pagination_spec.rb +3 -2
- data/spec/chewy/query_spec.rb +83 -26
- data/spec/chewy/rspec/update_index_spec.rb +20 -0
- data/spec/chewy/type/adapter/active_record_spec.rb +102 -0
- data/spec/chewy/type/adapter/object_spec.rb +82 -0
- data/spec/chewy/type/import_spec.rb +30 -1
- data/spec/chewy/type/mapping_spec.rb +1 -1
- data/spec/chewy/type/observe_spec.rb +46 -12
- data/spec/spec_helper.rb +7 -6
- data/spec/support/class_helpers.rb +2 -2
- metadata +98 -48
- data/.rvmrc +0 -1
- data/lib/chewy/index/client.rb +0 -13
- data/spec/chewy/index/client_spec.rb +0 -18
data/lib/chewy/type/observe.rb
CHANGED
@@ -4,9 +4,21 @@ module Chewy
|
|
4
4
|
extend ActiveSupport::Concern
|
5
5
|
|
6
6
|
module ActiveRecordMethods
|
7
|
-
def
|
7
|
+
def update_index(type_name, *args, &block)
|
8
|
+
options = args.extract_options!
|
9
|
+
method = args.first
|
10
|
+
|
8
11
|
update = Proc.new do
|
9
|
-
|
12
|
+
backreference = if method && method.to_s == 'self'
|
13
|
+
self
|
14
|
+
elsif method
|
15
|
+
send(method)
|
16
|
+
else
|
17
|
+
instance_eval(&block)
|
18
|
+
end
|
19
|
+
|
20
|
+
Chewy.derive_type(type_name).update_index(backreference,
|
21
|
+
options.reverse_merge(urgent: Chewy.urgent_update))
|
10
22
|
end
|
11
23
|
|
12
24
|
after_save &update
|
@@ -15,19 +27,17 @@ module Chewy
|
|
15
27
|
end
|
16
28
|
|
17
29
|
module ClassMethods
|
18
|
-
def update_index(objects)
|
19
|
-
if Chewy.
|
20
|
-
if
|
21
|
-
|
22
|
-
objects.pluck(:id)
|
23
|
-
else
|
24
|
-
Array.wrap(objects).map { |object| object.respond_to?(:id) ? object.id : object.to_i }
|
25
|
-
end
|
26
|
-
Chewy.atomic_stash self, ids
|
30
|
+
def update_index(objects, options = {})
|
31
|
+
if Chewy.atomic?
|
32
|
+
ids = if objects.is_a?(::ActiveRecord::Relation)
|
33
|
+
objects.pluck(:id)
|
27
34
|
else
|
28
|
-
|
29
|
-
end
|
30
|
-
|
35
|
+
Array.wrap(objects).map { |object| object.respond_to?(:id) ? object.id : object.to_i }
|
36
|
+
end
|
37
|
+
Chewy.stash self, ids
|
38
|
+
else
|
39
|
+
import(objects) if options[:urgent]
|
40
|
+
end if objects
|
31
41
|
|
32
42
|
true
|
33
43
|
end
|
data/lib/chewy/version.rb
CHANGED
@@ -0,0 +1,27 @@
|
|
1
|
+
namespace :chewy do
|
2
|
+
namespace :reset do
|
3
|
+
desc 'Destroy, recreate and import data for all found indexes'
|
4
|
+
task all: :environment do
|
5
|
+
Rails.application.config.paths['app/chewy'].existent.each do |dir|
|
6
|
+
Dir.glob(File.join(dir, '**/*.rb')).each { |file| require file }
|
7
|
+
end
|
8
|
+
|
9
|
+
Chewy::Index.descendants.each do |index|
|
10
|
+
puts "Resetting #{index}"
|
11
|
+
index.reset
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
desc 'Destroy, recreate and import data to specified index'
|
17
|
+
task :reset, [:index] => :environment do |task, args|
|
18
|
+
"#{args[:index].camelize}Index".constantize.reset
|
19
|
+
end
|
20
|
+
|
21
|
+
desc 'Updates specified index'
|
22
|
+
task :update, [:index] => :environment do |task, args|
|
23
|
+
index = "#{args[:index].camelize}Index".constantize
|
24
|
+
raise "Index `#{index.index_name}` does not exists. Use rake chewy:reset[index] to create and update it." unless index.exists?
|
25
|
+
index.import
|
26
|
+
end
|
27
|
+
end
|
data/spec/chewy/config_spec.rb
CHANGED
@@ -4,7 +4,17 @@ describe Chewy::Config do
|
|
4
4
|
include ClassHelpers
|
5
5
|
subject { described_class.send(:new) }
|
6
6
|
|
7
|
-
its(:
|
7
|
+
its(:query_mode) { should == :must }
|
8
|
+
its(:filter_mode) { should == :and }
|
9
|
+
its(:logger) { should be_nil }
|
10
|
+
its(:client_options) { should_not have_key :logger }
|
11
|
+
|
12
|
+
describe '#logger' do
|
13
|
+
before { subject.logger = double(:logger) }
|
14
|
+
|
15
|
+
its(:logger) { should_not be_nil }
|
16
|
+
its(:client_options) { should have_key :logger }
|
17
|
+
end
|
8
18
|
|
9
19
|
describe '#atomic?' do
|
10
20
|
its(:atomic?) { should be_false }
|
@@ -21,30 +31,38 @@ describe Chewy::Config do
|
|
21
31
|
let(:dummy_type) { DummiesIndex::Dummy }
|
22
32
|
|
23
33
|
specify { subject.atomic { 42 }.should == 42 }
|
24
|
-
specify { expect { subject.atomic { subject.
|
25
|
-
specify { subject.atomic { subject.atomic { subject.
|
34
|
+
specify { expect { subject.atomic { subject.stash Class.new, 42 } }.to raise_error ArgumentError }
|
35
|
+
specify { subject.atomic { subject.atomic { subject.stash.should == [{}, {}] } } }
|
26
36
|
|
27
37
|
specify do
|
28
|
-
expect(dummy_type).to receive(:import).with([1,2,3]).once
|
38
|
+
expect(dummy_type).to receive(:import).with([1, 2, 3]).once
|
29
39
|
subject.atomic do
|
30
|
-
subject.
|
31
|
-
subject.
|
40
|
+
subject.stash dummy_type, [1, 2]
|
41
|
+
subject.stash dummy_type, [2, 3]
|
32
42
|
end
|
33
43
|
end
|
34
44
|
|
35
45
|
specify do
|
36
|
-
expect(dummy_type).to receive(:import).with([2
|
37
|
-
|
46
|
+
expect(dummy_type).to receive(:import).with([1, 2]).once
|
47
|
+
subject.atomic do
|
48
|
+
subject.stash dummy_type, [1, 2]
|
49
|
+
raise
|
50
|
+
end rescue nil
|
51
|
+
end
|
52
|
+
|
53
|
+
specify do
|
54
|
+
expect(dummy_type).to receive(:import).with([2, 3]).once
|
55
|
+
expect(dummy_type).to receive(:import).with([1, 2]).once
|
38
56
|
subject.atomic do
|
39
|
-
subject.
|
57
|
+
subject.stash dummy_type, [2, 3]
|
40
58
|
subject.atomic do
|
41
|
-
subject.
|
59
|
+
subject.stash dummy_type, [1, 2]
|
42
60
|
end
|
43
61
|
end
|
44
62
|
end
|
45
63
|
end
|
46
64
|
|
47
|
-
describe '#
|
48
|
-
specify { subject.atomic { subject.
|
65
|
+
describe '#stash' do
|
66
|
+
specify { subject.atomic { subject.stash.should == [{}] } }
|
49
67
|
end
|
50
68
|
end
|
@@ -15,13 +15,19 @@ describe Chewy::Fields::Base do
|
|
15
15
|
context do
|
16
16
|
before do
|
17
17
|
field.nested(described_class.new(:subname1, value: ->(o){ o.subvalue1 }))
|
18
|
-
field.nested(described_class.new(:subname2))
|
18
|
+
field.nested(described_class.new(:subname2, value: ->{ subvalue2 }))
|
19
|
+
field.nested(described_class.new(:subname3))
|
19
20
|
end
|
20
21
|
|
21
|
-
specify { field.compose(double(value: double(subvalue1: 'hello',
|
22
|
-
.should == {name: {'subname1' => 'hello', 'subname2' => 'world'}} }
|
23
|
-
specify { field.compose(double(value: [
|
24
|
-
|
22
|
+
specify { field.compose(double(value: double(subvalue1: 'hello', subvalue2: 'value', subname3: 'world')))
|
23
|
+
.should == {name: {'subname1' => 'hello', 'subname2' => 'value', 'subname3' => 'world'}} }
|
24
|
+
specify { field.compose(double(value: [
|
25
|
+
double(subvalue1: 'hello1', subvalue2: 'value1', subname3: 'world1'),
|
26
|
+
double(subvalue1: 'hello2', subvalue2: 'value2', subname3: 'world2')
|
27
|
+
])).should == {name: [
|
28
|
+
{'subname1' => 'hello1', 'subname2' => 'value1', 'subname3' => 'world1'},
|
29
|
+
{'subname1' => 'hello2', 'subname2' => 'value2', 'subname3' => 'world2'}
|
30
|
+
]} }
|
25
31
|
end
|
26
32
|
|
27
33
|
context do
|
@@ -6,48 +6,48 @@ describe Chewy::Index::Actions do
|
|
6
6
|
|
7
7
|
before { stub_index :dummies }
|
8
8
|
|
9
|
-
describe '.
|
10
|
-
specify { DummiesIndex.
|
9
|
+
describe '.exists?' do
|
10
|
+
specify { DummiesIndex.exists?.should be_false }
|
11
11
|
|
12
12
|
context do
|
13
|
-
before { DummiesIndex.
|
14
|
-
specify { DummiesIndex.
|
13
|
+
before { DummiesIndex.create }
|
14
|
+
specify { DummiesIndex.exists?.should be_true }
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
-
describe '.
|
19
|
-
specify { DummiesIndex.
|
18
|
+
describe '.create' do
|
19
|
+
specify { DummiesIndex.create.should be_true }
|
20
20
|
|
21
21
|
context do
|
22
|
-
before { DummiesIndex.
|
23
|
-
specify { DummiesIndex.
|
22
|
+
before { DummiesIndex.create }
|
23
|
+
specify { DummiesIndex.create.should be_false }
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
|
-
describe '.
|
28
|
-
specify { expect { DummiesIndex.
|
27
|
+
describe '.create!' do
|
28
|
+
specify { expect { DummiesIndex.create! }.not_to raise_error }
|
29
29
|
|
30
30
|
context do
|
31
|
-
before { DummiesIndex.
|
32
|
-
specify { expect { DummiesIndex.
|
31
|
+
before { DummiesIndex.create }
|
32
|
+
specify { expect { DummiesIndex.create! }.to raise_error }
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
|
-
describe '.
|
37
|
-
specify { DummiesIndex.
|
36
|
+
describe '.delete' do
|
37
|
+
specify { DummiesIndex.delete.should be_false }
|
38
38
|
|
39
39
|
context do
|
40
|
-
before { DummiesIndex.
|
41
|
-
specify { DummiesIndex.
|
40
|
+
before { DummiesIndex.create }
|
41
|
+
specify { DummiesIndex.delete.should be_true }
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
45
|
-
describe '.
|
46
|
-
specify { expect { DummiesIndex.
|
45
|
+
describe '.delete!' do
|
46
|
+
specify { expect { DummiesIndex.delete! }.to raise_error }
|
47
47
|
|
48
48
|
context do
|
49
|
-
before { DummiesIndex.
|
50
|
-
specify { expect { DummiesIndex.
|
49
|
+
before { DummiesIndex.create }
|
50
|
+
specify { expect { DummiesIndex.delete! }.not_to raise_error }
|
51
51
|
end
|
52
52
|
end
|
53
53
|
end
|
@@ -10,12 +10,12 @@ describe Chewy::Index::Search do
|
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
|
-
let(:product) { ProductsIndex
|
13
|
+
let(:product) { ProductsIndex::Product }
|
14
14
|
|
15
|
-
describe '.
|
16
|
-
specify
|
17
|
-
|
18
|
-
|
15
|
+
describe '.all' do
|
16
|
+
specify { product.all.should be_a Chewy::Query }
|
17
|
+
specify { product.all.object_id.should_not == product.all.object_id }
|
18
|
+
specify { product.all.should == product.all }
|
19
19
|
end
|
20
20
|
|
21
21
|
describe '.search_string' do
|
data/spec/chewy/index_spec.rb
CHANGED
@@ -3,20 +3,40 @@ require 'spec_helper'
|
|
3
3
|
describe Chewy::Index do
|
4
4
|
include ClassHelpers
|
5
5
|
|
6
|
-
|
7
|
-
|
6
|
+
before do
|
7
|
+
stub_index(:dummies) do
|
8
|
+
define_type :dummy
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe '.client' do
|
13
|
+
specify { stub_index(:dummies1).client.should == stub_index(:dummies2).client }
|
14
|
+
|
15
|
+
context do
|
8
16
|
before do
|
9
|
-
stub_index(:
|
10
|
-
|
11
|
-
end
|
17
|
+
stub_index(:dummies1)
|
18
|
+
stub_index(:dummies2, Dummies1Index)
|
12
19
|
end
|
13
20
|
|
14
|
-
specify {
|
15
|
-
specify { DummiesIndex.types['dummy'].should be < Chewy::Type::Base }
|
16
|
-
specify { DummiesIndex.types['dummy'].type_name.should == 'dummy' }
|
21
|
+
specify { Dummies1Index.client.should == Dummies2Index.client }
|
17
22
|
end
|
18
23
|
end
|
19
24
|
|
25
|
+
describe '.type_hash' do
|
26
|
+
specify { DummiesIndex.type_hash['dummy'].should == DummiesIndex::Dummy }
|
27
|
+
specify { DummiesIndex.type_hash.should have_key 'dummy' }
|
28
|
+
specify { DummiesIndex.type_hash['dummy'].should be < Chewy::Type::Base }
|
29
|
+
specify { DummiesIndex.type_hash['dummy'].type_name.should == 'dummy' }
|
30
|
+
end
|
31
|
+
|
32
|
+
specify { DummiesIndex.type_names.should == DummiesIndex.type_hash.keys }
|
33
|
+
|
34
|
+
describe '.types' do
|
35
|
+
specify { DummiesIndex.types.should == DummiesIndex.type_hash.values }
|
36
|
+
specify { DummiesIndex.types(:dummy).should be_a Chewy::Query }
|
37
|
+
specify { DummiesIndex.types(:user).should be_a Chewy::Query }
|
38
|
+
end
|
39
|
+
|
20
40
|
describe '.index_name' do
|
21
41
|
specify { expect { Class.new(Chewy::Index).index_name }.to raise_error Chewy::UndefinedIndex }
|
22
42
|
specify { Class.new(Chewy::Index) { index_name :myindex }.index_name.should == 'myindex' }
|
@@ -0,0 +1,173 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Chewy::Query::Context do
|
4
|
+
def Bool options
|
5
|
+
Chewy::Query::Nodes::Bool.new.tap do |bool|
|
6
|
+
bool.must(*options[:must]) if options[:must].present?
|
7
|
+
bool.must_not(*options[:must_not]) if options[:must_not].present?
|
8
|
+
bool.should(*options[:should]) if options[:should].present?
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
%w(field group and or not raw exists missing prefix regexp range equal query script).each do |method|
|
13
|
+
define_method method.camelize do |*args|
|
14
|
+
"Chewy::Query::Nodes::#{method.camelize}".constantize.new *args
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def query &block
|
19
|
+
Chewy::Query::Context.new(&block).__result__
|
20
|
+
end
|
21
|
+
|
22
|
+
context 'outer scope' do
|
23
|
+
let(:email) { 'email' }
|
24
|
+
specify { query { email }.should be_eql Field(:email) }
|
25
|
+
specify { query { o{email} }.should == 'email' }
|
26
|
+
end
|
27
|
+
|
28
|
+
context 'field' do
|
29
|
+
let(:email) { 'email' }
|
30
|
+
specify { query { f(:email) }.should be_eql Field(:email) }
|
31
|
+
specify { query { f{ :email } }.should be_eql Field(:email) }
|
32
|
+
specify { query { f{ email } }.should be_eql Field(:email) }
|
33
|
+
specify { query { email }.should be_eql Field(:email) }
|
34
|
+
specify { query { emails.first }.should be_eql Field('emails.first') }
|
35
|
+
specify { query { emails.first.second }.should be_eql Field('emails.first.second') }
|
36
|
+
end
|
37
|
+
|
38
|
+
context 'term' do
|
39
|
+
specify { query { email == 'email' }.should be_eql Equal(:email, 'email') }
|
40
|
+
specify { query { name != 'name' }.should be_eql Not(Equal(:name, 'name')) }
|
41
|
+
specify { query { email == ['email1', 'email2'] }.should be_eql Equal(:email, ['email1', 'email2']) }
|
42
|
+
specify { query { email != ['email1', 'email2'] }.should be_eql Not(Equal(:email, ['email1', 'email2'])) }
|
43
|
+
specify { query { email(execution: :bool) == ['email1', 'email2'] }
|
44
|
+
.should be_eql Equal(:email, ['email1', 'email2'], execution: :bool) }
|
45
|
+
specify { query { email(:bool) == ['email1', 'email2'] }
|
46
|
+
.should be_eql Equal(:email, ['email1', 'email2'], execution: :bool) }
|
47
|
+
specify { query { email(:b) == ['email1', 'email2'] }
|
48
|
+
.should be_eql Equal(:email, ['email1', 'email2'], execution: :bool) }
|
49
|
+
end
|
50
|
+
|
51
|
+
context 'bool' do
|
52
|
+
specify { query { must(email == 'email') }.should be_eql Bool(must: [Equal(:email, 'email')]) }
|
53
|
+
specify { query { must_not(email == 'email') }.should be_eql Bool(must_not: [Equal(:email, 'email')]) }
|
54
|
+
specify { query { should(email == 'email') }.should be_eql Bool(should: [Equal(:email, 'email')]) }
|
55
|
+
specify { query {
|
56
|
+
must(email == 'email').should(address != 'address', age == 42)
|
57
|
+
.must_not(sex == 'm').must(name == 'name')
|
58
|
+
}.should be_eql Bool(
|
59
|
+
must: [Equal(:email, 'email'), Equal(:name, 'name')],
|
60
|
+
must_not: [Equal(:sex, 'm')],
|
61
|
+
should: [Not(Equal(:address, 'address')), Equal(:age, 42)]
|
62
|
+
) }
|
63
|
+
end
|
64
|
+
|
65
|
+
context 'exists' do
|
66
|
+
specify { query { email? }.should be_eql Exists(:email) }
|
67
|
+
specify { query { !!email? }.should be_eql Exists(:email) }
|
68
|
+
specify { query { emails.first? }.should be_eql Exists('emails.first') }
|
69
|
+
specify { query { !!emails.first? }.should be_eql Exists('emails.first') }
|
70
|
+
specify { query { emails != nil }.should be_eql Exists('emails') }
|
71
|
+
specify { query { !(emails == nil) }.should be_eql Exists('emails') }
|
72
|
+
end
|
73
|
+
|
74
|
+
context 'missing' do
|
75
|
+
specify { query { !email }.should be_eql Missing(:email) }
|
76
|
+
specify { query { !email? }.should be_eql Missing(:email, null_value: true) }
|
77
|
+
specify { query { !emails.first }.should be_eql Missing('emails.first') }
|
78
|
+
specify { query { !emails.first? }.should be_eql Missing('emails.first', null_value: true) }
|
79
|
+
specify { query { emails == nil }.should be_eql Missing('emails', existence: false, null_value: true) }
|
80
|
+
specify { query { emails.first == nil }.should be_eql Missing('emails.first', existence: false, null_value: true) }
|
81
|
+
end
|
82
|
+
|
83
|
+
context 'range' do
|
84
|
+
specify { query { age > 42 }.should be_eql Range(:age, gt: 42) }
|
85
|
+
specify { query { age >= 42 }.should be_eql Range(:age, gt: 42, left_closed: true) }
|
86
|
+
specify { query { age < 42 }.should be_eql Range(:age, lt: 42) }
|
87
|
+
specify { query { age <= 42 }.should be_eql Range(:age, lt: 42, right_closed: true) }
|
88
|
+
|
89
|
+
specify { query { age == (30..42) }.should be_eql Range(:age, gt: 30, lt: 42) }
|
90
|
+
specify { query { age == [30..42] }.should be_eql Range(:age, gt: 30, lt: 42, left_closed: true, right_closed: true) }
|
91
|
+
specify { query { (age > 30) & (age < 42) }.should be_eql Range(:age, gt: 30, lt: 42) }
|
92
|
+
specify { query { (age > 30) & (age <= 42) }.should be_eql Range(:age, gt: 30, lt: 42, right_closed: true) }
|
93
|
+
specify { query { (age >= 30) & (age < 42) }.should be_eql Range(:age, gt: 30, lt: 42, left_closed: true) }
|
94
|
+
specify { query { (age >= 30) & (age <= 42) }.should be_eql Range(:age, gt: 30, lt: 42, right_closed: true, left_closed: true) }
|
95
|
+
specify { query { (age > 30) | (age < 42) }.should be_eql Or(Range(:age, gt: 30), Range(:age, lt: 42)) }
|
96
|
+
end
|
97
|
+
|
98
|
+
context 'prefix' do
|
99
|
+
specify { query { name =~ 'nam' }.should be_eql Prefix(:name, 'nam') }
|
100
|
+
specify { query { name !~ 'nam' }.should be_eql Not(Prefix(:name, 'nam')) }
|
101
|
+
end
|
102
|
+
|
103
|
+
context 'regexp' do
|
104
|
+
specify { query { name =~ /name/ }.should be_eql Regexp(:name, 'name') }
|
105
|
+
specify { query { name == /name/ }.should be_eql Regexp(:name, 'name') }
|
106
|
+
specify { query { name !~ /name/ }.should be_eql Not(Regexp(:name, 'name')) }
|
107
|
+
specify { query { name != /name/ }.should be_eql Not(Regexp(:name, 'name')) }
|
108
|
+
specify { query { name(:anystring, :intersection) =~ /name/ }.should be_eql Regexp(:name, 'name', flags: %w(anystring intersection)) }
|
109
|
+
end
|
110
|
+
|
111
|
+
context 'query' do
|
112
|
+
let(:some_query) { 'some query' }
|
113
|
+
specify { query { q('some query') }.should be_eql Query('some query') }
|
114
|
+
specify { query { q{'some query'} }.should be_eql Query('some query') }
|
115
|
+
specify { query { q{ some_query } }.should be_eql Query('some query') }
|
116
|
+
end
|
117
|
+
|
118
|
+
context 'raw' do
|
119
|
+
let(:raw_query) { {term: {name: 'name'}} }
|
120
|
+
specify { query { r(term: {name: 'name'}) }.should be_eql Raw(term: {name: 'name'}) }
|
121
|
+
specify { query { r{ {term: {name: 'name'}} } }.should be_eql Raw(term: {name: 'name'}) }
|
122
|
+
specify { query { r{ raw_query } }.should be_eql Raw(term: {name: 'name'}) }
|
123
|
+
end
|
124
|
+
|
125
|
+
context 'script' do
|
126
|
+
let(:some_script) { 'some script' }
|
127
|
+
specify { query { s('some script') }.should be_eql Script('some script') }
|
128
|
+
specify { query { s('some script', param1: 42) }.should be_eql Script('some script', param1: 42) }
|
129
|
+
specify { query { s{'some script'} }.should be_eql Script('some script') }
|
130
|
+
specify { query { s(param1: 42) { some_script } }.should be_eql Script('some script', param1: 42) }
|
131
|
+
end
|
132
|
+
|
133
|
+
context 'and or not' do
|
134
|
+
specify { query { (email == 'email') & (name == 'name') }
|
135
|
+
.should be_eql And(Equal(:email, 'email'), Equal(:name, 'name')) }
|
136
|
+
specify { query { (email == 'email') | (name == 'name') }
|
137
|
+
.should be_eql Or(Equal(:email, 'email'), Equal(:name, 'name')) }
|
138
|
+
specify { query { !(email == 'email') }.should be_eql Not(Equal(:email, 'email')) }
|
139
|
+
|
140
|
+
specify { query { (email == 'email') & (name == 'name') | (address != 'address') }
|
141
|
+
.should be_eql Or(
|
142
|
+
And(
|
143
|
+
Equal(:email, 'email'),
|
144
|
+
Equal(:name, 'name')
|
145
|
+
),
|
146
|
+
Not(Equal(:address, 'address'))
|
147
|
+
) }
|
148
|
+
specify { query { (email == 'email') & ((name == 'name') | (address != 'address')) }
|
149
|
+
.should be_eql And(
|
150
|
+
Equal(:email, 'email'),
|
151
|
+
Or(
|
152
|
+
Equal(:name, 'name'),
|
153
|
+
Not(Equal(:address, 'address')),
|
154
|
+
)
|
155
|
+
) }
|
156
|
+
specify { query { (email == 'email') & ((name == 'name') & (address != 'address')) }
|
157
|
+
.should be_eql And(
|
158
|
+
Equal(:email, 'email'),
|
159
|
+
Equal(:name, 'name'),
|
160
|
+
Not(Equal(:address, 'address')),
|
161
|
+
) }
|
162
|
+
specify { query { ((email == 'email') | (name == 'name')) | (address != 'address') }
|
163
|
+
.should be_eql Or(
|
164
|
+
Equal(:email, 'email'),
|
165
|
+
Equal(:name, 'name'),
|
166
|
+
Not(Equal(:address, 'address')),
|
167
|
+
) }
|
168
|
+
specify { query { !((email == 'email') | (name == 'name')) }
|
169
|
+
.should be_eql Not(Or(Equal(:email, 'email'), Equal(:name, 'name'))) }
|
170
|
+
specify { query { !!((email == 'email') | (name == 'name')) }
|
171
|
+
.should be_eql Or(Equal(:email, 'email'), Equal(:name, 'name')) }
|
172
|
+
end
|
173
|
+
end
|