Skip to content

Commit 902a538

Browse files
feat: supported UUID type in JOOQ YDB dialect (#184)
1 parent 4c9c4c7 commit 902a538

File tree

11 files changed

+104
-13
lines changed

11 files changed

+104
-13
lines changed

jooq-dialect/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 1.1.1 ##
2+
3+
- Supported UUID YDB Type
4+
15
## 1.1.0 ##
26
- Upgrade to new version of JDBC & SDK
37

jooq-dialect/pom.xml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
<groupId>tech.ydb.dialects</groupId>
66
<artifactId>jooq-ydb-dialect</artifactId>
7-
<version>1.1.0</version>
7+
<version>1.1.1</version>
88

99
<name>YDB JOOQ Dialect module</name>
1010
<description>YDB JOOQ Dialect module</description>
@@ -134,7 +134,6 @@
134134
<configuration>
135135
<environmentVariables>
136136
<TESTCONTAINERS_REUSE_ENABLE>true</TESTCONTAINERS_REUSE_ENABLE>
137-
<YDB_DOCKER_IMAGE>cr.yandex/yc/yandex-docker-local-ydb:latest</YDB_DOCKER_IMAGE>
138137
</environmentVariables>
139138
</configuration>
140139
</plugin>

jooq-dialect/src/main/java/tech/ydb/jooq/YdbTypes.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,8 @@ public static DataType<BigDecimal> DECIMAL(int precision, int scale) {
5252
public static final DataType<org.jooq.JSON> JSON = newDataType(SQLDataType.JSON, "json", new JsonBinding());
5353
public static final DataType<org.jooq.JSONB> JSONDOCUMENT = newDataType(SQLDataType.JSONB, "jsondocument", new JsonDocumentBinding());
5454
public static final DataType<YSON> YSON = newDataType(SQLDataType.OTHER, "yson", new YsonBinding());
55-
public static final DataType<java.util.UUID> UUID = newDataType(SQLDataType.UUID, "uuid");
55+
56+
public static final DataType<java.util.UUID> UUID = newDataType(SQLDataType.UUID, "uuid", new UuidBinding());
5657

5758
public static final DataType<LocalDate> DATE = newDataType(SQLDataType.LOCALDATE, "date", new DateBinding());
5859
public static final DataType<LocalDateTime> DATETIME = newDataType(SQLDataType.LOCALDATETIME, "datetime", new DatetimeBinding());
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package tech.ydb.jooq.binding;
2+
3+
import java.sql.SQLException;
4+
import java.util.UUID;
5+
import org.jooq.BindingGetResultSetContext;
6+
import org.jooq.BindingSetStatementContext;
7+
import org.jooq.Converter;
8+
import org.jooq.impl.AbstractBinding;
9+
import org.jooq.impl.IdentityConverter;
10+
import static tech.ydb.jooq.binding.BindingTools.indexType;
11+
import tech.ydb.table.values.PrimitiveType;
12+
13+
/**
14+
* @author Kirill Kurdyukov
15+
*/
16+
public class UuidBinding extends AbstractBinding<UUID, UUID> {
17+
18+
private static final int INDEX_TYPE = indexType(PrimitiveType.Uuid);
19+
20+
@Override
21+
public Converter<UUID, UUID> converter() {
22+
return new IdentityConverter<>(UUID.class);
23+
}
24+
25+
@Override
26+
public void set(BindingSetStatementContext<UUID> ctx) throws SQLException {
27+
if (ctx.value() == null) {
28+
ctx.statement().setNull(ctx.index(), INDEX_TYPE);
29+
} else {
30+
ctx.statement().setObject(ctx.index(), ctx.value(), INDEX_TYPE);
31+
}
32+
}
33+
34+
@Override
35+
public void get(BindingGetResultSetContext<UUID> ctx) throws SQLException {
36+
ctx.value((UUID) ctx.resultSet().getObject(ctx.index()));
37+
}
38+
}

jooq-dialect/src/main/java/tech/ydb/jooq/codegen/YdbDatabase.java

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,28 @@
44
import java.util.ArrayList;
55
import java.util.Collections;
66
import java.util.List;
7-
8-
import org.jooq.*;
7+
import org.jooq.DSLContext;
8+
import org.jooq.Record12;
9+
import org.jooq.Record4;
10+
import org.jooq.Record5;
11+
import org.jooq.Record6;
12+
import org.jooq.ResultQuery;
913
import org.jooq.impl.DSL;
10-
import org.jooq.meta.*;
11-
import org.jooq.tools.JooqLogger;
12-
14+
import org.jooq.meta.AbstractDatabase;
15+
import org.jooq.meta.ArrayDefinition;
16+
import org.jooq.meta.CatalogDefinition;
17+
import org.jooq.meta.DefaultRelations;
18+
import org.jooq.meta.DomainDefinition;
19+
import org.jooq.meta.EnumDefinition;
20+
import org.jooq.meta.IndexDefinition;
21+
import org.jooq.meta.PackageDefinition;
22+
import org.jooq.meta.ResultQueryDatabase;
23+
import org.jooq.meta.RoutineDefinition;
24+
import org.jooq.meta.SchemaDefinition;
25+
import org.jooq.meta.SequenceDefinition;
26+
import org.jooq.meta.TableDefinition;
27+
import org.jooq.meta.UDTDefinition;
28+
import org.jooq.meta.XMLSchemaCollectionDefinition;
1329
import tech.ydb.jdbc.YdbConnection;
1430
import tech.ydb.jdbc.context.SchemeExecutor;
1531
import tech.ydb.jdbc.context.YdbContext;
@@ -24,7 +40,6 @@
2440
import tech.ydb.table.settings.DescribeTableSettings;
2541

2642
public class YdbDatabase extends AbstractDatabase implements ResultQueryDatabase {
27-
private static final JooqLogger log = JooqLogger.getLogger(YdbDatabase.class);
2843

2944
public YdbDatabase() {
3045
YdbTypes.initialize();

jooq-dialect/src/main/java/tech/ydb/jooq/codegen/YdbTableDefinition.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import tech.ydb.jooq.binding.Uint32Binding;
3434
import tech.ydb.jooq.binding.Uint64Binding;
3535
import tech.ydb.jooq.binding.Uint8Binding;
36+
import tech.ydb.jooq.binding.UuidBinding;
3637
import tech.ydb.jooq.binding.YsonBinding;
3738
import tech.ydb.jooq.value.YSON;
3839
import tech.ydb.table.description.TableColumn;
@@ -73,7 +74,7 @@ protected List<ColumnDefinition> getElements0() {
7374
kind = type.getKind();
7475
}
7576

76-
int decimalDigits = kind == Type.Kind.DECIMAL ? ((DecimalType) type).getPrecision(): 0;
77+
int scale = kind == Type.Kind.DECIMAL ? ((DecimalType) type).getScale() : 0;
7778

7879
String typeName = type.toString();
7980
Class<? extends Binding<?, ?>> binding = getBinding(typeName);
@@ -85,7 +86,7 @@ protected List<ColumnDefinition> getElements0() {
8586
typeName,
8687
YdbTypes.getSqlPrecision(type),
8788
YdbTypes.getSqlPrecision(type),
88-
decimalDigits,
89+
scale,
8990
isNullable,
9091
null,
9192
DSL.name(typeName),
@@ -130,6 +131,7 @@ public TableDescription getTableDescription() {
130131
case "Uint32" -> Uint32Binding.class;
131132
case "Uint64" -> Uint64Binding.class;
132133
case "Yson" -> YsonBinding.class;
134+
case "Uuid" -> UuidBinding.class;
133135
default -> null;
134136
};
135137
}

jooq-dialect/src/test/java/jooq/generated/ydb/default_schema/tables/DateTable.java

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

jooq-dialect/src/test/java/jooq/generated/ydb/default_schema/tables/HardTable.java

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

jooq-dialect/src/test/java/jooq/generated/ydb/default_schema/tables/records/HardTableRecord.java

Lines changed: 18 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

jooq-dialect/src/test/java/tech/ydb/jooq/BaseTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ public static void beforeAll() {
9898
.column("first", YdbTypes.JSON)
9999
.column("second", YdbTypes.JSONDOCUMENT)
100100
.column("third", YdbTypes.YSON)
101+
.column("uuid", YdbTypes.UUID)
101102
.primaryKey("id")
102103
.execute();
103104

jooq-dialect/src/test/java/tech/ydb/jooq/InsertTest.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package tech.ydb.jooq;
22

33
import java.util.List;
4+
import java.util.UUID;
45
import static jooq.generated.ydb.default_schema.Tables.HARD_TABLE;
56
import static jooq.generated.ydb.default_schema.Tables.SERIES;
67
import jooq.generated.ydb.default_schema.tables.records.HardTableRecord;
@@ -71,10 +72,12 @@ public void testConditionalInsert() {
7172
@Test
7273
public void testInsertJsonTypes() {
7374
HardTableRecord record = new HardTableRecord();
75+
7476
record.setId("test-id".getBytes());
7577
record.setFirst(JSON.valueOf("{\"key\": \"value\"}"));
7678
record.setSecond(JSONB.valueOf("{\"list\": [1, 2, 3]}"));
7779
record.setThird(YSON.valueOf("{\"boolean\" = true}"));
80+
record.setUuid(UUID.randomUUID());
7881

7982
dsl.insertInto(HARD_TABLE)
8083
.set(record)
@@ -84,6 +87,11 @@ public void testInsertJsonTypes() {
8487
.where(HARD_TABLE.ID.eq("test-id".getBytes()))
8588
.fetch();
8689

90+
Result<HardTableRecord> recordsByUuid = dsl.selectFrom(HARD_TABLE)
91+
.where(HARD_TABLE.UUID.eq(record.getUuid()))
92+
.fetch();
93+
8794
assertEquals(List.of(record), records);
95+
assertEquals(List.of(record), recordsByUuid);
8896
}
8997
}

0 commit comments

Comments
 (0)