This is an automated email from the ASF dual-hosted git repository.
mbudiu pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/calcite.git
The following commit(s) were added to refs/heads/main by this push:
new e621c331bd [CALCITE-6690] Arrow adapter support DECIMAL with precision
and scale
e621c331bd is described below
commit e621c331bdf5a58fe9a5e7ee6805a918ad749637
Author: Cancai Cai <[email protected]>
AuthorDate: Sat Dec 14 21:48:07 2024 +0800
[CALCITE-6690] Arrow adapter support DECIMAL with precision and scale
---
...owFieldType.java => ArrowFieldTypeFactory.java} | 67 +++++++++-------------
.../apache/calcite/adapter/arrow/ArrowTable.java | 2 +-
.../adapter/arrow/ArrowAdapterDataTypesTest.java | 36 ++++++++----
.../calcite/adapter/arrow/ArrowAdapterTest.java | 32 +++++------
.../arrow/{ArrowData.java => ArrowDataTest.java} | 44 +++++++++-----
5 files changed, 99 insertions(+), 82 deletions(-)
diff --git
a/arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowFieldType.java
b/arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowFieldTypeFactory.java
similarity index 58%
rename from
arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowFieldType.java
rename to
arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowFieldTypeFactory.java
index 9a0fa3033d..30af9736d3 100644
--- a/arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowFieldType.java
+++
b/arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowFieldTypeFactory.java
@@ -17,84 +17,69 @@
package org.apache.calcite.adapter.arrow;
import org.apache.calcite.adapter.java.JavaTypeFactory;
-import org.apache.calcite.linq4j.tree.Primitive;
import org.apache.calcite.rel.type.RelDataType;
+import org.apache.calcite.sql.type.SqlTypeName;
import org.apache.arrow.vector.types.FloatingPointPrecision;
import org.apache.arrow.vector.types.pojo.ArrowType;
-import java.math.BigDecimal;
-import java.sql.Date;
-import java.util.List;
-
-import static java.util.Objects.requireNonNull;
-
/**
* Arrow field type.
*/
-enum ArrowFieldType {
- INT(Primitive.INT),
- BOOLEAN(Primitive.BOOLEAN),
- STRING(String.class),
- FLOAT(Primitive.FLOAT),
- DOUBLE(Primitive.DOUBLE),
- DATE(Date.class),
- LIST(List.class),
- DECIMAL(BigDecimal.class),
- LONG(Primitive.LONG),
- BYTE(Primitive.BYTE),
- SHORT(Primitive.SHORT);
-
- private final Class<?> clazz;
-
- ArrowFieldType(Primitive primitive) {
- this(requireNonNull(primitive.boxClass, "boxClass"));
- }
+public class ArrowFieldTypeFactory {
- ArrowFieldType(Class<?> clazz) {
- this.clazz = clazz;
+ private ArrowFieldTypeFactory() {
+ throw new UnsupportedOperationException("Utility class");
}
- public RelDataType toType(JavaTypeFactory typeFactory) {
- RelDataType javaType = typeFactory.createJavaType(clazz);
- RelDataType sqlType = typeFactory.createSqlType(javaType.getSqlTypeName());
+ public static RelDataType toType(ArrowType arrowType, JavaTypeFactory
typeFactory) {
+ RelDataType sqlType = of(arrowType, typeFactory);
return typeFactory.createTypeWithNullability(sqlType, true);
}
- public static ArrowFieldType of(ArrowType arrowType) {
+ /**
+ * Converts an Arrow type to a Calcite RelDataType.
+ *
+ * @param arrowType the Arrow type to convert
+ * @param typeFactory the factory to create the Calcite type
+ * @return the corresponding Calcite RelDataType
+ */
+ private static RelDataType of(ArrowType arrowType, JavaTypeFactory
typeFactory) {
switch (arrowType.getTypeID()) {
case Int:
int bitWidth = ((ArrowType.Int) arrowType).getBitWidth();
switch (bitWidth) {
case 64:
- return LONG;
+ return typeFactory.createSqlType(SqlTypeName.BIGINT);
case 32:
- return INT;
+ return typeFactory.createSqlType(SqlTypeName.INTEGER);
case 16:
- return SHORT;
+ return typeFactory.createSqlType(SqlTypeName.SMALLINT);
case 8:
- return BYTE;
+ return typeFactory.createSqlType(SqlTypeName.TINYINT);
default:
throw new IllegalArgumentException("Unsupported Int bit width: " +
bitWidth);
}
case Bool:
- return BOOLEAN;
+ return typeFactory.createSqlType(SqlTypeName.BOOLEAN);
case Utf8:
- return STRING;
+ return typeFactory.createSqlType(SqlTypeName.VARCHAR);
case FloatingPoint:
FloatingPointPrecision precision = ((ArrowType.FloatingPoint)
arrowType).getPrecision();
switch (precision) {
case SINGLE:
- return FLOAT;
+ return typeFactory.createSqlType(SqlTypeName.REAL);
case DOUBLE:
- return DOUBLE;
+ return typeFactory.createSqlType(SqlTypeName.DOUBLE);
default:
throw new IllegalArgumentException("Unsupported Floating point
precision: " + precision);
}
case Date:
- return DATE;
+ return typeFactory.createSqlType(SqlTypeName.DATE);
case Decimal:
- return DECIMAL;
+ return typeFactory.createSqlType(SqlTypeName.DECIMAL,
+ ((ArrowType.Decimal) arrowType).getPrecision(),
+ ((ArrowType.Decimal) arrowType).getScale());
default:
throw new IllegalArgumentException("Unsupported type: " + arrowType);
}
diff --git
a/arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowTable.java
b/arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowTable.java
index eddf83c63d..ba459c7b48 100644
--- a/arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowTable.java
+++ b/arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowTable.java
@@ -179,7 +179,7 @@ public class ArrowTable extends AbstractTable
final RelDataTypeFactory.Builder builder = typeFactory.builder();
for (Field field : schema.getFields()) {
builder.add(field.getName(),
- ArrowFieldType.of(field.getType()).toType(typeFactory));
+ ArrowFieldTypeFactory.toType(field.getType(), typeFactory));
}
return builder.build();
}
diff --git
a/arrow/src/test/java/org/apache/calcite/adapter/arrow/ArrowAdapterDataTypesTest.java
b/arrow/src/test/java/org/apache/calcite/adapter/arrow/ArrowAdapterDataTypesTest.java
index 87dff81d4e..5d3414532d 100644
---
a/arrow/src/test/java/org/apache/calcite/adapter/arrow/ArrowAdapterDataTypesTest.java
+++
b/arrow/src/test/java/org/apache/calcite/adapter/arrow/ArrowAdapterDataTypesTest.java
@@ -58,7 +58,7 @@ public class ArrowAdapterDataTypesTest {
arrowDataDirectory = arrowFilesDirectory.toFile();
File dataLocationFile =
arrowFilesDirectory.resolve("arrowdatatype.arrow").toFile();
- ArrowData arrowDataGenerator = new ArrowData();
+ ArrowDataTest arrowDataGenerator = new ArrowDataTest();
arrowDataGenerator.writeArrowDataType(dataLocationFile);
arrow = ImmutableMap.of("model",
modelFileTarget.toAbsolutePath().toString());
@@ -68,7 +68,7 @@ public class ArrowAdapterDataTypesTest {
String sql = "select \"tinyIntField\" from arrowdatatype";
String plan = "PLAN=ArrowToEnumerableConverter\n"
+ " ArrowProject(tinyIntField=[$0])\n"
- + " ArrowTableScan(table=[[ARROW, ARROWDATATYPE]], fields=[[0, 1,
2, 3, 4, 5, 6, 7, 8, 9]])\n\n";
+ + " ArrowTableScan(table=[[ARROW, ARROWDATATYPE]], fields=[[0, 1,
2, 3, 4, 5, 6, 7, 8, 9, 10]])\n\n";
String result = "tinyIntField=0\ntinyIntField=1\n";
CalciteAssert.that()
.with(arrow)
@@ -82,7 +82,7 @@ public class ArrowAdapterDataTypesTest {
String sql = "select \"smallIntField\" from arrowdatatype";
String plan = "PLAN=ArrowToEnumerableConverter\n"
+ " ArrowProject(smallIntField=[$1])\n"
- + " ArrowTableScan(table=[[ARROW, ARROWDATATYPE]], fields=[[0, 1,
2, 3, 4, 5, 6, 7, 8, 9]])\n\n";
+ + " ArrowTableScan(table=[[ARROW, ARROWDATATYPE]], fields=[[0, 1,
2, 3, 4, 5, 6, 7, 8, 9, 10]])\n\n";
String result = "smallIntField=0\nsmallIntField=1\n";
CalciteAssert.that()
.with(arrow)
@@ -96,7 +96,7 @@ public class ArrowAdapterDataTypesTest {
String sql = "select \"intField\" from arrowdatatype";
String plan = "PLAN=ArrowToEnumerableConverter\n"
+ " ArrowProject(intField=[$2])\n"
- + " ArrowTableScan(table=[[ARROW, ARROWDATATYPE]], fields=[[0, 1,
2, 3, 4, 5, 6, 7, 8, 9]])\n\n";
+ + " ArrowTableScan(table=[[ARROW, ARROWDATATYPE]], fields=[[0, 1,
2, 3, 4, 5, 6, 7, 8, 9, 10]])\n\n";
String result = "intField=0\nintField=1\n";
CalciteAssert.that()
.with(arrow)
@@ -110,7 +110,7 @@ public class ArrowAdapterDataTypesTest {
String sql = "select \"longField\" from arrowdatatype";
String plan = "PLAN=ArrowToEnumerableConverter\n"
+ " ArrowProject(longField=[$5])\n"
- + " ArrowTableScan(table=[[ARROW, ARROWDATATYPE]], fields=[[0, 1,
2, 3, 4, 5, 6, 7, 8, 9]])\n\n";
+ + " ArrowTableScan(table=[[ARROW, ARROWDATATYPE]], fields=[[0, 1,
2, 3, 4, 5, 6, 7, 8, 9, 10]])\n\n";
String result = "longField=0\nlongField=1\n";
CalciteAssert.that()
.with(arrow)
@@ -124,7 +124,7 @@ public class ArrowAdapterDataTypesTest {
String sql = "select \"floatField\" from arrowdatatype";
String plan = "PLAN=ArrowToEnumerableConverter\n"
+ " ArrowProject(floatField=[$4])\n"
- + " ArrowTableScan(table=[[ARROW, ARROWDATATYPE]], fields=[[0, 1,
2, 3, 4, 5, 6, 7, 8, 9]])\n\n";
+ + " ArrowTableScan(table=[[ARROW, ARROWDATATYPE]], fields=[[0, 1,
2, 3, 4, 5, 6, 7, 8, 9, 10]])\n\n";
String result = "floatField=0.0\nfloatField=1.0\n";
CalciteAssert.that()
.with(arrow)
@@ -138,7 +138,7 @@ public class ArrowAdapterDataTypesTest {
String sql = "select \"doubleField\" from arrowdatatype";
String plan = "PLAN=ArrowToEnumerableConverter\n"
+ " ArrowProject(doubleField=[$6])\n"
- + " ArrowTableScan(table=[[ARROW, ARROWDATATYPE]], fields=[[0, 1,
2, 3, 4, 5, 6, 7, 8, 9]])\n\n";
+ + " ArrowTableScan(table=[[ARROW, ARROWDATATYPE]], fields=[[0, 1,
2, 3, 4, 5, 6, 7, 8, 9, 10]])\n\n";
String result = "doubleField=0.0\ndoubleField=1.0\n";
CalciteAssert.that()
.with(arrow)
@@ -152,7 +152,7 @@ public class ArrowAdapterDataTypesTest {
String sql = "select \"decimalField\" from arrowdatatype";
String plan = "PLAN=ArrowToEnumerableConverter\n"
+ " ArrowProject(decimalField=[$8])\n"
- + " ArrowTableScan(table=[[ARROW, ARROWDATATYPE]], fields=[[0, 1,
2, 3, 4, 5, 6, 7, 8, 9]])\n\n";
+ + " ArrowTableScan(table=[[ARROW, ARROWDATATYPE]], fields=[[0, 1,
2, 3, 4, 5, 6, 7, 8, 9, 10]])\n\n";
String result = "decimalField=0.00\ndecimalField=1.00\n";
CalciteAssert.that()
.with(arrow)
@@ -166,7 +166,7 @@ public class ArrowAdapterDataTypesTest {
String sql = "select \"dateField\" from arrowdatatype";
String plan = "PLAN=ArrowToEnumerableConverter\n"
+ " ArrowProject(dateField=[$9])\n"
- + " ArrowTableScan(table=[[ARROW, ARROWDATATYPE]], fields=[[0, 1,
2, 3, 4, 5, 6, 7, 8, 9]])\n\n";
+ + " ArrowTableScan(table=[[ARROW, ARROWDATATYPE]], fields=[[0, 1,
2, 3, 4, 5, 6, 7, 8, 9, 10]])\n\n";
String result = "dateField=1970-01-01\n"
+ "dateField=1970-01-02\n";
CalciteAssert.that()
@@ -181,7 +181,7 @@ public class ArrowAdapterDataTypesTest {
String sql = "select \"booleanField\" from arrowdatatype";
String plan = "PLAN=ArrowToEnumerableConverter\n"
+ " ArrowProject(booleanField=[$7])\n"
- + " ArrowTableScan(table=[[ARROW, ARROWDATATYPE]], fields=[[0, 1,
2, 3, 4, 5, 6, 7, 8, 9]])\n\n";
+ + " ArrowTableScan(table=[[ARROW, ARROWDATATYPE]], fields=[[0, 1,
2, 3, 4, 5, 6, 7, 8, 9, 10]])\n\n";
String result =
"booleanField=null\nbooleanField=true\nbooleanField=false\n";
CalciteAssert.that()
.with(arrow)
@@ -191,4 +191,20 @@ public class ArrowAdapterDataTypesTest {
.explainContains(plan);
}
+ /** Test case for
+ * <a
href="https://issues.apache.org/jira/browse/CALCITE-6690">[CALCITE-6690]
+ * Arrow adapter support DECIMAL with precision and scale</a>. */
+ @Test void testDecimalProject2() {
+ String sql = "select \"decimalField2\" from arrowdatatype";
+ String plan = "PLAN=ArrowToEnumerableConverter\n"
+ + " ArrowProject(decimalField2=[$10])\n"
+ + " ArrowTableScan(table=[[ARROW, ARROWDATATYPE]], fields=[[0, 1,
2, 3, 4, 5, 6, 7, 8, 9, 10]])\n\n";
+ String result = "decimalField2=20.000\ndecimalField2=21.000\n";
+ CalciteAssert.that()
+ .with(arrow)
+ .query(sql)
+ .limit(2)
+ .returns(result)
+ .explainContains(plan);
+ }
}
diff --git
a/arrow/src/test/java/org/apache/calcite/adapter/arrow/ArrowAdapterTest.java
b/arrow/src/test/java/org/apache/calcite/adapter/arrow/ArrowAdapterTest.java
index 39aa328019..2858208450 100644
--- a/arrow/src/test/java/org/apache/calcite/adapter/arrow/ArrowAdapterTest.java
+++ b/arrow/src/test/java/org/apache/calcite/adapter/arrow/ArrowAdapterTest.java
@@ -73,12 +73,12 @@ class ArrowAdapterTest {
arrowDataDirectory = arrowFilesDirectory.toFile();
File dataLocationFile =
arrowFilesDirectory.resolve("arrowdata.arrow").toFile();
- ArrowData arrowDataGenerator = new ArrowData();
+ ArrowDataTest arrowDataGenerator = new ArrowDataTest();
arrowDataGenerator.writeArrowData(dataLocationFile);
arrowDataGenerator.writeScottEmpData(arrowFilesDirectory);
File datatypeLocationFile =
arrowFilesDirectory.resolve("arrowdatatype.arrow").toFile();
- ArrowData arrowtypeDataGenerator = new ArrowData();
+ ArrowDataTest arrowtypeDataGenerator = new ArrowDataTest();
arrowtypeDataGenerator.writeArrowDataType(datatypeLocationFile);
arrow = ImmutableMap.of("model",
modelFileTarget.toAbsolutePath().toString());
@@ -732,8 +732,8 @@ class ArrowAdapterTest {
@Test void testFilteredAgg() {
String sql = "select SUM(SAL) FILTER (WHERE COMM > 400) as SALESSUM from
EMP";
String plan = "PLAN=EnumerableAggregate(group=[{}], SALESSUM=[SUM($0)
FILTER $1])\n"
- + " EnumerableCalc(expr#0..7=[{inputs}], expr#8=[400:DECIMAL(19, 0)],
expr#9=[>($t6, $t8)], "
- + "expr#10=[IS TRUE($t9)], SAL=[$t5], $f1=[$t10])\n"
+ + " EnumerableCalc(expr#0..7=[{inputs}],
expr#8=[CAST($t6):DECIMAL(12, 2)], expr#9=[400.00:DECIMAL(12, 2)], "
+ + "expr#10=[>($t8, $t9)], expr#11=[IS TRUE($t10)], SAL=[$t5],
$f1=[$t11])\n"
+ " ArrowToEnumerableConverter\n"
+ " ArrowTableScan(table=[[ARROW, EMP]], fields=[[0, 1, 2, 3, 4,
5, 6, 7]])\n\n";
String result = "SALESSUM=2500.00\n";
@@ -750,8 +750,8 @@ class ArrowAdapterTest {
String sql = "select SUM(SAL) FILTER (WHERE COMM > 400) as SALESSUM from
EMP group by EMPNO";
String plan = "PLAN=EnumerableCalc(expr#0..1=[{inputs}], SALESSUM=[$t1])\n"
+ " EnumerableAggregate(group=[{0}], SALESSUM=[SUM($1) FILTER $2])\n"
- + " EnumerableCalc(expr#0..7=[{inputs}], expr#8=[400:DECIMAL(19,
0)], expr#9=[>($t6, $t8)], "
- + "expr#10=[IS TRUE($t9)], EMPNO=[$t0], SAL=[$t5], $f2=[$t10])\n"
+ + " EnumerableCalc(expr#0..7=[{inputs}],
expr#8=[CAST($t6):DECIMAL(12, 2)], expr#9=[400.00:DECIMAL(12, 2)], "
+ + "expr#10=[>($t8, $t9)], expr#11=[IS TRUE($t10)], EMPNO=[$t0],
SAL=[$t5], $f2=[$t11])\n"
+ " ArrowToEnumerableConverter\n"
+ " ArrowTableScan(table=[[ARROW, EMP]], fields=[[0, 1, 2, 3,
4, 5, 6, 7]])\n\n";
String result = "SALESSUM=1250.00\nSALESSUM=null\n";
@@ -860,7 +860,7 @@ class ArrowAdapterTest {
String plan = "PLAN=ArrowToEnumerableConverter\n"
+ " ArrowProject(booleanField=[$7])\n"
+ " ArrowFilter(condition=[$7])\n"
- + " ArrowTableScan(table=[[ARROW, ARROWDATATYPE]], fields=[[0, 1,
2, 3, 4, 5, 6, 7, 8, 9]])\n\n";
+ + " ArrowTableScan(table=[[ARROW, ARROWDATATYPE]], fields=[[0, 1,
2, 3, 4, 5, 6, 7, 8, 9, 10]])\n\n";
String result = "booleanField=true\nbooleanField=true\n";
CalciteAssert.that()
@@ -878,7 +878,7 @@ class ArrowAdapterTest {
String plan = "PLAN=ArrowToEnumerableConverter\n"
+ " ArrowProject(intField=[$2])\n"
+ " ArrowFilter(condition=[>($2, 10)])\n"
- + " ArrowTableScan(table=[[ARROW, ARROWDATATYPE]], fields=[[0, 1,
2, 3, 4, 5, 6, 7, 8, 9]])\n\n";
+ + " ArrowTableScan(table=[[ARROW, ARROWDATATYPE]], fields=[[0, 1,
2, 3, 4, 5, 6, 7, 8, 9, 10]])\n\n";
String result = "intField=11\nintField=12\n";
CalciteAssert.that()
@@ -896,7 +896,7 @@ class ArrowAdapterTest {
String plan = "PLAN=ArrowToEnumerableConverter\n"
+ " ArrowProject(booleanField=[$7])\n"
+ " ArrowFilter(condition=[NOT($7)])\n"
- + " ArrowTableScan(table=[[ARROW, ARROWDATATYPE]], fields=[[0, 1,
2, 3, 4, 5, 6, 7, 8, 9]])\n\n";
+ + " ArrowTableScan(table=[[ARROW, ARROWDATATYPE]], fields=[[0, 1,
2, 3, 4, 5, 6, 7, 8, 9, 10]])\n\n";
String result = "booleanField=false\nbooleanField=false\n";
CalciteAssert.that()
@@ -915,7 +915,7 @@ class ArrowAdapterTest {
String plan = "PLAN=ArrowToEnumerableConverter\n"
+ " ArrowProject(booleanField=[$7])\n"
+ " ArrowFilter(condition=[IS NOT TRUE($7)])\n"
- + " ArrowTableScan(table=[[ARROW, ARROWDATATYPE]], fields=[[0, 1,
2, 3, 4, 5, 6, 7, 8, 9]])\n\n";
+ + " ArrowTableScan(table=[[ARROW, ARROWDATATYPE]], fields=[[0, 1,
2, 3, 4, 5, 6, 7, 8, 9, 10]])\n\n";
String result = "booleanField=null\nbooleanField=false\n";
CalciteAssert.that()
@@ -933,7 +933,7 @@ class ArrowAdapterTest {
String plan = "PLAN=ArrowToEnumerableConverter\n"
+ " ArrowProject(booleanField=[$7])\n"
+ " ArrowFilter(condition=[IS NOT FALSE($7)])\n"
- + " ArrowTableScan(table=[[ARROW, ARROWDATATYPE]], fields=[[0, 1,
2, 3, 4, 5, 6, 7, 8, 9]])\n\n";
+ + " ArrowTableScan(table=[[ARROW, ARROWDATATYPE]], fields=[[0, 1,
2, 3, 4, 5, 6, 7, 8, 9, 10]])\n\n";
String result = "booleanField=null\nbooleanField=true\n";
CalciteAssert.that()
@@ -951,7 +951,7 @@ class ArrowAdapterTest {
String plan = "PLAN=ArrowToEnumerableConverter\n"
+ " ArrowProject(booleanField=[$7])\n"
+ " ArrowFilter(condition=[IS NULL($7)])\n"
- + " ArrowTableScan(table=[[ARROW, ARROWDATATYPE]], fields=[[0, 1,
2, 3, 4, 5, 6, 7, 8, 9]])\n\n";
+ + " ArrowTableScan(table=[[ARROW, ARROWDATATYPE]], fields=[[0, 1,
2, 3, 4, 5, 6, 7, 8, 9, 10]])\n\n";
String result = "booleanField=null\n";
CalciteAssert.that()
@@ -971,8 +971,8 @@ class ArrowAdapterTest {
+ "where \"decimalField\" = 1.00";
String plan = "PLAN=ArrowToEnumerableConverter\n"
+ " ArrowProject(decimalField=[$8])\n"
- + " ArrowFilter(condition=[=($8, 1)])\n"
- + " ArrowTableScan(table=[[ARROW, ARROWDATATYPE]], fields=[[0, 1,
2, 3, 4, 5, 6, 7, 8, 9]])\n\n";
+ + " ArrowFilter(condition=[=($8, 1.00)])\n"
+ + " ArrowTableScan(table=[[ARROW, ARROWDATATYPE]], fields=[[0, 1,
2, 3, 4, 5, 6, 7, 8, 9, 10]])\n\n";
String result = "decimalField=1.00\n";
CalciteAssert.that()
@@ -989,7 +989,7 @@ class ArrowAdapterTest {
String plan = "PLAN=ArrowToEnumerableConverter\n"
+ " ArrowProject(doubleField=[$6])\n"
+ " ArrowFilter(condition=[=($6, 1.0E0)])\n"
- + " ArrowTableScan(table=[[ARROW, ARROWDATATYPE]], fields=[[0, 1,
2, 3, 4, 5, 6, 7, 8, 9]])\n\n";
+ + " ArrowTableScan(table=[[ARROW, ARROWDATATYPE]], fields=[[0, 1,
2, 3, 4, 5, 6, 7, 8, 9, 10]])\n\n";
String result = "doubleField=1.0\n";
CalciteAssert.that()
@@ -1006,7 +1006,7 @@ class ArrowAdapterTest {
String plan = "PLAN=ArrowToEnumerableConverter\n"
+ " ArrowProject(stringField=[$3])\n"
+ " ArrowFilter(condition=[=($3, '1')])\n"
- + " ArrowTableScan(table=[[ARROW, ARROWDATATYPE]], fields=[[0, 1,
2, 3, 4, 5, 6, 7, 8, 9]])\n\n";
+ + " ArrowTableScan(table=[[ARROW, ARROWDATATYPE]], fields=[[0, 1,
2, 3, 4, 5, 6, 7, 8, 9, 10]])\n\n";
String result = "stringField=1\n";
CalciteAssert.that()
diff --git
a/arrow/src/test/java/org/apache/calcite/adapter/arrow/ArrowData.java
b/arrow/src/test/java/org/apache/calcite/adapter/arrow/ArrowDataTest.java
similarity index 93%
rename from arrow/src/test/java/org/apache/calcite/adapter/arrow/ArrowData.java
rename to
arrow/src/test/java/org/apache/calcite/adapter/arrow/ArrowDataTest.java
index 482a15e902..9557c69af2 100644
--- a/arrow/src/test/java/org/apache/calcite/adapter/arrow/ArrowData.java
+++ b/arrow/src/test/java/org/apache/calcite/adapter/arrow/ArrowDataTest.java
@@ -63,7 +63,7 @@ import java.util.List;
/**
* Class that can be used to generate Arrow sample data into a data directory.
*/
-public class ArrowData {
+public class ArrowDataTest {
private final int batchSize;
private final int entries;
@@ -77,7 +77,7 @@ public class ArrowData {
private boolean booleanValue;
private BigDecimal decimalValue;
- public ArrowData() {
+ public ArrowDataTest() {
this.batchSize = 20;
this.entries = 50;
this.tinyIntValue = 0;
@@ -103,7 +103,8 @@ public class ArrowData {
FieldType doubleType =
FieldType.nullable(new
ArrowType.FloatingPoint(FloatingPointPrecision.DOUBLE));
FieldType booleanType = FieldType.nullable(new ArrowType.Bool());
- FieldType decimalType = FieldType.nullable(new ArrowType.Decimal(10, 2,
128));
+ FieldType decimalType = FieldType.nullable(new ArrowType.Decimal(12, 2,
128));
+ FieldType decimalType2 = FieldType.nullable(new ArrowType.Decimal(12, 3,
128));
FieldType dateType = FieldType.nullable(new ArrowType.Date(DateUnit.DAY));
childrenBuilder.add(new Field("tinyIntField", tinyIntType, null));
@@ -116,6 +117,7 @@ public class ArrowData {
childrenBuilder.add(new Field("booleanField", booleanType, null));
childrenBuilder.add(new Field("decimalField", decimalType, null));
childrenBuilder.add(new Field("dateField", dateType, null));
+ childrenBuilder.add(new Field("decimalField2", decimalType2, null));
return new Schema(childrenBuilder.build(), null);
}
@@ -237,35 +239,38 @@ public class ArrowData {
vectorSchemaRoot.setRowCount(numRows);
for (Field field : vectorSchemaRoot.getSchema().getFields()) {
FieldVector vector = vectorSchemaRoot.getVector(field.getName());
- switch (vector.getMinorType()) {
- case TINYINT:
+ switch (field.getName()) {
+ case "tinyIntField":
tinyIntField(vector, numRows);
break;
- case SMALLINT:
+ case "smallIntField":
smallIntFiled(vector, numRows);
break;
- case INT:
+ case "intField":
intField(vector, numRows);
break;
- case FLOAT4:
+ case "floatField":
floatField(vector, numRows);
break;
- case VARCHAR:
+ case "stringField":
varCharField(vector, numRows);
break;
- case BIGINT:
+ case "longField":
longField(vector, numRows);
break;
- case FLOAT8:
+ case "doubleField":
doubleField(vector, numRows);
break;
- case BIT:
+ case "booleanField":
booleanField(vector, numRows);
break;
- case DECIMAL:
+ case "decimalField":
decimalField(vector, numRows);
break;
- case DATEDAY:
+ case "decimalField2":
+ decimalField2(vector, numRows);
+ break;
+ case "dateField":
dateField(vector, numRows);
break;
default:
@@ -386,6 +391,17 @@ public class ArrowData {
fieldVector.setValueCount(rowCount);
}
+ private void decimalField2(FieldVector fieldVector, int rowCount) {
+ DecimalVector decimalVector = (DecimalVector) fieldVector;
+ decimalVector.setInitialCapacity(rowCount);
+ decimalVector.allocateNew();
+ for (int i = 0; i < rowCount; i++) {
+ decimalVector.set(i, this.decimalValue.setScale(3));
+ this.decimalValue = this.decimalValue.add(BigDecimal.ONE);
+ }
+ fieldVector.setValueCount(rowCount);
+ }
+
private void dateField(FieldVector fieldVector, int rowCount) {
DateDayVector dateDayVector = (DateDayVector) fieldVector;
dateDayVector.setInitialCapacity(rowCount);