elastic-rails 0.8.7 → 1.0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fe32a7a77a7e053e18632c534e4c21b85e97c458
4
- data.tar.gz: 93f9a804abe3d625fa78d5cfad063d2de7b3f381
3
+ metadata.gz: 415d01e7f57e3202b889d41df8942d3fe5347173
4
+ data.tar.gz: 96661427d521dc54ae86178cf20529099e900c32
5
5
  SHA512:
6
- metadata.gz: ecf4e97ae1a82ebad07987ac54a717cc1127186786154e85d71dcdae89e341e4e360679c044cc62b9ab44c6406d33421c9878f05f02a47ebadfaf28260b91276
7
- data.tar.gz: aca7470236c934518ff8187766c3d3b457bbd122a8a7d2f839e2a8f29560cb403783bc7013c38dbc5057043a59539f39cf52c931e2f0ecd71611352622a48b06
6
+ metadata.gz: ac05b2d5170f2e112d0b90c3e80cbb44730f1983f69e9d344140ea13e6127501ad926809c38ec1747f7caf8dc8972d6d5ba42596333c77c083ea4681193e998d
7
+ data.tar.gz: 776bdcb23a31e9694538104d7572b72ca810467402500f3b4a3e9e8d3224364836fce0c106f05af0f9b67982f403a92409d5576658658783a671daeb3d1ef32c
data/.env ADDED
@@ -0,0 +1,2 @@
1
+ ELASTICSEARCH_HOST=127.0.0.1
2
+ ELASTICSEARCH_PORT=$(make services-port SERVICE=elasticsearch PORT=9200)
data/.travis.yml CHANGED
@@ -1,8 +1,22 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.4.0
4
- - 2.3.3
5
- - 2.2.6
3
+ - 2.6.2
4
+ - 2.5.3
5
+ - 2.4.1
6
+ - 2.3.7
6
7
  services:
