Skip to content

Commit 0da5797

Browse files
committed
feat: SAP changes
1 parent c838dd4 commit 0da5797

File tree

62 files changed

+1616
-315
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

62 files changed

+1616
-315
lines changed

build.sh

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
#!/bin/bash
2+
#
3+
# Licensed to the Apache Software Foundation (ASF) under one or more
4+
# contributor license agreements. See the NOTICE file distributed with
5+
# this work for additional information regarding copyright ownership.
6+
# The ASF licenses this file to you under the Apache License, Version 2.0
7+
# (the "License"); you may not use this file except in compliance with
8+
# the License. You may obtain a copy of the License at
9+
#
10+
# http://www.apache.org/licenses/LICENSE-2.0
11+
#
12+
# Unless required by applicable law or agreed to in writing, software
13+
# distributed under the License is distributed on an "AS IS" BASIS,
14+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
# See the License for the specific language governing permissions and
16+
# limitations under the License.
17+
#
18+
set -e
19+
VERSION=1.41.0
20+
21+
# Java 21 doesn't suppport Java 8
22+
#if [ -d /Library/Java/JavaVirtualMachines/sapmachine-jdk-17.0.11.jdk/Contents/Home ]; then
23+
# export JAVA_HOME=/Library/Java/JavaVirtualMachines/sapmachine-jdk-17.0.11.jdk/Contents/Home
24+
# export PATH=$JAVA_HOME/bin:$PATH
25+
#fi
26+
27+
#if [ -d /Library/Java/JavaVirtualMachines/sapmachine-17.jdk/Contents/Home ]; then
28+
# export JAVA_HOME=/Library/Java/JavaVirtualMachines/sapmachine-17.jdk/Contents/Home
29+
# export PATH=$JAVA_HOME/bin:$PATH
30+
#fi
31+
32+
for module in linq4j core;
33+
do
34+
./gradlew :${module}:clean -x :core:javadoc :${module}:publishToMavenLocal
35+
mvn install:install-file \
36+
-Dfile=${module}/build/libs/calcite-${module}-$VERSION-SNAPSHOT.jar \
37+
-DgroupId=org.apache.calcite \
38+
-DartifactId=calcite-${module}-sap \
39+
-Dversion=$VERSION \
40+
-Dpackaging=jar \
41+
-DlocalRepositoryPath=../nucleus-resources-app/patches/
42+
mvn install:install-file \
43+
-Dfile=${module}/build/libs/calcite-${module}-$VERSION-SNAPSHOT.jar \
44+
-DgroupId=org.apache.calcite \
45+
-DartifactId=calcite-${module}-sap \
46+
-Dversion=$VERSION \
47+
-Dpackaging=jar \
48+
-DlocalRepositoryPath=$HOME/.m2/repository
49+
cat ${module}/build/publications/${module}/pom-default.xml | \
50+
sed -e "s/calcite-${module}/calcite-${module}-sap/g" -e "s/${VERSION}-SNAPSHOT/${VERSION}/g" > \
51+
../nucleus-resources-app/patches/org/apache/calcite/calcite-${module}-sap/$VERSION/calcite-${module}-sap-$VERSION.pom
52+
done

