rtags.py
branchtls-sprint
changeset 1148 55a8238f8f7c
child 1152 c99ef2a2535c
equal deleted inserted replaced
1147:402e8a8b1d6a 1148:55a8238f8f7c
       
     1 
       
     2 class RelationTags(object):
       
     3 
       
     4     def __init__(self, use_set=False):
       
     5         self.use_set = use_set
       
     6         self._tagdefs = {}
       
     7         
       
     8     def set_rtag(self, tag, role, rtype, stype='*', otype='*'):
       
     9         assert not self.use_set
       
    10         assert role in ('subject', 'object'), role
       
    11         self._tagdefs[(stype, rtype, otype, role)] = tag
       
    12         
       
    13     def rtag(self, role, rtype, stype='*', otype='*'):
       
    14         assert not self.use_set
       
    15         for key in reversed(self._get_keys(role, rtype, stype, otype)):
       
    16             try:
       
    17                 return self._tagdefs[key]
       
    18             except KeyError:
       
    19                 continue
       
    20         return None
       
    21         
       
    22     def etype_rtag(self, etype, role, rtype, ttype='*'):
       
    23         if role == 'subject':
       
    24             return self.rtag(role, rtype, etype, ttype)
       
    25         return self.rtag(role, rtype, ttype, etype)
       
    26         
       
    27     def add_rtag(self, tag, role, rtype, stype='*', otype='*'):
       
    28         assert self.use_set
       
    29         assert role in ('subject', 'object'), role
       
    30         rtags = self._tagdefs.setdefault((stype, rtype, otype, role), set())
       
    31         rtags.add(tag)
       
    32         
       
    33     def rtags(self, role, rtype, stype='*', otype='*'):
       
    34         assert self.use_set
       
    35         rtags = set()
       
    36         for key in self._get_keys(role, rtype, stype, otype):
       
    37             try:
       
    38                 rtags.update(self._tagdefs[key])
       
    39             except KeyError:
       
    40                 continue
       
    41         return rtags
       
    42         
       
    43     def etype_rtags(self, etype, role, rtype, ttype='*'):
       
    44         if role == 'subject':
       
    45             return self.rtags(role, rtype, etype, ttype)
       
    46         return self.rtags(role, rtype, ttype, etype)
       
    47 
       
    48     def _get_keys(self, role, rtype, stype, otype): 
       
    49         assert role in ('subject', 'object'), role
       
    50         keys = [('*', rtype, '*', role),
       
    51                 ('*', rtype, otype, role),
       
    52                 (stype, rtype, '*', role),
       
    53                 (stype, rtype, otype, role)]
       
    54         if stype == '*' or otype == '*':
       
    55             keys.remove(('*', rtype, '*', role))
       
    56             if stype == '*':
       
    57                 keys.remove(('*', rtype, otype, role))
       
    58             if otype == '*':
       
    59                 keys.remove((stype, rtype, '*', role))            
       
    60         return keys
       
    61     
       
    62     # dict compat
       
    63     def __getitem__(self, key):
       
    64         if isinstance(key, basestring):
       
    65             key = (key,)
       
    66         return self.rtags(*key)
       
    67 
       
    68     __contains__ = __getitem__