Commit eca9be0b2a335db0b57b26b09157fc3e97a1a54c

Authored by Andrew
1 parent 31f7ba50

Renamed RecordIndexer to RecordData [skip ci]

lib/searchkick.rb
... ... @@ -11,7 +11,7 @@ require "searchkick/model"
11 11 require "searchkick/multi_search"
12 12 require "searchkick/query"
13 13 require "searchkick/reindex_queue"
14   -require "searchkick/record_indexer"
  14 +require "searchkick/record_data"
15 15 require "searchkick/results"
16 16 require "searchkick/version"
17 17  
... ...
lib/searchkick/index.rb
... ... @@ -110,11 +110,11 @@ module Searchkick
110 110 end
111 111  
112 112 def search_id(record)
113   - RecordIndexer.new(self, record).search_id
  113 + RecordData.new(self, record).search_id
114 114 end
115 115  
116 116 def document_type(record)
117   - RecordIndexer.new(self, record).document_type
  117 + RecordData.new(self, record).document_type
118 118 end
119 119  
120 120 def reindex_record(record)
... ... @@ -432,15 +432,15 @@ module Searchkick
432 432 end
433 433  
434 434 def bulk_index_helper(records)
435   - Searchkick.indexer.queue(records.map { |r| RecordIndexer.new(self, r).index_data })
  435 + Searchkick.indexer.queue(records.map { |r| RecordData.new(self, r).index_data })
436 436 end
437 437  
438 438 def bulk_delete_helper(records)
439   - Searchkick.indexer.queue(records.reject { |r| r.id.blank? }.map { |r| RecordIndexer.new(self, r).delete_data })
  439 + Searchkick.indexer.queue(records.reject { |r| r.id.blank? }.map { |r| RecordData.new(self, r).delete_data })
440 440 end
441 441  
442 442 def bulk_update_helper(records, method_name)
443   - Searchkick.indexer.queue(records.map { |r| RecordIndexer.new(self, r).update_data(method_name) })
  443 + Searchkick.indexer.queue(records.map { |r| RecordData.new(self, r).update_data(method_name) })
444 444 end
445 445  
446 446 def batches_key
... ...
lib/searchkick/record_data.rb 0 → 100644
... ... @@ -0,0 +1,125 @@
  1 +module Searchkick
  2 + class RecordData
  3 + EXCLUDED_ATTRIBUTES = ["_id", "_type"]
  4 +
  5 + attr_reader :index, :record
  6 +
  7 + def initialize(index, record)
  8 + @index = index
  9 + @record = record
  10 + end
  11 +
  12 + def index_data
  13 + data = record_data
  14 + data[:data] = search_data
  15 + {index: data}
  16 + end
  17 +
  18 + def update_data(method_name)
  19 + data = record_data
  20 + data[:data] = {doc: search_data(method_name)}
  21 + {update: data}
  22 + end
  23 +
  24 + def delete_data
  25 + {delete: record_data}
  26 + end
  27 +
  28 + def search_id
  29 + id = record.respond_to?(:search_document_id) ? record.search_document_id : record.id
  30 + id.is_a?(Numeric) ? id : id.to_s
  31 + end
  32 +
  33 + def document_type(ignore_type = false)
  34 + index.klass_document_type(record.class, ignore_type)
  35 + end
  36 +
  37 + private
  38 +
  39 + def record_data
  40 + data = {
  41 + _index: index.name,
  42 + _id: search_id,
  43 + _type: document_type
  44 + }
  45 + data[:_routing] = record.search_routing if record.respond_to?(:search_routing)
  46 + data
  47 + end
  48 +
  49 + def search_data(method_name = nil)
  50 + partial_reindex = !method_name.nil?
  51 + options = record.class.searchkick_options
  52 +
  53 + # remove _id since search_id is used instead
  54 + source = record.send(method_name || :search_data).each_with_object({}) { |(k, v), memo| memo[k.to_s] = v; memo }.except(*EXCLUDED_ATTRIBUTES)
  55 +
  56 + # conversions
  57 + if options[:conversions]
  58 + Array(options[:conversions]).map(&:to_s).each do |conversions_field|
  59 + if source[conversions_field]
  60 + source[conversions_field] = source[conversions_field].map { |k, v| {query: k, count: v} }
  61 + end
  62 + end
  63 + end
  64 +
  65 + # hack to prevent generator field doesn't exist error
  66 + if options[:suggest]
  67 + options[:suggest].map(&:to_s).each do |field|
  68 + source[field] = nil if !source[field] && !partial_reindex
  69 + end
  70 + end
  71 +
  72 + # locations
  73 + if options[:locations]
  74 + options[:locations].map(&:to_s).each do |field|
  75 + if source[field]
  76 + if !source[field].is_a?(Hash) && (source[field].first.is_a?(Array) || source[field].first.is_a?(Hash))
  77 + # multiple locations
  78 + source[field] = source[field].map { |a| location_value(a) }
  79 + else
  80 + source[field] = location_value(source[field])
  81 + end
  82 + end
  83 + end
  84 + end
  85 +
  86 + if !source.key?("type") && record.class.searchkick_klass.searchkick_options[:inheritance]
  87 + source["type"] = document_type(true)
  88 + end
  89 +
  90 + cast_big_decimal(source)
  91 +
  92 + source
  93 + end
  94 +
  95 + def location_value(value)
  96 + if value.is_a?(Array)
  97 + value.map(&:to_f).reverse
  98 + elsif value.is_a?(Hash)
  99 + {lat: value[:lat].to_f, lon: value[:lon].to_f}
  100 + else
  101 + value
  102 + end
  103 + end
  104 +
  105 + # change all BigDecimal values to floats due to
  106 + # https://github.com/rails/rails/issues/6033
  107 + # possible loss of precision :/
  108 + def cast_big_decimal(obj)
  109 + case obj
  110 + when BigDecimal
  111 + obj.to_f
  112 + when Hash
  113 + obj.each do |k, v|
  114 + obj[k] = cast_big_decimal(v)
  115 + end
  116 + when Enumerable
  117 + obj.map do |v|
  118 + cast_big_decimal(v)
  119 + end
  120 + else
  121 + obj
  122 + end
  123 + end
  124 + end
  125 +end
