Skip to content

Commit

Permalink
[CALCITE-6321] Add copy(List<RexLiteral>) method to Window class
Browse files Browse the repository at this point in the history
  • Loading branch information
normanj-bitquill authored and mihaibudiu committed Apr 1, 2024
1 parent ef81185 commit f948850
Show file tree
Hide file tree
Showing 8 changed files with 279 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,11 @@ public class EnumerableWindow extends Window implements EnumerableRel {
constants, getRowType(), groups);
}

@Override public Window copy(List<RexLiteral> constants) {
return new EnumerableWindow(getCluster(), getTraitSet(), getInput(),
constants, getRowType(), groups);
}

@Override public @Nullable RelOptCost computeSelfCost(RelOptPlanner planner,
RelMetadataQuery mq) {
RelOptCost cost = super.computeSelfCost(planner, mq);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -836,6 +836,11 @@ public static class BindableWindow extends Window implements BindableRel {
constants, getRowType(), groups);
}

@Override public Window copy(List<RexLiteral> constants) {
return new BindableWindow(getCluster(), traitSet, getInput(),
constants, getRowType(), groups);
}

@Override public @Nullable RelOptCost computeSelfCost(RelOptPlanner planner,
RelMetadataQuery mq) {
RelOptCost cost = super.computeSelfCost(planner, mq);
Expand Down
8 changes: 8 additions & 0 deletions core/src/main/java/org/apache/calcite/rel/core/Window.java
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,14 @@ public Window(RelOptCluster cluster, RelTraitSet traitSet, RelNode input,
this(cluster, traitSet, Collections.emptyList(), input, constants, rowType, groups);
}

/**
* Creates a copy of this {@code Window}.
*
* @param constants Replaces the list of constants in the returned copy
* @return New {@code Window}
*/
public abstract Window copy(List<RexLiteral> constants);

@Override public boolean isValid(Litmus litmus, @Nullable Context context) {
// In the window specifications, an aggregate call such as
// 'SUM(RexInputRef #10)' refers to expression #10 of inputProgram.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,11 @@ public LogicalWindow(RelOptCluster cluster, RelTraitSet traitSet, RelNode input,
getRowType(), groups);
}

@Override public Window copy(List<RexLiteral> constants) {
return new LogicalWindow(getCluster(), getTraitSet(), getInput(),
constants, getRowType(), groups);
}

