chewy 0.10.1 → 7.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (243) hide show
  1. checksums.yaml +5 -5
  2. data/.github/CODEOWNERS +1 -0
  3. data/.github/ISSUE_TEMPLATE/bug_report.md +39 -0
  4. data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  5. data/.github/PULL_REQUEST_TEMPLATE.md +16 -0
  6. data/.github/workflows/ruby.yml +74 -0
  7. data/.rubocop.yml +28 -23
  8. data/.rubocop_todo.yml +110 -22
  9. data/CHANGELOG.md +480 -298
  10. data/CODE_OF_CONDUCT.md +14 -0
  11. data/CONTRIBUTING.md +63 -0
  12. data/Gemfile +3 -5
  13. data/Guardfile +3 -1
  14. data/LICENSE.txt +1 -1
  15. data/README.md +571 -333
  16. data/chewy.gemspec +12 -15
  17. data/gemfiles/rails.5.2.activerecord.gemfile +11 -0
  18. data/gemfiles/rails.6.0.activerecord.gemfile +11 -0
  19. data/gemfiles/rails.6.1.activerecord.gemfile +13 -0
  20. data/gemfiles/rails.7.0.activerecord.gemfile +13 -0
  21. data/lib/chewy/config.rb +48 -77
  22. data/lib/chewy/errors.rb +4 -10
  23. data/lib/chewy/fields/base.rb +88 -16
  24. data/lib/chewy/fields/root.rb +15 -21
  25. data/lib/chewy/index/actions.rb +67 -38
  26. data/lib/chewy/{type → index}/adapter/active_record.rb +18 -4
  27. data/lib/chewy/{type → index}/adapter/base.rb +11 -12
  28. data/lib/chewy/{type → index}/adapter/object.rb +28 -32
  29. data/lib/chewy/{type → index}/adapter/orm.rb +26 -24
  30. data/lib/chewy/index/aliases.rb +14 -5
  31. data/lib/chewy/index/crutch.rb +40 -0
  32. data/lib/chewy/index/import/bulk_builder.rb +311 -0
  33. data/lib/chewy/{type → index}/import/bulk_request.rb +10 -9
  34. data/lib/chewy/{type → index}/import/journal_builder.rb +11 -12
  35. data/lib/chewy/{type → index}/import/routine.rb +19 -18
  36. data/lib/chewy/{type → index}/import.rb +82 -36
  37. data/lib/chewy/{type → index}/mapping.rb +63 -62
  38. data/lib/chewy/index/observe/active_record_methods.rb +87 -0
  39. data/lib/chewy/index/observe/callback.rb +34 -0
  40. data/lib/chewy/index/observe.rb +17 -0
  41. data/lib/chewy/index/settings.rb +2 -0
  42. data/lib/chewy/index/specification.rb +13 -10
  43. data/lib/chewy/{type → index}/syncer.rb +62 -63
  44. data/lib/chewy/{type → index}/witchcraft.rb +15 -9
  45. data/lib/chewy/{type → index}/wrapper.rb +16 -6
  46. data/lib/chewy/index.rb +68 -93
  47. data/lib/chewy/journal.rb +25 -14
  48. data/lib/chewy/minitest/helpers.rb +91 -18
  49. data/lib/chewy/minitest/search_index_receiver.rb +29 -33
  50. data/lib/chewy/multi_search.rb +62 -0
  51. data/lib/chewy/railtie.rb +8 -24
  52. data/lib/chewy/rake_helper.rb +141 -112
  53. data/lib/chewy/rspec/build_query.rb +12 -0
  54. data/lib/chewy/rspec/helpers.rb +55 -0
  55. data/lib/chewy/rspec/update_index.rb +58 -49
  56. data/lib/chewy/rspec.rb +2 -0
  57. data/lib/chewy/runtime.rb +1 -1
  58. data/lib/chewy/search/loader.rb +19 -41
  59. data/lib/chewy/search/parameters/allow_partial_search_results.rb +27 -0
  60. data/lib/chewy/search/parameters/collapse.rb +16 -0
  61. data/lib/chewy/search/parameters/concerns/query_storage.rb +6 -5
  62. data/lib/chewy/search/parameters/ignore_unavailable.rb +27 -0
  63. data/lib/chewy/search/parameters/indices.rb +78 -0
  64. data/lib/chewy/search/parameters/none.rb +1 -3
  65. data/lib/chewy/search/parameters/order.rb +6 -19
  66. data/lib/chewy/search/parameters/source.rb +5 -1
  67. data/lib/chewy/search/parameters/track_total_hits.rb +16 -0
  68. data/lib/chewy/search/parameters.rb +28 -8
  69. data/lib/chewy/search/query_proxy.rb +9 -2
  70. data/lib/chewy/search/request.rb +207 -157
  71. data/lib/chewy/search/response.rb +5 -5
  72. data/lib/chewy/search/scoping.rb +7 -8
  73. data/lib/chewy/search/scrolling.rb +14 -13
  74. data/lib/chewy/search.rb +7 -26
  75. data/lib/chewy/stash.rb +27 -29
  76. data/lib/chewy/strategy/active_job.rb +2 -2
  77. data/lib/chewy/strategy/atomic.rb +1 -1
  78. data/lib/chewy/strategy/atomic_no_refresh.rb +18 -0
  79. data/lib/chewy/strategy/base.rb +10 -0
  80. data/lib/chewy/strategy/delayed_sidekiq/scheduler.rb +148 -0
  81. data/lib/chewy/strategy/delayed_sidekiq/worker.rb +52 -0
  82. data/lib/chewy/strategy/delayed_sidekiq.rb +17 -0
  83. data/lib/chewy/strategy/lazy_sidekiq.rb +64 -0
  84. data/lib/chewy/strategy/sidekiq.rb +3 -2
  85. data/lib/chewy/strategy.rb +6 -19
  86. data/lib/chewy/version.rb +1 -1
  87. data/lib/chewy.rb +37 -80
  88. data/lib/generators/chewy/install_generator.rb +1 -1
  89. data/lib/tasks/chewy.rake +26 -32
  90. data/migration_guide.md +56 -0
  91. data/spec/chewy/config_spec.rb +27 -57
  92. data/spec/chewy/fields/base_spec.rb +457 -174
  93. data/spec/chewy/fields/root_spec.rb +24 -32
  94. data/spec/chewy/fields/time_fields_spec.rb +5 -5
  95. data/spec/chewy/index/actions_spec.rb +425 -60
  96. data/spec/chewy/{type → index}/adapter/active_record_spec.rb +110 -44
  97. data/spec/chewy/{type → index}/adapter/object_spec.rb +21 -6
  98. data/spec/chewy/index/aliases_spec.rb +3 -3
  99. data/spec/chewy/index/import/bulk_builder_spec.rb +494 -0
  100. data/spec/chewy/{type → index}/import/bulk_request_spec.rb +5 -12
  101. data/spec/chewy/{type → index}/import/journal_builder_spec.rb +22 -30
  102. data/spec/chewy/{type → index}/import/routine_spec.rb +19 -19
  103. data/spec/chewy/{type → index}/import_spec.rb +154 -95
  104. data/spec/chewy/index/mapping_spec.rb +135 -0
  105. data/spec/chewy/index/observe/active_record_methods_spec.rb +68 -0
  106. data/spec/chewy/index/observe/callback_spec.rb +139 -0
  107. data/spec/chewy/index/observe_spec.rb +143 -0
  108. data/spec/chewy/index/settings_spec.rb +3 -1
  109. data/spec/chewy/index/specification_spec.rb +32 -33
  110. data/spec/chewy/{type → index}/syncer_spec.rb +14 -19
  111. data/spec/chewy/{type → index}/witchcraft_spec.rb +34 -21
  112. data/spec/chewy/index/wrapper_spec.rb +100 -0
  113. data/spec/chewy/index_spec.rb +99 -114
  114. data/spec/chewy/journal_spec.rb +56 -101
  115. data/spec/chewy/minitest/helpers_spec.rb +122 -14
  116. data/spec/chewy/minitest/search_index_receiver_spec.rb +24 -26
  117. data/spec/chewy/multi_search_spec.rb +84 -0
  118. data/spec/chewy/rake_helper_spec.rb +325 -101
  119. data/spec/chewy/rspec/build_query_spec.rb +34 -0
  120. data/spec/chewy/rspec/helpers_spec.rb +61 -0
  121. data/spec/chewy/rspec/update_index_spec.rb +106 -102
  122. data/spec/chewy/runtime_spec.rb +2 -2
  123. data/spec/chewy/search/loader_spec.rb +19 -53
  124. data/spec/chewy/search/pagination/kaminari_examples.rb +3 -5
  125. data/spec/chewy/search/pagination/kaminari_spec.rb +1 -1
  126. data/spec/chewy/search/parameters/collapse_spec.rb +5 -0
  127. data/spec/chewy/search/parameters/ignore_unavailable_spec.rb +67 -0
  128. data/spec/chewy/search/parameters/indices_spec.rb +99 -0
  129. data/spec/chewy/search/parameters/none_spec.rb +1 -1
  130. data/spec/chewy/search/parameters/order_spec.rb +18 -11
  131. data/spec/chewy/search/parameters/query_storage_examples.rb +67 -21
  132. data/spec/chewy/search/parameters/search_after_spec.rb +4 -1
  133. data/spec/chewy/search/parameters/source_spec.rb +8 -2
  134. data/spec/chewy/search/parameters/track_total_hits_spec.rb +5 -0
  135. data/spec/chewy/search/parameters_spec.rb +39 -8
  136. data/spec/chewy/search/query_proxy_spec.rb +68 -17
  137. data/spec/chewy/search/request_spec.rb +360 -149
  138. data/spec/chewy/search/response_spec.rb +35 -25
  139. data/spec/chewy/search/scrolling_spec.rb +28 -26
  140. data/spec/chewy/search_spec.rb +73 -53
  141. data/spec/chewy/stash_spec.rb +16 -26
  142. data/spec/chewy/strategy/active_job_spec.rb +23 -10
  143. data/spec/chewy/strategy/atomic_no_refresh_spec.rb +60 -0
  144. data/spec/chewy/strategy/atomic_spec.rb +9 -10
  145. data/spec/chewy/strategy/delayed_sidekiq_spec.rb +190 -0
  146. data/spec/chewy/strategy/lazy_sidekiq_spec.rb +214 -0
  147. data/spec/chewy/strategy/sidekiq_spec.rb +14 -10
  148. data/spec/chewy/strategy_spec.rb +19 -15
  149. data/spec/chewy_spec.rb +17 -110
  150. data/spec/spec_helper.rb +7 -22
  151. data/spec/support/active_record.rb +43 -5
  152. metadata +123 -198
  153. data/.travis.yml +0 -53
  154. data/Appraisals +0 -79
  155. data/LEGACY_DSL.md +0 -497
  156. data/gemfiles/rails.4.0.activerecord.gemfile +0 -14
  157. data/gemfiles/rails.4.1.activerecord.gemfile +0 -14
  158. data/gemfiles/rails.4.2.activerecord.gemfile +0 -15
  159. data/gemfiles/rails.4.2.mongoid.5.1.gemfile +0 -15
  160. data/gemfiles/rails.5.0.activerecord.gemfile +0 -15
  161. data/gemfiles/rails.5.0.mongoid.6.0.gemfile +0 -15
  162. data/gemfiles/rails.5.1.activerecord.gemfile +0 -15
  163. data/gemfiles/rails.5.1.mongoid.6.1.gemfile +0 -15
  164. data/gemfiles/sequel.4.45.gemfile +0 -11
  165. data/lib/chewy/backports/deep_dup.rb +0 -46
  166. data/lib/chewy/backports/duplicable.rb +0 -91
  167. data/lib/chewy/query/compose.rb +0 -68
  168. data/lib/chewy/query/criteria.rb +0 -191
  169. data/lib/chewy/query/filters.rb +0 -227
  170. data/lib/chewy/query/loading.rb +0 -111
  171. data/lib/chewy/query/nodes/and.rb +0 -25
  172. data/lib/chewy/query/nodes/base.rb +0 -17
  173. data/lib/chewy/query/nodes/bool.rb +0 -34
  174. data/lib/chewy/query/nodes/equal.rb +0 -34
  175. data/lib/chewy/query/nodes/exists.rb +0 -20
  176. data/lib/chewy/query/nodes/expr.rb +0 -28
  177. data/lib/chewy/query/nodes/field.rb +0 -110
  178. data/lib/chewy/query/nodes/has_child.rb +0 -15
  179. data/lib/chewy/query/nodes/has_parent.rb +0 -15
  180. data/lib/chewy/query/nodes/has_relation.rb +0 -59
  181. data/lib/chewy/query/nodes/match_all.rb +0 -11
  182. data/lib/chewy/query/nodes/missing.rb +0 -20
  183. data/lib/chewy/query/nodes/not.rb +0 -25
  184. data/lib/chewy/query/nodes/or.rb +0 -25
  185. data/lib/chewy/query/nodes/prefix.rb +0 -19
  186. data/lib/chewy/query/nodes/query.rb +0 -20
  187. data/lib/chewy/query/nodes/range.rb +0 -63
  188. data/lib/chewy/query/nodes/raw.rb +0 -15
  189. data/lib/chewy/query/nodes/regexp.rb +0 -35
  190. data/lib/chewy/query/nodes/script.rb +0 -20
  191. data/lib/chewy/query/pagination.rb +0 -25
  192. data/lib/chewy/query.rb +0 -1098
  193. data/lib/chewy/search/pagination/will_paginate.rb +0 -43
  194. data/lib/chewy/search/parameters/types.rb +0 -20
  195. data/lib/chewy/strategy/resque.rb +0 -27
  196. data/lib/chewy/strategy/shoryuken.rb +0 -40
  197. data/lib/chewy/type/actions.rb +0 -43
  198. data/lib/chewy/type/adapter/mongoid.rb +0 -69
  199. data/lib/chewy/type/adapter/sequel.rb +0 -95
  200. data/lib/chewy/type/crutch.rb +0 -32
  201. data/lib/chewy/type/import/bulk_builder.rb +0 -122
  202. data/lib/chewy/type/observe.rb +0 -78
  203. data/lib/chewy/type.rb +0 -117
  204. data/lib/sequel/plugins/chewy_observe.rb +0 -78
  205. data/spec/chewy/query/criteria_spec.rb +0 -700
  206. data/spec/chewy/query/filters_spec.rb +0 -201
  207. data/spec/chewy/query/loading_spec.rb +0 -124
  208. data/spec/chewy/query/nodes/and_spec.rb +0 -12
  209. data/spec/chewy/query/nodes/bool_spec.rb +0 -14
  210. data/spec/chewy/query/nodes/equal_spec.rb +0 -32
  211. data/spec/chewy/query/nodes/exists_spec.rb +0 -18
  212. data/spec/chewy/query/nodes/has_child_spec.rb +0 -59
  213. data/spec/chewy/query/nodes/has_parent_spec.rb +0 -59
  214. data/spec/chewy/query/nodes/match_all_spec.rb +0 -11
  215. data/spec/chewy/query/nodes/missing_spec.rb +0 -16
  216. data/spec/chewy/query/nodes/not_spec.rb +0 -13
  217. data/spec/chewy/query/nodes/or_spec.rb +0 -12
  218. data/spec/chewy/query/nodes/prefix_spec.rb +0 -16
  219. data/spec/chewy/query/nodes/query_spec.rb +0 -12
  220. data/spec/chewy/query/nodes/range_spec.rb +0 -32
  221. data/spec/chewy/query/nodes/raw_spec.rb +0 -11
  222. data/spec/chewy/query/nodes/regexp_spec.rb +0 -43
  223. data/spec/chewy/query/nodes/script_spec.rb +0 -15
  224. data/spec/chewy/query/pagination/kaminari_spec.rb +0 -5
  225. data/spec/chewy/query/pagination/will_paginate_spec.rb +0 -5
  226. data/spec/chewy/query/pagination_spec.rb +0 -39
  227. data/spec/chewy/query_spec.rb +0 -636
  228. data/spec/chewy/search/pagination/will_paginate_examples.rb +0 -63
  229. data/spec/chewy/search/pagination/will_paginate_spec.rb +0 -23
  230. data/spec/chewy/search/parameters/indices_boost_spec.rb +0 -83
  231. data/spec/chewy/search/parameters/types_spec.rb +0 -5
  232. data/spec/chewy/strategy/resque_spec.rb +0 -46
  233. data/spec/chewy/strategy/shoryuken_spec.rb +0 -64
  234. data/spec/chewy/type/actions_spec.rb +0 -50
  235. data/spec/chewy/type/adapter/mongoid_spec.rb +0 -372
  236. data/spec/chewy/type/adapter/sequel_spec.rb +0 -472
  237. data/spec/chewy/type/import/bulk_builder_spec.rb +0 -279
  238. data/spec/chewy/type/mapping_spec.rb +0 -142
  239. data/spec/chewy/type/observe_spec.rb +0 -137
  240. data/spec/chewy/type/wrapper_spec.rb +0 -98
  241. data/spec/chewy/type_spec.rb +0 -55
  242. data/spec/support/mongoid.rb +0 -93
  243. data/spec/support/sequel.rb +0 -80
