chewy 0.5.2 → 0.6.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.
Files changed (92) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +26 -4
  3. data/CHANGELOG.md +16 -0
  4. data/Gemfile +3 -1
  5. data/README.md +2 -10
  6. data/chewy.gemspec +0 -1
  7. data/gemfiles/Gemfile.rails-3.2.active_record +6 -0
  8. data/gemfiles/Gemfile.rails-3.2.active_record.kaminari +7 -0
  9. data/gemfiles/Gemfile.rails-3.2.active_record.will_paginate +7 -0
  10. data/gemfiles/Gemfile.rails-4.0.active_record +6 -0
  11. data/gemfiles/Gemfile.rails-4.0.active_record.kaminari +7 -0
  12. data/gemfiles/Gemfile.rails-4.0.active_record.will_paginate +7 -0
  13. data/gemfiles/Gemfile.rails-4.0.mongoid +6 -0
  14. data/gemfiles/Gemfile.rails-4.0.mongoid.kaminari +7 -0
  15. data/gemfiles/Gemfile.rails-4.0.mongoid.will_paginate +7 -0
  16. data/gemfiles/Gemfile.rails-4.1.active_record +6 -0
  17. data/gemfiles/Gemfile.rails-4.1.active_record.kaminari +7 -0
  18. data/gemfiles/Gemfile.rails-4.1.active_record.will_paginate +7 -0
  19. data/gemfiles/Gemfile.rails-4.1.mongoid +6 -0
  20. data/gemfiles/Gemfile.rails-4.1.mongoid.kaminari +7 -0
  21. data/gemfiles/Gemfile.rails-4.1.mongoid.will_paginate +7 -0
  22. data/gemfiles/Gemfile.rails-4.2.active_record +6 -0
  23. data/gemfiles/Gemfile.rails-4.2.active_record.kaminari +7 -0
  24. data/gemfiles/Gemfile.rails-4.2.active_record.will_paginate +7 -0
  25. data/gemfiles/Gemfile.rails-4.2.mongoid +6 -0
  26. data/gemfiles/Gemfile.rails-4.2.mongoid.kaminari +7 -0
  27. data/gemfiles/Gemfile.rails-4.2.mongoid.will_paginate +7 -0
  28. data/lib/chewy.rb +33 -5
  29. data/lib/chewy/config.rb +1 -0
  30. data/lib/chewy/index/search.rb +6 -3
  31. data/lib/chewy/query.rb +74 -1
  32. data/lib/chewy/query/compose.rb +4 -4
  33. data/lib/chewy/query/pagination.rb +5 -4
  34. data/lib/chewy/query/pagination/kaminari.rb +1 -1
  35. data/lib/chewy/query/pagination/will_paginate.rb +27 -0
  36. data/lib/chewy/type.rb +1 -0
  37. data/lib/chewy/type/adapter/active_record.rb +2 -2
  38. data/lib/chewy/type/adapter/mongoid.rb +147 -0
  39. data/lib/chewy/type/adapter/object.rb +1 -1
  40. data/lib/chewy/type/import.rb +1 -0
  41. data/lib/chewy/type/observe.rb +34 -6
  42. data/lib/chewy/version.rb +1 -1
  43. data/spec/chewy/config_spec.rb +17 -17
  44. data/spec/chewy/fields/base_spec.rb +62 -62
  45. data/spec/chewy/fields/root_spec.rb +5 -5
  46. data/spec/chewy/index/actions_spec.rb +127 -127
  47. data/spec/chewy/index/aliases_spec.rb +9 -9
  48. data/spec/chewy/index/search_spec.rb +4 -4
  49. data/spec/chewy/index/settings_spec.rb +33 -33
  50. data/spec/chewy/index_spec.rb +49 -49
  51. data/spec/chewy/query/criteria_spec.rb +173 -161
  52. data/spec/chewy/query/filters_spec.rb +76 -76
  53. data/spec/chewy/query/loading_spec.rb +54 -23
  54. data/spec/chewy/query/nodes/and_spec.rb +4 -4
  55. data/spec/chewy/query/nodes/bool_spec.rb +8 -8
  56. data/spec/chewy/query/nodes/equal_spec.rb +19 -19
  57. data/spec/chewy/query/nodes/exists_spec.rb +6 -6
  58. data/spec/chewy/query/nodes/has_child_spec.rb +25 -25
  59. data/spec/chewy/query/nodes/has_parent_spec.rb +25 -25
  60. data/spec/chewy/query/nodes/match_all_spec.rb +1 -1
  61. data/spec/chewy/query/nodes/missing_spec.rb +4 -4
  62. data/spec/chewy/query/nodes/not_spec.rb +4 -4
  63. data/spec/chewy/query/nodes/or_spec.rb +4 -4
  64. data/spec/chewy/query/nodes/prefix_spec.rb +5 -5
  65. data/spec/chewy/query/nodes/query_spec.rb +2 -2
  66. data/spec/chewy/query/nodes/range_spec.rb +18 -18
  67. data/spec/chewy/query/nodes/raw_spec.rb +1 -1
  68. data/spec/chewy/query/nodes/regexp_spec.rb +18 -18
  69. data/spec/chewy/query/nodes/script_spec.rb +4 -4
  70. data/spec/chewy/query/pagination/kaminari_spec.rb +41 -39
  71. data/spec/chewy/query/pagination/will_paginage_spec.rb +60 -0
  72. data/spec/chewy/query/pagination_spec.rb +8 -7
  73. data/spec/chewy/query_spec.rb +166 -167
  74. data/spec/chewy/rspec/update_index_spec.rb +1 -1
  75. data/spec/chewy/runtime/version_spec.rb +30 -30
  76. data/spec/chewy/runtime_spec.rb +3 -3
  77. data/spec/chewy/type/actions_spec.rb +3 -3
  78. data/spec/chewy/type/adapter/active_record_spec.rb +143 -143
  79. data/spec/chewy/type/adapter/mongoid_spec.rb +219 -0
  80. data/spec/chewy/type/adapter/object_spec.rb +39 -39
  81. data/spec/chewy/type/import_spec.rb +67 -37
  82. data/spec/chewy/type/mapping_spec.rb +12 -12
  83. data/spec/chewy/type/observe_spec.rb +5 -6
  84. data/spec/chewy/type/wrapper_spec.rb +12 -12
  85. data/spec/chewy_spec.rb +26 -28
  86. data/spec/spec_helper.rb +19 -31
  87. data/spec/support/active_record.rb +52 -0
  88. data/spec/support/class_helpers.rb +0 -4
  89. data/spec/support/mongoid.rb +87 -0
  90. metadata +33 -18
  91. data/gemfiles/Gemfile.rails-3.2 +0 -15
  92. data/gemfiles/Gemfile.rails-4.0 +0 -15
