Search in sources :

Example 6 with Filter

use of org.eclipse.rdf4j.query.algebra.Filter in project rdf4j by eclipse.

the class TupleExprBuilder method processHavingClause.

private TupleExpr processHavingClause(ASTHavingClause havingNode, TupleExpr tupleExpr, Group group) throws VisitorException {
    if (havingNode != null) {
        // create an implicit group
        if (group == null) {
            group = new Group(tupleExpr);
        }
        ValueExpr expr = (ValueExpr) havingNode.jjtGetChild(0).jjtAccept(this, tupleExpr);
        // retrieve any aggregate operators from the expression.
        AggregateCollector collector = new AggregateCollector();
        collector.meetOther(expr);
        // replace operator occurrences with an anonymous var, and alias it
        // to the group
        Extension extension = new Extension();
        for (AggregateOperator operator : collector.getOperators()) {
            Var var = createAnonVar();
            // replace occurrence of the operator in the filter expression
            // with the variable.
            AggregateOperatorReplacer replacer = new AggregateOperatorReplacer(operator, var);
            replacer.meetOther(expr);
            String alias = var.getName();
            // create an extension linking the operator to the variable
            // name.
            ExtensionElem pe = new ExtensionElem(operator, alias);
            extension.addElement(pe);
            // add the aggregate operator to the group.
            GroupElem ge = new GroupElem(alias, operator);
            // FIXME quite often the aggregate in the HAVING clause will be
            // a duplicate of an aggregate in the projection. We could
            // perhaps
            // optimize for that, to avoid having to evaluate twice.
            group.addGroupElement(ge);
        }
        extension.setArg(group);
        tupleExpr = new Filter(extension, expr);
    }
    return tupleExpr;
}
Also used : Extension(org.eclipse.rdf4j.query.algebra.Extension) Group(org.eclipse.rdf4j.query.algebra.Group) ValueExpr(org.eclipse.rdf4j.query.algebra.ValueExpr) Filter(org.eclipse.rdf4j.query.algebra.Filter) Var(org.eclipse.rdf4j.query.algebra.Var) AggregateOperator(org.eclipse.rdf4j.query.algebra.AggregateOperator) GroupElem(org.eclipse.rdf4j.query.algebra.GroupElem) ExtensionElem(org.eclipse.rdf4j.query.algebra.ExtensionElem)

Example 7 with Filter

use of org.eclipse.rdf4j.query.algebra.Filter in project rdf4j by eclipse.

the class AbstractQueryBuilder method groupAsJoin.

private TupleExpr groupAsJoin(List<Group> theList) {
    BinaryTupleOperator aJoin = new Join();
    Filter aFilter = null;
    for (Group aGroup : theList) {
        TupleExpr aExpr = aGroup.expr();
        if (aExpr == null) {
            continue;
        }
        if (aExpr instanceof Filter && (((Filter) aExpr).getArg() == null || ((Filter) aExpr).getArg() instanceof EmptySet)) {
            if (aFilter == null) {
                aFilter = (Filter) aExpr;
            } else {
                // if we already have a filter w/ an empty arg, let's And the
                // conditions together.
                aFilter.setCondition(new And(aFilter.getCondition(), ((Filter) aExpr).getCondition()));
            }
            continue;
        }
        if (aFilter != null) {
            aFilter.setArg(aExpr);
            aExpr = aFilter;
            aFilter = null;
        }
        if (aGroup.isOptional()) {
            LeftJoin lj = new LeftJoin();
            TupleExpr aLeft = joinOrExpr(aJoin);
            if (aLeft != null) {
                lj.setLeftArg(aLeft);
                lj.setRightArg(aExpr);
                aJoin = lj;
                continue;
            }
        }
        if (aJoin.getLeftArg() == null) {
            aJoin.setLeftArg(aExpr);
        } else if (aJoin.getRightArg() == null) {
            aJoin.setRightArg(aExpr);
        } else {
            Join aNewJoin = new Join();
            aNewJoin.setLeftArg(aJoin);
            aNewJoin.setRightArg(aExpr);
            aJoin = aNewJoin;
        }
    }
    TupleExpr aExpr = joinOrExpr(aJoin);
    if (aFilter != null) {
        aFilter.setArg(aExpr);
        aExpr = aFilter;
    }
    return aExpr;
}
Also used : LeftJoin(org.eclipse.rdf4j.query.algebra.LeftJoin) Filter(org.eclipse.rdf4j.query.algebra.Filter) And(org.eclipse.rdf4j.query.algebra.And) BinaryTupleOperator(org.eclipse.rdf4j.query.algebra.BinaryTupleOperator) EmptySet(org.eclipse.rdf4j.query.algebra.EmptySet) LeftJoin(org.eclipse.rdf4j.query.algebra.LeftJoin) Join(org.eclipse.rdf4j.query.algebra.Join) TupleExpr(org.eclipse.rdf4j.query.algebra.TupleExpr)

