@@ -134,9 +134,9 @@ def find_by_target(target)
134134 end
135135
136136 def asymmetric_similarity_search ( embedding , limit :, offset :)
137- before_query , after_query = hnsw_search_workaround ( limit )
137+ before_query = hnsw_search_workaround ( limit )
138+
138139 builder = DB . build ( <<~SQL )
139- #{ before_query }
140140 WITH candidates AS (
141141 SELECT
142142 #{ target_column } ,
@@ -158,7 +158,6 @@ def asymmetric_similarity_search(embedding, limit:, offset:)
158158 embeddings::halfvec(#{ dimensions } ) #{ pg_function } '[:query_embedding]'::halfvec(#{ dimensions } )
159159 LIMIT :limit
160160 OFFSET :offset;
161- #{ after_query }
162161 SQL
163162
164163 builder . where (
@@ -176,22 +175,25 @@ def asymmetric_similarity_search(embedding, limit:, offset:)
176175 candidates_limit = limit * 2
177176 end
178177
179- builder . query (
180- query_embedding : embedding ,
181- candidates_limit : candidates_limit ,
182- limit : limit ,
183- offset : offset ,
184- )
178+ ActiveRecord ::Base . transaction do
179+ DB . exec ( before_query ) unless before_query . blank?
180+ builder . query (
181+ query_embedding : embedding ,
182+ candidates_limit : candidates_limit ,
183+ limit : limit ,
184+ offset : offset ,
185+ )
186+ end
185187 rescue PG ::Error => e
186188 Rails . logger . error ( "Error #{ e } querying embeddings for model #{ vector_def . display_name } " )
187189 raise MissingEmbeddingError
188190 end
189191
190192 def symmetric_similarity_search ( record )
191193 limit = 200
192- before_query , after_query = hnsw_search_workaround ( limit )
194+ before_query = hnsw_search_workaround ( limit )
195+
193196 builder = DB . build ( <<~SQL )
194- #{ before_query }
195197 WITH le_target AS (
196198 SELECT
197199 embeddings
@@ -229,14 +231,16 @@ def symmetric_similarity_search(record)
229231 LIMIT 1
230232 )
231233 LIMIT #{ limit / 2 } ;
232- #{ after_query }
233234 SQL
234235
235236 builder . where ( "model_id = :vid AND strategy_id = :vsid" )
236237
237238 yield ( builder ) if block_given?
238239
239- builder . query ( vid : vector_def . id , vsid : vector_def . strategy_id , target_id : record . id )
240+ ActiveRecord ::Base . transaction do
241+ DB . exec ( before_query ) unless before_query . blank?
242+ builder . query ( vid : vector_def . id , vsid : vector_def . strategy_id , target_id : record . id )
243+ end
240244 rescue PG ::Error => e
241245 Rails . logger . error ( "Error #{ e } querying embeddings for model #{ vector_def . display_name } " )
242246 raise MissingEmbeddingError
@@ -271,17 +275,8 @@ def store(record, embedding, digest)
271275 def hnsw_search_workaround ( limit )
272276 threshold = limit * 2
273277
274- return "" , "" if threshold < DEFAULT_HNSW_EF_SEARCH
275- return "SET LOCAL hnsw.ef_search = #{ threshold } ;" , "" if Rails . env . test?
276-
277- before_query = <<~SQL
278- BEGIN;
279- SET LOCAL hnsw.ef_search = #{ threshold } ;
280- SQL
281- after_query = <<~SQL
282- COMMIT;
283- SQL
284- [ before_query , after_query ]
278+ return "" if threshold < DEFAULT_HNSW_EF_SEARCH
279+ "SET LOCAL hnsw.ef_search = #{ threshold } ;"
285280 end
286281
287282 delegate :dimensions , :pg_function , to : :vector_def
0 commit comments