work in progress: rels
This commit is contained in:
parent
1bf5e82afc
commit
a108ad9fc3
3 changed files with 30 additions and 15 deletions
|
@ -24,17 +24,6 @@ class IContainer(ITraversable):
|
||||||
and the value object (e.g. `parent´ and `name`) are stored correctly."""
|
and the value object (e.g. `parent´ and `name`) are stored correctly."""
|
||||||
|
|
||||||
|
|
||||||
class IConcept(IContainer):
|
|
||||||
|
|
||||||
def parents(*predicates):
|
|
||||||
"""Return a sequence of `Triple`s in which this object is
|
|
||||||
referenced as `second`."""
|
|
||||||
|
|
||||||
def children(*predicates):
|
|
||||||
"""Return a sequence of `Triple`s in which this object is
|
|
||||||
referenced as `first`."""
|
|
||||||
|
|
||||||
|
|
||||||
class IView(Interface):
|
class IView(Interface):
|
||||||
|
|
||||||
def __call__():
|
def __call__():
|
||||||
|
|
|
@ -3,22 +3,38 @@
|
||||||
"""Core classes for concept map structure."""
|
"""Core classes for concept map structure."""
|
||||||
|
|
||||||
from zope.interface import implementer
|
from zope.interface import implementer
|
||||||
from scopes.interfaces import IConcept
|
|
||||||
from scopes.storage.common import registerContainerClass, registry
|
from scopes.storage.common import registerContainerClass, registry
|
||||||
from scopes.storage.tracking import Container, Track
|
from scopes.storage.tracking import Container, Track
|
||||||
|
|
||||||
|
|
||||||
@implementer(IConcept)
|
|
||||||
class Concept(Track):
|
class Concept(Track):
|
||||||
|
|
||||||
headFields = ['name']
|
headFields = ['name']
|
||||||
|
|
||||||
|
def parents(self, predicate=None):
|
||||||
|
return self.container.queryRels(second=self, predicate=predicate)
|
||||||
|
|
||||||
|
def children(self, predicate=None):
|
||||||
|
return self.container.queryRels(first=self, predicate=predicate)
|
||||||
|
|
||||||
|
|
||||||
class Concepts(Container):
|
class Concepts(Container):
|
||||||
|
|
||||||
insertOnChange = False
|
insertOnChange = False
|
||||||
indexes = None
|
indexes = None
|
||||||
|
|
||||||
|
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)
|
||||||
|
for k, v in crit.items:
|
||||||
|
if isinstance(v, Track):
|
||||||
|
crit[k] = v.uid
|
||||||
|
rels = self.storage.getContainer('rel')
|
||||||
|
return rels.query(**crit)
|
||||||
|
|
||||||
|
|
||||||
|
# implementation of relationships between concepts using RDF-like triples
|
||||||
|
|
||||||
class Predicate(Concept):
|
class Predicate(Concept):
|
||||||
|
|
||||||
|
@ -37,6 +53,15 @@ class Triple(Track):
|
||||||
headFields = ['first', 'second', 'predicate']
|
headFields = ['first', 'second', 'predicate']
|
||||||
prefix = 'rel'
|
prefix = 'rel'
|
||||||
|
|
||||||
|
def getFirst(self):
|
||||||
|
return self.container.storage.getItem(self.first)
|
||||||
|
|
||||||
|
def getSecond(self):
|
||||||
|
return self.container.storage.getItem(self.second)
|
||||||
|
|
||||||
|
def getPredicate(self):
|
||||||
|
return self.container.storage.getItem(self.second)
|
||||||
|
|
||||||
|
|
||||||
@registerContainerClass
|
@registerContainerClass
|
||||||
class Rels(Container):
|
class Rels(Container):
|
||||||
|
@ -47,6 +72,8 @@ class Rels(Container):
|
||||||
tableName = 'rels'
|
tableName = 'rels'
|
||||||
insertOnChange = False
|
insertOnChange = False
|
||||||
|
|
||||||
|
defaultPredicate = 'standard'
|
||||||
|
|
||||||
|
|
||||||
# types stuff
|
# types stuff
|
||||||
|
|
||||||
|
@ -75,7 +102,6 @@ class Types(Concepts):
|
||||||
def storeType(storage, cls, name):
|
def storeType(storage, cls, name):
|
||||||
types = storage.create(Types)
|
types = storage.create(Types)
|
||||||
types.save(Type(name, cls.prefix))
|
types.save(Type(name, cls.prefix))
|
||||||
storage.commit()
|
|
||||||
|
|
||||||
def setupCoreTypes(storage):
|
def setupCoreTypes(storage):
|
||||||
for c in registry.values():
|
for c in registry.values():
|
||||||
|
|
|
@ -169,7 +169,7 @@ class Container(object):
|
||||||
*r[1:-2], trackId=r[0],timeStamp=r[-2], data=r[-1], container=self)
|
*r[1:-2], trackId=r[0],timeStamp=r[-2], data=r[-1], container=self)
|
||||||
|
|
||||||
def setupWhere(self, crit):
|
def setupWhere(self, crit):
|
||||||
return [self.table.c[k.lower()] == v for k, v in crit.items()]
|
return [self.table.c[k.lower()] == v for k, v in crit.items() if v is not None]
|
||||||
|
|
||||||
def setupValues(self, track, withTrackId=False):
|
def setupValues(self, track, withTrackId=False):
|
||||||
values = {}
|
values = {}
|
||||||
|
|
Loading…
Add table
Reference in a new issue