@@ -2,9 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  describe Chewy::Index do
4
4
  before do
5
- stub_index(:dummies) do
6
- define_type :dummy
7
- end
5
+ stub_index(:dummies)
8
6
  end
9
7
 
10
8
  describe '.import', :orm do
@@ -12,9 +10,12 @@ describe Chewy::Index do
12
10
  stub_model(:city)
13
11
  stub_model(:country)
14
12
 
15
- stub_index(:places) do
16
- define_type City
17
- define_type Country
13
+ stub_index(:cities) do
14
+ index_scope City
15
+ end
16
+
17
+ stub_index(:countries) do
18
+ index_scope Country
18
19
  end
19
20
  end
20
21
 
@@ -22,23 +23,18 @@ describe Chewy::Index do
22
23
  let!(:countries) { Array.new(2) { |i| Country.create! id: i + 1 } }
23
24
 
24
25
  specify do
25
- expect { PlacesIndex.import }.to update_index(PlacesIndex::City).and_reindex(cities)
26
- expect { PlacesIndex.import }.to update_index(PlacesIndex::Country).and_reindex(countries)
26
+ expect { CitiesIndex.import }.to update_index(CitiesIndex).and_reindex(cities)
27
+ expect { CountriesIndex.import }.to update_index(CountriesIndex).and_reindex(countries)
27
28
  end
