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 |