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
64
66 """
67 A container implementation for holding sort orders
68 ==================================================
69
70 This class exists to hold the sort order information for a
71 query. It handles appending elements, and the stringification
72 of the sort order.
73 """
75 self.sort_orders = []
76 self.append(*sos)
78 """
79 Add sort order elements to the sort order list.
80 ===============================================
81
82 Elements can be provided as a SortOrder object or
83 as a tuple of arguments (path, direction).
84 """
85 for so in sos:
86 if isinstance(so, SortOrder):
87 self.sort_orders.append(so)
88 elif isinstance(so, tuple):
89 self.sort_orders.append(SortOrder(*so))
90 else:
91 raise TypeError(
92 "Sort orders must be either SortOrder instances,"
93 + " or tuples of arguments: I got:" + so + sos)
95 return '<' + self.class__.__name__ + ': [' + str(self) + ']>'
97 return ",".join(map(str, self.sort_orders))
101 return len(self.sort_orders) == 0
103 return len(self.sort_orders)
105 return self.sort_orders.next()
107 return iter(self.sort_orders)
108