28
29
 
29
30
  specify do
30
- expect { PlacesIndex.import city: cities.first }.to update_index(PlacesIndex::City).and_reindex(cities.first).only
31
- expect { PlacesIndex.import city: cities.first }.to update_index(PlacesIndex::Country).and_reindex(countries)
31
+ expect { CitiesIndex.import cities.first }.to update_index(CitiesIndex).and_reindex(cities.first).only
32
+ expect { CountriesIndex.import countries.last }.to update_index(CountriesIndex).and_reindex(countries.last).only
32
33
  end
33
34
 
34
35
  specify do
35
- expect { PlacesIndex.import city: cities.first, country: countries.last }.to update_index(PlacesIndex::City).and_reindex(cities.first).only
36
- expect { PlacesIndex.import city: cities.first, country: countries.last }.to update_index(PlacesIndex::Country).and_reindex(countries.last).only
37
- end
38
-
39
- specify do
40
- expect(PlacesIndex.client).to receive(:bulk).with(hash_including(refresh: false)).twice
41
- PlacesIndex.import city: cities.first, refresh: false
36
+ expect(CitiesIndex.client).to receive(:bulk).with(hash_including(refresh: false)).once
37
+ CitiesIndex.import cities.first, refresh: false
42
38
  end
43
39
  end
