本文整理汇总了Java中com.taobao.tddl.optimizer.core.ast.query.MergeNode.merge方法的典型用法代码示例。如果您正苦于以下问题:Java MergeNode.merge方法的具体用法?Java MergeNode.merge怎么用?Java MergeNode.merge使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类com.taobao.tddl.optimizer.core.ast.query.MergeNode
的用法示例。
在下文中一共展示了MergeNode.merge方法的7个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的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: buildMergeQuery
import com.taobao.tddl.optimizer.core.ast.query.MergeNode; //导入方法依赖的package包/类
private static QueryTreeNode buildMergeQuery(QueryNode query, MergeNode mergeNode, Map<String, Object> extraCmd) {
List<QueryNode> mergeQuerys = new LinkedList<QueryNode>();
for (ASTNode child : mergeNode.getChildren()) {
// 在未做shard之前就有存在mergeNode的可能,要识别出来
// 比如OR条件,可能会被拆分为两个Query的Merge,这个经过build之后,会是Merge套Merge或者是Merge套Query
if (!(child instanceof MergeNode) && child.getExtra() != null) {
QueryNode newQuery = query.copySelf();// 只复制自己,不复制子节点
newQuery.setChild((QueryTreeNode) child);
newQuery.executeOn(child.getDataNode());
newQuery.setExtra(child.getExtra());
newQuery.setBroadcast(child.isBroadcast());
mergeQuerys.add(newQuery);
}
}
if (mergeQuerys.size() > 1) {
MergeNode merge = new MergeNode();
merge.setAlias(query.getAlias());
merge.setSubQuery(query.isSubQuery());
merge.setSubAlias(query.getSubAlias());
// 复制子节点的limit/to信息
merge.setLimitFrom(query.getLimitFrom());
merge.setLimitTo(query.getLimitTo());
merge.setSubqueryOnFilterId(query.getSubqueryOnFilterId());
for (QueryNode q : mergeQuerys) {
merge.merge(q);
}
merge.executeOn(mergeQuerys.get(0).getDataNode()).setExtra(mergeQuerys.get(0).getExtra());
merge.build();
return merge;
} else if (mergeQuerys.size() == 1) {
return mergeQuerys.get(0);
} else {
return query;
}
}
示例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: buildMergeQuery
import com.taobao.tddl.optimizer.core.ast.query.MergeNode; //导入方法依赖的package包/类
private static QueryTreeNode buildMergeQuery(QueryNode query, MergeNode mergeNode) {
List<QueryNode> mergeQuerys = new LinkedList<QueryNode>();
for (ASTNode child : mergeNode.getChildren()) {
// 在未做shard之前就有存在mergeNode的可能,要识别出来
// 比如OR条件,可能会被拆分为两个Query的Merge,这个经过build之后,会是Merge套Merge或者是Merge套Query
if (!(child instanceof MergeNode) && child.getExtra() != null) {
QueryNode newQuery = query.copy();
newQuery.setChild((QueryTreeNode) child);
newQuery.executeOn(child.getDataNode());
newQuery.setExtra(child.getExtra());
newQuery.setBroadcast(child.isBroadcast());
mergeQuerys.add(newQuery);
}
}
if (mergeQuerys.size() > 1) {
MergeNode merge = new MergeNode();
merge.setAlias(query.getAlias());
merge.setSubQuery(query.isSubQuery());
merge.setSubAlias(query.getSubAlias());
for (QueryNode q : mergeQuerys) {
merge.merge(q);
}
merge.executeOn(mergeQuerys.get(0).getDataNode()).setExtra(mergeQuerys.get(0).getExtra());
merge.build();
return merge;
} else if (mergeQuerys.size() == 1) {
return mergeQuerys.get(0);
} else {
return query;
}
}
示例6: 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;
}
}
示例7: 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;
}
}