core/src/main/java/org/apache/calcite/DataContext.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,19 @@ public interface DataContext {
6969
*/
7070
@Nullable Object get(String name);
7171

72+
/**
73+
* Returns a context variable.
74+
*
75+
* <p>Supported variables include: "sparkContext", "currentTimestamp",
76+
* "localTimestamp".</p>
77+
*
78+
* @param name Name of variable
79+
* @param clazz Type of variable
80+
*/
81+
@Nullable default <T> T get(String name, Class<T> clazz) {
82+
return (T) get(name);
83+
}
84+
7285
/** Variable that may be asked for in a call to {@link DataContext#get}. */
7386
enum Variable {
7487
UTC_TIMESTAMP("utcTimestamp", Long.class),

core/src/main/java/org/apache/calcite/adapter/clone/CloneSchema.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
import org.apache.calcite.rel.RelCollation;
2727
import org.apache.calcite.rel.RelCollations;
2828
import org.apache.calcite.rel.type.RelProtoDataType;
29+
import org.apache.calcite.schema.lookup.LikePattern;
30+
import org.apache.calcite.schema.lookup.Lookup;
2931
import org.apache.calcite.schema.QueryableTable;
3032
import org.apache.calcite.schema.Schema;
3133
import org.apache.calcite.schema.SchemaFactory;

core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableBatchNestedLoopJoin.java

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
public class EnumerableBatchNestedLoopJoin extends Join implements EnumerableRel {
5656

5757
private final ImmutableBitSet requiredColumns;
58+
private final @Nullable Double originRowCount;
5859
protected EnumerableBatchNestedLoopJoin(
5960
RelOptCluster cluster,
6061
RelTraitSet traits,
@@ -63,18 +64,32 @@ protected EnumerableBatchNestedLoopJoin(
6364
RexNode condition,
6465
Set<CorrelationId> variablesSet,
6566
ImmutableBitSet requiredColumns,
66-
JoinRelType joinType) {
67+
JoinRelType joinType,
68+
double originRowCount) {
6769
super(cluster, traits, ImmutableList.of(), left, right, condition, variablesSet, joinType);
6870
this.requiredColumns = requiredColumns;
71+
this.originRowCount = originRowCount;
6972
}
7073

74+
@Deprecated
7175
public static EnumerableBatchNestedLoopJoin create(
7276
RelNode left,
7377
RelNode right,
7478
RexNode condition,
7579
ImmutableBitSet requiredColumns,
7680
Set<CorrelationId> variablesSet,
7781
JoinRelType joinType) {
82+
return create(left, right, condition, requiredColumns, variablesSet, joinType, null);
83+
}
84+
85+
public static EnumerableBatchNestedLoopJoin create(
86+
RelNode left,
87+
RelNode right,
88+
RexNode condition,
89+
ImmutableBitSet requiredColumns,
90+
Set<CorrelationId> variablesSet,
91+
JoinRelType joinType,
92+
@Nullable Double originRowCount) {
7893
final RelOptCluster cluster = left.getCluster();
7994
final RelMetadataQuery mq = cluster.getMetadataQuery();
8095
final RelTraitSet traitSet =
@@ -89,9 +104,11 @@ public static EnumerableBatchNestedLoopJoin create(
89104
condition,
90105
variablesSet,
91106
requiredColumns,
92-
joinType);
107+
joinType,
108+
originRowCount);
93109
}
94110

111+
95112
@Override public @Nullable Pair<RelTraitSet, List<RelTraitSet>> passThroughTraits(
96113
final RelTraitSet required) {
97114
return EnumerableTraitsUtils.passThroughTraitsForJoin(
@@ -115,8 +132,8 @@ public static EnumerableBatchNestedLoopJoin create(
115132
@Override public EnumerableBatchNestedLoopJoin copy(RelTraitSet traitSet,
116133
RexNode condition, RelNode left, RelNode right, JoinRelType joinType,
117134
boolean semiJoinDone) {
118-
return new EnumerableBatchNestedLoopJoin(getCluster(), traitSet,
119-
left, right, condition, variablesSet, requiredColumns, joinType);
135+
return new EnumerableBatchNestedLoopJoin(getCluster(), traitSet, left, right, condition,
136+
variablesSet, requiredColumns, joinType, originRowCount);
120137
}
121138

122139
@Override public @Nullable RelOptCost computeSelfCost(
@@ -149,6 +166,10 @@ public static EnumerableBatchNestedLoopJoin create(
149166
return pw.item("batchSize", variablesSet.size());
150167
}
151168

169+
public Double getOriginRowCount() {
170+
return originRowCount;
171+
}
172+
152173
@Override public Result implement(EnumerableRelImplementor implementor, Prefer pref) {
153174
final BlockBuilder builder = new BlockBuilder();
154175
final Result leftResult =

core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableBatchNestedLoopJoinRule.java

Lines changed: 59 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,21 @@
1616
*/
1717
package org.apache.calcite.adapter.enumerable;
1818

19+
import java.util.function.Predicate;
20+
21+
import java.util.function.Supplier;
22+
23+
import org.apache.calcite.adapter.jdbc.JdbcConvention;
1924
import org.apache.calcite.plan.RelOptCluster;
2025
import org.apache.calcite.plan.RelOptRuleCall;
2126
import org.apache.calcite.plan.RelRule;
27+
import org.apache.calcite.plan.RelTrait;
2228
import org.apache.calcite.rel.RelNode;
2329
import org.apache.calcite.rel.core.CorrelationId;
2430
import org.apache.calcite.rel.core.Join;
2531
import org.apache.calcite.rel.core.JoinRelType;
2632
import org.apache.calcite.rel.logical.LogicalJoin;
33+
import org.apache.calcite.rel.type.RelDataType;
2734
import org.apache.calcite.rex.RexBuilder;
2835
import org.apache.calcite.rex.RexCorrelVariable;
2936
import org.apache.calcite.rex.RexInputRef;
@@ -32,6 +39,7 @@
3239
import org.apache.calcite.tools.RelBuilder;
3340
import org.apache.calcite.tools.RelBuilderFactory;
3441
import org.apache.calcite.util.ImmutableBitSet;
42+
import org.apache.calcite.util.Util;
3543

3644
import org.immutables.value.Value;
3745

@@ -79,10 +87,45 @@ public EnumerableBatchNestedLoopJoinRule(RelBuilderFactory relBuilderFactory,
7987
@Override public boolean matches(RelOptRuleCall call) {
8088
Join join = call.rel(0);
8189
JoinRelType joinType = join.getJoinType();
82-
return joinType == JoinRelType.INNER
90+
return (joinType == JoinRelType.INNER
8391
|| joinType == JoinRelType.LEFT
8492
|| joinType == JoinRelType.ANTI
85-
|| joinType == JoinRelType.SEMI;
93+
|| joinType == JoinRelType.SEMI )
94+
&& !allLeafsMatch(join, new HasSingleJdbcSource());
95+
}
96+
97+
private static class HasSingleJdbcSource implements Predicate<RelNode> {
98+
private JdbcConvention convention = null;
99+
@Override
100+
public boolean test(RelNode node) {
101+
for (RelTrait trait : node.getTraitSet()) {
102+
if (trait instanceof JdbcConvention) {
103+
JdbcConvention otherConvention = (JdbcConvention) trait;
104+
// The first leaf in the tree sets the convention
105+
if (convention == null) {
106+
convention = otherConvention;
107+
return true;
108+
}
109+
// All other leafs must match the stored convention
110+
return convention == otherConvention;
111+
}
112+
}
113+
return false;
114+
}
115+
}
116+
117+
private boolean allLeafsMatch(RelNode node, HasSingleJdbcSource predicate) {
118+
List<RelNode> inputs = node.getInputs();
119+
if ( inputs.isEmpty()) {
120+
return predicate.test(node);
121+
} else {
122+
for ( RelNode input : inputs) {
123+
if ( !allLeafsMatch(input.stripped(), predicate)) {
124+
return false;
125+
}
126+
}
127+
}
128+
return true;
86129
}
87130

88131
@Override public void onMatch(RelOptRuleCall call) {
@@ -93,17 +136,15 @@ public EnumerableBatchNestedLoopJoinRule(RelBuilderFactory relBuilderFactory,
93136
final RelBuilder relBuilder = call.builder();
94137

95138
final Set<CorrelationId> correlationIds = new HashSet<>();
96-
final List<RexNode> corrVarList = new ArrayList<>();
97139

98-
final int batchSize = config.batchSize();
99-
for (int i = 0; i < batchSize; i++) {
140+
final RelDataType leftRowType = join.getLeft().getRowType();
141+
int batchSize = config.batchSize();
142+
Supplier<RexNode> corrVarSupplier = () -> {
100143
CorrelationId correlationId = cluster.createCorrel();
101144
correlationIds.add(correlationId);
102-
corrVarList.add(
103-
rexBuilder.makeCorrel(join.getLeft().getRowType(),
104-
correlationId));
105-
}
106-
final RexNode corrVar0 = corrVarList.get(0);
145+
return rexBuilder.makeCorrel(leftRowType,correlationId);
146+
};
147+
final RexNode corrVar0 = corrVarSupplier.get();
107148

108149
final ImmutableBitSet.Builder requiredColumns = ImmutableBitSet.builder();
109150

@@ -123,12 +164,14 @@ public EnumerableBatchNestedLoopJoinRule(RelBuilderFactory relBuilderFactory,
123164
final List<RexNode> conditionList = new ArrayList<>();
124165
conditionList.add(condition);
125166

167+
if ( requiredColumns.cardinality() > 2) {
168+
batchSize = batchSize * 2 / requiredColumns.cardinality();
169+
}
126170
// Add batchSize-1 other conditions
127171
for (int i = 1; i < batchSize; i++) {
128-
final int corrIndex = i;
129172
final RexNode condition2 = condition.accept(new RexShuttle() {
130173
@Override public RexNode visitCorrelVariable(RexCorrelVariable variable) {
131-
return variable.equals(corrVar0) ? corrVarList.get(corrIndex) : variable;
174+
return variable.equals(corrVar0) ? corrVarSupplier.get() : variable;
132175
}
133176
});
134177
conditionList.add(condition2);
@@ -137,6 +180,8 @@ public EnumerableBatchNestedLoopJoinRule(RelBuilderFactory relBuilderFactory,
137180
// Push a filter with batchSize disjunctions
138181
relBuilder.push(join.getRight()).filter(relBuilder.or(conditionList));
139182
final RelNode right = relBuilder.build();
183+
final double originRowCount =
184+
Util.first(call.getMetadataQuery().getRowCount(join), Double.MAX_VALUE);
140185

141186
call.transformTo(
142187
EnumerableBatchNestedLoopJoin.create(
@@ -147,7 +192,8 @@ public EnumerableBatchNestedLoopJoinRule(RelBuilderFactory relBuilderFactory,
147192
join.getCondition(),
148193
requiredColumns.build(),
149194
correlationIds,
150-
join.getJoinType()));
195+
join.getJoinType(),
196+
originRowCount));
151197
}
152198

153199
/** Rule configuration. */

core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableLimit.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -121,11 +121,10 @@ public static EnumerableLimit create(final RelNode input, @Nullable RexNode offs
121121
static Expression getExpression(RexNode rexNode) {
122122
if (rexNode instanceof RexDynamicParam) {
123123
final RexDynamicParam param = (RexDynamicParam) rexNode;
124-
return Expressions.convert_(
125-
Expressions.call(DataContext.ROOT,
126-
BuiltInMethod.DATA_CONTEXT_GET.method,
127-
Expressions.constant("?" + param.getIndex())),
128-
Integer.class);
124+
return Expressions.call(DataContext.ROOT,
125+
BuiltInMethod.DATA_CONTEXT_GET_TYPED.method,
126+
Expressions.constant("?" + param.getIndex()),
127+
Expressions.constant(Integer.class));
129128
} else {
130129
// TODO: Enumerable runtime only supports INT types for FETCH and OFFSET, not BIGINT types.
131130
// Currently, using BIGINT types for execution will result in an error message.

core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeJoin.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -438,7 +438,7 @@ public static EnumerableMergeJoin create(RelNode left, RelNode right,
438438
BlockBuilder builder = new BlockBuilder();
439439
final Result leftResult =
440440
implementor.visitChild(this, 0, (EnumerableRel) left, pref);
441-
final Expression leftExpression =
441+
Expression leftExpression =
442442
builder.append("left", leftResult.block);
443443
final ParameterExpression left_ =
444444
Expressions.parameter(leftResult.physType.getJavaRowType(), "left");
@@ -511,15 +511,21 @@ public static EnumerableMergeJoin create(RelNode left, RelNode right,
511511
PhysTypeImpl.of(typeFactory, comparatorRowType, JavaRowFormat.LIST);
512512
final RelCollation collation = RelCollations.of(fieldCollations);
513513
final Expression comparator = comparatorPhysType.generateMergeJoinComparator(collation);
514-
514+
if (joinType == JoinRelType.INNER || joinType == JoinRelType.SEMI) {
515+
leftExpression = Expressions.call(BuiltInMethod.MERGE_JOIN_NOT_NULL_ENUMERABLE.method, leftExpression,
516+
Expressions.lambda(
517+
leftKeyPhysType.record(leftExpressions), left_));
518+
}
515519
return implementor.result(
516520
physType,
517521
builder.append(
518522
Expressions.call(
519523
BuiltInMethod.MERGE_JOIN.method,
520524
Expressions.list(
521525
leftExpression,
522-
rightExpression,
526+
Expressions.call(BuiltInMethod.MERGE_JOIN_NOT_NULL_ENUMERABLE.method, rightExpression,
527+
Expressions.lambda(
528+
rightKeyPhysType.record(rightExpressions), right_)),
523529
Expressions.lambda(
524530
leftKeyPhysType.record(leftExpressions), left_),
525531
Expressions.lambda(

core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeUnion.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.apache.calcite.linq4j.tree.Expressions;
2323
import org.apache.calcite.linq4j.tree.ParameterExpression;
2424
import org.apache.calcite.plan.RelOptCluster;
25+
import org.apache.calcite.plan.RelTrait;
2526
import org.apache.calcite.plan.RelTraitSet;
2627
import org.apache.calcite.rel.RelCollation;
2728
import org.apache.calcite.rel.RelNode;
@@ -47,7 +48,7 @@ protected EnumerableMergeUnion(RelOptCluster cluster, RelTraitSet traitSet,
4748
throw new IllegalArgumentException("EnumerableMergeUnion with no collation");
4849
}
4950
for (RelNode input : inputs) {
50-
final RelCollation inputCollation = input.getTraitSet().getCollation();
51+
final RelTrait inputCollation = input.getTraitSet().getCollation();
5152
if (inputCollation == null || !inputCollation.satisfies(collation)) {
5253
throw new IllegalArgumentException("EnumerableMergeUnion input does "
5354
+ "not satisfy collation. EnumerableMergeUnion collation: "

core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRelImplementor.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -157,11 +157,10 @@ public ClassDeclaration implementRoot(EnumerableRel rootRel,
157157
final Collection<Statement> stashed =
158158
Collections2.transform(stashedParameters.values(),
159159
input -> Expressions.declare(Modifier.FINAL, input,
160-
Expressions.convert_(
161-
Expressions.call(DataContext.ROOT,
162-
BuiltInMethod.DATA_CONTEXT_GET.method,
163-
Expressions.constant(input.name)),
164-
input.type)));
160+
Expressions.call(DataContext.ROOT,
161+
BuiltInMethod.DATA_CONTEXT_GET_TYPED.method,
162+
Expressions.constant(input.name),
163+
Expressions.constant(input.type))));
165164

166165
final BlockStatement block =
167166
Expressions.block(

core/src/main/java/org/apache/calcite/adapter/enumerable/JavaRowFormat.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import java.lang.reflect.Type;
3838
import java.util.ArrayList;
3939
import java.util.List;
40+
import java.util.stream.Collectors;
4041

4142
import static org.apache.calcite.util.BuiltInMethod.ARRAY_COPY;
4243
import static org.apache.calcite.util.BuiltInMethod.LIST_TO_ARRAY;
@@ -218,7 +219,9 @@ public enum JavaRowFormat {
218219
BuiltInMethod.LIST_N.method,
219220
Expressions.newArrayInit(
220221
Comparable.class,
221-
expressions)),
222+
expressions.stream()
223+
.map(it -> it.type == Object.class ? Expressions.convert_(it,Comparable.class) : it)
224+
.collect(Collectors.toList()))),
222225
List.class);
223226
}
224227
}

0 commit comments

Comments
 (0)