Added some explatory text to README.txt; added concepts.txt explaining basic ideas
git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@674 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
parent
db8d38e7cb
commit
441c6e4535
2 changed files with 114 additions and 3 deletions
|
@ -1,8 +1,31 @@
|
||||||
Yet Another Relations (Reference) Engine...
|
Quickstart Instructions
|
||||||
===========================================
|
=======================
|
||||||
|
|
||||||
($Id$)
|
($Id$)
|
||||||
|
|
||||||
|
In the ++etc++/default folder of your Zope 3 site create a Unique Id Utility
|
||||||
|
and a Relations Registry.
|
||||||
|
|
||||||
|
In your application
|
||||||
|
|
||||||
|
- define a subclass of DyadicRelation (``MyRelation``)
|
||||||
|
|
||||||
|
- create instances of this class that relate objects via
|
||||||
|
``MyRelation(object1, object2)``.
|
||||||
|
|
||||||
|
- register these relation objects by getting a utility providing
|
||||||
|
``IRelationsRegistry`` and call the ``register(relation)`` on this utility.
|
||||||
|
|
||||||
|
You are now ready to retrieve relations by using the relations registry's
|
||||||
|
``query()`` method as described below.
|
||||||
|
|
||||||
|
You may also like to read the file concept.txt that gives you some more basic
|
||||||
|
ideas about the relation package.
|
||||||
|
|
||||||
|
|
||||||
|
Relations Management: create - register - query
|
||||||
|
===============================================
|
||||||
|
|
||||||
>>> from zope.app.testing.placelesssetup import setUp
|
>>> from zope.app.testing.placelesssetup import setUp
|
||||||
>>> setUp()
|
>>> setUp()
|
||||||
|
|
||||||
|
@ -13,7 +36,7 @@ attributes are also needed later when we send an IObjectRemovedEvent event):
|
||||||
|
|
||||||
>>> from persistent import Persistent
|
>>> from persistent import Persistent
|
||||||
>>> class Person(Persistent):
|
>>> class Person(Persistent):
|
||||||
... __name__= __parent__ = None
|
... __name__ = __parent__ = None
|
||||||
|
|
||||||
>>> class City(Persistent):
|
>>> class City(Persistent):
|
||||||
... pass
|
... pass
|
||||||
|
|
88
relation/concept.txt
Normal file
88
relation/concept.txt
Normal file
|
@ -0,0 +1,88 @@
|
||||||
|
Yet Another Relations (Reference) Engine...
|
||||||
|
===========================================
|
||||||
|
|
||||||
|
($Id$)
|
||||||
|
|
||||||
|
There are quite a few solutions out there in the Zope world that allow to
|
||||||
|
manage relations or references bewtween objects. So I have been working
|
||||||
|
with the reference engine provided by Archetypes (as part of Plone) for
|
||||||
|
nearly two years now; and I also had a look at some proposals
|
||||||
|
on zope.org and implementations that are available in the Zope 3 packages from
|
||||||
|
SchoolTool and CPSSkins.
|
||||||
|
|
||||||
|
I have to confess that I was not really happy with any of these proposals
|
||||||
|
or solutions - a feeling that we may discuss in more detail, the main
|
||||||
|
point being just that I wanted to have something simple that is nevertheless
|
||||||
|
flexible enough to accomodate to various needs...
|
||||||
|
|
||||||
|
So I came up with the following (mainly combining concepts by Jean-Marc
|
||||||
|
Orliaguet and implementation ideas from Archetypes 1.3):
|
||||||
|
|
||||||
|
Basic API
|
||||||
|
---------
|
||||||
|
|
||||||
|
A relation is an object providing the IRelation interface. This has got
|
||||||
|
two attributes ('first', 'second') for a dyadic relation) or three ('first',
|
||||||
|
'second', 'third') for a triadic relation. (You may ignore triadic relations if
|
||||||
|
you don't think you need them.)
|
||||||
|
|
||||||
|
If I now create corresponding classes (DyadicRelation, TriadicRelation) I
|
||||||
|
can store the objects taking part in a relation directly in these
|
||||||
|
attributes of my relation objects. (Note that the objects taking part in
|
||||||
|
a relation are not touched at all.) In fact I create a class for each kind
|
||||||
|
of relation (each relationship or predicate or whatever you like to call it)
|
||||||
|
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.
|
||||||
|
|
||||||
|
This has three methods:
|
||||||
|
|
||||||
|
- register(relation)
|
||||||
|
- unregister(relation)
|
||||||
|
- query(**kw)
|
||||||
|
|
||||||
|
The keyword arguments to the query() method may be:
|
||||||
|
|
||||||
|
- relationship=... - a relation class (we can also work with named predicates,
|
||||||
|
see below)
|
||||||
|
- first=... - an object
|
||||||
|
- second=... - an object
|
||||||
|
- third=... - an object
|
||||||
|
|
||||||
|
One can combine those arguments at will to search for all relations of the
|
||||||
|
relation class specified (if given) with the given values for the attributes.
|
||||||
|
The list may be extended if you use relation classes with additionsl
|
||||||
|
attributes you want to search for.
|
||||||
|
|
||||||
|
(For details have a look at the file README.txt)
|
||||||
|
|
||||||
|
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).
|
||||||
|
|
||||||
|
OK, so the RelationsRegistry 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
|
||||||
|
themselves. The relationship is mapped to the full module path + class name of
|
||||||
|
the relation class.
|
||||||
|
|
||||||
|
An interesting consequence of this is that the relation objects are not
|
||||||
|
expllicitly stored somewhere, the only reference to them is via the IntIds
|
||||||
|
utility. You may of course store them in some container or even make them
|
||||||
|
first class content objects if you want.
|
||||||
|
|
||||||
|
The whole stuff is flexible enough to be extended as needed, e.g. with special
|
||||||
|
registry classes used via named utilities (or even specialized registry
|
||||||
|
interfaces), additional attributes on relations (easily indexable in the
|
||||||
|
registry); it could be wrapped in a richer and more application-oriented
|
||||||
|
API, etc.
|
||||||
|
|
||||||
|
It is also possible to use named predicates (with URIs or strings like
|
||||||
|
'_ is child of _') instead of different relation classes to represent
|
||||||
|
relationships (this is shown by an example at the end of the README.txt).
|
||||||
|
|
Loading…
Add table
Reference in a new issue