Renamed *RelationsRegistry* to *RelationRegistry*

git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@1065 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
helmutm 2006-02-09 14:05:41 +00:00
parent 5004253f98
commit 2011cf593d
6 changed files with 68 additions and 53 deletions

View file

@ -4,7 +4,7 @@ Quickstart Instructions
($Id$)
In the ++etc++/default folder of your Zope 3 site create a Unique Id Utility
and a Relations Registry.
and a relation registry.
In your application
@ -14,9 +14,9 @@ In your application
``MyRelation(object1, object2)``.
- register these relation objects by getting a utility providing
``IRelationsRegistry`` and call the ``register(relation)`` on this utility.
``IRelationRegistry`` and call the ``register(relation)`` on this utility.
You are now ready to retrieve relations by using the relations registry's
You are now ready to retrieve relations by using the relation registry's
``query()`` method as described below.
You may also like to read the file concepts.txt that gives you some more basic
@ -111,12 +111,12 @@ Dyadic Relations
>>> class LivesIn(DyadicRelation):
... pass
We don't directly keep track of relations but use a relations registry for
this. The relations registry is usually a local utility; for testing we use
We don't directly keep track of relations but use a relation registry for
this. The relation registry is usually a local utility; for testing we use
a simple dummy implementation:
>>> from cybertools.relation.registry import DummyRelationsRegistry
>>> relations = DummyRelationsRegistry()
>>> from cybertools.relation.registry import DummyRelationRegistry
>>> relations = DummyRelationRegistry()
So we are ready to connect a person and a city using the LivesIn relationship:
@ -124,7 +124,7 @@ So we are ready to connect a person and a city using the LivesIn relationship:
>>> relations.register(LivesIn(audrey, newyork))
>>> relations.register(LivesIn(kirk, newyork))
We can now query the relations registry to find out where clark lives and
We can now query the relation registry to find out where clark lives and
who lives in New York. For this we use the standard attributes of dyadic
relations, first and second:
@ -183,21 +183,21 @@ all relations for clark's children:
True
Setting up and using a RelationsRegistry local utility
Setting up and using a RelationRegistry local utility
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
We now do the same stuff as above with a real, catalog-based implementation of
the relations registry. We also register the relations registry as a
the relation registry. We also register the relation registry as a
utility for demonstration purposes (and to be able to use it later when
working with events).
>>> from cybertools.relation.registry import RelationsRegistry
>>> from cybertools.relation.interfaces import IRelationsRegistry
>>> from cybertools.relation.registry import RelationRegistry
>>> from cybertools.relation.interfaces import IRelationRegistry
>>> from zope.app.testing import ztapi
>>> ztapi.provideUtility(IRelationsRegistry, RelationsRegistry())
>>> ztapi.provideUtility(IRelationRegistry, RelationRegistry())
>>> from zope.app import zapi
>>> relations = zapi.getUtility(IRelationsRegistry)
>>> relations = zapi.getUtility(IRelationRegistry)
In real life the indexes needed will be set up via subscription to
IObjectCreatedEvent - here we have to do this explicitly:
@ -281,7 +281,7 @@ It should work also for triadic relations:
True
There is also a convenience function that it makes even easier to query
a relations registry; it allows to query for more than one relationship:
a relation registry; it allows to query for more than one relationship:
>>> from cybertools.relation.registry import getRelations
>>> len(getRelations(first=clark))
@ -383,7 +383,7 @@ our LivesIn relation class from above) and use for registration:
>>> relations.register(PredicateRelation(livesIn, kirk, newyork))
The predicate may then be used as the relationship argument when querying
the relations registry.
the relation registry.
>>> len(relations.query(relationship=livesIn, second=washington))
1

View file

