diff --git a/jooq-dialect/CHANGELOG.md b/jooq-dialect/CHANGELOG.md index 4079b1e..6d96933 100644 --- a/jooq-dialect/CHANGELOG.md +++ b/jooq-dialect/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.1.1 ## + +- Supported UUID YDB Type + ## 1.1.0 ## - Upgrade to new version of JDBC & SDK diff --git a/jooq-dialect/pom.xml b/jooq-dialect/pom.xml index edf91b3..d6f9b88 100644 --- a/jooq-dialect/pom.xml +++ b/jooq-dialect/pom.xml @@ -4,7 +4,7 @@ tech.ydb.dialects jooq-ydb-dialect - 1.1.0 + 1.1.1 YDB JOOQ Dialect module YDB JOOQ Dialect module @@ -134,7 +134,6 @@ true - cr.yandex/yc/yandex-docker-local-ydb:latest 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 8075ec6..1e295c5 100644 --- a/jooq-dialect/src/main/java/tech/ydb/jooq/YdbTypes.java +++ b/jooq-dialect/src/main/java/tech/ydb/jooq/YdbTypes.java @@ -52,7 +52,8 @@ public static DataType DECIMAL(int precision, int scale) { public static final DataType JSON = newDataType(SQLDataType.JSON, "json", new JsonBinding()); public static final DataType JSONDOCUMENT = newDataType(SQLDataType.JSONB, "jsondocument", new JsonDocumentBinding()); public static final DataType YSON = newDataType(SQLDataType.OTHER, "yson", new YsonBinding()); - public static final DataType UUID = newDataType(SQLDataType.UUID, "uuid"); + + public static final DataType UUID = newDataType(SQLDataType.UUID, "uuid", new UuidBinding()); public static final DataType DATE = newDataType(SQLDataType.LOCALDATE, "date", new DateBinding()); public static final DataType DATETIME = newDataType(SQLDataType.LOCALDATETIME, "datetime", new DatetimeBinding()); diff --git a/jooq-dialect/src/main/java/tech/ydb/jooq/binding/UuidBinding.java b/jooq-dialect/src/main/java/tech/ydb/jooq/binding/UuidBinding.java new file mode 100644 index 0000000..1295917 --- /dev/null +++ b/jooq-dialect/src/main/java/tech/ydb/jooq/binding/UuidBinding.java @@ -0,0 +1,38 @@ +package tech.ydb.jooq.binding; + +import java.sql.SQLException; +import java.util.UUID; +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; + +/** + * @author Kirill Kurdyukov + */ +public class UuidBinding extends AbstractBinding { + + private static final int INDEX_TYPE = indexType(PrimitiveType.Uuid); + + @Override + public Converter converter() { + return new IdentityConverter<>(UUID.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(), ctx.value(), INDEX_TYPE); + } + } + + @Override + public void get(BindingGetResultSetContext ctx) throws SQLException { + ctx.value((UUID) ctx.resultSet().getObject(ctx.index())); + } +} 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 2282e02..d5c20f8 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 @@ -4,12 +4,28 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; - -import org.jooq.*; +import org.jooq.DSLContext; +import org.jooq.Record12; +import org.jooq.Record4; +import org.jooq.Record5; +import org.jooq.Record6; +import org.jooq.ResultQuery; import org.jooq.impl.DSL; -import org.jooq.meta.*; -import org.jooq.tools.JooqLogger; - +import org.jooq.meta.AbstractDatabase; +import org.jooq.meta.ArrayDefinition; +import org.jooq.meta.CatalogDefinition; +import org.jooq.meta.DefaultRelations; +import org.jooq.meta.DomainDefinition; +import org.jooq.meta.EnumDefinition; +import org.jooq.meta.IndexDefinition; +import org.jooq.meta.PackageDefinition; +import org.jooq.meta.ResultQueryDatabase; +import org.jooq.meta.RoutineDefinition; +import org.jooq.meta.SchemaDefinition; +import org.jooq.meta.SequenceDefinition; +import org.jooq.meta.TableDefinition; +import org.jooq.meta.UDTDefinition; +import org.jooq.meta.XMLSchemaCollectionDefinition; import tech.ydb.jdbc.YdbConnection; import tech.ydb.jdbc.context.SchemeExecutor; import tech.ydb.jdbc.context.YdbContext; @@ -24,7 +40,6 @@ import tech.ydb.table.settings.DescribeTableSettings; public class YdbDatabase extends AbstractDatabase implements ResultQueryDatabase { - private static final JooqLogger log = JooqLogger.getLogger(YdbDatabase.class); public YdbDatabase() { YdbTypes.initialize(); 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 026a611..67a366d 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 @@ -33,6 +33,7 @@ import tech.ydb.jooq.binding.Uint32Binding; import tech.ydb.jooq.binding.Uint64Binding; import tech.ydb.jooq.binding.Uint8Binding; +import tech.ydb.jooq.binding.UuidBinding; import tech.ydb.jooq.binding.YsonBinding; import tech.ydb.jooq.value.YSON; import tech.ydb.table.description.TableColumn; @@ -73,7 +74,7 @@ protected List getElements0() { kind = type.getKind(); } - int decimalDigits = kind == Type.Kind.DECIMAL ? ((DecimalType) type).getPrecision(): 0; + int scale = kind == Type.Kind.DECIMAL ? ((DecimalType) type).getScale() : 0; String typeName = type.toString(); Class> binding = getBinding(typeName); @@ -85,7 +86,7 @@ protected List getElements0() { typeName, YdbTypes.getSqlPrecision(type), YdbTypes.getSqlPrecision(type), - decimalDigits, + scale, isNullable, null, DSL.name(typeName), @@ -130,6 +131,7 @@ public TableDescription getTableDescription() { case "Uint32" -> Uint32Binding.class; case "Uint64" -> Uint64Binding.class; case "Yson" -> YsonBinding.class; + case "Uuid" -> UuidBinding.class; default -> null; }; } 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 e646ff7..f5502ed 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 @@ -79,7 +79,7 @@ public Class getRecordType() { /** * The column DEFAULT_SCHEMA.date_table.big. */ - public final TableField BIG = createField(DSL.name("big"), SQLDataType.NUMERIC(16, 22), this, ""); + public final TableField BIG = createField(DSL.name("big"), SQLDataType.NUMERIC(22, 9), this, ""); /** * The column DEFAULT_SCHEMA.date_table.date. diff --git a/jooq-dialect/src/test/java/jooq/generated/ydb/default_schema/tables/HardTable.java b/jooq-dialect/src/test/java/jooq/generated/ydb/default_schema/tables/HardTable.java index 8b12bef..10c1c3b 100644 --- a/jooq-dialect/src/test/java/jooq/generated/ydb/default_schema/tables/HardTable.java +++ b/jooq-dialect/src/test/java/jooq/generated/ydb/default_schema/tables/HardTable.java @@ -31,6 +31,7 @@ import tech.ydb.jooq.binding.JsonBinding; import tech.ydb.jooq.binding.JsonDocumentBinding; +import tech.ydb.jooq.binding.UuidBinding; import tech.ydb.jooq.binding.YsonBinding; import tech.ydb.jooq.value.YSON; @@ -76,6 +77,11 @@ public Class getRecordType() { */ public final TableField THIRD = createField(DSL.name("third"), SQLDataType.OTHER, this, "", new YsonBinding()); + /** + * The column DEFAULT_SCHEMA.hard_table.uuid. + */ + public final TableField UUID = createField(DSL.name("uuid"), SQLDataType.UUID, this, "", new UuidBinding()); + private HardTable(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/HardTableRecord.java b/jooq-dialect/src/test/java/jooq/generated/ydb/default_schema/tables/records/HardTableRecord.java index 27e419e..a6ca370 100644 --- a/jooq-dialect/src/test/java/jooq/generated/ydb/default_schema/tables/records/HardTableRecord.java +++ b/jooq-dialect/src/test/java/jooq/generated/ydb/default_schema/tables/records/HardTableRecord.java @@ -4,6 +4,8 @@ package jooq.generated.ydb.default_schema.tables.records; +import java.util.UUID; + import jooq.generated.ydb.default_schema.tables.HardTable; import org.jooq.JSON; @@ -78,6 +80,20 @@ public YSON getThird() { return (YSON) get(3); } + /** + * Setter for DEFAULT_SCHEMA.hard_table.uuid. + */ + public void setUuid(UUID value) { + set(4, value); + } + + /** + * Getter for DEFAULT_SCHEMA.hard_table.uuid. + */ + public UUID getUuid() { + return (UUID) get(4); + } + // ------------------------------------------------------------------------- // Primary key information // ------------------------------------------------------------------------- @@ -101,13 +117,14 @@ public HardTableRecord() { /** * Create a detached, initialised HardTableRecord */ - public HardTableRecord(byte[] id, JSON first, JSONB second, YSON third) { + public HardTableRecord(byte[] id, JSON first, JSONB second, YSON third, UUID uuid) { super(HardTable.HARD_TABLE); setId(id); setFirst(first); setSecond(second); setThird(third); + setUuid(uuid); 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 b1fbc99..7ae7049 100644 --- a/jooq-dialect/src/test/java/tech/ydb/jooq/BaseTest.java +++ b/jooq-dialect/src/test/java/tech/ydb/jooq/BaseTest.java @@ -98,6 +98,7 @@ public static void beforeAll() { .column("first", YdbTypes.JSON) .column("second", YdbTypes.JSONDOCUMENT) .column("third", YdbTypes.YSON) + .column("uuid", YdbTypes.UUID) .primaryKey("id") .execute(); diff --git a/jooq-dialect/src/test/java/tech/ydb/jooq/InsertTest.java b/jooq-dialect/src/test/java/tech/ydb/jooq/InsertTest.java index d399261..dcd1c2d 100644 --- a/jooq-dialect/src/test/java/tech/ydb/jooq/InsertTest.java +++ b/jooq-dialect/src/test/java/tech/ydb/jooq/InsertTest.java @@ -1,6 +1,7 @@ package tech.ydb.jooq; import java.util.List; +import java.util.UUID; import static jooq.generated.ydb.default_schema.Tables.HARD_TABLE; import static jooq.generated.ydb.default_schema.Tables.SERIES; import jooq.generated.ydb.default_schema.tables.records.HardTableRecord; @@ -71,10 +72,12 @@ public void testConditionalInsert() { @Test public void testInsertJsonTypes() { HardTableRecord record = new HardTableRecord(); + record.setId("test-id".getBytes()); record.setFirst(JSON.valueOf("{\"key\": \"value\"}")); record.setSecond(JSONB.valueOf("{\"list\": [1, 2, 3]}")); record.setThird(YSON.valueOf("{\"boolean\" = true}")); + record.setUuid(UUID.randomUUID()); dsl.insertInto(HARD_TABLE) .set(record) @@ -84,6 +87,11 @@ public void testInsertJsonTypes() { .where(HARD_TABLE.ID.eq("test-id".getBytes())) .fetch(); + Result recordsByUuid = dsl.selectFrom(HARD_TABLE) + .where(HARD_TABLE.UUID.eq(record.getUuid())) + .fetch(); + assertEquals(List.of(record), records); + assertEquals(List.of(record), recordsByUuid); } }