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