@@ -25,6 +25,19 @@ def __init__(self, project_path: str):
25
25
else :
26
26
raise NotImplementedError
27
27
28
+ def _open_table (self , table_name : str = None ):
29
+ """
30
+ Open a LanceDB table by table name. (Return None if not exists)
31
+ Args:
32
+ table_name (Optional[str]): The name of the table. Defaults to self.table_name.
33
+ """
34
+ table_name = table_name or self .table_name
35
+ try :
36
+ table = self .client .open_table (table_name )
37
+ except FileNotFoundError :
38
+ return None
39
+ return table
40
+
28
41
def add (
29
42
self ,
30
43
texts : List [str ],
@@ -73,7 +86,7 @@ def add(
73
86
table = self .client .create_table (table_name , data = data )
74
87
table .create_fts_index ("id" )
75
88
else :
76
- self .client . open_table (table_name ).add (data = data )
89
+ self ._open_table (table_name ).add (data = data )
77
90
78
91
return ids
79
92
@@ -90,8 +103,10 @@ def query(self, query_texts: List[str], table_name: Optional[str] = None, n_resu
90
103
List[List[dict]]: A list of results for each query text, each result being a dictionary with
91
104
keys such as "vector", "text", and "id".
92
105
"""
93
- table_name = table_name or self .table_name
94
- table = self .client .open_table (table_name )
106
+ table = self ._open_table (table_name )
107
+ if table is None :
108
+ return []
109
+
95
110
query_embeds = self .text_embedding .compute_source_embeddings (query_texts )
96
111
97
112
results = [table .search (query ).limit (n_results ).to_list () for query in query_embeds ]
@@ -107,8 +122,10 @@ def list_all_keys(self, table_name: Optional[str] = None):
107
122
Returns:
108
123
List[str]: A list of all IDs in the table.
109
124
"""
110
- table_name = table_name or self .table_name
111
- table = self .client .open_table (table_name )
125
+ table = self ._open_table (table_name )
126
+ if table is None :
127
+ return []
128
+
112
129
return [item ["id" ] for item in table .search (query_type = "fts" ).to_list ()]
113
130
114
131
def get (self , record_id : str , table_name : Optional [str ] = None ):
@@ -122,8 +139,10 @@ def get(self, record_id: str, table_name: Optional[str] = None):
122
139
Returns:
123
140
List[dict]: A list containing the matching record, or an empty list if not found.
124
141
"""
125
- table_name = table_name or self .table_name
126
- table = self .client .open_table (table_name )
142
+ table = self ._open_table (table_name )
143
+ if table is None :
144
+ return []
145
+
127
146
return table .search (query_type = "fts" ) \
128
147
.where (f"id = '{ record_id } '" ) \
129
148
.limit (1 ).to_list ()
@@ -141,8 +160,10 @@ def get_by_metadata(self, key: str, value: str, table_name: Optional[str] = None
141
160
Returns:
142
161
List[dict]: A list of records matching the metadata criteria.
143
162
"""
144
- table_name = table_name or self .table_name
145
- table = self .client .open_table (table_name )
163
+ table = self ._open_table (table_name )
164
+ if table is None :
165
+ return []
166
+
146
167
return table .search (query_type = "fts" ) \
147
168
.where (f"metadata.{ key } = '{ value } '" ) \
148
169
.limit (n_results ).to_list ()
@@ -158,8 +179,10 @@ def delete(self, record_id: str, table_name: Optional[str] = None) -> bool:
158
179
Returns:
159
180
bool: True if the deletion was successful, False otherwise.
160
181
"""
161
- table_name = table_name or self .table_name
162
- table = self .client .open_table (table_name )
182
+ table = self ._open_table (table_name )
183
+ if table is None :
184
+ return True
185
+
163
186
return table .delete (f"id = '{ record_id } '" )
164
187
165
188
def delete_by_metadata (self , key : str , value : str , table_name : Optional [str ] = None ):
@@ -174,8 +197,10 @@ def delete_by_metadata(self, key: str, value: str, table_name: Optional[str] = N
174
197
Returns:
175
198
bool: True if deletion was successful, False otherwise.
176
199
"""
177
- table_name = table_name or self .table_name
178
- table = self .client .open_table (table_name )
200
+ table = self ._open_table (table_name )
201
+ if table is None :
202
+ return True
203
+
179
204
return table .delete (f"metadata.{ key } = '{ value } '" )
180
205
181
206
def drop (self , table_name : Optional [str ] = None ) -> bool :
@@ -189,6 +214,10 @@ def drop(self, table_name: Optional[str] = None) -> bool:
189
214
bool: True if the table was successfully dropped, False otherwise.
190
215
"""
191
216
table_name = table_name or self .table_name
217
+ table = self ._open_table (table_name )
218
+ if table is None :
219
+ return True
220
+
192
221
return self .client .drop_table (table_name )
193
222
194
223
def count (self , table_name : Optional [str ] = None ) -> int :
@@ -201,8 +230,10 @@ def count(self, table_name: Optional[str] = None) -> int:
201
230
Returns:
202
231
int: The number of records in the table.
203
232
"""
204
- table_name = table_name or self .table_name
205
- table = self .client .open_table (table_name )
233
+ table = self ._open_table (table_name )
234
+ if table is None :
235
+ return 0
236
+
206
237
return table .count_rows ()
207
238
208
239
def reset (self ) -> None :
0 commit comments