示例#1
0
 def update(self, row, aggregator):
     try:
         if self.value is None:
             self.value = _eval(self.expr, row)
         else:
             # self.compare is implemented by Minimum/Maximum
             self.value = self.compare(self.value, _eval(self.expr, row))
     # skip UNDEF or BNode => SPARQLTypeError
     except NotBoundError:
         pass
     except SPARQLTypeError:
         pass
示例#2
0
 def update(self, row, aggregator):
     try:
         if self.value is None:
             self.value = _eval(self.expr, row)
         else:
             # self.compare is implemented by Minimum/Maximum
             self.value = self.compare(self.value, _eval(self.expr, row))
     # skip UNDEF or BNode => SPARQLTypeError
     except NotBoundError:
         pass
     except SPARQLTypeError:
         pass
示例#3
0
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)
示例#4
0
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)
示例#5
0
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))
示例#6
0
def agg_Sample(a, group, bindings):
    for ctx in group:
        try:
            bindings[a.res] = _eval(a.vars, ctx)
            break
        except NotBoundError:
            pass
示例#7
0
def evalAggregateJoin(ctx, agg):
    # import pdb ; pdb.set_trace()
    p = evalPart(ctx, agg.p)
    # p is always a Group, we always get a dict back

    group_expr = agg.p.expr
    res = collections.defaultdict(lambda: Aggregator(aggregations=agg.A))

    if group_expr is None:
        # no grouping, just COUNT in SELECT clause
        # get 1 aggregator for counting
        aggregator = res[True]
        for row in p:
            aggregator.update(row)
    else:
        for row in p:
            # determine right group aggregator for row
            k = tuple(_eval(e, row, False) for e in group_expr)
            res[k].update(row)

    # all rows are done; yield aggregated values
    for aggregator in itervalues(res):
        yield FrozenBindings(ctx, aggregator.get_bindings())

    # there were no matches
    if len(res) == 0:
        yield FrozenBindings(ctx)
示例#8
0
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))
示例#9
0
文件: evaluate.py 项目: RDFLib/rdflib
def evalAggregateJoin(ctx, agg):
    # import pdb ; pdb.set_trace()
    p = evalPart(ctx, agg.p)
    # p is always a Group, we always get a dict back

    group_expr = agg.p.expr
    res = collections.defaultdict(lambda: Aggregator(aggregations=agg.A))

    if group_expr is None:
        # no grouping, just COUNT in SELECT clause
        # get 1 aggregator for counting
        aggregator = res[True]
        for row in p:
            aggregator.update(row)
    else:
        for row in p:
            # determine right group aggregator for row
            k = tuple(_eval(e, row, False) for e in group_expr)
            res[k].update(row)

    # all rows are done; yield aggregated values
    for aggregator in itervalues(res):
        yield FrozenBindings(ctx, aggregator.get_bindings())

    # there were no matches
    if len(res) == 0:
        yield FrozenBindings(ctx)
示例#10
0
 def update(self, row, aggregator):
     try:
         # set the value now
         aggregator.bindings[self.var] = _eval(self.expr, row)
         # and skip this accumulator for future rows
         del aggregator.accumulators[self.var]
     except NotBoundError:
         pass
示例#11
0
 def update(self, row, aggregator):
     try:
         # set the value now
         aggregator.bindings[self.var] = _eval(self.expr, row)
         # and skip this accumulator for future rows
         del aggregator.accumulators[self.var]
     except NotBoundError:
         pass
示例#12
0
 def update(self, row, aggregator):
     try:
         value = _eval(self.expr, row)
         self.value.append(value)
         if self.distinct:
             self.seen.add(value)
     # skip UNDEF
     except NotBoundError:
         pass
示例#13
0
 def update(self, row, aggregator):
     try:
         value = _eval(self.expr, row)
         self.value.append(value)
         if self.distinct:
             self.seen.add(value)
     # skip UNDEF
     except NotBoundError:
         pass
示例#14
0
def _eval_rows(expr, group, distinct):
    seen = set()
    for row in group:
        try:
            val = _eval(expr, row)
            if not distinct or not val in seen:
                yield val
                seen.add(val)
        except:
            pass
示例#15
0
def evalExtend(ctx, extend):
    # TODO: Deal with dict returned from evalPart from GROUP BY

    for c in evalPart(ctx, extend.p):
        try:
            e = _eval(extend.expr, c.forget(ctx))
            if isinstance(e, SPARQLError):
                raise e

            yield c.merge({extend.var: e})

        except SPARQLError:
            yield c
示例#16
0
def evalExtend(ctx, extend):
    # TODO: Deal with dict returned from evalPart from GROUP BY

    for c in evalPart(ctx, extend.p):
        try:
            e = _eval(extend.expr, c.forget(ctx))
            if isinstance(e, SPARQLError):
                raise e

            yield c.merge({extend.var: e})

        except SPARQLError:
            yield c
