Search in sources :

Example 1 with CopyMycatRowMetaData

use of io.mycat.beans.mycat.CopyMycatRowMetaData in project Mycat2 by MyCATApache.

the class MycatResultSet method of.

@SneakyThrows
public static MycatResultSet of(List<ResultSet> resultSets) {
    ResultSet resultSet = resultSets.get(0);
    MycatRowMetaData mycatRowMetaData = new CopyMycatRowMetaData(new JdbcRowMetaData(resultSet.getMetaData()));
    int columnCount = mycatRowMetaData.getColumnCount();
    List<List<Object>> rows = new ArrayList<>();
    for (ResultSet set : resultSets) {
        while (set.next()) {
            List<Object> row = new ArrayList<>();
            for (int i = 0; i < columnCount; i++) {
                row.add(set.getObject(i + 1));
            }
            rows.add(row);
        }
    }
    return new MycatResultSet(mycatRowMetaData, rows);
}
Also used : JdbcRowMetaData(io.mycat.beans.mycat.JdbcRowMetaData) ResultSet(java.sql.ResultSet) ArrayList(java.util.ArrayList) List(java.util.List) ArrayList(java.util.ArrayList) CopyMycatRowMetaData(io.mycat.beans.mycat.CopyMycatRowMetaData) CopyMycatRowMetaData(io.mycat.beans.mycat.CopyMycatRowMetaData) MycatRowMetaData(io.mycat.beans.mycat.MycatRowMetaData) SneakyThrows(lombok.SneakyThrows)

Example 2 with CopyMycatRowMetaData

use of io.mycat.beans.mycat.CopyMycatRowMetaData in project Mycat2 by MyCATApache.

the class PrototypeService method getMycatRowMetaDataPrepareSQLByTargetName.

private Optional<MycatRowMetaData> getMycatRowMetaDataPrepareSQLByTargetName(String targetName, String sql) {
    JdbcConnectionManager jdbcConnectionManager = MetaClusterCurrent.wrapper(JdbcConnectionManager.class);
    try (DefaultConnection connection = jdbcConnectionManager.getConnection(targetName)) {
        Connection rawConnection = connection.getRawConnection();
        PreparedStatement preparedStatement = rawConnection.prepareStatement(sql);
        ResultSetMetaData metaData = preparedStatement.getMetaData();
        if (metaData != null) {
            return Optional.of(new CopyMycatRowMetaData(new JdbcRowMetaData(metaData)));
        }
    } catch (Exception e) {
        LOGGER.warn("can not get meta from {} {}", targetName, e);
        return Optional.empty();
    }
    return Optional.empty();
}
Also used : ResultSetMetaData(java.sql.ResultSetMetaData) DefaultConnection(io.mycat.datasource.jdbc.datasource.DefaultConnection) JdbcRowMetaData(io.mycat.beans.mycat.JdbcRowMetaData) Connection(java.sql.Connection) DefaultConnection(io.mycat.datasource.jdbc.datasource.DefaultConnection) PreparedStatement(java.sql.PreparedStatement) JdbcConnectionManager(io.mycat.datasource.jdbc.datasource.JdbcConnectionManager) CopyMycatRowMetaData(io.mycat.beans.mycat.CopyMycatRowMetaData)

Example 3 with CopyMycatRowMetaData

use of io.mycat.beans.mycat.CopyMycatRowMetaData in project Mycat2 by MyCATApache.

the class MycatSQLTableLookup method dispatchRightObservable.