44
40
 
@@ -61,10 +57,18 @@ describe Chewy::Index do
61
57
  specify { expect(stub_const('DeveloperIndex', Class.new(Chewy::Index)).index_name).to eq('developer') }
62
58
  specify { expect(stub_const('DevelopersIndex', Class.new(Chewy::Index)).index_name).to eq('developers') }
63
59
 
64
- specify { expect(stub_const('DevelopersIndex', Class.new(Chewy::Index)).index_name(suffix: '')).to eq('developers') }
65
- specify { expect(stub_const('DevelopersIndex', Class.new(Chewy::Index)).index_name(suffix: '2013')).to eq('developers_2013') }
66
- specify { expect(stub_const('DevelopersIndex', Class.new(Chewy::Index)).index_name(prefix: '')).to eq('developers') }
67
- specify { expect(stub_const('DevelopersIndex', Class.new(Chewy::Index)).index_name(prefix: 'test')).to eq('test_developers') }
60
+ specify do
61
+ expect(stub_const('DevelopersIndex', Class.new(Chewy::Index)).index_name(suffix: '')).to eq('developers')
62
+ end
63
+ specify do
64
+ expect(stub_const('DevelopersIndex', Class.new(Chewy::Index)).index_name(suffix: '2013')).to eq('developers_2013')
65
+ end
66
+ specify do
67
+ expect(stub_const('DevelopersIndex', Class.new(Chewy::Index)).index_name(prefix: '')).to eq('developers')
68
+ end
69
+ specify do
70
+ expect(stub_const('DevelopersIndex', Class.new(Chewy::Index)).index_name(prefix: 'test')).to eq('test_developers')
71
+ end
68
72
 
69
73
  context do
70
74
  before { allow(Chewy).to receive_messages(configuration: {prefix: 'testing'}) }
@@ -85,79 +89,43 @@ describe Chewy::Index do
85
89
  specify { expect(Class.new(Chewy::Index).prefix).to eq('testing') }
