Search in sources :

Example 11 with Clause

use of org.apache.asterix.lang.common.base.Clause in project asterixdb by apache.

the class ClauseComparator method mergeConsecutiveWhereClauses.

// Merge consecutive "where" clauses.
private void mergeConsecutiveWhereClauses(List<Clause> clauses) throws CompilationException {
    List<Clause> results = new ArrayList<Clause>();
    int size = clauses.size();
    for (int index = 0; index < size; ) {
        Clause clause = clauses.get(index);
        if (clause.getClauseType() != ClauseType.WHERE_CLAUSE) {
            results.add(clause);
            ++index;
        } else {
            List<Expression> expressions = new ArrayList<Expression>();
            Clause firstWhereClause = clause;
            do {
                WhereClause whereClause = (WhereClause) clause;
                expressions.add(whereClause.getWhereExpr());
                if (++index >= size) {
                    break;
                }
                clause = clauses.get(index);
            } while (clause.getClauseType() == ClauseType.WHERE_CLAUSE);
            if (expressions.size() > 1) {
                OperatorExpr newWhereExpr = new OperatorExpr();
                newWhereExpr.setExprList(expressions);
                newWhereExpr.setCurrentop(true);
                for (int operatorIndex = 0; operatorIndex < expressions.size(); ++operatorIndex) {
                    newWhereExpr.addOperator("and");
                }
                results.add(new WhereClause(newWhereExpr));
            } else {
                results.add(firstWhereClause);
            }
        }
    }
    clauses.clear();
    clauses.addAll(results);
}
Also used : OperatorExpr(org.apache.asterix.lang.common.expression.OperatorExpr) FLWOGRExpression(org.apache.asterix.lang.aql.expression.FLWOGRExpression) Expression(org.apache.asterix.lang.common.base.Expression) ArrayList(java.util.ArrayList) WhereClause(org.apache.asterix.lang.common.clause.WhereClause) ForClause(org.apache.asterix.lang.aql.clause.ForClause) DistinctClause(org.apache.asterix.lang.aql.clause.DistinctClause) GroupbyClause(org.apache.asterix.lang.common.clause.GroupbyClause) LetClause(org.apache.asterix.lang.common.clause.LetClause) Clause(org.apache.asterix.lang.common.base.Clause) WhereClause(org.apache.asterix.lang.common.clause.WhereClause)

Example 12 with Clause

use of org.apache.asterix.lang.common.base.Clause in project asterixdb by apache.

the class ClauseComparator method extractUnnestAfterGroupby.

// Extracts all clauses that led by a "for" clause after the first group-by
// clause in the input clause list.
// Those extracted clauses will be removed from the input clause list.
/**
     * @param clauseList
     *            , a list of clauses
     * @return the cutting group-by clause and the list of extracted clauses.
     * @throws CompilationException
     */
private Pair<GroupbyClause, List<Clause>> extractUnnestAfterGroupby(List<Clause> clauseList) throws CompilationException {
    List<Clause> nestedClauses = new ArrayList<Clause>();
    GroupbyClause cuttingGbyClause = null;
    boolean meetGroupBy = false;
    boolean nestedClauseStarted = false;
    for (Clause cl : clauseList) {
        if (cl.getClauseType() == ClauseType.GROUP_BY_CLAUSE) {
            meetGroupBy = true;
            cuttingGbyClause = (GroupbyClause) cl;
            continue;
        }
        if (meetGroupBy && cl.getClauseType() == ClauseType.FOR_CLAUSE) {
            nestedClauseStarted = true;
        }
        if (nestedClauseStarted) {
            nestedClauses.add(cl);
        }
    }
    clauseList.removeAll(nestedClauses);
    return new Pair<GroupbyClause, List<Clause>>(cuttingGbyClause, nestedClauses);
}
Also used : GroupbyClause(org.apache.asterix.lang.common.clause.GroupbyClause) ArrayList(java.util.ArrayList) ForClause(org.apache.asterix.lang.aql.clause.ForClause) DistinctClause(org.apache.asterix.lang.aql.clause.DistinctClause) GroupbyClause(org.apache.asterix.lang.common.clause.GroupbyClause) LetClause(org.apache.asterix.lang.common.clause.LetClause) Clause(org.apache.asterix.lang.common.base.Clause) WhereClause(org.apache.asterix.lang.common.clause.WhereClause) GbyVariableExpressionPair(org.apache.asterix.lang.common.expression.GbyVariableExpressionPair) Pair(org.apache.hyracks.algebricks.common.utils.Pair)