示例#17
0
def evalGroup(ctx, group):
    """
    http://www.w3.org/TR/sparql11-query/#defn_algGroup
    """

    p = evalPart(ctx, group.p)
    if not group.expr:
        return {1: list(p)}
    else:
        res = collections.defaultdict(list)
        for c in p:
            k = tuple(_eval(e, c, False) for e in group.expr)
            res[k].append(c)
        return res
示例#18
0
 def update(self, row, aggregator):
     try:
         value = _eval(self.expr, row)
         dt = self.datatype
         if dt is None:
             dt = value.datatype
         else:
             dt = type_promotion(dt, value.datatype)
         self.datatype = dt
         self.value = sum(type_safe_numbers(self.value, numeric(value)))
         if self.distinct:
             self.seen.add(value)
     except NotBoundError:
         # skip UNDEF
         pass
示例#19
0
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)
示例#20
0
 def update(self, row, aggregator):
     try:
         value = _eval(self.expr, row)
         dt = self.datatype
         if dt is None:
             dt = value.datatype
         else:
             dt = type_promotion(dt, value.datatype)
         self.datatype = dt
         self.value = sum(type_safe_numbers(self.value, numeric(value)))
         if self.distinct:
             self.seen.add(value)
     except NotBoundError:
         # skip UNDEF
         pass
示例#21
0
def evalGroup(ctx, group):

    """
    http://www.w3.org/TR/sparql11-query/#defn_algGroup
    """

    p = evalPart(ctx, group.p)
    if not group.expr:
        return {1: list(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
示例#22
0
def agg_Count(a, group, bindings):

    c = 0
    for x in group:
        try:
            if a.vars != '*':
                val = _eval(a.vars, x)
                if isinstance(val, NotBoundError):
                    continue
            c += 1
        except:
            return  # error in aggregate => no binding
            # pass  # simply dont count

    bindings[a.res] = Literal(c)
示例#23
0
def agg_Count(a, group, bindings):

    c = 0
    for x in group:
        try:
            if a.vars != '*':
                val = _eval(a.vars, x)
                if isinstance(val, NotBoundError):
                    continue
            c += 1
        except:
            return  # error in aggregate => no binding
            # pass  # simply dont count

    bindings[a.res] = Literal(c)
示例#24
0
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)
示例#25
0
 def update(self, row, aggregator):
     try:
         value = _eval(self.expr, row)
         dt = self.datatype
         self.sum = sum(type_safe_numbers(self.sum, numeric(value)))
         if dt is None:
             dt = value.datatype
         else:
             dt = type_promotion(dt, value.datatype)
         self.datatype = dt
         if self.distinct:
             self.seen.add(value)
         self.counter += 1
     # skip UNDEF or BNode => SPARQLTypeError
     except NotBoundError:
         pass
     except SPARQLTypeError:
         pass
示例#26
0
 def update(self, row, aggregator):
     try:
         value = _eval(self.expr, row)
         dt = self.datatype
         self.sum = sum(type_safe_numbers(self.sum, numeric(value)))
         if dt is None:
             dt = value.datatype
         else:
             dt = type_promotion(dt, value.datatype)
         self.datatype = dt
         if self.distinct:
             self.seen.add(value)
         self.counter += 1
     # skip UNDEF or BNode => SPARQLTypeError
     except NotBoundError:
         pass
     except SPARQLTypeError:
         pass
示例#27
0
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)
示例#28
0
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)
示例#29
0
def agg_Sample(a, group, bindings):
    try:
        bindings[a.res] = _eval(a.vars, next(iter(group)))
    except StopIteration:
        pass  # no res
示例#30
0
def agg_Sample(a, group, bindings):
    for ctx in group:
        val = _eval(a.vars, ctx)
        if not isinstance(val, NotBoundError):
            bindings[a.res] = val
            break
示例#31
0
def _eval_rows(expr, group):
    for row in group:
        try:
            yield _eval(expr, row)
        except:
            pass
示例#32
0
 def eval_row(self, row):
     return _eval(self.expr, row)
示例#33
0
 def use_row(self, row):
     """tests distinct with set"""
     return _eval(self.expr, row) not in self.seen
示例#34
0
 def use_row(self, row):
     """tests distinct with set """
     return _eval(self.expr, row) not in self.seen
示例#35
0
 def eval_row(self, row):
     return _eval(self.expr, row)
示例#36
0
def agg_Sample(a, group, bindings):
    try:
        bindings[a.res] = _eval(a.vars, next(iter(group)))
    except StopIteration:
        pass  # no res
示例#37
0
def agg_Sample(a, group, bindings):
    for ctx in group:
        val = _eval(a.vars, ctx)
        if not isinstance(val, NotBoundError):
            bindings[a.res] = val
            break
示例#38
0
def _eval_rows(expr, group):
    for row in group:
        try:
            yield _eval(expr, row)
        except:
            pass