elasticsearch-model 6.0.0 → 6.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile +5 -0
- data/README.md +14 -7
- data/Rakefile +27 -36
- data/elasticsearch-model.gemspec +1 -1
- data/examples/activerecord_mapping_completion.rb +2 -15
- data/gemfiles/3.0.gemfile +6 -1
- data/gemfiles/4.0.gemfile +7 -1
- data/gemfiles/5.0.gemfile +6 -0
- data/lib/elasticsearch/model.rb +15 -8
- data/lib/elasticsearch/model/adapters/active_record.rb +7 -26
- data/lib/elasticsearch/model/indexing.rb +5 -3
- data/lib/elasticsearch/model/naming.rb +6 -1
- data/lib/elasticsearch/model/response.rb +2 -2
- data/lib/elasticsearch/model/response/pagination.rb +2 -192
- data/lib/elasticsearch/model/response/pagination/kaminari.rb +109 -0
- data/lib/elasticsearch/model/response/pagination/will_paginate.rb +95 -0
- data/lib/elasticsearch/model/response/result.rb +1 -1
- data/lib/elasticsearch/model/version.rb +1 -1
- data/spec/elasticsearch/model/adapter_spec.rb +119 -0
- data/spec/elasticsearch/model/adapters/active_record/associations_spec.rb +334 -0
- data/spec/elasticsearch/model/adapters/active_record/basic_spec.rb +340 -0
- data/spec/elasticsearch/model/adapters/active_record/dynamic_index_name_spec.rb +18 -0
- data/spec/elasticsearch/model/adapters/active_record/import_spec.rb +187 -0
- data/spec/elasticsearch/model/adapters/active_record/multi_model_spec.rb +110 -0
- data/spec/elasticsearch/model/adapters/active_record/namespaced_model_spec.rb +38 -0
- data/spec/elasticsearch/model/adapters/active_record/pagination_spec.rb +315 -0
- data/spec/elasticsearch/model/adapters/active_record/parent_child_spec.rb +75 -0
- data/spec/elasticsearch/model/adapters/active_record/serialization_spec.rb +61 -0
- data/spec/elasticsearch/model/adapters/active_record_spec.rb +207 -0
- data/spec/elasticsearch/model/adapters/default_spec.rb +41 -0
- data/spec/elasticsearch/model/adapters/mongoid/basic_spec.rb +267 -0
- data/spec/elasticsearch/model/adapters/mongoid/multi_model_spec.rb +66 -0
- data/spec/elasticsearch/model/adapters/mongoid_spec.rb +235 -0
- data/spec/elasticsearch/model/adapters/multiple_spec.rb +125 -0
- data/spec/elasticsearch/model/callbacks_spec.rb +33 -0
- data/spec/elasticsearch/model/client_spec.rb +66 -0
- data/spec/elasticsearch/model/hash_wrapper_spec.rb +12 -0
- data/spec/elasticsearch/model/importing_spec.rb +214 -0
- data/spec/elasticsearch/model/indexing_spec.rb +918 -0
- data/spec/elasticsearch/model/module_spec.rb +101 -0
- data/spec/elasticsearch/model/multimodel_spec.rb +55 -0
- data/spec/elasticsearch/model/naming_inheritance_spec.rb +184 -0
- data/spec/elasticsearch/model/naming_spec.rb +186 -0
- data/spec/elasticsearch/model/proxy_spec.rb +107 -0
- data/spec/elasticsearch/model/response/aggregations_spec.rb +66 -0
- data/spec/elasticsearch/model/response/base_spec.rb +90 -0
- data/spec/elasticsearch/model/response/pagination/kaminari_spec.rb +410 -0
- data/spec/elasticsearch/model/response/pagination/will_paginate_spec.rb +262 -0
- data/spec/elasticsearch/model/response/records_spec.rb +118 -0
- data/spec/elasticsearch/model/response/response_spec.rb +131 -0
- data/spec/elasticsearch/model/response/result_spec.rb +122 -0
- data/spec/elasticsearch/model/response/results_spec.rb +56 -0
- data/spec/elasticsearch/model/searching_search_request_spec.rb +112 -0
- data/spec/elasticsearch/model/searching_spec.rb +49 -0
- data/spec/elasticsearch/model/serializing_spec.rb +22 -0
- data/spec/spec_helper.rb +161 -0
- data/spec/support/app.rb +21 -0
- data/spec/support/app/answer.rb +33 -0
- data/spec/support/app/article.rb +22 -0
- data/spec/support/app/article_for_pagination.rb +12 -0
- data/spec/support/app/article_with_custom_serialization.rb +13 -0
- data/spec/support/app/article_with_dynamic_index_name.rb +15 -0
- data/spec/support/app/author.rb +9 -0
- data/spec/support/app/authorship.rb +4 -0
- data/spec/support/app/category.rb +3 -0
- data/spec/support/app/comment.rb +3 -0
- data/spec/support/app/episode.rb +11 -0
- data/spec/support/app/image.rb +19 -0
- data/spec/support/app/import_article.rb +12 -0
- data/spec/support/app/mongoid_article.rb +21 -0
- data/spec/support/app/namespaced_book.rb +10 -0
- data/spec/support/app/parent_and_child_searchable.rb +24 -0
- data/spec/support/app/post.rb +14 -0
- data/spec/support/app/question.rb +27 -0
- data/spec/support/app/searchable.rb +48 -0
- data/spec/support/app/series.rb +11 -0
- data/spec/support/model.json +1 -0
- data/{test → spec}/support/model.yml +0 -0
- metadata +129 -86
- data/test/integration/active_record_associations_parent_child_test.rb +0 -188
- data/test/integration/active_record_associations_test.rb +0 -339
- data/test/integration/active_record_basic_test.rb +0 -255
- data/test/integration/active_record_custom_serialization_test.rb +0 -67
- data/test/integration/active_record_import_test.rb +0 -168
- data/test/integration/active_record_namespaced_model_test.rb +0 -56
- data/test/integration/active_record_pagination_test.rb +0 -149
- data/test/integration/dynamic_index_name_test.rb +0 -52
- data/test/integration/mongoid_basic_test.rb +0 -240
- data/test/integration/multiple_models_test.rb +0 -176
- data/test/support/model.json +0 -1
- data/test/test_helper.rb +0 -92
- data/test/unit/adapter_active_record_test.rb +0 -157
- data/test/unit/adapter_default_test.rb +0 -41
- data/test/unit/adapter_mongoid_test.rb +0 -161
- data/test/unit/adapter_multiple_test.rb +0 -106
- data/test/unit/adapter_test.rb +0 -69
- data/test/unit/callbacks_test.rb +0 -31
- data/test/unit/client_test.rb +0 -27
- data/test/unit/hash_wrapper_test.rb +0 -13
- data/test/unit/importing_test.rb +0 -224
- data/test/unit/indexing_test.rb +0 -720
- data/test/unit/module_test.rb +0 -68
- data/test/unit/multimodel_test.rb +0 -38
- data/test/unit/naming_inheritance_test.rb +0 -94
- data/test/unit/naming_test.rb +0 -103
- data/test/unit/proxy_test.rb +0 -98
- data/test/unit/response_aggregations_test.rb +0 -46
- data/test/unit/response_base_test.rb +0 -40
- data/test/unit/response_pagination_kaminari_test.rb +0 -433
- data/test/unit/response_pagination_will_paginate_test.rb +0 -398
- data/test/unit/response_records_test.rb +0 -91
- data/test/unit/response_result_test.rb +0 -90
- data/test/unit/response_results_test.rb +0 -34
- data/test/unit/response_test.rb +0 -104
- data/test/unit/searching_search_request_test.rb +0 -78
- data/test/unit/searching_test.rb +0 -41
- data/test/unit/serializing_test.rb +0 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7ed2b3f49b07fddee98c7628224c50ed65147a28a27c0e1cad0234ebe38b645f
|
4
|
+
data.tar.gz: 9c2cea09cb144c08c912352d4f055d70796c6662713900382ee3672a33a90da2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3156e42603250f4e3a6deee15c7bf78bfe95a6f2de1c425a45e350e1f7bbe3fc366837dbcbf80b492c2dfedd815c0968e56ba9437da2434342d634bd3993155e
|
7
|
+
data.tar.gz: 3862bef940069503924101479c3c3514a20ae783658a2ae395245f5245328c5e41d5c7e485c6e2371534ccd4502bcc82cf1205846e3f550006fe2b4c79be4d3f
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -19,6 +19,7 @@ is compatible with the Elasticsearch `master` branch, therefore, with the next m
|
|
19
19
|
| 0.1 | → | 1.x |
|
20
20
|
| 2.x | → | 2.x |
|
21
21
|
| 5.x | → | 5.x |
|
22
|
+
| 6.x | → | 6.x |
|
22
23
|
| master | → | master |
|
23
24
|
|
24
25
|
## Installation
|
@@ -724,13 +725,8 @@ module and its submodules for technical information.
|
|
724
725
|
|
725
726
|
The module provides a common `settings` method to customize various features.
|
726
727
|
|
727
|
-
|
728
|
-
|
729
|
-
in Rails:
|
730
|
-
|
731
|
-
```ruby
|
732
|
-
Elasticsearch::Model.settings[:inheritance_enabled] = true
|
733
|
-
```
|
728
|
+
Before version 7.0.0 of the gem, the only supported setting was `:inheritance_enabled`. This setting has been deprecated
|
729
|
+
and removed.
|
734
730
|
|
735
731
|
## Development and Community
|
736
732
|
|
@@ -748,6 +744,17 @@ curl -# https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticse
|
|
748
744
|
SERVER=start TEST_CLUSTER_COMMAND=$PWD/tmp/elasticsearch-1.0.0.RC1/bin/elasticsearch bundle exec rake test:all
|
749
745
|
```
|
750
746
|
|
747
|
+
### Single Table Inheritance deprecation
|
748
|
+
|
749
|
+
`Single Table Inheritance` has been supported through the 6.x series of this gem. With this feature,
|
750
|
+
elasticsearch settings (index mappings, etc) on a parent model could be inherited by a child model leading to different
|
751
|
+
model documents being indexed into the same Elasticsearch index. This feature depended on the ability to set a `type`
|
752
|
+
for a document in Elasticsearch. The Elasticsearch team has deprecated support for `types`, as is described
|
753
|
+
[here.](https://www.elastic.co/guide/en/elasticsearch/reference/current/removal-of-types.html)
|
754
|
+
This gem will also remove support for types and `Single Table Inheritance` in version 7.0 as it enables an anti-pattern.
|
755
|
+
Please save different model documents in separate indices. If you want to use STI, you can include an artificial
|
756
|
+
`type` field manually in each document and use it in other operations.
|
757
|
+
|
751
758
|
## License
|
752
759
|
|
753
760
|
This software is licensed under the Apache 2 license, quoted below.
|
data/Rakefile
CHANGED
@@ -4,12 +4,25 @@ desc "Run unit tests"
|
|
4
4
|
task :default => 'test:unit'
|
5
5
|
task :test => 'test:unit'
|
6
6
|
|
7
|
-
|
8
|
-
|
7
|
+
if RUBY_VERSION < '2.3'
|
8
|
+
GEMFILES = ['3.0.gemfile', '4.0.gemfile', '5.0.gemfile']
|
9
|
+
else
|
10
|
+
GEMFILES = ['4.0.gemfile', '5.0.gemfile']
|
11
|
+
end
|
12
|
+
|
13
|
+
namespace :bundle do
|
14
|
+
desc 'Install dependencies for all the Gemfiles in /gemfiles. Optionally define env variable RAILS_VERSIONS. E.g. RAILS_VERSIONS=3.0,5.0'
|
9
15
|
task :install do
|
10
|
-
|
11
|
-
|
12
|
-
|
16
|
+
unless defined?(JRUBY_VERSION)
|
17
|
+
puts '-'*80
|
18
|
+
gemfiles = ENV['RAILS_VERSIONS'] ? ENV['RAILS_VERSIONS'].split(',').map { |v| "#{v}.gemfile"} : GEMFILES
|
19
|
+
gemfiles.each do |gemfile|
|
20
|
+
Bundler.with_clean_env do
|
21
|
+
sh "bundle install --gemfile #{File.expand_path('../gemfiles/'+gemfile, __FILE__)}"
|
22
|
+
end
|
23
|
+
puts '-'*80
|
24
|
+
end
|
25
|
+
end
|
13
26
|
end
|
14
27
|
end
|
15
28
|
|
@@ -17,38 +30,16 @@ end
|
|
17
30
|
|
18
31
|
require 'rake/testtask'
|
19
32
|
namespace :test do
|
20
|
-
Rake::TestTask.new(:run_unit) do |test|
|
21
|
-
test.libs << 'lib' << 'test'
|
22
|
-
test.test_files = FileList["test/unit/**/*_test.rb"]
|
23
|
-
test.verbose = false
|
24
|
-
test.warning = false
|
25
|
-
end
|
26
|
-
|
27
|
-
Rake::TestTask.new(:run_integration) do |test|
|
28
|
-
test.libs << 'lib' << 'test'
|
29
|
-
test.test_files = FileList["test/integration/**/*_test.rb"]
|
30
|
-
test.verbose = false
|
31
|
-
test.warning = false
|
32
|
-
end
|
33
|
-
|
34
|
-
desc "Run unit tests against ActiveModel 3, 4 and 5"
|
35
|
-
task :unit do
|
36
|
-
sh "BUNDLE_GEMFILE='#{File.expand_path('../gemfiles/3.0.gemfile', __FILE__)}' bundle exec rake test:run_unit"
|
37
|
-
sh "BUNDLE_GEMFILE='#{File.expand_path('../gemfiles/4.0.gemfile', __FILE__)}' bundle exec rake test:run_unit"
|
38
|
-
sh "BUNDLE_GEMFILE='#{File.expand_path('../gemfiles/5.0.gemfile', __FILE__)}' bundle exec rake test:run_unit"
|
39
|
-
end
|
40
|
-
|
41
|
-
desc "Run integration tests against latest stable ActiveModel (5)"
|
42
|
-
task :integration do
|
43
|
-
#sh "BUNDLE_GEMFILE='#{File.expand_path('../gemfiles/3.0.gemfile', __FILE__)}' bundle exec rake test:run_integration"
|
44
|
-
#sh "BUNDLE_GEMFILE='#{File.expand_path('../gemfiles/4.0.gemfile', __FILE__)}' bundle exec rake test:run_integration"
|
45
|
-
sh "BUNDLE_GEMFILE='#{File.expand_path('../gemfiles/5.0.gemfile', __FILE__)}' bundle exec rake test:run_integration"
|
46
|
-
end
|
47
33
|
|
48
|
-
desc
|
49
|
-
task :all do
|
50
|
-
|
51
|
-
|
34
|
+
desc 'Run all tests. Optionally define env variable RAILS_VERSIONS. E.g. RAILS_VERSIONS=3.0,5.0'
|
35
|
+
task :all, [:rails_versions] do |task, args|
|
36
|
+
gemfiles = ENV['RAILS_VERSIONS'] ? ENV['RAILS_VERSIONS'].split(',').map {|v| "#{v}.gemfile"} : GEMFILES
|
37
|
+
puts '-' * 80
|
38
|
+
gemfiles.each do |gemfile|
|
39
|
+
sh "BUNDLE_GEMFILE='#{File.expand_path("../gemfiles/#{gemfile}", __FILE__)}' " +
|
40
|
+
" bundle exec rspec"
|
41
|
+
puts '-' * 80
|
42
|
+
end
|
52
43
|
end
|
53
44
|
end
|
54
45
|
|
data/elasticsearch-model.gemspec
CHANGED
@@ -27,7 +27,7 @@ Gem::Specification.new do |s|
|
|
27
27
|
s.add_dependency "activesupport", '> 3'
|
28
28
|
s.add_dependency "hashie"
|
29
29
|
|
30
|
-
s.add_development_dependency "bundler"
|
30
|
+
s.add_development_dependency "bundler"
|
31
31
|
s.add_development_dependency "rake", "~> 11.1"
|
32
32
|
|
33
33
|
s.add_development_dependency "elasticsearch-extensions"
|
@@ -50,20 +50,7 @@ response_1 = Article.search 'foo';
|
|
50
50
|
puts "Article search:".ansi(:bold),
|
51
51
|
response_1.to_a.map { |d| "Title: #{d.title}" }.inspect.ansi(:bold, :yellow)
|
52
52
|
|
53
|
-
response_2 = Article.
|
54
|
-
index: Article.index_name,
|
55
|
-
body: {
|
56
|
-
articles: {
|
57
|
-
text: 'foo',
|
58
|
-
completion: { field: 'title.suggest' }
|
59
|
-
}
|
60
|
-
};
|
61
|
-
|
62
|
-
puts "Article suggest:".ansi(:bold),
|
63
|
-
response_2['articles'].first['options'].map { |d| "#{d['text']} -> #{d['_source']['url']}" }.
|
64
|
-
inspect.ansi(:bold, :green)
|
65
|
-
|
66
|
-
response_3 = Article.search \
|
53
|
+
response_2 = Article.search \
|
67
54
|
query: {
|
68
55
|
match: { title: 'foo' }
|
69
56
|
},
|
@@ -76,7 +63,7 @@ response_3 = Article.search \
|
|
76
63
|
_source: ['title', 'url']
|
77
64
|
|
78
65
|
puts "Article search with suggest:".ansi(:bold),
|
79
|
-
|
66
|
+
response_2.response['suggest']['articles'].first['options'].map { |d| "#{d['text']} -> #{d['_source']['url']}" }.
|
80
67
|
inspect.ansi(:bold, :blue)
|
81
68
|
|
82
69
|
require 'pry'; binding.pry;
|
data/gemfiles/3.0.gemfile
CHANGED
@@ -10,4 +10,9 @@ gemspec path: '../'
|
|
10
10
|
gem 'activemodel', '>= 3.0'
|
11
11
|
gem 'activerecord', '~> 3.2'
|
12
12
|
gem 'mongoid', '>= 3.0'
|
13
|
-
gem 'sqlite3' unless defined?(JRUBY_VERSION)
|
13
|
+
gem 'sqlite3', '~> 1.3.6' unless defined?(JRUBY_VERSION)
|
14
|
+
|
15
|
+
group :development, :testing do
|
16
|
+
gem 'rspec'
|
17
|
+
gem 'pry-nav'
|
18
|
+
end
|
data/gemfiles/4.0.gemfile
CHANGED
@@ -9,4 +9,10 @@ gemspec path: '../'
|
|
9
9
|
|
10
10
|
gem 'activemodel', '~> 4'
|
11
11
|
gem 'activerecord', '~> 4'
|
12
|
-
gem 'sqlite3' unless defined?(JRUBY_VERSION)
|
12
|
+
gem 'sqlite3', '~> 1.3.6' unless defined?(JRUBY_VERSION)
|
13
|
+
gem 'mongoid', '~> 5'
|
14
|
+
|
15
|
+
group :development, :testing do
|
16
|
+
gem 'rspec'
|
17
|
+
gem 'pry-nav'
|
18
|
+
end
|
data/gemfiles/5.0.gemfile
CHANGED
data/lib/elasticsearch/model.rb
CHANGED
@@ -131,12 +131,6 @@ module Elasticsearch
|
|
131
131
|
end
|
132
132
|
end
|
133
133
|
|
134
|
-
# Access the module settings
|
135
|
-
#
|
136
|
-
def self.settings
|
137
|
-
@settings ||= {}
|
138
|
-
end
|
139
|
-
|
140
134
|
module ClassMethods
|
141
135
|
# Get the client common for all models
|
142
136
|
#
|
@@ -193,7 +187,7 @@ module Elasticsearch
|
|
193
187
|
# @note Inheritance is disabled by default.
|
194
188
|
#
|
195
189
|
def inheritance_enabled
|
196
|
-
@inheritance_enabled ||= false
|
190
|
+
@settings[:inheritance_enabled] ||= false
|
197
191
|
end
|
198
192
|
|
199
193
|
# Enable inheritance of index_name and document_type
|
@@ -203,8 +197,21 @@ module Elasticsearch
|
|
203
197
|
# Elasticsearch::Model.inheritance_enabled = true
|
204
198
|
#
|
205
199
|
def inheritance_enabled=(inheritance_enabled)
|
206
|
-
|
200
|
+
warn STI_DEPRECATION_WARNING if inheritance_enabled
|
201
|
+
@settings[:inheritance_enabled] = inheritance_enabled
|
202
|
+
end
|
203
|
+
|
204
|
+
# Access the module settings
|
205
|
+
#
|
206
|
+
def settings
|
207
|
+
@settings ||= {}
|
207
208
|
end
|
209
|
+
|
210
|
+
private
|
211
|
+
|
212
|
+
STI_DEPRECATION_WARNING = "DEPRECATION WARNING: Support for Single Table Inheritance (STI) is deprecated " +
|
213
|
+
"and will be removed in version 7.0.0.\nPlease save different model documents in separate indices and refer " +
|
214
|
+
"to the Elasticsearch documentation for more information.".freeze
|
208
215
|
end
|
209
216
|
extend ClassMethods
|
210
217
|
|
@@ -35,7 +35,11 @@ module Elasticsearch
|
|
35
35
|
else
|
36
36
|
self.__send__(:exec_queries)
|
37
37
|
end
|
38
|
-
|
38
|
+
if !self.order_values.present?
|
39
|
+
@records.sort_by { |record| hits.index { |hit| hit['_id'].to_s == record.id.to_s } }
|
40
|
+
else
|
41
|
+
@records
|
42
|
+
end
|
39
43
|
end if self
|
40
44
|
end
|
41
45
|
|
@@ -47,30 +51,6 @@ module Elasticsearch
|
|
47
51
|
def load
|
48
52
|
records.__send__(:load)
|
49
53
|
end
|
50
|
-
|
51
|
-
# Intercept call to the `order` method, so we can ignore the order from Elasticsearch
|
52
|
-
#
|
53
|
-
def order(*args)
|
54
|
-
sql_records = records.__send__ :order, *args
|
55
|
-
|
56
|
-
# Redefine the `to_a` method to the original one
|
57
|
-
#
|
58
|
-
sql_records.instance_exec do
|
59
|
-
ar_records_method_name = :to_a
|
60
|
-
ar_records_method_name = :records if defined?(::ActiveRecord) && ::ActiveRecord::VERSION::MAJOR >= 5
|
61
|
-
|
62
|
-
define_singleton_method(ar_records_method_name) do
|
63
|
-
if defined?(::ActiveRecord) && ::ActiveRecord::VERSION::MAJOR >= 4
|
64
|
-
self.load
|
65
|
-
else
|
66
|
-
self.__send__(:exec_queries)
|
67
|
-
end
|
68
|
-
@records
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
sql_records
|
73
|
-
end
|
74
54
|
end
|
75
55
|
|
76
56
|
module Callbacks
|
@@ -106,7 +86,8 @@ module Elasticsearch
|
|
106
86
|
scope = scope.instance_exec(&query) if query
|
107
87
|
|
108
88
|
scope.find_in_batches(options) do |batch|
|
109
|
-
|
89
|
+
batch = self.__send__(preprocess, batch) if preprocess
|
90
|
+
yield(batch) if batch.present?
|
110
91
|
end
|
111
92
|
end
|
112
93
|
|
@@ -269,7 +269,8 @@ module Elasticsearch
|
|
269
269
|
self.client.indices.delete index: target_index
|
270
270
|
rescue Exception => e
|
271
271
|
if e.class.to_s =~ /NotFound/ && options[:force]
|
272
|
-
|
272
|
+
client.transport.logger.debug("[!!!] Index does not exist (#{e.class})") if client.transport.logger
|
273
|
+
nil
|
273
274
|
else
|
274
275
|
raise e
|
275
276
|
end
|
@@ -295,7 +296,8 @@ module Elasticsearch
|
|
295
296
|
self.client.indices.refresh index: target_index
|
296
297
|
rescue Exception => e
|
297
298
|
if e.class.to_s =~ /NotFound/ && options[:force]
|
298
|
-
|
299
|
+
client.transport.logger.debug("[!!!] Index does not exist (#{e.class})") if client.transport.logger
|
300
|
+
nil
|
299
301
|
else
|
300
302
|
raise e
|
301
303
|
end
|
@@ -409,7 +411,7 @@ module Elasticsearch
|
|
409
411
|
type: document_type,
|
410
412
|
id: self.id,
|
411
413
|
body: { doc: attributes } }.merge(options)
|
412
|
-
)
|
414
|
+
) unless attributes.empty?
|
413
415
|
else
|
414
416
|
index_document(options)
|
415
417
|
end
|
@@ -79,7 +79,12 @@ module Elasticsearch
|
|
79
79
|
|
80
80
|
if Elasticsearch::Model.settings[:inheritance_enabled]
|
81
81
|
self.ancestors.each do |klass|
|
82
|
-
|
82
|
+
# When Naming is included in Proxy::ClassMethods the actual model
|
83
|
+
# is among its ancestors. We don't want to call the actual model
|
84
|
+
# since it will result in the same call to the same instance of
|
85
|
+
# Proxy::ClassMethods. To prevent this we also skip the ancestor
|
86
|
+
# that is the target.
|
87
|
+
next if klass == self || self.respond_to?(:target) && klass == self.target
|
83
88
|
break if value = klass.respond_to?(prop) && klass.send(prop)
|
84
89
|
end
|
85
90
|
end
|
@@ -60,7 +60,7 @@ module Elasticsearch
|
|
60
60
|
# Returns the statistics on shards
|
61
61
|
#
|
62
62
|
def shards
|
63
|
-
@shards ||=
|
63
|
+
@shards ||= response['_shards']
|
64
64
|
end
|
65
65
|
|
66
66
|
# Returns a Hashie::Mash of the aggregations
|
@@ -76,7 +76,7 @@ module Elasticsearch
|
|
76
76
|
end
|
77
77
|
|
78
78
|
def raw_response
|
79
|
-
@raw_response ||= search.execute!
|
79
|
+
@raw_response ||= @response ? @response.to_hash : search.execute!
|
80
80
|
end
|
81
81
|
end
|
82
82
|
end
|
@@ -1,192 +1,2 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
module Response
|
4
|
-
|
5
|
-
# Pagination for search results/records
|
6
|
-
#
|
7
|
-
module Pagination
|
8
|
-
# Allow models to be paginated with the "kaminari" gem [https://github.com/amatsuda/kaminari]
|
9
|
-
#
|
10
|
-
module Kaminari
|
11
|
-
def self.included(base)
|
12
|
-
# Include the Kaminari configuration and paging method in response
|
13
|
-
#
|
14
|
-
base.__send__ :include, ::Kaminari::ConfigurationMethods::ClassMethods
|
15
|
-
base.__send__ :include, ::Kaminari::PageScopeMethods
|
16
|
-
|
17
|
-
# Include the Kaminari paging methods in results and records
|
18
|
-
#
|
19
|
-
Elasticsearch::Model::Response::Results.__send__ :include, ::Kaminari::ConfigurationMethods::ClassMethods
|
20
|
-
Elasticsearch::Model::Response::Results.__send__ :include, ::Kaminari::PageScopeMethods
|
21
|
-
Elasticsearch::Model::Response::Records.__send__ :include, ::Kaminari::PageScopeMethods
|
22
|
-
|
23
|
-
Elasticsearch::Model::Response::Results.__send__ :delegate, :limit_value, :offset_value, :total_count, :max_pages, to: :response
|
24
|
-
Elasticsearch::Model::Response::Records.__send__ :delegate, :limit_value, :offset_value, :total_count, :max_pages, to: :response
|
25
|
-
|
26
|
-
base.class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
27
|
-
# Define the `page` Kaminari method
|
28
|
-
#
|
29
|
-
def #{::Kaminari.config.page_method_name}(num=nil)
|
30
|
-
@results = nil
|
31
|
-
@records = nil
|
32
|
-
@response = nil
|
33
|
-
@page = [num.to_i, 1].max
|
34
|
-
@per_page ||= __default_per_page
|
35
|
-
|
36
|
-
self.search.definition.update size: @per_page,
|
37
|
-
from: @per_page * (@page - 1)
|
38
|
-
|
39
|
-
self
|
40
|
-
end
|
41
|
-
RUBY
|
42
|
-
end
|
43
|
-
|
44
|
-
# Returns the current "limit" (`size`) value
|
45
|
-
#
|
46
|
-
def limit_value
|
47
|
-
case
|
48
|
-
when search.definition[:size]
|
49
|
-
search.definition[:size]
|
50
|
-
else
|
51
|
-
__default_per_page
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
# Returns the current "offset" (`from`) value
|
56
|
-
#
|
57
|
-
def offset_value
|
58
|
-
case
|
59
|
-
when search.definition[:from]
|
60
|
-
search.definition[:from]
|
61
|
-
else
|
62
|
-
0
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
# Set the "limit" (`size`) value
|
67
|
-
#
|
68
|
-
def limit(value)
|
69
|
-
return self if value.to_i <= 0
|
70
|
-
@results = nil
|
71
|
-
@records = nil
|
72
|
-
@response = nil
|
73
|
-
@per_page = value.to_i
|
74
|
-
|
75
|
-
search.definition.update :size => @per_page
|
76
|
-
search.definition.update :from => @per_page * (@page - 1) if @page
|
77
|
-
self
|
78
|
-
end
|
79
|
-
|
80
|
-
# Set the "offset" (`from`) value
|
81
|
-
#
|
82
|
-
def offset(value)
|
83
|
-
return self if value.to_i < 0
|
84
|
-
@results = nil
|
85
|
-
@records = nil
|
86
|
-
@response = nil
|
87
|
-
@page = nil
|
88
|
-
search.definition.update :from => value.to_i
|
89
|
-
self
|
90
|
-
end
|
91
|
-
|
92
|
-
# Returns the total number of results
|
93
|
-
#
|
94
|
-
def total_count
|
95
|
-
results.total
|
96
|
-
end
|
97
|
-
|
98
|
-
# Returns the models's `per_page` value or the default
|
99
|
-
#
|
100
|
-
# @api private
|
101
|
-
#
|
102
|
-
def __default_per_page
|
103
|
-
klass.respond_to?(:default_per_page) && klass.default_per_page || ::Kaminari.config.default_per_page
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
# Allow models to be paginated with the "will_paginate" gem [https://github.com/mislav/will_paginate]
|
108
|
-
#
|
109
|
-
module WillPaginate
|
110
|
-
def self.included(base)
|
111
|
-
base.__send__ :include, ::WillPaginate::CollectionMethods
|
112
|
-
|
113
|
-
# Include the paging methods in results and records
|
114
|
-
#
|
115
|
-
methods = [:current_page, :offset, :length, :per_page, :total_entries, :total_pages, :previous_page, :next_page, :out_of_bounds?]
|
116
|
-
Elasticsearch::Model::Response::Results.__send__ :delegate, *methods, to: :response
|
117
|
-
Elasticsearch::Model::Response::Records.__send__ :delegate, *methods, to: :response
|
118
|
-
end
|
119
|
-
|
120
|
-
def offset
|
121
|
-
(current_page - 1) * per_page
|
122
|
-
end
|
123
|
-
|
124
|
-
def length
|
125
|
-
search.definition[:size]
|
126
|
-
end
|
127
|
-
|
128
|
-
# Main pagination method
|
129
|
-
#
|
130
|
-
# @example
|
131
|
-
#
|
132
|
-
# Article.search('foo').paginate(page: 1, per_page: 30)
|
133
|
-
#
|
134
|
-
def paginate(options)
|
135
|
-
param_name = options[:param_name] || :page
|
136
|
-
page = [options[param_name].to_i, 1].max
|
137
|
-
per_page = (options[:per_page] || __default_per_page).to_i
|
138
|
-
|
139
|
-
search.definition.update size: per_page,
|
140
|
-
from: (page - 1) * per_page
|
141
|
-
self
|
142
|
-
end
|
143
|
-
|
144
|
-
# Return the current page
|
145
|
-
#
|
146
|
-
def current_page
|
147
|
-
search.definition[:from] / per_page + 1 if search.definition[:from] && per_page
|
148
|
-
end
|
149
|
-
|
150
|
-
# Pagination method
|
151
|
-
#
|
152
|
-
# @example
|
153
|
-
#
|
154
|
-
# Article.search('foo').page(2)
|
155
|
-
#
|
156
|
-
def page(num)
|
157
|
-
paginate(page: num, per_page: per_page) # shorthand
|
158
|
-
end
|
159
|
-
|
160
|
-
# Return or set the "size" value
|
161
|
-
#
|
162
|
-
# @example
|
163
|
-
#
|
164
|
-
# Article.search('foo').per_page(15).page(2)
|
165
|
-
#
|
166
|
-
def per_page(num = nil)
|
167
|
-
if num.nil?
|
168
|
-
search.definition[:size]
|
169
|
-
else
|
170
|
-
paginate(page: current_page, per_page: num) # shorthand
|
171
|
-
end
|
172
|
-
end
|
173
|
-
|
174
|
-
# Returns the total number of results
|
175
|
-
#
|
176
|
-
def total_entries
|
177
|
-
results.total
|
178
|
-
end
|
179
|
-
|
180
|
-
# Returns the models's `per_page` value or the default
|
181
|
-
#
|
182
|
-
# @api private
|
183
|
-
#
|
184
|
-
def __default_per_page
|
185
|
-
klass.respond_to?(:per_page) && klass.per_page || ::WillPaginate.per_page
|
186
|
-
end
|
187
|
-
end
|
188
|
-
end
|
189
|
-
|
190
|
-
end
|
191
|
-
end
|
192
|
-
end
|
1
|
+
require 'elasticsearch/model/response/pagination/kaminari'
|
2
|
+
require 'elasticsearch/model/response/pagination/will_paginate'
|