Example 13 with Clause

use of org.apache.asterix.lang.common.base.Clause in project asterixdb by apache.

the class ClauseComparator method extractDefinedCollectionVariables.

// Extracts the variables to be substituted with a path access.
private Map<VariableExpr, Expression> extractDefinedCollectionVariables(List<Clause> clauses, GroupbyClause cuttingGbyClause, String generatedAlias) {
    Map<VariableExpr, Expression> varExprMap = new HashMap<VariableExpr, Expression>();
    List<VariableExpr> varToSubstitute = collectProducedVariablesFromGroupby(cuttingGbyClause);
    int gbyIndex = clauses.indexOf(cuttingGbyClause);
    for (int i = gbyIndex + 1; i < clauses.size(); i++) {
        Clause cl = clauses.get(i);
        if (cl.getClauseType() == ClauseType.LET_CLAUSE) {
            varToSubstitute.add(((LetClause) cl).getVarExpr());
        }
    }
    for (VariableExpr var : varToSubstitute) {
        varExprMap.put(var, new FieldAccessor(new VariableExpr(new VarIdentifier(generatedAlias)), new VarIdentifier(var.getVar().getValue().substring(1))));
    }
    return varExprMap;
}
Also used : HashMap(java.util.HashMap) FLWOGRExpression(org.apache.asterix.lang.aql.expression.FLWOGRExpression) Expression(org.apache.asterix.lang.common.base.Expression) VarIdentifier(org.apache.asterix.lang.common.struct.VarIdentifier) VariableExpr(org.apache.asterix.lang.common.expression.VariableExpr) ForClause(org.apache.asterix.lang.aql.clause.ForClause) DistinctClause(org.apache.asterix.lang.aql.clause.DistinctClause) GroupbyClause(org.apache.asterix.lang.common.clause.GroupbyClause) LetClause(org.apache.asterix.lang.common.clause.LetClause) Clause(org.apache.asterix.lang.common.base.Clause) WhereClause(org.apache.asterix.lang.common.clause.WhereClause) FieldAccessor(org.apache.asterix.lang.common.expression.FieldAccessor)

Example 14 with Clause

use of org.apache.asterix.lang.common.base.Clause in project asterixdb by apache.

the class ClauseComparator method distillRedundantOrderby.

// Removes all redundant order by clauses.
private void distillRedundantOrderby(List<Clause> clauseList) {
    List<Clause> redundantOrderbys = new ArrayList<Clause>();
    boolean gbyAfterOrderby = false;
    for (Clause cl : clauseList) {
        if (cl.getClauseType() == ClauseType.ORDER_BY_CLAUSE) {
            redundantOrderbys.add(cl);
        }
        if (cl.getClauseType() == ClauseType.GROUP_BY_CLAUSE) {
            gbyAfterOrderby = true;
            break;
        }
    }
    if (gbyAfterOrderby) {
        clauseList.removeAll(redundantOrderbys);
    }
    redundantOrderbys.clear();
    for (Clause cl : clauseList) {
        if (cl.getClauseType() == ClauseType.ORDER_BY_CLAUSE) {
            redundantOrderbys.add(cl);
        }
    }
    if (redundantOrderbys.size() > 0) {
        redundantOrderbys.remove(redundantOrderbys.size() - 1);
    }
    clauseList.removeAll(redundantOrderbys);
}
Also used : ArrayList(java.util.ArrayList) ForClause(org.apache.asterix.lang.aql.clause.ForClause) DistinctClause(org.apache.asterix.lang.aql.clause.DistinctClause) GroupbyClause(org.apache.asterix.lang.common.clause.GroupbyClause) LetClause(org.apache.asterix.lang.common.clause.LetClause) Clause(org.apache.asterix.lang.common.base.Clause) WhereClause(org.apache.asterix.lang.common.clause.WhereClause)

Example 15 with Clause

use of org.apache.asterix.lang.common.base.Clause in project asterixdb by apache.