public static Observable<Object[]> dispatchRightObservable(NewMycatDataContext context, MycatSQLTableLookup tableLookup, Observable<Object[]> leftInput) {
    MycatView rightView = (MycatView) tableLookup.getRight();
    CopyMycatRowMetaData rightRowMetaData = new CopyMycatRowMetaData(new CalciteRowMetaData(rightView.getRowType().getFieldList()));
    AsyncMycatDataContextImpl.SqlMycatDataContextImpl sqlMycatDataContext = (AsyncMycatDataContextImpl.SqlMycatDataContextImpl) context;
    Observable<@NonNull List<Object[]>> buffer;
    if (tableLookup.getType() == Type.BACK) {
        // semi 可以分解
        buffer = leftInput.buffer(300, 50);
    } else {
        // NONE 该运算不能分解
        buffer = leftInput.toList().toObservable();
    }
    Observable<Object[]> rightObservable = buffer.flatMap(argsList -> {
        if (argsList.isEmpty()) {
            return Observable.empty();
        }
        RexShuttle rexShuttle = argSolver(argsList);
        RelNode mycatInnerRelNode = rightView.getRelNode().accept(new RelShuttleImpl() {

            @Override
            public RelNode visit(RelNode other) {
                if (other instanceof Filter) {
                    Filter filter = (Filter) other;
                    return filter.accept(rexShuttle);
                } else if (other instanceof MycatTableLookupValues) {
                    MycatTableLookupValues mycatTableLookupValues = (MycatTableLookupValues) other;
                    return mycatTableLookupValues.apply(argsList);
                }
                return super.visit(other);
            }
        });
        MycatView newRightView = new MycatView(rightView.getTraitSet(), mycatInnerRelNode, rightView.getDistribution(), rightView.getCondition().map(c -> c.accept(rexShuttle)).orElse(null));
        DrdsSqlWithParams drdsSql = context.getDrdsSql();
        SqlNode sqlTemplate = newRightView.getSQLTemplate(DrdsSqlWithParams.isForUpdate(drdsSql.getParameterizedSQL()));
        ImmutableMultimap<String, SqlString> apply1 = newRightView.apply(context.getContext().getMergeUnionSize(), sqlTemplate, sqlMycatDataContext.getSqlMap(Collections.emptyMap(), newRightView, drdsSql, drdsSql.getHintDataNodeFilter()), drdsSql.getParams());
        return Observable.merge(sqlMycatDataContext.getObservables(apply1, rightRowMetaData, (sessionConnection, sql, extractParams, calciteRowMetaData) -> VertxExecuter.runQuery(sessionConnection, sql, extractParams, calciteRowMetaData)));
    });
    return rightObservable;
}
Also used : VertxExecuter(io.mycat.vertx.VertxExecuter) MycatRowMetaData(io.mycat.beans.mycat.MycatRowMetaData) Getter(lombok.Getter) NewMycatDataContext(org.apache.calcite.runtime.NewMycatDataContext) SqlShuttle(org.apache.calcite.sql.util.SqlShuttle) RelOptCost(org.apache.calcite.plan.RelOptCost) NonNull(io.reactivex.rxjava3.annotations.NonNull) Filter(org.apache.calcite.rel.core.Filter) RelMdUtil(org.apache.calcite.rel.metadata.RelMdUtil) CalciteRowMetaData(io.mycat.calcite.resultset.CalciteRowMetaData) RexUtil(org.apache.calcite.rex.RexUtil) CorrelationId(org.apache.calcite.rel.core.CorrelationId) SqlValidatorUtil(org.apache.calcite.sql.validate.SqlValidatorUtil) ImmutableList(com.google.common.collect.ImmutableList) RexNode(org.apache.calcite.rex.RexNode) Observable(io.reactivex.rxjava3.core.Observable) DrdsSqlWithParams(io.mycat.DrdsSqlWithParams) BuiltInMethod(org.apache.calcite.util.BuiltInMethod) ImmutableMultimap(com.google.common.collect.ImmutableMultimap) LinkedList(java.util.LinkedList) Method(java.lang.reflect.Method) RelTraitSet(org.apache.calcite.plan.RelTraitSet) RelOptCluster(org.apache.calcite.plan.RelOptCluster) SqlParserPos(org.apache.calcite.sql.parser.SqlParserPos) CopyMycatRowMetaData(io.mycat.beans.mycat.CopyMycatRowMetaData) NewMycatConnection(io.mycat.newquery.NewMycatConnection) io.mycat.calcite(io.mycat.calcite) org.apache.calcite.adapter.enumerable(org.apache.calcite.adapter.enumerable) MycatView(io.mycat.calcite.logical.MycatView) Future(io.vertx.core.Future) JoinInfo(org.apache.calcite.rel.core.JoinInfo) Collectors(java.util.stream.Collectors) org.apache.calcite.sql(org.apache.calcite.sql) List(java.util.List) AsyncMycatDataContextImpl(io.mycat.AsyncMycatDataContextImpl) RelMetadataQuery(org.apache.calcite.rel.metadata.RelMetadataQuery) MYCAT_SQL_LOOKUP_IN(io.mycat.calcite.MycatImplementor.MYCAT_SQL_LOOKUP_IN) org.apache.calcite.linq4j.tree(org.apache.calcite.linq4j.tree) JoinRelType(org.apache.calcite.rel.core.JoinRelType) org.apache.calcite.rel(org.apache.calcite.rel) SqlString(org.apache.calcite.sql.util.SqlString) RexShuttle(org.apache.calcite.rex.RexShuttle) Util(org.apache.calcite.util.Util) NotNull(org.jetbrains.annotations.NotNull) RelOptPlanner(org.apache.calcite.plan.RelOptPlanner) Collections(java.util.Collections) RexCall(org.apache.calcite.rex.RexCall) RexShuttle(org.apache.calcite.rex.RexShuttle) AsyncMycatDataContextImpl(io.mycat.AsyncMycatDataContextImpl) SqlString(org.apache.calcite.sql.util.SqlString) CopyMycatRowMetaData(io.mycat.beans.mycat.CopyMycatRowMetaData) DrdsSqlWithParams(io.mycat.DrdsSqlWithParams) SqlString(org.apache.calcite.sql.util.SqlString) MycatView(io.mycat.calcite.logical.MycatView) Filter(org.apache.calcite.rel.core.Filter) CalciteRowMetaData(io.mycat.calcite.resultset.CalciteRowMetaData) ImmutableList(com.google.common.collect.ImmutableList) LinkedList(java.util.LinkedList) List(java.util.List)

