4
4
import uuid
5
5
6
6
from superduper import logging
7
- from superduper .base .exceptions import DatabackendError
8
7
from superduper .base .base import Base
8
+ from superduper .base .exceptions import DatabackendError
9
9
from superduper .components .cdc import CDC
10
+ from superduper .components .component import Component
10
11
from superduper .components .schema import Schema
11
12
from superduper .components .table import Table
12
13
from superduper .misc .importing import import_object
@@ -113,7 +114,7 @@ def __init__(self, db):
113
114
).encode (),
114
115
('Table' , 'Job' ): Table (
115
116
identifier = 'Job' ,
116
- primary_id = 'uuid ' ,
117
+ primary_id = 'job_id ' ,
117
118
uuid = 'jkl' ,
118
119
component = True ,
119
120
path = 'superduper.backends.base.metadata.Job' ,
@@ -127,7 +128,12 @@ def __init__(self, db):
127
128
def init (self ):
128
129
"""Initialize the metadata store."""
129
130
for cls in metaclasses .values ():
130
- self .db .databackend .create_table_and_schema (cls .__name__ , cls .class_schema )
131
+ preset = self .preset_components .get (('Table' , cls .__name__ ))
132
+ self .db .databackend .create_table_and_schema (
133
+ cls .__name__ ,
134
+ cls .class_schema ,
135
+ primary_id = preset ['primary_id' ],
136
+ )
131
137
132
138
def get_schema (self , table : str ):
133
139
"""Get the schema of a table.
@@ -162,10 +168,18 @@ def create(self, cls: t.Type[Base]):
162
168
r = self .db ['Table' ].get (identifier = cls .__name__ )
163
169
except DatabackendError as e :
164
170
if 'not found' in str (e ):
165
- self .db .databackend .create_table_and_schema ('Table' , Table .class_schema )
166
- t = Table ('Table' , path = 'superduper.components.table.Table' , primary_id = 'uuid' , component = True )
171
+ self .db .databackend .create_table_and_schema (
172
+ 'Table' , Table .class_schema , 'uuid'
173
+ )
174
+ t = Table (
175
+ 'Table' ,
176
+ path = 'superduper.components.table.Table' ,
177
+ primary_id = 'uuid' ,
178
+ component = True ,
179
+ )
180
+
167
181
r = self .db ['Table' ].insert (
168
- [t .dict (schema = True , path = False )],
182
+ [t .dict (schema = True , path = False )],
169
183
)
170
184
else :
171
185
raise e
@@ -175,8 +189,16 @@ def create(self, cls: t.Type[Base]):
175
189
f'{ cls .__name__ } already exists in metadata with data: { r } '
176
190
)
177
191
178
- self .db .databackend .create_table_and_schema (cls .__name__ , cls .class_schema )
179
- t = Table (identifier = cls .__name__ , path = f'{ cls .__module__ } .{ cls .__name__ } ' , primary_id = 'uuid' , component = True )
192
+ pid = 'uuid' if issubclass (cls , Component ) else self .db .databackend .id_field
193
+ self .db .databackend .create_table_and_schema (
194
+ cls .__name__ , cls .class_schema , primary_id = pid
195
+ )
196
+ t = Table (
197
+ identifier = cls .__name__ ,
198
+ path = f'{ cls .__module__ } .{ cls .__name__ } ' ,
199
+ primary_id = pid ,
200
+ component = True ,
201
+ )
180
202
self .db ['Table' ].insert ([t .dict (path = False )])
181
203
return t
182
204
@@ -198,9 +220,17 @@ def create_entry(
198
220
:param component: component name
199
221
:param raw: whether to insert raw data
200
222
"""
223
+ path = None
201
224
if component is None :
202
225
path = info .pop ('_path' )
203
226
component = path .rsplit ('.' , 1 )[1 ]
227
+
228
+ metadata = self .db ['Table' ].get (component )
229
+ if metadata is None :
230
+ assert path is not None
231
+ cls = import_object (path )
232
+ self .create (cls )
233
+
204
234
self .db [component ].insert ([info ], raw = raw )
205
235
206
236
def create_component (self , info : t .Dict ):
@@ -339,10 +369,14 @@ def show_jobs(self, component: str, identifier: str):
339
369
:param component: type of component
340
370
:param identifier: identifier of component
341
371
"""
342
- return self .db ['Job' ].filter (
343
- self .db ['Job' ]['component' ] == component ,
344
- self .db ['Job' ]['identifier' ] == identifier ,
345
- ).distinct ('job_id' )
372
+ return (
373
+ self .db ['Job' ]
374
+ .filter (
375
+ self .db ['Job' ]['component' ] == component ,
376
+ self .db ['Job' ]['identifier' ] == identifier ,
377
+ )
378
+ .distinct ('job_id' )
379
+ )
346
380
347
381
def show_components (self , component : str | None = None ):
348
382
"""
@@ -492,6 +526,10 @@ def get_component_by_uuid(self, component: str, uuid: str):
492
526
if uuid in self .preset_uuids :
493
527
return self .preset_uuids [uuid ]
494
528
r = self .db [component ].get (uuid = uuid , raw = True )
529
+ if r is None :
530
+ raise NonExistentMetadataError (
531
+ f'Object { uuid } does not exist in metadata for { component } '
532
+ )
495
533
path = self .db ['Table' ].get (identifier = component )['path' ]
496
534
r ['_path' ] = path
497
535
return r
0 commit comments