caoutsearch 0.0.1 → 0.0.3
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 +4 -4
- data/README.md +816 -7
- data/lib/caoutsearch/config/mappings.rb +1 -1
- data/lib/caoutsearch/filter/base.rb +11 -7
- data/lib/caoutsearch/filter/boolean.rb +1 -1
- data/lib/caoutsearch/filter/date.rb +93 -22
- data/lib/caoutsearch/filter/default.rb +10 -10
- data/lib/caoutsearch/filter/geo_point.rb +1 -1
- data/lib/caoutsearch/filter/match.rb +5 -5
- data/lib/caoutsearch/filter/none.rb +1 -1
- data/lib/caoutsearch/filter/range.rb +6 -6
- data/lib/caoutsearch/index/document.rb +11 -11
- data/lib/caoutsearch/index/indice_versions.rb +3 -3
- data/lib/caoutsearch/index/internal_dsl.rb +3 -3
- data/lib/caoutsearch/index/reindex.rb +11 -11
- data/lib/caoutsearch/index/scoping.rb +3 -3
- data/lib/caoutsearch/index/serialization.rb +13 -13
- data/lib/caoutsearch/instrumentation/base.rb +12 -12
- data/lib/caoutsearch/instrumentation/search.rb +11 -2
- data/lib/caoutsearch/mappings.rb +1 -1
- data/lib/caoutsearch/model/indexable.rb +57 -0
- data/lib/caoutsearch/model/searchable.rb +31 -0
- data/lib/caoutsearch/model.rb +12 -0
- data/lib/caoutsearch/response/aggregations.rb +50 -0
- data/lib/caoutsearch/response/response.rb +9 -0
- data/lib/caoutsearch/response/suggestions.rb +9 -0
- data/lib/caoutsearch/response.rb +6 -0
- data/lib/caoutsearch/search/adapter/active_record.rb +39 -0
- data/lib/caoutsearch/search/base.rb +16 -15
- data/lib/caoutsearch/search/batch/scroll.rb +93 -0
- data/lib/caoutsearch/search/batch/search_after.rb +70 -0
- data/lib/caoutsearch/search/batch_methods.rb +63 -0
- data/lib/caoutsearch/search/callbacks.rb +28 -0
- data/lib/caoutsearch/search/delete_methods.rb +19 -0
- data/lib/caoutsearch/search/dsl/item.rb +2 -2
- data/lib/caoutsearch/search/inspect.rb +34 -0
- data/lib/caoutsearch/search/instrumentation.rb +19 -0
- data/lib/caoutsearch/search/internal_dsl.rb +107 -0
- data/lib/caoutsearch/search/naming.rb +45 -0
- data/lib/caoutsearch/search/point_in_time.rb +28 -0
- data/lib/caoutsearch/search/query/boolean.rb +4 -4
- data/lib/caoutsearch/search/query/nested.rb +1 -1
- data/lib/caoutsearch/search/query/setters.rb +4 -4
- data/lib/caoutsearch/search/query_builder/aggregations.rb +49 -0
- data/lib/caoutsearch/search/query_builder.rb +89 -0
- data/lib/caoutsearch/search/query_methods.rb +157 -0
- data/lib/caoutsearch/search/records.rb +23 -0
- data/lib/caoutsearch/search/resettable.rb +38 -0
- data/lib/caoutsearch/search/response.rb +97 -0
- data/lib/caoutsearch/search/sanitizer.rb +2 -2
- data/lib/caoutsearch/search/search_methods.rb +239 -0
- data/lib/caoutsearch/search/type_cast.rb +14 -6
- data/lib/caoutsearch/search/value.rb +10 -10
- data/lib/caoutsearch/search/value_overflow.rb +1 -1
- data/lib/caoutsearch/settings.rb +1 -1
- data/lib/caoutsearch/testing/mock_requests.rb +105 -0
- data/lib/caoutsearch/testing.rb +3 -0
- data/lib/caoutsearch/version.rb +1 -1
- data/lib/caoutsearch.rb +10 -5
- metadata +44 -126
- data/lib/caoutsearch/search/search/delete_methods.rb +0 -21
- data/lib/caoutsearch/search/search/inspect.rb +0 -36
- data/lib/caoutsearch/search/search/instrumentation.rb +0 -21
- data/lib/caoutsearch/search/search/internal_dsl.rb +0 -77
- data/lib/caoutsearch/search/search/naming.rb +0 -47
- data/lib/caoutsearch/search/search/query_builder.rb +0 -94
- data/lib/caoutsearch/search/search/query_methods.rb +0 -180
- data/lib/caoutsearch/search/search/resettable.rb +0 -35
- data/lib/caoutsearch/search/search/response.rb +0 -88
- data/lib/caoutsearch/search/search/scroll_methods.rb +0 -113
- data/lib/caoutsearch/search/search/search_methods.rb +0 -230
@@ -8,10 +8,19 @@ module Caoutsearch
|
|
8
8
|
log_response("Search", event)
|
9
9
|
end
|
10
10
|
|
11
|
+
def search_after(event)
|
12
|
+
log_request("SearchAfter", event, format: "truncated")
|
13
|
+
log_response("SearchAfter", event) do |message|
|
14
|
+
payload = event.payload
|
15
|
+
message += ", progress: #{payload[:progress]} / #{payload[:total]}"
|
16
|
+
message
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
11
20
|
def scroll_search(event)
|
12
21
|
log_request("Search", event, format: log_request_format)
|
13
22
|
log_response("Search", event) do |message|
|
14
|
-
payload
|
23
|
+
payload = event.payload
|
15
24
|
message += ", progress: #{payload[:progress]} / #{payload[:total]}"
|
16
25
|
message
|
17
26
|
end
|
@@ -20,7 +29,7 @@ module Caoutsearch
|
|
20
29
|
def scroll(event)
|
21
30
|
log_request("Scroll", event, format: "truncated")
|
22
31
|
log_response("Scroll", event) do |message|
|
23
|
-
payload
|
32
|
+
payload = event.payload
|
24
33
|
message += ", progress: #{payload[:progress]} / #{payload[:total]}"
|
25
34
|
message
|
26
35
|
end
|
data/lib/caoutsearch/mappings.rb
CHANGED
@@ -0,0 +1,57 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Caoutsearch
|
4
|
+
module Model
|
5
|
+
module Indexable
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
included do
|
9
|
+
class_attribute :index_engine_class
|
10
|
+
end
|
11
|
+
|
12
|
+
class_methods do
|
13
|
+
def index_with(index_class)
|
14
|
+
self.index_engine_class = index_class
|
15
|
+
|
16
|
+
extend ClassMethods
|
17
|
+
include InstanceMethods
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
module ClassMethods
|
22
|
+
def reindex(*properties, **options, &block)
|
23
|
+
index_engine_class.reindex(all, *properties, **options, &block)
|
24
|
+
end
|
25
|
+
|
26
|
+
def delete_indexes
|
27
|
+
find_in_batches do |batch|
|
28
|
+
ids = batch.map(&:id)
|
29
|
+
index_engine_class.delete_documents(ids)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def delete_index(id)
|
34
|
+
index_engine_class.delete_document(id)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
module InstanceMethods
|
39
|
+
def as_indexed_json(*properties)
|
40
|
+
index_engine_class.new(self).as_json(*properties)
|
41
|
+
end
|
42
|
+
|
43
|
+
def indexed_document
|
44
|
+
index_engine_class.new(self).indexed_document
|
45
|
+
end
|
46
|
+
|
47
|
+
def update_index(*properties)
|
48
|
+
index_engine_class.new(self).update_document(*properties)
|
49
|
+
end
|
50
|
+
|
51
|
+
def delete_index
|
52
|
+
index_engine_class.new(self).delete_document
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Caoutsearch
|
4
|
+
module Model
|
5
|
+
module Searchable
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
included do
|
9
|
+
class_attribute :search_engine_class
|
10
|
+
end
|
11
|
+
|
12
|
+
class_methods do
|
13
|
+
def search_with(search_class)
|
14
|
+
self.search_engine_class = search_class
|
15
|
+
|
16
|
+
extend ClassMethods
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
module ClassMethods
|
21
|
+
def search_engine
|
22
|
+
search_engine_class.new
|
23
|
+
end
|
24
|
+
|
25
|
+
def search(...)
|
26
|
+
search_engine_class.new.search(...)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Caoutsearch
|
4
|
+
module Response
|
5
|
+
class Aggregations < Caoutsearch::Response::Response
|
6
|
+
disable_warnings
|
7
|
+
|
8
|
+
def initialize(aggs, search = nil, &block)
|
9
|
+
@source_search = search
|
10
|
+
super(aggs, &block)
|
11
|
+
end
|
12
|
+
|
13
|
+
def key?(key)
|
14
|
+
super || has_transformation?(key)
|
15
|
+
end
|
16
|
+
|
17
|
+
def custom_reader(key)
|
18
|
+
if has_transformation?(key)
|
19
|
+
transformation_cache(key) do
|
20
|
+
call_transformation(key)
|
21
|
+
end
|
22
|
+
else
|
23
|
+
super
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
alias_method :[], :custom_reader
|
28
|
+
|
29
|
+
def has_transformation?(key)
|
30
|
+
@source_search&.class&.transformations&.include?(key.to_s)
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def call_transformation(key)
|
36
|
+
item = @source_search.class.transformations.fetch(key.to_s)
|
37
|
+
aggs = @source_search.response.aggregations
|
38
|
+
|
39
|
+
@source_search.instance_exec(aggs, &item.block)
|
40
|
+
end
|
41
|
+
|
42
|
+
def transformation_cache(name)
|
43
|
+
@cached_transformations ||= {}
|
44
|
+
return @cached_transformations[name] if @cached_transformations.include?(name)
|
45
|
+
|
46
|
+
@cached_transformations[name] = yield
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Caoutsearch
|
4
|
+
module Search
|
5
|
+
module Adapter
|
6
|
+
module ActiveRecord
|
7
|
+
def self.call(model, hits, skip_query_cache: false)
|
8
|
+
ids = hits.map { |hit| hit["_id"] }
|
9
|
+
|
10
|
+
relation = model.where(model.primary_key => ids).extending(Relation)
|
11
|
+
relation.skip_query_cache! if skip_query_cache
|
12
|
+
relation.hits = hits
|
13
|
+
relation
|
14
|
+
end
|
15
|
+
|
16
|
+
module Relation
|
17
|
+
attr_reader :hits
|
18
|
+
|
19
|
+
def hits=(values)
|
20
|
+
@hits = values
|
21
|
+
end
|
22
|
+
|
23
|
+
# Re-order records based on hits order
|
24
|
+
#
|
25
|
+
def records
|
26
|
+
return super if order_values.present? || @_reordered_records
|
27
|
+
|
28
|
+
load
|
29
|
+
indexes = @hits.each_with_index.to_h { |hit, index| [hit["_id"].to_s, index] }
|
30
|
+
@records = @records.sort_by { |record| indexes[record.id.to_s] }.freeze
|
31
|
+
@_reordered_records = true
|
32
|
+
|
33
|
+
@records
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -7,21 +7,22 @@ module Caoutsearch
|
|
7
7
|
include Caoutsearch::Config::Mappings
|
8
8
|
include Caoutsearch::Config::Settings
|
9
9
|
|
10
|
-
include Caoutsearch::Search::
|
11
|
-
include Caoutsearch::Search::
|
12
|
-
include Caoutsearch::Search::
|
13
|
-
include Caoutsearch::Search::
|
14
|
-
include Caoutsearch::Search::
|
15
|
-
include Caoutsearch::Search::
|
16
|
-
include Caoutsearch::Search::
|
17
|
-
include Caoutsearch::Search::
|
18
|
-
include Caoutsearch::Search::
|
19
|
-
include Caoutsearch::Search::
|
20
|
-
include Caoutsearch::Search::
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
10
|
+
include Caoutsearch::Search::BatchMethods
|
11
|
+
include Caoutsearch::Search::Batch::Scroll
|
12
|
+
include Caoutsearch::Search::Batch::SearchAfter
|
13
|
+
include Caoutsearch::Search::Callbacks
|
14
|
+
include Caoutsearch::Search::DeleteMethods
|
15
|
+
include Caoutsearch::Search::Inspect
|
16
|
+
include Caoutsearch::Search::Instrumentation
|
17
|
+
include Caoutsearch::Search::InternalDSL
|
18
|
+
include Caoutsearch::Search::Naming
|
19
|
+
include Caoutsearch::Search::PointInTime
|
20
|
+
include Caoutsearch::Search::QueryBuilder
|
21
|
+
include Caoutsearch::Search::QueryMethods
|
22
|
+
include Caoutsearch::Search::Records
|
23
|
+
include Caoutsearch::Search::Resettable
|
24
|
+
include Caoutsearch::Search::Response
|
25
|
+
include Caoutsearch::Search::SearchMethods
|
25
26
|
end
|
26
27
|
end
|
27
28
|
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Caoutsearch
|
4
|
+
module Search
|
5
|
+
module Batch
|
6
|
+
module Scroll
|
7
|
+
def scroll(scroll: "1m", batch_size: 1000, &block)
|
8
|
+
search = per(batch_size).track_total_hits
|
9
|
+
|
10
|
+
request_payload = {
|
11
|
+
index: index_name,
|
12
|
+
scroll: scroll,
|
13
|
+
body: search.build.to_h
|
14
|
+
}
|
15
|
+
|
16
|
+
total = 0
|
17
|
+
progress = 0
|
18
|
+
requested_at = nil
|
19
|
+
last_response_time = nil
|
20
|
+
|
21
|
+
results = instrument(:scroll_search) do |event_payload|
|
22
|
+
response = client.search(request_payload)
|
23
|
+
last_response_time = Time.current
|
24
|
+
|
25
|
+
total = response["hits"]["total"]["value"]
|
26
|
+
progress += response["hits"]["hits"].size
|
27
|
+
|
28
|
+
event_payload[:request] = request_payload
|
29
|
+
event_payload[:response] = response
|
30
|
+
event_payload[:total] = total
|
31
|
+
event_payload[:progress] = progress
|
32
|
+
|
33
|
+
response
|
34
|
+
end
|
35
|
+
|
36
|
+
hits = results["hits"]["hits"]
|
37
|
+
return if hits.empty?
|
38
|
+
|
39
|
+
yield hits
|
40
|
+
return if progress >= total
|
41
|
+
|
42
|
+
scroll_id = results["_scroll_id"]
|
43
|
+
request_payload = {
|
44
|
+
scroll_id: scroll_id,
|
45
|
+
scroll: scroll
|
46
|
+
}
|
47
|
+
|
48
|
+
loop do
|
49
|
+
requested_at = Time.current
|
50
|
+
|
51
|
+
results = instrument(:scroll, scroll: scroll_id) do |event_payload|
|
52
|
+
response = client.scroll(request_payload)
|
53
|
+
last_response_time = Time.current
|
54
|
+
|
55
|
+
progress += response["hits"]["hits"].size
|
56
|
+
|
57
|
+
event_payload[:request] = request_payload
|
58
|
+
event_payload[:response] = response
|
59
|
+
event_payload[:total] = total
|
60
|
+
event_payload[:progress] = progress
|
61
|
+
|
62
|
+
response
|
63
|
+
rescue Elastic::Transport::Transport::Errors::NotFound => e
|
64
|
+
raise_enhance_message_when_scroll_failed(e, scroll, requested_at, last_response_time)
|
65
|
+
end
|
66
|
+
|
67
|
+
hits = results["hits"]["hits"]
|
68
|
+
break if hits.empty?
|
69
|
+
|
70
|
+
yield hits
|
71
|
+
break if progress >= total
|
72
|
+
end
|
73
|
+
|
74
|
+
total
|
75
|
+
ensure
|
76
|
+
clear_scroll(scroll_id) if scroll_id
|
77
|
+
end
|
78
|
+
|
79
|
+
def clear_scroll(scroll_id)
|
80
|
+
client.clear_scroll(scroll_id: scroll_id)
|
81
|
+
rescue ::Elastic::Transport::Transport::Errors::NotFound
|
82
|
+
# We dont care if the scroll ID is already expired
|
83
|
+
end
|
84
|
+
|
85
|
+
def raise_enhance_message_when_scroll_failed(error, scroll, requested_at, last_response_time)
|
86
|
+
elapsed = (requested_at - last_response_time).round(1).seconds
|
87
|
+
|
88
|
+
raise error.exception("Scroll registered for #{scroll}, #{elapsed.inspect} elapsed between. #{error.message}")
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Caoutsearch
|
4
|
+
module Search
|
5
|
+
module Batch
|
6
|
+
module SearchAfter
|
7
|
+
def search_after(keep_alive: "1m", batch_size: 1000, &block)
|
8
|
+
pit_id = open_point_in_time(keep_alive: keep_alive)
|
9
|
+
search = per(batch_size).track_total_hits
|
10
|
+
|
11
|
+
request_payload = {
|
12
|
+
body: search.build.to_h.merge(
|
13
|
+
pit: {
|
14
|
+
id: pit_id,
|
15
|
+
keep_alive: keep_alive
|
16
|
+
}
|
17
|
+
)
|
18
|
+
}
|
19
|
+
|
20
|
+
total = nil
|
21
|
+
progress = 0
|
22
|
+
requested_at = nil
|
23
|
+
last_response_time = Time.current
|
24
|
+
|
25
|
+
loop do
|
26
|
+
requested_at = Time.current
|
27
|
+
|
28
|
+
results = instrument(:search_after, pit: pit_id) do |event_payload|
|
29
|
+
response = client.search(request_payload)
|
30
|
+
last_response_time = Time.current
|
31
|
+
|
32
|
+
total ||= response["hits"]["total"]["value"]
|
33
|
+
progress += response["hits"]["hits"].size
|
34
|
+
|
35
|
+
event_payload[:request] = request_payload
|
36
|
+
event_payload[:response] = response
|
37
|
+
event_payload[:total] = total
|
38
|
+
event_payload[:progress] = progress
|
39
|
+
|
40
|
+
response
|
41
|
+
rescue Elastic::Transport::Transport::Errors::NotFound => e
|
42
|
+
raise_enhance_message_when_pit_failed(e, keep_alive, requested_at, last_response_time)
|
43
|
+
end
|
44
|
+
|
45
|
+
hits = results["hits"]["hits"]
|
46
|
+
pit_id = results["pit_id"]
|
47
|
+
break if hits.empty?
|
48
|
+
|
49
|
+
yield hits
|
50
|
+
break if progress >= total
|
51
|
+
|
52
|
+
request_payload[:body].tap do |body|
|
53
|
+
body[:pit][:id] = pit_id
|
54
|
+
body[:search_after] = hits.last["sort"]
|
55
|
+
body.delete(:track_total_hits)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
ensure
|
59
|
+
close_point_in_time(pit_id) if pit_id
|
60
|
+
end
|
61
|
+
|
62
|
+
def raise_enhance_message_when_pit_failed(error, keep_alive, requested_at, last_response_time)
|
63
|
+
elapsed = (requested_at - last_response_time).round(1).seconds
|
64
|
+
|
65
|
+
raise error.exception("PIT registered for #{keep_alive}, #{elapsed.inspect} elapsed between. #{error.message}")
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Caoutsearch
|
4
|
+
module Search
|
5
|
+
module BatchMethods
|
6
|
+
def find_each_hit(**options, &block)
|
7
|
+
return to_enum(:find_each_hit, **options) { total_count } unless block
|
8
|
+
|
9
|
+
find_hits_in_batches(**options) do |hits|
|
10
|
+
hits.each(&block)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def find_each_record(**options, &block)
|
15
|
+
return to_enum(:find_each_record, **options) { total_count } unless block
|
16
|
+
|
17
|
+
find_records_in_batches(**options) do |relation|
|
18
|
+
relation.each(&block)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def find_records_in_batches(**options)
|
23
|
+
unless block_given?
|
24
|
+
return to_enum(:find_records_in_batches, **options) do
|
25
|
+
find_hits_in_batches(**options).size
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
find_hits_in_batches(**options) do |hits|
|
30
|
+
yield records_adapter.call(model, hits, skip_query_cache: true)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def find_hits_in_batches(implementation: :search_after, **options)
|
35
|
+
batch_size = options[:batch_size]&.to_i || @current_limit&.to_i || 1000
|
36
|
+
|
37
|
+
unless block_given?
|
38
|
+
return to_enum(:find_hits_in_batches, **options) do
|
39
|
+
total_count.div(batch_size) + 1
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
unless %i[search_after scroll].include?(implementation)
|
44
|
+
raise ArgumentError, "unexpected implementation argument: #{implementation.inspect}"
|
45
|
+
end
|
46
|
+
|
47
|
+
method(implementation).call(batch_size: batch_size, **options) do |hits|
|
48
|
+
yield hits
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def scroll_records_in_batches(**options)
|
53
|
+
ActiveSupport::Deprecation.warn("scroll_records_in_batches is deprecated, use find_records_in_batches instead")
|
54
|
+
find_records_in_batches(implementation: :scroll, **options)
|
55
|
+
end
|
56
|
+
|
57
|
+
def scroll_records(**options)
|
58
|
+
ActiveSupport::Deprecation.warn("scroll_records is deprecated, use find_each_record instead")
|
59
|
+
find_each_record(implementation: :scroll, **options)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Caoutsearch
|
4
|
+
module Search
|
5
|
+
module Callbacks
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
include ActiveSupport::Callbacks
|
8
|
+
|
9
|
+
included do
|
10
|
+
define_callbacks :build
|
11
|
+
end
|
12
|
+
|
13
|
+
class_methods do
|
14
|
+
def before_build(*filters, &blk)
|
15
|
+
set_callback(:build, :before, *filters, &blk)
|
16
|
+
end
|
17
|
+
|
18
|
+
def after_build(*filters, &blk)
|
19
|
+
set_callback(:build, :after, *filters, &blk)
|
20
|
+
end
|
21
|
+
|
22
|
+
def around_build(*filters, &blk)
|
23
|
+
set_callback(:build, :around, *filters, &blk)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Caoutsearch
|
4
|
+
module Search
|
5
|
+
module DeleteMethods
|
6
|
+
def delete_documents
|
7
|
+
request_payload = {
|
8
|
+
index: index_name,
|
9
|
+
body: build.to_h
|
10
|
+
}
|
11
|
+
|
12
|
+
instrument(:delete) do |event_payload|
|
13
|
+
event_payload[:request] = request_payload
|
14
|
+
event_payload[:response] = client.delete_by_query(request_payload)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -9,9 +9,9 @@ module Caoutsearch
|
|
9
9
|
PROPERTIES_TO_INSPECT = %i[name options block].freeze
|
10
10
|
|
11
11
|
def initialize(name, options = {}, &block)
|
12
|
-
@name
|
12
|
+
@name = name
|
13
13
|
@options = options
|
14
|
-
@block
|
14
|
+
@block = block if block
|
15
15
|
end
|
16
16
|
|
17
17
|
def has_block?
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Caoutsearch
|
4
|
+
module Search
|
5
|
+
module Inspect
|
6
|
+
PROPERTIES_TO_INSPECT = %i[
|
7
|
+
search_criteria
|
8
|
+
current_context
|
9
|
+
current_order
|
10
|
+
current_page
|
11
|
+
current_limit
|
12
|
+
current_offset
|
13
|
+
current_aggregations
|
14
|
+
current_suggestions
|
15
|
+
current_returns
|
16
|
+
].freeze
|
17
|
+
|
18
|
+
def inspect
|
19
|
+
properties = properties_to_inspect.map { |k, v| " #{k}: #{v}" }
|
20
|
+
|
21
|
+
"#<#{self.class}#{properties.join(",")}>"
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def properties_to_inspect
|
27
|
+
PROPERTIES_TO_INSPECT.each_with_object({}) do |name, properties|
|
28
|
+
value = instance_variable_get("@#{name}")
|
29
|
+
properties[name] = value.inspect if value
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Caoutsearch
|
4
|
+
module Search
|
5
|
+
module Instrumentation
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
def instrument(action, **options, &block)
|
9
|
+
ActiveSupport::Notifications.instrument("#{action}.caoutsearch_search", **options, klass: self.class.to_s, &block)
|
10
|
+
end
|
11
|
+
|
12
|
+
class_methods do
|
13
|
+
def instrument(action, **options, &block)
|
14
|
+
ActiveSupport::Notifications.instrument("#{action}.caoutsearch_search", **options, klass: to_s, &block)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|