7
- - elasticsearch
8
- before_install: gem install bundler -v 1.12.5
8
+ - docker
9
+ before_install:
10
+ - gem update bundler
11
+ - docker -v
12
+ - make services-up
13
+ - sleep 10
14
+ deploy:
15
+ provider: rubygems
16
+ api_key:
17
+ secure: Ucdb3YW5+gBFBxhZylqacER9xdu/oP4lmu6JqiWIL95IdNwQEyh45llBmRxYnsyb1WdaFlu35EbkgFZyerfWBtSKl5xjxkEJH7xRjfA/Ait19YGd9jdrVGSPXMZodf8+Q4GQe47Q934AsR/YLZ/g6cDUsEwhsYVoCmVWR5SICCdaTI98K2Pt4/W2CEcucSNzb4tWptj7noreCTQL4iLodTC7x4MMk2wscNFCKZUW5J2HCB8eds6pK7hYTt5wjo+ARJdkFvYlanJ7bOBFGLGps3UP4Rj5K3h2hM+7nGwt4yddDLYMaBwfwjpfo4f4ayX7pnMvwfn3WCfD9f4ps430WbSqPOvuHLAxcO7th6EOoLmS0/5RDFL+Gk96WHgr51A5RdPUoN3O1Qa4sl6nsPCJmC64mR7Mm62ZYeYCvUXgf7cZYzX7/dLIK2u0pkRQa3axkZgR+COcmAImZL8ffSNxOFRpQPPBNWoEZhlOTXwKmkSJjfiWYvCUGRmx3DFM1Tra88ctWkLh3B77wcDFBtUZEmA8KYS+ies8ctQyndHtzU1oJ2gxOD3Ye64fWRprZl+ApeFNTgBlu+kMe/vs8i504ERBur421iOqbnfP3IDqIuizC5zkSXG2JEAT1rvLtuf2tBuTbB6h/jYZtFssboXENlw++ZopIO5ZAbFaXMxBPPc=
18
+ gem: elastic-rails
19
+ on:
20
+ tags: true
21
+ repo: platanus/elastic-rails
22
+ branch: master
data/Makefile ADDED
@@ -0,0 +1,38 @@
1
+ PROJECT ?= elastic-rails
2
+ DOCKER_COMPOSE_FILE ?= docker-compose.services.yml
3
+ DOCKER_COMPOSE_ARGS ?= -p $(PROJECT) -f $(DOCKER_COMPOSE_FILE)
4
+ SHELL := /bin/bash
5
+
6
+ run: help
7
+
8
+ BOLD ?= $(shell tput bold)
9
+ NORMAL ?= $(shell tput sgr0)
10
+
11
+ help:
12
+ @echo Run elasticsearch for development:
13
+ @echo " ${BOLD}make services-up${NORMAL}"
14
+ @echo ""
15
+ @echo "Reset the environment:"
16
+ @echo " ${BOLD}make services-destroy${NORMAL}"
17
+ @echo ""
18
+
19
+ services: services-up
20
+
21
+ services-ps:
22
+ docker-compose $(DOCKER_COMPOSE_ARGS) ps
23
+
24
+ services-up:
25
+ docker-compose $(DOCKER_COMPOSE_ARGS) up -d
26
+
27
+ services-stop:
28
+ docker-compose $(DOCKER_COMPOSE_ARGS) stop
29
+
30
+ services-destroy:
31
+ docker-compose $(DOCKER_COMPOSE_ARGS) down --volumes
32
+
33
+ services-logs:
34
+ docker-compose $(DOCKER_COMPOSE_ARGS) logs -f
35
+
36
+ services-port:
37
+ @set -o pipefail; \
38
+ docker-compose $(DOCKER_COMPOSE_ARGS) port ${SERVICE} ${PORT} 2> /dev/null | cut -d':' -f2 || echo ${PORT}
@@ -0,0 +1,16 @@
1
+ version: '3'
2
+
3
+ services:
4
+ elasticsearch:
5
+ image: elasticsearch:6.7.0
6
+ ports:
7
+ - 9200
8
+ volumes:
9
+ - elasticsearch_data:/usr/share/elasticsearch/data
10
+ environment:
11
+ - discovery.type=single-node
12
+ - bootstrap.memory_lock=true
13
+ - "ES_JAVA_OPTS=-Xms1024m -Xmx1024m"
14
+
15
+ volumes:
16
+ elasticsearch_data:
data/elastic.gemspec CHANGED
@@ -19,18 +19,17 @@ Gem::Specification.new do |spec|
19
19
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
20
  spec.require_paths = ["lib"]
21
21
 
22
- spec.add_dependency "elasticsearch", "~> 1.0", ">= 1.0.18"
22
+ spec.add_dependency "elasticsearch", "~> 6.3.1"
23
23
  spec.add_dependency "activesupport"
24
24
 
25
- spec.add_development_dependency "bundler", "~> 1.6"
25
+ spec.add_development_dependency "dotenv"
26
+ spec.add_development_dependency "bundler", "~> 2.0"
26
27
  spec.add_development_dependency "rake", "~> 10.4"
27
28
  spec.add_development_dependency "rspec", "~> 3.1"
28
29
  spec.add_development_dependency "rspec-nc", "~> 0.2"
29
30
  spec.add_development_dependency "guard", "~> 2.11"
30
31
  spec.add_development_dependency "guard-rspec", "~> 4.5"
31
32
  spec.add_development_dependency "terminal-notifier-guard", "~> 1.6", ">= 1.6.1"
32
- spec.add_development_dependency "pry", "~> 0.10"
33
- spec.add_development_dependency "pry-remote", "~> 0.1"
34
- spec.add_development_dependency "pry-byebug", "~> 3.2"
35
- spec.add_development_dependency "pry-nav", "~> 0.2"
33
+ spec.add_development_dependency "pry", "~> 0.12.2"
34
+ spec.add_development_dependency "pry-nav", "~> 0.3.0"
36
35
  end
@@ -1,8 +1,8 @@
1
1
  module Elastic::Commands
2
2
  class CompareMappings < Elastic::Support::Command.new(:current, :user)
3
3
  def perform
4
- user_properties.select do |field, property|
5
- !compare_field_properties(current_properties[field], property)
4
+ user_properties.reject do |field, property|
5
+ compare_field_properties(current_properties[field], property)
6
6
  end.map { |f| f[0] }
7
7
  end
8
8
 
