Search in sources :

Example 1 with Plan

use of io.crate.planner.Plan in project crate by crate.

the class DeleteStatementPlanner method deleteByQuery.

private static Plan deleteByQuery(DocTableInfo tableInfo, List<WhereClause> whereClauses, Planner.Context context) {
    List<Plan> planNodes = new ArrayList<>();
    List<String> indicesToDelete = new ArrayList<>();
    for (WhereClause whereClause : whereClauses) {
        String[] indices = Planner.indices(tableInfo, whereClause);
        if (indices.length > 0) {
            if (!whereClause.hasQuery() && tableInfo.isPartitioned()) {
                indicesToDelete.addAll(Arrays.asList(indices));
            } else {
                planNodes.add(collectWithDeleteProjection(tableInfo, whereClause, context));
            }
        }
    }
    if (!indicesToDelete.isEmpty()) {
        assert planNodes.isEmpty() : "If a partition can be deleted that must be true for all bulk operations";
        return new ESDeletePartition(context.jobId(), indicesToDelete.toArray(new String[0]));
    }
    if (planNodes.isEmpty()) {
        return new NoopPlan(context.jobId());
    }
    return new Delete(planNodes, context.jobId());
}
Also used : ESDelete(io.crate.planner.node.dml.ESDelete) Delete(io.crate.planner.node.dml.Delete) NoopPlan(io.crate.planner.NoopPlan) WhereClause(io.crate.analyze.WhereClause) Plan(io.crate.planner.Plan) NoopPlan(io.crate.planner.NoopPlan) ESDeletePartition(io.crate.planner.node.ddl.ESDeletePartition)

Example 2 with Plan

use of io.crate.planner.Plan in project crate by crate.

the class BatchPortal method sync.

@Override
public CompletableFuture<Void> sync(Planner planner, JobsLogs jobsLogs) {
    CountdownFutureCallback completionCallback = new CountdownFutureCallback(analysis.size());
    for (int i = 0; i < analysis.size(); i++) {
        UUID jobId = UUID.randomUUID();
        Plan plan;
        String stmt = queries.get(i);
        try {
            plan = planner.plan(analysis.get(i), jobId, 0, 0);
        } catch (Throwable t) {
            jobsLogs.logPreExecutionFailure(jobId, stmt, SQLExceptions.messageOf(t));
            throw t;
        }
        ResultReceiver resultReceiver = resultReceivers.get(i);
        jobsLogs.logExecutionStart(jobId, stmt);
        JobsLogsUpdateListener jobsLogsUpdateListener = new JobsLogsUpdateListener(jobId, jobsLogs);
        resultReceiver.completionFuture().whenComplete(jobsLogsUpdateListener).whenComplete(completionCallback);
        BatchConsumer consumer = new BatchConsumerToResultReceiver(resultReceiver, 0);
        portalContext.getExecutor().execute(plan, consumer, new RowN(batchParams.toArray()));
    }
    synced = true;
    return completionCallback;
}
Also used : RowN(io.crate.data.RowN) CountdownFutureCallback(io.crate.concurrent.CountdownFutureCallback) BatchConsumerToResultReceiver(io.crate.action.sql.BatchConsumerToResultReceiver) UUID(java.util.UUID) Plan(io.crate.planner.Plan) BatchConsumerToResultReceiver(io.crate.action.sql.BatchConsumerToResultReceiver) ResultReceiver(io.crate.action.sql.ResultReceiver) BatchConsumer(io.crate.data.BatchConsumer)

Example 3 with Plan

use of io.crate.planner.Plan in project crate by crate.

the class SimplePortal method sync.

@Override
public CompletableFuture<?> sync(Planner planner, JobsLogs jobsLogs) {
    UUID jobId = UUID.randomUUID();
    Plan plan;
    try {
        plan = planner.plan(analysis, jobId, defaultLimit, maxRows);
    } catch (Throwable t) {
        jobsLogs.logPreExecutionFailure(jobId, query, SQLExceptions.messageOf(t));
        throw t;
    }
    if (!analysis.analyzedStatement().isWriteOperation()) {
        resultReceiver = new ResultReceiverRetryWrapper(resultReceiver, this, portalContext.getAnalyzer(), planner, portalContext.getExecutor(), jobId, sessionContext);
    }
    jobsLogs.logExecutionStart(jobId, query);
    JobsLogsUpdateListener jobsLogsUpdateListener = new JobsLogsUpdateListener(jobId, jobsLogs);
    CompletableFuture completableFuture = resultReceiver.completionFuture().whenComplete(jobsLogsUpdateListener);
    if (!resumeIfSuspended()) {
        consumer = new BatchConsumerToResultReceiver(resultReceiver, maxRows);
        portalContext.getExecutor().execute(plan, consumer, this.rowParams);
    }
    synced = true;
    return completableFuture;
}
Also used : CompletableFuture(java.util.concurrent.CompletableFuture) BatchConsumerToResultReceiver(io.crate.action.sql.BatchConsumerToResultReceiver) UUID(java.util.UUID) Plan(io.crate.planner.Plan)

