1 import re
2
3 PATTERN_STR = "^(?:\w+\.)*\w+$"
4 PATH_PATTERN = re.compile(PATTERN_STR)
8 if not PATH_PATTERN.match(path):
9 raise TypeError(
10 "Path '" + path + "' does not match expected pattern" + PATTERN_STR)
11 self.path = path
13 return "<" + self.__class__.__name__ + ": " + self.to_string() + ">"
17 return { 'path' : self.path }
18 @property
20 raise AttributeError()
21
22 -class Join(PathFeature):
23 valid_join_styles = ['OUTER', 'INNER']
24 INNER = "INNER"
25 OUTER = "OUTER"
26 child_type = 'join'
27 - def __init__(self, path, style='OUTER'):
28 if style.upper() not in Join.valid_join_styles:
29 raise TypeError("Unknown join style: " + style)
30 self.style = style.upper()
31 super(Join, self).__init__(path)
33 d = super(Join, self).to_dict()
34 d.update(style=self.style)
35 return d
37 return('<' + self.__class__.__name__
38 + ' '.join([':', self.path, self.style]) + '>')
39
49
51 ASC = "asc"
52 DESC = "desc"
53 DIRECTIONS = frozenset(["asc", "desc"])
55 if not order in self.DIRECTIONS:
56 raise TypeError("Order must be one of " + str(self.DIRECTIONS)
57 + " - not " + order)
58 self.order = order
59 super(SortOrder, self).__init__(path)
61 return self.path + " " + self.order
66 self.sort_orders = []
67 self.append(*sos)
69 for so in sos:
70 if isinstance(so, SortOrder):
71 self.sort_orders.append(so)
72 elif isinstance(so, tuple):
73 self.sort_orders.append(SortOrder(*so))
74 else:
75 raise TypeError(
76 "Sort orders must be either SortOrder instances,"
77 + " or tuples of arguments: I got:" + so + sos)
79 return '<' + self.class__.__name__ + ': [' + str(self) + ']>'
81 return ",".join(map(str, self.sort_orders))
85 return len(self.sort_orders) == 0
87 return self.sort_orders.next()
89 return iter(self.sort_orders)
90