|
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__ |