meilisearch-rails 0.7.1 → 0.7.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -0
- data/README.md +36 -0
- data/lib/meilisearch/rails/configuration.rb +32 -0
- data/lib/meilisearch/rails/null_object.rb +25 -0
- data/lib/meilisearch/rails/utilities.rb +25 -0
- data/lib/meilisearch/rails/version.rb +1 -1
- data/lib/meilisearch-rails.rb +20 -40
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 849d3f11092d279468f2303406fac8ed52849490cd5f044d0f111c2731593f76
|
4
|
+
data.tar.gz: 41ec2f87a63e74bb6c4237435490b381f80def5dee0f8393c3a40cd583386a03
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c6fb870cced8f9e395f5bbc23404331d932b8ebe92921f9867ce53e4b682a114d4a39a0d319a44395fe9d2e4f5907752ca923febee4503b4fa23df437f2237ab
|
7
|
+
data.tar.gz: d74ded33afca229deb79ed57ab820c0737f1bb2b3f258aafa4155a3d29515e24a0b9cb5680d106d0ebd9e39892f9a9e45aed8a50b934669558b8c9c11d1eddb5
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -254,6 +254,42 @@ Book.search('*', sort: ['title:asc'])
|
|
254
254
|
|
255
255
|
### Meilisearch configuration & environment
|
256
256
|
|
257
|
+
#### Deactivate Meilisearch in certain moments
|
258
|
+
|
259
|
+
By default HTTP connections to the Meilisearch URL is always active, but sometimes you want to disable the HTTP requests in a particular moment or environment.<br>
|
260
|
+
you have multiple ways to achieve this.
|
261
|
+
|
262
|
+
By adding `active: false` in the configuration initializer:
|
263
|
+
|
264
|
+
```ruby
|
265
|
+
MeiliSearch::Rails.configuration = {
|
266
|
+
meilisearch_host: 'YourMeilisearchHost',
|
267
|
+
meilisearch_api_key: 'YourMeilisearchAPIKey',
|
268
|
+
active: false
|
269
|
+
}
|
270
|
+
```
|
271
|
+
|
272
|
+
Or you can disable programmatically:
|
273
|
+
|
274
|
+
```ruby
|
275
|
+
MeiliSearch::Rails.deactivate! # all the following HTTP calls will be dismissed.
|
276
|
+
|
277
|
+
# or you can pass a block to it:
|
278
|
+
|
279
|
+
MeiliSearch::Rails.deactivate! do
|
280
|
+
# every Meilisearch call here will be dismissed, no error will be raised.
|
281
|
+
# after the block, Meilisearch state will be active.
|
282
|
+
end
|
283
|
+
```
|
284
|
+
|
285
|
+
You can also activate if you deactivated earlier:
|
286
|
+
|
287
|
+
```ruby
|
288
|
+
MeiliSearch::Rails.activate!
|
289
|
+
```
|
290
|
+
|
291
|
+
:warning: These calls are persistent, so prefer to use the method with the block. This way, you will not forget to activate it afterward.
|
292
|
+
|
257
293
|
#### Custom index_uid <!-- omit in toc -->
|
258
294
|
|
259
295
|
By default, the **index_uid** will be the class name, e.g. `Book`. You can customize the index_uid by using the `index_uid:` option.
|
@@ -11,7 +11,39 @@ module MeiliSearch
|
|
11
11
|
@_config = configuration
|
12
12
|
end
|
13
13
|
|
14
|
+
def deactivate!
|
15
|
+
semaphore.synchronize do
|
16
|
+
@_config.merge!(active: false)
|
17
|
+
|
18
|
+
return unless block_given?
|
19
|
+
|
20
|
+
yield
|
21
|
+
|
22
|
+
@_config.merge!(active: true)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def activate!
|
27
|
+
semaphore.synchronize do
|
28
|
+
@_config.merge!(active: true)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def active?
|
33
|
+
configuration.fetch(:active, true)
|
34
|
+
end
|
35
|
+
|
36
|
+
def black_hole
|
37
|
+
@black_hole ||= NullObject.instance
|
38
|
+
end
|
39
|
+
|
40
|
+
def semaphore
|
41
|
+
@semaphore ||= Mutex.new
|
42
|
+
end
|
43
|
+
|
14
44
|
def client
|
45
|
+
return black_hole unless active?
|
46
|
+
|
15
47
|
::MeiliSearch::Client.new(
|
16
48
|
configuration[:meilisearch_host] || 'http://localhost:7700',
|
17
49
|
configuration[:meilisearch_api_key],
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
|
3
|
+
module MeiliSearch
|
4
|
+
module Rails
|
5
|
+
class NullObject
|
6
|
+
include Singleton
|
7
|
+
|
8
|
+
def map
|
9
|
+
[]
|
10
|
+
end
|
11
|
+
|
12
|
+
def nil?
|
13
|
+
true
|
14
|
+
end
|
15
|
+
|
16
|
+
def method_missing(_method, *_args, &_block)
|
17
|
+
self
|
18
|
+
end
|
19
|
+
|
20
|
+
def respond_to_missing?(_method_name, _include_private = false)
|
21
|
+
false
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -40,6 +40,31 @@ module MeiliSearch
|
|
40
40
|
klass.ms_set_settings
|
41
41
|
end
|
42
42
|
end
|
43
|
+
|
44
|
+
def indexable?(record, options)
|
45
|
+
return false unless options[:if].blank? || constraint_passes?(record, options[:if])
|
46
|
+
return false unless options[:unless].blank? || !constraint_passes?(record, options[:unless])
|
47
|
+
|
48
|
+
true
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def constraint_passes?(record, constraint)
|
54
|
+
case constraint
|
55
|
+
when Symbol
|
56
|
+
record.send(constraint)
|
57
|
+
when String
|
58
|
+
record.send(constraint.to_sym)
|
59
|
+
when Enumerable
|
60
|
+
# All constraints must pass
|
61
|
+
constraint.all? { |inner_constraint| constraint_passes?(record, inner_constraint) }
|
62
|
+
else
|
63
|
+
raise ArgumentError, "Unknown constraint type: #{constraint} (#{constraint.class})" unless constraint.respond_to?(:call)
|
64
|
+
|
65
|
+
constraint.call(record)
|
66
|
+
end
|
67
|
+
end
|
43
68
|
end
|
44
69
|
end
|
45
70
|
end
|
data/lib/meilisearch-rails.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'meilisearch'
|
2
|
-
|
2
|
+
require 'meilisearch/rails/null_object'
|
3
3
|
require 'meilisearch/rails/version'
|
4
4
|
require 'meilisearch/rails/utilities'
|
5
5
|
require 'meilisearch/rails/errors'
|
@@ -249,7 +249,10 @@ module MeiliSearch
|
|
249
249
|
args[0].delete(:attributesToCrop) if args[0][:attributesToCrop]
|
250
250
|
args[0].delete(:cropLength) if args[0][:cropLength]
|
251
251
|
end
|
252
|
+
|
252
253
|
SafeIndex.log_or_throw(m, @raise_on_failure) do
|
254
|
+
return MeiliSearch::Rails.black_hole unless MeiliSearch::Rails.active?
|
255
|
+
|
253
256
|
@index.send(m, *args, &block)
|
254
257
|
end
|
255
258
|
end
|
@@ -342,7 +345,7 @@ module MeiliSearch
|
|
342
345
|
end
|
343
346
|
end
|
344
347
|
if options[:enqueue]
|
345
|
-
raise ArgumentError, 'Cannot use a enqueue if the `synchronous` option
|
348
|
+
raise ArgumentError, 'Cannot use a enqueue if the `synchronous` option is set' if options[:synchronous]
|
346
349
|
|
347
350
|
proc = if options[:enqueue] == true
|
348
351
|
proc do |record, remove|
|
@@ -452,10 +455,10 @@ module MeiliSearch
|
|
452
455
|
ms_find_in_batches(batch_size) do |group|
|
453
456
|
if ms_conditional_index?(options)
|
454
457
|
# delete non-indexable documents
|
455
|
-
ids = group.select { |d| !
|
458
|
+
ids = group.select { |d| !Utilities.indexable?(d, options) }.map { |d| ms_primary_key_of(d, options) }
|
456
459
|
index.delete_documents(ids.select(&:present?))
|
457
460
|
# select only indexable documents
|
458
|
-
group = group.select { |d|
|
461
|
+
group = group.select { |d| Utilities.indexable?(d, options) }
|
459
462
|
end
|
460
463
|
documents = group.map do |d|
|
461
464
|
attributes = settings.get_attributes(d)
|
@@ -502,7 +505,7 @@ module MeiliSearch
|
|
502
505
|
|
503
506
|
primary_key = ms_primary_key_of(document, options)
|
504
507
|
index = ms_ensure_init(options, settings)
|
505
|
-
if
|
508
|
+
if Utilities.indexable?(document, options)
|
506
509
|
raise ArgumentError, 'Cannot index a record without a primary key' if primary_key.blank?
|
507
510
|
|
508
511
|
doc = settings.get_attributes(document)
|
@@ -550,7 +553,7 @@ module MeiliSearch
|
|
550
553
|
|
551
554
|
index = ms_ensure_init(options, settings)
|
552
555
|
synchronous || options[:synchronous] ? index.delete_all_documents! : index.delete_all_documents
|
553
|
-
@ms_indexes[settings] = nil
|
556
|
+
@ms_indexes[MeiliSearch::Rails.active?][settings] = nil
|
554
557
|
end
|
555
558
|
nil
|
556
559
|
end
|
@@ -599,12 +602,12 @@ module MeiliSearch
|
|
599
602
|
|
600
603
|
def ms_search(query, params = {})
|
601
604
|
if MeiliSearch::Rails.configuration[:pagination_backend]
|
602
|
-
|
603
605
|
page = params[:page].nil? ? params[:page] : params[:page].to_i
|
604
606
|
hits_per_page = params[:hitsPerPage].nil? ? params[:hitsPerPage] : params[:hitsPerPage].to_i
|
607
|
+
hits_per_page ||= params[:hits_per_page].nil? ? params[:hits_per_page] : params[:hits_per_page].to_i
|
608
|
+
|
609
|
+
%i[page hitsPerPage hits_per_page].each { |param| params.delete(param) }
|
605
610
|
|
606
|
-
params.delete(:page)
|
607
|
-
params.delete(:hitsPerPage)
|
608
611
|
params[:limit] = 200
|
609
612
|
end
|
610
613
|
|
@@ -720,16 +723,16 @@ module MeiliSearch
|
|
720
723
|
def ms_ensure_init(options = nil, settings = nil, index_settings = nil)
|
721
724
|
raise ArgumentError, 'No `meilisearch` block found in your model.' if meilisearch_settings.nil?
|
722
725
|
|
723
|
-
@ms_indexes ||= {}
|
726
|
+
@ms_indexes ||= { true => {}, false => {} }
|
724
727
|
|
725
728
|
options ||= meilisearch_options
|
726
729
|
settings ||= meilisearch_settings
|
727
730
|
|
728
|
-
return @ms_indexes[settings] if @ms_indexes[settings]
|
731
|
+
return @ms_indexes[MeiliSearch::Rails.active?][settings] if @ms_indexes[MeiliSearch::Rails.active?][settings]
|
729
732
|
|
730
|
-
@ms_indexes[settings] = SafeIndex.new(ms_index_uid(options), meilisearch_options[:raise_on_failure], meilisearch_options)
|
733
|
+
@ms_indexes[MeiliSearch::Rails.active?][settings] = SafeIndex.new(ms_index_uid(options), meilisearch_options[:raise_on_failure], meilisearch_options)
|
731
734
|
|
732
|
-
current_settings = @ms_indexes[settings].settings(getVersion: 1) rescue nil # if the index doesn't exist
|
735
|
+
current_settings = @ms_indexes[MeiliSearch::Rails.active?][settings].settings(getVersion: 1) rescue nil # if the index doesn't exist
|
733
736
|
|
734
737
|
index_settings ||= settings.to_settings
|
735
738
|
index_settings = options[:primary_settings].to_settings.merge(index_settings) if options[:inherit]
|
@@ -737,10 +740,10 @@ module MeiliSearch
|
|
737
740
|
options[:check_settings] = true if options[:check_settings].nil?
|
738
741
|
|
739
742
|
if !ms_indexing_disabled?(options) && options[:check_settings] && meilisearch_settings_changed?(current_settings, index_settings)
|
740
|
-
@ms_indexes[settings].update_settings(index_settings)
|
743
|
+
@ms_indexes[MeiliSearch::Rails.active?][settings].update_settings(index_settings)
|
741
744
|
end
|
742
745
|
|
743
|
-
@ms_indexes[settings]
|
746
|
+
@ms_indexes[MeiliSearch::Rails.active?][settings]
|
744
747
|
end
|
745
748
|
|
746
749
|
private
|
@@ -802,31 +805,6 @@ module MeiliSearch
|
|
802
805
|
options[:if].present? || options[:unless].present?
|
803
806
|
end
|
804
807
|
|
805
|
-
def ms_indexable?(document, options = nil)
|
806
|
-
options ||= meilisearch_options
|
807
|
-
if_passes = options[:if].blank? || ms_constraint_passes?(document, options[:if])
|
808
|
-
unless_passes = options[:unless].blank? || !ms_constraint_passes?(document, options[:unless])
|
809
|
-
if_passes && unless_passes
|
810
|
-
end
|
811
|
-
|
812
|
-
def ms_constraint_passes?(document, constraint)
|
813
|
-
case constraint
|
814
|
-
when Symbol
|
815
|
-
document.send(constraint)
|
816
|
-
when String
|
817
|
-
document.send(constraint.to_sym)
|
818
|
-
when Enumerable
|
819
|
-
# All constraints must pass
|
820
|
-
constraint.all? { |inner_constraint| ms_constraint_passes?(document, inner_constraint) }
|
821
|
-
else
|
822
|
-
unless constraint.respond_to?(:call)
|
823
|
-
raise ArgumentError, "Unknown constraint type: #{constraint} (#{constraint.class})"
|
824
|
-
end
|
825
|
-
|
826
|
-
constraint.call(document)
|
827
|
-
end
|
828
|
-
end
|
829
|
-
|
830
808
|
def ms_indexing_disabled?(options = nil)
|
831
809
|
options ||= meilisearch_options
|
832
810
|
constraint = options[:disable_indexing] || options['disable_indexing']
|
@@ -902,6 +880,8 @@ module MeiliSearch
|
|
902
880
|
end
|
903
881
|
|
904
882
|
def ms_enqueue_index!(synchronous)
|
883
|
+
return unless Utilities.indexable?(self, meilisearch_options)
|
884
|
+
|
905
885
|
if meilisearch_options[:enqueue]
|
906
886
|
unless self.class.send(:ms_indexing_disabled?, meilisearch_options)
|
907
887
|
meilisearch_options[:enqueue].call(self, false)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: meilisearch-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Meili
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-09-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: meilisearch
|
@@ -41,6 +41,7 @@ files:
|
|
41
41
|
- lib/meilisearch/rails/configuration.rb
|
42
42
|
- lib/meilisearch/rails/errors.rb
|
43
43
|
- lib/meilisearch/rails/ms_job.rb
|
44
|
+
- lib/meilisearch/rails/null_object.rb
|
44
45
|
- lib/meilisearch/rails/pagination.rb
|
45
46
|
- lib/meilisearch/rails/pagination/kaminari.rb
|
46
47
|
- lib/meilisearch/rails/pagination/will_paginate.rb
|