Java Code Examples for org.apache.calcite.rel.core.Project#getPermutation()
The following examples show how to use
org.apache.calcite.rel.core.Project#getPermutation() .
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example 1
Source File: PermutationTestCase.java From calcite with Apache License 2.0 | 6 votes |
@Test void testProjectPermutation() { final RelDataTypeFactory typeFactory = new JavaTypeFactoryImpl(); final RexBuilder builder = new RexBuilder(typeFactory); final RelDataType doubleType = typeFactory.createSqlType(SqlTypeName.DOUBLE); // A project with [1, 1] is not a permutation, so should return null final Permutation perm = Project.getPermutation(2, ImmutableList.of(builder.makeInputRef(doubleType, 1), builder.makeInputRef(doubleType, 1))); assertThat(perm, nullValue()); // A project with [0, 1, 0] is not a permutation, so should return null final Permutation perm1 = Project.getPermutation(2, ImmutableList.of(builder.makeInputRef(doubleType, 0), builder.makeInputRef(doubleType, 1), builder.makeInputRef(doubleType, 0))); assertThat(perm1, nullValue()); // A project of [1, 0] is a valid permutation! final Permutation perm2 = Project.getPermutation(2, ImmutableList.of(builder.makeInputRef(doubleType, 1), builder.makeInputRef(doubleType, 0))); assertThat(perm2, is(new Permutation(new int[]{1, 0}))); }
Example 2
Source File: ProjectMergeRule.java From Bats with Apache License 2.0 | 4 votes |
public void onMatch(RelOptRuleCall call) { final Project topProject = call.rel(0); final Project bottomProject = call.rel(1); final RelBuilder relBuilder = call.builder(); // If one or both projects are permutations, short-circuit the complex logic // of building a RexProgram. final Permutation topPermutation = topProject.getPermutation(); if (topPermutation != null) { if (topPermutation.isIdentity()) { // Let ProjectRemoveRule handle this. return; } final Permutation bottomPermutation = bottomProject.getPermutation(); if (bottomPermutation != null) { if (bottomPermutation.isIdentity()) { // Let ProjectRemoveRule handle this. return; } final Permutation product = topPermutation.product(bottomPermutation); relBuilder.push(bottomProject.getInput()); relBuilder.project(relBuilder.fields(product), topProject.getRowType().getFieldNames()); call.transformTo(relBuilder.build()); return; } } // If we're not in force mode and the two projects reference identical // inputs, then return and let ProjectRemoveRule replace the projects. if (!force) { if (RexUtil.isIdentity(topProject.getProjects(), topProject.getInput().getRowType())) { return; } } final List<RexNode> newProjects = RelOptUtil.pushPastProject(topProject.getProjects(), bottomProject); final RelNode input = bottomProject.getInput(); if (RexUtil.isIdentity(newProjects, input.getRowType())) { if (force || input.getRowType().getFieldNames() .equals(topProject.getRowType().getFieldNames())) { call.transformTo(input); return; } } // replace the two projects with a combined projection relBuilder.push(bottomProject.getInput()); relBuilder.project(newProjects, topProject.getRowType().getFieldNames()); call.transformTo(relBuilder.build()); }
Example 3
Source File: DrillMergeProjectRule.java From Bats with Apache License 2.0 | 4 votes |
@Override public void onMatch(RelOptRuleCall call) { final Project topProject = call.rel(0); final Project bottomProject = call.rel(1); final RelBuilder relBuilder = call.builder(); // If one or both projects are permutations, short-circuit the complex logic // of building a RexProgram. final Permutation topPermutation = topProject.getPermutation(); if (topPermutation != null) { if (topPermutation.isIdentity()) { // Let ProjectRemoveRule handle this. return; } final Permutation bottomPermutation = bottomProject.getPermutation(); if (bottomPermutation != null) { if (bottomPermutation.isIdentity()) { // Let ProjectRemoveRule handle this. return; } final Permutation product = topPermutation.product(bottomPermutation); relBuilder.push(bottomProject.getInput()); relBuilder.project(relBuilder.fields(product), topProject.getRowType().getFieldNames()); call.transformTo(relBuilder.build()); return; } } // If we're not in force mode and the two projects reference identical // inputs, then return and let ProjectRemoveRule replace the projects. if (!force) { if (RexUtil.isIdentity(topProject.getProjects(), topProject.getInput().getRowType())) { return; } } final List<RexNode> pushedProjects = RelOptUtil.pushPastProject(topProject.getProjects(), bottomProject); final List<RexNode> newProjects = simplifyCast(pushedProjects); final RelNode input = bottomProject.getInput(); if (RexUtil.isIdentity(newProjects, input.getRowType())) { if (force || input.getRowType().getFieldNames() .equals(topProject.getRowType().getFieldNames())) { call.transformTo(input); return; } } // replace the two projects with a combined projection relBuilder.push(bottomProject.getInput()); relBuilder.project(newProjects, topProject.getRowType().getFieldNames()); call.transformTo(relBuilder.build()); }
Example 4
Source File: MergeProjectRule.java From dremio-oss with Apache License 2.0 | 4 votes |
@Override public void onMatch(RelOptRuleCall call) { final Project topProject = call.rel(0); final Project bottomProject = call.rel(1); final RelBuilder relBuilder = call.builder(); // merge projects assuming it doesn't alter the unique count of flattens. final FlattenCounter counter = new FlattenCounter(); counter.add(topProject); counter.add(bottomProject); final int uniqueFlattens = counter.getCount(); // If one or both projects are permutations, short-circuit the complex logic // of building a RexProgram. final Permutation topPermutation = topProject.getPermutation(); if (topPermutation != null) { if (topPermutation.isIdentity()) { // Let ProjectRemoveRule handle this. return; } final Permutation bottomPermutation = bottomProject.getPermutation(); if (bottomPermutation != null) { if (bottomPermutation.isIdentity()) { // Let ProjectRemoveRule handle this. return; } final Permutation product = topPermutation.product(bottomPermutation); relBuilder.push(bottomProject.getInput()); List<RexNode> exprs = relBuilder.fields(product); relBuilder.project(exprs, topProject.getRowType().getFieldNames()); if(FlattenVisitors.count(exprs) == uniqueFlattens){ call.transformTo(relBuilder.build()); } return; } } final List<RexNode> newProjects = RelOptUtil.pushPastProject(topProject.getProjects(), bottomProject); final RelNode input = bottomProject.getInput(); if (RexUtil.isIdentity(newProjects, input.getRowType()) && uniqueFlattens == 0) { call.transformTo(input); return; } // replace the two projects with a combined projection relBuilder.push(bottomProject.getInput()); relBuilder.project(newProjects, topProject.getRowType().getFieldNames()); if(FlattenVisitors.count(newProjects) == uniqueFlattens){ call.transformTo(relBuilder.build()); } }
Example 5
Source File: ProjectMergeRule.java From calcite with Apache License 2.0 | 4 votes |
public void onMatch(RelOptRuleCall call) { final Project topProject = call.rel(0); final Project bottomProject = call.rel(1); final RelBuilder relBuilder = call.builder(); // If one or both projects are permutations, short-circuit the complex logic // of building a RexProgram. final Permutation topPermutation = topProject.getPermutation(); if (topPermutation != null) { if (topPermutation.isIdentity()) { // Let ProjectRemoveRule handle this. return; } final Permutation bottomPermutation = bottomProject.getPermutation(); if (bottomPermutation != null) { if (bottomPermutation.isIdentity()) { // Let ProjectRemoveRule handle this. return; } final Permutation product = topPermutation.product(bottomPermutation); relBuilder.push(bottomProject.getInput()); relBuilder.project(relBuilder.fields(product), topProject.getRowType().getFieldNames()); call.transformTo(relBuilder.build()); return; } } // If we're not in force mode and the two projects reference identical // inputs, then return and let ProjectRemoveRule replace the projects. if (!force) { if (RexUtil.isIdentity(topProject.getProjects(), topProject.getInput().getRowType())) { return; } } final List<RexNode> newProjects = RelOptUtil.pushPastProjectUnlessBloat(topProject.getProjects(), bottomProject, bloat); if (newProjects == null) { // Merged projects are significantly more complex. Do not merge. return; } final RelNode input = bottomProject.getInput(); if (RexUtil.isIdentity(newProjects, input.getRowType())) { if (force || input.getRowType().getFieldNames() .equals(topProject.getRowType().getFieldNames())) { call.transformTo(input); return; } } // replace the two projects with a combined projection relBuilder.push(bottomProject.getInput()); relBuilder.project(newProjects, topProject.getRowType().getFieldNames()); call.transformTo(relBuilder.build()); }