add parameter usePredicateIndex to getRelations()

This commit is contained in:
zope 2021-08-07 11:53:04 +02:00
parent 4b54cadcac
commit d4edd8ee7a
4 changed files with 53 additions and 27 deletions

1
.gitignore vendored
View file

@ -3,6 +3,7 @@
dist/
*.project
*.pydevproject
*.ropeproject
*.sublime-project
*.sublime-workspace
.settings

View file

@ -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 = []

View file

@ -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)

View file

@ -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