add identifier index, is used for 'TypeInstances' property
git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@2884 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
parent
abd3bb6dfb
commit
3dc2a3b24d
6 changed files with 74 additions and 10 deletions
49
common.py
49
common.py
|
@ -219,9 +219,11 @@ class NameChooser(BaseNameChooser):
|
|||
'\xdc': 'Ue', '\xfc': 'ue', '\xdf': 'ss'}
|
||||
|
||||
|
||||
# virtual attributes
|
||||
# virtual attributes/properties
|
||||
|
||||
class ContainerAttribute(object):
|
||||
#class ContainerAttribute(object):
|
||||
#class ContainedCollection(object):
|
||||
class TypeInstances(object):
|
||||
""" Use objects within a ConceptManager object for a collection attribute.
|
||||
"""
|
||||
|
||||
|
@ -237,6 +239,14 @@ class ContainerAttribute(object):
|
|||
def typeConcept(self):
|
||||
return self.context[self.typeName]
|
||||
|
||||
@Lazy
|
||||
def typeToken(self):
|
||||
return 'loops:concept:' + self.typeName
|
||||
|
||||
@Lazy
|
||||
def typePredicate(self):
|
||||
return self.context.getTypePredicate()
|
||||
|
||||
def create(self, id, **kw):
|
||||
from loops.concept import Concept
|
||||
from loops.setup import addAndConfigureObject
|
||||
|
@ -250,11 +260,17 @@ class ContainerAttribute(object):
|
|||
del self.context[self.prefix + id]
|
||||
|
||||
def get(self, id, default=None, langInfo=None):
|
||||
return adapted(self.context.get(self.prefix + id, default),
|
||||
langInfo=self.langInfo)
|
||||
#return adapted(self.context.get(self.prefix + id, default),
|
||||
# langInfo=self.langInfo)
|
||||
from loops.expert import query
|
||||
result = (query.Identifier(id) & query.Type(self.typeToken)).apply()
|
||||
for obj in query.getObjects(result):
|
||||
return adapted(obj, langInfo=self.langInfo)
|
||||
else:
|
||||
return default
|
||||
|
||||
def __iter__(self):
|
||||
for c in self.typeConcept.getChildren([self.context.getTypePredicate()]):
|
||||
for c in self.typeConcept.getChildren([self.typePredicate]):
|
||||
yield adapted(c, langInfo=self.langInfo)
|
||||
|
||||
|
||||
|
@ -318,6 +334,29 @@ class ChildRelationSet(RelationSet):
|
|||
yield adapted(c, langInfo=self.langInfo)
|
||||
|
||||
|
||||
# property descriptors
|
||||
|
||||
class RelationSetProperty(object):
|
||||
|
||||
def __init__(self, predicateName):
|
||||
self.predicateName = predicateName
|
||||
|
||||
def __get__(self, inst, class_=None):
|
||||
if inst is None:
|
||||
return self
|
||||
return self.factory(inst, self.predicateName)
|
||||
|
||||
|
||||
class ParentRelationSetProperty(RelationSetProperty):
|
||||
|
||||
factory = ParentRelationSet
|
||||
|
||||
|
||||
class ChildRelationSetProperty(RelationSetProperty):
|
||||
|
||||
factory = ChildRelationSet
|
||||
|
||||
|
||||
# caching (TBD)
|
||||
|
||||
def cached(obj):
|
||||
|
|
17
concept.py
17
concept.py
|
@ -397,13 +397,18 @@ class IndexAttributes(object):
|
|||
def __init__(self, context):
|
||||
self.context = context
|
||||
|
||||
@Lazy
|
||||
def adapted(self):
|
||||
return adapted(self.context)
|
||||
|
||||
def text(self):
|
||||
ctx = self.context
|
||||
#ctx = self.context
|
||||
#return ' '.join((getName(ctx), ctx.title,))
|
||||
description = ctx.description
|
||||
description = self.context.description
|
||||
if isinstance(description, I18NValue):
|
||||
description = ' '.join(description.values())
|
||||
actx = adapted(ctx)
|
||||
#actx = adapted(ctx)
|
||||
actx = self.adapted
|
||||
indexAttrs = getattr(actx, '_textIndexAttributes', ())
|
||||
#return ' '.join([getName(ctx), ctx.title, ctx.description] +
|
||||
return ' '.join([self.title(), description] +
|
||||
|
@ -431,6 +436,12 @@ class IndexAttributes(object):
|
|||
creators.append(principal.title)
|
||||
return creators
|
||||
|
||||
def identifier(self):
|
||||
id = getattr(self.adapted, 'identifier', None)
|
||||
if id is None:
|
||||
return getName(self)
|
||||
return id
|
||||
|
||||
|
||||
# events
|
||||
|
||||
|
|
|
@ -41,6 +41,7 @@ from loops import util
|
|||
titleIndex = ('', 'loops_title')
|
||||
textIndex = ('', 'loops_text')
|
||||
typeIndex = ('', 'loops_type')
|
||||
identifierIndex = ('', 'loops_identifier')
|
||||
stateIndex = ('', 'loops_state')
|
||||
|
||||
|
||||
|
@ -54,6 +55,10 @@ def Title(value):
|
|||
def Text(value):
|
||||
return BaseText(textIndex, value)
|
||||
|
||||
@implementer(IQuery)
|
||||
def Identifier(value):
|
||||
return Eq(identifierIndex, value)
|
||||
|
||||
@implementer(IQuery)
|
||||
def Type(value):
|
||||
if value.endswith('*'):
|
||||
|
|
|
@ -586,13 +586,13 @@ class IConceptRelation(IDyadicRelation):
|
|||
# interfaces for catalog indexes
|
||||
|
||||
class IIndexAttributes(Interface):
|
||||
""" Attributes odr methods providing index values. Typically provided
|
||||
""" Attributes or methods providing index values. Typically provided
|
||||
by an adapter.
|
||||
"""
|
||||
|
||||
def title():
|
||||
""" Return a text containing title and similar attributes to be
|
||||
indexed by a full-text index.
|
||||
indexed by the title index.
|
||||
"""
|
||||
|
||||
def text():
|
||||
|
@ -603,6 +603,11 @@ class IIndexAttributes(Interface):
|
|||
""" Return a string that identifies the type of the object.
|
||||
"""
|
||||
|
||||
def identifier():
|
||||
""" Returns a value that may be used for identifying an object within
|
||||
a restricted range, e.g. the instances of a type.
|
||||
"""
|
||||
|
||||
|
||||
# types stuff
|
||||
|
||||
|
|
|
@ -535,6 +535,9 @@ class IndexAttributes(object):
|
|||
creators.append(principal.title)
|
||||
return creators
|
||||
|
||||
def identifier(self):
|
||||
return getName(self)
|
||||
|
||||
|
||||
class ResourceTypeSourceList(object):
|
||||
|
||||
|
|
|
@ -157,6 +157,7 @@ class TestSite(object):
|
|||
component.provideUtility(catalog, ICatalog)
|
||||
catalog['loops_title'] = TextIndex('title', IIndexAttributes, True)
|
||||
catalog['loops_text'] = TextIndex('text', IIndexAttributes, True)
|
||||
catalog['loops_identifier'] = FieldIndex('identifier', IIndexAttributes, True)
|
||||
catalog['loops_type'] = FieldIndex('tokenForSearch', IType, False)
|
||||
catalog['loops_state'] = KeywordIndex('tokens', IStatefulIndexInfo, False)
|
||||
component.provideAdapter(ConceptIndexAttributes)
|
||||
|
|
Loading…
Add table
Reference in a new issue