use of org.apache.jena.sparql.expr.ExprAggregator in project jena by apache.
the class Query method allocAggregate.
public Expr allocAggregate(Aggregator agg) {
// We need to track the aggregators in case one aggregator is used twice, e.g. in HAVING and in SELECT expression
// (is that much harm to do twice? Yes, if distinct.)
String key = agg.key();
Var v = aggregatorsAllocated.get(key);
if (v != null) {
ExprAggregator eAgg = aggregatorsMap.get(v);
if (!agg.equals(eAgg.getAggregator()))
Log.warn(Query.class, "Internal inconsistency: Aggregator: " + agg);
return eAgg;
}
// Allocate.
v = allocInternVar();
ExprAggregator aggExpr = new ExprAggregator(v, agg);
aggregatorsAllocated.put(key, v);
aggregatorsMap.put(v, aggExpr);
aggregators.add(aggExpr);
return aggExpr;
}
use of org.apache.jena.sparql.expr.ExprAggregator in project jena by apache.
the class OpRewriter method visit.
@Override
public void visit(OpGroup opGroup) {
opGroup.getSubOp().visit(this);
ExprRewriter expRewriter = new ExprRewriter(values);
VarExprList groupVars = rewrite(opGroup.getGroupVars());
List<ExprAggregator> aggregators = new ArrayList<>();
for (ExprAggregator ea : opGroup.getAggregators()) {
ea.visit(expRewriter);
aggregators.add((ExprAggregator) expRewriter.pop());
}
push(new OpGroup(pop(), groupVars, aggregators));
}
use of org.apache.jena.sparql.expr.ExprAggregator in project jena by apache.
the class AggregationHandler method add.
/**
* Add and expression aggregator and variable to the mapping.
*
* if the expr parameter is not an instance of ExprAggregator then no action is taken.
*
* @param expr The expression to add.
* @param var The variable that it is bound to.
*/
public void add(Expr expr, Var var) {
if (expr instanceof ExprAggregator) {
ExprAggregator eAgg = (ExprAggregator) expr;
Expr expr2 = query.allocAggregate(eAgg.getAggregator());
aggMap.put(var, (ExprAggregator) expr2);
}
}
use of org.apache.jena.sparql.expr.ExprAggregator in project jena by apache.
the class QueryIterGroup method calc.
private static Iterator<Binding> calc(final QueryIterator iter, final VarExprList groupVarExpr, final List<ExprAggregator> aggregators, final ExecutionContext execCxt) {
return new IteratorDelayedInitialization<Binding>() {
@Override
protected Iterator<Binding> initializeIterator() {
boolean noAggregators = (aggregators == null || aggregators.isEmpty());
// Phase 1 : assign bindings to buckets by key and pump through the aggregators.
Multimap<Binding, Pair<Var, Accumulator>> accumulators = HashMultimap.create();
while (iter.hasNext()) {
Binding b = iter.nextBinding();
Binding key = genKey(groupVarExpr, b, execCxt);
if (noAggregators) {
// Put in a dummy to remember the input.
accumulators.put(key, placeholder);
continue;
}
// Create if does not exist.
if (!accumulators.containsKey(key)) {
for (ExprAggregator agg : aggregators) {
Accumulator x = agg.getAggregator().createAccumulator();
Var v = agg.getVar();
accumulators.put(key, Pair.create(v, x));
}
}
// Do the per-accumulator calculation.
for (Pair<Var, Accumulator> pair : accumulators.get(key)) pair.getRight().accumulate(b, execCxt);
}
if (accumulators.isEmpty()) {
if (noAggregators) {
// ==> No result rows.
return Iter.nullIterator();
}
BindingMap binding = BindingFactory.create();
for (ExprAggregator agg : aggregators) {
Var v = agg.getVar();
Node value = agg.getAggregator().getValueEmpty();
if (value != null) {
binding.add(v, value);
}
}
if (binding == null)
// This does not happen if there are any aggregators.
return Iter.nullIterator();
// cast to get the static type inference to work.
return Iter.singletonIter((Binding) binding);
}
if (noAggregators)
// We used placeholder so there are always the key.
return accumulators.keySet().iterator();
List<Binding> results = new ArrayList<>();
for (Binding k : accumulators.keySet()) {
Collection<Pair<Var, Accumulator>> accs = accumulators.get(k);
BindingMap b = BindingFactory.create(k);
for (Pair<Var, Accumulator> pair : accs) {
Var v = pair.getLeft();
NodeValue value = pair.getRight().getValue();
Node n = (value == null) ? null : value.asNode();
if (v == null || n == null) {
} else
b.add(v, n);
}
results.add(b);
}
return results.iterator();
}
};
}
use of org.apache.jena.sparql.expr.ExprAggregator in project jena by apache.
the class SelectHandlerTest method testAddAggregateStringVar.
@Test
public void testAddAggregateStringVar() {
Var v = Var.alloc("foo");
handler.addVar("count(*)", v);
VarExprList expr = query.getProject();
assertEquals(1, expr.size());
Expr e = expr.getExpr(Var.alloc("foo"));
assertNotNull("expression should not be null", e);
assertTrue("Should be an ExprAggregator", e instanceof ExprAggregator);
assertTrue("Should be AggCount", ((ExprAggregator) e).getAggregator() instanceof AggCount);
}
Aggregations