本文整理汇总了Java中com.taobao.tddl.optimizer.core.ast.query.MergeNode.executeOn方法的典型用法代码示例。如果您正苦于以下问题:Java MergeNode.executeOn方法的具体用法?Java MergeNode.executeOn怎么用?Java MergeNode.executeOn使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类com.taobao.tddl.optimizer.core.ast.query.MergeNode
的用法示例。
在下文中一共展示了MergeNode.executeOn方法的6个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Java代码示例。
示例1: shardUpdate
import com.taobao.tddl.optimizer.core.ast.query.MergeNode; //导入方法依赖的package包/类
private static ASTNode shardUpdate(UpdateNode dne, Map<Integer, ParameterContext> parameterSettings,
Map<String, Object> extraCmd) throws QueryException {
QueryTreeNode qtn = shardQuery(dne.getNode(), parameterSettings, extraCmd);
List<ASTNode> subs = new ArrayList();
if (qtn instanceof MergeNode) {
subs.addAll(qtn.getChildren());
} else {
subs.add(qtn);
}
if (subs.size() == 1) {
return buildOneQueryUpdate((QueryTreeNode) subs.get(0), dne.getColumns(), dne.getValues());
}
MergeNode updateMerge = new MergeNode();
for (ASTNode sub : subs) {
updateMerge.merge(buildOneQueryUpdate((QueryTreeNode) sub, dne.getColumns(), dne.getValues()));
}
updateMerge.executeOn(updateMerge.getChild().getDataNode());
return updateMerge;
}
示例2: shardDelete
import com.taobao.tddl.optimizer.core.ast.query.MergeNode; //导入方法依赖的package包/类
private static ASTNode shardDelete(DeleteNode dne, Map<Integer, ParameterContext> parameterSettings,
Map<String, Object> extraCmd) throws QueryException {
QueryTreeNode qtn = shardQuery(dne.getNode(), parameterSettings, extraCmd);
List<ASTNode> subs = new ArrayList();
if (qtn instanceof MergeNode) {
subs.addAll(qtn.getChildren());
} else {
subs.add(qtn);
}
if (subs.size() == 1) {
return buildOneQueryDelete((QueryTreeNode) subs.get(0));
}
MergeNode deleteMerge = new MergeNode();
for (ASTNode sub : subs) {
deleteMerge.merge(buildOneQueryDelete((QueryTreeNode) sub));
}
deleteMerge.executeOn(deleteMerge.getChild().getDataNode());
return deleteMerge;
}
示例3: convertPlanToAst
import com.taobao.tddl.optimizer.core.ast.query.MergeNode; //导入方法依赖的package包/类
public static MergeNode convertPlanToAst(IMerge merge) {
MergeNode node = new MergeNode();
for (IDataNodeExecutor plan : merge.getSubNodes()) {
if (!(plan instanceof IQueryTree)) {
throw new OptimizerException("不支持将非merge(query)转为语法树");
}
node.addChild(convertPlanToAst((IQueryTree) plan));
}
node.setLimitFrom(merge.getLimitFrom());
node.setLimitTo(merge.getLimitTo());
node.select(merge.getColumns());
node.setAlias(merge.getAlias());
node.setSubQuery(merge.isSubQuery());
node.setUnion(merge.isUnion());
node.setOrderBys(merge.getOrderBys());
node.setLimitFrom(merge.getLimitFrom());
node.setLimitTo(merge.getLimitTo());
node.setGroupBys(merge.getGroupBys());
node.setSharded(merge.isSharded());
node.having(merge.getHavingFilter());
node.setOtherJoinOnFilter(merge.getOtherJoinOnFilter());
node.setExistAggregate(merge.isExistAggregate());
node.setGroupByShardColumns(merge.isGroupByShardColumns());
node.setDistinctByShardColumns(merge.isDistinctByShardColumns());
node.executeOn(merge.getDataNode());
node.setSubqueryOnFilterId(merge.getSubqueryOnFilterId());
node.setSubqueryFilter(merge.getSubqueryFilter());
node.build();
node = node.deepCopy();
return node;
}
示例4: createMergeForJoin
import com.taobao.tddl.optimizer.core.ast.query.MergeNode; //导入方法依赖的package包/类
private ASTNode createMergeForJoin(ASTNode dne, Map<String, Object> extraCmd) {
if (dne instanceof MergeNode) {
for (ASTNode sub : ((MergeNode) dne).getChildren()) {
this.createMergeForJoin(sub, extraCmd);
}
}
if (dne instanceof JoinNode) {
this.createMergeForJoin(((JoinNode) dne).getLeftNode(), extraCmd);
this.createMergeForJoin(((JoinNode) dne).getRightNode(), extraCmd);
// 特殊处理子查询
if (((JoinNode) dne).getRightNode() instanceof QueryNode) {
QueryNode right = (QueryNode) ((JoinNode) dne).getRightNode();
if (right.getDataNode() != null) {
// right和join节点跨机,则需要右边生成Merge来做mget
if (!right.getDataNode().equals(dne.getDataNode())) {
MergeNode merge = new MergeNode();
merge.merge(right);
merge.setSharded(false);
merge.executeOn(right.getDataNode());
merge.build();
((JoinNode) dne).setRightNode(merge);
}
}
}
}
if (dne instanceof QueryNode) {
if (((QueryNode) dne).getChild() != null) {
this.createMergeForJoin(((QueryNode) dne).getChild(), extraCmd);
}
}
return dne;
}
示例5: buildMergeTable
import com.taobao.tddl.optimizer.core.ast.query.MergeNode; //导入方法依赖的package包/类
/**
* 根据执行的目标节点,构建MergeNode
*/
private static QueryTreeNode buildMergeTable(TableNode table, List<TargetDB> dataNodeChoosed,
Map<String, Object> extraCmd, boolean traceIn) {
long maxRowCount = 0;
String maxRowCountDataNode = dataNodeChoosed.get(0).getDbIndex();
List<List<QueryTreeNode>> subs = new ArrayList();
// 单库单表是大多数场景,此时无需复制执行计划
// 大部分情况只有一张表
boolean needCopy = false;
if (dataNodeChoosed.size() > 0 && dataNodeChoosed.get(0).getTableNameMap().size() > 0) {
Map<String, Field> tabMap = dataNodeChoosed.get(0).getTableNameMap();
Entry<String, Field> entry = tabMap.entrySet().iterator().next();
// 如果存在in,则必须使用复制
if (traceIn && entry.getValue() != null) {
needCopy |= traceSourceInFilter(table.getKeyFilter(), entry.getValue().getSourceKeys(), true);
needCopy |= traceSourceInFilter(table.getResultFilter(), entry.getValue().getSourceKeys(), true);
}
if (!chooseShareNode(extraCmd) && tabMap.size() > 1) {
// 如果不使用share模式,并且多于一张表,那就采用复制模式
needCopy = true;
}
if (!needCopy && tabMap.size() > 1) {
table = table.copy(); // 针对share模式,需要复制一份
}
}
int index = 0;
for (TargetDB target : dataNodeChoosed) {
OneDbNodeWithCount oneDbNodeWithCount = buildMergeTableInOneDB(table, target, index, needCopy, traceIn);
if (!oneDbNodeWithCount.subs.isEmpty()) {
subs.add(oneDbNodeWithCount.subs);
}
index += target.getTableNameMap().size();
if (oneDbNodeWithCount.totalRowCount > maxRowCount) {
maxRowCount = oneDbNodeWithCount.totalRowCount;
maxRowCountDataNode = target.getDbIndex();
}
}
if (subs.isEmpty()) {
throw new EmptyResultFilterException();
} else if (subs.size() == 1 && subs.get(0).size() == 1) {
return subs.get(0).get(0); // 只有单库
} else {
// 多库执行
MergeNode merge = new MergeNode();
merge.setAlias(table.getAlias());
merge.setSubQuery(table.isSubQuery());
merge.setSubAlias(table.getSubAlias());
merge.executeOn(maxRowCountDataNode);
merge.setSubqueryOnFilterId(table.getSubqueryOnFilterId());
for (List<QueryTreeNode> subList : subs) {
for (QueryTreeNode sub : subList) {
merge.merge(sub);
}
}
merge.setBroadcast(false);// merge不可能是广播表
merge.build();// build过程中会复制子节点的信息
return merge;
}
}
示例6: buildMergeTable
import com.taobao.tddl.optimizer.core.ast.query.MergeNode; //导入方法依赖的package包/类
/**
* 根据执行的目标节点,构建MergeNode
*/
private static QueryTreeNode buildMergeTable(TableNode table, List<TargetDB> dataNodeChoosed) {
long maxRowCount = 0;
String maxRowCountDataNode = dataNodeChoosed.get(0).getDbIndex();
List<List<QueryTreeNode>> subs = new ArrayList();
// 单库单表是大多数场景,此时无需复制执行计划
boolean needCopy = true;
if (dataNodeChoosed != null && dataNodeChoosed.size() == 1
&& dataNodeChoosed.get(0).getTableNameMap().size() == 1) {
needCopy = false;
}
for (TargetDB target : dataNodeChoosed) {
OneDbNodeWithCount oneDbNodeWithCount = buildMergeTableInOneDB(table, target, needCopy);
if (!oneDbNodeWithCount.subs.isEmpty()) {
subs.add(oneDbNodeWithCount.subs);
}
if (oneDbNodeWithCount.totalRowCount > maxRowCount) {
maxRowCount = oneDbNodeWithCount.totalRowCount;
maxRowCountDataNode = target.getDbIndex();
}
}
if (subs.isEmpty()) {
throw new EmptyResultFilterException("无对应执行节点");
} else if (subs.size() == 1 && subs.get(0).size() == 1) {
return subs.get(0).get(0); // 只有单库
} else {
// 多库执行
MergeNode merge = new MergeNode();
merge.executeOn(LOCAL);// 随意的一个名字
merge.setAlias(table.getAlias());
merge.setSubQuery(table.isSubQuery());
merge.setSubAlias(table.getSubAlias());
merge.executeOn(maxRowCountDataNode);
for (List<QueryTreeNode> subList : subs) {
for (QueryTreeNode sub : subList) {
merge.merge(sub);
}
}
merge.setBroadcast(false);// merge不可能是广播表
merge.build();// build过程中会复制子节点的信息
return merge;
}
}