diff --git a/scopes/storage/common.py b/scopes/storage/common.py index e0d5995..88a1818 100644 --- a/scopes/storage/common.py +++ b/scopes/storage/common.py @@ -33,7 +33,8 @@ class Storage(object): def add(self, container): self.containers[container.itemFactory.prefix] = container - def getContainer(self, prefix): + def getContainer(self, itemClass): + prefix = itemClass.prefix container = self.containers.get(prefix) if container is None: return self.create(registry[prefix]) @@ -41,9 +42,8 @@ class Storage(object): def getItem(self, uid): prefix, id = uid.split('-') - id = int(id) - container = self.getContainer(prefix) - return container.get(id) + cls = registry[prefix].itemFactory + return self.getContainer(cls).get(int(id)) def getExistingTable(self, tableName): metadata = self.metadata diff --git a/scopes/storage/concept.py b/scopes/storage/concept.py index a1ace32..26b37db 100644 --- a/scopes/storage/concept.py +++ b/scopes/storage/concept.py @@ -30,11 +30,11 @@ class Concepts(Container): def queryRels(self, **crit): pred = crit.get(predicate) 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: if isinstance(v, Track): crit[k] = v.uid - rels = self.storage.getContainer('rel') + rels = self.storage.getContainer(Triple) return rels.query(**crit) @@ -55,7 +55,7 @@ class Predicates(Concepts): defaultPredicate = 'standard' def storePredicate(storage, name): - preds = storage.getContainer('pred') + preds = storage.getContainer(Predicate) preds.save(Predicate(name)) @@ -92,12 +92,16 @@ class Type(Concept): headFields = ['name', 'tprefix'] prefix = 'type' + @property + def typeClass(self): + return registry[self.tprefix].itemFactory + def values(self): - cont = self.container.storage.getContainer(self.tprefix) + cont = self.container.storage.getContainer(self.typeClass) return cont.query() 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 def __getitem__(self, key): @@ -107,7 +111,7 @@ class Type(Concept): return value def __setitem__(self, key, value): - cont = self.container.storage.getContainer(self.tprefix) + cont = self.container.storage.getContainer(self.typeClass) value.name = key cont.save(value) @@ -121,7 +125,7 @@ class Types(Concepts): def storeType(storage, cls, name): - types = storage.getContainer('type') + types = storage.getContainer(Type) types.save(Type(name, cls.prefix)) def setupCoreTypes(storage): diff --git a/tests/tlib_storage.py b/tests/tlib_storage.py index 3a839bc..0cab6e0 100644 --- a/tests/tlib_storage.py +++ b/tests/tlib_storage.py @@ -79,7 +79,7 @@ def test_type(self, config): storage.dropTable('types') concept.setupCoreTypes(storage) - types = storage.getContainer(concept.Type.prefix) + types = storage.getContainer(concept.Type) tps = list(types.query()) self.assertEqual(len(tps), 6) self.assertEqual(tps[0].name, 'track') @@ -95,7 +95,7 @@ def test_type(self, config): def test_topic(self, config): storage = config.storageFactory(config.dbschema) storage.dropTable('topics') - topics = storage.getContainer(topic.Topic.prefix) + topics = storage.getContainer(topic.Topic) concept.storePredicate(storage, concept.defaultPredicate) root = folder.Root(storage) root['top']['topics'] = folder.Folder()