From d4edd8ee7a70df220d851efbe153feb157c98104 Mon Sep 17 00:00:00 2001 From: zope Date: Sat, 7 Aug 2021 11:53:04 +0200 Subject: [PATCH] add parameter usePredicateIndex to getRelations() --- .gitignore | 1 + common.py | 26 ++++++++++++++++++-------- concept.py | 42 +++++++++++++++++++++++++++--------------- resource.py | 11 +++++++---- 4 files changed, 53 insertions(+), 27 deletions(-) diff --git a/.gitignore b/.gitignore index 844e260..17f9252 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ dist/ *.project *.pydevproject +*.ropeproject *.sublime-project *.sublime-workspace .settings diff --git a/common.py b/common.py index 3ec247c..5fa2255 100644 --- a/common.py +++ b/common.py @@ -350,12 +350,14 @@ class RelationSet(object): langInfo = None - def __init__(self, context, predicateName, interface=None, noSecurityCheck=False): + def __init__(self, context, predicateName, interface=None, + noSecurityCheck=False, usePredicateIndex=False): self.adapted = context self.context = baseObject(context) self.predicateName = predicateName self.interface = interface self.noSecurityCheck = noSecurityCheck + self.usePredicateIndex = usePredicateIndex @Lazy def loopsRoot(self): @@ -385,7 +387,8 @@ class ParentRelationSet(RelationSet): if self.adapted.__is_dummy__: return for c in self.context.getParents([self.predicate], - noSecurityCheck=self.noSecurityCheck): + noSecurityCheck=self.noSecurityCheck, + usePredicateIndex=self.usePredicateIndex): a = adapted(c, langInfo=self.langInfo) if self.interface is None or self.interface.providedBy(a): yield a @@ -396,12 +399,14 @@ class ParentRelationSet(RelationSet): if noSecurityCheck is None: noSecurityCheck = self.noSecurityCheck for r in self.context.getParentRelations([self.predicate], - noSecurityCheck=noSecurityCheck): + noSecurityCheck=noSecurityCheck, + usePredicateIndex=self.usePredicateIndex): if check is None or check(r): yield r def getRelated(self, check=None, noSecurityCheck=None): - for r in self.getRelations(check, noSecurityCheck): + for r in self.getRelations(check, noSecurityCheck, + usePredicateIndex=self.usePredicateIndex): yield adapted(r.first, langInfo=self.langInfo) @@ -426,7 +431,8 @@ class ChildRelationSet(RelationSet): def __iter__(self): if self.adapted.__is_dummy__: return - for c in self.context.getChildren([self.predicate]): + for c in self.context.getChildren([self.predicate], + usePredicateIndex=self.usePredicateIndex): yield adapted(c, langInfo=self.langInfo) def getRelations(self, check=None, noSecurityCheck=None): @@ -435,7 +441,8 @@ class ChildRelationSet(RelationSet): if noSecurityCheck is None: noSecurityCheck = self.noSecurityCheck for r in self.context.getChildRelations([self.predicate], - noSecurityCheck=noSecurityCheck): + noSecurityCheck=noSecurityCheck, + usePredicateIndex=self.usePredicateIndex): if check is None or check(r): yield r @@ -459,16 +466,19 @@ class TypeInstancesProperty(object): class RelationSetProperty(object): - def __init__(self, predicateName, interface=None, noSecurityCheck=False): + def __init__(self, predicateName, interface=None, + noSecurityCheck=False, usePredicateIndex=False): self.predicateName = predicateName self.interface = interface self.noSecurityCheck = noSecurityCheck + self.usePredicateIndex = usePredicateIndex def __get__(self, inst, class_=None): if inst is None: return self return self.factory(inst, self.predicateName, self.interface, - noSecurityCheck=self.noSecurityCheck) + noSecurityCheck=self.noSecurityCheck, + usePredicateIndex=self.usePredicateIndex) def __set__(self, inst, value): objects = [] diff --git a/concept.py b/concept.py index 637ca74..9cc6603 100644 --- a/concept.py +++ b/concept.py @@ -198,33 +198,41 @@ class Concept(Contained, Persistent): return [r.first for r in rels if canListObject(r.first)] def getChildRelations(self, predicates=None, child=None, sort='default', - noSecurityCheck=False): + noSecurityCheck=False, usePredicateIndex=False): predicates = predicates is None and ['c*'] or predicates relationships = [ConceptRelation(self, None, p) for p in predicates] if sort == 'default': sort = lambda x: (x.order, (x.second.title and x.second.title.lower())) - rels = (r for r in getRelations(self, child, relationships=relationships) + rels = (r for r in getRelations(self, child, relationships=relationships, + usePredicateIndex=usePredicateIndex) if canListObject(r.second, noSecurityCheck) and IConcept.providedBy(r.second)) return sorted(rels, key=sort) - def getChildren(self, predicates=None, sort='default', noSecurityCheck=False): - return [r.second for r in self.getChildRelations(predicates, sort=sort, - noSecurityCheck=noSecurityCheck)] + def getChildren(self, predicates=None, sort='default', + noSecurityCheck=False, usePredicateIndex=False): + return [r.second for r in self.getChildRelations( + predicates, sort=sort, + noSecurityCheck=noSecurityCheck, + usePredicateIndex=usePredicateIndex)] def getParentRelations (self, predicates=None, parent=None, sort='default', - noSecurityCheck=False): + noSecurityCheck=False, usePredicateIndex=False): predicates = predicates is None and ['c*'] or predicates relationships = [ConceptRelation(None, self, p) for p in predicates] if sort == 'default': sort = lambda x: (x.first.title and x.first.title.lower()) - rels = (r for r in getRelations(parent, self, relationships=relationships) + rels = (r for r in getRelations(parent, self, relationships=relationships, + usePredicateIndex=usePredicateIndex) if canListObject(r.first, noSecurityCheck)) return sorted(rels, key=sort) - def getParents(self, predicates=None, sort='default', noSecurityCheck=False): - return [r.first for r in self.getParentRelations(predicates, sort=sort, - noSecurityCheck=noSecurityCheck)] + def getParents(self, predicates=None, sort='default', + noSecurityCheck=False, usePredicateIndex=False): + return [r.first for r in self.getParentRelations( + predicates, sort=sort, + noSecurityCheck=noSecurityCheck, + usePredicateIndex=usePredicateIndex)] def checkPredicate(self, child, predicate=None): cm = self.getConceptManager() @@ -296,21 +304,25 @@ class Concept(Contained, Persistent): # resource relations def getResourceRelations(self, predicates=None, resource=None, sort='default', - noSecurityCheck=False): + noSecurityCheck=False, usePredicateIndex=False): if resource is not None: resource = getMaster(resource) predicates = predicates is None and ['r*'] or predicates relationships = [ResourceRelation(self, None, p) for p in predicates] if sort == 'default': sort = lambda x: (x.order, x.second.title.lower()) - rels = (r for r in getRelations(self, resource, relationships=relationships) + rels = (r for r in getRelations(self, resource, relationships=relationships, + usePredicateIndex=usePredicateIndex) if canListObject(r.second, noSecurityCheck) and IResource.providedBy(r.second)) return sorted(rels, key=sort) - def getResources(self, predicates=None, sort='default', noSecurityCheck=False): - return [r.second for r in self.getResourceRelations(predicates, sort=sort, - noSecurityCheck=noSecurityCheck)] + def getResources(self, predicates=None, sort='default', + noSecurityCheck=False, usePredicateIndex=False): + return [r.second for r in self.getResourceRelations( + predicates, sort=sort, + noSecurityCheck=noSecurityCheck, + usePredicateIndex=usePredicateIndex)] def assignResource(self, resource, predicate=None, order=0, relevance=1.0): resource = getMaster(resource) diff --git a/resource.py b/resource.py index 285c910..2da6029 100644 --- a/resource.py +++ b/resource.py @@ -205,7 +205,7 @@ class Resource(Image, Contained): return [r.first for r in rels if canListObject(r.first)] def getConceptRelations (self, predicates=None, concept=None, sort='default', - noSecurityCheck=False): + noSecurityCheck=False, usePredicateIndex=False): predicates = predicates is None and ['r*'] or predicates obj = getMaster(self) relationships = [ResourceRelation(None, obj, p) for p in predicates] @@ -213,14 +213,17 @@ class Resource(Image, Contained): #sort = lambda x: (x.order, x.first.title.lower()) sort = lambda x: (x.first.title.lower()) rels = (r for r in getRelations(first=concept, second=obj, - relationships=relationships) + relationships=relationships, + usePredicateIndex=usePredicateIndex) if canListObject(r.first, noSecurityCheck)) return sorted(rels, key=sort) - def getConcepts(self, predicates=None, noSecurityCheck=False): + def getConcepts(self, predicates=None, noSecurityCheck=False, + usePredicateIndex=False): obj = getMaster(self) return [r.first for r in obj.getConceptRelations(predicates, - noSecurityCheck=noSecurityCheck)] + noSecurityCheck=noSecurityCheck, + usePredicateIndex=usePredicateIndex)] # simplify common access for concepts and resources: getParentRelations = getConceptRelations