@@ -4,23 +4,15 @@ module Elastic::Commands
4
4
  )
5
5
  def perform
6
6
  if collection.present?
7
- import_collection
7
+ target.collect_from(collection, middleware_options) { |obj| queue obj }
8
8
  else
9
- targets.each { |target| import_target(target) }
9
+ target.collect_all(middleware_options) { |obj| queue obj }
10
10
  end
11
11
  flush
12
12
  end
13
13
 
14
14
  private
15
15
 
16
- def import_collection
17
- main_target.collect_from(collection, middleware_options) { |obj| queue obj }
18
- end
19
-
20
- def import_target(_target)
21
- _target.collect_all(middleware_options) { |obj| queue obj }
22
- end
23
-
24
16
  def cache
25
17
  @cache ||= []
26
18
  end
@@ -48,12 +40,8 @@ module Elastic::Commands
48
40
  index.new(_object).as_elastic_document
49
41
  end
50
42
 
51
- def main_target
52
- index.definition.main_target
53
- end
54
-
55
- def targets
56
- index.definition.targets
43
+ def target
44
+ index.definition.target
57
45
  end
58
46
 
59
47
  def middleware_options
@@ -6,10 +6,6 @@ module Elastic::Core
6
6
  @target = _target
7
7
  end
8
8
 
9
- def type_name
10
- @target.to_s
11
- end
12
-
13
9
  def mode
14
10
  not_supported :mode
15
11
  end
@@ -1,8 +1,9 @@
1
1
  module Elastic::Core
2
2
  class Connector
3
- def initialize(_name, _types, _mapping, settling_time: 10.seconds)
3
+ DEFAULT_TYPE = '_doc'
4
+
5
+ def initialize(_name, _mapping, settling_time: 10.seconds)
4
6
  @name = _name
5
- @types = _types
6
7
  @mapping = _mapping
7
8
  @settling_time = settling_time
8
9
  end
@@ -17,6 +18,7 @@ module Elastic::Core
17
18
  actual_name = resolve_actual_index_name
18
19
  return :not_available if actual_name.nil?
19
20
  return :not_synchronized unless mapping_synchronized? actual_name
21
+
20
22
  :ready
21
23
  end
22
24
 
@@ -31,7 +33,7 @@ module Elastic::Core
31
33
  create_from_scratch
32
34
  when :not_synchronized
33
35
  begin
34
- setup_index_types resolve_actual_index_name
36
+ setup_index_mapping resolve_actual_index_name
35
37
  rescue Elasticsearch::Transport::Transport::Errors::BadRequest
36
38
  return false
37
39
  end
@@ -46,7 +48,6 @@ module Elastic::Core
46
48
  copy_to new_index, batch_size: batch_size
47
49
  end
48
50
  end
49
-
50
51
  nil
51
52
  end
52
53
 
@@ -55,7 +56,7 @@ module Elastic::Core
55
56
 
56
57
  # TODO: validate document type
57
58
  operations = write_indices.map do |write_index|
58
- { 'index' => _document.merge('_index' => write_index) }
59
+ { 'index' => _document.merge('_index' => write_index, '_type' => DEFAULT_TYPE) }
59
60
  end
60
61
 
61
62
  api.bulk(body: operations)
@@ -65,7 +66,7 @@ module Elastic::Core
65
66
  return if Elastic.config.disable_indexing
66
67
 
67
68
  # TODO: validate documents type
68
- body = _documents.map { |doc| { 'index' => doc } }
69
+ body = _documents.map { |doc| { 'index' => doc.merge('_type' => DEFAULT_TYPE) } }
69
70
 
70
71
  write_indices.each do |write_index|
71
72
  retry_on_temporary_error('bulk indexing') do
@@ -76,20 +77,18 @@ module Elastic::Core
76
77
 
77
78
  def delete(_document)
78
79
  raise ArgumentError, 'document must provide an id' unless _document['_id']
79
- raise ArgumentError, 'document must provide a type' unless _document['_type']
80
80
 
81
81
  return if Elastic.config.disable_indexing
82
82
 
83
83
  write_index, rolling_index = write_indices
84
84
 