Example 8 with Filter

use of org.eclipse.rdf4j.query.algebra.Filter in project rdf4j by eclipse.

the class TupleExprBuilder method visit.

@Override
public Object visit(ASTBind node, Object data) throws VisitorException {
    // bind expression
    ValueExpr ve = (ValueExpr) node.jjtGetChild(0).jjtAccept(this, data);
    // name to bind the expression outcome to
    Node aliasNode = node.jjtGetChild(1);
    String alias = ((ASTVar) aliasNode).getName();
    Extension extension = new Extension();
    extension.addElement(new ExtensionElem(ve, alias));
    TupleExpr result = null;
    TupleExpr arg = graphPattern.buildTupleExpr();
    // check if alias is not previously used.
    if (arg.getBindingNames().contains(alias)) {
        // SES-2314 we need to doublecheck that the reused varname is not
        // just
        // for an anonymous var or a constant.
        VarCollector collector = new VarCollector();
        arg.visit(collector);
        for (Var v : collector.getCollectedVars()) {
            if (alias.equals(v.getName())) {
                if (!v.isConstant() && !v.isAnonymous()) {
                    throw new VisitorException(String.format("BIND clause alias '%s' was previously used", alias));
                }
                break;
            }
        }
    }
    if (arg instanceof Filter) {
        result = arg;
        // the BIND expression.
        while (((Filter) arg).getArg() instanceof Filter) {
            arg = ((Filter) arg).getArg();
        }
        extension.setArg(((Filter) arg).getArg());
        ((Filter) arg).setArg(extension);
    } else {
        extension.setArg(arg);
        result = extension;
    }
    GraphPattern replacementGP = new GraphPattern(graphPattern);
    replacementGP.addRequiredTE(result);
    graphPattern = replacementGP;
    return result;
}
Also used : Extension(org.eclipse.rdf4j.query.algebra.Extension) ValueExpr(org.eclipse.rdf4j.query.algebra.ValueExpr) Filter(org.eclipse.rdf4j.query.algebra.Filter) Var(org.eclipse.rdf4j.query.algebra.Var) QueryModelNode(org.eclipse.rdf4j.query.algebra.QueryModelNode) IsBNode(org.eclipse.rdf4j.query.algebra.IsBNode) ExtensionElem(org.eclipse.rdf4j.query.algebra.ExtensionElem) TupleExpr(org.eclipse.rdf4j.query.algebra.TupleExpr)

Aggregations

Filter (org.eclipse.rdf4j.query.algebra.Filter)8 TupleExpr (org.eclipse.rdf4j.query.algebra.TupleExpr)7 ValueExpr (org.eclipse.rdf4j.query.algebra.ValueExpr)6 Join (org.eclipse.rdf4j.query.algebra.Join)4 Var (org.eclipse.rdf4j.query.algebra.Var)4 And (org.eclipse.rdf4j.query.algebra.And)3 EmptySet (org.eclipse.rdf4j.query.algebra.EmptySet)3 Extension (org.eclipse.rdf4j.query.algebra.Extension)3 ExtensionElem (org.eclipse.rdf4j.query.algebra.ExtensionElem)3 LeftJoin (org.eclipse.rdf4j.query.algebra.LeftJoin)3 ArrayList (java.util.ArrayList)2 BinaryTupleOperator (org.eclipse.rdf4j.query.algebra.BinaryTupleOperator)2 StatementPattern (org.eclipse.rdf4j.query.algebra.StatementPattern)2 ValueConstant (org.eclipse.rdf4j.query.algebra.ValueConstant)2 AbstractMap (java.util.AbstractMap)1 LinkedHashMap (java.util.LinkedHashMap)1 List (java.util.List)1 Map (java.util.Map)1 AggregateOperator (org.eclipse.rdf4j.query.algebra.AggregateOperator)1 BNodeGenerator (org.eclipse.rdf4j.query.algebra.BNodeGenerator)1