本文整理了Java中org.apache.calcite.rel.core.Join
类的一些代码示例,展示了Join
类的具体用法。这些代码示例主要来源于Github
/Stackoverflow
/Maven
等平台,是从一些精选项目中提取出来的代码,具有较强的参考意义,能在一定程度帮忙到你。Join
类的具体详情如下:
包路径:org.apache.calcite.rel.core.Join
类名称:Join
[英]Relational expression that combines two relational expressions according to some condition.
Each output row has columns from the left and right inputs. The set of output rows is a subset of the cartesian product of the two inputs; precisely which subset depends on the join condition.
[中]根据某种条件组合两个关系表达式的关系表达式。
每个输出行都有来自左侧和右侧输入的列。输出行集是两个输入的笛卡尔乘积的子集;确切地说,哪个子集取决于连接条件。
代码示例来源:origin: apache/hive
@Override
public void onMatch(RelOptRuleCall call) {
final Join join = call.rel(0);
final RexBuilder rexBuilder = join.getCluster().getRexBuilder();
final RexNode condition = RexUtil.pullFactors(rexBuilder, join.getCondition());
RexNode newCondition = analyzeRexNode(rexBuilder, condition);
// If we could not transform anything, we bail out
if (newCondition.toString().equals(condition.toString())) {
return;
}
RelNode newNode = join.copy(join.getTraitSet(),
newCondition,
join.getLeft(),
join.getRight(),
join.getJoinType(),
join.isSemiJoinDone());
call.transformTo(newNode);
}
}
代码示例来源:origin: apache/hive
private Project swapInputs(Join join, Project topProject, RelBuilder builder) {
RexBuilder rexBuilder = join.getCluster().getRexBuilder();
int rightInputSize = join.getRight().getRowType().getFieldCount();
int leftInputSize = join.getLeft().getRowType().getFieldCount();
List<RelDataTypeField> joinFields = join.getRowType().getFieldList();
RexNode newJoinCond = join.getCondition().accept(new RelOptUtil.RexInputConverter(rexBuilder, joinFields,
joinFields, condAdjustments));
Join swappedJoin = (Join)builder.push(join.getRight()).push(join.getLeft()).join(join.getJoinType(),
newJoinCond).build();
List<RelDataTypeField> swappedJoinFeilds = swappedJoin.getRowType().getFieldList();
for(RexNode project:topProject.getProjects()) {
RexNode newProject = project.accept(new RelOptUtil.RexInputConverter(rexBuilder, swappedJoinFeilds,
代码示例来源:origin: apache/hive
private static boolean validJoinParent(RelNode joinNode, RelNode parent) {
boolean validParent = true;
if (parent instanceof Join) {
// In Hive AST, right child of join cannot be another join,
// thus we need to introduce a project on top of it.
// But we only need the additional project if the left child
// is another join too; if it is not, ASTConverter will swap
// the join inputs, leaving the join operator on the left.
// we also do it if parent is HiveSemiJoin since ASTConverter won't
// swap inputs then
// This will help triggering multijoin recognition methods that
// are embedded in SemanticAnalyzer.
if (((Join) parent).getRight() == joinNode &&
(((Join) parent).getLeft() instanceof Join || parent instanceof HiveSemiJoin) ) {
validParent = false;
}
} else if (parent instanceof SetOp) {
validParent = false;
}
return validParent;
}
代码示例来源:origin: apache/hive
/**
*
* @param j
* @param additionalPredicate
* @return if predicate is the join condition return (true, joinCond)
* else return (false, minusPred)
*/
private Pair<Boolean,RexNode> getCombinedPredicateForJoin(Join j, RexNode additionalPredicate) {
RexNode minusPred = RelMdUtil.minusPreds(j.getCluster().getRexBuilder(), additionalPredicate,
j.getCondition());
if (minusPred != null) {
List<RexNode> minusList = new ArrayList<RexNode>();
minusList.add(j.getCondition());
minusList.add(minusPred);
return new Pair<Boolean,RexNode>(false, minusPred);
}
return new Pair<Boolean,RexNode>(true,j.getCondition());
}
代码示例来源:origin: apache/hive
} else if (call.rel(0) instanceof Join) {
Join join = call.rel(0);
newOp = join.copy(join.getTraitSet(), join.getCondition(),
newInputs.get(0), newInputs.get(1), join.getJoinType(),
join.isSemiJoinDone());
} else {
return;
代码示例来源:origin: org.apache.calcite/calcite-core
public void onMatch(RelOptRuleCall call) {
final Delta delta = call.rel(0);
Util.discard(delta);
final Join join = call.rel(1);
final RelNode left = join.getLeft();
final RelNode right = join.getRight();
final LogicalDelta rightWithDelta = LogicalDelta.create(right);
final LogicalJoin joinL = LogicalJoin.create(left, rightWithDelta,
join.getCondition(), join.getVariablesSet(), join.getJoinType(),
join.isSemiJoinDone(),
ImmutableList.copyOf(join.getSystemFieldList()));
final LogicalDelta leftWithDelta = LogicalDelta.create(left);
final LogicalJoin joinR = LogicalJoin.create(leftWithDelta, right,
join.getCondition(), join.getVariablesSet(), join.getJoinType(),
join.isSemiJoinDone(),
ImmutableList.copyOf(join.getSystemFieldList()));
List<RelNode> inputsToUnion = new ArrayList<>();
inputsToUnion.add(joinL);
inputsToUnion.add(joinR);
final LogicalUnion newNode = LogicalUnion.create(inputsToUnion, true);
call.transformTo(newNode);
}
}
代码示例来源:origin: apache/hive
Join join, List<RexNode> joinFilters, boolean leftInputPotentialFK, RelMetadataQuery mq) {
final List<RexNode> residualPreds = new ArrayList<>();
final JoinRelType joinType = join.getJoinType();
final RelNode fkInput = leftInputPotentialFK ? join.getLeft() : join.getRight();
final PKFKJoinInfo cannotExtract =
PKFKJoinInfo.of(false, null, null);
join = join.copy(join.getTraitSet(), join.getCluster().getRexBuilder().makeLiteral(true),
join.getLeft(), join.getRight(), JoinRelType.INNER, false);
final Set<RelTableRef> leftTables = mq.getTableReferences(join.getLeft());
final Set<RelTableRef> rightTables =
Sets.difference(mq.getTableReferences(join), mq.getTableReferences(join.getLeft()));
final Set<RelTableRef> fkTables = join.getLeft() == fkInput ? leftTables : rightTables;
final Set<RelTableRef> nonFkTables = join.getLeft() == fkInput ? rightTables : leftTables;
int nFieldsLeft = join.getLeft().getRowType().getFieldList().size();
int nFieldsRight = join.getRight().getRowType().getFieldList().size();
int nSysFields = join.getSystemFieldList().size();
ImmutableBitSet rightFieldsBitSet = ImmutableBitSet.range(nSysFields + nFieldsLeft,
nSysFields + nFieldsLeft + nFieldsRight);
代码示例来源:origin: Qihoo360/Quicksql
public Set<ImmutableBitSet> getUniqueKeys(Join rel, RelMetadataQuery mq,
boolean ignoreNulls) {
final RelNode left = rel.getLeft();
final RelNode right = rel.getRight();
final JoinInfo joinInfo = rel.analyzeCondition();
&& rightUnique
&& (leftSet != null)
&& !(rel.getJoinType().generatesNullsOnLeft())) {
retSet.addAll(leftSet);
&& leftUnique
&& (rightSet != null)
&& !(rel.getJoinType().generatesNullsOnRight())) {
retSet.addAll(rightSet);
代码示例来源:origin: apache/drill
if (join.getJoinType() != JoinRelType.INNER) {
return;
mq.getPulledUpPredicates(join).pulledUpPredicates);
final ImmutableBitSet joinColumns =
RelOptUtil.InputFinder.bits(join.getCondition());
final boolean allColumnsInAggregate =
keyColumns.contains(joinColumns);
final List<Boolean> filterNulls = Lists.newArrayList();
RexNode nonEquiConj =
RelOptUtil.splitJoinCondition(join.getLeft(), join.getRight(),
join.getCondition(), leftKeys, rightKeys, filterNulls);
for (int s = 0; s < 2; s++) {
final Side side = new Side();
final RelNode joinInput = join.getInput(s);
int fieldCount = joinInput.getRowType().getFieldCount();
final ImmutableBitSet fieldSet =
join.getRowType().getFieldCount(),
belowOffset);
final RexNode newCondition =
RexUtil.apply(mapping, join.getCondition());
sides.get(1).newInput, newCondition, join.getJoinType(),
join.getVariablesStopped(), join.isSemiJoinDone());
代码示例来源:origin: apache/hive
this.joinRel = joinRel;
this.isSemiJoin = isSemiJoin;
nFieldsLeft = joinRel.getLeft().getRowType().getFieldList().size();
nFieldsRight = joinRel.getRight().getRowType().getFieldList().size();
nSysFields = joinRel.getSystemFieldList().size();
leftFieldsBitSet = ImmutableBitSet.range(nSysFields,
nSysFields + nFieldsLeft);
nSysFields + nFieldsLeft, nSysFields, 0, nFieldsLeft);
leftChildPredicates = lPreds.accept(
new RexPermuteInputsShuttle(leftMapping, joinRel.getInput(0)));
nSysFields + nFieldsLeft, 0, nFieldsRight);
rightChildPredicates = rPreds.accept(
new RexPermuteInputsShuttle(rightMapping, joinRel.getInput(1)));
RexBuilder rexBuilder = joinRel.getCluster().getRexBuilder();
List<RexNode> exprs =
RelOptUtil.conjunctions(
compose(rexBuilder, ImmutableList.of(joinRel.getCondition())));
代码示例来源:origin: apache/hive
protected void perform(RelOptRuleCall call, ImmutableBitSet topRefs,
RelNode topOperator, Join join, RelNode left, Aggregate aggregate) {
LOG.debug("Matched HiveSemiJoinRule");
final RelOptCluster cluster = join.getCluster();
final RexBuilder rexBuilder = cluster.getRexBuilder();
final ImmutableBitSet rightBits =
ImmutableBitSet.range(left.getRowType().getFieldCount(),
join.getRowType().getFieldCount());
if (topRefs.intersects(rightBits)) {
return;
final JoinInfo joinInfo = join.analyzeCondition();
if (!joinInfo.rightSet().equals(
ImmutableBitSet.range(aggregate.getGroupCount()))) {
if(join.getJoinType() == JoinRelType.LEFT) {
if (join.getJoinType() != JoinRelType.INNER) {
return;
Join rightJoin = (Join)(((HepRelVertex)aggregate.getInput()).getCurrentRel());
List<RexNode> projects = new ArrayList<>();
for(int i=0; i<rightJoin.getRowType().getFieldCount(); i++){
projects.add(rexBuilder.makeInputRef(rightJoin, i));
RelNode topProject = call.builder().push(rightJoin).project(projects, rightJoin.getRowType().getFieldNames(),
true).build();
semi = call.builder().push(left).push(topProject).semiJoin(newCondition).build();
代码示例来源:origin: apache/hive
final RelNode oldLeft = rel.getInput(0);
final RelNode oldRight = rel.getInput(1);
final RelNode newJoin = HiveJoin.getJoin(rel.getCluster(), leftFrame.r,
rightFrame.r, decorrelateExpr(rel.getCondition()), rel.getJoinType());
assert rel.getRowType().getFieldCount()
== oldLeftFieldCount + oldRightFieldCount;
代码示例来源:origin: org.apache.calcite/calcite-core
private List<Double> averageJoinColumnSizes(Join rel, RelMetadataQuery mq,
boolean semijoin) {
final RelNode left = rel.getLeft();
final RelNode right = rel.getRight();
final List<Double> lefts = mq.getAverageColumnSizes(left);
final List<Double> rights =
semijoin ? null : mq.getAverageColumnSizes(right);
if (lefts == null && rights == null) {
return null;
}
final int fieldCount = rel.getRowType().getFieldCount();
Double[] sizes = new Double[fieldCount];
if (lefts != null) {
lefts.toArray(sizes);
}
if (rights != null) {
final int leftCount = left.getRowType().getFieldCount();
for (int i = 0; i < rights.size(); i++) {
sizes[leftCount + i] = rights.get(i);
}
}
return ImmutableNullableList.copyOf(sizes);
}
代码示例来源:origin: apache/hive
Project project,
int nullIndicatorPos) {
final RelDataTypeFactory typeFactory = join.getCluster().getTypeFactory();
final RelNode left = join.getLeft();
final JoinRelType joinType = join.getJoinType();
nullIndicatorPos,
typeFactory.createTypeWithNullability(
join.getRowType().getFieldList().get(nullIndicatorPos)
.getType(),
true));
代码示例来源:origin: apache/hive
final RelNode left = join.getInputs().get(0);
final RelNode right = join.getInputs().get(1);
join.getCondition());
final List<RexNode> leftFilters = new ArrayList<>();
final List<RexNode> rightFilters = new ArrayList<>();
RelOptUtil.classifyFilters(join, joinFilters, join.getJoinType(),false,
!join.getJoinType().generatesNullsOnRight(), !join.getJoinType().generatesNullsOnLeft(),
joinFilters, leftFilters, rightFilters);
boolean leftIsKey = (join.getJoinType() == JoinRelType.INNER || join.getJoinType() == JoinRelType.RIGHT)
&& leftInputResult.isPkFkJoin;
boolean rightIsKey = (join.getJoinType() == JoinRelType.INNER || join.getJoinType() == JoinRelType.LEFT)
&& rightInputResult.isPkFkJoin;
if (!leftIsKey && !rightIsKey) {
boolean isPKSideSimpleTree = simpleTree.left;
boolean isNoFilteringPKSideTree = simpleTree.right;
RexBuilder rexBuilder = join.getCluster().getRexBuilder();
RexNode leftPred = RexUtil.composeConjunction(
rexBuilder, leftFilters, true);
PKSideInfo pkInfo = new PKSideInfo(leftRowCount,
leftNDV,
join.getJoinType().generatesNullsOnRight() ? 1.0 :
pkSelectivity);
double ndvScalingFactor = isPKSideSimpleTree ? leftNDV/rightNDV : 1.0;
代码示例来源:origin: apache/hive
public Double getSelectivity(Join j, RelMetadataQuery mq, RexNode predicate) {
if (j.getJoinType().equals(JoinRelType.INNER)) {
return computeInnerJoinSelectivity(j, mq, predicate);
} else if (j.getJoinType().equals(JoinRelType.LEFT) ||
j.getJoinType().equals(JoinRelType.RIGHT)) {
double left = mq.getRowCount(j.getLeft());
double right = mq.getRowCount(j.getRight());
double product = left * right;
double innerJoinSelectivity = computeInnerJoinSelectivity(j, mq, predicate);
if (j.getJoinType().equals(JoinRelType.LEFT)) {
return Math.max(innerJoinSelectivity, left/product);
}
return Math.max(innerJoinSelectivity, right/product);
}
return 1.0;
}
代码示例来源:origin: Qihoo360/Quicksql
for (RelNode input : join.getInputs()) {
if (convertInputTraits && input.getConvention() != getOutTrait()) {
input =
if (convertInputTraits && !canJoinOnCondition(join.getCondition())) {
return null;
join.getCluster(),
join.getTraitSet().replace(out),
newInputs.get(0),
newInputs.get(1),
join.getCondition(),
join.getVariablesSet(),
join.getJoinType());
} catch (InvalidRelException e) {
LOGGER.debug(e.toString());
代码示例来源:origin: apache/hive
final JoinInfo joinInfo = join.analyzeCondition();
if(!joinInfo.isEqui()) {
return;
ImmutableBitSet.range(0, join.getLeft().getRowType().getFieldCount());
代码示例来源:origin: apache/hive
int rightOffSet = j.getLeft().getRowType().getFieldCount();
HiveRelMdDistinctRowCount.getDistinctRowCount(j.getLeft(), mq, ljk));
HiveRelMdDistinctRowCount.getDistinctRowCount(j.getRight(), mq, rjk));
double ndvEstimate = 1;
if (noOfPE > 0) {
boolean isCorrelatedColumns = j.getCluster().getPlanner().getContext().
unwrap(HiveConfPlannerContext.class).getIsCorrelatedColumns();
if (noOfPE > 1 && isCorrelatedColumns ){
ndvEstimate = Math.min(mq.getRowCount(j.getLeft()),
ndvEstimate);
}else if (j instanceof HiveJoin){
ndvEstimate = Math.min(mq.getRowCount(j.getLeft())
* mq.getRowCount(j.getRight()), ndvEstimate);
} else {
throw new RuntimeException("Unexpected Join type: " + j.getClass().getName());
代码示例来源:origin: apache/hive
int nFieldsLeft = joinRel.getLeft().getRowType().getFieldList().size();
int nFieldsRight = joinRel.getRight().getRowType().getFieldList().size();
int nSysFields = joinRel.getSystemFieldList().size();
ImmutableBitSet rightFieldsBitSet = ImmutableBitSet.range(nSysFields + nFieldsLeft,
nSysFields + nFieldsLeft + nFieldsRight);
内容来源于网络,如有侵权,请联系作者删除!