85
- operations = [{ 'delete' => _document.merge('_index' => write_index) }]
85
+ operations = [{
86
+ 'delete' => _document.merge('_index' => write_index, '_type' => DEFAULT_TYPE)
87
+ }]
86
88
 
87
89
  if rolling_index
88
90
  operations << {
89
- 'index' => _document.merge(
90
- '_index' => rolling_index,
91
- 'data' => { '_mark_for_deletion' => true }
92
- )
91
+ 'delete' => _document.merge('_index' => rolling_index, '_type' => DEFAULT_TYPE)
93
92
  }
94
93
  end
95
94
 
@@ -100,16 +99,16 @@ module Elastic::Core
100
99
  api.indices.refresh index: index_name
101
100
  end
102
101
 
103
- def find(_type, _id)
104
- api.get(index: index_name, type: _type, id: _id)
102
+ def find(_id)
103
+ api.get(index: index_name, id: _id)
105
104
  end
106
105
 
107
- def count(query: nil, type: nil)
108
- api.count(index: index_name, type: type, body: query)['count']
106
+ def count(query: nil)
107
+ api.count(index: index_name, body: query)['count']
109
108
  end
110
109
 
111
- def query(query: nil, type: nil)
112
- api.search(index: index_name, type: type, body: query)
110
+ def query(query: nil)
111
+ api.search(index: index_name, body: query)
113
112
  end
114
113
 
115
114
  def rollover(&_block) # rubocop:disable Metrics/MethodLength
@@ -125,12 +124,11 @@ module Elastic::Core
125
124
  transfer_alias(write_index_alias, to: new_index)
126
125
  wait_for_index_to_stabilize
127
126
  perform_optimized_write_on(new_index, &_block)
128
- delete_marked_for_deletion new_index
129
127
  transfer_alias(index_name, from: actual_index, to: new_index)
130
128
  transfer_alias(write_index_alias, from: actual_index)
131
129
  wait_for_index_to_stabilize
132
130
  api.indices.delete index: actual_index
133
- rescue
131
+ rescue StandardError
134
132
  api.indices.delete index: new_index
135
133
  raise
136
134
  end
@@ -170,7 +168,8 @@ module Elastic::Core
170
168
  private
171
169
 
172
170
  def wait_for_index_to_stabilize
173
- return if @settling_time == 0
171
+ return if @settling_time.zero?
172
+
174
173
  Elastic.logger.info "Waiting #{@settling_time * 1.2}s for write indices to catch up ..."
175
174
  sleep(@settling_time * 1.2)
176
175
  end
@@ -212,10 +211,6 @@ module Elastic::Core
212
211
  end
213
212
  end
214
213
 
215
- def delete_marked_for_deletion(_index)
216
- api.delete_by_query(index: _index, body: { query: { term: { _mark_for_deletion: true } } })
217
- end
218
-
219
214
  def write_indices_expired?
220
215
  @write_indices_expiration && @write_indices_expiration < Time.current
221
216
  end
@@ -231,7 +226,7 @@ module Elastic::Core
231
226
  new_name = "#{index_name}:#{Time.now.to_i}"
232
227
  api.indices.create index: new_name
233
228
  api.cluster.health wait_for_status: 'yellow'
234
- setup_index_types new_name
229
+ setup_index_mapping new_name
235
230
  new_name
236
231
  end
237
232
 
@@ -248,25 +243,20 @@ module Elastic::Core
248
243
  end
249
244
 
250
245
  def mapping_synchronized?(_index)
251
- type_mappings = api.indices.get_mapping(index: _index)
246
+ type_mappings = api.indices.get_mapping(index: _index, include_type_name: false)
252
247
  return false if type_mappings[_index].nil?
253
- type_mappings = type_mappings[_index]['mappings']
248
+ return false if type_mappings[_index]['mappings'].empty?
254
249
 
255
- @types.all? do |type|
256
- next false if type_mappings[type].nil?
250
+ diff = Elastic::Commands::CompareMappings.for(
251
+ current: type_mappings[_index]['mappings'],
252
+ user: @mapping
253
+ )
257
254
 
