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/ dist/
*.project *.project
*.pydevproject *.pydevproject
*.ropeproject
*.sublime-project *.sublime-project
*.sublime-workspace *.sublime-workspace
.settings .settings

View file

@ -350,12 +350,14 @@ class RelationSet(object):
langInfo = None 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.adapted = context
self.context = baseObject(context) self.context = baseObject(context)
self.predicateName = predicateName self.predicateName = predicateName
self.interface = interface self.interface = interface
self.noSecurityCheck = noSecurityCheck self.noSecurityCheck = noSecurityCheck
self.usePredicateIndex = usePredicateIndex
@Lazy @Lazy
def loopsRoot(self): def loopsRoot(self):
@ -385,7 +387,8 @@ class ParentRelationSet(RelationSet):
if self.adapted.__is_dummy__: if self.adapted.__is_dummy__:
return return
for c in self.context.getParents([self.predicate], for c in self.context.getParents([self.predicate],
noSecurityCheck=self.noSecurityCheck): noSecurityCheck=self.noSecurityCheck,
usePredicateIndex=self.usePredicateIndex):
a = adapted(c, langInfo=self.langInfo) a = adapted(c, langInfo=self.langInfo)
if self.interface is None or self.interface.providedBy(a): if self.interface is None or self.interface.providedBy(a):
yield a yield a
@ -396,12 +399,14 @@ class ParentRelationSet(RelationSet):
if noSecurityCheck is None: if noSecurityCheck is None:
noSecurityCheck = self.noSecurityCheck noSecurityCheck = self.noSecurityCheck
for r in self.context.getParentRelations([self.predicate], for r in self.context.getParentRelations([self.predicate],
noSecurityCheck=noSecurityCheck): noSecurityCheck=noSecurityCheck,
usePredicateIndex=self.usePredicateIndex):
if check is None or check(r): if check is None or check(r):
yield r yield r
def getRelated(self, check=None, noSecurityCheck=None): 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) yield adapted(r.first, langInfo=self.langInfo)
@ -426,7 +431,8 @@ class ChildRelationSet(RelationSet):
def __iter__(self): def __iter__(self):
if self.adapted.__is_dummy__: if self.adapted.__is_dummy__:
return 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) yield adapted(c, langInfo=self.langInfo)
def getRelations(self, check=None, noSecurityCheck=None): def getRelations(self, check=None, noSecurityCheck=None):
@ -435,7 +441,8 @@ class ChildRelationSet(RelationSet):
if noSecurityCheck is None: if noSecurityCheck is None:
noSecurityCheck = self.noSecurityCheck noSecurityCheck = self.noSecurityCheck
for r in self.context.getChildRelations([self.predicate], for r in self.context.getChildRelations([self.predicate],
noSecurityCheck=noSecurityCheck): noSecurityCheck=noSecurityCheck,
usePredicateIndex=self.usePredicateIndex):
if check is None or check(r): if check is None or check(r):
yield r yield r
@ -459,16 +466,19 @@ class TypeInstancesProperty(object):
class RelationSetProperty(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.predicateName = predicateName
self.interface = interface self.interface = interface
self.noSecurityCheck = noSecurityCheck self.noSecurityCheck = noSecurityCheck
self.usePredicateIndex = usePredicateIndex
def __get__(self, inst, class_=None): def __get__(self, inst, class_=None):
if inst is None: if inst is None:
return self return self
return self.factory(inst, self.predicateName, self.interface, return self.factory(inst, self.predicateName, self.interface,
noSecurityCheck=self.noSecurityCheck) noSecurityCheck=self.noSecurityCheck,
usePredicateIndex=self.usePredicateIndex)
def __set__(self, inst, value): def __set__(self, inst, value):
objects = [] objects = []

View file

@ -198,33 +198,41 @@ class Concept(Contained, Persistent):
return [r.first for r in rels if canListObject(r.first)] return [r.first for r in rels if canListObject(r.first)]
def getChildRelations(self, predicates=None, child=None, sort='default', def getChildRelations(self, predicates=None, child=None, sort='default',
noSecurityCheck=False): noSecurityCheck=False, usePredicateIndex=False):
predicates = predicates is None and ['c*'] or predicates predicates = predicates is None and ['c*'] or predicates
relationships = [ConceptRelation(self, None, p) for p in predicates] relationships = [ConceptRelation(self, None, p) for p in predicates]
if sort == 'default': if sort == 'default':
sort = lambda x: (x.order, (x.second.title and x.second.title.lower())) 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 if canListObject(r.second, noSecurityCheck) and
IConcept.providedBy(r.second)) IConcept.providedBy(r.second))
return sorted(rels, key=sort) return sorted(rels, key=sort)
def getChildren(self, predicates=None, sort='default', noSecurityCheck=False): def getChildren(self, predicates=None, sort='default',
return [r.second for r in self.getChildRelations(predicates, sort=sort, noSecurityCheck=False, usePredicateIndex=False):
noSecurityCheck=noSecurityCheck)] return [r.second for r in self.getChildRelations(
predicates, sort=sort,
noSecurityCheck=noSecurityCheck,
usePredicateIndex=usePredicateIndex)]
def getParentRelations (self, predicates=None, parent=None, sort='default', def getParentRelations (self, predicates=None, parent=None, sort='default',
noSecurityCheck=False): noSecurityCheck=False, usePredicateIndex=False):
predicates = predicates is None and ['c*'] or predicates predicates = predicates is None and ['c*'] or predicates
relationships = [ConceptRelation(None, self, p) for p in predicates] relationships = [ConceptRelation(None, self, p) for p in predicates]
if sort == 'default': if sort == 'default':
sort = lambda x: (x.first.title and x.first.title.lower()) 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)) if canListObject(r.first, noSecurityCheck))
return sorted(rels, key=sort) return sorted(rels, key=sort)
def getParents(self, predicates=None, sort='default', noSecurityCheck=False): def getParents(self, predicates=None, sort='default',
return [r.first for r in self.getParentRelations(predicates, sort=sort, noSecurityCheck=False, usePredicateIndex=False):
noSecurityCheck=noSecurityCheck)] return [r.first for r in self.getParentRelations(
predicates, sort=sort,
noSecurityCheck=noSecurityCheck,
usePredicateIndex=usePredicateIndex)]
def checkPredicate(self, child, predicate=None): def checkPredicate(self, child, predicate=None):
cm = self.getConceptManager() cm = self.getConceptManager()
@ -296,21 +304,25 @@ class Concept(Contained, Persistent):
# resource relations # resource relations
def getResourceRelations(self, predicates=None, resource=None, sort='default', def getResourceRelations(self, predicates=None, resource=None, sort='default',
noSecurityCheck=False): noSecurityCheck=False, usePredicateIndex=False):
if resource is not None: if resource is not None:
resource = getMaster(resource) resource = getMaster(resource)
predicates = predicates is None and ['r*'] or predicates predicates = predicates is None and ['r*'] or predicates
relationships = [ResourceRelation(self, None, p) for p in predicates] relationships = [ResourceRelation(self, None, p) for p in predicates]
if sort == 'default': if sort == 'default':
sort = lambda x: (x.order, x.second.title.lower()) 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 if canListObject(r.second, noSecurityCheck) and
IResource.providedBy(r.second)) IResource.providedBy(r.second))
return sorted(rels, key=sort) return sorted(rels, key=sort)
def getResources(self, predicates=None, sort='default', noSecurityCheck=False): def getResources(self, predicates=None, sort='default',
return [r.second for r in self.getResourceRelations(predicates, sort=sort, noSecurityCheck=False, usePredicateIndex=False):
noSecurityCheck=noSecurityCheck)] 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): def assignResource(self, resource, predicate=None, order=0, relevance=1.0):
resource = getMaster(resource) resource = getMaster(resource)