86
90
  end
87
91
 
88
- describe '.define_type' do
89
- specify { expect(DummiesIndex.type_hash['dummy']).to eq(DummiesIndex::Dummy) }
92
+ describe '.index_scope' do
93
+ specify { expect(DummiesIndex.adapter.name).to eq('Default') }
90
94
 
91
95
  context do
92
- before { stub_index(:dummies) { define_type :dummy, name: :borogoves } }
93
- specify { expect(DummiesIndex.type_hash['borogoves']).to eq(DummiesIndex::Borogoves) }
96
+ before { stub_index(:dummies) { index_scope :dummy, name: :borogoves } }
97
+ specify { expect(DummiesIndex.adapter.name).to eq('Borogoves') }
94
98
  end
95
99
 
96
100
  context do
97
101
  before { stub_class(:city) }
98
- before { stub_index(:dummies) { define_type City, name: :country } }
99
- specify { expect(DummiesIndex.type_hash['country']).to eq(DummiesIndex::Country) }
102
+ before { stub_index(:dummies) { index_scope City, name: :country } }
103
+ specify { expect(DummiesIndex.adapter.name).to eq('Country') }
100
104
  end
101
105
 
102
106
  context do
103
107
  before { stub_class('City') }
104
- before { stub_class('City::District', City) }
108
+ before { stub_class('Country') }
105
109
 
106
110
  specify do
107
111
  expect do
108
112
  Kernel.eval <<-DUMMY_CITY_INDEX
109
- class DummyCityIndex < Chewy::Index
110
- define_type City
111
- define_type City::District
113
+ class DummyCityIndex2 < Chewy::Index
114
+ index_scope City
115
+ index_scope Country
112
116
  end
113
117
  DUMMY_CITY_INDEX
114
- end.not_to raise_error
115
- end
118
+ end.to raise_error(/Index scope is already defined/)
116
119
 
117
- specify do
118
120
  expect do
119
121
  Kernel.eval <<-DUMMY_CITY_INDEX
120
122
  class DummyCityIndex2 < Chewy::Index
121
- define_type City
122
- define_type City::Nothing
123
+ index_scope City::Nothing
123
124
  end
124
125
  DUMMY_CITY_INDEX
125
126
  end.to raise_error(NameError)
126
127
  end
127
128
  end
128
-
129
- context 'type methods should be deprecated and can\'t redefine existing ones' do
130
- before do
131
- stub_index(:places) do
132
- def self.city; end
133
- define_type :city
134
- define_type :country
135
- end
136
- end
137
-
138
- specify { expect(PlacesIndex.city).to be_nil }
139
- specify { expect(PlacesIndex::Country).to be < Chewy::Type }
140
- end
141
- end
142
-
143
- describe '.type_hash' do
144
- specify { expect(DummiesIndex.type_hash['dummy']).to eq(DummiesIndex::Dummy) }
145
- specify { expect(DummiesIndex.type_hash).to have_key 'dummy' }
146
- specify { expect(DummiesIndex.type_hash['dummy']).to be < Chewy::Type }
147
- specify { expect(DummiesIndex.type_hash['dummy'].type_name).to eq('dummy') }
148
- end
149
-
150
- describe '.type' do
151
- specify { expect(DummiesIndex.type('dummy')).to eq(DummiesIndex::Dummy) }
152
- specify { expect { DummiesIndex.type('not-the-dummy') }.to raise_error(Chewy::UndefinedType) }
153
- end
154
-
155
- specify { expect(DummiesIndex.type_names).to eq(DummiesIndex.type_hash.keys) }
156
-
157
- describe '.types' do
158
- specify { expect(DummiesIndex.types).to eq(DummiesIndex.type_hash.values) }
159
- specify { expect(DummiesIndex.types(:dummy)).to be_a Chewy::Search::Request }
160
- specify { expect(DummiesIndex.types(:user)).to be_a Chewy::Search::Request }
161
129
  end
162
130
 
163
131
  describe '.settings' do
@@ -171,7 +139,11 @@ describe Chewy::Index do
171
139
  Chewy.filter :names_nysiis, type: 'phonetic', encoder: 'nysiis', replace: false
172
140
  end
173
141
 
174
- let(:documents) { stub_index(:documents) { settings analysis: {analyzer: [:name, :phone, {sorted: {option: :baz}}]} } }
142
+ let(:documents) do
143
+ stub_index(:documents) do
144
+ settings analysis: {analyzer: [:name, :phone, {sorted: {option: :baz}}]}
145
+ end
146
+ end
175
147
 
176
148
  specify { expect { documents.settings_hash }.to_not change(documents._settings, :inspect) }
177
149
  specify do
@@ -191,44 +163,58 @@ describe Chewy::Index do
191
163
  stub_index(:places) do
192
164
  def self.by_rating; end
193
165
 
194
- def self.by_name; end
195
-
196
- define_type :city do
197
- def self.by_id; end
166
+ def self.colors(*colors)
167
+ filter(terms: {colors: colors.flatten(1).map(&:to_s)})
198
168
  end
169
+
170
+ def self.by_id; end
171
+ field :colors
199
172
  end
200
173
  end
201
174
 
202
175
  specify { expect(described_class.scopes).to eq([]) }