258
- diff = Elastic::Commands::CompareMappings.for(
259
- current: type_mappings[type],
260
- user: @mapping
261
- )
262
- diff.empty?
263
- end
255
+ diff.empty?
264
256
  end
265
257
 
266
- def setup_index_types(_index)
267
- @types.each do |type|
268
- api.indices.put_mapping(index: _index, type: type, body: @mapping)
269
- end
258
+ def setup_index_mapping(_index)
259
+ api.indices.put_mapping(index: _index, type: DEFAULT_TYPE, body: @mapping)
270
260
  end
271
261
 
272
262
  def transfer_alias(_alias, from: nil, to: nil)
@@ -284,7 +274,7 @@ module Elastic::Core
284
274
  {
285
275
  'create' => {
286
276
  '_id' => _hit['_id'],
287
- '_type' => _hit['_type'],
277
+ '_type' => DEFAULT_TYPE,
288
278
  'data' => _hit['_source']
289
279
  }
290
280
  }
@@ -295,7 +285,7 @@ module Elastic::Core
295
285
  end
296
286
 
297
287
  def retry_on_temporary_error(_action, retries: 3)
298
- return yield
288
+ yield
299
289
  rescue Elasticsearch::Transport::Transport::Errors::ServiceUnavailable,
300
290
  Elasticsearch::Transport::Transport::Errors::GatewayTimeout => exc
301
291
  raise if retries <= 0
@@ -2,29 +2,22 @@ module Elastic::Core
2
2
  class Definition
3
3
  attr_reader :middleware_options
4
4
 
5
- def main_target
6
- targets.first
7
- end
5
+ def target
6
+ raise 'attempting to access target before definition has been frozen' if @target_cache.nil?
8
7
 
9
- def targets
10
- raise 'attempting to access targets before definition has been frozen' if @target_cache.nil?
11
8
  @target_cache
12
9
  end
13
10
 
14
- def targets=(_values)
15
- @targets = _values
16
- end
17
-
18
- def types
19
- targets.map(&:type_name)
11
+ def target=(_value)
12
+ @target = _value
20
13
  end
21
14
 
22
15
  def mode
23
- main_target.mode
16
+ target.mode
24
17
  end
25
18
 
26
19
  def initialize
27
- @targets = []
20
+ @target = nil
28
21
  @field_map = {}
29
22
  @field_cache = {}
30
23
  @middleware_options = HashWithIndifferentAccess.new
@@ -40,7 +33,8 @@ module Elastic::Core
40
33
 
41
34
  def freeze
42
35
  return if frozen?
43
- cache_targets
36
+
37
+ cache_target
44
38
  complete_and_validate_fields
45
39
  freeze_fields
46
40
  @middleware_options.freeze
@@ -81,26 +75,19 @@ module Elastic::Core
81
75
  else
82
76
  parent = @field_map[_name[0...separator]]
83
77
  return nil if parent.nil?
78
+
84
79
  parent.get_field(_name[separator + 1..-1])
85
80
  end
86
81
  end
87
82
 
88
- def cache_targets
89
- @target_cache = load_targets.freeze
90
- end
91
-
92
- def load_targets
93
- mode = nil
94
- @targets.map do |target|
95
- target = target.to_s.camelize.constantize if target.is_a?(Symbol) || target.is_a?(String)
83
+ def cache_target
84
+ target = @target
85
+ target = target.to_s.camelize.constantize if @target.is_a?(Symbol) || @target.is_a?(String)
86
+ target = load_target_middleware(target) unless target.class < BaseMiddleware
96
87
 
97
- target = load_target_middleware(target) unless target.class < BaseMiddleware
98
- raise 'index target is not indexable' if target.nil?
99
- raise 'mistmatching indexable mode' if mode && mode != target.mode
100
- mode = target.mode
88
+ raise 'index target is not indexable' if target.nil?
101
89
 
102
- target
103
- end
90
+ @target_cache = target
104
91
  end
105
92
 
106
93
  def complete_and_validate_fields
@@ -127,7 +114,7 @@ module Elastic::Core
127
114
  end
128
115
 
129
116
  def infer_mapping_options(_name)
130
- main_target.field_options_for(_name, middleware_options)
117
+ target.field_options_for(_name, middleware_options)
131
118
  end
