elastics 0.4.0 → 0.5.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: ca7add0bf62591b992bdcbb03cf08461cf208204
4
- data.tar.gz: 5f2b845c2cf49a89e6f4414dfad2dd505ed56784
3
+ metadata.gz: 4414829781480b6aaf6c1fa14bf0450a0e164906
4
+ data.tar.gz: c63d19ed109fae4244b4c9427814c4ffa1f10de6
5
5
  SHA512:
6
- metadata.gz: da3920ea1f157297b6c3e5fea2b7ead3620493fb887ee34bd6191b8428ab74763fb324246be193fbd5e2fc32268f7f61331680a02f087d6ce3c619d9d7da1820
7
- data.tar.gz: 262e2e0efec270bed5eac991e706298220bf67f5024efd6ae99782d94efb86380c95bf40bcc9dc2779e423205d6c00441a9b72968921894d3bd5fb3869034cab
6
+ metadata.gz: 43f6b27708081b51906e6768edb32cd54243974582c0beae93a2030f3b605d62e8f5c4a245c9b5dc8fa6a7de0e0590756404bfb748961ad66e513dc99bcb7bda
7
+ data.tar.gz: c02fc34b15851945a8b5da43e93326062c903383dca4a7a8e21134c8d199f92a1918bebcb2f71e32f9c08046c3e8520e97765c5045b3d52682788be9dd97c321
data/README.md CHANGED
@@ -171,7 +171,7 @@ creates index with settings for each file from `indices` folder.
171
171
  - `rake elastics:migrate` (`.migrate`)
172
172
  puts mappings from `mappings` folder.
173
173
 
174
- - `rake elastics:migrate full=true` (`.migrate!`)
174
+ - `rake elastics:migrate!` (`.migrate!`)
175
175
  performs full migration.
176
176
 
177
177
  - `rake elastics:reindex` (`.reindex`)
@@ -10,26 +10,23 @@ module Elastics
10
10
  end
11
11
 
12
12
  module ClassMethods
13
+ # Performs `_search` request on type and instantiates result object.
14
+ # SearchResult is a default result class. It can be overriden with
15
+ # :result_class option.
13
16
  def search_elastics(data = {}, options = {})
14
- request = {
15
- id: :_search,
16
- body: data,
17
- }
18
- if routing = options[:routing]
19
- request[:query] = {routing: routing}
20
- end
21
- SearchResult.new self, request_elastics(request), options
17
+ options[:result_class] ||= SearchResult
18
+ options[:model] = self
19
+ super
22
20
  end
23
21
 
22
+ # Finds items by ids and returns array in the order in which ids were given.
23
+ # Every missing record is replaced with `nil` in the result.
24
24
  def find_all_ordered(ids)
25
25
  items_by_id = where(id: ids).index_by(&:id)
26
26
  ids.map { |i| items_by_id[i] }
27
27
  end
28
28
 
29
- def elastics_mapping
30
- request_elastics(method: :get, id: :_mapping)
31
- end
32
-
29
+ # Indexes all records in current scope.
33
30
  def index_all_elastics(*args)
34
31
  find_in_batches(*args) do |batch|
35
32
  index_batch_elastics(batch)
@@ -1,8 +1,8 @@
1
1
  module Elastics
2
2
  module ActiveRecord
3
3
  class SearchResult < Result::Search
4
- def initialize(model, response, options = {})
5
- @model = model
4
+ def initialize(response, options = {})
5
+ @model = options[:model]
6
6
  super response, options
7
7
  end
8
8
 
@@ -21,18 +21,37 @@ module Elastics
21
21
  }
22
22
  end
23
23
 
24
+ # Proxies #request method to elastics client with specified index & type.
24
25
  def request_elastics(params)
25
26
  elastics.request(elastics_params.merge!(params))
26
27
  end
27
28
 
29
+ # Proxies #bulk method to elastics client with specified index & type.
28
30
  def bulk_elastics(params = {}, &block)
29
31
  elastics.bulk(elastics_params.merge!(params), &block)
30
32
  end
31
33
 
34
+ # Performs `_search` request on type and instantiates result object.
35
+ # Result::Search is a default result class. It can be overriden with
36
+ # :result_class option.
37
+ def search_elastics(data = {}, options = {})
38
+ request = {
39
+ id: :_search,
40
+ body: data,
41
+ }
42
+ if routing = options[:routing]
43
+ request[:query] = {routing: routing}
44
+ end
45
+ result_class = options[:result_class] || Result::Search
46
+ result_class.new request_elastics(request), options
47
+ end
48
+
49
+ # Performs `_refresh` request on index.
32
50
  def refresh_elastics
