Search in sources :

Example 1 with Plan

use of io.mycat.calcite.spm.Plan in project Mycat2 by MyCATApache.

the class ObservablePlanImplementorImpl method executeInsert.

@Override
public Future<Void> executeInsert(Plan logical) {
    MycatInsertRel mycatRel = (MycatInsertRel) logical.getMycatRel();
    List<VertxExecuter.EachSQL> insertSqls = VertxExecuter.explainInsert((SQLInsertStatement) mycatRel.getSqlStatement(), drdsSqlWithParams.getParams());
    assert !insertSqls.isEmpty();
    Future<long[]> future;
    if (insertSqls.size() > 1) {
        future = VertxExecuter.simpleUpdate(context, true, true, mycatRel.isGlobal(), VertxExecuter.rewriteInsertBatchedStatements(insertSqls));
    } else {
        future = VertxExecuter.simpleUpdate(context, true, false, mycatRel.isGlobal(), insertSqls);
    }
    return future.eventually(u -> context.getTransactionSession().closeStatementState()).flatMap(result -> response.sendOk(result[0], result[1]));
}
Also used : VertxExecuter(io.mycat.vertx.VertxExecuter) Logger(org.slf4j.Logger) io.mycat(io.mycat) VertxUpdateExecuter(io.mycat.vertx.VertxUpdateExecuter) Collection(java.util.Collection) SQLInsertStatement(com.alibaba.druid.sql.ast.statement.SQLInsertStatement) ExecutorProvider(io.mycat.calcite.ExecutorProvider) LoggerFactory(org.slf4j.LoggerFactory) Future(io.vertx.core.Future) MycatUpdateRel(io.mycat.calcite.physical.MycatUpdateRel) ArrayBindable(org.apache.calcite.runtime.ArrayBindable) TimeUnit(java.util.concurrent.TimeUnit) MycatInsertRel(io.mycat.calcite.physical.MycatInsertRel) TimeRateLimiterService(io.mycat.ratelimiter.TimeRateLimiterService) List(java.util.List) PrepareExecutor(io.mycat.calcite.PrepareExecutor) MysqlPayloadObject(io.mycat.api.collector.MysqlPayloadObject) Observable(io.reactivex.rxjava3.core.Observable) XaSqlConnection(cn.mycat.vertx.xa.XaSqlConnection) Optional(java.util.Optional) Plan(io.mycat.calcite.spm.Plan) MycatInsertRel(io.mycat.calcite.physical.MycatInsertRel)

Example 2 with Plan

use of io.mycat.calcite.spm.Plan in project Mycat2 by MyCATApache.

the class ObservablePlanImplementorImpl method executeUpdate.

@Override
public Future<Void> executeUpdate(Plan plan) {
    MycatUpdateRel mycatRel = (MycatUpdateRel) plan.getMycatRel();
    Collection<VertxExecuter.EachSQL> eachSQLS = VertxUpdateExecuter.explainUpdate(drdsSqlWithParams, context);
    Future<long[]> future = VertxExecuter.simpleUpdate(context, mycatRel.isInsert(), true, mycatRel.isGlobal(), eachSQLS);
    return future.eventually(u -> context.getTransactionSession().closeStatementState()).flatMap(result -> response.sendOk(result[0], result[1]));
}
Also used : VertxExecuter(io.mycat.vertx.VertxExecuter) Logger(org.slf4j.Logger) io.mycat(io.mycat) VertxUpdateExecuter(io.mycat.vertx.VertxUpdateExecuter) Collection(java.util.Collection) SQLInsertStatement(com.alibaba.druid.sql.ast.statement.SQLInsertStatement) ExecutorProvider(io.mycat.calcite.ExecutorProvider) LoggerFactory(org.slf4j.LoggerFactory) Future(io.vertx.core.Future) MycatUpdateRel(io.mycat.calcite.physical.MycatUpdateRel) ArrayBindable(org.apache.calcite.runtime.ArrayBindable) TimeUnit(java.util.concurrent.TimeUnit) MycatInsertRel(io.mycat.calcite.physical.MycatInsertRel) TimeRateLimiterService(io.mycat.ratelimiter.TimeRateLimiterService) List(java.util.List) PrepareExecutor(io.mycat.calcite.PrepareExecutor) MysqlPayloadObject(io.mycat.api.collector.MysqlPayloadObject) Observable(io.reactivex.rxjava3.core.Observable) XaSqlConnection(cn.mycat.vertx.xa.XaSqlConnection) Optional(java.util.Optional) Plan(io.mycat.calcite.spm.Plan) MycatUpdateRel(io.mycat.calcite.physical.MycatUpdateRel)

Example 3 with Plan

use of io.mycat.calcite.spm.Plan in project Mycat2 by MyCATApache.

the class ExecutorProviderImpl method runAsObjectArray.

@Override
public RowBaseIterator runAsObjectArray(MycatDataContext context, String sqlStatement) {
    DrdsSqlWithParams drdsSql = DrdsRunnerHelper.preParse(sqlStatement, context.getDefaultSchema());
    Plan plan = DrdsRunnerHelper.getPlan(drdsSql);
    AsyncMycatDataContextImpl.SqlMycatDataContextImpl sqlMycatDataContext = new AsyncMycatDataContextImpl.SqlMycatDataContextImpl(context, plan.getCodeExecuterContext(), drdsSql);
    PrepareExecutor prepareExecutor = prepare(plan);
    RowBaseIterator baseIterator = prepareExecutor.asRowBaseIterator(sqlMycatDataContext, plan.getMetaData());
    return baseIterator;
}
Also used : AsyncMycatDataContextImpl(io.mycat.AsyncMycatDataContextImpl) RowBaseIterator(io.mycat.api.collector.RowBaseIterator) PhysicalPlan(io.ordinate.engine.physicalplan.PhysicalPlan) Plan(io.mycat.calcite.spm.Plan) DrdsSqlWithParams(io.mycat.DrdsSqlWithParams)

