elasticsearch-model 0.1.0.rc1 → 0.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.
- data/.gitignore +2 -2
- data/README.md +1 -1
- data/elasticsearch-model.gemspec +3 -2
- data/examples/activerecord_associations.rb +7 -0
- data/gemfiles/3.0.gemfile +12 -0
- data/gemfiles/4.0.gemfile +12 -0
- data/lib/elasticsearch/model.rb +13 -12
- data/lib/elasticsearch/model/adapters/active_record.rb +1 -1
- data/lib/elasticsearch/model/ext/active_record.rb +14 -0
- data/lib/elasticsearch/model/importing.rb +10 -6
- data/lib/elasticsearch/model/indexing.rb +26 -8
- data/lib/elasticsearch/model/response.rb +1 -2
- data/lib/elasticsearch/model/response/pagination.rb +2 -2
- data/lib/elasticsearch/model/response/records.rb +1 -2
- data/lib/elasticsearch/model/response/results.rb +1 -2
- data/lib/elasticsearch/model/searching.rb +1 -1
- data/lib/elasticsearch/model/version.rb +1 -1
- data/test/integration/mongoid_basic_test.rb +4 -3
- data/test/test_helper.rb +1 -1
- data/test/unit/adapter_active_record_test.rb +4 -3
- data/test/unit/importing_test.rb +26 -0
- data/test/unit/indexing_test.rb +37 -0
- data/test/unit/response_records_test.rb +6 -2
- data/test/unit/searching_test.rb +2 -1
- metadata +26 -26
- data/gemfiles/3.gemfile +0 -11
- data/gemfiles/4.gemfile +0 -11
- data/lib/elasticsearch/model/support/forwardable.rb +0 -44
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -13,7 +13,7 @@ The library is compatible with Ruby 1.9.3 and higher.
|
|
13
13
|
|
14
14
|
Install the package from [Rubygems](https://rubygems.org):
|
15
15
|
|
16
|
-
gem install elasticsearch-model
|
16
|
+
gem install elasticsearch-model
|
17
17
|
|
18
18
|
To use an unreleased version, either add it to your `Gemfile` for [Bundler](http://bundler.io):
|
19
19
|
|
data/elasticsearch-model.gemspec
CHANGED
@@ -21,7 +21,8 @@ Gem::Specification.new do |s|
|
|
21
21
|
s.extra_rdoc_files = [ "README.md", "LICENSE.txt" ]
|
22
22
|
s.rdoc_options = [ "--charset=UTF-8" ]
|
23
23
|
|
24
|
-
s.add_dependency "elasticsearch", '
|
24
|
+
s.add_dependency "elasticsearch", '> 0.4'
|
25
|
+
s.add_dependency "activesupport", '> 3'
|
25
26
|
s.add_dependency "hashie"
|
26
27
|
|
27
28
|
s.add_development_dependency "bundler", "~> 1.3"
|
@@ -30,12 +31,12 @@ Gem::Specification.new do |s|
|
|
30
31
|
s.add_development_dependency "elasticsearch-extensions"
|
31
32
|
|
32
33
|
s.add_development_dependency "sqlite3"
|
33
|
-
s.add_development_dependency "activesupport", "> 3.0"
|
34
34
|
s.add_development_dependency "activemodel", "> 3.0"
|
35
35
|
s.add_development_dependency "activerecord", "> 4.0"
|
36
36
|
|
37
37
|
s.add_development_dependency "oj"
|
38
38
|
s.add_development_dependency "kaminari"
|
39
|
+
# NOTE: Do not add Mongoid here, keep only in 3/4 files
|
39
40
|
|
40
41
|
s.add_development_dependency "shoulda-context"
|
41
42
|
s.add_development_dependency "mocha"
|
@@ -3,6 +3,11 @@
|
|
3
3
|
#
|
4
4
|
# https://github.com/rails/rails/tree/master/activerecord
|
5
5
|
# http://guides.rubyonrails.org/association_basics.html
|
6
|
+
#
|
7
|
+
# Run me with:
|
8
|
+
#
|
9
|
+
# ruby -I lib examples/activerecord_associations.rb
|
10
|
+
#
|
6
11
|
|
7
12
|
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
|
8
13
|
|
@@ -81,6 +86,8 @@ class Article < ActiveRecord::Base
|
|
81
86
|
has_many :comments
|
82
87
|
end
|
83
88
|
|
89
|
+
class Article < ActiveRecord::Base; delegate :size, to: :comments, prefix: true; end
|
90
|
+
|
84
91
|
class Comment < ActiveRecord::Base
|
85
92
|
belongs_to :article, touch: true
|
86
93
|
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# Usage:
|
2
|
+
#
|
3
|
+
# $ BUNDLE_GEMFILE=./gemfiles/3.0.gemfile bundle install
|
4
|
+
# $ BUNDLE_GEMFILE=./gemfiles/3.0.gemfile bundle exec rake test:integration
|
5
|
+
|
6
|
+
source 'https://rubygems.org'
|
7
|
+
|
8
|
+
gemspec path: '../'
|
9
|
+
|
10
|
+
gem 'activemodel', '>= 3.0'
|
11
|
+
gem 'activerecord', '~> 3.2'
|
12
|
+
gem 'mongoid', '>= 3.0'
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# Usage:
|
2
|
+
#
|
3
|
+
# $ BUNDLE_GEMFILE=./gemfiles/4.0.gemfile bundle install
|
4
|
+
# $ BUNDLE_GEMFILE=./gemfiles/4.0.gemfile bundle exec rake test:integration
|
5
|
+
|
6
|
+
source 'https://rubygems.org'
|
7
|
+
|
8
|
+
gemspec path: '../'
|
9
|
+
|
10
|
+
gem 'activemodel', '~> 4'
|
11
|
+
gem 'activerecord', '~> 4'
|
12
|
+
gem 'mongoid', '~> 4.0.0.beta1'
|
data/lib/elasticsearch/model.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
|
-
require 'forwardable'
|
2
|
-
|
3
1
|
require 'elasticsearch'
|
4
2
|
|
5
3
|
require 'hashie'
|
6
4
|
|
7
|
-
require '
|
5
|
+
require 'active_support/core_ext/module/delegation'
|
6
|
+
|
7
|
+
require 'elasticsearch/model/version'
|
8
8
|
|
9
9
|
require 'elasticsearch/model/client'
|
10
10
|
|
@@ -29,7 +29,7 @@ require 'elasticsearch/model/response/results'
|
|
29
29
|
require 'elasticsearch/model/response/records'
|
30
30
|
require 'elasticsearch/model/response/pagination'
|
31
31
|
|
32
|
-
require 'elasticsearch/model/
|
32
|
+
require 'elasticsearch/model/ext/active_record'
|
33
33
|
|
34
34
|
if defined?(::Kaminari)
|
35
35
|
Elasticsearch::Model::Response::Response.__send__ :include, Elasticsearch::Model::Response::Pagination::Kaminari
|
@@ -103,14 +103,15 @@ module Elasticsearch
|
|
103
103
|
|
104
104
|
# Delegate important methods to the `__elasticsearch__` proxy, unless they are defined already
|
105
105
|
#
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
106
|
+
class << self
|
107
|
+
delegate :search, to: :__elasticsearch__ unless respond_to?(:search)
|
108
|
+
delegate :mapping, to: :__elasticsearch__ unless respond_to?(:mapping)
|
109
|
+
delegate :mappings, to: :__elasticsearch__ unless respond_to?(:mappings)
|
110
|
+
delegate :settings, to: :__elasticsearch__ unless respond_to?(:settings)
|
111
|
+
delegate :index_name, to: :__elasticsearch__ unless respond_to?(:index_name)
|
112
|
+
delegate :document_type, to: :__elasticsearch__ unless respond_to?(:document_type)
|
113
|
+
delegate :import, to: :__elasticsearch__ unless respond_to?(:import)
|
114
|
+
end
|
114
115
|
|
115
116
|
# Mix the importing module into the proxy
|
116
117
|
#
|
@@ -13,7 +13,7 @@ module Elasticsearch
|
|
13
13
|
# Returns an `ActiveRecord::Relation` instance
|
14
14
|
#
|
15
15
|
def records
|
16
|
-
sql_records = klass.where(
|
16
|
+
sql_records = klass.where(klass.primary_key => ids)
|
17
17
|
|
18
18
|
# Re-order records based on the order from Elasticsearch hits
|
19
19
|
# by redefining `to_a`, unless the user has called `order()`
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# Prevent `MyModel.inspect` failing with `ActiveRecord::ConnectionNotEstablished`
|
2
|
+
# (triggered by elasticsearch-model/lib/elasticsearch/model.rb:79:in `included')
|
3
|
+
#
|
4
|
+
ActiveRecord::Base.instance_eval do
|
5
|
+
class << self
|
6
|
+
def inspect_with_rescue
|
7
|
+
inspect_without_rescue
|
8
|
+
rescue ActiveRecord::ConnectionNotEstablished
|
9
|
+
"#{self}(no database connection)"
|
10
|
+
end
|
11
|
+
|
12
|
+
alias_method_chain :inspect, :rescue
|
13
|
+
end
|
14
|
+
end if defined?(ActiveRecord) && ActiveRecord::VERSION::STRING < '4'
|
@@ -60,20 +60,24 @@ module Elasticsearch
|
|
60
60
|
#
|
61
61
|
# Article.import refresh: true
|
62
62
|
#
|
63
|
+
# @example Import the records into a different index/type than the default one
|
64
|
+
#
|
65
|
+
# Article.import index: 'my-new-index', type: 'my-other-type'
|
63
66
|
#
|
64
67
|
def import(options={}, &block)
|
65
|
-
errors
|
68
|
+
errors = 0
|
69
|
+
refresh = options.delete(:refresh) || false
|
70
|
+
target_index = options.delete(:index) || index_name
|
71
|
+
target_type = options.delete(:type) || document_type
|
66
72
|
|
67
73
|
if options.delete(:force)
|
68
|
-
self.create_index! force: true
|
74
|
+
self.create_index! force: true, index: target_index
|
69
75
|
end
|
70
76
|
|
71
|
-
refresh = options.delete(:refresh) || false
|
72
|
-
|
73
77
|
__find_in_batches(options) do |batch|
|
74
78
|
response = client.bulk \
|
75
|
-
index:
|
76
|
-
type:
|
79
|
+
index: target_index,
|
80
|
+
type: target_type,
|
77
81
|
body: batch
|
78
82
|
|
79
83
|
yield response if block_given?
|
@@ -175,15 +175,21 @@ module Elasticsearch
|
|
175
175
|
#
|
176
176
|
# Article.__elasticsearch__.create_index! force: true
|
177
177
|
#
|
178
|
+
# @example Pass a specific index name
|
179
|
+
#
|
180
|
+
# Article.__elasticsearch__.create_index! index: 'my-index'
|
181
|
+
#
|
178
182
|
def create_index!(options={})
|
179
|
-
|
183
|
+
target_index = options.delete(:index) || self.index_name
|
184
|
+
|
185
|
+
delete_index!(options.merge index: target_index) if options[:force]
|
180
186
|
|
181
|
-
unless ( self.client.indices.exists(index:
|
187
|
+
unless ( self.client.indices.exists(index: target_index) rescue false )
|
182
188
|
begin
|
183
|
-
self.client.indices.create index:
|
184
|
-
|
185
|
-
|
186
|
-
|
189
|
+
self.client.indices.create index: target_index,
|
190
|
+
body: {
|
191
|
+
settings: self.settings.to_hash,
|
192
|
+
mappings: self.mappings.to_hash }
|
187
193
|
rescue Exception => e
|
188
194
|
unless e.class.to_s =~ /NotFound/ && options[:force]
|
189
195
|
STDERR.puts "[!!!] Error when creating the index: #{e.class}", "#{e.message}"
|
@@ -199,9 +205,15 @@ module Elasticsearch
|
|
199
205
|
#
|
200
206
|
# Article.__elasticsearch__.delete_index!
|
201
207
|
#
|
208
|
+
# @example Pass a specific index name
|
209
|
+
#
|
210
|
+
# Article.__elasticsearch__.delete_index! index: 'my-index'
|
211
|
+
#
|
202
212
|
def delete_index!(options={})
|
213
|
+
target_index = options.delete(:index) || self.index_name
|
214
|
+
|
203
215
|
begin
|
204
|
-
self.client.indices.delete index:
|
216
|
+
self.client.indices.delete index: target_index
|
205
217
|
rescue Exception => e
|
206
218
|
unless e.class.to_s =~ /NotFound/ && options[:force]
|
207
219
|
STDERR.puts "[!!!] Error when deleting the index: #{e.class}", "#{e.message}"
|
@@ -215,11 +227,17 @@ module Elasticsearch
|
|
215
227
|
#
|
216
228
|
# Article.__elasticsearch__.refresh_index!
|
217
229
|
#
|
230
|
+
# @example Pass a specific index name
|
231
|
+
#
|
232
|
+
# Article.__elasticsearch__.refresh_index! index: 'my-index'
|
233
|
+
#
|
218
234
|
# @see http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-refresh.html
|
219
235
|
#
|
220
236
|
def refresh_index!(options={})
|
237
|
+
target_index = options.delete(:index) || self.index_name
|
238
|
+
|
221
239
|
begin
|
222
|
-
self.client.indices.refresh index:
|
240
|
+
self.client.indices.refresh index: target_index
|
223
241
|
rescue Exception => e
|
224
242
|
unless e.class.to_s =~ /NotFound/ && options[:force]
|
225
243
|
STDERR.puts "[!!!] Error when refreshing the index: #{e.class}", "#{e.message}"
|
@@ -14,9 +14,8 @@ module Elasticsearch
|
|
14
14
|
:took, :timed_out, :shards
|
15
15
|
|
16
16
|
include Enumerable
|
17
|
-
extend Support::Forwardable
|
18
17
|
|
19
|
-
|
18
|
+
delegate :each, :empty?, :size, :slice, :[], :to_ary, to: :results
|
20
19
|
|
21
20
|
def initialize(klass, search, options={})
|
22
21
|
@klass = klass
|
@@ -20,8 +20,8 @@ module Elasticsearch
|
|
20
20
|
Elasticsearch::Model::Response::Results.__send__ :include, ::Kaminari::PageScopeMethods
|
21
21
|
Elasticsearch::Model::Response::Records.__send__ :include, ::Kaminari::PageScopeMethods
|
22
22
|
|
23
|
-
Elasticsearch::Model::Response::Results.__send__ :
|
24
|
-
Elasticsearch::Model::Response::Records.__send__ :
|
23
|
+
Elasticsearch::Model::Response::Results.__send__ :delegate, :limit_value, :offset_value, :total_count, to: :response
|
24
|
+
Elasticsearch::Model::Response::Records.__send__ :delegate, :limit_value, :offset_value, :total_count, to: :response
|
25
25
|
|
26
26
|
base.class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
27
27
|
# Define the `page` Kaminari method
|
@@ -10,8 +10,7 @@ module Elasticsearch
|
|
10
10
|
class Records
|
11
11
|
include Enumerable
|
12
12
|
|
13
|
-
|
14
|
-
forward :records, :each, :empty?, :size, :slice, :[], :to_a, :to_ary
|
13
|
+
delegate :each, :empty?, :size, :slice, :[], :to_a, :to_ary, to: :records
|
15
14
|
|
16
15
|
include Base
|
17
16
|
|
@@ -10,8 +10,7 @@ module Elasticsearch
|
|
10
10
|
include Base
|
11
11
|
include Enumerable
|
12
12
|
|
13
|
-
|
14
|
-
forward :results, :each, :empty?, :size, :slice, :[], :to_a, :to_ary
|
13
|
+
delegate :each, :empty?, :size, :slice, :[], :to_a, :to_ary, to: :results
|
15
14
|
|
16
15
|
# @see Base#initialize
|
17
16
|
#
|
@@ -95,7 +95,7 @@ module Elasticsearch
|
|
95
95
|
# Article.search '{"query" : { "match_all" : {} }}'
|
96
96
|
#
|
97
97
|
def search(query_or_payload, options={})
|
98
|
-
search = SearchRequest.new(self, query_or_payload, options
|
98
|
+
search = SearchRequest.new(self, query_or_payload, options)
|
99
99
|
|
100
100
|
Response::Response.new(self, search)
|
101
101
|
end
|
@@ -1,17 +1,18 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
begin
|
4
|
-
require
|
4
|
+
require 'mongoid'
|
5
5
|
session = Moped::Connection.new("localhost", 27017, 0.5)
|
6
6
|
session.connect
|
7
7
|
ENV["MONGODB_AVAILABLE"] = 'yes'
|
8
8
|
rescue LoadError, Moped::Errors::ConnectionFailure => e
|
9
|
+
$stderr.puts "MongoDB not installed or running: #{e}"
|
9
10
|
end
|
10
11
|
|
11
12
|
if ENV["MONGODB_AVAILABLE"]
|
12
|
-
puts "Mongoid #{Mongoid::VERSION}", '-'*80
|
13
|
+
$stderr.puts "Mongoid #{Mongoid::VERSION}", '-'*80
|
13
14
|
|
14
|
-
logger = ::Logger.new(
|
15
|
+
logger = ::Logger.new($stderr)
|
15
16
|
logger.formatter = lambda { |s, d, p, m| " #{m.ansi(:faint, :cyan)}\n" }
|
16
17
|
logger.level = ::Logger::DEBUG
|
17
18
|
|
data/test/test_helper.rb
CHANGED
@@ -49,7 +49,7 @@ module Elasticsearch
|
|
49
49
|
tracer = ::Logger.new(STDERR)
|
50
50
|
tracer.formatter = lambda { |s, d, p, m| "#{m.gsub(/^.*$/) { |n| ' ' + n }.ansi(:faint)}\n" }
|
51
51
|
|
52
|
-
Elasticsearch::Model.client = Elasticsearch::Client.new host: '
|
52
|
+
Elasticsearch::Model.client = Elasticsearch::Client.new host: "localhost:#{(ENV['TEST_CLUSTER_PORT'] || 9250)}",
|
53
53
|
tracer: (ENV['QUIET'] ? nil : tracer)
|
54
54
|
end
|
55
55
|
end
|
@@ -23,6 +23,7 @@ class Elasticsearch::Model::AdapterActiveRecordTest < Test::Unit::TestCase
|
|
23
23
|
setup do
|
24
24
|
@records = [ stub(id: 1, inspect: '<Model-1>'), stub(id: 2, inspect: '<Model-2>') ]
|
25
25
|
@records.stubs(:load).returns(true)
|
26
|
+
@records.stubs(:exec_queries).returns(true)
|
26
27
|
end
|
27
28
|
|
28
29
|
should "have the register condition" do
|
@@ -39,7 +40,7 @@ class Elasticsearch::Model::AdapterActiveRecordTest < Test::Unit::TestCase
|
|
39
40
|
assert_instance_of Module, Elasticsearch::Model::Adapter::ActiveRecord::Records
|
40
41
|
|
41
42
|
instance = DummyClassForActiveRecord.new
|
42
|
-
instance.expects(:klass).returns(mock('class', where: @records))
|
43
|
+
instance.expects(:klass).returns(mock('class', primary_key: :some_key, where: @records)).at_least_once
|
43
44
|
|
44
45
|
assert_equal @records, instance.records
|
45
46
|
end
|
@@ -54,7 +55,7 @@ class Elasticsearch::Model::AdapterActiveRecordTest < Test::Unit::TestCase
|
|
54
55
|
@records.instance_variable_set(:@records, @records)
|
55
56
|
|
56
57
|
instance = DummyClassForActiveRecord.new
|
57
|
-
instance.expects(:klass).returns(mock('class', where: @records))
|
58
|
+
instance.expects(:klass).returns(mock('class', primary_key: :some_key, where: @records)).at_least_once
|
58
59
|
|
59
60
|
assert_equal [1, 2], @records. to_a.map(&:id)
|
60
61
|
assert_equal [2, 1], instance.records.to_a.map(&:id)
|
@@ -64,7 +65,7 @@ class Elasticsearch::Model::AdapterActiveRecordTest < Test::Unit::TestCase
|
|
64
65
|
@records.instance_variable_set(:@records, @records)
|
65
66
|
|
66
67
|
instance = DummyClassForActiveRecord.new
|
67
|
-
instance.expects(:klass).returns(stub('class', where: @records)).at_least_once
|
68
|
+
instance.expects(:klass).returns(stub('class', primary_key: :some_key, where: @records)).at_least_once
|
68
69
|
instance.records.expects(:order).returns(@records)
|
69
70
|
|
70
71
|
assert_equal [2, 1], instance.records. to_a.map(&:id)
|
data/test/unit/importing_test.rb
CHANGED
@@ -91,7 +91,33 @@ class Elasticsearch::Model::ImportingTest < Test::Unit::TestCase
|
|
91
91
|
assert_equal true, options[:force]
|
92
92
|
end
|
93
93
|
|
94
|
+
DummyImportingModel.expects(:index_name).returns('foo')
|
95
|
+
DummyImportingModel.expects(:document_type).returns('foo')
|
96
|
+
|
94
97
|
DummyImportingModel.import force: true, foo: 'bar'
|
95
98
|
end
|
99
|
+
|
100
|
+
should "allow passing a different index / type" do
|
101
|
+
Elasticsearch::Model::Adapter.expects(:from_class)
|
102
|
+
.with(DummyImportingModel)
|
103
|
+
.returns(DummyImportingAdapter)
|
104
|
+
|
105
|
+
DummyImportingModel.__send__ :include, Elasticsearch::Model::Importing
|
106
|
+
|
107
|
+
client = mock('client')
|
108
|
+
|
109
|
+
client
|
110
|
+
.expects(:bulk)
|
111
|
+
.with do |options|
|
112
|
+
assert_equal 'my-new-index', options[:index]
|
113
|
+
assert_equal 'my-other-type', options[:type]
|
114
|
+
true
|
115
|
+
end
|
116
|
+
.returns({'items' => [ {'index' => {} }]})
|
117
|
+
|
118
|
+
DummyImportingModel.stubs(:client).returns(client)
|
119
|
+
|
120
|
+
DummyImportingModel.import index: 'my-new-index', type: 'my-other-type'
|
121
|
+
end
|
96
122
|
end
|
97
123
|
end
|
data/test/unit/indexing_test.rb
CHANGED
@@ -358,6 +358,43 @@ class Elasticsearch::Model::IndexingTest < Test::Unit::TestCase
|
|
358
358
|
DummyIndexingModelForRecreate.refresh_index!
|
359
359
|
end
|
360
360
|
end
|
361
|
+
|
362
|
+
context "with a custom index name" do
|
363
|
+
setup do
|
364
|
+
@client = stub('client')
|
365
|
+
@indices = stub('indices')
|
366
|
+
@client.stubs(:indices).returns(@indices)
|
367
|
+
DummyIndexingModelForRecreate.expects(:client).returns(@client).at_least_once
|
368
|
+
end
|
369
|
+
|
370
|
+
should "create the custom index" do
|
371
|
+
@indices.expects(:exists).with do |arguments|
|
372
|
+
assert_equal 'custom-foo', arguments[:index]
|
373
|
+
end
|
374
|
+
|
375
|
+
@indices.expects(:create).with do |arguments|
|
376
|
+
assert_equal 'custom-foo', arguments[:index]
|
377
|
+
end
|
378
|
+
|
379
|
+
DummyIndexingModelForRecreate.create_index! index: 'custom-foo'
|
380
|
+
end
|
381
|
+
|
382
|
+
should "delete the custom index" do
|
383
|
+
@indices.expects(:delete).with do |arguments|
|
384
|
+
assert_equal 'custom-foo', arguments[:index]
|
385
|
+
end
|
386
|
+
|
387
|
+
DummyIndexingModelForRecreate.delete_index! index: 'custom-foo'
|
388
|
+
end
|
389
|
+
|
390
|
+
should "refresh the custom index" do
|
391
|
+
@indices.expects(:refresh).with do |arguments|
|
392
|
+
assert_equal 'custom-foo', arguments[:index]
|
393
|
+
end
|
394
|
+
|
395
|
+
DummyIndexingModelForRecreate.refresh_index! index: 'custom-foo'
|
396
|
+
end
|
397
|
+
end
|
361
398
|
end
|
362
399
|
|
363
400
|
end
|
@@ -20,7 +20,7 @@ class Elasticsearch::Model::RecordsTest < Test::Unit::TestCase
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
-
RESPONSE = { 'hits' => { 'total' => 123, 'max_score' => 456, 'hits' => [{'foo' => 'bar'}] } }
|
23
|
+
RESPONSE = { 'hits' => { 'total' => 123, 'max_score' => 456, 'hits' => [{'_id' => '1', 'foo' => 'bar'}] } }
|
24
24
|
RESULTS = Elasticsearch::Model::Response::Results.new DummyModel, RESPONSE
|
25
25
|
|
26
26
|
setup do
|
@@ -28,7 +28,7 @@ class Elasticsearch::Model::RecordsTest < Test::Unit::TestCase
|
|
28
28
|
search.stubs(:execute!).returns RESPONSE
|
29
29
|
|
30
30
|
response = Elasticsearch::Model::Response::Response.new DummyModel, search
|
31
|
-
@records = Elasticsearch::Model::Response::Records.new
|
31
|
+
@records = Elasticsearch::Model::Response::Records.new DummyModel, response
|
32
32
|
end
|
33
33
|
|
34
34
|
should "access the records" do
|
@@ -58,6 +58,10 @@ class Elasticsearch::Model::RecordsTest < Test::Unit::TestCase
|
|
58
58
|
assert_equal ['FOO---bar'], @records.map_with_hit { |record, hit| "#{record}---#{hit.foo}" }
|
59
59
|
end
|
60
60
|
|
61
|
+
should "return the IDs" do
|
62
|
+
assert_equal ['1'], @records.ids
|
63
|
+
end
|
64
|
+
|
61
65
|
context "with adapter" do
|
62
66
|
module DummyAdapter
|
63
67
|
module RecordsMixin
|
data/test/unit/searching_test.rb
CHANGED
@@ -23,10 +23,11 @@ class Elasticsearch::Model::SearchingTest < Test::Unit::TestCase
|
|
23
23
|
.expects(:new).with do |klass, query, options|
|
24
24
|
assert_equal DummySearchingModel, klass
|
25
25
|
assert_equal 'foo', query
|
26
|
+
assert_equal({default_operator: 'AND'}, options)
|
26
27
|
end
|
27
28
|
.returns( stub('search') )
|
28
29
|
|
29
|
-
DummySearchingModel.search 'foo'
|
30
|
+
DummySearchingModel.search 'foo', default_operator: 'AND'
|
30
31
|
end
|
31
32
|
|
32
33
|
should "not execute the search" do
|
metadata
CHANGED
@@ -1,22 +1,22 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: elasticsearch-model
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.0
|
5
|
-
prerelease:
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Karel Minarik
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-03-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: elasticsearch
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
|
-
- -
|
19
|
+
- - ! '>'
|
20
20
|
- !ruby/object:Gem::Version
|
21
21
|
version: '0.4'
|
22
22
|
type: :runtime
|
@@ -24,9 +24,25 @@ dependencies:
|
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
none: false
|
26
26
|
requirements:
|
27
|
-
- -
|
27
|
+
- - ! '>'
|
28
28
|
- !ruby/object:Gem::Version
|
29
29
|
version: '0.4'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: activesupport
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>'
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '3'
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>'
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '3'
|
30
46
|
- !ruby/object:Gem::Dependency
|
31
47
|
name: hashie
|
32
48
|
requirement: !ruby/object:Gem::Requirement
|
@@ -107,22 +123,6 @@ dependencies:
|
|
107
123
|
- - ! '>='
|
108
124
|
- !ruby/object:Gem::Version
|
109
125
|
version: '0'
|
110
|
-
- !ruby/object:Gem::Dependency
|
111
|
-
name: activesupport
|
112
|
-
requirement: !ruby/object:Gem::Requirement
|
113
|
-
none: false
|
114
|
-
requirements:
|
115
|
-
- - ! '>'
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
version: '3.0'
|
118
|
-
type: :development
|
119
|
-
prerelease: false
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
none: false
|
122
|
-
requirements:
|
123
|
-
- - ! '>'
|
124
|
-
- !ruby/object:Gem::Version
|
125
|
-
version: '3.0'
|
126
126
|
- !ruby/object:Gem::Dependency
|
127
127
|
name: activemodel
|
128
128
|
requirement: !ruby/object:Gem::Requirement
|
@@ -385,8 +385,8 @@ files:
|
|
385
385
|
- examples/mongoid_article.rb
|
386
386
|
- examples/ohm_article.rb
|
387
387
|
- examples/riak_article.rb
|
388
|
-
- gemfiles/3.gemfile
|
389
|
-
- gemfiles/4.gemfile
|
388
|
+
- gemfiles/3.0.gemfile
|
389
|
+
- gemfiles/4.0.gemfile
|
390
390
|
- lib/elasticsearch/model.rb
|
391
391
|
- lib/elasticsearch/model/adapter.rb
|
392
392
|
- lib/elasticsearch/model/adapters/active_record.rb
|
@@ -394,6 +394,7 @@ files:
|
|
394
394
|
- lib/elasticsearch/model/adapters/mongoid.rb
|
395
395
|
- lib/elasticsearch/model/callbacks.rb
|
396
396
|
- lib/elasticsearch/model/client.rb
|
397
|
+
- lib/elasticsearch/model/ext/active_record.rb
|
397
398
|
- lib/elasticsearch/model/importing.rb
|
398
399
|
- lib/elasticsearch/model/indexing.rb
|
399
400
|
- lib/elasticsearch/model/naming.rb
|
@@ -406,7 +407,6 @@ files:
|
|
406
407
|
- lib/elasticsearch/model/response/results.rb
|
407
408
|
- lib/elasticsearch/model/searching.rb
|
408
409
|
- lib/elasticsearch/model/serializing.rb
|
409
|
-
- lib/elasticsearch/model/support/forwardable.rb
|
410
410
|
- lib/elasticsearch/model/version.rb
|
411
411
|
- test/integration/active_record_associations_parent_child.rb
|
412
412
|
- test/integration/active_record_associations_test.rb
|
@@ -453,9 +453,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
453
453
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
454
454
|
none: false
|
455
455
|
requirements:
|
456
|
-
- - ! '
|
456
|
+
- - ! '>='
|
457
457
|
- !ruby/object:Gem::Version
|
458
|
-
version:
|
458
|
+
version: '0'
|
459
459
|
requirements: []
|
460
460
|
rubyforge_project:
|
461
461
|
rubygems_version: 1.8.23
|
data/gemfiles/3.gemfile
DELETED
@@ -1,11 +0,0 @@
|
|
1
|
-
# Usage:
|
2
|
-
#
|
3
|
-
# $ BUNDLE_GEMFILE=./gemfiles/3.gemfile bundle install
|
4
|
-
# $ BUNDLE_GEMFILE=./gemfiles/3.gemfile bundle exec rake test:integration
|
5
|
-
|
6
|
-
source 'https://rubygems.org'
|
7
|
-
|
8
|
-
gem 'activerecord', '~> 3.2'
|
9
|
-
gem 'mongoid', '>= 3.0'
|
10
|
-
|
11
|
-
gemspec path: '../'
|
data/gemfiles/4.gemfile
DELETED
@@ -1,11 +0,0 @@
|
|
1
|
-
# Usage:
|
2
|
-
#
|
3
|
-
# $ BUNDLE_GEMFILE=./gemfiles/4.gemfile bundle install
|
4
|
-
# $ BUNDLE_GEMFILE=./gemfiles/4.gemfile bundle exec rake test:integration
|
5
|
-
|
6
|
-
source 'https://rubygems.org'
|
7
|
-
|
8
|
-
gem 'activerecord', '~> 4'
|
9
|
-
gem 'mongoid', '~> 4.0.0.alpha1'
|
10
|
-
|
11
|
-
gemspec path: '../'
|
@@ -1,44 +0,0 @@
|
|
1
|
-
module Elasticsearch
|
2
|
-
module Model
|
3
|
-
module Support
|
4
|
-
|
5
|
-
# Lightweight wrapper around "forwardable.rb" interface,
|
6
|
-
# to allow easy implementation changes in the future.
|
7
|
-
#
|
8
|
-
# Cf. https://github.com/mongoid/origin/blob/master/lib/origin/forwardable.rb
|
9
|
-
#
|
10
|
-
module Forwardable
|
11
|
-
def self.extended(base)
|
12
|
-
base.__send__ :extend, ::Forwardable
|
13
|
-
base.__send__ :extend, ::SingleForwardable
|
14
|
-
end
|
15
|
-
|
16
|
-
# Forwards specific method(s) to the provided receiver
|
17
|
-
#
|
18
|
-
# @example Forward the `each` method to `results` object
|
19
|
-
#
|
20
|
-
# MyClass.forward(:results, :each)
|
21
|
-
#
|
22
|
-
# @example Forward the `include?` method to `ancestors` class method
|
23
|
-
#
|
24
|
-
# MyClass.forward(:'self.ancestors', :include?)
|
25
|
-
#
|
26
|
-
# @param [ Symbol ] receiver The name of the receiver method
|
27
|
-
# @param [ Symbol, Array ] methods The forwarded methods
|
28
|
-
#
|
29
|
-
# @api private
|
30
|
-
#
|
31
|
-
def forward(receiver, *methods)
|
32
|
-
methods = Array(methods).flatten
|
33
|
-
target = self.__send__ :eval, receiver.to_s rescue nil
|
34
|
-
|
35
|
-
if target
|
36
|
-
single_delegate methods => receiver
|
37
|
-
else
|
38
|
-
instance_delegate methods => receiver
|
39
|
-
end
|
40
|
-
end; module_function :forward
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|