cybertools/relation/interfaces.py
helmutm 2e4f320fe7 added order and relevance attributes to Relation class
git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@2138 fd906abe-77d9-0310-91a1-e0d9ade77398
2007-11-01 20:57:34 +00:00

171 lines
5.6 KiB
Python

#
# Copyright (c) 2005 Helmut Merz helmutm@cy55.de
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
"""
interface definitions for the Relations utility and relation objects.
$Id$
"""
from zope.interface import Interface, Attribute
from zope.component.interfaces import IObjectEvent
# relation interfaces
class IRelation(Interface):
""" Base interface for relations.
"""
order = Attribute('An integer that may be used for ordering relations. '
'The default should be 0, and there may be negative and '
'positive values.')
relevance = Attribute('A float greater than 0.0 and less or equal to '
'1.0 denoting the importance, relevance, or weight of a '
'relation. The default and standard value should be 1.0.')
def getPredicateName():
""" Return the predicate of this relation as a string that may be
used for indexing.
"""
def validate(registry=None):
""" Return True if this relation is valid.
If the registry argument is provided the check should be done
with respect to this relation registry. The validate() method
may be used for implementing checks against ontologies or other
kinds of restrictions.
"""
class IMonadicRelation(IRelation):
""" Relation with just one object.
While a monadic relation could be easily represented by an attribute
or an annotation, monadic relations are e.g. useful when working with
an ontology-driven higher-level relation framework.
"""
first = Attribute('First and only object that belongs to the relation.')
class IDyadicRelation(IRelation):
""" Relation connecting two objects.
"""
first = Attribute('First object that belongs to the relation.')
second = Attribute('Second object that belongs to the relation.')
class ITriadicRelation(IDyadicRelation):
""" Relation connecting three objects.
"""
third = Attribute('Third object that belongs to the relation.')
# this is just a conceptual try - thinking about storing
# relations as attributes...
class IAttributeRelation(IDyadicRelation):
""" A type of relation that will be stored in attributes of the
objects that take part in the relation. You have to use a
relation registry that provides IAttributeRelationRegistry
for registering/managing relations of this type.
"""
attributeNameFirst = Attribute('Name of the attribute in which the '
'relation will be stored on the `first` object. '
'Typically a class attribute.')
attributeNameSecond = Attribute('Name of the attribute in which the '
'relation will be stored on the `second` object.'
'Typically a class attribute.')
class IPredicate(Interface):
""" A predicate signifies a relationship. This may be implemented
directly as a relation class, or the relation object may
hold the predicate as an attribute.
"""
def getPredicateName():
""" Return this predicate as a string that may be used for indexing.
"""
# event interfaces
class IRelationInvalidatedEvent(IObjectEvent):
""" This event fires when a relation is invalidated, typically because
an object that is involved in the relation is removed.
"""
# marker interfaces
class IRelatable(Interface):
""" Marker interface for objects that may have relations associated
with them. Should be checked by IRelationRegistry.register()
and event handlers.
"""
# relation registry interfaces
class IRelationRegistryUpdate(Interface):
""" Interface for registering and unregistering relations with a
relation registry.
"""
def register(relation):
""" Register the relation given with this registry.
"""
def unregister(relation):
""" Remove the relation given from this registry.
"""
def getUniqueIdForObject(object):
""" Return an identifier for the object given that is unique at
least within the scope of this registry.
"""
class IRelationRegistryQuery(Interface):
""" Interface for querying a relation registry.
"""
def query(example=None, **kw):
""" Return a sequence of relations that fulfill the criteria given.
You may provide a relation object as an example that specifies the
search criteria, i.e. its predicate and first, second or third
attribute will be used for searching, or explicit criteria
via keyword arguments.
Example for using keyword criteria:
rr.queryRelations(first=someObject, second=anotherObject,
relationship=SomeRelationClass)
"""
class IRelationRegistry(IRelationRegistryUpdate, IRelationRegistryQuery):
""" A registry for registering and searching relations typically
implemented as a local utility .
"""