Example 4 with Plan

use of io.mycat.calcite.spm.Plan in project Mycat2 by MyCATApache.

the class SqlResultSetService method loadResultSet.

@SneakyThrows
private Optional<Observable<MysqlPayloadObject>> loadResultSet(SQLSelectStatement sqlSelectStatement) {
    return cache.get(sqlSelectStatement.toString(), () -> {
        if (!MetaClusterCurrent.exist(DrdsSqlCompiler.class)) {
            return Optional.empty();
        }
        MycatDataContext context = new MycatDataContextImpl();
        try {
            DrdsSqlWithParams drdsSql = DrdsRunnerHelper.preParse(sqlSelectStatement, context.getDefaultSchema());
            Plan plan = DrdsRunnerHelper.getPlan(drdsSql);
            XaSqlConnection transactionSession = (XaSqlConnection) context.getTransactionSession();
            AsyncMycatDataContextImpl.SqlMycatDataContextImpl sqlMycatDataContext = new AsyncMycatDataContextImpl.SqlMycatDataContextImpl(context, plan.getCodeExecuterContext(), drdsSql);
            PrepareExecutor prepare = MetaClusterCurrent.wrapper(ExecutorProvider.class).prepare(plan);
            Observable<MysqlPayloadObject> observable = prepare.getMysqlPayloadObjectObservable(prepare.getArrayBindable(), sqlMycatDataContext, plan.getMetaData());
            observable = observable.doOnTerminate(new Action() {

                @Override
                public void run() throws Throwable {
                    transactionSession.closeStatementState().onComplete(event -> context.close());
                }
            });
            List<MysqlPayloadObject> mysqlPayloadObjects = observable.toList().blockingGet();
            observable = Observable.fromIterable(mysqlPayloadObjects);
            return Optional.ofNullable(observable);
        } catch (Throwable t) {
            context.kill();
            log.error("", t);
            return Optional.empty();
        }
    });
}
Also used : PrepareExecutor(io.mycat.calcite.PrepareExecutor) MycatDataContextImpl(io.mycat.runtime.MycatDataContextImpl) Action(io.reactivex.rxjava3.functions.Action) Plan(io.mycat.calcite.spm.Plan) MysqlPayloadObject(io.mycat.api.collector.MysqlPayloadObject) XaSqlConnection(cn.mycat.vertx.xa.XaSqlConnection) ExecutorProvider(io.mycat.calcite.ExecutorProvider) SneakyThrows(lombok.SneakyThrows)

Example 5 with Plan

use of io.mycat.calcite.spm.Plan in project Mycat2 by MyCATApache.

the class PartitionKeyJoinTest method parse.

public static Explain parse(DrdsConst drdsConst, String sql) {
    DrdsSqlCompiler drds = getDrds(drdsConst);
    DrdsSqlWithParams drdsSqlWithParams = DrdsRunnerHelper.preParse(sql, null);
    OptimizationContext optimizationContext = new OptimizationContext();
    MycatRel dispatch = drds.dispatch(optimizationContext, drdsSqlWithParams);
    Plan plan = new PlanImpl(dispatch, DrdsExecutorCompiler.getCodeExecuterContext(optimizationContext.relNodeContext.getConstantMap(), dispatch, false), drdsSqlWithParams.getAliasList());
    return new Explain(plan, drdsSqlWithParams);
}
Also used : MycatRel(io.mycat.calcite.MycatRel) OptimizationContext(io.mycat.calcite.rewriter.OptimizationContext) Plan(io.mycat.calcite.spm.Plan) PlanImpl(io.mycat.calcite.spm.PlanImpl)

Aggregations

Plan (io.mycat.calcite.spm.Plan)16 MycatRel (io.mycat.calcite.MycatRel)9 OptimizationContext (io.mycat.calcite.rewriter.OptimizationContext)9 DrdsSqlWithParams (io.mycat.DrdsSqlWithParams)7 PlanImpl (io.mycat.calcite.spm.PlanImpl)7 DrdsSqlCompiler (io.mycat.DrdsSqlCompiler)4 MysqlPayloadObject (io.mycat.api.collector.MysqlPayloadObject)4 SneakyThrows (lombok.SneakyThrows)4 XaSqlConnection (cn.mycat.vertx.xa.XaSqlConnection)3 SQLInsertStatement (com.alibaba.druid.sql.ast.statement.SQLInsertStatement)3 io.mycat (io.mycat)3 ExecutorProvider (io.mycat.calcite.ExecutorProvider)3 PrepareExecutor (io.mycat.calcite.PrepareExecutor)3 SQLStatement (com.alibaba.druid.sql.ast.SQLStatement)2 AsyncMycatDataContextImpl (io.mycat.AsyncMycatDataContextImpl)2 RowBaseIterator (io.mycat.api.collector.RowBaseIterator)2 ResultSetBuilder (io.mycat.beans.mycat.ResultSetBuilder)2 MycatInsertRel (io.mycat.calcite.physical.MycatInsertRel)2 MycatUpdateRel (io.mycat.calcite.physical.MycatUpdateRel)2 PlanImplementor (io.mycat.calcite.plan.PlanImplementor)2