[
https://issues.apache.org/jira/browse/CALCITE-6440?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17860999#comment-17860999
]
Caican Cai edited comment on CALCITE-6440 at 6/30/24 2:48 PM:
--------------------------------------------------------------
[~julianhyde] Hi
I encountered a little difficulty. I used the following form to match the form
of order by empty
{code:java}
Config DEFAULT = ImmutableSortRemoveConstantKeysRule.Config.of()
.withOperandSupplier(b -> b.operand(Sort.class).oneInput(b1 ->
b1.operand(Project.class).anyInputs()));{code}
Through this matching, I can achieve the above optimization rules
However, I cannot verify
{code:java}
However, I cannot verify RelOptUtil.verifyTypeEquivalence(rel0, rel,
rel0);{code}
Because expectedRowType and actualRowType are not the same
I think I can solve this problem by writing a new rule to match two layers of
Project
{code:java}
Config DEFAULT = ImmutableSortRemoveConstantKeysRule2.Config.of()
.withOperandSupplier(b -> b.operand(Project.class).oneInput(
b1 -> b1.operand(Project.class)
.anyInputs())); {code}
Do you have any good suggestions?
was (Author: JIRAUSER302115):
[~julianhyde] Hi
I encountered a little difficulty. I used the following form to match the form
of order by empty
{code:java}
Config DEFAULT = ImmutableSortRemoveConstantKeysRule.Config.of()
.withOperandSupplier(b -> b.operand(Sort.class).oneInput(b1 ->
b1.operand(Project.class).anyInputs()));{code}
Through this matching, I can achieve the above optimization rules
However, I cannot verify
{code:java}
However, I cannot verify RelOptUtil.verifyTypeEquivalence(rel0, rel,
rel0);{code}
Because expectedRowType and actualRowType are not the same
I think I can solve this problem by writing a new rule to match two layers of
Project
{code:java}
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to you under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.calcite.rel.rules;
import com.google.common.collect.ImmutableList;
import org.apache.calcite.plan.RelOptPredicateList;
import org.apache.calcite.plan.RelOptRuleCall;
import org.apache.calcite.plan.RelRule;
import org.apache.calcite.rel.RelCollationTraitDef;
import org.apache.calcite.rel.RelCollations;
import org.apache.calcite.rel.RelFieldCollation;
import org.apache.calcite.rel.RelNode;
import org.apache.calcite.rel.core.Project;
import org.apache.calcite.rel.core.Sort;
import org.apache.calcite.rel.metadata.RelMetadataQuery;
import org.apache.calcite.rex.RexBuilder;
import org.immutables.value.Value;
import java.util.List;
import java.util.stream.Collectors;
/**
* Planner rule that removes keys from a
* a {@link org.apache.calcite.rel.core.Sort} if those keys are known to be
* constant, or removes the entire Sort if all keys are constant.
*
* <p>Requires {@link RelCollationTraitDef}.
*/
@Value.Enclosing
public class SortRemoveConstantKeysRule2
extends RelRule<SortRemoveConstantKeysRule2.Config>
implements SubstitutionRule {
/** Creates a SortRemoveConstantKeysRule. */
protected SortRemoveConstantKeysRule2(Config config) {
super(config);
}
@Override public void onMatch(RelOptRuleCall call) {
// Get the first Project
Project project1 = call.rel(0);
Project project2 = call.rel(1);
final RelNode input = project2.getInput();
final int size = input.getRowType().getFieldList().size();
// Check if the input of the first Project is also a Project
if (input.getRowType().getFieldList().get(size-1).getValue().isNullable()) {
// Replace the second Project with its input
Project newProject1 = (Project) project1.copy(project1.getTraitSet(),
ImmutableList.of(input));
// Transform the rule
call.transformTo(newProject1);
}
}
/** Rule configuration. */
@Value.Immutable
public interface Config extends RelRule.Config {
Config DEFAULT = ImmutableSortRemoveConstantKeysRule2.Config.of()
.withOperandSupplier(b -> b.operand(Project.class).oneInput(
b1 -> b1.operand(Project.class)
.anyInputs()));
@Override default SortRemoveConstantKeysRule2 toRule() {
return new SortRemoveConstantKeysRule2(this);
}
}
}
{code}
Do you have any good suggestions?
> SortRemoveConstantKeysRule should remove NULL literal sort keys (e.g. ORDER
> BY NULL)
> ------------------------------------------------------------------------------------
>
> Key: CALCITE-6440
> URL: https://issues.apache.org/jira/browse/CALCITE-6440
> Project: Calcite
> Issue Type: New Feature
> Components: core
> Affects Versions: 1.37.0
> Reporter: Caican Cai
> Priority: Major
> Labels: pull-request-available
> Fix For: 1.38.0
>
>
> For the following SQL:
> {code:java}
> select * from task order by null; {code}
> We could rewrite it to:
> {code:java}
> select * from task;{code}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)