This is an automated email from the ASF dual-hosted git repository.
ptupitsyn pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git
The following commit(s) were added to refs/heads/main by this push:
new f21ce1cae3 IGNITE-23268 Fix Catalog API temporal type mapping (#4646)
f21ce1cae3 is described below
commit f21ce1cae3f8115a2126190a14fe3e8a293cfda1
Author: Pavel Tupitsyn <[email protected]>
AuthorDate: Wed Oct 30 13:20:08 2024 +0200
IGNITE-23268 Fix Catalog API temporal type mapping (#4646)
* Fix SQL to Java type mapping in Catalog API
* Add tests for all supported column types
---
.../java/org/apache/ignite/catalog/ColumnType.java | 23 ++++++---
.../internal/catalog/AllColumnTypesPojo.java | 50 ++++++++++++++++++
.../ignite/internal/catalog/ItCatalogDslTest.java | 59 ++++++++++++++++++++++
.../catalog/sql/CreateFromAnnotationsTest.java | 39 ++++++++++++++
4 files changed, 163 insertions(+), 8 deletions(-)
diff --git
a/modules/api/src/main/java/org/apache/ignite/catalog/ColumnType.java
b/modules/api/src/main/java/org/apache/ignite/catalog/ColumnType.java
index 08fd08cf0a..b384896d09 100644
--- a/modules/api/src/main/java/org/apache/ignite/catalog/ColumnType.java
+++ b/modules/api/src/main/java/org/apache/ignite/catalog/ColumnType.java
@@ -18,9 +18,10 @@
package org.apache.ignite.catalog;
import java.math.BigDecimal;
-import java.sql.Time;
-import java.sql.Timestamp;
-import java.util.Date;
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.UUID;
@@ -83,23 +84,23 @@ public class ColumnType<T> {
}
/** {@code TIME} SQL column type. */
- public static final ColumnType<Time> TIME = new ColumnType<>(Time.class,
"time");
+ public static final ColumnType<LocalTime> TIME = new
ColumnType<>(LocalTime.class, "time");
/** {@code TIME} with specified precision. */
- public static ColumnType<Time> time(int precision) {
+ public static ColumnType<LocalTime> time(int precision) {
return TIME.copy().precision(precision);
}
/** {@code TIMESTAMP} SQL column type. */
- public static final ColumnType<Timestamp> TIMESTAMP = new
ColumnType<>(Timestamp.class, "timestamp");
+ public static final ColumnType<LocalDateTime> TIMESTAMP = new
ColumnType<>(LocalDateTime.class, "timestamp");
/** {@code TIMESTAMP} with specified precision. */
- public static ColumnType<Timestamp> timestamp(int precision) {
+ public static ColumnType<LocalDateTime> timestamp(int precision) {
return TIMESTAMP.copy().precision(precision);
}
/** {@code DATE} SQL column type. */
- public static final ColumnType<Date> DATE = new ColumnType<>(Date.class,
"date");
+ public static final ColumnType<LocalDate> DATE = new
ColumnType<>(LocalDate.class, "date");
/** {@code DECIMAL} SQL column type. */
public static final ColumnType<BigDecimal> DECIMAL = new
ColumnType<>(BigDecimal.class, "decimal");
@@ -112,6 +113,10 @@ public class ColumnType<T> {
/** {@code UUID} SQL column type. */
public static final ColumnType<UUID> UUID = new ColumnType<>(UUID.class,
"uuid");
+ /** {@code TIMESTAMP WITH LOCAL TIME ZONE} SQL column type. */
+ public static final ColumnType<Instant> TIMESTAMP_WITH_LOCAL_TIME_ZONE =
new ColumnType<>(
+ Instant.class, "timestamp with local time zone");
+
private final Class<T> type;
private final String typeName;
@@ -131,6 +136,8 @@ public class ColumnType<T> {
private ColumnType(Class<T> type, String typeName) {
this.type = type;
this.typeName = typeName;
+
+ //noinspection ThisEscapedInObjectConstruction
TYPES.putIfAbsent(type, this);
}
diff --git
a/modules/catalog-dsl/src/integrationTest/java/org/apache/ignite/internal/catalog/AllColumnTypesPojo.java
b/modules/catalog-dsl/src/integrationTest/java/org/apache/ignite/internal/catalog/AllColumnTypesPojo.java
new file mode 100644
index 0000000000..e37a03f0a8
--- /dev/null
+++
b/modules/catalog-dsl/src/integrationTest/java/org/apache/ignite/internal/catalog/AllColumnTypesPojo.java
@@ -0,0 +1,50 @@
+/*
+ * 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.ignite.internal.catalog;
+
+import java.math.BigDecimal;
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.util.UUID;
+import org.apache.ignite.catalog.annotations.Id;
+import org.apache.ignite.catalog.annotations.Table;
+
+/**
+ * A POJO class with all supported column types.
+ */
+@Table
+public final class AllColumnTypesPojo {
+ @Id
+ String str;
+ Byte byteCol;
+ Short shortCol;
+ Integer intCol;
+ Long longCol;
+ Float floatCol;
+ Double doubleCol;
+ BigDecimal decimalCol;
+ Boolean boolCol;
+ byte[] bytesCol;
+ UUID uuidCol;
+ LocalDate dateCol;
+ LocalTime timeCol;
+ LocalDateTime datetimeCol;
+ Instant instantCol;
+}
diff --git
a/modules/catalog-dsl/src/integrationTest/java/org/apache/ignite/internal/catalog/ItCatalogDslTest.java
b/modules/catalog-dsl/src/integrationTest/java/org/apache/ignite/internal/catalog/ItCatalogDslTest.java
index 7d4ecd89e3..fd00e0546b 100644
---
a/modules/catalog-dsl/src/integrationTest/java/org/apache/ignite/internal/catalog/ItCatalogDslTest.java
+++
b/modules/catalog-dsl/src/integrationTest/java/org/apache/ignite/internal/catalog/ItCatalogDslTest.java
@@ -27,6 +27,7 @@ import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.not;
import static org.hamcrest.Matchers.nullValue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
import java.util.List;
import java.util.UUID;
@@ -348,6 +349,64 @@ class ItCatalogDslTest extends
ClusterPerClassIntegrationTest {
);
}
+ @SuppressWarnings("DataFlowIssue")
+ @Test
+ public void createAllColumnTypesFromPojo() {
+ Table table = catalog().createTable(AllColumnTypesPojo.class);
+ assertEquals("ALLCOLUMNTYPESPOJO", table.name());
+
+ TableDefinition tableDef = catalog().tableDefinition(table.name());
+ assertEquals(tableDef.tableName(), tableDef.tableName());
+
+ List<ColumnDefinition> columns = tableDef.columns();
+ assertEquals(15, columns.size());
+
+ assertEquals("STR", columns.get(0).name());
+ assertEquals("varchar", columns.get(0).type().typeName());
+
+ assertEquals("BYTECOL", columns.get(1).name());
+ assertEquals("tinyint", columns.get(1).type().typeName());
+
+ assertEquals("SHORTCOL", columns.get(2).name());
+ assertEquals("smallint", columns.get(2).type().typeName());
+
+ assertEquals("INTCOL", columns.get(3).name());
+ assertEquals("int", columns.get(3).type().typeName());
+
+ assertEquals("LONGCOL", columns.get(4).name());
+ assertEquals("bigint", columns.get(4).type().typeName());
+
+ assertEquals("FLOATCOL", columns.get(5).name());
+ assertEquals("real", columns.get(5).type().typeName());
+
+ assertEquals("DOUBLECOL", columns.get(6).name());
+ assertEquals("double", columns.get(6).type().typeName());
+
+ assertEquals("DECIMALCOL", columns.get(7).name());
+ assertEquals("decimal", columns.get(7).type().typeName());
+
+ assertEquals("BOOLCOL", columns.get(8).name());
+ assertEquals("boolean", columns.get(8).type().typeName());
+
+ assertEquals("BYTESCOL", columns.get(9).name());
+ assertEquals("varbinary", columns.get(9).type().typeName());
+
+ assertEquals("UUIDCOL", columns.get(10).name());
+ assertEquals("uuid", columns.get(10).type().typeName());
+
+ assertEquals("DATECOL", columns.get(11).name());
+ assertEquals("date", columns.get(11).type().typeName());
+
+ assertEquals("TIMECOL", columns.get(12).name());
+ assertEquals("time", columns.get(12).type().typeName());
+
+ assertEquals("DATETIMECOL", columns.get(13).name());
+ assertEquals("timestamp", columns.get(13).type().typeName());
+
+ assertEquals("INSTANTCOL", columns.get(14).name());
+ assertEquals("timestamp with local time zone",
columns.get(14).type().typeName());
+ }
+
private static IgniteCatalog catalog() {
return CLUSTER.node(0).catalog();
}
diff --git
a/modules/catalog-dsl/src/test/java/org/apache/ignite/internal/catalog/sql/CreateFromAnnotationsTest.java
b/modules/catalog-dsl/src/test/java/org/apache/ignite/internal/catalog/sql/CreateFromAnnotationsTest.java
index 397c7afe1d..367bcb2e58 100644
---
a/modules/catalog-dsl/src/test/java/org/apache/ignite/internal/catalog/sql/CreateFromAnnotationsTest.java
+++
b/modules/catalog-dsl/src/test/java/org/apache/ignite/internal/catalog/sql/CreateFromAnnotationsTest.java
@@ -24,6 +24,12 @@ import static org.hamcrest.Matchers.instanceOf;
import static org.hamcrest.Matchers.is;
import static org.junit.jupiter.api.Assertions.assertThrows;
+import java.math.BigDecimal;
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.util.UUID;
import org.apache.ignite.catalog.IndexType;
import org.apache.ignite.catalog.SortOrder;
import org.apache.ignite.catalog.annotations.Column;
@@ -175,6 +181,19 @@ class CreateFromAnnotationsTest {
assertThrows(IllegalArgumentException.class, () ->
createTable().processRecordClass(NoAnnotations.class));
}
+ @Test
+ void allColumnTypes() {
+ CreateFromAnnotationsImpl query =
createTable().processRecordClass(AllColumnsPojo.class);
+ assertThat(
+ query.toString(),
+ is("CREATE TABLE IF NOT EXISTS PUBLIC.AllColumnsPojo ("
+ + "str varchar, byteCol tinyint, shortCol smallint,
intCol int, longCol bigint, floatCol real, "
+ + "doubleCol double, decimalCol decimal, boolCol
boolean, bytesCol varbinary, uuidCol uuid, "
+ + "dateCol date, timeCol time, datetimeCol timestamp,
instantCol timestamp with local time zone, "
+ + "PRIMARY KEY (str));")
+ );
+ }
+
@SuppressWarnings("unused")
private static class PojoKey {
@Id
@@ -265,6 +284,26 @@ class CreateFromAnnotationsTest {
Integer id;
}
+ @Table
+ private static class AllColumnsPojo {
+ @Id
+ String str;
+ Byte byteCol;
+ Short shortCol;
+ Integer intCol;
+ Long longCol;
+ Float floatCol;
+ Double doubleCol;
+ BigDecimal decimalCol;
+ Boolean boolCol;
+ byte[] bytesCol;
+ UUID uuidCol;
+ LocalDate dateCol;
+ LocalTime timeCol;
+ LocalDateTime datetimeCol;
+ Instant instantCol;
+ }
+
private static class NoAnnotations {
}