@@ -138,12 +138,16 @@ async def _ensure_collection(
138138 vector_size : int ,
139139 topology : CollectionTopology ,
140140 explicit_vector : str | None ,
141- ) -> None :
141+ ) -> CollectionTopology :
142142 if topology .exists :
143143 info = await self ._client .get_collection (name )
144144 vectors = info .config .params .vectors # type: ignore[union-attr]
145+ sparse_vectors = info .config .params .sparse_vectors or {}
146+ current_topology = CollectionTopology (
147+ ** collection_topology_kwargs (vectors , sparse_vectors )
148+ )
145149 if isinstance (vectors , dict ):
146- vector_name = topology .dense_using (explicit_vector )
150+ vector_name = current_topology .dense_using (explicit_vector )
147151 if vector_name is None :
148152 raise QQLRuntimeError ("Collection has no dense vector" )
149153 vector_config = vectors [vector_name ]
@@ -164,12 +168,12 @@ async def _ensure_collection(
164168 )
165169 else :
166170 raise QQLRuntimeError ("Collection has no dense vector" )
171+ return current_topology
167172 else :
168173 async with self ._creation_lock :
169174 current_topology = await self ._resolve_topology (name )
170175 if current_topology .exists :
171- await self ._ensure_collection (name , vector_size , current_topology , explicit_vector )
172- return
176+ return await self ._ensure_collection (name , vector_size , current_topology , explicit_vector )
173177
174178 await self ._create_collection_and_wait (
175179 collection_name = name ,
@@ -179,6 +183,7 @@ async def _ensure_collection(
179183 )
180184 },
181185 )
186+ return await self ._resolve_topology (name )
182187
183188 async def _create_collection_and_wait (self , ** kwargs : Any ) -> None :
184189 collection_name = kwargs ["collection_name" ]
@@ -290,7 +295,7 @@ async def _execute_insert(self, node: InsertStmt) -> ExecutionResult:
290295 embedder = Embedder (model_name )
291296 vector = embedder .embed (node .values ["text" ])
292297
293- await self ._ensure_collection (
298+ topology = await self ._ensure_collection (
294299 node .collection , len (vector ), topology , node .dense_vector
295300 )
296301 point_vector = build_dense_point_vector (
@@ -351,22 +356,6 @@ async def _execute_insert_bulk(self, node: InsertBulkStmt) -> ExecutionResult:
351356 sparse_objs = [sparse_embedder .embed (vals ["text" ]) for vals in node .values_list ]
352357
353358 first_dense_vector = dense_vectors [0 ] if dense_vectors else None
354- points : list [PointStruct ] = []
355- for idx , vals in enumerate (node .values_list ):
356- point_id , payload = extract_point_id_and_payload (vals )
357- dense_vector = dense_vectors [idx ]
358- sparse_obj = sparse_objs [idx ]
359- sparse_vector = SparseVector (
360- indices = sparse_obj ["indices" ], values = sparse_obj ["values" ]
361- )
362- points .append (
363- PointStruct (
364- id = point_id ,
365- vector = {dense_name : dense_vector , sparse_name : sparse_vector },
366- payload = payload ,
367- )
368- )
369-
370359 if not topology .exists :
371360 assert first_dense_vector is not None
372361 async with self ._creation_lock :
@@ -385,6 +374,22 @@ async def _execute_insert_bulk(self, node: InsertBulkStmt) -> ExecutionResult:
385374 dense_name = current_topology .dense_using (node .dense_vector ) or dense_name
386375 sparse_name = current_topology .sparse_using (node .sparse_vector )
387376
377+ points : list [PointStruct ] = []
378+ for idx , vals in enumerate (node .values_list ):
379+ point_id , payload = extract_point_id_and_payload (vals )
380+ dense_vector = dense_vectors [idx ]
381+ sparse_obj = sparse_objs [idx ]
382+ sparse_vector = SparseVector (
383+ indices = sparse_obj ["indices" ], values = sparse_obj ["values" ]
384+ )
385+ points .append (
386+ PointStruct (
387+ id = point_id ,
388+ vector = {dense_name : dense_vector , sparse_name : sparse_vector },
389+ payload = payload ,
390+ )
391+ )
392+
388393 try :
389394 await self ._client .upsert (
390395 collection_name = node .collection ,
@@ -406,6 +411,10 @@ async def _execute_insert_bulk(self, node: InsertBulkStmt) -> ExecutionResult:
406411 vectors = [embedder .embed (vals ["text" ]) for vals in node .values_list ]
407412
408413 first_vector = vectors [0 ] if vectors else None
414+ assert first_vector is not None
415+ topology = await self ._ensure_collection (
416+ node .collection , len (first_vector ), topology , node .dense_vector
417+ )
409418 points = []
410419 for idx , vals in enumerate (node .values_list ):
411420 vector = vectors [idx ]
@@ -420,11 +429,6 @@ async def _execute_insert_bulk(self, node: InsertBulkStmt) -> ExecutionResult:
420429 PointStruct (id = point_id , vector = point_vector , payload = payload )
421430 )
422431
423- assert first_vector is not None
424- await self ._ensure_collection (
425- node .collection , len (first_vector ), topology , node .dense_vector
426- )
427-
428432 try :
429433 await self ._client .upsert (
430434 collection_name = node .collection ,
0 commit comments