203
- specify { expect(PlacesIndex.scopes).to match_array(%i[by_rating by_name]) }
176
+ specify { expect(PlacesIndex.scopes).to match_array(%i[by_rating colors by_id]) }
177
+
178
+ context do
179
+ before do
180
+ Chewy.massacre
181
+ PlacesIndex.import!(
182
+ double(colors: ['red']),
183
+ double(colors: %w[red green]),
184
+ double(colors: %w[green yellow])
185
+ )
186
+ end
187
+
188
+ specify do
189
+ expect(PlacesIndex.colors(:green).map(&:colors))
190
+ .to contain_exactly(%w[red green], %w[green yellow])
191
+ end
192
+
193
+ specify do
194
+ expect(PlacesIndex.colors(:green).map(&:colors))
195
+ .to contain_exactly(%w[red green], %w[green yellow])
196
+ end
197
+ end
204
198
  end
205
199
 
206
200
  describe '.settings_hash' do
207
201
  before { allow(Chewy).to receive_messages(config: Chewy::Config.send(:new)) }
208
202
 
209
203
  specify { expect(stub_index(:documents).settings_hash).to eq({}) }
210
- specify { expect(stub_index(:documents) { settings number_of_shards: 1 }.settings_hash).to eq(settings: {number_of_shards: 1}) }
204
+ specify do
205
+ expect(stub_index(:documents) do
206
+ settings number_of_shards: 1
207
+ end.settings_hash).to eq(settings: {number_of_shards: 1})
208
+ end
211
209
  end
212
210
 
213
211
  describe '.mappings_hash' do
214
212
  specify { expect(stub_index(:documents).mappings_hash).to eq({}) }
215
- specify { expect(stub_index(:documents) { define_type :document }.mappings_hash).to eq({}) }
216
- specify do
217
- expect(stub_index(:documents) do
218
- define_type :document do
219
- field :name, type: 'string'
220
- end
221
- end.mappings_hash).to eq(mappings: {document: {properties: {name: {type: 'string'}}}})
222
- end
213
+ specify { expect(stub_index(:documents) { index_scope :document }.mappings_hash).to eq({}) }
223
214
  specify do
224
215
  expect(stub_index(:documents) do
225
- define_type :document do
226
- field :name, type: 'string'
227
- end
228
- define_type :document2 do
229
- field :name, type: 'string'
230
- end
231
- end.mappings_hash[:mappings].keys).to match_array(%i[document document2])
216
+ field :date, type: 'date'
217
+ end.mappings_hash).to eq(mappings: {properties: {date: {type: 'date'}}})
232
218
  end
233
219
  end
234
220
 
@@ -236,20 +222,20 @@ describe Chewy::Index do
236
222
  before { allow(Chewy).to receive_messages(config: Chewy::Config.send(:new)) }
237
223
 
238
224
  specify { expect(stub_index(:documents).specification_hash).to eq({}) }
239
- specify { expect(stub_index(:documents) { settings number_of_shards: 1 }.specification_hash.keys).to eq([:settings]) }
240
225
  specify do
241
226
  expect(stub_index(:documents) do
242
- define_type :document do
243
- field :name, type: 'string'
244
- end
227
+ settings number_of_shards: 1
228
+ end.specification_hash.keys).to eq([:settings])
229
+ end
230
+ specify do
231
+ expect(stub_index(:documents) do
232
+ field :name
245
233
  end.specification_hash.keys).to eq([:mappings])
246
234
  end
247
235
  specify do
248
236
  expect(stub_index(:documents) do
249
237
  settings number_of_shards: 1
250
- define_type :document do
251
- field :name, type: 'string'
252
- end
238
+ field :name
253
239
  end.specification_hash.keys).to match_array(%i[mappings settings])
254
240
  end
255
241
  end
@@ -260,25 +246,24 @@ describe Chewy::Index do
260
246
  specify { expect(subject.specification).to equal(subject.specification) }
261
247
  end
262
248
 
263
- describe '.default_prefix' do
264
- before { allow(Chewy).to receive_messages(configuration: {prefix: 'testing'}) }
265
-
266
- context do
267
- before { expect(ActiveSupport::Deprecation).to receive(:warn).once }
268
- specify { expect(DummiesIndex.default_prefix).to eq('testing') }
269
- end
249
+ context 'index call inside index', :orm do
250
+ before do
251
+ stub_index(:cities) do
252
+ field :country_name, value: (lambda do |city|
253
+ CountriesIndex.filter(term: {_id: city.country_id}).first.name
254
+ end)
255
+ end
270
256
 
271
- context do
272
- before do
273
- DummiesIndex.class_eval do
274
- def self.default_prefix
275
- 'borogoves'
276
- end
277
- end
257
+ stub_index(:countries) do
258
+ field :name
278
259
  end
279
260
 
280
- before { expect(ActiveSupport::Deprecation).to receive(:warn).once }
281
- specify { expect(DummiesIndex.index_name).to eq('borogoves_dummies') }
261
+ CountriesIndex.import!(double(id: 1, name: 'Country'))
262
+ end
263
+
264
+ specify do
265
+ expect { CitiesIndex.import!(double(country_id: 1)) }
266
+ .to update_index(CitiesIndex).and_reindex(country_name: 'Country')
282
267
  end
283
268
  end
284
269
  end
@@ -6,19 +6,19 @@ describe Chewy::Journal do
6
6
  context namespace.present? ? 'with namespace' : 'without namespace' do
7
7
  before do
8
8
  stub_model(:city) do
9
- update_index "#{namespace}places#city", :self
9
+ update_index "#{namespace}cities", :self
10
10
  end
11
11
  stub_model(:country) do
12
- update_index "#{namespace}places#country", :self
12
+ update_index "#{namespace}countries", :self
13
13
  end
14
14
 