the class AqlDeleteRewriteVisitor method visit.

@Override
public Void visit(DeleteStatement deleteStmt, Void visitArg) {
    List<Expression> arguments = new ArrayList<>();
    Identifier dataverseName = deleteStmt.getDataverseName();
    Identifier datasetName = deleteStmt.getDatasetName();
    String arg = dataverseName == null ? datasetName.getValue() : dataverseName.getValue() + "." + datasetName.getValue();
    LiteralExpr argumentLiteral = new LiteralExpr(new StringLiteral(arg));
    arguments.add(argumentLiteral);
    CallExpr callExpression = new CallExpr(new FunctionSignature(FunctionConstants.ASTERIX_NS, "dataset", 1), arguments);
    List<Clause> clauseList = new ArrayList<>();
    VariableExpr var = deleteStmt.getVariableExpr();
    Clause forClause = new ForClause(var, callExpression);
    clauseList.add(forClause);
    Clause whereClause = null;
    Expression condition = deleteStmt.getCondition();
    if (condition != null) {
        whereClause = new WhereClause(condition);
        clauseList.add(whereClause);
    }
    VariableExpr returnExpr = new VariableExpr(var.getVar());
    returnExpr.setIsNewVar(false);
    FLWOGRExpression flowgr = new FLWOGRExpression(clauseList, returnExpr);
    Query query = new Query(false);
    query.setBody(flowgr);
    deleteStmt.setQuery(query);
    return null;
}
Also used : Query(org.apache.asterix.lang.common.statement.Query) ArrayList(java.util.ArrayList) WhereClause(org.apache.asterix.lang.common.clause.WhereClause) FLWOGRExpression(org.apache.asterix.lang.aql.expression.FLWOGRExpression) ForClause(org.apache.asterix.lang.aql.clause.ForClause) FunctionSignature(org.apache.asterix.common.functions.FunctionSignature) Identifier(org.apache.asterix.lang.common.struct.Identifier) StringLiteral(org.apache.asterix.lang.common.literal.StringLiteral) Expression(org.apache.asterix.lang.common.base.Expression) FLWOGRExpression(org.apache.asterix.lang.aql.expression.FLWOGRExpression) LiteralExpr(org.apache.asterix.lang.common.expression.LiteralExpr) CallExpr(org.apache.asterix.lang.common.expression.CallExpr) VariableExpr(org.apache.asterix.lang.common.expression.VariableExpr) ForClause(org.apache.asterix.lang.aql.clause.ForClause) Clause(org.apache.asterix.lang.common.base.Clause) WhereClause(org.apache.asterix.lang.common.clause.WhereClause)

Aggregations

Clause (org.apache.asterix.lang.common.base.Clause)19 ForClause (org.apache.asterix.lang.aql.clause.ForClause)16 DistinctClause (org.apache.asterix.lang.aql.clause.DistinctClause)15 ArrayList (java.util.ArrayList)10 FLWOGRExpression (org.apache.asterix.lang.aql.expression.FLWOGRExpression)10 LetClause (org.apache.asterix.lang.common.clause.LetClause)10 Expression (org.apache.asterix.lang.common.base.Expression)9 GroupbyClause (org.apache.asterix.lang.common.clause.GroupbyClause)9 WhereClause (org.apache.asterix.lang.common.clause.WhereClause)9 VariableExpr (org.apache.asterix.lang.common.expression.VariableExpr)6 MutableObject (org.apache.commons.lang3.mutable.MutableObject)4 ILogicalOperator (org.apache.hyracks.algebricks.core.algebra.base.ILogicalOperator)4 LogicalVariable (org.apache.hyracks.algebricks.core.algebra.base.LogicalVariable)4 Mutable (org.apache.commons.lang3.mutable.Mutable)3 Pair (org.apache.hyracks.algebricks.common.utils.Pair)3 ILogicalExpression (org.apache.hyracks.algebricks.core.algebra.base.ILogicalExpression)3 HashMap (java.util.HashMap)2 JoinClause (org.apache.asterix.lang.aql.clause.JoinClause)2 MetaVariableClause (org.apache.asterix.lang.aql.clause.MetaVariableClause)2 ILangExpression (org.apache.asterix.lang.common.base.ILangExpression)2