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 {
     }
 

Reply via email to