def tokenize(self, name): query = self.get_query_string(name) or '' for chunk in bssplit(query, '/'): if not chunk: continue tokens = bssplit(chunk, ':') cmd = tokens.pop(0) if not hasattr(self, cmd): raise errors.QueryError("unknown command: '%s'" % cmd) yield cmd, list(map(bsunescape, tokens))
def _make_filter_predicate(self, slice): """Return a predicate to filter on the unrolled slice.""" qnew = self.query qold = slice.query idxs = [] ops = [] vs = [] for name, op, value in qnew.filters: if (name, op, value) in qold.filters: # the slice is already filtered on this value continue try: op = _op_map[op] except KeyError: raise errors.QueryError("unknown operator: '%s'" % op) # we know for compatibility that the filter is on one of the slice axes idxs.append(qold.axes.index(name)) ops.append(op) vs.append(value) if not idxs: return None L = len(idxs) assert L == len(ops) == len(vs) d = locals() exec( dedent( """ def p(kv, %(idxs)s, %(vs)s, %(ops)s): key = kv[0] return %(ps)s """ % { 'idxs': ', '.join('idx%d=idxs[%d]' % (i, i) for i in xrange(L)), 'vs': ', '.join('v%d=vs[%d]' % (i, i) for i in xrange(L)), 'ops': ', '.join('op%d=ops[%d]' % (i, i) for i in xrange(L)), 'ps': ' and '.join('op%d(key[idx%d], v%d)' % (i, i, i) for i in xrange(L)), }), d) p = d['p'] return p
def f(self, query, *args): # the filter syntax is # f:LABEL:OP:VALUE1[:VALUE2...] # f:LABEL:VALUE (implies OP = eq) if len(args) == 2: name, value = args op = 'eq' elif len(args) == 3: name, op, value = args if op in MULTI_ARG_OPS: value = (value,) elif len(args) >= 3: name, op = args[:2] value = args[2:] if op not in MULTI_ARG_OPS: raise errors.QueryError( "bad number of arguments for operator '%s': %d" % (op, len(args) - 2)) else: raise errors.QueryError( "bad number of arguments for a filter: %d" % len(args)) # i have name, op, value here # value is a tuple for MULTI_ARG_OPS, a string for the others label = self.cubedef.get_label(name) if isinstance(value, tuple): value = frozenset(label.parse(ensure_unicode(v)) for v in value) else: value = label.parse(ensure_unicode(value)) return query.add_filter(name, value, operator=op)
def _make_filter_predicate(query, cubedef): es = [] ops = [] vs = [] for name, op, value in query.filters: try: op = _op_map[op] except KeyError: raise errors.QueryError("unknown operator: '%s'" % op) es.append(cubedef.get_label(name).extract) ops.append(op) vs.append(value) if not es: return None L = len(es) assert L == len(ops) == len(vs) d = locals() exec( dedent( """ def p(record, %(es)s, %(vs)s, %(ops)s): return %(ps)s """ % { 'es': ', '.join('e%d=es[%d]' % (i, i) for i in xrange(L)), 'vs': ', '.join('v%d=vs[%d]' % (i, i) for i in xrange(L)), 'ops': ', '.join('op%d=ops[%d]' % (i, i) for i in xrange(L)), 'ps': ' and '.join('op%d(e%d(record), v%d)' % (i, i, i) for i in xrange(L)), }), d) p = d['p'] return p
def __init__(self, table): super(TablePivot, self).__init__(table) self.pivot_labels = list(self.nav.pivot) for l in self.pivot_labels: if not l.allow_pivot: raise errors.QueryError("can't pivot on %s" % l.name)