... ...
lib/searchkick/record_indexer.rb
... ... @@ -1,125 +0,0 @@
1   -module Searchkick
2   - class RecordIndexer
3   - EXCLUDED_ATTRIBUTES = ["_id", "_type"]
4   -
5   - attr_reader :index, :record
6   -
7   - def initialize(index, record)
8   - @index = index
9   - @record = record
10   - end
11   -
12   - def index_data
13   - data = record_data
14   - data[:data] = search_data
15   - {index: data}
16   - end
17   -
18   - def update_data(method_name)
19   - data = record_data
20   - data[:data] = {doc: search_data(method_name)}
21   - {update: data}
22   - end
23   -
24   - def delete_data
25   - {delete: record_data}
26   - end
27   -
28   - def document_type(ignore_type = false)
29   - index.klass_document_type(record.class, ignore_type)
30   - end
31   -
32   - def search_id
33   - id = record.respond_to?(:search_document_id) ? record.search_document_id : record.id
34   - id.is_a?(Numeric) ? id : id.to_s
35   - end
36   -
37   - private
38   -
39   - def record_data
40   - data = {
41   - _index: index.name,
42   - _id: search_id,
43   - _type: document_type
44   - }
45   - data[:_routing] = record.search_routing if record.respond_to?(:search_routing)
46   - data
47   - end
48   -
49   - def search_data(method_name = nil)
50   - partial_reindex = !method_name.nil?
51   - options = record.class.searchkick_options
52   -
53   - # remove _id since search_id is used instead
54   - source = record.send(method_name || :search_data).each_with_object({}) { |(k, v), memo| memo[k.to_s] = v; memo }.except(*EXCLUDED_ATTRIBUTES)
55   -
56   - # conversions
57   - if options[:conversions]
58   - Array(options[:conversions]).map(&:to_s).each do |conversions_field|
59   - if source[conversions_field]
60   - source[conversions_field] = source[conversions_field].map { |k, v| {query: k, count: v} }
61   - end
62   - end
63   - end
64   -
65   - # hack to prevent generator field doesn't exist error
66   - if options[:suggest]
67   - options[:suggest].map(&:to_s).each do |field|
68   - source[field] = nil if !source[field] && !partial_reindex
69   - end
70   - end
71   -
72   - # locations
73   - if options[:locations]
74   - options[:locations].map(&:to_s).each do |field|
75   - if source[field]
76   - if !source[field].is_a?(Hash) && (source[field].first.is_a?(Array) || source[field].first.is_a?(Hash))
77   - # multiple locations
78   - source[field] = source[field].map { |a| location_value(a) }
79   - else
80   - source[field] = location_value(source[field])
81   - end
82   - end
83   - end
84   - end
85   -
86   - if !source.key?("type") && record.class.searchkick_klass.searchkick_options[:inheritance]
87   - source["type"] = document_type(true)
88   - end
89   -
90   - cast_big_decimal(source)
91   -
92   - source
93   - end
94   -
95   - def location_value(value)
96   - if value.is_a?(Array)
97   - value.map(&:to_f).reverse
98   - elsif value.is_a?(Hash)
99   - {lat: value[:lat].to_f, lon: value[:lon].to_f}
100   - else
101   - value
102   - end
103   - end
104   -
105   - # change all BigDecimal values to floats due to
106   - # https://github.com/rails/rails/issues/6033
107   - # possible loss of precision :/
108   - def cast_big_decimal(obj)
109   - case obj
110   - when BigDecimal
111   - obj.to_f
112   - when Hash
113   - obj.each do |k, v|
114   - obj[k] = cast_big_decimal(v)
115   - end
116   - when Enumerable
117   - obj.map do |v|
118   - cast_big_decimal(v)
119   - end
120   - else
121   - obj
122   - end
123   - end
124   - end
125   -end