132
119
  end
133
120
  end
@@ -17,7 +17,7 @@ module Elastic::Core
17
17
  end
18
18
 
19
19
  def as_elastic_document(only_meta: false)
20
- result = { '_type' => object.class.to_s }
20
+ result = {}
21
21
  result['_id'] = read_attribute_for_indexing(:id) if has_attribute_for_indexing?(:id)
22
22
  result['data'] = as_elastic_source unless only_meta
23
23
  result
@@ -52,7 +52,7 @@ module Elastic::Datatypes
52
52
  end
53
53
 
54
54
  def terms_aggregation_defaults
55
- { size: 0 }
55
+ { size: 10000 } # amount of groups to return by default
56
56
  end
57
57
 
58
58
  def date_histogram_aggregation_defaults
@@ -1,5 +1,11 @@
1
1
  module Elastic::Datatypes
2
2
  class String < Default
3
+ def mapping_options
4
+ options = super
5
+ options[:type] = 'text'
6
+ options
7
+ end
8
+
3
9
  def supported_queries
4
10
  [:match, :term, :range]
5
11
  end
@@ -2,8 +2,7 @@ module Elastic::Datatypes
2
2
  class Term < Default
3
3
  def mapping_options
4
4
  options = super
5
- options[:type] = 'string'
6
- options[:index] = 'not_analyzed'
5
+ options[:type] = 'keyword'
7
6
  options
8
7
  end
9
8
  end
@@ -84,9 +84,9 @@ module Elastic::Fields
84
84
  def load_registered_datatype(_name)
85
85
  # TODO: replace this with a datatype registry
86
86
  case _name
87
- when :term
87
+ when :term, :keyword
88
88
  Elastic::Datatypes::Term
89
- when :string
89
+ when :string, :text
90
90
  Elastic::Datatypes::String
91
91
  when :date
92
92
  Elastic::Datatypes::Date
@@ -27,7 +27,6 @@ module Elastic::Nodes::Concerns
27
27
  def prepare_hits(_hits, _formatter)
28
28
  _hits.map do |raw_hit|
