rtags.py
branchtls-sprint
changeset 1721 694f6a50e138
parent 1548 bd225e776739
child 1723 30c3a713ab61
equal deleted inserted replaced
1720:14c9a0a1aca1 1721:694f6a50e138
    26     # dict compat
    26     # dict compat
    27     def __getitem__(self, key):
    27     def __getitem__(self, key):
    28         return self.get(*key)
    28         return self.get(*key)
    29     __contains__ = __getitem__
    29     __contains__ = __getitem__
    30 
    30 
    31     def _get_keys(self, rtype, tagged, stype, otype):
    31     def _get_tagged(self, stype, otype, tagged=None):
    32         assert tagged in ('subject', 'object'), tagged
    32         stype, otype = str(stype), str(otype)
       
    33         if tagged is None:
       
    34             if stype[0] == '!':
       
    35                 tagged = 'subject'
       
    36                 stype = stype[1:]
       
    37             elif otype[0] == '!':
       
    38                 tagged = 'object'
       
    39                 otype = otype[1:]
       
    40             else:
       
    41                 raise AssertionError('either stype or rtype should have the '
       
    42                                      'role mark ("!")')
       
    43         else:
       
    44             assert tagged in ('subject', 'object'), tagged
       
    45         return stype, otype, tagged
       
    46 
       
    47     def _get_keys(self, stype, rtype, otype, tagged=None):
       
    48         stype, otype, tagged = self._get_tagged(stype, otype, tagged)
    33         keys = [(rtype, tagged, '*', '*'),
    49         keys = [(rtype, tagged, '*', '*'),
    34                 (rtype, tagged, '*', otype),
    50                 (rtype, tagged, '*', otype),
    35                 (rtype, tagged, stype, '*'),
    51                 (rtype, tagged, stype, '*'),
    36                 (rtype, tagged, stype, otype)]
    52                 (rtype, tagged, stype, otype)]
    37         if stype == '*' or otype == '*':
    53         if stype == '*' or otype == '*':
    40                 keys.remove((rtype, tagged, '*', otype))
    56                 keys.remove((rtype, tagged, '*', otype))
    41             if otype == '*':
    57             if otype == '*':
    42                 keys.remove((rtype, tagged, stype, '*'))
    58                 keys.remove((rtype, tagged, stype, '*'))
    43         return keys
    59         return keys
    44 
    60 
    45     def tag_attribute(self, tag, stype, attr):
    61     def tag_relation(self, stype, rtype, otype, tag, tagged=None):
    46         self._tagdefs[(str(attr), 'subject', str(stype), '*')] = tag
    62         stype, otype, tagged = self._get_tagged(stype, otype, tagged)
       
    63         self._tagdefs[(str(rtype), tagged, stype, otype)] = tag
    47 
    64 
    48     def tag_relation(self, tag, relation, tagged):
    65     def tag_attribute(self, stype, attr, tag):
    49         assert tagged in ('subject', 'object'), tagged
    66         self.tag_relation(stype, attr, '*', tag, tagged)
    50         stype, rtype, otype = relation
       
    51         self._tagdefs[(str(rtype), tagged, str(stype), str(otype))] = tag
       
    52 
    67 
    53     def del_rtag(self, relation, tagged):
    68     def del_rtag(self, stype, rtype, otype):
    54         assert tagged in ('subject', 'object'), tagged
    69         stype, otype, tagged = self._get_tagged(stype, otype)
    55         stype, rtype, otype = relation
    70         del self._tagdefs[(str(rtype), tagged, stype, otype)]
    56         del self._tagdefs[(str(rtype), tagged, str(stype), str(otype))]
       
    57 
    71 
    58     def get(self, rtype, tagged, stype='*', otype='*'):
    72     def get(self, stype, rtype, otype, tagged=None):
    59         for key in reversed(self._get_keys(rtype, tagged, stype, otype)):
    73         for key in reversed(self._get_keys(stype, rtype, otype, tagged)):
    60             try:
    74             try:
    61                 return self._tagdefs[key]
    75                 return self._tagdefs[key]
    62             except KeyError:
    76             except KeyError:
    63                 continue
    77                 continue
    64         return None
    78         return None
    65 
    79 
    66     def etype_get(self, etype, rtype, tagged, ttype='*'):
    80     def etype_get(self, etype, rtype, role, ttype='*'):
    67         if tagged == 'subject':
    81         if role == 'subject':
    68             return self.get(rtype, tagged, etype, ttype)
    82             return self.get(etype, rtype, ttype, role)
    69         return self.get(rtype, tagged, ttype, etype)
    83         return self.get(ttype, rtype, etype, role)
    70 
    84 
    71 
    85 
    72 
    86 
    73 class RelationTagsSet(RelationTags):
    87 class RelationTagsSet(RelationTags):
    74     """This class associates a set of tags to each key."""
    88     """This class associates a set of tags to each key."""
    75 
    89 
    76     def tag_relation(self, tag, relation, tagged):
    90     def tag_relation(self, stype, rtype, otype, tag, tagged=None):
    77         assert tagged in ('subject', 'object'), tagged
    91         stype, otype, tagged = self._get_tagged(stype, otype, tagged)
    78         stype, rtype, otype = relation
       
    79         rtags = self._tagdefs.setdefault((rtype, tagged, stype, otype), set())
    92         rtags = self._tagdefs.setdefault((rtype, tagged, stype, otype), set())
    80         rtags.add(tag)
    93         rtags.add(tag)
    81 
    94 
    82     def get(self, rtype, tagged, stype='*', otype='*'):
    95     def get(self, stype, rtype, otype, tagged=None):
    83         rtags = set()
    96         rtags = set()
    84         for key in self._get_keys(rtype, tagged, stype, otype):
    97         for key in self._get_keys(stype, rtype, otype, tagged):
    85             try:
    98             try:
    86                 rtags.update(self._tagdefs[key])
    99                 rtags.update(self._tagdefs[key])
    87             except KeyError:
   100             except KeyError:
    88                 continue
   101                 continue
    89         return rtags
   102         return rtags