Example 4 with CopyMycatRowMetaData

use of io.mycat.beans.mycat.CopyMycatRowMetaData in project Mycat2 by MyCATApache.

the class PrototypeService method getColumnInfo.

public List<SimpleColumnInfo> getColumnInfo(String sql, String schema, String table) {
    try {
        SQLStatement sqlStatement = SQLUtils.parseSingleMysqlStatement(sql);
        MycatRowMetaData mycatRowMetaData = null;
        if (sqlStatement instanceof MySqlCreateTableStatement) {
            mycatRowMetaData = SQL2ResultSetUtil.getMycatRowMetaData((MySqlCreateTableStatement) sqlStatement);
        } else {
            Optional<JdbcConnectionManager> prototypeConnectionManagerOptional = getPrototypeConnectionManager();
            if (!prototypeConnectionManagerOptional.isPresent())
                return Collections.emptyList();
            if (sqlStatement instanceof SQLCreateViewStatement) {
                if (schema == null || table == null) {
                    schema = ((SQLCreateViewStatement) sqlStatement).getSchema();
                    table = ((SQLCreateViewStatement) sqlStatement).getName().getSimpleName();
                }
                mycatRowMetaData = SQL2ResultSetUtil.getMycatRowMetaData(prototypeConnectionManagerOptional.get(), MetadataManager.getPrototype(), schema, table);
            } else if (sqlStatement instanceof SQLSelectStatement) {
                JdbcConnectionManager jdbcConnectionManager = prototypeConnectionManagerOptional.get();
                try (DefaultConnection connection = jdbcConnectionManager.getConnection(MetadataManager.getPrototype())) {
                    RowBaseIterator baseIterator = connection.executeQuery(sql);
                    mycatRowMetaData = new CopyMycatRowMetaData(baseIterator.getMetaData());
                }
            }
        }
        return CalciteConvertors.getColumnInfo(Objects.requireNonNull(mycatRowMetaData));
    } catch (Exception e) {
        LOGGER.error("sql:{}", sql, e);
        return getSimpleColumnInfos(schema, table);
    }
}
Also used : DefaultConnection(io.mycat.datasource.jdbc.datasource.DefaultConnection) JdbcConnectionManager(io.mycat.datasource.jdbc.datasource.JdbcConnectionManager) RowBaseIterator(io.mycat.api.collector.RowBaseIterator) CopyMycatRowMetaData(io.mycat.beans.mycat.CopyMycatRowMetaData) SQLStatement(com.alibaba.druid.sql.ast.SQLStatement) MycatRowMetaData(io.mycat.beans.mycat.MycatRowMetaData) CopyMycatRowMetaData(io.mycat.beans.mycat.CopyMycatRowMetaData)

Example 5 with CopyMycatRowMetaData