/**
* Creates a LogicalWindow.
*
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
/*
* 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.adapter.enumerable;

import org.apache.calcite.plan.Contexts;
import org.apache.calcite.plan.RelOptCluster;
import org.apache.calcite.plan.RelTraitSet;
import org.apache.calcite.rel.AbstractRelNode;
import org.apache.calcite.rel.RelNode;
import org.apache.calcite.rel.core.Window;
import org.apache.calcite.rel.type.RelDataType;
import org.apache.calcite.rel.type.RelDataTypeFactory;
import org.apache.calcite.rel.type.RelDataTypeSystem;
import org.apache.calcite.rel.type.RelDataTypeSystemImpl;
import org.apache.calcite.rex.RexBuilder;
import org.apache.calcite.rex.RexLiteral;
import org.apache.calcite.sql.type.BasicSqlType;
import org.apache.calcite.sql.type.SqlTypeFactoryImpl;
import org.apache.calcite.sql.type.SqlTypeName;
import org.apache.calcite.test.MockRelOptPlanner;

import org.junit.jupiter.api.Test;

import java.util.Collections;
import java.util.List;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotSame;
import static org.junit.jupiter.api.Assertions.assertSame;

/**
* Test for {@link org.apache.calcite.adapter.enumerable.EnumerableWindow}.
*/
public class EnumerableWindowTest {
@Test void testCopyWithConstants() {
final MockRelOptPlanner planner = new MockRelOptPlanner(Contexts.empty());
final RelDataTypeFactory typeFactory =
new SqlTypeFactoryImpl(org.apache.calcite.rel.type.RelDataTypeSystem.DEFAULT);
final RelOptCluster cluster = RelOptCluster.create(planner, new RexBuilder(typeFactory));
final RelTraitSet traitSet = RelTraitSet.createEmpty();
final RelNode relNode = new AbstractRelNode(cluster, traitSet) {
};
final RelDataTypeSystem dataTypeSystem = new RelDataTypeSystemImpl() {
};

final RelDataType dataType = new BasicSqlType(dataTypeSystem, SqlTypeName.BOOLEAN);
final List<RexLiteral> constants =
Collections.singletonList(
RexLiteral.fromJdbcString(dataType,
SqlTypeName.BOOLEAN,
"TRUE"));
final RelDataType rowDataType = new BasicSqlType(dataTypeSystem, SqlTypeName.ROW);
final List<Window.Group> groups = Collections.emptyList();

final EnumerableWindow original =
new EnumerableWindow(cluster, traitSet, relNode, constants, rowDataType, groups);
final List<RexLiteral> newConstants =
Collections.singletonList(
RexLiteral.fromJdbcString(dataType,
SqlTypeName.BOOLEAN,
"FALSE"));
final Window updated = original.copy(newConstants);

assertNotSame(original, updated);
assertEquals(1, original.getConstants().size());
assertSame(constants.get(0), original.getConstants().get(0));
assertEquals(1, updated.getConstants().size());
assertSame(newConstants.get(0), updated.getConstants().get(0));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
/*
* 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.interpreter;

import org.apache.calcite.plan.Contexts;
import org.apache.calcite.plan.RelOptCluster;
import org.apache.calcite.plan.RelTraitSet;
import org.apache.calcite.rel.AbstractRelNode;
import org.apache.calcite.rel.RelNode;
import org.apache.calcite.rel.core.Window;
import org.apache.calcite.rel.type.RelDataType;
import org.apache.calcite.rel.type.RelDataTypeFactory;
import org.apache.calcite.rel.type.RelDataTypeSystem;
import org.apache.calcite.rel.type.RelDataTypeSystemImpl;
import org.apache.calcite.rex.RexBuilder;
import org.apache.calcite.rex.RexLiteral;
import org.apache.calcite.sql.type.BasicSqlType;
import org.apache.calcite.sql.type.SqlTypeFactoryImpl;
import org.apache.calcite.sql.type.SqlTypeName;
import org.apache.calcite.test.MockRelOptPlanner;

import org.junit.jupiter.api.Test;

import java.util.Collections;
import java.util.List;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotSame;
import static org.junit.jupiter.api.Assertions.assertSame;

/**
* Test for {@link org.apache.calcite.interpreter.Bindables.BindableWindow}.
*/
public class BindableWindowTest {
@Test void testCopyWithConstants() {
final MockRelOptPlanner planner = new MockRelOptPlanner(Contexts.empty());
final RelDataTypeFactory typeFactory =
new SqlTypeFactoryImpl(org.apache.calcite.rel.type.RelDataTypeSystem.DEFAULT);
final RelOptCluster cluster = RelOptCluster.create(planner, new RexBuilder(typeFactory));
final RelTraitSet traitSet = RelTraitSet.createEmpty();
final RelNode relNode = new AbstractRelNode(cluster, traitSet) {
};
final RelDataTypeSystem dataTypeSystem = new RelDataTypeSystemImpl() {
};

final RelDataType dataType = new BasicSqlType(dataTypeSystem, SqlTypeName.BOOLEAN);
final List<RexLiteral> constants =
Collections.singletonList(
RexLiteral.fromJdbcString(dataType,
SqlTypeName.BOOLEAN,
"TRUE"));
final RelDataType rowDataType = new BasicSqlType(dataTypeSystem, SqlTypeName.ROW);
final List<Window.Group> groups = Collections.emptyList();

final Bindables.BindableWindow original =
new Bindables.BindableWindow(cluster, traitSet, relNode, constants, rowDataType, groups);
final List<RexLiteral> newConstants =
Collections.singletonList(
RexLiteral.fromJdbcString(dataType,
SqlTypeName.BOOLEAN,
"FALSE"));
final Window updated = original.copy(newConstants);

assertNotSame(original, updated);
assertEquals(1, original.getConstants().size());
assertSame(constants.get(0), original.getConstants().get(0));
assertEquals(1, updated.getConstants().size());
assertSame(newConstants.get(0), updated.getConstants().get(0));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
/*
* 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.logical;

import org.apache.calcite.plan.Contexts;
import org.apache.calcite.plan.RelOptCluster;
import org.apache.calcite.plan.RelTraitSet;
import org.apache.calcite.rel.AbstractRelNode;
import org.apache.calcite.rel.RelNode;
import org.apache.calcite.rel.core.Window;
import org.apache.calcite.rel.type.RelDataType;
import org.apache.calcite.rel.type.RelDataTypeFactory;
import org.apache.calcite.rel.type.RelDataTypeSystem;
import org.apache.calcite.rel.type.RelDataTypeSystemImpl;
import org.apache.calcite.rex.RexBuilder;
import org.apache.calcite.rex.RexLiteral;
import org.apache.calcite.sql.type.BasicSqlType;
import org.apache.calcite.sql.type.SqlTypeFactoryImpl;
import org.apache.calcite.sql.type.SqlTypeName;
import org.apache.calcite.test.MockRelOptPlanner;

import org.junit.jupiter.api.Test;

import java.util.Collections;
import java.util.List;

import static org.apache.calcite.rel.core.Window.Group;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotSame;
import static org.junit.jupiter.api.Assertions.assertSame;

/**
* Test for {@link org.apache.calcite.rel.logical.LogicalWindow}.
*/
public class LogicalWindowTest {
@Test void testCopyWithConstants() {
final MockRelOptPlanner planner = new MockRelOptPlanner(Contexts.empty());
final RelDataTypeFactory typeFactory =
new SqlTypeFactoryImpl(org.apache.calcite.rel.type.RelDataTypeSystem.DEFAULT);
final RelOptCluster cluster = RelOptCluster.create(planner, new RexBuilder(typeFactory));
final RelTraitSet traitSet = RelTraitSet.createEmpty();
final RelNode relNode = new AbstractRelNode(cluster, traitSet) {
};
final RelDataTypeSystem dataTypeSystem = new RelDataTypeSystemImpl() {
};

final RelDataType dataType = new BasicSqlType(dataTypeSystem, SqlTypeName.BOOLEAN);
final List<RexLiteral> constants =
Collections.singletonList(
RexLiteral.fromJdbcString(dataType,
SqlTypeName.BOOLEAN,
"TRUE"));
final RelDataType rowDataType = new BasicSqlType(dataTypeSystem, SqlTypeName.ROW);
final List<Group> groups = Collections.emptyList();

final LogicalWindow original =
new LogicalWindow(cluster, traitSet, relNode, constants, rowDataType, groups);
final List<RexLiteral> newConstants =
Collections.singletonList(
RexLiteral.fromJdbcString(dataType,
SqlTypeName.BOOLEAN,
"FALSE"));
final Window updated = original.copy(newConstants);

assertNotSame(original, updated);
assertEquals(1, original.getConstants().size());
assertSame(constants.get(0), original.getConstants().get(0));
assertEquals(1, updated.getConstants().size());
assertSame(newConstants.get(0), updated.getConstants().get(0));
}
}
2 changes: 2 additions & 0 deletions site/_docs/history.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@ z.
* In the context of [CALCITE-6015] the visibility of the method
`SqlCall.getCallSignature` has been converted from `protected` to `public`.
Any subclass overriding it will need to be adjusted accordingly.
* [<a href="https://issues.apache.org/jira/browse/CALCITE-6321">CALCITE-6321</a>]
Add `copy(List<RexLiteral>)` method to `Window` class

Compatibility: This release is tested on Linux, macOS, Microsoft Windows;
using JDK/OpenJDK versions 8 to 19;
Expand Down

0 comments on commit f948850

Please sign in to comment.