20 |
20 |
21 def __init__(self, use_set=False): |
21 def __init__(self, use_set=False): |
22 self.use_set = use_set |
22 self.use_set = use_set |
23 self._tagdefs = {} |
23 self._tagdefs = {} |
24 |
24 |
25 def set_rtag(self, tag, role, rtype, stype='*', otype='*'): |
25 def set_rtag(self, tag, rtype, role, stype='*', otype='*'): |
26 assert not self.use_set |
26 assert not self.use_set |
27 assert role in ('subject', 'object'), role |
27 assert role in ('subject', 'object'), role |
28 self._tagdefs[(stype, rtype, otype, role)] = tag |
28 self._tagdefs[(rtype, role, stype, otype)] = tag |
29 |
29 |
30 def rtag(self, role, rtype, stype='*', otype='*'): |
30 def rtag(self, rtype, role, stype='*', otype='*'): |
31 assert not self.use_set |
31 assert not self.use_set |
32 for key in reversed(self._get_keys(role, rtype, stype, otype)): |
32 for key in reversed(self._get_keys(rtype, role, stype, otype)): |
33 try: |
33 try: |
34 return self._tagdefs[key] |
34 return self._tagdefs[key] |
35 except KeyError: |
35 except KeyError: |
36 continue |
36 continue |
37 return None |
37 return None |
38 |
38 |
39 def etype_rtag(self, etype, role, rtype, ttype='*'): |
39 def etype_rtag(self, etype, rtype, role, ttype='*'): |
40 if role == 'subject': |
40 if role == 'subject': |
41 return self.rtag(role, rtype, etype, ttype) |
41 return self.rtag(rtype, role, etype, ttype) |
42 return self.rtag(role, rtype, ttype, etype) |
42 return self.rtag(rtype, role, ttype, etype) |
43 |
43 |
44 def add_rtag(self, tag, role, rtype, stype='*', otype='*'): |
44 def add_rtag(self, tag, rtype, role, stype='*', otype='*'): |
45 assert self.use_set |
45 assert self.use_set |
46 assert role in ('subject', 'object'), role |
46 assert role in ('subject', 'object'), role |
47 rtags = self._tagdefs.setdefault((stype, rtype, otype, role), set()) |
47 rtags = self._tagdefs.setdefault((rtype, role, stype, otype), set()) |
48 rtags.add(tag) |
48 rtags.add(tag) |
49 |
49 |
50 def rtags(self, role, rtype, stype='*', otype='*'): |
50 def rtags(self, rtype, role, stype='*', otype='*'): |
51 assert self.use_set |
51 assert self.use_set |
52 rtags = set() |
52 rtags = set() |
53 for key in self._get_keys(role, rtype, stype, otype): |
53 for key in self._get_keys(rtype, role, stype, otype): |
54 try: |
54 try: |
55 rtags.update(self._tagdefs[key]) |
55 rtags.update(self._tagdefs[key]) |
56 except KeyError: |
56 except KeyError: |
57 continue |
57 continue |
58 return rtags |
58 return rtags |
59 |
59 |
60 def etype_rtags(self, etype, role, rtype, ttype='*'): |
60 def etype_rtags(self, etype, rtype, role, ttype='*'): |
61 if role == 'subject': |
61 if role == 'subject': |
62 return self.rtags(role, rtype, etype, ttype) |
62 return self.rtags(rtype, role, etype, ttype) |
63 return self.rtags(role, rtype, ttype, etype) |
63 return self.rtags(rtype, role, ttype, etype) |
64 |
64 |
65 def _get_keys(self, role, rtype, stype, otype): |
65 def _get_keys(self, rtype, role, stype, otype): |
66 assert role in ('subject', 'object'), role |
66 assert role in ('subject', 'object'), role |
67 keys = [('*', rtype, '*', role), |
67 keys = [(rtype, role, '*', '*'), |
68 ('*', rtype, otype, role), |
68 (rtype, role, '*', otype), |
69 (stype, rtype, '*', role), |
69 (rtype, role, stype, '*'), |
70 (stype, rtype, otype, role)] |
70 (rtype, role, stype, otype)] |
71 if stype == '*' or otype == '*': |
71 if stype == '*' or otype == '*': |
72 keys.remove(('*', rtype, '*', role)) |
72 keys.remove((rtype, role, '*', '*')) |
73 if stype == '*': |
73 if stype == '*': |
74 keys.remove(('*', rtype, otype, role)) |
74 keys.remove((rtype, role, '*', otype)) |
75 if otype == '*': |
75 if otype == '*': |
76 keys.remove((stype, rtype, '*', role)) |
76 keys.remove((rtype, role, stype, '*')) |
77 return keys |
77 return keys |
78 |
78 |
79 # dict compat |
79 # dict compat |
80 def __getitem__(self, key): |
80 def __getitem__(self, key): |
81 if isinstance(key, basestring): |
81 if isinstance(key, basestring): |