use of io.mycat.calcite.logical.MycatView in project Mycat2 by MyCATApache.
the class MycatJoinTableLookupTransposeRule method onMatch.
@Override
public void onMatch(RelOptRuleCall call) {
Join join = call.rel(0);
RelDataType originalRowType = join.getRowType();
RelOptCluster cluster = join.getCluster();
RelNode outerLeft = call.rel(1);
RelNode outerRight = call.rel(2);
if (outerLeft instanceof MycatSQLTableLookup) {
MycatSQLTableLookup mycatSQLTableLookup = (MycatSQLTableLookup) outerLeft;
if (mycatSQLTableLookup.getType() == MycatSQLTableLookup.Type.BACK) {
int fieldCount = mycatSQLTableLookup.getInput().getRowType().getFieldCount();
if (join.analyzeCondition().leftSet().asList().stream().allMatch(i -> i < fieldCount)) {
// 与最左表无关
RelNode bottomInput = mycatSQLTableLookup.getInput();
MycatView indexRightView = (MycatView) mycatSQLTableLookup.getRight();
RelNode newInputJoin = join.copy(bottomInput.getTraitSet(), ImmutableList.of(bottomInput, outerRight));
MycatSQLTableLookup newMycatSQLTableLookup = new MycatSQLTableLookup(join.getCluster(), join.getTraitSet(), newInputJoin, indexRightView, mycatSQLTableLookup.getJoinType(), mycatSQLTableLookup.getCondition(), mycatSQLTableLookup.getCorrelationIds(), mycatSQLTableLookup.getType());
fixProject(originalRowType, newMycatSQLTableLookup, call.builder()).ifPresent(res -> {
call.transformTo(res);
});
return;
}
}
}
if (outerRight instanceof MycatSQLTableLookup) {
MycatSQLTableLookup mycatSQLTableLookup = (MycatSQLTableLookup) outerRight;
MycatView indexRightView = (MycatView) mycatSQLTableLookup.getRight();
RelNode newInputJoin = join.copy(outerLeft.getTraitSet(), ImmutableList.of(mycatSQLTableLookup.getInput(), indexRightView));
if (mycatSQLTableLookup.getType() == MycatSQLTableLookup.Type.BACK) {
int fieldCount = mycatSQLTableLookup.getInput().getRowType().getFieldCount();
if (join.analyzeCondition().rightSet().asList().stream().allMatch(i -> i > fieldCount)) {
// 最右回表无关
MycatSQLTableLookup newMycatSQLTableLookup = new MycatSQLTableLookup(join.getCluster(), join.getTraitSet(), newInputJoin, indexRightView, mycatSQLTableLookup.getJoinType(), mycatSQLTableLookup.getCondition(), mycatSQLTableLookup.getCorrelationIds(), mycatSQLTableLookup.getType());
fixProject(originalRowType, newMycatSQLTableLookup, call.builder()).ifPresent(res -> {
call.transformTo(res);
});
return;
}
}
}
}
use of io.mycat.calcite.logical.MycatView in project Mycat2 by MyCATApache.
the class MycatMergeJoinRule method convert.
public RelNode convert(RelNode e, RelTraitSet targetTraits, boolean rbo) {
if (rbo) {
RelCollation targetCollation = targetTraits.getCollation();
if (targetCollation != null && !targetCollation.getFieldCollations().isEmpty() && e instanceof MycatView) {
RelTraitSet orginalTraitSet = e.getTraitSet();
RelCollation orginalCollation = orginalTraitSet.getCollation();
MycatView mycatView = (MycatView) e;
RelNode relNode = mycatView.getRelNode();
if (orginalCollation == null || orginalCollation.getFieldCollations().isEmpty()) {
return mycatView.changeTo(LogicalSort.create(relNode, targetCollation, null, null));
} else {
if (orginalCollation.equals(targetTraits.getCollation())) {
return e;
}
if (relNode instanceof Sort) {
// todo check it right
Sort sort = (Sort) relNode;
return mycatView.changeTo(LogicalSort.create(relNode, targetCollation, sort.offset, sort.fetch));
}
return mycatView.changeTo(LogicalSort.create(relNode, targetCollation, null, null));
}
}
} else {
return convert(e, targetTraits);
}
return null;
}
use of io.mycat.calcite.logical.MycatView in project Mycat2 by MyCATApache.
the class MycatRelFieldTrimmer method trimFields.
/**
* TrimResult.class,
* this,
* "trimFields",
* RelNode.class,
* ImmutableBitSet.class,
* Set.class
* final ImmutableBitSet fieldsUsed,
* Set<RelDataTypeField> extraFields
*
* @param
* @return
*/
public TrimResult trimFields(MycatView rel, ImmutableBitSet fieldsUsed, Set<RelDataTypeField> extraFields) {
MycatView view = (MycatView) rel;
RelNode oldRelNode = view.getRelNode();
RelNode newRelNode = RelOptUtil.createProject(oldRelNode, fieldsUsed.asList());
if (newRelNode == oldRelNode) {
return super.trimFields(rel, fieldsUsed, extraFields);
}
LogicalProject project = (LogicalProject) newRelNode;
Mappings.TargetMapping mapping = project.getMapping();
if (mapping == null || project.getProjects().isEmpty()) {
return super.trimFields(rel, fieldsUsed, extraFields);
}
MycatView newMycatView = new MycatView(view.getTraitSet(), newRelNode, view.getDistribution());
return super.result(newMycatView, Mappings.target(mapping, rel.getRowType().getFieldCount(), newMycatView.getRowType().getFieldCount()));
}
use of io.mycat.calcite.logical.MycatView in project Mycat2 by MyCATApache.
the class MycatValuesJoinRule method onMatch.
@Override
public void onMatch(RelOptRuleCall call) {
Join join = call.rel(0);
RelHint lastJoinHint = HintTools.getLastJoinHint(join.getHints());
if (lastJoinHint != null) {
if (!"use_values_join".equalsIgnoreCase(lastJoinHint.hintName)) {
return;
}
} else {
return;
}
RelOptCluster cluster = join.getCluster();
RelNode left = call.rel(1);
RelNode right = call.rel(2);
JoinInfo joinInfo = join.analyzeCondition();
if (!joinInfo.isEqui()) {
return;
}
if (!(right instanceof MycatView)) {
return;
}
MycatView mycatView = (MycatView) right;
if (mycatView.banPushdown()) {
return;
}
JoinRelType joinType = join.getJoinType();
switch(joinType) {
case INNER:
case SEMI:
case LEFT:
case RIGHT:
break;
default:
return;
}
if (RelOptUtil.countJoins(mycatView.getRelNode()) > 1) {
return;
}
RexBuilder rexBuilder = MycatCalciteSupport.RexBuilder;
RelDataTypeFactory typeFactory = cluster.getTypeFactory();
List<RexNode> leftExprs = new ArrayList<>();
List<CorrelationId> correlationIds = new ArrayList<>();
{
for (Integer leftKey : join.analyzeCondition().leftSet()) {
CorrelationId correl = cluster.createCorrel();
correlationIds.add(correl);
RelDataType type = left.getRowType().getFieldList().get(leftKey).getType();
RexNode rexNode = rexBuilder.makeCorrel(typeFactory.createSqlType(SqlTypeName.VARCHAR), correl);
leftExprs.add(rexBuilder.makeCast(type, rexNode));
}
}
switch(mycatView.getDistribution().type()) {
case PHY:
case BROADCAST:
RelBuilder builder = call.builder();
builder.push(MycatTableLookupValues.create(cluster, left.getRowType(), leftExprs, left.getTraitSet())).push(mycatView.getRelNode()).join(joinType, join.getCondition());
MycatView view = mycatView.changeTo(builder.build());
MycatSQLTableLookup mycatSQLTableLookup = new MycatSQLTableLookup(cluster, join.getTraitSet(), left, view, joinType, join.getCondition(), correlationIds, MycatSQLTableLookup.Type.NONE);
call.transformTo(mycatSQLTableLookup);
break;
default:
}
}
use of io.mycat.calcite.logical.MycatView in project Mycat2 by MyCATApache.
the class PlanImpl method specificSql.
@NotNull
public List<SpecificSql> specificSql(DrdsSqlWithParams drdsSql, int mergeUnionSize) {
List<SpecificSql> res = new ArrayList<>();
getMycatRel().accept(new RelShuttleImpl() {
@Override
protected RelNode visitChildren(RelNode relNode) {
List<Each> sqls = new ArrayList<>();
String parameterizedSql = "";
if (relNode instanceof MycatView) {
MycatView view = (MycatView) relNode;
SqlNode sqlTemplate = view.getSQLTemplate(false);
ImmutableMultimap<String, SqlString> apply = view.apply(mergeUnionSize, sqlTemplate, AsyncMycatDataContextImpl.getSqlMap(executerContext.getConstantMap(), view, drdsSql, drdsSql.getHintDataNodeFilter()), drdsSql.getParams());
ImmutableMultimap<String, SqlString> stringImmutableMultimap = apply;
for (Map.Entry<String, SqlString> entry : (stringImmutableMultimap.entries())) {
SqlString sqlString = new SqlString(entry.getValue().getDialect(), (Util.toLinux(entry.getValue().getSql())), entry.getValue().getDynamicParameters());
sqls.add(new Each(entry.getKey(), sqlString.getSql()));
}
if (relNode instanceof MycatView) {
parameterizedSql = ((MycatView) relNode).getSql();
}
if (relNode instanceof MycatTransientSQLTableScan) {
parameterizedSql = ((MycatTransientSQLTableScan) relNode).getSql();
}
res.add(new SpecificSql(relNode.getDigest(), parameterizedSql, sqls));
} else if (relNode instanceof MycatSQLTableLookup) {
MycatView right = ((MycatSQLTableLookup) relNode).getRight();
right.accept(this);
}
return super.visitChildren(relNode);
}
});
return res;
}
Aggregations