@ -35,7 +35,7 @@ I want to use.
So the question arises what to do with the relation objects? The point here
is not so much where to store them but how to make sure that we can find
them. So we need a registry for relations - interface IRelationsRegistry.
them. So we need a registry for relations - interface IRelationRegistry.
This has three methods:
@ -62,9 +62,9 @@ Default Implementation
----------------------
You see that this looks very much like a catalog search - so why not implement
the relations registry as a subclass of Catalog (see zope.app.catalog).
the relation registry as a subclass of Catalog (see zope.app.catalog).
OK, so the RelationsRegistry class is derived from Catalog, and of course it is
OK, so the RelationRegistry class is derived from Catalog, and of course it is
a local utility. The indexes are just FieldIndex objects, using an adapter
to provide unique ids for the objects involved via the IntIds
utility; the same is done for providing an id for the relation objects

View file

@ -5,14 +5,14 @@
xmlns:browser="http://namespaces.zope.org/browser"
i18n_domain="zope">
<localUtility class=".registry.RelationsRegistry">
<localUtility class=".registry.RelationRegistry">
<require
permission="zope.View"
interface=".interfaces.IRelationsRegistryQuery"
interface=".interfaces.IRelationRegistryQuery"
/>
<require
permission="zope.ManageContent"
interface=".interfaces.IRelationsRegistryUpdate"
interface=".interfaces.IRelationRegistryUpdate"
/>
<require
interface="zope.app.catalog.interfaces.ICatalogQuery"
@ -26,7 +26,7 @@
interface="zope.app.container.interfaces.IContainer"
permission="zope.ManageServices"
/>
<factory id="cybertools.relation.registry.RelationsRegistry" />
<factory id="cybertools.relation.registry.RelationRegistry" />
</localUtility>
<adapter
@ -37,7 +37,7 @@
/>
<subscriber
for=".interfaces.IRelationsRegistry
for=".interfaces.IRelationRegistry
zope.app.container.interfaces.IObjectAddedEvent"
handler=".registry.setupIndexes"
/>
@ -57,15 +57,15 @@
<!-- browser settings -->
<browser:tool
interface=".interfaces.IRelationsRegistry"
title="Relations Registry"
interface=".interfaces.IRelationRegistry"
title="Relation Registry"
description="Registry for relation objects."
/>
<browser:addMenuItem
title="Relations Registry"
title="Relation Registry"
description="A utility that allows the registration of and query for relations"
class=".registry.RelationsRegistry"
class=".registry.RelationRegistry"
permission="zope.ManageSite"
/>

View file