@@ -21,31 +21,31 @@ describe Chewy::Query::Filters do
21
21
 
22
22
  context 'outer scope' do
23
23
  let(:email) { 'email' }
24
- specify { query { email }.should be_eql Field(:email) }
25
- specify { query { o{email} }.should == 'email' }
24
+ specify { expect(query { email }).to be_eql Field(:email) }
25
+ specify { expect(query { o{email} }).to eq('email') }
26
26
  end
27
27
 
28
28
  context 'field' do
29
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') }
30
+ specify { expect(query { f(:email) }).to be_eql Field(:email) }
31
+ specify { expect(query { f{ :email } }).to be_eql Field(:email) }
32
+ specify { expect(query { f{ email } }).to be_eql Field(:email) }
33
+ specify { expect(query { email }).to be_eql Field(:email) }
34
+ specify { expect(query { emails.first }).to be_eql Field('emails.first') }
35
+ specify { expect(query { emails.first.second }).to be_eql Field('emails.first.second') }
36
36
  end
37
37
 
38
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) }
39
+ specify { expect(query { email == 'email' }).to be_eql Equal(:email, 'email') }
40
+ specify { expect(query { name != 'name' }).to be_eql Not(Equal(:name, 'name')) }
41
+ specify { expect(query { email == ['email1', 'email2'] }).to be_eql Equal(:email, ['email1', 'email2']) }
42
+ specify { expect(query { email != ['email1', 'email2'] }).to be_eql Not(Equal(:email, ['email1', 'email2'])) }
43
+ specify { expect(query { email(execution: :bool) == ['email1', 'email2'] })
44
+ .to be_eql Equal(:email, ['email1', 'email2'], execution: :bool) }
45
+ specify { expect(query { email(:bool) == ['email1', 'email2'] })
46
+ .to be_eql Equal(:email, ['email1', 'email2'], execution: :bool) }
47
+ specify { expect(query { email(:b) == ['email1', 'email2'] })
48
+ .to be_eql Equal(:email, ['email1', 'email2'], execution: :bool) }
49
49
  end
50
50
 
51
51
  context 'bool' do
@@ -63,111 +63,111 @@ describe Chewy::Query::Filters do
63
63
  end
64
64
 
65
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') }
66
+ specify { expect(query { email? }).to be_eql Exists(:email) }
67
+ specify { expect(query { !!email? }).to be_eql Exists(:email) }
68
+ specify { expect(query { emails.first? }).to be_eql Exists('emails.first') }
69
+ specify { expect(query { !!emails.first? }).to be_eql Exists('emails.first') }
70
+ specify { expect(query { emails != nil }).to be_eql Exists('emails') }
71
+ specify { expect(query { !(emails == nil) }).to be_eql Exists('emails') }
72
72
  end
73
73
 