15
- stub_index("#{namespace}places") do
16
- define_type City do
17
- default_import_options journal: true
18
- end
19
- define_type Country do
20
- default_import_options journal: true
21
- end
15
+ stub_index("#{namespace}cities") do
16
+ index_scope City
17
+ default_import_options journal: true
18
+ end
19
+ stub_index("#{namespace}countries") do
20
+ index_scope Country
21
+ default_import_options journal: true
22
22
  end
23
23
 
24
24
  Chewy.massacre
@@ -41,7 +41,8 @@ describe Chewy::Journal do
41
41
  end
42
42
 
43
43
  specify do
44
- places_index = namespace.present? ? Namespace::PlacesIndex : PlacesIndex
44
+ cities_index = namespace.present? ? Namespace::CitiesIndex : CitiesIndex
45
+ countries_index = namespace.present? ? Namespace::CountriesIndex : CountriesIndex
45
46
  Chewy.strategy(:urgent) do
46
47
  cities = Array.new(2) { |i| City.create!(id: i + 1) }
47
48
  countries = Array.new(2) { |i| Country.create!(id: i + 1) }
@@ -49,12 +50,13 @@ describe Chewy::Journal do
49
50
 
50
51
  Timecop.freeze(import_time)
51
52
 
52
- places_index.import
53
+ cities_index.import
54
+ countries_index.import
53
55
 
54
- expect(Chewy::Stash.exists?).to eq true
56
+ expect(Chewy::Stash::Journal.exists?).to eq true
55
57
 
56
58
  Timecop.freeze(update_time)
57
- cities.first.update_attributes!(name: 'Supername')
59
+ cities.first.update!(name: 'Supername')
58
60
 
59
61
  Timecop.freeze(destroy_time)
60
62
  countries.last.destroy
@@ -62,66 +64,57 @@ describe Chewy::Journal do
62
64
  journal_entries = Chewy::Stash::Journal.order(:created_at).hits.map { |r| r['_source'] }
63
65
  expected_journal = [
64
66
  {
65
- 'index_name' => "#{namespace}places",
66
- 'type_name' => 'city',
67
+ 'index_name' => "#{namespace}cities",
67
68
  'action' => 'index',
68
- 'references' => ['1'],
69
+ 'references' => ['1'].map(&Base64.method(:encode64)),
69
70
  'created_at' => time.utc.as_json
70
71
  },
71
72
  {
72
- 'index_name' => "#{namespace}places",
73
- 'type_name' => 'city',
73
+ 'index_name' => "#{namespace}cities",
74
74
  'action' => 'index',
75
- 'references' => ['2'],
75
+ 'references' => ['2'].map(&Base64.method(:encode64)),
76
76
  'created_at' => time.utc.as_json
77
77
  },
78
78
  {
79
- 'index_name' => "#{namespace}places",
80
- 'type_name' => 'country',
79
+ 'index_name' => "#{namespace}countries",
81
80
  'action' => 'index',
82
- 'references' => ['1'],
81
+ 'references' => ['1'].map(&Base64.method(:encode64)),
83
82
  'created_at' => time.utc.as_json
84
83
  },
85
84
  {
86
- 'index_name' => "#{namespace}places",
87
- 'type_name' => 'country',
85
+ 'index_name' => "#{namespace}countries",
88
86
  'action' => 'index',
89
- 'references' => ['2'],
87
+ 'references' => ['2'].map(&Base64.method(:encode64)),
90
88
  'created_at' => time.utc.as_json
91
89
  },
92
90
  {
93
- 'index_name' => "#{namespace}places",
94
- 'type_name' => 'country',
91
+ 'index_name' => "#{namespace}countries",
95
92
  'action' => 'index',
96
- 'references' => ['3'],
93
+ 'references' => ['3'].map(&Base64.method(:encode64)),
97
94
  'created_at' => time.utc.as_json
98
95
  },
99
96
  {
100
- 'index_name' => "#{namespace}places",
101
- 'type_name' => 'city',
97
+ 'index_name' => "#{namespace}cities",
102
98
  'action' => 'index',
103
- 'references' => %w[1 2],
99
+ 'references' => %w[1 2].map(&Base64.method(:encode64)),
104
100
  'created_at' => import_time.utc.as_json
105
101
  },
106
102
  {
107
- 'index_name' => "#{namespace}places",
108
- 'type_name' => 'country',
103
+ 'index_name' => "#{namespace}countries",
109
104
  'action' => 'index',
110
- 'references' => %w[1 2 3],
105
+ 'references' => %w[1 2 3].map(&Base64.method(:encode64)),
111
106
  'created_at' => import_time.utc.as_json
112
107
  },
113
108
  {
114
- 'index_name' => "#{namespace}places",
115
- 'type_name' => 'city',
109
+ 'index_name' => "#{namespace}cities",
116
110
  'action' => 'index',
117
- 'references' => ['1'],
111
+ 'references' => ['1'].map(&Base64.method(:encode64)),
118
112
  'created_at' => update_time.utc.as_json
119
113
  },
120
114
  {
121
- 'index_name' => "#{namespace}places",
122
- 'type_name' => 'country',
115
+ 'index_name' => "#{namespace}countries",
123
116
  'action' => 'delete',
124
- 'references' => ['2'],
117
+ 'references' => ['2'].map(&Base64.method(:encode64)),
125
118
  'created_at' => destroy_time.utc.as_json
126
119
  }
127
120
  ]
@@ -133,11 +126,11 @@ describe Chewy::Journal do
133
126
  expect(journal_entries.size).to eq 4
134
127
 
135
128
  # simulate lost data
