searchkick 4.6.3 → 5.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.
@@ -1,246 +0,0 @@
1
- # based on https://gist.github.com/mnutt/566725
2
- require "active_support/core_ext/module/attr_internal"
3
-
4
- module Searchkick
5
- module QueryWithInstrumentation
6
- def execute_search
7
- name = searchkick_klass ? "#{searchkick_klass.name} Search" : "Search"
8
- event = {
9
- name: name,
10
- query: params
11
- }
12
- ActiveSupport::Notifications.instrument("search.searchkick", event) do
13
- super
14
- end
15
- end
16
- end
17
-
18
- module IndexWithInstrumentation
19
- def store(record)
20
- event = {
21
- name: "#{record.searchkick_klass.name} Store",
22
- id: search_id(record)
23
- }
24
- if Searchkick.callbacks_value == :bulk
25
- super
26
- else
27
- ActiveSupport::Notifications.instrument("request.searchkick", event) do
28
- super
29
- end
30
- end
31
- end
32
-
33
- def remove(record)
34
- name = record && record.searchkick_klass ? "#{record.searchkick_klass.name} Remove" : "Remove"
35
- event = {
36
- name: name,
37
- id: search_id(record)
38
- }
39
- if Searchkick.callbacks_value == :bulk
40
- super
41
- else
42
- ActiveSupport::Notifications.instrument("request.searchkick", event) do
43
- super
44
- end
45
- end
46
- end
47
-
48
- def update_record(record, method_name)
49
- event = {
50
- name: "#{record.searchkick_klass.name} Update",
51
- id: search_id(record)
52
- }
53
- if Searchkick.callbacks_value == :bulk
54
- super
55
- else
56
- ActiveSupport::Notifications.instrument("request.searchkick", event) do
57
- super
58
- end
59
- end
60
- end
61
-
62
- def bulk_index(records)
63
- if records.any?
64
- event = {
65
- name: "#{records.first.searchkick_klass.name} Import",
66
- count: records.size
67
- }
68
- event[:id] = search_id(records.first) if records.size == 1
69
- if Searchkick.callbacks_value == :bulk
70
- super
71
- else
72
- ActiveSupport::Notifications.instrument("request.searchkick", event) do
73
- super
74
- end
75
- end
76
- end
77
- end
78
- alias_method :import, :bulk_index
79
-
80
- def bulk_update(records, *args)
81
- if records.any?
82
- event = {
83
- name: "#{records.first.searchkick_klass.name} Update",
84
- count: records.size
85
- }
86
- event[:id] = search_id(records.first) if records.size == 1
87
- if Searchkick.callbacks_value == :bulk
88
- super
89
- else
90
- ActiveSupport::Notifications.instrument("request.searchkick", event) do
91
- super
92
- end
93
- end
94
- end
95
- end
96
-
97
- def bulk_delete(records)
98
- if records.any?
99
- event = {
100
- name: "#{records.first.searchkick_klass.name} Delete",
101
- count: records.size
102
- }
103
- event[:id] = search_id(records.first) if records.size == 1
104
- if Searchkick.callbacks_value == :bulk
105
- super
106
- else
107
- ActiveSupport::Notifications.instrument("request.searchkick", event) do
108
- super
109
- end
110
- end
111
- end
112
- end
113
- end
114
-
115
- module IndexerWithInstrumentation
116
- def perform
117
- if Searchkick.callbacks_value == :bulk
118
- event = {
119
- name: "Bulk",
120
- count: queued_items.size
121
- }
122
- ActiveSupport::Notifications.instrument("request.searchkick", event) do
123
- super
124
- end
125
- else
126
- super
127
- end
128
- end
129
- end
130
-
131
- module SearchkickWithInstrumentation
132
- def multi_search(searches)
133
- event = {
134
- name: "Multi Search",
135
- body: searches.flat_map { |q| [q.params.except(:body).to_json, q.body.to_json] }.map { |v| "#{v}\n" }.join,
136
- }
137
- ActiveSupport::Notifications.instrument("multi_search.searchkick", event) do
138
- super
139
- end
140
- end
141
- end
142
-
143
- # https://github.com/rails/rails/blob/master/activerecord/lib/active_record/log_subscriber.rb
144
- class LogSubscriber < ActiveSupport::LogSubscriber
145
- def self.runtime=(value)
146
- Thread.current[:searchkick_runtime] = value
147
- end
148
-
149
- def self.runtime
150
- Thread.current[:searchkick_runtime] ||= 0
151
- end
152
-
153
- def self.reset_runtime
154
- rt = runtime
155
- self.runtime = 0
156
- rt
157
- end
158
-
159
- def search(event)
160
- self.class.runtime += event.duration
161
- return unless logger.debug?
162
-
163
- payload = event.payload
164
- name = "#{payload[:name]} (#{event.duration.round(1)}ms)"
165
-
166
- index = payload[:query][:index].is_a?(Array) ? payload[:query][:index].join(",") : payload[:query][:index]
167
- type = payload[:query][:type]
168
- request_params = payload[:query].except(:index, :type, :body)
169
-
170
- params = []
171
- request_params.each do |k, v|
172
- params << "#{CGI.escape(k.to_s)}=#{CGI.escape(v.to_s)}"
173
- end
174
-
175
- debug " #{color(name, YELLOW, true)} #{index}#{type ? "/#{type.join(',')}" : ''}/_search#{params.any? ? '?' + params.join('&') : nil} #{payload[:query][:body].to_json}"
176
- end
177
-
178
- def request(event)
179
- self.class.runtime += event.duration
180
- return unless logger.debug?
181
-
182
- payload = event.payload
183
- name = "#{payload[:name]} (#{event.duration.round(1)}ms)"
184
-
185
- debug " #{color(name, YELLOW, true)} #{payload.except(:name).to_json}"
186
- end
187
-
188
- def multi_search(event)
189
- self.class.runtime += event.duration
190
- return unless logger.debug?
191
-
192
- payload = event.payload
193
- name = "#{payload[:name]} (#{event.duration.round(1)}ms)"
194
-
195
- debug " #{color(name, YELLOW, true)} _msearch #{payload[:body]}"
196
- end
197
- end
198
-
199
- # https://github.com/rails/rails/blob/master/activerecord/lib/active_record/railties/controller_runtime.rb
200
- module ControllerRuntime
201
- extend ActiveSupport::Concern
202
-
203
- protected
204
-
205
- attr_internal :searchkick_runtime
206
-
207
- def process_action(action, *args)
208
- # We also need to reset the runtime before each action
209
- # because of queries in middleware or in cases we are streaming
210
- # and it won't be cleaned up by the method below.
211
- Searchkick::LogSubscriber.reset_runtime
212
- super
213
- end
214
-
215
- def cleanup_view_runtime
216
- searchkick_rt_before_render = Searchkick::LogSubscriber.reset_runtime
217
- runtime = super
218
- searchkick_rt_after_render = Searchkick::LogSubscriber.reset_runtime
219
- self.searchkick_runtime = searchkick_rt_before_render + searchkick_rt_after_render
220
- runtime - searchkick_rt_after_render
221
- end
222
-
223
- def append_info_to_payload(payload)
224
- super
225
- payload[:searchkick_runtime] = (searchkick_runtime || 0) + Searchkick::LogSubscriber.reset_runtime
226
- end
227
-
228
- module ClassMethods
229
- def log_process_action(payload)
230
- messages = super
231
- runtime = payload[:searchkick_runtime]
232
- messages << ("Searchkick: %.1fms" % runtime.to_f) if runtime.to_f > 0
233
- messages
234
- end
235
- end
236
- end
237
- end
238
-
239
- Searchkick::Query.prepend(Searchkick::QueryWithInstrumentation)
240
- Searchkick::Index.prepend(Searchkick::IndexWithInstrumentation)
241
- Searchkick::Indexer.prepend(Searchkick::IndexerWithInstrumentation)
242
- Searchkick.singleton_class.prepend(Searchkick::SearchkickWithInstrumentation)
243
- Searchkick::LogSubscriber.attach_to :searchkick
244
- ActiveSupport.on_load(:action_controller) do
245
- include Searchkick::ControllerRuntime
246
- end