def agg_Count(a, group, bindings): c = 0 for x in group: try: if a.vars != '*': _eval(a.vars, x) c += 1 except: pass # simply dont count bindings[a.res] = Literal(c)
def agg_Count(a, group, bindings): c = 0 for x in group: try: if a.vars != '*': _eval(a.vars, x) c += 1 except: return # error in aggregate => no binding # pass # simply dont count bindings[a.res] = Literal(c)
def agg_Avg(a, group, bindings): c = 0 s = 0 dt = None for x in group: try: e = _eval(a.vars, x) n = numeric(e) if dt == None: dt = e.datatype else: dt = type_promotion(dt, e.datatype) if type(s) == float and type(n) == Decimal: s += float(n) elif type(n) == float and type(s) == Decimal: s = float(s) + n else: s += n c += 1 except: return # error in aggregate => no binding if c == 0: bindings[a.res] = Literal(0) if dt == XSD.float or dt == XSD.double: bindings[a.res] = Literal(s / c) else: bindings[a.res] = Literal(Decimal(s) / Decimal(c))
def agg_Sum(a, group, bindings): c = 0 for x in group: try: c += numeric(_eval(a.vars, x)) except: pass # simply dont count bindings[a.res] = Literal(c)
def evalGroup(ctx, group): """ http://www.w3.org/TR/sparql11-query/#defn_algGroup """ p = evalPart(ctx, group.p) if not group.expr: return {1: p} else: res = collections.defaultdict(list) for c in p: k = tuple(_eval(e, c) for e in group.expr) res[k].append(c) return res
def agg_Avg(a, group, bindings): c = 0 s = 0 for x in group: try: s += numeric(_eval(a.vars, x)) c += 1 except: pass # simply dont count if c == 0: bindings[a.res] = Literal(0) else: bindings[a.res] = Literal(Decimal(s) / Decimal(c))
def agg_Max(a, group, bindings): m = None for x in group: try: v = numeric(_eval(a.vars, x)) if m is None: m = v else: m = max(v, m) except: pass # simply dont count if m is not None: bindings[a.res] = Literal(m)
def agg_Max(a, group, bindings): m = None for x in group: try: v = numeric(_eval(a.vars, x)) if m is None: m = v else: m = num_max(v, m) except: return # error in aggregate => no binding if m is not None: bindings[a.res] = Literal(m)
def evalExtend(ctx, extend): # TODO: Deal with dict returned from evalPart from GROUP BY res = [] for c in evalPart(ctx, extend.p): try: e = _eval(extend.expr, c) if isinstance(e, SPARQLError): raise e res.append(c.merge({extend.var: e})) except SPARQLError: res.append(c) return res
def agg_Sum(a, group, bindings): c = 0 dt = None for x in group: try: e = _eval(a.vars, x) n = numeric(e) if dt == None: dt = e.datatype else: dt = type_promotion(dt, e.datatype) if type(c) == float and type(n) == Decimal: c += float(n) elif type(n) == float and type(c) == Decimal: c = float(c) + n else: c += n except: pass # simply dont count bindings[a.res] = Literal(c, datatype=dt)
def agg_Sample(a, group, bindings): try: bindings[a.res] = _eval(a.vars, iter(group).next()) except StopIteration: pass # no res
def _eval_rows(expr, group): for row in group: try: yield _eval(expr, row) except: pass