74
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) }
75
+ specify { expect(query { !email }).to be_eql Missing(:email) }
76
+ specify { expect(query { !email? }).to be_eql Missing(:email, null_value: true) }
77
+ specify { expect(query { !emails.first }).to be_eql Missing('emails.first') }
78
+ specify { expect(query { !emails.first? }).to be_eql Missing('emails.first', null_value: true) }
79
+ specify { expect(query { emails == nil }).to be_eql Missing('emails', existence: false, null_value: true) }
80
+ specify { expect(query { emails.first == nil }).to be_eql Missing('emails.first', existence: false, null_value: true) }
81
81
  end
82
82
 
83
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) }
84
+ specify { expect(query { age > 42 }).to be_eql Range(:age, gt: 42) }
85
+ specify { expect(query { age >= 42 }).to be_eql Range(:age, gt: 42, left_closed: true) }
86
+ specify { expect(query { age < 42 }).to be_eql Range(:age, lt: 42) }
87
+ specify { expect(query { age <= 42 }).to be_eql Range(:age, lt: 42, right_closed: true) }
88
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)) }
89
+ specify { expect(query { age == (30..42) }).to be_eql Range(:age, gt: 30, lt: 42) }
90
+ specify { expect(query { age == [30..42] }).to be_eql Range(:age, gt: 30, lt: 42, left_closed: true, right_closed: true) }
91
+ specify { expect(query { (age > 30) & (age < 42) }).to be_eql Range(:age, gt: 30, lt: 42) }
92
+ specify { expect(query { (age > 30) & (age <= 42) }).to be_eql Range(:age, gt: 30, lt: 42, right_closed: true) }
93
+ specify { expect(query { (age >= 30) & (age < 42) }).to be_eql Range(:age, gt: 30, lt: 42, left_closed: true) }
94
+ specify { expect(query { (age >= 30) & (age <= 42) }).to be_eql Range(:age, gt: 30, lt: 42, right_closed: true, left_closed: true) }
95
+ specify { expect(query { (age > 30) | (age < 42) }).to be_eql Or(Range(:age, gt: 30), Range(:age, lt: 42)) }
96
96
  end
97
97
 
98
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')) }
99
+ specify { expect(query { name =~ 'nam' }).to be_eql Prefix(:name, 'nam') }
100
+ specify { expect(query { name !~ 'nam' }).to be_eql Not(Prefix(:name, 'nam')) }
101
101
  end
102
102
 
103
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)) }
104
+ specify { expect(query { name =~ /name/ }).to be_eql Regexp(:name, 'name') }
105
+ specify { expect(query { name == /name/ }).to be_eql Regexp(:name, 'name') }
106
+ specify { expect(query { name !~ /name/ }).to be_eql Not(Regexp(:name, 'name')) }
107
+ specify { expect(query { name != /name/ }).to be_eql Not(Regexp(:name, 'name')) }
108
+ specify { expect(query { name(:anystring, :intersection) =~ /name/ }).to be_eql Regexp(:name, 'name', flags: %w(anystring intersection)) }
109
109
  end
110
110
 
111
111
  context 'query' do
112
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') }
113
+ specify { expect(query { q('some query') }).to be_eql Query('some query') }
114
+ specify { expect(query { q{'some query'} }).to be_eql Query('some query') }
115
+ specify { expect(query { q{ some_query } }).to be_eql Query('some query') }
116
116
  end
117
117
 
118
118
  context 'raw' do
119
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'}) }
120
+ specify { expect(query { r(term: {name: 'name'}) }).to be_eql Raw(term: {name: 'name'}) }
121
+ specify { expect(query { r{ {term: {name: 'name'}} } }).to be_eql Raw(term: {name: 'name'}) }
122
+ specify { expect(query { r{ raw_query } }).to be_eql Raw(term: {name: 'name'}) }
123
123
  end
124
124
 
125
125
  context 'script' do
126
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) }
127
+ specify { expect(query { s('some script') }).to be_eql Script('some script') }
128
+ specify { expect(query { s('some script', param1: 42) }).to be_eql Script('some script', param1: 42) }
129
+ specify { expect(query { s{'some script'} }).to be_eql Script('some script') }
130
+ specify { expect(query { s(param1: 42) { some_script } }).to be_eql Script('some script', param1: 42) }
131
131
  end
132
132
 
