Search in sources :

Example 6 with Order

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

the class TupleExprBuilder method processOrderClause.

private TupleExpr processOrderClause(ASTOrderClause orderNode, TupleExpr tupleExpr, Group group) throws VisitorException {
    if (orderNode != null) {
        @SuppressWarnings("unchecked") List<OrderElem> orderElements = (List<OrderElem>) orderNode.jjtAccept(this, null);
        for (OrderElem orderElem : orderElements) {
            // retrieve any aggregate operators from the order element.
            AggregateCollector collector = new AggregateCollector();
            collector.meet(orderElem);
            Extension extension = new Extension();
            for (AggregateOperator operator : collector.getOperators()) {
                Var var = createAnonVar();
                // replace occurrence of the operator in the order condition
                // with the variable.
                AggregateOperatorReplacer replacer = new AggregateOperatorReplacer(operator, var);
                replacer.meet(orderElem);
                // create an extension linking the operator to the variable
                // name.
                String alias = var.getName();
                ExtensionElem pe = new ExtensionElem(operator, alias);
                extension.addElement(pe);
                // add the aggregate operator to the group.
                GroupElem ge = new GroupElem(alias, operator);
                group.addGroupElement(ge);
            }
            if (!extension.getElements().isEmpty()) {
                extension.setArg(tupleExpr);
                tupleExpr = extension;
            }
        }
        tupleExpr = new Order(tupleExpr, orderElements);
    }
    return tupleExpr;
}
Also used : Order(org.eclipse.rdf4j.query.algebra.Order) Var(org.eclipse.rdf4j.query.algebra.Var) GroupElem(org.eclipse.rdf4j.query.algebra.GroupElem) OrderElem(org.eclipse.rdf4j.query.algebra.OrderElem) ExtensionElem(org.eclipse.rdf4j.query.algebra.ExtensionElem) Extension(org.eclipse.rdf4j.query.algebra.Extension) AggregateOperator(org.eclipse.rdf4j.query.algebra.AggregateOperator) List(java.util.List) ArrayList(java.util.ArrayList) ProjectionElemList(org.eclipse.rdf4j.query.algebra.ProjectionElemList)

Example 7 with Order

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

the class AbstractQueryBuilder method query.

/**
 * @inheritDoc
 */
public T query() {
    UnaryTupleOperator aRoot = null;
    UnaryTupleOperator aCurr = null;
    if (mLimit != -1 || mOffset != -1) {
        Slice aSlice = new Slice();
        if (mLimit != -1) {
            aSlice.setLimit(mLimit);
        }
        if (mOffset != -1) {
            aSlice.setOffset(mOffset);
        }
        aRoot = aCurr = aSlice;
    }
    if (mOrderByElems != null && !mOrderByElems.isEmpty()) {
        Order aOrder = new Order();
        aOrder.addElements(mOrderByElems);
        if (aRoot == null) {
            aRoot = aCurr = aOrder;
        } else {
            aCurr.setArg(aOrder);
            aCurr = aOrder;
        }
    }
    if (mDistinct) {
        Distinct aDistinct = new Distinct();
        if (aRoot == null) {
            aRoot = aCurr = aDistinct;
        } else {
            aCurr.setArg(aDistinct);
            aCurr = aDistinct;
        }
    }
    if (mReduced) {
        Reduced aReduced = new Reduced();
        if (aRoot == null) {
            aRoot = aCurr = aReduced;
        } else {
            aCurr.setArg(aReduced);
            aCurr = aReduced;
        }
    }
    TupleExpr aJoin = join();
    if (mQuery instanceof ParsedTupleQuery && mProjectionVars.isEmpty()) {
        VarNameCollector aCollector = new VarNameCollector();
        aJoin.visit(aCollector);
        mProjectionVars.addAll(aCollector.getVarNames());
    } else if (mQuery instanceof ParsedGraphQuery && mProjectionPatterns.isEmpty()) {
        StatementPatternCollector aCollector = new StatementPatternCollector();
        aJoin.visit(aCollector);
        mProjectionPatterns.addAll(aCollector.getStatementPatterns());
    }
    UnaryTupleOperator aProjection = projection();
    if (aRoot == null) {
        aRoot = aCurr = aProjection;
    } else {
        aCurr.setArg(aProjection);
    }
    if (aProjection.getArg() == null) {
        aCurr = aProjection;
    } else {
        // I think this is always a safe cast
        aCurr = (UnaryTupleOperator) aProjection.getArg();
    }
    if (aJoin != null) {
        aCurr.setArg(aJoin);
    }
    mQuery.setTupleExpr(aRoot);
    if (!mFrom.isEmpty() || !mFromNamed.isEmpty()) {
        SimpleDataset aDataset = new SimpleDataset();
        for (IRI aFrom : mFrom) {
            aDataset.addDefaultGraph(aFrom);
        }
        for (IRI aFrom : mFromNamed) {
            aDataset.addNamedGraph(aFrom);
        }
        mQuery.setDataset(aDataset);
    }
    return mQuery;
}
Also used : Order(org.eclipse.rdf4j.query.algebra.Order) StatementPatternCollector(org.eclipse.rdf4j.query.algebra.helpers.StatementPatternCollector) IRI(org.eclipse.rdf4j.model.IRI) Distinct(org.eclipse.rdf4j.query.algebra.Distinct) UnaryTupleOperator(org.eclipse.rdf4j.query.algebra.UnaryTupleOperator) Slice(org.eclipse.rdf4j.query.algebra.Slice) ParsedGraphQuery(org.eclipse.rdf4j.query.parser.ParsedGraphQuery) VarNameCollector(org.eclipse.rdf4j.query.algebra.helpers.VarNameCollector) SimpleDataset(org.eclipse.rdf4j.query.impl.SimpleDataset) Reduced(org.eclipse.rdf4j.query.algebra.Reduced) TupleExpr(org.eclipse.rdf4j.query.algebra.TupleExpr) ParsedTupleQuery(org.eclipse.rdf4j.query.parser.ParsedTupleQuery)

Aggregations

Order (org.eclipse.rdf4j.query.algebra.Order)7 TupleExpr (org.eclipse.rdf4j.query.algebra.TupleExpr)6 ArrayList (java.util.ArrayList)4 ProjectionElemList (org.eclipse.rdf4j.query.algebra.ProjectionElemList)4 List (java.util.List)3 Extension (org.eclipse.rdf4j.query.algebra.Extension)3 OrderElem (org.eclipse.rdf4j.query.algebra.OrderElem)3 Slice (org.eclipse.rdf4j.query.algebra.Slice)3 AggregateOperator (org.eclipse.rdf4j.query.algebra.AggregateOperator)2 Distinct (org.eclipse.rdf4j.query.algebra.Distinct)2 ExtensionElem (org.eclipse.rdf4j.query.algebra.ExtensionElem)2 GroupElem (org.eclipse.rdf4j.query.algebra.GroupElem)2 Projection (org.eclipse.rdf4j.query.algebra.Projection)2 Reduced (org.eclipse.rdf4j.query.algebra.Reduced)2 SingletonSet (org.eclipse.rdf4j.query.algebra.SingletonSet)2 Var (org.eclipse.rdf4j.query.algebra.Var)2 ASTInList (org.eclipse.rdf4j.query.parser.serql.ast.ASTInList)2 ASTLimit (org.eclipse.rdf4j.query.parser.serql.ast.ASTLimit)2 ASTOffset (org.eclipse.rdf4j.query.parser.serql.ast.ASTOffset)2 ASTOrderBy (org.eclipse.rdf4j.query.parser.serql.ast.ASTOrderBy)2