use item class as parameter for Storage.getContainer() - never use prefix explictly in Code

This commit is contained in:
Helmut Merz 2024-03-16 09:42:31 +01:00
parent 606284791d
commit f6308ff9bf
3 changed files with 17 additions and 13 deletions

View file

@ -33,7 +33,8 @@ class Storage(object):
def add(self, container): def add(self, container):
self.containers[container.itemFactory.prefix] = container self.containers[container.itemFactory.prefix] = container
def getContainer(self, prefix): def getContainer(self, itemClass):
prefix = itemClass.prefix
container = self.containers.get(prefix) container = self.containers.get(prefix)
if container is None: if container is None:
return self.create(registry[prefix]) return self.create(registry[prefix])
@ -41,9 +42,8 @@ class Storage(object):
def getItem(self, uid): def getItem(self, uid):
prefix, id = uid.split('-') prefix, id = uid.split('-')
id = int(id) cls = registry[prefix].itemFactory
container = self.getContainer(prefix) return self.getContainer(cls).get(int(id))
return container.get(id)
def getExistingTable(self, tableName): def getExistingTable(self, tableName):
metadata = self.metadata metadata = self.metadata

View file

@ -30,11 +30,11 @@ class Concepts(Container):
def queryRels(self, **crit): def queryRels(self, **crit):
pred = crit.get(predicate) pred = crit.get(predicate)
if pred is not None and isinstance(pred, ('string', 'bytes')): if pred is not None and isinstance(pred, ('string', 'bytes')):
crit['predicate'] = self.storage.getContainer('pred').queryLast(name=pred) crit['predicate'] = self.storage.getContainer(Predicate).queryLast(name=pred)
for k, v in crit.items: for k, v in crit.items:
if isinstance(v, Track): if isinstance(v, Track):
crit[k] = v.uid crit[k] = v.uid
rels = self.storage.getContainer('rel') rels = self.storage.getContainer(Triple)
return rels.query(**crit) return rels.query(**crit)
@ -55,7 +55,7 @@ class Predicates(Concepts):
defaultPredicate = 'standard' defaultPredicate = 'standard'
def storePredicate(storage, name): def storePredicate(storage, name):
preds = storage.getContainer('pred') preds = storage.getContainer(Predicate)
preds.save(Predicate(name)) preds.save(Predicate(name))
@ -92,12 +92,16 @@ class Type(Concept):
headFields = ['name', 'tprefix'] headFields = ['name', 'tprefix']
prefix = 'type' prefix = 'type'
@property
def typeClass(self):
return registry[self.tprefix].itemFactory
def values(self): def values(self):
cont = self.container.storage.getContainer(self.tprefix) cont = self.container.storage.getContainer(self.typeClass)
return cont.query() return cont.query()
def get(self, key, default=None): def get(self, key, default=None):
cont = self.container.storage.getContainer(self.tprefix) cont = self.container.storage.getContainer(self.typeClass)
return cont.queryLast(name=key) or default return cont.queryLast(name=key) or default
def __getitem__(self, key): def __getitem__(self, key):
@ -107,7 +111,7 @@ class Type(Concept):
return value return value
def __setitem__(self, key, value): def __setitem__(self, key, value):
cont = self.container.storage.getContainer(self.tprefix) cont = self.container.storage.getContainer(self.typeClass)
value.name = key value.name = key
cont.save(value) cont.save(value)
@ -121,7 +125,7 @@ class Types(Concepts):
def storeType(storage, cls, name): def storeType(storage, cls, name):
types = storage.getContainer('type') types = storage.getContainer(Type)
types.save(Type(name, cls.prefix)) types.save(Type(name, cls.prefix))
def setupCoreTypes(storage): def setupCoreTypes(storage):

View file

@ -79,7 +79,7 @@ def test_type(self, config):
storage.dropTable('types') storage.dropTable('types')
concept.setupCoreTypes(storage) concept.setupCoreTypes(storage)
types = storage.getContainer(concept.Type.prefix) types = storage.getContainer(concept.Type)
tps = list(types.query()) tps = list(types.query())
self.assertEqual(len(tps), 6) self.assertEqual(len(tps), 6)
self.assertEqual(tps[0].name, 'track') self.assertEqual(tps[0].name, 'track')
@ -95,7 +95,7 @@ def test_type(self, config):
def test_topic(self, config): def test_topic(self, config):
storage = config.storageFactory(config.dbschema) storage = config.storageFactory(config.dbschema)
storage.dropTable('topics') storage.dropTable('topics')
topics = storage.getContainer(topic.Topic.prefix) topics = storage.getContainer(topic.Topic)
concept.storePredicate(storage, concept.defaultPredicate) concept.storePredicate(storage, concept.defaultPredicate)
root = folder.Root(storage) root = folder.Root(storage)
root['top']['topics'] = folder.Folder() root['top']['topics'] = folder.Folder()