29
29
  Elastic::Results::Hit.new(
30
- raw_hit['_type'],
31
30
  raw_hit['_id'],
32
31
  raw_hit['_score'],
33
32
  raw_hit['_source'] ? _formatter.format(raw_hit['_source']) : nil
@@ -29,9 +29,10 @@ module Elastic::Nodes
29
29
 
30
30
  def render(_options = {})
31
31
  hash = { 'query' => @query }
32
- hash['type'] = @mode.to_s unless @mode.nil? || @mode == :boolean
33
32
 
34
- { "match" => { render_field(_options) => render_boost(hash) } }
33
+ match_mode = @mode.nil? || @mode == :boolean ? 'match' : "match_#{@mode}"
34
+
35
+ { match_mode => { render_field(_options) => render_boost(hash) } }
35
36
  end
36
37
 
37
38
  private
data/lib/elastic/query.rb CHANGED
@@ -35,7 +35,7 @@ module Elastic
35
35
  end
36
36
  end
37
37
 
38
- def ids(_type = nil)
38
+ def ids
39
39
  execute assembler.assemble_ids
40
40
  end
41
41
 
@@ -87,11 +87,7 @@ module Elastic
87
87
  end
88
88
 
89
89
  def execute(_query)
90
- raw = @index.connector.query(
91
- type: @index.definition.types,
92
- query: _query.render
93
- )
94
-
90
+ raw = @index.connector.query(query: _query.render)
95
91
  _query.handle_result(raw, formatter)
96
92
  end
97
93
 
@@ -38,8 +38,8 @@ module Elastic::Railties
38
38
  # rubocop:disable Metrics/CyclomaticComplexity
39
39
  def ar_type_to_options(_type)
40
40
  case _type.try(:to_sym)
41
- when :text then { type: :string }
42
- when :string then { type: :string, index: 'not_analyzed' }
41
+ when :text then { type: :text }
42
+ when :string then { type: :keyword }
43
43
  when :integer then { type: :long } # not sure..
44
44
  when :float, :decimal then { type: :double } # not sure..
45
45
  when :date then { type: :date }
@@ -1,10 +1,9 @@
1
1
  module Elastic::Results
2
2
  class Hit < Base
3
- attr_reader :type, :id, :score, :source
3
+ attr_reader :id, :score, :source
4
4
  attr_accessor :data
5
5
 
6
- def initialize(_type, _id, _score, _source)
7
- @type = _type
6
+ def initialize(_id, _score, _source)
8
7
  @id = _id
9
8
  @score = _score
10
9
  @source = _source
@@ -26,21 +26,15 @@ module Elastic::Shims
26
26
  end
27
27
 
28
28
  def populate(_result)
29
- groups = _result.pick(Elastic::Results::Hit).group_by(&:type)
30
- groups.each { |t, h| populate_group(t, h) }
31
- end
32
-
33
- def populate_group(_type_name, _hits)
34
- target = resolve_target(_type_name)
35
- raise "Unexpected type name #{_type_name}" if target.nil?
29
+ hits = _result.pick(Elastic::Results::Hit).to_a
36
30
 
37
31
  if populate_by_id?
38
- ids = _hits.map(&:id)
32
+ ids = hits.map(&:id)
39
33
  objects = target.find_by_ids(ids, middleware_options)
40
- objects.each_with_index { |o, i| _hits[i].data = o }
34
+ objects.each_with_index { |o, i| hits[i].data = o }
41
35
  else
42
- _hits.each do |hit|
43
- hit.data = target.build_from_data(hit.source, middleware_options)
36
+ hits.each do |hit|
37
+ hit.data = @index.definition.target.build_from_data(hit.source, middleware_options)
44
38
  end
45
39
  end
46
40
  end
@@ -49,8 +43,8 @@ module Elastic::Shims
49
43
  @index.definition.mode == :index
50
44
  end
51
45
 
52
- def resolve_target(_type_name)
53
- @index.definition.targets.find { |t| t.type_name == _type_name }
46
+ def target
47
+ @index.definition.target
54
48
  end
55
49
 
56
50
  def middleware_options
data/lib/elastic/type.rb CHANGED
@@ -34,7 +34,6 @@ module Elastic
34
34
  @connector ||= begin
35
35
  Elastic::Core::Connector.new(
36
36
  suffix,
37
- definition.types,
38
37
  definition.as_es_mapping
39
38
  ).tap do |conn|
40
39
  if Elastic.config.whiny_indices && conn.status != :ready
@@ -1,16 +1,12 @@
1
1
  module Elastic::Types
2
2
  class BaseType < Elastic::Core::Serializer
3
3
  def self.target=(_name_or_class)
4
- pre_definition.targets = [_name_or_class]
5
- end
6
-
7
- def self.targets=(_names_or_classes)
8
- pre_definition.targets = _names_or_classes
4
+ pre_definition.target = _name_or_class
9
5
  end
10
6
 
11
7
  def self.pre_definition
12
8
  @pre_definition ||= Elastic::Core::Definition.new.tap do |definition|
13
- definition.targets = [default_target] unless default_target.nil?
9
+ definition.target = default_target unless default_target.nil?
14
10
  end
15
11
  end
16
12
 
@@ -1,3 +1,3 @@
1
1
  module Elastic
2
- VERSION = "0.8.7"
2
+ VERSION = "1.0.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: elastic-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.7
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ignacio Baixas
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-05-23 00:00:00.000000000 Z
11
+ date: 2019-05-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: elasticsearch
@@ -16,20 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.0'
20
- - - ">="
21
- - !ruby/object:Gem::Version
22
- version: 1.0.18
19
+ version: 6.3.1
23
20
  type: :runtime
24
21
  prerelease: false
25
22
  version_requirements: !ruby/object:Gem::Requirement
26
23
  requirements:
27
24
  - - "~>"
28
25
  - !ruby/object:Gem::Version
29
- version: '1.0'
30
- - - ">="
31
- - !ruby/object:Gem::Version
32
- version: 1.0.18
26
+ version: 6.3.1
33
27
  - !ruby/object:Gem::Dependency
34
28
  name: activesupport
35
29
  requirement: !ruby/object:Gem::Requirement
@@ -44,20 +38,34 @@ dependencies:
44
38
  - - ">="
45
39
  - !ruby/object:Gem::Version
46
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: dotenv
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
47
55
  - !ruby/object:Gem::Dependency
48
56
  name: bundler
49
57
  requirement: !ruby/object:Gem::Requirement
50
58
  requirements:
51
59
  - - "~>"
52
60
  - !ruby/object:Gem::Version
53
- version: '1.6'
61
+ version: '2.0'
54
62
  type: :development
55
63
  prerelease: false
56
64
  version_requirements: !ruby/object:Gem::Requirement
57
65
  requirements:
58
66
  - - "~>"
59
67
  - !ruby/object:Gem::Version
60
- version: '1.6'
68
+ version: '2.0'
61
69
  - !ruby/object:Gem::Dependency
62
70
  name: rake
63
71
  requirement: !ruby/object:Gem::Requirement
@@ -154,56 +162,28 @@ dependencies:
154
162
  requirements:
155
163
  - - "~>"
156
164
  - !ruby/object:Gem::Version
157
- version: '0.10'
165
+ version: 0.12.2
158
166
  type: :development
159
167
  prerelease: false
160
168
  version_requirements: !ruby/object:Gem::Requirement
161
169
  requirements:
162
170
  - - "~>"
163
171
  - !ruby/object:Gem::Version
164
- version: '0.10'
165
- - !ruby/object:Gem::Dependency
166
- name: pry-remote
167
- requirement: !ruby/object:Gem::Requirement
168
- requirements:
169
- - - "~>"
170
- - !ruby/object:Gem::Version
171
- version: '0.1'
172
- type: :development
173
- prerelease: false
174
- version_requirements: !ruby/object:Gem::Requirement
175
- requirements:
176
- - - "~>"
177
- - !ruby/object:Gem::Version
178
- version: '0.1'
179
- - !ruby/object:Gem::Dependency
180
- name: pry-byebug
181
- requirement: !ruby/object:Gem::Requirement
182
- requirements:
183
- - - "~>"
184
- - !ruby/object:Gem::Version
185
- version: '3.2'
186
- type: :development
187
- prerelease: false
188
- version_requirements: !ruby/object:Gem::Requirement
189
- requirements:
190
- - - "~>"
191
- - !ruby/object:Gem::Version
192
- version: '3.2'
172
+ version: 0.12.2
193
173
  - !ruby/object:Gem::Dependency
194
174
  name: pry-nav
195
175
  requirement: !ruby/object:Gem::Requirement
196
176
  requirements:
197
177
  - - "~>"
198
178
  - !ruby/object:Gem::Version
199
- version: '0.2'
179
+ version: 0.3.0
200
180
  type: :development
201
181
  prerelease: false
202
182
  version_requirements: !ruby/object:Gem::Requirement
203
183
  requirements:
204
184
  - - "~>"
205
185
  - !ruby/object:Gem::Version
206
- version: '0.2'
186
+ version: 0.3.0
207
187
  description: Elasticsearch integration for Ruby on Rails by Platanus
208
188
  email:
209
189
  - ignacio@platan.us
@@ -211,6 +191,7 @@ executables: []
211
191
  extensions: []
212
192
  extra_rdoc_files: []
213
193
  files:
194
+ - ".env"
214
195
  - ".gitignore"
215
196
  - ".rspec"
216
197
  - ".travis.yml"
@@ -218,10 +199,12 @@ files:
218
199
  - Gemfile
219
200
  - Guardfile
220
201
  - LICENSE.txt
202
+ - Makefile
221
203
  - README.md
222
204
  - Rakefile
223
205
  - bin/console
224
206
  - bin/setup
207
+ - docker-compose.services.yml
225
208
  - elastic.gemspec
226
209
  - lib/elastic-rails.rb
227
210
  - lib/elastic.rb
@@ -348,7 +331,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
348
331
  version: '0'
349
332
  requirements: []
350
333
  rubyforge_project:
351
- rubygems_version: 2.6.4
334
+ rubygems_version: 2.6.14.1
352
335
  signing_key:
353
336
  specification_version: 4
354
337
  summary: Elasticsearch integration for Ruby on Rails by Platanus