use of io.mycat.beans.mycat.CopyMycatRowMetaData in project Mycat2 by MyCATApache.

the class MycatViewPlan method execute.

@Override
public Observable<VectorSchemaRoot> execute(RootContext rootContext) {
    RootAllocator rootAllocator = new RootAllocator();
    NewMycatDataContext context = (NewMycatDataContext) rootContext.getContext();
    DrdsSqlWithParams drdsSql = context.getDrdsSql();
    MycatView view = (MycatView) mycatView;
    CopyMycatRowMetaData rowMetaData = new CopyMycatRowMetaData(new CalciteRowMetaData(view.getRowType().getFieldList()));
    MycatRelDatasourceSourceInfo mycatRelDatasourceSourceInfo = new MycatRelDatasourceSourceInfo(rowMetaData, view.getSQLTemplate(DrdsSql.isForUpdate(drdsSql.getParameterizedStatement())), view);
    SqlNode sqlTemplate = mycatRelDatasourceSourceInfo.getSqlTemplate();
    List<PartitionGroup> partitionGroups = AsyncMycatDataContextImpl.getSqlMap(Collections.emptyMap(), view, drdsSql, drdsSql.getHintDataNodeFilter());
    ImmutableMultimap<String, SqlString> stringSqlStringImmutableMultimap = view.apply(-1, sqlTemplate, partitionGroups, drdsSql.getParams());
    List<Observable<VectorSchemaRoot>> observableList = new ArrayList<>();
    for (Map.Entry<String, SqlString> entry : stringSqlStringImmutableMultimap.entries()) {
        String key = entry.getKey();
        SqlString sqlString = entry.getValue();
        observableList.add(Observable.create(emitter -> {
            Future<NewMycatConnection> connectionFuture = context.getConnection(context.getContext().resolveDatasourceTargetName(key));
            Future<Observable<VectorSchemaRoot>> observableFuture = connectionFuture.map(connection -> {
                Observable<VectorSchemaRoot> observable = connection.prepareQuery(sqlString.getSql(), MycatPreparedStatementUtil.extractParams(drdsSql.getParams(), sqlString.getDynamicParameters()), MycatRelDataType.getMycatRelType(MycatViewPlan.this.schema()), rootAllocator);
                return observable.doOnComplete(() -> context.recycleConnection(context.getContext().resolveDatasourceTargetName(key), Future.succeededFuture(connection)));
            });
            observableFuture.onFailure(event -> emitter.tryOnError(event));
            observableFuture.onSuccess(event -> {
                event = event.doOnComplete(() -> emitter.onComplete());
                event = event.doOnError(throwable -> emitter.tryOnError(throwable));
                event.forEach(vectorSchemaRoot -> emitter.onNext(vectorSchemaRoot));
            });
        }));
    }
    return Observable.fromIterable(observableList).flatMap(i -> i);
}
Also used : PartitionGroup(io.mycat.PartitionGroup) Schema(org.apache.arrow.vector.types.pojo.Schema) PartitionGroup(io.mycat.PartitionGroup) PhysicalSortProperty(io.ordinate.engine.builder.PhysicalSortProperty) CalciteRowMetaData(io.mycat.calcite.resultset.CalciteRowMetaData) CalciteCompiler(io.ordinate.engine.builder.CalciteCompiler) ObservableOnSubscribe(io.reactivex.rxjava3.core.ObservableOnSubscribe) SqlNode(org.apache.calcite.sql.SqlNode) RexNode(org.apache.calcite.rex.RexNode) DrdsSqlWithParams(io.mycat.DrdsSqlWithParams) RootAllocator(org.apache.arrow.memory.RootAllocator) Map(java.util.Map) BufferAllocator(org.apache.arrow.memory.BufferAllocator) MycatMergeSort(io.mycat.calcite.physical.MycatMergeSort) SqlKind(org.apache.calcite.sql.SqlKind) NewMycatConnection(io.mycat.newquery.NewMycatConnection) MycatView(io.mycat.calcite.logical.MycatView) RexLiteral(org.apache.calcite.rex.RexLiteral) Field(org.apache.arrow.vector.types.pojo.Field) FactoryUtil(io.ordinate.engine.factory.FactoryUtil) RootContext(io.ordinate.engine.record.RootContext) Future(io.vertx.core.Future) RelFieldCollation(org.apache.calcite.rel.RelFieldCollation) Collectors(java.util.stream.Collectors) Action(io.reactivex.rxjava3.functions.Action) List(java.util.List) RelCollation(org.apache.calcite.rel.RelCollation) Sort(org.apache.calcite.rel.core.Sort) MycatPreparedStatementUtil(io.mycat.calcite.executor.MycatPreparedStatementUtil) SqlString(org.apache.calcite.sql.util.SqlString) RexCall(org.apache.calcite.rex.RexCall) VertxExecuter(io.mycat.vertx.VertxExecuter) Distribution(io.mycat.calcite.rewriter.Distribution) NewMycatDataContext(org.apache.calcite.runtime.NewMycatDataContext) NonNull(io.reactivex.rxjava3.annotations.NonNull) ArrayList(java.util.ArrayList) Observable(io.reactivex.rxjava3.core.Observable) IntFunction(io.ordinate.engine.function.IntFunction) ImmutableMultimap(com.google.common.collect.ImmutableMultimap) MycatRelDataType(io.mycat.beans.mycat.MycatRelDataType) CopyMycatRowMetaData(io.mycat.beans.mycat.CopyMycatRowMetaData) VectorSchemaRoot(org.apache.arrow.vector.VectorSchemaRoot) MycatRelDatasourceSourceInfo(io.mycat.calcite.MycatRelDatasourceSourceInfo) Consumer(io.reactivex.rxjava3.functions.Consumer) ObservableEmitter(io.reactivex.rxjava3.core.ObservableEmitter) AsyncMycatDataContextImpl(io.mycat.AsyncMycatDataContextImpl) DrdsSql(io.mycat.DrdsSql) Function(io.reactivex.rxjava3.functions.Function) Handler(io.vertx.core.Handler) Collections(java.util.Collections) VectorSchemaRoot(org.apache.arrow.vector.VectorSchemaRoot) ArrayList(java.util.ArrayList) SqlString(org.apache.calcite.sql.util.SqlString) CopyMycatRowMetaData(io.mycat.beans.mycat.CopyMycatRowMetaData) Observable(io.reactivex.rxjava3.core.Observable) DrdsSqlWithParams(io.mycat.DrdsSqlWithParams) SqlString(org.apache.calcite.sql.util.SqlString) MycatView(io.mycat.calcite.logical.MycatView) RootAllocator(org.apache.arrow.memory.RootAllocator) MycatRelDatasourceSourceInfo(io.mycat.calcite.MycatRelDatasourceSourceInfo) NewMycatDataContext(org.apache.calcite.runtime.NewMycatDataContext) Future(io.vertx.core.Future) CalciteRowMetaData(io.mycat.calcite.resultset.CalciteRowMetaData) Map(java.util.Map) SqlNode(org.apache.calcite.sql.SqlNode)