Example 4 with Plan

use of io.crate.planner.Plan in project crate by crate.

the class Session method singleExec.

@VisibleForTesting
CompletableFuture<?> singleExec(Portal portal, ResultReceiver<?> resultReceiver, int maxRows) {
    var activeConsumer = portal.activeConsumer();
    if (activeConsumer != null && activeConsumer.suspended()) {
        activeConsumer.replaceResultReceiver(resultReceiver, maxRows);
        activeConsumer.resume();
        return resultReceiver.completionFuture();
    }
    var jobId = UUIDs.dirtyUUID();
    var routingProvider = new RoutingProvider(Randomness.get().nextInt(), planner.getAwarenessAttributes());
    var clusterState = executor.clusterService().state();
    var txnCtx = new CoordinatorTxnCtx(sessionContext);
    var nodeCtx = executor.nodeContext();
    var params = new RowN(portal.params().toArray());
    var plannerContext = new PlannerContext(clusterState, routingProvider, jobId, txnCtx, nodeCtx, maxRows, params);
    var analyzedStmt = portal.analyzedStatement();
    String rawStatement = portal.preparedStmt().rawStatement();
    if (analyzedStmt == null) {
        String errorMsg = "Statement must have been analyzed: " + rawStatement;
        jobsLogs.logPreExecutionFailure(jobId, rawStatement, errorMsg, sessionContext.sessionUser());
        throw new IllegalStateException(errorMsg);
    }
    Plan plan;
    try {
        plan = planner.plan(analyzedStmt, plannerContext);
    } catch (Throwable t) {
        jobsLogs.logPreExecutionFailure(jobId, rawStatement, SQLExceptions.messageOf(t), sessionContext.sessionUser());
        throw t;
    }
    if (!analyzedStmt.isWriteOperation()) {
        resultReceiver = new RetryOnFailureResultReceiver(executor.clusterService(), clusterState, indexName -> executor.clusterService().state().metadata().hasIndex(indexName), resultReceiver, jobId, (newJobId, resultRec) -> retryQuery(newJobId, analyzedStmt, routingProvider, new RowConsumerToResultReceiver(resultRec, maxRows, new JobsLogsUpdateListener(newJobId, jobsLogs)), params, txnCtx, nodeCtx));
    }
    jobsLogs.logExecutionStart(jobId, rawStatement, sessionContext.sessionUser(), StatementClassifier.classify(plan));
    RowConsumerToResultReceiver consumer = new RowConsumerToResultReceiver(resultReceiver, maxRows, new JobsLogsUpdateListener(jobId, jobsLogs));
    portal.setActiveConsumer(consumer);
    plan.execute(executor, plannerContext, consumer, params, SubQueryResults.EMPTY);
    return resultReceiver.completionFuture();
}
Also used : ParamTypeHints(io.crate.analyze.ParamTypeHints) RetryOnFailureResultReceiver(io.crate.protocols.postgres.RetryOnFailureResultReceiver) Analyzer(io.crate.analyze.Analyzer) DependencyCarrier(io.crate.planner.DependencyCarrier) ClusterState(org.elasticsearch.cluster.ClusterState) Relations(io.crate.analyze.Relations) RowN(io.crate.data.RowN) TransactionState(io.crate.protocols.postgres.TransactionState) Map(java.util.Map) JobsLogsUpdateListener(io.crate.protocols.postgres.JobsLogsUpdateListener) TableInfo(io.crate.metadata.table.TableInfo) NodeContext(io.crate.metadata.NodeContext) AnalyzedStatement(io.crate.analyze.AnalyzedStatement) UUIDs(org.elasticsearch.common.UUIDs) UUID(java.util.UUID) Lists2(io.crate.common.collections.Lists2) List(java.util.List) Logger(org.apache.logging.log4j.Logger) AnalyzedDiscard(io.crate.analyze.AnalyzedDiscard) Row(io.crate.data.Row) Symbol(io.crate.expression.symbol.Symbol) AnalyzedBegin(io.crate.analyze.AnalyzedBegin) SubQueryResults(io.crate.planner.operators.SubQueryResults) Statement(io.crate.sql.tree.Statement) VisibleForTesting(io.crate.common.annotations.VisibleForTesting) Row1(io.crate.data.Row1) CoordinatorTxnCtx(io.crate.metadata.CoordinatorTxnCtx) AnalyzedCommit(io.crate.analyze.AnalyzedCommit) AccessControl(io.crate.auth.AccessControl) QueriedSelectRelation(io.crate.analyze.QueriedSelectRelation) HashMap(java.util.HashMap) CompletableFuture(java.util.concurrent.CompletableFuture) Function(java.util.function.Function) JobsLogs(io.crate.execution.engine.collect.stats.JobsLogs) ArrayList(java.util.ArrayList) LinkedHashMap(java.util.LinkedHashMap) Portal(io.crate.protocols.postgres.Portal) Symbols(io.crate.expression.symbol.Symbols) FormatCodes(io.crate.protocols.postgres.FormatCodes) SqlParser(io.crate.sql.parser.SqlParser) Nullable(javax.annotation.Nullable) Iterator(java.util.Iterator) RelationInfo(io.crate.metadata.RelationInfo) Target(io.crate.sql.tree.DiscardStatement.Target) DataType(io.crate.types.DataType) Planner(io.crate.planner.Planner) RoutingProvider(io.crate.metadata.RoutingProvider) RowConsumer(io.crate.data.RowConsumer) StatementClassifier(io.crate.planner.operators.StatementClassifier) AbstractTableRelation(io.crate.analyze.relations.AbstractTableRelation) PlannerContext(io.crate.planner.PlannerContext) Plan(io.crate.planner.Plan) AnalyzedRelation(io.crate.analyze.relations.AnalyzedRelation) ReadOnlyException(io.crate.exceptions.ReadOnlyException) SQLExceptions(io.crate.exceptions.SQLExceptions) LogManager(org.apache.logging.log4j.LogManager) Randomness(org.elasticsearch.common.Randomness) AnalyzedDeallocate(io.crate.analyze.AnalyzedDeallocate) RoutingProvider(io.crate.metadata.RoutingProvider) CoordinatorTxnCtx(io.crate.metadata.CoordinatorTxnCtx) Plan(io.crate.planner.Plan) RowN(io.crate.data.RowN) PlannerContext(io.crate.planner.PlannerContext) JobsLogsUpdateListener(io.crate.protocols.postgres.JobsLogsUpdateListener) RetryOnFailureResultReceiver(io.crate.protocols.postgres.RetryOnFailureResultReceiver) VisibleForTesting(io.crate.common.annotations.VisibleForTesting)

