Ejemplo n.º 1
0
	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))
Ejemplo n.º 2
0
    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
Ejemplo n.º 3
0
	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)
Ejemplo n.º 4
0
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
Ejemplo n.º 5
0
 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)