From a66c33100f7dc31caf0175efd2e3df28e4714dd4 Mon Sep 17 00:00:00 2001 From: babyfish-ct Date: Sun, 23 Feb 2025 03:21:06 +0800 Subject: [PATCH] #934 --- project/gradle.properties | 2 +- .../babyfish/jimmer/sql/JSqlClientImpl.java | 11 +++++ .../jimmer/sql/runtime/ScalarProvider.java | 7 --- .../model/pg/MacAddressScalarProvider.java | 21 +++++++++ .../jimmer/sql/model/pg/PgTypeRow.java | 14 ++++++ .../jimmer/sql/mutation/PgTypeRowTest.java | 45 +++++++++++++++++++ .../src/test/resources/database-postgres.sql | 11 ++++- 7 files changed, 102 insertions(+), 9 deletions(-) create mode 100644 project/jimmer-sql/src/test/java/org/babyfish/jimmer/sql/model/pg/MacAddressScalarProvider.java create mode 100644 project/jimmer-sql/src/test/java/org/babyfish/jimmer/sql/model/pg/PgTypeRow.java create mode 100644 project/jimmer-sql/src/test/java/org/babyfish/jimmer/sql/mutation/PgTypeRowTest.java diff --git a/project/gradle.properties b/project/gradle.properties index fc6608eef1..865c998c84 100644 --- a/project/gradle.properties +++ b/project/gradle.properties @@ -1,2 +1,2 @@ group=org.babyfish.jimmer -version=0.9.57 +version=0.9.58 diff --git a/project/jimmer-sql/src/main/java/org/babyfish/jimmer/sql/JSqlClientImpl.java b/project/jimmer-sql/src/main/java/org/babyfish/jimmer/sql/JSqlClientImpl.java index 2cb5733f92..c45da80ea4 100644 --- a/project/jimmer-sql/src/main/java/org/babyfish/jimmer/sql/JSqlClientImpl.java +++ b/project/jimmer-sql/src/main/java/org/babyfish/jimmer/sql/JSqlClientImpl.java @@ -1185,6 +1185,17 @@ private void addScalarProviderImpl(ImmutableProp prop, ScalarProvider scal "please use property-specific scalar provider" ); } + if (ReaderManager.isStandardScalarType((Class) scalarType)) { + throw new IllegalStateException( + "Illegal global type scalar provider type \"" + + scalarProvider.getClass().getName() + + "\" its scalar type argument cannot be \"" + + scalarType + + "\" because it is standard type. Please " + + "use non-standard type or " + + "use property level scalar provider" + ); + } if (typeScalarProviderMap.containsKey(scalarType)) { throw new IllegalStateException( "Cannot set scalar provider for scalar type \"" + diff --git a/project/jimmer-sql/src/main/java/org/babyfish/jimmer/sql/runtime/ScalarProvider.java b/project/jimmer-sql/src/main/java/org/babyfish/jimmer/sql/runtime/ScalarProvider.java index fcdceeac9b..1c4fea277d 100644 --- a/project/jimmer-sql/src/main/java/org/babyfish/jimmer/sql/runtime/ScalarProvider.java +++ b/project/jimmer-sql/src/main/java/org/babyfish/jimmer/sql/runtime/ScalarProvider.java @@ -179,13 +179,6 @@ static void validateScalarType(Type scalarType) { "\", scalar provider does not support tuple type" ); } - if (ReaderManager.isStandardScalarType(scalarClass)) { - throw new IllegalArgumentException( - "Illegal scalar type \"" + - ((Class)scalarType).getName() + - "\", scalar provider does not support standard scalar type" - ); - } Class annotationType = getOrmAnnotationType(scalarClass); if (annotationType != null) { throw new IllegalArgumentException( diff --git a/project/jimmer-sql/src/test/java/org/babyfish/jimmer/sql/model/pg/MacAddressScalarProvider.java b/project/jimmer-sql/src/test/java/org/babyfish/jimmer/sql/model/pg/MacAddressScalarProvider.java new file mode 100644 index 0000000000..190f1b0c32 --- /dev/null +++ b/project/jimmer-sql/src/test/java/org/babyfish/jimmer/sql/model/pg/MacAddressScalarProvider.java @@ -0,0 +1,21 @@ +package org.babyfish.jimmer.sql.model.pg; + +import org.babyfish.jimmer.sql.runtime.ScalarProvider; +import org.jetbrains.annotations.NotNull; +import org.postgresql.util.PGobject; + +public class MacAddressScalarProvider implements ScalarProvider { + + @Override + public String toScalar(@NotNull PGobject sqlValue) throws Exception { + return sqlValue.getValue(); + } + + @Override + public PGobject toSql(@NotNull String scalarValue) throws Exception { + PGobject po = new PGobject(); + po.setType("macaddr"); + po.setValue(scalarValue); + return po; + } +} diff --git a/project/jimmer-sql/src/test/java/org/babyfish/jimmer/sql/model/pg/PgTypeRow.java b/project/jimmer-sql/src/test/java/org/babyfish/jimmer/sql/model/pg/PgTypeRow.java new file mode 100644 index 0000000000..6b15989c4f --- /dev/null +++ b/project/jimmer-sql/src/test/java/org/babyfish/jimmer/sql/model/pg/PgTypeRow.java @@ -0,0 +1,14 @@ +package org.babyfish.jimmer.sql.model.pg; + +import org.babyfish.jimmer.sql.*; + +@Entity +@DatabaseValidationIgnore +public interface PgTypeRow { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + long id(); + + String macAddress(); +} diff --git a/project/jimmer-sql/src/test/java/org/babyfish/jimmer/sql/mutation/PgTypeRowTest.java b/project/jimmer-sql/src/test/java/org/babyfish/jimmer/sql/mutation/PgTypeRowTest.java new file mode 100644 index 0000000000..33289fa177 --- /dev/null +++ b/project/jimmer-sql/src/test/java/org/babyfish/jimmer/sql/mutation/PgTypeRowTest.java @@ -0,0 +1,45 @@ +package org.babyfish.jimmer.sql.mutation; + +import org.babyfish.jimmer.sql.ast.mutation.SaveMode; +import org.babyfish.jimmer.sql.common.AbstractMutationTest; +import org.babyfish.jimmer.sql.common.NativeDatabases; +import org.babyfish.jimmer.sql.dialect.PostgresDialect; +import org.babyfish.jimmer.sql.meta.impl.IdentityIdGenerator; +import org.babyfish.jimmer.sql.model.Immutables; +import org.babyfish.jimmer.sql.model.pg.MacAddressScalarProvider; +import org.babyfish.jimmer.sql.model.pg.PgTypeRow; +import org.babyfish.jimmer.sql.model.pg.PgTypeRowProps; +import org.junit.jupiter.api.Test; + +public class PgTypeRowTest extends AbstractMutationTest { + + @Test + public void insert() { + + NativeDatabases.assumeNativeDatabase(); + + PgTypeRow row = Immutables.createPgTypeRow(draft -> { + draft.setMacAddress("08:00:2b:01:02:03"); + }); + + resetIdentity(NativeDatabases.POSTGRES_DATA_SOURCE, "pg_type_row"); + executeAndExpectResult( + NativeDatabases.POSTGRES_DATA_SOURCE, + getSqlClient(it -> { + it.setDialect(new PostgresDialect()); + it.setIdGenerator(IdentityIdGenerator.INSTANCE); + it.setScalarProvider(PgTypeRowProps.MAC_ADDRESS, new MacAddressScalarProvider()); + }).saveCommand(row).setMode(SaveMode.INSERT_ONLY), + ctx -> { + ctx.statement(it -> { + it.sql("insert into PG_TYPE_ROW(MAC_ADDRESS) values(?) returning ID"); + }); + ctx.entity(it -> { + it.modified( + "{\"id\":100,\"macAddress\":\"08:00:2b:01:02:03\"}" + ); + }); + } + ); + } +} diff --git a/project/jimmer-sql/src/test/resources/database-postgres.sql b/project/jimmer-sql/src/test/resources/database-postgres.sql index c67d5e2e1a..01eeb24e63 100644 --- a/project/jimmer-sql/src/test/resources/database-postgres.sql +++ b/project/jimmer-sql/src/test/resources/database-postgres.sql @@ -473,4 +473,13 @@ insert into permission(id, name, role_id, deleted, created_time, modified_time) (1000, 'p_1', 100, false, '2022-10-03 00:00:00', '2022-10-03 00:10:00'), (2000, 'p_2', 100, true, '2022-10-03 00:00:00', '2022-10-03 00:10:00'), (3000, 'p_3', 200, false, '2022-10-03 00:00:00', '2022-10-03 00:10:00'), - (4000, 'p_4', 200, true, '2022-10-03 00:00:00', '2022-10-03 00:10:00'); \ No newline at end of file + (4000, 'p_4', 200, true, '2022-10-03 00:00:00', '2022-10-03 00:10:00'); + + + +create table pg_type_row( + id bigint not null generated by default as identity(start with 100 increment by 1), + mac_address macaddr +); +alter table pg_type_row + add primary key(id); \ No newline at end of file