Skip to content

Commit 6a4d236

Browse files
committed
fix: review comments addressed
Signed-off-by: MBWhite <whitemat@uk.ibm.com>
1 parent b963373 commit 6a4d236

File tree

6 files changed

+25
-34
lines changed

6 files changed

+25
-34
lines changed

core/src/main/java/io/substrait/expression/EnumArg.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,8 @@ default <R, C extends VisitationContext, E extends Throwable> R accept(
3232

3333
static EnumArg of(SimpleExtension.EnumArgument enumArg, String option) {
3434
if (!enumArg.options().contains(option)) {
35-
LOGGER.warn(
36-
String.format(
37-
"Function does not accept those arguments %s %s", option, enumArg.options()));
38-
return null;
35+
throw new IllegalArgumentException(
36+
String.format("EnumArg value %s not valid for options: %s", option, enumArg.options()));
3937
}
4038
return builder().value(Optional.of(option)).build();
4139
}

isthmus/src/main/java/io/substrait/isthmus/expression/EnumConverter.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import io.substrait.extension.DefaultExtensionCatalog;
55
import io.substrait.extension.SimpleExtension;
66
import io.substrait.extension.SimpleExtension.Argument;
7-
import io.substrait.isthmus.expression.ScalarFunctionConverter.INDEXING;
87
import java.util.HashMap;
98
import java.util.List;
109
import java.util.Map;
@@ -78,7 +77,7 @@ public class EnumConverter {
7877
TimeUnitRange.class);
7978
calciteEnumMap.put(
8079
argAnchor(DefaultExtensionCatalog.FUNCTIONS_DATETIME, "extract:req_req_date", 1),
81-
INDEXING.class);
80+
ExtractIndexing.class);
8281
}
8382

8483
private static Optional<Enum<?>> constructValue(
@@ -91,9 +90,9 @@ private static Optional<Enum<?>> constructValue(
9190
return option.get().map(SqlTrimFunction.Flag::valueOf);
9291
}
9392

94-
if (cls.isAssignableFrom(INDEXING.class)) {
95-
return option.get().map(INDEXING::valueOf);
96-
}
93+
// ExtractIndexing does not need to be converted here. Calcite
94+
// doesn't have the concept of the indexing. It's date
95+
// functions are all indexed from 1
9796

9897
return Optional.empty();
9998
}

isthmus/src/main/java/io/substrait/isthmus/expression/ExtractDateFunctionMapper.java

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,28 +3,25 @@
33
import io.substrait.expression.Expression;
44
import io.substrait.expression.FunctionArg;
55
import io.substrait.extension.SimpleExtension.ScalarFunctionVariant;
6-
import io.substrait.isthmus.expression.ScalarFunctionConverter.INDEXING;
7-
import java.util.ArrayList;
86
import java.util.Collections;
7+
import java.util.LinkedList;
98
import java.util.List;
109
import java.util.Map;
1110
import java.util.Optional;
1211
import java.util.stream.Collectors;
1312
import org.apache.calcite.avatica.util.TimeUnitRange;
14-
import org.apache.calcite.rel.type.RelDataType;
1513
import org.apache.calcite.rex.RexBuilder;
1614
import org.apache.calcite.rex.RexCall;
1715
import org.apache.calcite.rex.RexLiteral;
1816
import org.apache.calcite.rex.RexNode;
1917
import org.apache.calcite.sql.fun.SqlStdOperatorTable;
20-
import org.apache.calcite.sql.type.BasicSqlType;
2118
import org.apache.calcite.sql.type.SqlTypeName;
2219