133
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(
134
+ specify { expect(query { (email == 'email') & (name == 'name') })
135
+ .to be_eql And(Equal(:email, 'email'), Equal(:name, 'name')) }
136
+ specify { expect(query { (email == 'email') | (name == 'name') })
137
+ .to be_eql Or(Equal(:email, 'email'), Equal(:name, 'name')) }
138
+ specify { expect(query { !(email == 'email') }).to be_eql Not(Equal(:email, 'email')) }
139
+
140
+ specify { expect(query { (email == 'email') & (name == 'name') | (address != 'address') })
141
+ .to be_eql Or(
142
142
  And(
143
143
  Equal(:email, 'email'),
144
144
  Equal(:name, 'name')
145
145
  ),
146
146
  Not(Equal(:address, 'address'))
147
147
  ) }
148
- specify { query { (email == 'email') & ((name == 'name') | (address != 'address')) }
149
- .should be_eql And(
148
+ specify { expect(query { (email == 'email') & ((name == 'name') | (address != 'address')) })
149
+ .to be_eql And(
150
150
  Equal(:email, 'email'),
151
151
  Or(
152
152
  Equal(:name, 'name'),
153
153
  Not(Equal(:address, 'address')),
154
154
  )
155
155
  ) }
156
- specify { query { (email == 'email') & ((name == 'name') & (address != 'address')) }
157
- .should be_eql And(
156
+ specify { expect(query { (email == 'email') & ((name == 'name') & (address != 'address')) })
157
+ .to be_eql And(
158
158
  Equal(:email, 'email'),
159
159
  Equal(:name, 'name'),
160
160
  Not(Equal(:address, 'address')),
161
161
  ) }
162
- specify { query { ((email == 'email') | (name == 'name')) | (address != 'address') }
163
- .should be_eql Or(
162
+ specify { expect(query { ((email == 'email') | (name == 'name')) | (address != 'address') })
163
+ .to be_eql Or(
164
164
  Equal(:email, 'email'),
165
165
  Equal(:name, 'name'),
166
166
  Not(Equal(:address, 'address')),
167
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')) }
168
+ specify { expect(query { !((email == 'email') | (name == 'name')) })
169
+ .to be_eql Not(Or(Equal(:email, 'email'), Equal(:name, 'name'))) }
170
+ specify { expect(query { !!((email == 'email') | (name == 'name')) })
171
+ .to be_eql Or(Equal(:email, 'email'), Equal(:name, 'name')) }
172
172
  end
173
173
  end
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Chewy::Query::Loading do
4
- before { Chewy.client.indices.delete index: '*' }
3
+ describe Chewy::Query::Loading, :orm do
4
+ before { Chewy.massacre }
5
5
 
6
6
  before do
7
7
  stub_model(:city)
@@ -17,6 +17,7 @@ describe Chewy::Query::Loading do
17
17
  define_type City do
18
18
  field :rating, type: 'integer', value: ->(o){ o.rating }
19
19
  end
20
+
20
21
  define_type Country do
21
22
  field :rating, type: 'integer', value: ->(o){ o.rating }
22
23
  end
@@ -26,30 +27,60 @@ describe Chewy::Query::Loading do
26
27
  before { PlacesIndex.import!(cities: cities, countries: countries) }
27
28
 
28
29
  describe '#load' do
29
- specify { PlacesIndex.order(:rating).limit(6).load.total_count.should == 12 }
30
- specify { PlacesIndex.order(:rating).limit(6).load.should =~ cities.first(3) + countries.first(3) }
31
-
32
- specify { PlacesIndex.order(:rating).limit(6).load(city: { scope: ->{ where('rating < 2') } })
33
- .should =~ cities.first(2) + countries.first(3) + [nil] }
34
- specify { PlacesIndex.limit(6).load(city: { scope: ->{ where('rating < 2') } }).order(:rating)
35
- .should =~ cities.first(2) + countries.first(3) + [nil] }
36
- specify { PlacesIndex.order(:rating).limit(6).load(scope: ->{ where('rating < 2') })
37
- .should =~ cities.first(2) + countries.first(2) + [nil] * 2 }
38
- specify { PlacesIndex.order(:rating).limit(6).load(city: { scope: City.where('rating < 2') })
39
- .should =~ cities.first(2) + countries.first(3) + [nil] }
30
+ specify { expect(PlacesIndex.order(:rating).limit(6).load.total_count).to eq(12) }
31
+ specify { expect(PlacesIndex.order(:rating).limit(6).load).to match_array(cities.first(3) + countries.first(3)) }
32
+
33
+ context 'mongoid', :mongoid do
34
+ specify { expect(PlacesIndex.order(:rating).limit(6).load(city: { scope: ->{ where(:rating.lt => 2) } }))
35
+ .to match_array(cities.first(2) + countries.first(3) + [nil]) }
36
+ specify { expect(PlacesIndex.limit(6).load(city: { scope: ->{ where(:rating.lt => 2) } }).order(:rating))
37
+ .to match_array(cities.first(2) + countries.first(3) + [nil]) }
38
+ specify { expect(PlacesIndex.order(:rating).limit(6).load(scope: ->{ where(:rating.lt => 2) }))
39
+ .to match_array(cities.first(2) + countries.first(2) + [nil] * 2) }
40
+ specify { expect(PlacesIndex.order(:rating).limit(6).load(city: { scope: City.where(:rating.lt => 2) }))
41
+ .to match_array(cities.first(2) + countries.first(3) + [nil]) }
42
+ end
43
+
44
+ context 'active record', :active_record do
45
+ specify { expect(PlacesIndex.order(:rating).limit(6).load(city: { scope: ->{ where('rating < 2') } }))
46
+ .to match_array(cities.first(2) + countries.first(3) + [nil]) }
47
+ specify { expect(PlacesIndex.limit(6).load(city: { scope: ->{ where('rating < 2') } }).order(:rating))
48
+ .to match_array(cities.first(2) + countries.first(3) + [nil]) }
49
+ specify { expect(PlacesIndex.order(:rating).limit(6).load(scope: ->{ where('rating < 2') }))
50
+ .to match_array(cities.first(2) + countries.first(2) + [nil] * 2) }
51
+ specify { expect(PlacesIndex.order(:rating).limit(6).load(city: { scope: City.where('rating < 2') }))
52
+ .to match_array(cities.first(2) + countries.first(3) + [nil]) }
53
+ end
40
54
  end
41
55
 
42
56
  describe '#preload' do
43
- specify { PlacesIndex.order(:rating).limit(6).preload(scope: ->{ where('rating < 2') })
44
- .map(&:_object).should =~ cities.first(2) + countries.first(2) + [nil] * 2 }
45
- specify { PlacesIndex.limit(6).preload(scope: ->{ where('rating < 2') }).order(:rating)
46
- .map(&:_object).should =~ cities.first(2) + countries.first(2) + [nil] * 2 }
47
- specify { PlacesIndex.order(:rating).limit(6).preload(only: :city, scope: ->{ where('rating < 2') })
48
- .map(&:_object).should =~ cities.first(2) + [nil] * 4 }
49
- specify { PlacesIndex.order(:rating).limit(6).preload(except: [:city], scope: ->{ where('rating < 2') })
50
- .map(&:_object).should =~ countries.first(2) + [nil] * 4 }
51
- specify { PlacesIndex.order(:rating).limit(6).preload(only: [:city], except: :city, scope: ->{ where('rating < 2') })
52
- .map(&:_object).should =~ [nil] * 6 }
57
+ context 'mongoid', :mongoid do
58
+ specify { expect(PlacesIndex.order(:rating).limit(6).preload(scope: ->{ where(:rating.lt => 2) })
59
+ .map(&:_object)).to match_array(cities.first(2) + countries.first(2) + [nil] * 2) }
60
+ specify { expect(PlacesIndex.limit(6).preload(scope: ->{ where(:rating.lt => 2) }).order(:rating)
61
+ .map(&:_object)).to match_array(cities.first(2) + countries.first(2) + [nil] * 2) }
62
+
63
+ specify { expect(PlacesIndex.order(:rating).limit(6).preload(only: :city, scope: ->{ where(:rating.lt => 2) })
64
+ .map(&:_object)).to match_array(cities.first(2) + [nil] * 4) }
65
+ specify { expect(PlacesIndex.order(:rating).limit(6).preload(except: [:city], scope: ->{ where(:rating.lt => 2) })
66
+ .map(&:_object)).to match_array(countries.first(2) + [nil] * 4) }
67
+ specify { expect(PlacesIndex.order(:rating).limit(6).preload(only: [:city], except: :city, scope: ->{ where(:rating.lt => 2) })
68
+ .map(&:_object)).to match_array([nil] * 6) }
69
+ end
70
+
71
+ context 'active record', :active_record do
72
+ specify { expect(PlacesIndex.order(:rating).limit(6).preload(scope: ->{ where('rating < 2') })
73
+ .map(&:_object)).to match_array(cities.first(2) + countries.first(2) + [nil] * 2) }
74
+ specify { expect(PlacesIndex.limit(6).preload(scope: ->{ where('rating < 2') }).order(:rating)
75
+ .map(&:_object)).to match_array(cities.first(2) + countries.first(2) + [nil] * 2) }
76
+
77
+ specify { expect(PlacesIndex.order(:rating).limit(6).preload(only: :city, scope: ->{ where('rating < 2') })
78
+ .map(&:_object)).to match_array(cities.first(2) + [nil] * 4) }
79
+ specify { expect(PlacesIndex.order(:rating).limit(6).preload(except: [:city], scope: ->{ where('rating < 2') })
80
+ .map(&:_object)).to match_array(countries.first(2) + [nil] * 4) }
81
+ specify { expect(PlacesIndex.order(:rating).limit(6).preload(only: [:city], except: :city, scope: ->{ where('rating < 2') })
82
+ .map(&:_object)).to match_array([nil] * 6) }
83
+ end
53
84
  end
54
85
  end
55
86
  end
@@ -6,11 +6,11 @@ describe Chewy::Query::Nodes::And do
6
6
  Chewy::Query::Filters.new(&block).__render__
7
7
  end
8
8
 
9
- specify { render { name? & (email == 'email') }.should == {
9
+ specify { expect(render { name? & (email == 'email') }).to eq({
10
10
  and: [{exists: {field: 'name'}}, {term: {'email' => 'email'}}]
11
- } }
12
- specify { render { ~(name? & (email == 'email')) }.should == {
11
+ }) }
12
+ specify { expect(render { ~(name? & (email == 'email')) }).to eq({
13
13
  and: {filters: [{exists: {field: 'name'}}, {term: {'email' => 'email'}}], _cache: true}
14
- } }
14
+ }) }
15
15
  end
16
16
  end
@@ -6,17 +6,17 @@ describe Chewy::Query::Nodes::Bool do
6
6
  Chewy::Query::Filters.new(&block).__render__
7
7
  end
8
8
 
9
- specify { render { must(name == 'name', email == 'email') }.should == {
9
+ specify { expect(render { must(name == 'name', email == 'email') }).to eq({
10
10
  bool: {must: [{term: {'name' => 'name'}}, {term: {'email' => 'email'}}]
11
- } } }
12
- specify { render { must(name == 'name').must_not(email == 'email') }.should == {
11
+ } }) }
12
+ specify { expect(render { must(name == 'name').must_not(email == 'email') }).to eq({
13
13
  bool: {must: [{term: {'name' => 'name'}}], must_not: [{term: {'email' => 'email'}}]
14
- } } }
15
- specify { render { must(name == 'name').should(email == 'email') }.should == {
14
+ } }) }
15
+ specify { expect(render { must(name == 'name').should(email == 'email') }).to eq({
16
16
  bool: {must: [{term: {'name' => 'name'}}], should: [{ term: {'email' => 'email'}}]
17
- } } }
18
- specify { render { ~must(name == 'name').should(email == 'email') }.should == {
17
+ } }) }
18
+ specify { expect(render { ~must(name == 'name').should(email == 'email') }).to eq({
19
19
  bool: {must: [{term: {'name' => 'name'}}], should: [{ term: {'email' => 'email'}}], _cache: true
20
- } } }
20
+ } }) }
21
21
  end
22
22
  end
@@ -6,27 +6,27 @@ describe Chewy::Query::Nodes::Equal do
6
6
  Chewy::Query::Filters.new(&block).__render__
7
7
  end
8
8
 
9
- specify { render { name == 'name' }.should == {term: {'name' => 'name'}} }
10
- specify { render { name != 'name' }.should == {not: {term: {'name' => 'name'}}} }
11
- specify { render { name == ['name1', 'name2'] }.should == {terms: {'name' => ['name1', 'name2']}} }
12
- specify { render { name != ['name1', 'name2'] }.should == {not: {terms: {'name' => ['name1', 'name2']}}} }
9
+ specify { expect(render { name == 'name' }).to eq({term: {'name' => 'name'}}) }
10
+ specify { expect(render { name != 'name' }).to eq({not: {term: {'name' => 'name'}}}) }
11
+ specify { expect(render { name == ['name1', 'name2'] }).to eq({terms: {'name' => ['name1', 'name2']}}) }
12
+ specify { expect(render { name != ['name1', 'name2'] }).to eq({not: {terms: {'name' => ['name1', 'name2']}}}) }
13
13
 
14
- specify { render { name(:bool) == 'name' }.should == {term: {'name' => 'name'}} }
15
- specify { render { name(:borogoves) == ['name1', 'name2'] }.should == {terms: {'name' => ['name1', 'name2']}} }
14
+ specify { expect(render { name(:bool) == 'name' }).to eq({term: {'name' => 'name'}}) }
15
+ specify { expect(render { name(:borogoves) == ['name1', 'name2'] }).to eq({terms: {'name' => ['name1', 'name2']}}) }
16
16
 
17
- specify { render { name(:|) == ['name1', 'name2'] }.should == {terms: {'name' => ['name1', 'name2'], execution: :or}} }
18
- specify { render { name(:or) == ['name1', 'name2'] }.should == {terms: {'name' => ['name1', 'name2'], execution: :or}} }
19
- specify { render { name(:&) == ['name1', 'name2'] }.should == {terms: {'name' => ['name1', 'name2'], execution: :and}} }
20
- specify { render { name(:and) == ['name1', 'name2'] }.should == {terms: {'name' => ['name1', 'name2'], execution: :and}} }
21
- specify { render { name(:b) == ['name1', 'name2'] }.should == {terms: {'name' => ['name1', 'name2'], execution: :bool}} }
22
- specify { render { name(:bool) == ['name1', 'name2'] }.should == {terms: {'name' => ['name1', 'name2'], execution: :bool}} }
23
- specify { render { name(:f) == ['name1', 'name2'] }.should == {terms: {'name' => ['name1', 'name2'], execution: :fielddata}} }
24
- specify { render { name(:fielddata) == ['name1', 'name2'] }.should == {terms: {'name' => ['name1', 'name2'], execution: :fielddata}} }
17
+ specify { expect(render { name(:|) == ['name1', 'name2'] }).to eq({terms: {'name' => ['name1', 'name2'], execution: :or}}) }
18
+ specify { expect(render { name(:or) == ['name1', 'name2'] }).to eq({terms: {'name' => ['name1', 'name2'], execution: :or}}) }
19
+ specify { expect(render { name(:&) == ['name1', 'name2'] }).to eq({terms: {'name' => ['name1', 'name2'], execution: :and}}) }
20
+ specify { expect(render { name(:and) == ['name1', 'name2'] }).to eq({terms: {'name' => ['name1', 'name2'], execution: :and}}) }
21
+ specify { expect(render { name(:b) == ['name1', 'name2'] }).to eq({terms: {'name' => ['name1', 'name2'], execution: :bool}}) }
22
+ specify { expect(render { name(:bool) == ['name1', 'name2'] }).to eq({terms: {'name' => ['name1', 'name2'], execution: :bool}}) }
23
+ specify { expect(render { name(:f) == ['name1', 'name2'] }).to eq({terms: {'name' => ['name1', 'name2'], execution: :fielddata}}) }
24
+ specify { expect(render { name(:fielddata) == ['name1', 'name2'] }).to eq({terms: {'name' => ['name1', 'name2'], execution: :fielddata}}) }
25
25
 
26
- specify { render { ~name == 'name' }.should == {term: {'name' => 'name', _cache: true}} }
27
- specify { render { ~(name == 'name') }.should == {term: {'name' => 'name', _cache: true}} }
28
- specify { render { ~name != 'name' }.should == {not: {term: {'name' => 'name', _cache: true}}} }
29
- specify { render { ~name(:|) == ['name1', 'name2'] }.should == {terms: {'name' => ['name1', 'name2'], execution: :or, _cache: true}} }
30
- specify { render { ~name != ['name1', 'name2'] }.should == {not: {terms: {'name' => ['name1', 'name2'], _cache: true}}} }
26
+ specify { expect(render { ~name == 'name' }).to eq({term: {'name' => 'name', _cache: true}}) }
27
+ specify { expect(render { ~(name == 'name') }).to eq({term: {'name' => 'name', _cache: true}}) }
28
+ specify { expect(render { ~name != 'name' }).to eq({not: {term: {'name' => 'name', _cache: true}}}) }
29
+ specify { expect(render { ~name(:|) == ['name1', 'name2'] }).to eq({terms: {'name' => ['name1', 'name2'], execution: :or, _cache: true}}) }
30
+ specify { expect(render { ~name != ['name1', 'name2'] }).to eq({not: {terms: {'name' => ['name1', 'name2'], _cache: true}}}) }
31
31
  end
32
32
  end
@@ -6,13 +6,13 @@ describe Chewy::Query::Nodes::Exists do
6
6
  Chewy::Query::Filters.new(&block).__render__
7
7
  end
8
8
 
9
- specify { render { name? }.should == {exists: {field: 'name'}} }
9
+ specify { expect(render { name? }).to eq({exists: {field: 'name'}}) }
10
10
 
11
- specify { render { !!name? }.should == {exists: {field: 'name'}} }
12
- specify { render { !!name }.should == {exists: {field: 'name'}} }
13
- specify { render { name != nil }.should == {exists: {field: 'name'}} }
14
- specify { render { !(name == nil) }.should == {exists: {field: 'name'}} }
11
+ specify { expect(render { !!name? }).to eq({exists: {field: 'name'}}) }
12
+ specify { expect(render { !!name }).to eq({exists: {field: 'name'}}) }
13
+ specify { expect(render { name != nil }).to eq({exists: {field: 'name'}}) }
14
+ specify { expect(render { !(name == nil) }).to eq({exists: {field: 'name'}}) }
15
15
 
16
- specify { render { ~name? }.should == {exists: {field: 'name'}} }
16
+ specify { expect(render { ~name? }).to eq({exists: {field: 'name'}}) }
17
17
  end
18
18
  end
@@ -6,35 +6,35 @@ describe Chewy::Query::Nodes::HasChild do
6
6
  Chewy::Query::Filters.new(&block).__render__
7
7
  end
8
8
 
9
- specify { render { has_child('child') }.should == {has_child: {type: 'child'}} }
10
-
11
-
12
- specify { render { has_child('child').filter(term: {name: 'name'}) }
13
- .should == {has_child: {type: 'child', filter: {term: {name: 'name'}}}} }
14
- specify { render { has_child('child').filter{ name == 'name' } }
15
- .should == {has_child: {type: 'child', filter: {term: {'name' => 'name'}}}} }
16
- specify { render { has_child('child').filter(term: {name: 'name'}).filter{ age < 42 } }
17
- .should == {has_child: {type: 'child', filter: {and: [{term: {name: 'name'}}, range: {'age' => {lt: 42}}]}}} }
18
- specify { render { has_child('child').filter(term: {name: 'name'}).filter{ age < 42 }.filter_mode(:or) }
19
- .should == {has_child: {type: 'child', filter: {or: [{term: {name: 'name'}}, range: {'age' => {lt: 42}}]}}} }
20
-
21
- specify { render { has_child('child').query(match: {name: 'name'}) }
22
- .should == {has_child: {type: 'child', query: {match: {name: 'name'}}}} }
23
- specify { render { has_child('child').query(match: {name: 'name'}).query(match: {surname: 'surname'}) }
24
- .should == {has_child: {type: 'child', query: {bool: {must: [{match: {name: 'name'}}, {match: {surname: 'surname'}}]}}}} }
25
- specify { render { has_child('child').query(match: {name: 'name'}).query(match: {surname: 'surname'}).query_mode(:should) }
26
- .should == {has_child: {type: 'child', query: {bool: {should: [{match: {name: 'name'}}, {match: {surname: 'surname'}}]}}}} }
27
-
28
- specify { render { has_child('child').filter{ name == 'name' }.query(match: {name: 'name'}) }
29
- .should == {has_child: {type: 'child', query: {filtered: {query: {match: {name: 'name'}}, filter: {term: {'name' => 'name'}}}}}} }
30
- specify { render { has_child('child').filter{ name == 'name' }.query(match: {name: 'name'}).filter{ age < 42 } }
31
- .should == {has_child: {type: 'child', query: {filtered: {query: {match: {name: 'name'}}, filter: {and: [{term: {'name' => 'name'}}, range: {'age' => {lt: 42}}]}}}}} }
9
+ specify { expect(render { has_child('child') }).to eq({has_child: {type: 'child'}}) }
10
+
11
+
12
+ specify { expect(render { has_child('child').filter(term: {name: 'name'}) })
13
+ .to eq({has_child: {type: 'child', filter: {term: {name: 'name'}}}}) }
14
+ specify { expect(render { has_child('child').filter{ name == 'name' } })
15
+ .to eq({has_child: {type: 'child', filter: {term: {'name' => 'name'}}}}) }
16
+ specify { expect(render { has_child('child').filter(term: {name: 'name'}).filter{ age < 42 } })
17
+ .to eq({has_child: {type: 'child', filter: {and: [{term: {name: 'name'}}, range: {'age' => {lt: 42}}]}}}) }
18
+ specify { expect(render { has_child('child').filter(term: {name: 'name'}).filter{ age < 42 }.filter_mode(:or) })
19
+ .to eq({has_child: {type: 'child', filter: {or: [{term: {name: 'name'}}, range: {'age' => {lt: 42}}]}}}) }
20
+
21
+ specify { expect(render { has_child('child').query(match: {name: 'name'}) })
22
+ .to eq({has_child: {type: 'child', query: {match: {name: 'name'}}}}) }
23
+ specify { expect(render { has_child('child').query(match: {name: 'name'}).query(match: {surname: 'surname'}) })
24
+ .to eq({has_child: {type: 'child', query: {bool: {must: [{match: {name: 'name'}}, {match: {surname: 'surname'}}]}}}}) }
25
+ specify { expect(render { has_child('child').query(match: {name: 'name'}).query(match: {surname: 'surname'}).query_mode(:should) })
26
+ .to eq({has_child: {type: 'child', query: {bool: {should: [{match: {name: 'name'}}, {match: {surname: 'surname'}}]}}}}) }
27
+
28
+ specify { expect(render { has_child('child').filter{ name == 'name' }.query(match: {name: 'name'}) })
29
+ .to eq({has_child: {type: 'child', query: {filtered: {query: {match: {name: 'name'}}, filter: {term: {'name' => 'name'}}}}}}) }
30
+ specify { expect(render { has_child('child').filter{ name == 'name' }.query(match: {name: 'name'}).filter{ age < 42 } })
31
+ .to eq({has_child: {type: 'child', query: {filtered: {query: {match: {name: 'name'}}, filter: {and: [{term: {'name' => 'name'}}, range: {'age' => {lt: 42}}]}}}}}) }
32
32
 
33
33
  context do
34
34
  let(:name) { 'Name' }
35
35
 
36
- specify { render { has_child('child').filter{ name == o{name} } }
37
- .should == {has_child: {type: 'child', filter: {term: {'name' => 'Name'}}}} }
36
+ specify { expect(render { has_child('child').filter{ name == o{name} } })
37
+ .to eq({has_child: {type: 'child', filter: {term: {'name' => 'Name'}}}}) }
38
38
  end
39
39
  end
40
40
  end