View file

@ -205,7 +205,7 @@ class Resource(Image, Contained):
return [r.first for r in rels if canListObject(r.first)] return [r.first for r in rels if canListObject(r.first)]
def getConceptRelations (self, predicates=None, concept=None, sort='default', def getConceptRelations (self, predicates=None, concept=None, sort='default',
noSecurityCheck=False): noSecurityCheck=False, usePredicateIndex=False):
predicates = predicates is None and ['r*'] or predicates predicates = predicates is None and ['r*'] or predicates
obj = getMaster(self) obj = getMaster(self)
relationships = [ResourceRelation(None, obj, p) for p in predicates] 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.order, x.first.title.lower())
sort = lambda x: (x.first.title.lower()) sort = lambda x: (x.first.title.lower())
rels = (r for r in getRelations(first=concept, second=obj, rels = (r for r in getRelations(first=concept, second=obj,
relationships=relationships) relationships=relationships,
usePredicateIndex=usePredicateIndex)
if canListObject(r.first, noSecurityCheck)) if canListObject(r.first, noSecurityCheck))
return sorted(rels, key=sort) return sorted(rels, key=sort)
def getConcepts(self, predicates=None, noSecurityCheck=False): def getConcepts(self, predicates=None, noSecurityCheck=False,
usePredicateIndex=False):
obj = getMaster(self) obj = getMaster(self)
return [r.first for r in obj.getConceptRelations(predicates, return [r.first for r in obj.getConceptRelations(predicates,
noSecurityCheck=noSecurityCheck)] noSecurityCheck=noSecurityCheck,
usePredicateIndex=usePredicateIndex)]
# simplify common access for concepts and resources: # simplify common access for concepts and resources:
getParentRelations = getConceptRelations getParentRelations = getConceptRelations