@@ -52,9 +52,11 @@ def __init__(
5252 raise ValueError (
5353 f"Time traveling is not supported for index storage_version={ self .storage_version } "
5454 )
55-
5655 updates_array_name = storage_formats [self .storage_version ]["UPDATES_ARRAY_NAME" ]
57- self .updates_array_uri = f"{ self .group .uri } /{ updates_array_name } "
56+ if updates_array_name in self .group :
57+ self .updates_array_uri = self .group [storage_formats [self .storage_version ]["UPDATES_ARRAY_NAME" ]].uri
58+ else :
59+ self .updates_array_uri = f"{ self .group .uri } /{ updates_array_name } "
5860 self .index_version = self .group .meta .get ("index_version" , "" )
5961 self .ingestion_timestamps = [
6062 int (x )
@@ -134,7 +136,7 @@ def query(self, queries: np.ndarray, k, **kwargs):
134136 raise TypeError (f"A query in queries has { query_dimensions } dimensions, but the indexed data had { self .dimensions } dimensions" )
135137
136138 with tiledb .scope_ctx (ctx_or_config = self .config ):
137- if not tiledb .array_exists (self .updates_array_uri ):
139+ if not tiledb .array_exists (self .updates_array_uri ) or not self . has_updates () :
138140 if self .query_base_array :
139141 return self .query_internal (queries , k , ** kwargs )
140142 else :
@@ -266,7 +268,22 @@ def get_dimensions(self):
266268 def query_internal (self , queries : np .ndarray , k , ** kwargs ):
267269 raise NotImplementedError
268270
271+ def has_updates (self ):
272+ if "has_updates" in self .group .meta :
273+ return self .group .meta ["has_updates" ]
274+ else :
275+ return True
276+
277+ def set_has_updates (self , has_updates : bool = True ):
278+ if not self .group .meta ["has_updates" ]:
279+ self .group .close ()
280+ self .group = tiledb .Group (self .uri , "w" , ctx = tiledb .Ctx (self .config ))
281+ self .group .meta ["has_updates" ] = has_updates
282+ self .group .close ()
283+ self .group = tiledb .Group (self .uri , "r" , ctx = tiledb .Ctx (self .config ))
284+
269285 def update (self , vector : np .array , external_id : np .uint64 , timestamp : int = None ):
286+ self .set_has_updates ()
270287 updates_array = self .open_updates_array (timestamp = timestamp )
271288 vectors = np .empty ((1 ), dtype = "O" )
272289 vectors [0 ] = vector
@@ -277,12 +294,14 @@ def update(self, vector: np.array, external_id: np.uint64, timestamp: int = None
277294 def update_batch (
278295 self , vectors : np .ndarray , external_ids : np .array , timestamp : int = None
279296 ):
297+ self .set_has_updates ()
280298 updates_array = self .open_updates_array (timestamp = timestamp )
281299 updates_array [external_ids ] = {"vector" : vectors }
282300 updates_array .close ()
283301 self .consolidate_update_fragments ()
284302
285303 def delete (self , external_id : np .uint64 , timestamp : int = None ):
304+ self .set_has_updates ()
286305 updates_array = self .open_updates_array (timestamp = timestamp )
287306 deletes = np .empty ((1 ), dtype = "O" )
288307 deletes [0 ] = np .array ([], dtype = self .dtype )
@@ -291,6 +310,7 @@ def delete(self, external_id: np.uint64, timestamp: int = None):
291310 self .consolidate_update_fragments ()
292311
293312 def delete_batch (self , external_ids : np .array , timestamp : int = None ):
313+ self .set_has_updates ()
294314 updates_array = self .open_updates_array (timestamp = timestamp )
295315 deletes = np .empty ((len (external_ids )), dtype = "O" )
296316 for i in range (len (external_ids )):
@@ -529,4 +549,5 @@ def create_metadata(
529549 group .meta ["index_type" ] = index_type
530550 group .meta ["base_sizes" ] = json .dumps ([0 ])
531551 group .meta ["ingestion_timestamps" ] = json .dumps ([0 ])
552+ group .meta ["has_updates" ] = False
532553 group .close ()
0 commit comments