Example 5 with Plan

use of io.crate.planner.Plan in project crate by crate.

the class Session method retryQuery.

private void retryQuery(UUID jobId, AnalyzedStatement stmt, RoutingProvider routingProvider, RowConsumer consumer, Row params, CoordinatorTxnCtx txnCtx, NodeContext nodeCtx) {
    PlannerContext plannerContext = new PlannerContext(planner.currentClusterState(), routingProvider, jobId, txnCtx, nodeCtx, 0, params);
    Plan plan = planner.plan(stmt, plannerContext);
    plan.execute(executor, plannerContext, consumer, params, SubQueryResults.EMPTY);
}
Also used : PlannerContext(io.crate.planner.PlannerContext) Plan(io.crate.planner.Plan)

Aggregations

Plan (io.crate.planner.Plan)18 PlannerContext (io.crate.planner.PlannerContext)8 Row (io.crate.data.Row)6 RoutingProvider (io.crate.metadata.RoutingProvider)6 Planner (io.crate.planner.Planner)6 SubQueryResults (io.crate.planner.operators.SubQueryResults)6 UUID (java.util.UUID)6 Analyzer (io.crate.analyze.Analyzer)5 RowConsumer (io.crate.data.RowConsumer)5 DependencyCarrier (io.crate.planner.DependencyCarrier)5 ArrayList (java.util.ArrayList)5 CompletableFuture (java.util.concurrent.CompletableFuture)5 AnalyzedStatement (io.crate.analyze.AnalyzedStatement)4 AbstractTableRelation (io.crate.analyze.relations.AbstractTableRelation)4 VisibleForTesting (io.crate.common.annotations.VisibleForTesting)4 RowN (io.crate.data.RowN)4 JobsLogs (io.crate.execution.engine.collect.stats.JobsLogs)4 CoordinatorTxnCtx (io.crate.metadata.CoordinatorTxnCtx)4 NodeContext (io.crate.metadata.NodeContext)4 AnalyzedBegin (io.crate.analyze.AnalyzedBegin)3