typesense-rails 1.0.0.rc7 → 1.0.0.rc8
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/lib/typesense/version.rb +1 -1
- data/lib/typesense-rails.rb +4 -2
- data/spec/integration_spec.rb +75 -0
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: '08f8f980f414278d0cec345234a113795cc07b7c84654a90b430a6063b28254b'
|
|
4
|
+
data.tar.gz: 0021006106d1b4e4eef8a31b1c3042cec64a4dc1f8f7ea132bc8b2d205239ce8
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 850d72bfb78a1a3cf6da763ffeb686e740749005af7e8515514d267df1a78e696c8f17bfde67d319ef28e828716eaa7f8cb78395f83e0e223892df0db9d25c74
|
|
7
|
+
data.tar.gz: c5681aad41eee6ea3696e84d3afddf0881e79d5af83d717af42f0799c44e90161552e2d1bf6c1b88cafd561257ee35fef6027633551b86c3a70026297a122f4f
|
data/lib/typesense/version.rb
CHANGED
data/lib/typesense-rails.rb
CHANGED
|
@@ -270,7 +270,7 @@ module Typesense
|
|
|
270
270
|
end
|
|
271
271
|
|
|
272
272
|
def collection_name_with_timestamp(options)
|
|
273
|
-
"#{typesense_collection_name(options)}_#{Time.now.to_i}"
|
|
273
|
+
"#{typesense_collection_name(options)}_#{Time.now.to_i}_#{SecureRandom.hex(4)}"
|
|
274
274
|
end
|
|
275
275
|
|
|
276
276
|
def typesense_create_collection(collection_name, settings = nil, existing_collection: nil)
|
|
@@ -635,10 +635,11 @@ module Typesense
|
|
|
635
635
|
next if typesense_indexing_disabled?(options)
|
|
636
636
|
|
|
637
637
|
existing_collection_resources = {}
|
|
638
|
+
old_collection_name = nil
|
|
638
639
|
begin
|
|
639
640
|
master_index = typesense_ensure_init(options, settings, false)
|
|
640
641
|
existing_collection_resources = typesense_collection_resources(master_index[:alias_name])
|
|
641
|
-
|
|
642
|
+
old_collection_name = master_index[:collection_name]
|
|
642
643
|
rescue ArgumentError
|
|
643
644
|
@typesense_indexes[settings] = { collection_name: "", alias_name: typesense_collection_name(options) }
|
|
644
645
|
master_index = @typesense_indexes[settings]
|
|
@@ -665,6 +666,7 @@ module Typesense
|
|
|
665
666
|
end
|
|
666
667
|
|
|
667
668
|
upsert_alias(src_index_name, master_index[:alias_name])
|
|
669
|
+
delete_collection(old_collection_name) if old_collection_name.present? && old_collection_name != src_index_name
|
|
668
670
|
master_index[:collection_name] = src_index_name
|
|
669
671
|
end
|
|
670
672
|
nil
|
data/spec/integration_spec.rb
CHANGED
|
@@ -142,6 +142,9 @@ ActiveRecord::Schema.define do
|
|
|
142
142
|
create_table :misconfigured_blocks do |t|
|
|
143
143
|
t.string :name
|
|
144
144
|
end
|
|
145
|
+
create_table :reindex_alias_probes do |t|
|
|
146
|
+
t.string :name
|
|
147
|
+
end
|
|
145
148
|
if defined?(ActiveModel::Serializer)
|
|
146
149
|
create_table :serialized_objects do |t|
|
|
147
150
|
t.string :name
|
|
@@ -248,6 +251,14 @@ class DisabledSymbol < ActiveRecord::Base
|
|
|
248
251
|
end
|
|
249
252
|
end
|
|
250
253
|
|
|
254
|
+
class ReindexAliasProbe < ActiveRecord::Base
|
|
255
|
+
include Typesense
|
|
256
|
+
|
|
257
|
+
typesense auto_index: false, index_name: safe_index_name("ReindexAliasProbe") do
|
|
258
|
+
attribute :name
|
|
259
|
+
end
|
|
260
|
+
end
|
|
261
|
+
|
|
251
262
|
module Namespaced
|
|
252
263
|
def self.table_name_prefix
|
|
253
264
|
"namespaced_"
|
|
@@ -991,6 +1002,33 @@ describe "An imaginary store" do
|
|
|
991
1002
|
expect(Product.search("*", "", { "per_page" => Typesense::IndexSettings::DEFAULT_BATCH_SIZE }).size).to eq(n)
|
|
992
1003
|
end
|
|
993
1004
|
|
|
1005
|
+
it "does not delete the live alias target before swapping during reindex" do
|
|
1006
|
+
alias_name = Product.index_name
|
|
1007
|
+
old_collection_name = "#{alias_name}_old"
|
|
1008
|
+
new_collection_name = "#{alias_name}_new"
|
|
1009
|
+
previous_indexes = Product.instance_variable_get(:@typesense_indexes)
|
|
1010
|
+
|
|
1011
|
+
Product.instance_variable_set(:@typesense_indexes, {})
|
|
1012
|
+
|
|
1013
|
+
allow(Product).to receive(:get_collection).with(alias_name).and_return({ "name" => old_collection_name })
|
|
1014
|
+
allow(Product).to receive(:typesense_collection_resources).with(alias_name).and_return({})
|
|
1015
|
+
allow(Product).to receive(:collection_name_with_timestamp).and_return(new_collection_name)
|
|
1016
|
+
allow(Product).to receive(:typesense_find_in_batches)
|
|
1017
|
+
|
|
1018
|
+
expect(Product).not_to receive(:delete_collection).with(alias_name)
|
|
1019
|
+
expect(Product).to receive(:create_collection).with(
|
|
1020
|
+
new_collection_name,
|
|
1021
|
+
Product.typesense_settings,
|
|
1022
|
+
existing_collection: {}
|
|
1023
|
+
).ordered
|
|
1024
|
+
expect(Product).to receive(:upsert_alias).with(new_collection_name, alias_name).ordered
|
|
1025
|
+
expect(Product).to receive(:delete_collection).with(old_collection_name).ordered
|
|
1026
|
+
|
|
1027
|
+
Product.reindex(Typesense::IndexSettings::DEFAULT_BATCH_SIZE)
|
|
1028
|
+
ensure
|
|
1029
|
+
Product.instance_variable_set(:@typesense_indexes, previous_indexes)
|
|
1030
|
+
end
|
|
1031
|
+
|
|
994
1032
|
it "should not return products that are not indexable" do
|
|
995
1033
|
@sekrit.index!
|
|
996
1034
|
@no_href.index!
|
|
@@ -1071,6 +1109,43 @@ describe "MongoObject" do
|
|
|
1071
1109
|
end
|
|
1072
1110
|
end
|
|
1073
1111
|
|
|
1112
|
+
describe "ReindexAliasProbe" do
|
|
1113
|
+
before(:each) do
|
|
1114
|
+
ReindexAliasProbe.delete_all
|
|
1115
|
+
ReindexAliasProbe.clear_index!
|
|
1116
|
+
rescue StandardError
|
|
1117
|
+
ArgumentError
|
|
1118
|
+
ensure
|
|
1119
|
+
ReindexAliasProbe.create!(name: "alpha")
|
|
1120
|
+
ReindexAliasProbe.create!(name: "beta")
|
|
1121
|
+
ReindexAliasProbe.reindex(Typesense::IndexSettings::DEFAULT_BATCH_SIZE)
|
|
1122
|
+
end
|
|
1123
|
+
|
|
1124
|
+
after(:each) do
|
|
1125
|
+
ReindexAliasProbe.delete_all
|
|
1126
|
+
ReindexAliasProbe.clear_index!
|
|
1127
|
+
rescue StandardError
|
|
1128
|
+
ArgumentError
|
|
1129
|
+
end
|
|
1130
|
+
|
|
1131
|
+
it "keeps the alias searchable while reindex builds the replacement collection" do
|
|
1132
|
+
alias_name = ReindexAliasProbe.index_name
|
|
1133
|
+
search_params = { q: "alpha", query_by: "name" }
|
|
1134
|
+
|
|
1135
|
+
expect(ReindexAliasProbe.typesense_client.collections[alias_name].documents.search(search_params)["found"]).to eq(1)
|
|
1136
|
+
|
|
1137
|
+
expect(ReindexAliasProbe).to receive(:create_collection).and_wrap_original do |original, *args, **kwargs|
|
|
1138
|
+
expect(
|
|
1139
|
+
ReindexAliasProbe.typesense_client.collections[alias_name].documents.search(search_params)["found"]
|
|
1140
|
+
).to eq(1)
|
|
1141
|
+
original.call(*args, **kwargs)
|
|
1142
|
+
end
|
|
1143
|
+
|
|
1144
|
+
ReindexAliasProbe.reindex(Typesense::IndexSettings::DEFAULT_BATCH_SIZE)
|
|
1145
|
+
expect(ReindexAliasProbe.typesense_client.collections[alias_name].documents.search(search_params)["found"]).to eq(1)
|
|
1146
|
+
end
|
|
1147
|
+
end
|
|
1148
|
+
|
|
1074
1149
|
describe "Book" do
|
|
1075
1150
|
before(:all) do
|
|
1076
1151
|
Book.clear_index!
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: typesense-rails
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.0.0.
|
|
4
|
+
version: 1.0.0.rc8
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- typesense
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2026-
|
|
11
|
+
date: 2026-04-26 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: json
|