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);
}
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();
}
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;
}
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);
}
}
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);
}
Aggregations