diff --git a/jooq-dialect/pom.xml b/jooq-dialect/pom.xml index 0e3b931..890f05d 100644 --- a/jooq-dialect/pom.xml +++ b/jooq-dialect/pom.xml @@ -4,7 +4,7 @@ tech.ydb.dialects jooq-ydb-dialect - 1.1.1 + 1.2.0 YDB JOOQ Dialect module YDB JOOQ Dialect module @@ -53,7 +53,7 @@ 3.19.0 2.3.8 - 2.3.7 + 2.3.11 @@ -134,6 +134,7 @@ true + ydbplatform/local-ydb:trunk diff --git a/jooq-dialect/src/main/java/tech/ydb/jooq/YdbTypes.java b/jooq-dialect/src/main/java/tech/ydb/jooq/YdbTypes.java index 1e295c5..4dd2d77 100644 --- a/jooq-dialect/src/main/java/tech/ydb/jooq/YdbTypes.java +++ b/jooq-dialect/src/main/java/tech/ydb/jooq/YdbTypes.java @@ -58,7 +58,12 @@ public static DataType DECIMAL(int precision, int scale) { public static final DataType DATE = newDataType(SQLDataType.LOCALDATE, "date", new DateBinding()); public static final DataType DATETIME = newDataType(SQLDataType.LOCALDATETIME, "datetime", new DatetimeBinding()); public static final DataType TIMESTAMP = newDataType(SQLDataType.INSTANT, "timestamp", new TimestampBinding()); - public static final DataType INTERVAL = newDataType(SQLDataType.BIGINTUNSIGNED, "interval", new IntervalBinding()); + public static final DataType INTERVAL = newDataType(SQLDataType.INTERVAL, "interval", new IntervalBinding()); + + public static final DataType DATE32 = newDataType(SQLDataType.LOCALDATE, "date32", new Date32Binding()); + public static final DataType DATETIME64 = newDataType(SQLDataType.LOCALDATETIME, "datetime64", new Datetime64Binding()); + public static final DataType TIMESTAMP64 = newDataType(SQLDataType.INSTANT, "timestamp64", new Timestamp64Binding()); + public static final DataType INTERVAL64 = newDataType(SQLDataType.INTERVAL, "interval64", new Interval64Binding()); public static final DataType TZ_DATE = newDataType(SQLDataType.OTHER, "tzdate", new TzDateBinding()); public static final DataType TZ_DATETIME = newDataType(SQLDataType.OTHER, "tzdateTime", new TzDatetimeBinding()); diff --git a/jooq-dialect/src/main/java/tech/ydb/jooq/binding/Date32Binding.java b/jooq-dialect/src/main/java/tech/ydb/jooq/binding/Date32Binding.java new file mode 100644 index 0000000..86e9a1a --- /dev/null +++ b/jooq-dialect/src/main/java/tech/ydb/jooq/binding/Date32Binding.java @@ -0,0 +1,37 @@ +package tech.ydb.jooq.binding; + +import java.sql.SQLException; +import java.time.LocalDate; +import org.jooq.BindingGetResultSetContext; +import org.jooq.BindingSetStatementContext; +import org.jooq.Converter; +import org.jooq.impl.AbstractBinding; +import org.jooq.impl.IdentityConverter; +import static tech.ydb.jooq.binding.BindingTools.indexType; +import tech.ydb.table.values.PrimitiveType; +import tech.ydb.table.values.PrimitiveValue; + +public final class Date32Binding extends AbstractBinding { + + private static final int INDEX_TYPE = indexType(PrimitiveType.Date32); + + @Override + public Converter converter() { + return new IdentityConverter<>(LocalDate.class); + } + + @Override + public void set(BindingSetStatementContext ctx) throws SQLException { + if (ctx.value() == null) { + ctx.statement().setNull(ctx.index(), INDEX_TYPE); + } else { + ctx.statement().setObject(ctx.index(), PrimitiveValue.newDate32(ctx.value()), INDEX_TYPE); + } + } + + @Override + public void get(BindingGetResultSetContext ctx) throws SQLException { + LocalDate value = (LocalDate) ctx.resultSet().getObject(ctx.index()); + ctx.value(value); + } +} diff --git a/jooq-dialect/src/main/java/tech/ydb/jooq/binding/DateBinding.java b/jooq-dialect/src/main/java/tech/ydb/jooq/binding/DateBinding.java index 571efe7..c8006ab 100644 --- a/jooq-dialect/src/main/java/tech/ydb/jooq/binding/DateBinding.java +++ b/jooq-dialect/src/main/java/tech/ydb/jooq/binding/DateBinding.java @@ -13,7 +13,6 @@ import static tech.ydb.jooq.binding.BindingTools.indexType; -@SuppressWarnings("resource") public final class DateBinding extends AbstractBinding { private static final int INDEX_TYPE = indexType(PrimitiveType.Date); diff --git a/jooq-dialect/src/main/java/tech/ydb/jooq/binding/Datetime64Binding.java b/jooq-dialect/src/main/java/tech/ydb/jooq/binding/Datetime64Binding.java new file mode 100644 index 0000000..db2f846 --- /dev/null +++ b/jooq-dialect/src/main/java/tech/ydb/jooq/binding/Datetime64Binding.java @@ -0,0 +1,37 @@ +package tech.ydb.jooq.binding; + +import java.sql.SQLException; +import java.time.LocalDateTime; +import org.jooq.BindingGetResultSetContext; +import org.jooq.BindingSetStatementContext; +import org.jooq.Converter; +import org.jooq.impl.AbstractBinding; +import org.jooq.impl.IdentityConverter; +import static tech.ydb.jooq.binding.BindingTools.indexType; +import tech.ydb.table.values.PrimitiveType; +import tech.ydb.table.values.PrimitiveValue; + +public final class Datetime64Binding extends AbstractBinding { + + private static final int INDEX_TYPE = indexType(PrimitiveType.Datetime64); + + @Override + public Converter converter() { + return new IdentityConverter<>(LocalDateTime.class); + } + + @Override + public void set(BindingSetStatementContext ctx) throws SQLException { + if (ctx.value() == null) { + ctx.statement().setNull(ctx.index(), INDEX_TYPE); + } else { + ctx.statement().setObject(ctx.index(), PrimitiveValue.newDatetime64(ctx.value()), INDEX_TYPE); + } + } + + @Override + public void get(BindingGetResultSetContext ctx) throws SQLException { + LocalDateTime value = (LocalDateTime) ctx.resultSet().getObject(ctx.index()); + ctx.value(value); + } +} diff --git a/jooq-dialect/src/main/java/tech/ydb/jooq/binding/DatetimeBinding.java b/jooq-dialect/src/main/java/tech/ydb/jooq/binding/DatetimeBinding.java index 0860799..0360c14 100644 --- a/jooq-dialect/src/main/java/tech/ydb/jooq/binding/DatetimeBinding.java +++ b/jooq-dialect/src/main/java/tech/ydb/jooq/binding/DatetimeBinding.java @@ -13,7 +13,6 @@ import static tech.ydb.jooq.binding.BindingTools.indexType; -@SuppressWarnings("resource") public final class DatetimeBinding extends AbstractBinding { private static final int INDEX_TYPE = indexType(PrimitiveType.Datetime); diff --git a/jooq-dialect/src/main/java/tech/ydb/jooq/binding/Interval64Binding.java b/jooq-dialect/src/main/java/tech/ydb/jooq/binding/Interval64Binding.java new file mode 100644 index 0000000..e1000c7 --- /dev/null +++ b/jooq-dialect/src/main/java/tech/ydb/jooq/binding/Interval64Binding.java @@ -0,0 +1,65 @@ +package tech.ydb.jooq.binding; + +import java.sql.SQLException; +import java.time.Duration; +import java.time.temporal.ChronoUnit; +import java.util.concurrent.TimeUnit; +import org.jooq.BindingGetResultSetContext; +import org.jooq.BindingSetStatementContext; +import org.jooq.Converter; +import org.jooq.impl.AbstractBinding; +import org.jooq.types.ULong; +import static tech.ydb.jooq.binding.BindingTools.indexType; +import tech.ydb.table.values.PrimitiveType; +import tech.ydb.table.values.PrimitiveValue; + +/** + * @author Kirill Kurdyukov + */ +public class Interval64Binding extends AbstractBinding { + + private static final int INDEX_TYPE = indexType(PrimitiveType.Interval64); + + @Override + public Converter converter() { + return new IntervalConverter(); + } + + @Override + public void set(BindingSetStatementContext ctx) throws SQLException { + if (ctx.value() == null) { + ctx.statement().setNull(ctx.index(), INDEX_TYPE); + } else { + ctx.statement().setObject(ctx.index(), PrimitiveValue.newInterval64(ctx.value()), INDEX_TYPE); + } + } + + @Override + public void get(BindingGetResultSetContext ctx) throws SQLException { + Duration value = (Duration) ctx.resultSet().getObject(ctx.index()); + ctx.value(value); + } + + private static class IntervalConverter implements Converter { + + @Override + public Duration from(ULong databaseObject) { + return Duration.of(databaseObject.longValue(), ChronoUnit.MICROS); + } + + @Override + public ULong to(Duration userObject) { + return ULong.valueOf(TimeUnit.NANOSECONDS.toMicros(userObject.toNanos())); + } + + @Override + public Class fromType() { + return ULong.class; + } + + @Override + public Class toType() { + return Duration.class; + } + } +} diff --git a/jooq-dialect/src/main/java/tech/ydb/jooq/binding/IntervalBinding.java b/jooq-dialect/src/main/java/tech/ydb/jooq/binding/IntervalBinding.java index d729c7a..a8345c6 100644 --- a/jooq-dialect/src/main/java/tech/ydb/jooq/binding/IntervalBinding.java +++ b/jooq-dialect/src/main/java/tech/ydb/jooq/binding/IntervalBinding.java @@ -11,7 +11,6 @@ import tech.ydb.table.values.PrimitiveType; import tech.ydb.table.values.PrimitiveValue; -@SuppressWarnings("resource") public final class IntervalBinding extends AbstractBinding { private static final int INDEX_TYPE = indexType(PrimitiveType.Interval); diff --git a/jooq-dialect/src/main/java/tech/ydb/jooq/binding/JsonBinding.java b/jooq-dialect/src/main/java/tech/ydb/jooq/binding/JsonBinding.java index 92d14e3..6e652cf 100644 --- a/jooq-dialect/src/main/java/tech/ydb/jooq/binding/JsonBinding.java +++ b/jooq-dialect/src/main/java/tech/ydb/jooq/binding/JsonBinding.java @@ -13,7 +13,6 @@ import static tech.ydb.jooq.binding.BindingTools.indexType; -@SuppressWarnings("resource") public final class JsonBinding extends AbstractBinding { private static final int INDEX_TYPE = indexType(PrimitiveType.Json); diff --git a/jooq-dialect/src/main/java/tech/ydb/jooq/binding/JsonDocumentBinding.java b/jooq-dialect/src/main/java/tech/ydb/jooq/binding/JsonDocumentBinding.java index 304e9ff..6c8c1e8 100644 --- a/jooq-dialect/src/main/java/tech/ydb/jooq/binding/JsonDocumentBinding.java +++ b/jooq-dialect/src/main/java/tech/ydb/jooq/binding/JsonDocumentBinding.java @@ -11,7 +11,6 @@ import tech.ydb.table.values.PrimitiveType; import tech.ydb.table.values.PrimitiveValue; -@SuppressWarnings("resource") public final class JsonDocumentBinding extends AbstractBinding { private static final int INDEX_TYPE = indexType(PrimitiveType.JsonDocument); diff --git a/jooq-dialect/src/main/java/tech/ydb/jooq/binding/Timestamp64Binding.java b/jooq-dialect/src/main/java/tech/ydb/jooq/binding/Timestamp64Binding.java new file mode 100644 index 0000000..31c72dc --- /dev/null +++ b/jooq-dialect/src/main/java/tech/ydb/jooq/binding/Timestamp64Binding.java @@ -0,0 +1,40 @@ +package tech.ydb.jooq.binding; + +import java.sql.SQLException; +import java.time.Instant; +import org.jooq.BindingGetResultSetContext; +import org.jooq.BindingSetStatementContext; +import org.jooq.Converter; +import org.jooq.impl.AbstractBinding; +import org.jooq.impl.IdentityConverter; +import static tech.ydb.jooq.binding.BindingTools.indexType; +import tech.ydb.table.values.PrimitiveType; +import tech.ydb.table.values.PrimitiveValue; + +/** + * @author Kirill Kurdyukov + */ +public class Timestamp64Binding extends AbstractBinding { + + private static final int INDEX_TYPE = indexType(PrimitiveType.Timestamp64); + + @Override + public Converter converter() { + return new IdentityConverter<>(Instant.class); + } + + @Override + public void set(BindingSetStatementContext ctx) throws SQLException { + if (ctx.value() == null) { + ctx.statement().setNull(ctx.index(), INDEX_TYPE); + } else { + ctx.statement().setObject(ctx.index(), PrimitiveValue.newTimestamp64(ctx.value()), INDEX_TYPE); + } + } + + @Override + public void get(BindingGetResultSetContext ctx) throws SQLException { + Instant value = (Instant) ctx.resultSet().getObject(ctx.index()); + ctx.value(value); + } +} diff --git a/jooq-dialect/src/main/java/tech/ydb/jooq/binding/TimestampBinding.java b/jooq-dialect/src/main/java/tech/ydb/jooq/binding/TimestampBinding.java index bc24bd4..a685f57 100644 --- a/jooq-dialect/src/main/java/tech/ydb/jooq/binding/TimestampBinding.java +++ b/jooq-dialect/src/main/java/tech/ydb/jooq/binding/TimestampBinding.java @@ -12,7 +12,6 @@ import tech.ydb.table.values.PrimitiveType; import tech.ydb.table.values.PrimitiveValue; -@SuppressWarnings("resource") public final class TimestampBinding extends AbstractBinding { private static final int INDEX_TYPE = indexType(PrimitiveType.Timestamp); diff --git a/jooq-dialect/src/main/java/tech/ydb/jooq/binding/TzDateBinding.java b/jooq-dialect/src/main/java/tech/ydb/jooq/binding/TzDateBinding.java index eab70d5..2a040cc 100644 --- a/jooq-dialect/src/main/java/tech/ydb/jooq/binding/TzDateBinding.java +++ b/jooq-dialect/src/main/java/tech/ydb/jooq/binding/TzDateBinding.java @@ -13,7 +13,6 @@ import static tech.ydb.jooq.binding.BindingTools.indexType; -@SuppressWarnings("resource") public final class TzDateBinding extends AbstractBinding { private static final int INDEX_TYPE = indexType(PrimitiveType.TzDate); diff --git a/jooq-dialect/src/main/java/tech/ydb/jooq/binding/TzDatetimeBinding.java b/jooq-dialect/src/main/java/tech/ydb/jooq/binding/TzDatetimeBinding.java index 758b474..e9979c6 100644 --- a/jooq-dialect/src/main/java/tech/ydb/jooq/binding/TzDatetimeBinding.java +++ b/jooq-dialect/src/main/java/tech/ydb/jooq/binding/TzDatetimeBinding.java @@ -13,7 +13,6 @@ import static tech.ydb.jooq.binding.BindingTools.indexType; -@SuppressWarnings("resource") public final class TzDatetimeBinding extends AbstractBinding { private static final int INDEX_TYPE = indexType(PrimitiveType.TzDatetime); diff --git a/jooq-dialect/src/main/java/tech/ydb/jooq/binding/TzTimestampBinding.java b/jooq-dialect/src/main/java/tech/ydb/jooq/binding/TzTimestampBinding.java index 263d582..cb1e629 100644 --- a/jooq-dialect/src/main/java/tech/ydb/jooq/binding/TzTimestampBinding.java +++ b/jooq-dialect/src/main/java/tech/ydb/jooq/binding/TzTimestampBinding.java @@ -11,7 +11,6 @@ import tech.ydb.table.values.PrimitiveType; import tech.ydb.table.values.PrimitiveValue; -@SuppressWarnings("resource") public final class TzTimestampBinding extends AbstractBinding { private static final int INDEX_TYPE = indexType(PrimitiveType.TzTimestamp); diff --git a/jooq-dialect/src/main/java/tech/ydb/jooq/binding/Uint16Binding.java b/jooq-dialect/src/main/java/tech/ydb/jooq/binding/Uint16Binding.java index 86c3112..4b9d21f 100644 --- a/jooq-dialect/src/main/java/tech/ydb/jooq/binding/Uint16Binding.java +++ b/jooq-dialect/src/main/java/tech/ydb/jooq/binding/Uint16Binding.java @@ -13,7 +13,6 @@ import static tech.ydb.jooq.binding.BindingTools.indexType; -@SuppressWarnings("resource") public final class Uint16Binding extends AbstractBinding { private static final int INDEX_TYPE = indexType(PrimitiveType.Uint16); diff --git a/jooq-dialect/src/main/java/tech/ydb/jooq/binding/Uint32Binding.java b/jooq-dialect/src/main/java/tech/ydb/jooq/binding/Uint32Binding.java index d21fe2e..ee088b9 100644 --- a/jooq-dialect/src/main/java/tech/ydb/jooq/binding/Uint32Binding.java +++ b/jooq-dialect/src/main/java/tech/ydb/jooq/binding/Uint32Binding.java @@ -13,7 +13,6 @@ import static tech.ydb.jooq.binding.BindingTools.indexType; -@SuppressWarnings("resource") public final class Uint32Binding extends AbstractBinding { private static final int INDEX_TYPE = indexType(PrimitiveType.Uint32); diff --git a/jooq-dialect/src/main/java/tech/ydb/jooq/binding/Uint64Binding.java b/jooq-dialect/src/main/java/tech/ydb/jooq/binding/Uint64Binding.java index 8d73b6c..fcae9d0 100644 --- a/jooq-dialect/src/main/java/tech/ydb/jooq/binding/Uint64Binding.java +++ b/jooq-dialect/src/main/java/tech/ydb/jooq/binding/Uint64Binding.java @@ -13,7 +13,6 @@ import static tech.ydb.jooq.binding.BindingTools.indexType; -@SuppressWarnings("resource") public final class Uint64Binding extends AbstractBinding { private static final int INDEX_TYPE = indexType(PrimitiveType.Uint64); diff --git a/jooq-dialect/src/main/java/tech/ydb/jooq/binding/Uint8Binding.java b/jooq-dialect/src/main/java/tech/ydb/jooq/binding/Uint8Binding.java index 0efa01b..05d3f68 100644 --- a/jooq-dialect/src/main/java/tech/ydb/jooq/binding/Uint8Binding.java +++ b/jooq-dialect/src/main/java/tech/ydb/jooq/binding/Uint8Binding.java @@ -13,7 +13,6 @@ import static tech.ydb.jooq.binding.BindingTools.indexType; -@SuppressWarnings("resource") public final class Uint8Binding extends AbstractBinding { private static final int INDEX_TYPE = indexType(PrimitiveType.Uint8); diff --git a/jooq-dialect/src/main/java/tech/ydb/jooq/binding/YsonBinding.java b/jooq-dialect/src/main/java/tech/ydb/jooq/binding/YsonBinding.java index 97acbee..bf90e04 100644 --- a/jooq-dialect/src/main/java/tech/ydb/jooq/binding/YsonBinding.java +++ b/jooq-dialect/src/main/java/tech/ydb/jooq/binding/YsonBinding.java @@ -12,7 +12,6 @@ import static tech.ydb.jooq.binding.BindingTools.indexType; -@SuppressWarnings("resource") public final class YsonBinding extends AbstractBinding { private static final int INDEX_TYPE = indexType(PrimitiveType.Yson); diff --git a/jooq-dialect/src/main/java/tech/ydb/jooq/codegen/YdbDatabase.java b/jooq-dialect/src/main/java/tech/ydb/jooq/codegen/YdbDatabase.java index d5c20f8..8a764e6 100644 --- a/jooq-dialect/src/main/java/tech/ydb/jooq/codegen/YdbDatabase.java +++ b/jooq-dialect/src/main/java/tech/ydb/jooq/codegen/YdbDatabase.java @@ -163,7 +163,8 @@ private TableDefinition getTableDefinition(String tableName, String dirPathFull, tableName, "", tableDescription, - tablePath + tablePath, + getContext().getTypes() ); } diff --git a/jooq-dialect/src/main/java/tech/ydb/jooq/codegen/YdbTableDefinition.java b/jooq-dialect/src/main/java/tech/ydb/jooq/codegen/YdbTableDefinition.java index 67a366d..9eb2ea3 100644 --- a/jooq-dialect/src/main/java/tech/ydb/jooq/codegen/YdbTableDefinition.java +++ b/jooq-dialect/src/main/java/tech/ydb/jooq/codegen/YdbTableDefinition.java @@ -22,12 +22,16 @@ import org.jooq.types.ULong; import org.jooq.types.UShort; -import tech.ydb.jdbc.impl.YdbTypes; +import tech.ydb.jdbc.common.YdbTypes; +import tech.ydb.jooq.binding.Date32Binding; import tech.ydb.jooq.binding.DateBinding; +import tech.ydb.jooq.binding.Datetime64Binding; import tech.ydb.jooq.binding.DatetimeBinding; +import tech.ydb.jooq.binding.Interval64Binding; import tech.ydb.jooq.binding.IntervalBinding; import tech.ydb.jooq.binding.JsonBinding; import tech.ydb.jooq.binding.JsonDocumentBinding; +import tech.ydb.jooq.binding.Timestamp64Binding; import tech.ydb.jooq.binding.TimestampBinding; import tech.ydb.jooq.binding.Uint16Binding; import tech.ydb.jooq.binding.Uint32Binding; @@ -45,11 +49,20 @@ public class YdbTableDefinition extends AbstractTableDefinition { private final TableDescription tableDescription; private final String tablePath; - - public YdbTableDefinition(SchemaDefinition schema, String name, String comment, TableDescription tableDescription, String tablePath) { + private final YdbTypes ydbTypes; + + public YdbTableDefinition( + SchemaDefinition schema, + String name, + String comment, + TableDescription tableDescription, + String tablePath, + YdbTypes ydbTypes + ) { super(schema, name, comment); this.tableDescription = tableDescription; this.tablePath = tablePath; + this.ydbTypes = ydbTypes; } @Override @@ -84,8 +97,8 @@ protected List getElements0() { getDatabase(), null, typeName, - YdbTypes.getSqlPrecision(type), - YdbTypes.getSqlPrecision(type), + ydbTypes.getSqlPrecision(type), + ydbTypes.getSqlPrecision(type), scale, isNullable, null, @@ -95,10 +108,6 @@ protected List getElements0() { javaType != null ? javaType.getName() : null ); - if (getName().equals("test")) { - System.out.println("Here"); - } - ColumnDefinition columnDefinition = new DefaultColumnDefinition( getDatabase().getTable(getSchema(), getName()), column.getName(), @@ -132,18 +141,22 @@ public TableDescription getTableDescription() { case "Uint64" -> Uint64Binding.class; case "Yson" -> YsonBinding.class; case "Uuid" -> UuidBinding.class; + case "Date32" -> Date32Binding.class; + case "Datetime64" -> Datetime64Binding.class; + case "Timestamp64" -> Timestamp64Binding.class; + case "Interval64" -> Interval64Binding.class; default -> null; }; } private static Class getJavaType(String typeName) { return switch (typeName) { - case "Date" -> LocalDate.class; - case "Datetime" -> LocalDateTime.class; - case "Interval" -> Duration.class; + case "Date", "Date32" -> LocalDate.class; + case "Datetime", "Datetime64" -> LocalDateTime.class; + case "Interval", "Interval64" -> Duration.class; case "Json" -> JSON.class; case "JsonDocument" -> JSONB.class; - case "Timestamp" -> Instant.class; + case "Timestamp", "Timestamp64" -> Instant.class; case "Uint8" -> UByte.class; case "Uint16" -> UShort.class; case "Uint32" -> UInteger.class; diff --git a/jooq-dialect/src/test/java/jooq/generated/ydb/default_schema/tables/DateTable.java b/jooq-dialect/src/test/java/jooq/generated/ydb/default_schema/tables/DateTable.java index f5502ed..0440d78 100644 --- a/jooq-dialect/src/test/java/jooq/generated/ydb/default_schema/tables/DateTable.java +++ b/jooq-dialect/src/test/java/jooq/generated/ydb/default_schema/tables/DateTable.java @@ -33,9 +33,13 @@ import org.jooq.impl.TableImpl; import org.jooq.types.ULong; +import tech.ydb.jooq.binding.Date32Binding; import tech.ydb.jooq.binding.DateBinding; +import tech.ydb.jooq.binding.Datetime64Binding; import tech.ydb.jooq.binding.DatetimeBinding; +import tech.ydb.jooq.binding.Interval64Binding; import tech.ydb.jooq.binding.IntervalBinding; +import tech.ydb.jooq.binding.Timestamp64Binding; import tech.ydb.jooq.binding.TimestampBinding; import tech.ydb.jooq.binding.Uint64Binding; @@ -101,6 +105,26 @@ public Class getRecordType() { */ public final TableField INTERVAL = createField(DSL.name("interval"), SQLDataType.INTERVAL, this, "", new IntervalBinding()); + /** + * The column DEFAULT_SCHEMA.date_table.date32. + */ + public final TableField DATE32 = createField(DSL.name("date32"), SQLDataType.LOCALDATE, this, "", new Date32Binding()); + + /** + * The column DEFAULT_SCHEMA.date_table.datetime64. + */ + public final TableField DATETIME64 = createField(DSL.name("datetime64"), SQLDataType.LOCALDATETIME(19), this, "", new Datetime64Binding()); + + /** + * The column DEFAULT_SCHEMA.date_table.timestamp64. + */ + public final TableField TIMESTAMP64 = createField(DSL.name("timestamp64"), SQLDataType.INSTANT(26), this, "", new Timestamp64Binding()); + + /** + * The column DEFAULT_SCHEMA.date_table.interval64. + */ + public final TableField INTERVAL64 = createField(DSL.name("interval64"), SQLDataType.BIGINTUNSIGNED, this, "", new Interval64Binding()); + private DateTable(Name alias, Table aliased) { this(alias, aliased, (Field[]) null, null); } diff --git a/jooq-dialect/src/test/java/jooq/generated/ydb/default_schema/tables/records/DateTableRecord.java b/jooq-dialect/src/test/java/jooq/generated/ydb/default_schema/tables/records/DateTableRecord.java index e0c7fd9..6785bda 100644 --- a/jooq-dialect/src/test/java/jooq/generated/ydb/default_schema/tables/records/DateTableRecord.java +++ b/jooq-dialect/src/test/java/jooq/generated/ydb/default_schema/tables/records/DateTableRecord.java @@ -137,6 +137,62 @@ public Duration getInterval() { return (Duration) get(7); } + /** + * Setter for DEFAULT_SCHEMA.date_table.date32. + */ + public void setDate32(LocalDate value) { + set(8, value); + } + + /** + * Getter for DEFAULT_SCHEMA.date_table.date32. + */ + public LocalDate getDate32() { + return (LocalDate) get(8); + } + + /** + * Setter for DEFAULT_SCHEMA.date_table.datetime64. + */ + public void setDatetime64(LocalDateTime value) { + set(9, value); + } + + /** + * Getter for DEFAULT_SCHEMA.date_table.datetime64. + */ + public LocalDateTime getDatetime64() { + return (LocalDateTime) get(9); + } + + /** + * Setter for DEFAULT_SCHEMA.date_table.timestamp64. + */ + public void setTimestamp64(Instant value) { + set(10, value); + } + + /** + * Getter for DEFAULT_SCHEMA.date_table.timestamp64. + */ + public Instant getTimestamp64() { + return (Instant) get(10); + } + + /** + * Setter for DEFAULT_SCHEMA.date_table.interval64. + */ + public void setInterval64(Duration value) { + set(11, value); + } + + /** + * Getter for DEFAULT_SCHEMA.date_table.interval64. + */ + public Duration getInterval64() { + return (Duration) get(11); + } + // ------------------------------------------------------------------------- // Primary key information // ------------------------------------------------------------------------- @@ -160,7 +216,7 @@ public DateTableRecord() { /** * Create a detached, initialised DateTableRecord */ - public DateTableRecord(ULong id, Integer intCol, Double percent, BigDecimal big, LocalDate date, LocalDateTime datetime, Instant timestamp, Duration interval) { + public DateTableRecord(ULong id, Integer intCol, Double percent, BigDecimal big, LocalDate date, LocalDateTime datetime, Instant timestamp, Duration interval, LocalDate date32, LocalDateTime datetime64, Instant timestamp64, Duration interval64) { super(DateTable.DATE_TABLE); setId(id); @@ -171,6 +227,10 @@ public DateTableRecord(ULong id, Integer intCol, Double percent, BigDecimal big, setDatetime(datetime); setTimestamp(timestamp); setInterval(interval); + setDate32(date32); + setDatetime64(datetime64); + setTimestamp64(timestamp64); + setInterval64(interval64); resetChangedOnNotNull(); } } diff --git a/jooq-dialect/src/test/java/tech/ydb/jooq/BaseTest.java b/jooq-dialect/src/test/java/tech/ydb/jooq/BaseTest.java index 7ae7049..932c03e 100644 --- a/jooq-dialect/src/test/java/tech/ydb/jooq/BaseTest.java +++ b/jooq-dialect/src/test/java/tech/ydb/jooq/BaseTest.java @@ -29,31 +29,44 @@ protected static List getExampleRecords() { protected static List getExampleDateRecords() { LocalDate date = LocalDate.of(2024, 4, 1); + LocalDate date32 = LocalDate.of(1024, 4, 1); LocalDateTime datetime = LocalDateTime.of(date, LocalTime.of(13, 29, 30)); + LocalDateTime datetime64 = LocalDateTime.of(date32, LocalTime.of(13, 29, 30)); Instant instant = datetime.toInstant(ZoneOffset.UTC).plus(1, ChronoUnit.HOURS); + Instant instant64 = datetime64.toInstant(ZoneOffset.UTC).plus(1, ChronoUnit.HOURS); Duration duration = Duration.of(1, ChronoUnit.HOURS); + Duration duration64 = Duration.of(-1, ChronoUnit.HOURS); return List.of( - new DateTableRecord(ULong.valueOf(1), 2, 0.1, BigDecimal.valueOf(1), date, datetime, instant, duration), + new DateTableRecord(ULong.valueOf(1), 2, 0.1, new BigDecimal("1.000000000"), + date, datetime, instant, duration, date32, datetime64, instant64, duration64), new DateTableRecord( ULong.valueOf(2), 3, 0.2, - BigDecimal.valueOf(2), + new BigDecimal("2.000000000"), date.plusDays(1), datetime.plusDays(1), instant.plus(1, ChronoUnit.DAYS), - duration.plus(1, ChronoUnit.HOURS) + duration.plus(1, ChronoUnit.HOURS), + date32.plusDays(1), + datetime64.plusDays(1), + instant64.plus(1, ChronoUnit.DAYS), + duration64.plus(1, ChronoUnit.HOURS) ), new DateTableRecord( ULong.valueOf(3), 4, 0.3, - BigDecimal.valueOf(3), + new BigDecimal("3.000000000"), date.plusDays(1), datetime.plusDays(2), instant.plus(2, ChronoUnit.DAYS), - duration.plus(2, ChronoUnit.HOURS) + duration.plus(2, ChronoUnit.HOURS), + date32.plusDays(1), + datetime64.plusDays(2), + instant64.plus(2, ChronoUnit.DAYS), + duration64.plus(2, ChronoUnit.HOURS) ) ); } @@ -111,6 +124,10 @@ public static void beforeAll() { .column("datetime", YdbTypes.DATETIME) .column("timestamp", YdbTypes.TIMESTAMP) .column("interval", YdbTypes.INTERVAL) + .column("date32", YdbTypes.DATE32) + .column("datetime64", YdbTypes.DATETIME64) + .column("timestamp64", YdbTypes.TIMESTAMP64) + .column("interval64", YdbTypes.INTERVAL64) .primaryKey("id") .execute(); diff --git a/jooq-dialect/src/test/java/tech/ydb/jooq/SelectTest.java b/jooq-dialect/src/test/java/tech/ydb/jooq/SelectTest.java index 522e991..b08d61a 100644 --- a/jooq-dialect/src/test/java/tech/ydb/jooq/SelectTest.java +++ b/jooq-dialect/src/test/java/tech/ydb/jooq/SelectTest.java @@ -1,19 +1,20 @@ package tech.ydb.jooq; +import java.util.List; +import static jooq.generated.ydb.default_schema.Tables.DATE_TABLE; +import static jooq.generated.ydb.default_schema.Tables.SERIES; import jooq.generated.ydb.default_schema.tables.Series; import jooq.generated.ydb.default_schema.tables.records.SeriesRecord; import org.jooq.Record2; import org.jooq.Result; +import static org.jooq.impl.DSL.count; import org.jooq.types.ULong; +import org.junit.jupiter.api.Assertions; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import java.util.List; - -import static jooq.generated.ydb.default_schema.Tables.SERIES; -import static org.jooq.impl.DSL.count; -import static org.junit.jupiter.api.Assertions.*; - public class SelectTest extends BaseTest { private static final SeriesRecord FIRST = new SeriesRecord(ULong.valueOf(1), "title", "info", ULong.MIN); private static final SeriesRecord SECOND = new SeriesRecord(ULong.valueOf(2), "second title", "second info", ULong.MAX); @@ -105,4 +106,22 @@ public void testJoinOperation() { assertEquals(2, result.size(), "Expected duplicated results due to join on same table"); } + + @Test + public void selectNewDateTypes() { + var dataRecords = getExampleDateRecords();; + + dsl.insertInto(DATE_TABLE) + .set(dataRecords) + .execute(); + + var selectedDataRecords = dsl + .selectFrom(DATE_TABLE) + .orderBy(DATE_TABLE.ID) + .fetch(); + + for (int i = 0; i < dataRecords.size(); i++) { + Assertions.assertEquals(selectedDataRecords.get(i), dataRecords.get(i)); + } + } } diff --git a/spring-data-jdbc-ydb/CHANGELOG.md b/spring-data-jdbc-ydb/CHANGELOG.md index 12ba48b..12eec87 100644 --- a/spring-data-jdbc-ydb/CHANGELOG.md +++ b/spring-data-jdbc-ydb/CHANGELOG.md @@ -1,4 +1,13 @@ +## 1.2.0 ## + +- Support for `Date32`, `Datetime64`, and `Timestamp64` YDB types. + +## 1.1.1 ## + +- Support `UUID` YDB type. + ## 1.1.0 ## + - Fixed bug: No MethodInvocation found for Spring version 3.4.0 - Added JdbcRepositoryBeanPostProcessor for @ViewIndex annotation