136
- Chewy.client.delete(index: "#{Chewy.settings[:prefix]}_places", type: 'city', id: 1, refresh: true)
137
- expect(places_index::City.count).to eq 1
129
+ Chewy.client.delete(index: "#{Chewy.settings[:prefix]}_cities", id: 1, refresh: true)
130
+ expect(cities_index.count).to eq 1
138
131
 
139
132
  described_class.new.apply(time)
140
- expect(places_index::City.count).to eq 2
133
+ expect(cities_index.count).to eq 2
141
134
 
142
135
  clean_response = described_class.new.clean(import_time)
143
136
  expect(clean_response['deleted'] || clean_response['_indices']['_all']['deleted']).to eq 7
@@ -162,14 +155,12 @@ describe Chewy::Journal do
162
155
  end
163
156
 
164
157
  stub_index(:cities) do
165
- define_type City do
166
- default_import_options journal: true
167
- end
158
+ index_scope City
159
+ default_import_options journal: true
168
160
  end
169
161
  stub_index(:countries) do
170
- define_type Country do
171
- default_import_options journal: true
172
- end
162
+ index_scope Country
163
+ default_import_options journal: true
173
164
  end
174
165
  end
175
166
 
@@ -188,8 +179,8 @@ describe Chewy::Journal do
188
179
  Array.new(2) { |i| Country.create!(id: i + 1) }
189
180
 
190
181
  # simulate lost data
191
- Chewy.client.delete(index: 'cities', type: 'city', id: 1, refresh: true)
192
- Chewy.client.delete(index: 'countries', type: 'country', id: 1, refresh: true)
182
+ Chewy.client.delete(index: 'cities', id: 1, refresh: true)
183
+ Chewy.client.delete(index: 'countries', id: 1, refresh: true)
193
184
  expect(CitiesIndex.all.to_a.length).to eq 1
194
185
  expect(CountriesIndex.all.to_a.length).to eq 1
195
186
 
@@ -199,7 +190,7 @@ describe Chewy::Journal do
199
190
  expect(CountriesIndex.all.to_a.length).to eq 1
200
191
 
201
192
  # Replay on both
202
- Chewy.client.delete(index: 'cities', type: 'city', id: 1, refresh: true)
193
+ Chewy.client.delete(index: 'cities', id: 1, refresh: true)
203
194
  expect(CitiesIndex.all.to_a.length).to eq 1
204
195
  expect(described_class.new(CitiesIndex, CountriesIndex).apply(time)).to eq(4)
205
196
  expect(CitiesIndex.all.to_a.length).to eq 2
@@ -208,59 +199,23 @@ describe Chewy::Journal do
208
199
  end
209
200
  end
210
201
 
211
- context 'retries' do
212
- let(:time) { Time.now.to_i }
213
- before do
214
- Timecop.freeze
215
- Chewy.strategy(:urgent)
216
- City.create!(id: 1)
217
- end
218
-
219
- after do
220
- Chewy.strategy.pop
221
- Timecop.return
222
- end
223
-
224
- specify 'journal was cleaned after the first call' do
225
- expect(Chewy::Stash::Journal).to receive(:entries).exactly(2).and_call_original
226
- expect(described_class.new.apply(time)).to eq(1)
227
- end
228
-
229
- context 'endless journal' do
230
- let(:count_of_checks) { 10 } # default
231
- let!(:journal_entries) do
232
- record = Chewy::Stash::Journal.entries(time).first
233
- Array.new(count_of_checks) do |i|
234
- Chewy::Stash::Journal.new(
235
- record.attributes.merge(
236
- 'created_at' => time.to_i + i,
237
- 'references' => [i.to_s]
238
- )
239
- )
240
- end
241
- end
242
-
243
- specify '10 retries by default' do
244
- expect(Chewy::Stash::Journal)
245
- .to receive(:entries).exactly(count_of_checks) { [journal_entries.shift].compact }
246
- expect(described_class.new.apply(time)).to eq(10)
247
- end
202
+ context 'when order is not preserved' do
203
+ let(:time) { Time.now }
248
204
 
249
- specify 'with :once parameter set' do
250
- expect(Chewy::Stash::Journal)
251
- .to receive(:entries).exactly(1) { [journal_entries.shift].compact }
252
- expect(described_class.new.apply(time, retries: 1)).to eq(1)
205
+ it 'paginates properly through all items' do
206
+ Chewy.strategy(:urgent) do
207
+ Timecop.travel(time + 1.minute) { City.create!(id: 2) }
208
+ Timecop.travel(time + 3.minute) { City.create!(id: 4) }
209
+ Timecop.travel(time + 2.minute) { City.create!(id: 1) }
210
+ Timecop.travel(time + 4.minute) { City.create!(id: 3) }
253
211
  end
254
212
 
255
- context 'with retries parameter set' do
256
- let(:retries) { 5 }
213
+ CitiesIndex.purge!
214
+ expect(CitiesIndex.all.to_a.length).to eq 0
257
215
 
258
- specify do
259
- expect(Chewy::Stash::Journal)
260
- .to receive(:entries).exactly(retries) { [journal_entries.shift].compact }
261
- expect(described_class.new.apply(time, retries: retries)).to eq(5)
262
- end
263
- end
216
+ # Replay on specific index
217
+ expect(described_class.new(CitiesIndex).apply(time, fetch_limit: 2)).to eq(4)
218
+ expect(CitiesIndex.all.to_a.map(&:id).sort).to eq([1, 2, 3, 4])
264
219
  end
265
220
  end
266
221
  end