2320
/**
2421
* Custom mapping for the Calcite MONTH/DAY/QUARTER functions.
2522
*
2623
* <p>These come from Calcite as 2 argument functions (like YEAR) but in Substrait these functions
27-
* are 3 agumentes; the additional being if this is a 0 or 1 based value. Calcite is a 1 based value
24+
* are 3 arguments; the additional being if this is a 0 or 1 based value. Calcite is a 1 based value
2825
* in this case.
2926
*
3027
* <p>We need to therefore map the MONTH etc functions to a different Substrait function.
@@ -58,12 +55,8 @@ public Optional<SubstraitFunctionMapping> toSubstrait(final RexCall call) {
5855
return Optional.empty();
5956
}
6057

61-
final RelDataType dataType = call.operands.get(1).getType();
62-
if (!(dataType instanceof BasicSqlType)) {
63-
return Optional.empty();
64-
}
65-
66-
if (!((BasicSqlType) dataType).getSqlTypeName().equals(SqlTypeName.DATE)) {
58+
final RexNode dataType = call.operands.get(1);
59+
if (!dataType.getType().getSqlTypeName().equals(SqlTypeName.DATE)) {
6760
return Optional.empty();
6861
}
6962

@@ -74,8 +67,8 @@ public Optional<SubstraitFunctionMapping> toSubstrait(final RexCall call) {
7467
case MONTH:
7568
case DAY:
7669
{
77-
final List<RexNode> newOperands = new ArrayList<>(call.operands);
78-
newOperands.add(1, RexBuilder.DEFAULT.makeFlag(INDEXING.ONE));
70+
final List<RexNode> newOperands = new LinkedList<>(call.operands);
71+
newOperands.add(1, RexBuilder.DEFAULT.makeFlag(ExtractIndexing.ONE));
7972

8073
final ScalarFunctionVariant substraitFn =
8174
this.extractFunctions.get("extract:req_req_date");
@@ -93,7 +86,7 @@ public Optional<List<FunctionArg>> getExpressionArguments(
9386
String name = expression.declaration().toString();
9487

9588
if ("extract:req_req_date".equals(name)) {
96-
final List<FunctionArg> newArgs = new ArrayList<>(expression.arguments());
89+
final List<FunctionArg> newArgs = new LinkedList<>(expression.arguments());
9790
newArgs.remove(1);
9891

9992
return Optional.of(newArgs);
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package io.substrait.isthmus.expression;
2+
3+
/**
4+
* Enum to define the INDEXING property on the date functions.
5+
*
6+
* <p>Controls if the number used for example in months is 0 or 1 based.
7+
*/
8+
public enum ExtractIndexing {
9+
ONE,
10+
ZERO
11+
}

isthmus/src/main/java/io/substrait/isthmus/expression/LiteralConverter.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import io.substrait.expression.Expression;
55
import io.substrait.expression.ExpressionCreator;
66
import io.substrait.isthmus.TypeConverter;
7-
import io.substrait.isthmus.expression.ScalarFunctionConverter.INDEXING;
87
import io.substrait.type.Type;
98
import java.math.BigDecimal;
109
import java.math.RoundingMode;
@@ -89,7 +88,7 @@ public Expression.Literal convert(RexLiteral literal) {
8988
return ExpressionCreator.bool(n, literal.getValueAs(Boolean.class));
9089
case CHAR:
9190
{
92-
Comparable val = literal.getValue();
91+
Comparable<?> val = literal.getValue();
9392
if (val instanceof NlsString) {
9493
NlsString nls = (NlsString) val;
9594
return ExpressionCreator.fixedChar(n, nls.getValue());
@@ -128,14 +127,10 @@ public Expression.Literal convert(RexLiteral literal) {
128127
case SYMBOL:
129128
{
130129
Object value = literal.getValue();
131-
// case TimeUnitRange tur -> string(n, tur.name());
132130
if (value instanceof NlsString) {
133131
return ExpressionCreator.string(n, ((NlsString) value).getValue());
134132
} else if (value instanceof Enum) {
135133
Enum<?> v = (Enum<?>) value;
136-
if (value instanceof INDEXING) {
137-
return ExpressionCreator.string(n, v.name());
138-
}
139134

140135
Optional<Expression.Literal> r =
141136
EnumConverter.canConvert(v)

isthmus/src/main/java/io/substrait/isthmus/expression/ScalarFunctionConverter.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,6 @@ public class ScalarFunctionConverter
3030
*/
3131
private final List<ScalarFunctionMapper> mappers;
3232

33-
public enum INDEXING {
34-
ONE,
35-
ZERO
36-
}
37-
3833
public ScalarFunctionConverter(
3934
List<SimpleExtension.ScalarFunctionVariant> functions, RelDataTypeFactory typeFactory) {
4035
this(functions, Collections.emptyList(), typeFactory, TypeConverter.DEFAULT);

0 commit comments

Comments
 (0)