@ -90,11 +90,11 @@ class IRelationInvalidatedEvent(IObjectEvent):
"""
# relations registry interfaces
# relation registry interfaces
class IRelationsRegistryUpdate(Interface):
class IRelationRegistryUpdate(Interface):
""" Interface for registering and unregistering relations with a
relations registry.
relation registry.
"""
def register(relation):
@ -105,9 +105,12 @@ class IRelationsRegistryUpdate(Interface):
""" Remove the relation given from this registry.
"""
#BBB
#IRelationsRegistryUpdate = IRelationRegistryUpdate
class IRelationsRegistryQuery(Interface):
""" Interface for querying a relations registry.
class IRelationRegistryQuery(Interface):
""" Interface for querying a relation registry.
"""
def query(relation=None, **kw):
@ -122,10 +125,15 @@ class IRelationsRegistryQuery(Interface):
rr.queryRelations(first=someObject, second=anotherObject,
relationship=SomeRelationClass)
"""
#BBB
#IRelationsRegistryQuery = IRelationRegistryQuery
class IRelationsRegistry(IRelationsRegistryUpdate, IRelationsRegistryQuery):
class IRelationRegistry(IRelationRegistryUpdate, IRelationRegistryQuery):
""" A registry for registering and searching relations typically
implemented as a local utility .
"""
#BBB
#IRelationsRegistry = IRelationRegistry

View file

@ -34,14 +34,14 @@ from zope.event import notify
from zope.app.event.objectevent import ObjectEvent
from zope.security.proxy import removeSecurityProxy
from interfaces import IRelationsRegistry, IRelationInvalidatedEvent
from interfaces import IRelationRegistry, IRelationInvalidatedEvent
class DummyRelationsRegistry(object):
class DummyRelationRegistry(object):
""" Dummy implementation for demonstration and test purposes.
"""
implements(IRelationsRegistry)
implements(IRelationRegistry)
def __init__(self):
self.relations = []
@ -69,12 +69,15 @@ class DummyRelationsRegistry(object):
result.append(r)
return result
#BBB
#DummyRelationsRegistry = DummyRelationRegistry
class RelationsRegistry(Catalog):
class RelationRegistry(Catalog):
""" Local utility for registering (cataloguing) and searching relations.
"""
implements(IRelationsRegistry)
implements(IRelationRegistry)
def setupIndexes(self):
for idx in ('relationship', 'first', 'second', 'third'):
@ -101,6 +104,9 @@ class RelationsRegistry(Catalog):
kw[k] = (quString, quString)
return self.searchResults(**kw)
#BBB
#RelationsRegistry = RelationRegistry
class IIndexableRelation(Interface):
@ -140,7 +146,7 @@ def getRelations(first=None, second=None, third=None, relationships=None):
The relationships parameter expects a sequence of relationships
(relation classes or predicate objects).
"""
registry = zapi.getUtility(IRelationsRegistry)
registry = zapi.getUtility(IRelationRegistry)
query = {}
if first is not None: query['first'] = first
if second is not None: query['second'] = second
@ -166,15 +172,16 @@ def invalidateRelations(context, event):
all relations the object to be removed is involved in.
"""
relations = []
registry = zapi.getUtility(IRelationsRegistry)
for attr in ('first', 'second', 'third'):
relations = registry.query(**{attr: context})
for relation in relations:
registry.unregister(relation)
registry = zapi.queryUtility(IRelationRegistry)
if registry is not None:
for attr in ('first', 'second', 'third'):
relations = registry.query(**{attr: context})
for relation in relations:
registry.unregister(relation)
def removeRelation(context, event):
""" Handles IRelationInvalidatedEvent by removing the relation
(that should be already unregistered from the relations registry)
(that should be already unregistered from the relation registry)
from its container (if appropriate) and the IntIds utility.
"""
if ILocation.providedBy(context):
@ -185,9 +192,9 @@ def removeRelation(context, event):
intids.unregister(context)
def setupIndexes(context, event):
""" Handles IObjectAdded event for the RelationsRegistry utility
""" Handles IObjectAdded event for the RelationRegistry utility
and creates the indexes needed.
"""
if isinstance(context, RelationsRegistry):
if isinstance(context, RelationRegistry):
context.setupIndexes()

View file

@ -11,8 +11,8 @@ from zope.app.intid.interfaces import IIntIds
from cybertools.relation.interfaces import IDyadicRelation, ITriadicRelation
from cybertools.relation.interfaces import IRelation, IPredicate
from cybertools.relation import Relation, DyadicRelation, TriadicRelation
from cybertools.relation.interfaces import IRelationsRegistry
from cybertools.relation.registry import RelationsRegistry
from cybertools.relation.interfaces import IRelationRegistry
from cybertools.relation.registry import RelationRegistry
class IntIdsStub:
@ -50,9 +50,9 @@ class TestRelation(unittest.TestCase):
self.assert_(ITriadicRelation.providedBy(TriadicRelation(None, None, None)),
'Interface ITriadicRelation is not implemented by class TriadicRelation.')
verifyClass(ITriadicRelation, TriadicRelation)
self.assert_(IRelationsRegistry.providedBy(RelationsRegistry()),
'Interface IRelationsRegistry is not implemented by class RelationsRegistry.')
verifyClass(IRelationsRegistry, RelationsRegistry)
self.assert_(IRelationRegistry.providedBy(RelationRegistry()),
'Interface IRelationRegistry is not implemented by class RelationRegistry.')
verifyClass(IRelationRegistry, RelationRegistry)
def test_suite():