33
51
  request_elastics(method: :post, type: nil, id: :_refresh)
34
52
  end
35
53
 
54
+ # Indexes given records using batch API.
36
55
  def index_batch_elastics(batch)
37
56
  bulk_elastics do |bulk|
38
57
  batch.each do |record|
@@ -41,8 +60,20 @@ module Elastics
41
60
  end
42
61
  end
43
62
 
63
+ # Reindexes all records. It requires #find_in_batches method to be defined.
44
64
  def reindex_elastics(options = {})
45
- raise 'Not implemented'
65
+ find_in_batches(options) do |batch|
66
+ index_batch_elastics(batch)
67
+ end
68
+ end
69
+
70
+ # Deletes all records in type keeping its mapping using "Delete by query" API.
71
+ def clear_elastics
72
+ request_elastics method: :delete, id: :_query, body: {query: {match_all: {}}}
73
+ end
74
+
75
+ def elastics_mapping
76
+ request_elastics(id: :_mapping)
46
77
  end
47
78
  end
48
79
 
@@ -1,11 +1,15 @@
1
1
  module Elastics
2
2
  module QueryHelper
3
+ # Combines multiple filters into `and` filter. Returns unmodified input
4
+ # unless it was an array.
3
5
  def normalize_filters(filters)
4
6
  return filters unless filters.is_a?(Array)
5
7
  return filters[0] if 2 > filters.size
6
8
  {and: {filters: filters}}
7
9
  end
8
10
 
11
+ # Wraps given query into `filtered` query if filter is present.
12
+ # Also replaces empty query with `match_all`.
9
13
  def normalize_query(query, filters)
10
14
  filter = normalize_filters filters
11
15
  query ||= {match_all: {}}
@@ -16,12 +20,20 @@ module Elastics
16
20
  }}
17
21
  end
18
22
 
23
+ # Returns `term`(for scalar value) or `terms` (for array) query node
24
+ # for specified field.
19
25
  def terms_query(field, val, options = {})
20
26
  if val.is_a?(Array)
21
27
  {terms: {field => val}.merge(options)}
22
28
  else
23
- result = {term: {field => val}}
29
+ {term: {field => val}}
24
30
  end
25
31
  end
32
+
33
+ # Returns `nil` if falsy value or empty array is given. Other way
34
+ # it returns term(s) query for it.
35
+ def terms_array_query(field, val, options = {})
36
+ terms_query(field, val, options) if val && (!val.is_a?(Array) || val.any?)
37
+ end
26
38
  end
27
39
  end
@@ -26,10 +26,34 @@ module Elastics
26
26
  flatten.sort.
27
27
  each_with_object({}) do |file, hash|
28
28
  name = File.basename file, '.yml'
29
- hash[name] = YAML.load_file(file)
29
+ hash[name] = fix_mapping(name, YAML.load_file(file))
30
30
  end
31
31
  end
32
32
 
33
+ # Adds missing type name in the top-level and updates properties definition.
34
+ # It allows to write
35
+ #
36
+ # properties:
37
+ # name: string
38
+ # project_id: integer
39
+ #
40
+ # instead of
41
+ #
42
+ # task:
43
+ # properties:
44
+ # name:
45
+ # type: string
46
+ # project_id:
47
+ # type: integer
48
+ def fix_mapping(name, mapping)
49
+ mapping = {name => mapping} unless mapping.keys == [name]
50
+ properties = mapping[name]['properties']
51
+ properties && properties.each do |field, val|
52
+ properties[field] = {type: val} if val.is_a?(String)
53
+ end
54
+ mapping
55
+ end
56
+
33
57
  def types
34
58
  @types ||= mappings.keys
35
59
  end
@@ -1,5 +1,5 @@
1
1
  module Elastics
2
- VERSION = '0.4.0'
2
+ VERSION = '0.5.0'
3
3
 
4
4
  def self.gem_version
5
5
  Gem::Version.new VERSION
@@ -29,11 +29,11 @@ namespace 'elastics' do
29
29
 
30
30
  desc 'Creates indices and applies mappings. Full migration when param is present'
31
31
  task migrate: :load_config do
32
- if ENV['full']
33
- Elastics::Tasks.migrate! @elastics_options
34
- else
35
- Elastics::Tasks.migrate @elastics_options
36
- end
32
+ Elastics::Tasks.migrate @elastics_options
33
+ end
34
+
35
+ task migrate!: :load_config do
36
+ Elastics::Tasks.migrate! @elastics_options
37
37
  end
38
38
 
39
39
  desc 'Reindex'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: elastics
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Max Melentiev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-31 00:00:00.000000000 Z
11
+ date: 2015-01-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httpclient