1 import re
2
3 PATTERN_STR = "^(?:\w+\.)*\w+$"
4 PATH_PATTERN = re.compile(PATTERN_STR)
8 if path is None:
9 raise ValueError("path must not be None")
10 try:
11 path = path.name
12 except:
13 pass
14 if not PATH_PATTERN.match(path):
15 raise TypeError(
16 "Path '" + path + "' does not match expected pattern" + PATTERN_STR)
17 self.path = path
19 return "<" + self.__class__.__name__ + ": " + self.to_string() + ">"
23 return { 'path' : self.path }
24 @property
26 raise AttributeError()
27
28 -class Join(PathFeature):
29 valid_join_styles = ['OUTER', 'INNER']
30 INNER = "INNER"
31 OUTER = "OUTER"
32 child_type = 'join'
33 - def __init__(self, path, style='OUTER'):
34 if style.upper() not in Join.valid_join_styles:
35 raise TypeError("Unknown join style: " + style)
36 self.style = style.upper()
37 super(Join, self).__init__(path)
39 d = super(Join, self).to_dict()
40 d.update(style=self.style)
41 return d
43 return('<' + self.__class__.__name__
44 + ' '.join([':', self.path, self.style]) + '>')
45
55
57 ASC = "asc"
58 DESC = "desc"
59 DIRECTIONS = frozenset(["asc", "desc"])
61 try:
62 order = order.lower()
63 except:
64 pass
65
66 if not order in self.DIRECTIONS:
67 raise TypeError("Order must be one of " + str(self.DIRECTIONS)
68 + " - not " + order)
69 self.order = order
70 super(SortOrder, self).__init__(path)
72 return self.path + " " + self.order
75
77 """
78 A container implementation for holding sort orders
79 ==================================================
80
81 This class exists to hold the sort order information for a
82 query. It handles appending elements, and the stringification
83 of the sort order.
84 """
86 self.sort_orders = []
87 self.append(*sos)
89 """
90 Add sort order elements to the sort order list.
91 ===============================================
92
93 Elements can be provided as a SortOrder object or
94 as a tuple of arguments (path, direction).
95 """
96 for so in sos:
97 if isinstance(so, SortOrder):
98 self.sort_orders.append(so)
99 elif isinstance(so, tuple):
100 self.sort_orders.append(SortOrder(*so))
101 else:
102 raise TypeError(
103 "Sort orders must be either SortOrder instances,"
104 + " or tuples of arguments: I got:" + so + sos)
106 return '<' + self.class__.__name__ + ': [' + str(self) + ']>'
108 return " ".join(map(str, self.sort_orders))
110 self.sort_orders = []
112 return len(self.sort_orders) == 0
114 return len(self.sort_orders)
116 return self.sort_orders.next()
118 return iter(self.sort_orders)
119