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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4c0186b1b9d3de405d50d5d736725d4a93863e029e116544b7d3870b83dad9fa
4
- data.tar.gz: 13c8237df903014ad8147f624f3d4ca7b99429023cf6311f438b9f6f5986f312
3
+ metadata.gz: '08f8f980f414278d0cec345234a113795cc07b7c84654a90b430a6063b28254b'
4
+ data.tar.gz: 0021006106d1b4e4eef8a31b1c3042cec64a4dc1f8f7ea132bc8b2d205239ce8
5
5
  SHA512:
6
- metadata.gz: b61f66f7abcdefc86bbd3eb0ac5a668469d299f7d0265b984950bda1fdaa2a7b6ab9ab4ff9ef5a088925e92a96ec0ba11cedce05aab48ef4e6a9e9060afb351b
7
- data.tar.gz: 3da63dd78087369681b89aa9e82c0b516348c4f9db9eb119ee51f6025ef9631484048b818bff9cca9c7d08c091eceffe720eaae11d76e3e02bab02f6bd9ba18f
6
+ metadata.gz: 850d72bfb78a1a3cf6da763ffeb686e740749005af7e8515514d267df1a78e696c8f17bfde67d319ef28e828716eaa7f8cb78395f83e0e223892df0db9d25c74
7
+ data.tar.gz: c5681aad41eee6ea3696e84d3afddf0881e79d5af83d717af42f0799c44e90161552e2d1bf6c1b88cafd561257ee35fef6027633551b86c3a70026297a122f4f
@@ -1,3 +1,3 @@
1
1
  module Typesense
2
- GEM_VERSION = "1.0.0.rc7"
2
+ GEM_VERSION = "1.0.0.rc8"
3
3
  end
@@ -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
- delete_collection(master_index[:alias_name])
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
@@ -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.rc7
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-03-25 00:00:00.000000000 Z
11
+ date: 2026-04-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json