Aggregations

CopyMycatRowMetaData (io.mycat.beans.mycat.CopyMycatRowMetaData)7 JdbcRowMetaData (io.mycat.beans.mycat.JdbcRowMetaData)3 MycatRowMetaData (io.mycat.beans.mycat.MycatRowMetaData)3 MycatView (io.mycat.calcite.logical.MycatView)3 CalciteRowMetaData (io.mycat.calcite.resultset.CalciteRowMetaData)3 DefaultConnection (io.mycat.datasource.jdbc.datasource.DefaultConnection)3 Future (io.vertx.core.Future)3 SneakyThrows (lombok.SneakyThrows)3 ImmutableMultimap (com.google.common.collect.ImmutableMultimap)2 AsyncMycatDataContextImpl (io.mycat.AsyncMycatDataContextImpl)2 DrdsSqlWithParams (io.mycat.DrdsSqlWithParams)2 io.mycat.calcite (io.mycat.calcite)2 MycatMergeSort (io.mycat.calcite.physical.MycatMergeSort)2 JdbcConnectionManager (io.mycat.datasource.jdbc.datasource.JdbcConnectionManager)2 NewMycatConnection (io.mycat.newquery.NewMycatConnection)2 VertxExecuter (io.mycat.vertx.VertxExecuter)2 List (java.util.List)2 RexNode (org.apache.calcite.rex.RexNode)2 SqlNode (org.apache.calcite.sql.SqlNode)2 SqlString (org.apache.calcite.sql.util.SqlString)2