diff --git a/database/database-cassandra/src/main/java/ru/tinkoff/kora/database/cassandra/CassandraModule.java b/database/database-cassandra/src/main/java/ru/tinkoff/kora/database/cassandra/CassandraModule.java index 8ba5924db..e09751d58 100644 --- a/database/database-cassandra/src/main/java/ru/tinkoff/kora/database/cassandra/CassandraModule.java +++ b/database/database-cassandra/src/main/java/ru/tinkoff/kora/database/cassandra/CassandraModule.java @@ -1,12 +1,18 @@ package ru.tinkoff.kora.database.cassandra; +import ru.tinkoff.kora.application.graph.TypeRef; +import ru.tinkoff.kora.common.DefaultComponent; +import ru.tinkoff.kora.database.cassandra.mapper.parameter.CassandraParameterColumnMapper; import ru.tinkoff.kora.database.cassandra.mapper.result.CassandraResultSetMapper; +import ru.tinkoff.kora.database.cassandra.mapper.result.CassandraRowColumnMapper; import ru.tinkoff.kora.database.cassandra.mapper.result.CassandraRowMapper; -import ru.tinkoff.kora.database.common.DataBaseModule; +import ru.tinkoff.kora.database.common.*; import java.math.BigDecimal; import java.nio.ByteBuffer; +import java.sql.Types; import java.time.*; +import java.util.HashMap; import java.util.Optional; public interface CassandraModule extends DataBaseModule { @@ -98,4 +104,93 @@ default CassandraRowMapper instantCassandraRowMapper() { ? null : row.getInstant(0); } + + // Parameter + @DefaultComponent + default & EnumColumnIntMapping> CassandraParameterColumnMapper enumIntJdbcParameterColumnMapper() { + return (stmt, index, o) -> { + if (o == null) { + stmt.setToNull(index); + } else { + stmt.setInt(index, o.valueAsInt()); + } + }; + } + + @DefaultComponent + default & EnumColumnShortMapping> CassandraParameterColumnMapper enumShortJdbcParameterColumnMapper() { + return (stmt, index, o) -> { + if (o == null) { + stmt.setToNull(index); + } else { + stmt.setShort(index, o.valueAsShort()); + } + }; + } + + @DefaultComponent + default & EnumColumnStringMapping> CassandraParameterColumnMapper enumStringJdbcParameterColumnMapper() { + return (stmt, index, o) -> { + if (o == null) { + stmt.setToNull(index); + } else { + stmt.setString(index, o.toString()); + } + }; + } + + // RowColumn + @DefaultComponent + default & EnumColumnIntMapping> CassandraRowColumnMapper enumIntCassandraRowColumnMapper(TypeRef typeRef) { + final T[] enums = typeRef.getRawType().getEnumConstants(); + var enumMap = new HashMap(); + for (T e : enums) { + enumMap.put(e.valueAsInt(), e); + } + + return (row, index) -> { + if (row.isNull(index)) { + return null; + } + + var value = row.getInt(index); + return enumMap.get(value); + }; + } + + @DefaultComponent + default & EnumColumnShortMapping> CassandraRowColumnMapper enumShortCassandraRowColumnMapper(TypeRef typeRef) { + final T[] enums = typeRef.getRawType().getEnumConstants(); + var enumMap = new HashMap(); + for (T e : enums) { + enumMap.put(e.valueAsShort(), e); + } + + return (row, index) -> { + if (row.isNull(index)) { + return null; + } + + var value = row.getShort(index); + return enumMap.get(value); + }; + } + + @DefaultComponent + default & EnumColumnStringMapping> CassandraRowColumnMapper enumStringCassandraRowColumnMapper(TypeRef typeRef) { + final T[] enums = typeRef.getRawType().getEnumConstants(); + var enumMap = new HashMap(); + for (T e : enums) { + enumMap.put(e.toString(), e); + } + + return (row, index) -> { + if (row.isNull(index)) { + return null; + } + + var value = row.getString(index); + return enumMap.get(value); + }; + } } diff --git a/database/database-common/src/main/java/ru/tinkoff/kora/database/common/EnumColumnIntMapping.java b/database/database-common/src/main/java/ru/tinkoff/kora/database/common/EnumColumnIntMapping.java new file mode 100644 index 000000000..b679288a3 --- /dev/null +++ b/database/database-common/src/main/java/ru/tinkoff/kora/database/common/EnumColumnIntMapping.java @@ -0,0 +1,9 @@ +package ru.tinkoff.kora.database.common; + +/** + * 4 byte + */ +public interface EnumColumnIntMapping { + + int valueAsInt(); +} diff --git a/database/database-common/src/main/java/ru/tinkoff/kora/database/common/EnumColumnShortMapping.java b/database/database-common/src/main/java/ru/tinkoff/kora/database/common/EnumColumnShortMapping.java new file mode 100644 index 000000000..36dd015f4 --- /dev/null +++ b/database/database-common/src/main/java/ru/tinkoff/kora/database/common/EnumColumnShortMapping.java @@ -0,0 +1,9 @@ +package ru.tinkoff.kora.database.common; + +/** + * 2 byte + */ +public interface EnumColumnShortMapping { + + short valueAsShort(); +} diff --git a/database/database-common/src/main/java/ru/tinkoff/kora/database/common/EnumColumnStringMapping.java b/database/database-common/src/main/java/ru/tinkoff/kora/database/common/EnumColumnStringMapping.java new file mode 100644 index 000000000..69d6577b9 --- /dev/null +++ b/database/database-common/src/main/java/ru/tinkoff/kora/database/common/EnumColumnStringMapping.java @@ -0,0 +1,9 @@ +package ru.tinkoff.kora.database.common; + +/** + * depends on varchar length + */ +public interface EnumColumnStringMapping { + + String toString(); +} diff --git a/database/database-jdbc/src/main/java/ru/tinkoff/kora/database/jdbc/JdbcModule.java b/database/database-jdbc/src/main/java/ru/tinkoff/kora/database/jdbc/JdbcModule.java index 997f8547e..6d4df9973 100644 --- a/database/database-jdbc/src/main/java/ru/tinkoff/kora/database/jdbc/JdbcModule.java +++ b/database/database-jdbc/src/main/java/ru/tinkoff/kora/database/jdbc/JdbcModule.java @@ -1,7 +1,8 @@ package ru.tinkoff.kora.database.jdbc; +import ru.tinkoff.kora.application.graph.TypeRef; import ru.tinkoff.kora.common.DefaultComponent; -import ru.tinkoff.kora.database.common.DataBaseModule; +import ru.tinkoff.kora.database.common.*; import ru.tinkoff.kora.database.jdbc.mapper.parameter.JdbcParameterColumnMapper; import ru.tinkoff.kora.database.jdbc.mapper.result.JdbcResultColumnMapper; import ru.tinkoff.kora.database.jdbc.mapper.result.JdbcResultSetMapper; @@ -10,6 +11,7 @@ import java.math.BigDecimal; import java.sql.Types; import java.time.*; +import java.util.HashMap; import java.util.Optional; import java.util.UUID; @@ -254,6 +256,39 @@ default JdbcParameterColumnMapper offsetDateTimeJdbcParameterCol }; } + @DefaultComponent + default & EnumColumnIntMapping> JdbcParameterColumnMapper enumIntJdbcParameterColumnMapper() { + return (stmt, index, o) -> { + if (o == null) { + stmt.setNull(index, Types.INTEGER); + } else { + stmt.setInt(index, o.valueAsInt()); + } + }; + } + + @DefaultComponent + default & EnumColumnShortMapping> JdbcParameterColumnMapper enumShortJdbcParameterColumnMapper() { + return (stmt, index, o) -> { + if (o == null) { + stmt.setNull(index, Types.SMALLINT); + } else { + stmt.setShort(index, o.valueAsShort()); + } + }; + } + + @DefaultComponent + default & EnumColumnStringMapping> JdbcParameterColumnMapper enumStringJdbcParameterColumnMapper() { + return (stmt, index, o) -> { + if (o == null) { + stmt.setNull(index, Types.VARCHAR); + } else { + stmt.setString(index, o.toString()); + } + }; + } + // Result Mappers @DefaultComponent default JdbcResultColumnMapper bigDecimalJdbcResultColumnMapper() { @@ -331,4 +366,58 @@ default JdbcResultColumnMapper offsetDateTimeJdbcColumnMapper() return value; }; } + + @DefaultComponent + default & EnumColumnIntMapping> JdbcResultColumnMapper enumIntJdbcColumnMapper(TypeRef typeRef) { + final T[] enums = typeRef.getRawType().getEnumConstants(); + var enumMap = new HashMap(); + for (T e : enums) { + enumMap.put(e.valueAsInt(), e); + } + + return (row, index) -> { + var value = row.getInt(index); + if (row.wasNull()) { + return null; + } + + return enumMap.get(value); + }; + } + + @DefaultComponent + default & EnumColumnShortMapping> JdbcResultColumnMapper enumShortJdbcColumnMapper(TypeRef typeRef) { + final T[] enums = typeRef.getRawType().getEnumConstants(); + var enumMap = new HashMap(); + for (T e : enums) { + enumMap.put(e.valueAsShort(), e); + } + + return (row, index) -> { + var value = row.getObject(index, Short.class); + if (row.wasNull()) { + return null; + } + + return enumMap.get(value); + }; + } + + @DefaultComponent + default & EnumColumnStringMapping> JdbcResultColumnMapper enumStringJdbcColumnMapper(TypeRef typeRef) { + final T[] enums = typeRef.getRawType().getEnumConstants(); + var enumMap = new HashMap(); + for (T e : enums) { + enumMap.put(e.toString(), e); + } + + return (row, index) -> { + var value = row.getString(index); + if (row.wasNull()) { + return null; + } + + return enumMap.get(value); + }; + } } diff --git a/database/database-r2dbc/src/main/java/ru/tinkoff/kora/database/r2dbc/R2dbcModule.java b/database/database-r2dbc/src/main/java/ru/tinkoff/kora/database/r2dbc/R2dbcModule.java index 0dd0acb30..423d3520b 100644 --- a/database/database-r2dbc/src/main/java/ru/tinkoff/kora/database/r2dbc/R2dbcModule.java +++ b/database/database-r2dbc/src/main/java/ru/tinkoff/kora/database/r2dbc/R2dbcModule.java @@ -2,8 +2,12 @@ import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +import ru.tinkoff.kora.application.graph.TypeRef; import ru.tinkoff.kora.common.DefaultComponent; import ru.tinkoff.kora.database.common.DataBaseModule; +import ru.tinkoff.kora.database.common.EnumColumnIntMapping; +import ru.tinkoff.kora.database.common.EnumColumnShortMapping; +import ru.tinkoff.kora.database.common.EnumColumnStringMapping; import ru.tinkoff.kora.database.r2dbc.mapper.parameter.R2dbcParameterColumnMapper; import ru.tinkoff.kora.database.r2dbc.mapper.result.R2dbcResultColumnMapper; import ru.tinkoff.kora.database.r2dbc.mapper.result.R2dbcResultFluxMapper; @@ -12,6 +16,7 @@ import java.math.BigDecimal; import java.math.BigInteger; import java.time.*; +import java.util.HashMap; import java.util.List; import java.util.UUID; @@ -170,6 +175,39 @@ default R2dbcParameterColumnMapper OffsetDateTimeR2dbcParameterC }; } + @DefaultComponent + default & EnumColumnIntMapping> R2dbcParameterColumnMapper enumIntJdbcParameterColumnMapper() { + return (stmt, index, o) -> { + if (o == null) { + stmt.bindNull(index, Integer.class); + } else { + stmt.bind(index, o.valueAsInt()); + } + }; + } + + @DefaultComponent + default & EnumColumnShortMapping> R2dbcParameterColumnMapper enumShortJdbcParameterColumnMapper() { + return (stmt, index, o) -> { + if (o == null) { + stmt.bindNull(index, Short.class); + } else { + stmt.bind(index, o.valueAsShort()); + } + }; + } + + @DefaultComponent + default & EnumColumnStringMapping> R2dbcParameterColumnMapper enumStringJdbcParameterColumnMapper() { + return (stmt, index, o) -> { + if (o == null) { + stmt.bindNull(index, String.class); + } else { + stmt.bind(index, o.toString()); + } + }; + } + // Result Column Mappers @DefaultComponent default R2dbcResultColumnMapper bigDecimalR2dbcResultColumnMapper() { @@ -205,4 +243,55 @@ default R2dbcResultColumnMapper offsetTimeR2dbcResultColumnMapper() default R2dbcResultColumnMapper offsetDateTimeR2dbcResultColumnMapper() { return (row, label) -> row.get(label, OffsetDateTime.class); } + + @DefaultComponent + default & EnumColumnIntMapping> R2dbcResultColumnMapper enumIntR2dbcRowColumnMapper(TypeRef typeRef) { + final T[] enums = typeRef.getRawType().getEnumConstants(); + var enumMap = new HashMap(); + for (T e : enums) { + enumMap.put(e.valueAsInt(), e); + } + + return (row, index) -> { + var value = row.get(index, Integer.class); + if (value == null) { + return null; + } + return enumMap.get(value); + }; + } + + @DefaultComponent + default & EnumColumnShortMapping> R2dbcResultColumnMapper enumShortR2dbcRowColumnMapper(TypeRef typeRef) { + final T[] enums = typeRef.getRawType().getEnumConstants(); + var enumMap = new HashMap(); + for (T e : enums) { + enumMap.put(e.valueAsShort(), e); + } + + return (row, index) -> { + var value = row.get(index, Short.class); + if (value == null) { + return null; + } + return enumMap.get(value); + }; + } + + @DefaultComponent + default & EnumColumnStringMapping> R2dbcResultColumnMapper enumStringR2dbcRowColumnMapper(TypeRef typeRef) { + final T[] enums = typeRef.getRawType().getEnumConstants(); + var enumMap = new HashMap(); + for (T e : enums) { + enumMap.put(e.toString(), e); + } + + return (row, index) -> { + var value = row.get(index, String.class); + if (value == null) { + return null; + } + return enumMap.get(value); + }; + } } diff --git a/database/database-vertx/src/main/java/ru/tinkoff/kora/database/vertx/VertxDatabaseBaseModule.java b/database/database-vertx/src/main/java/ru/tinkoff/kora/database/vertx/VertxDatabaseBaseModule.java index ce1239a9e..4b295602e 100644 --- a/database/database-vertx/src/main/java/ru/tinkoff/kora/database/vertx/VertxDatabaseBaseModule.java +++ b/database/database-vertx/src/main/java/ru/tinkoff/kora/database/vertx/VertxDatabaseBaseModule.java @@ -1,7 +1,14 @@ package ru.tinkoff.kora.database.vertx; import io.vertx.core.buffer.Buffer; +import ru.tinkoff.kora.application.graph.TypeRef; +import ru.tinkoff.kora.common.DefaultComponent; import ru.tinkoff.kora.database.common.DataBaseModule; +import ru.tinkoff.kora.database.common.EnumColumnIntMapping; +import ru.tinkoff.kora.database.common.EnumColumnShortMapping; +import ru.tinkoff.kora.database.common.EnumColumnStringMapping; +import ru.tinkoff.kora.database.vertx.mapper.parameter.VertxParameterColumnMapper; +import ru.tinkoff.kora.database.vertx.mapper.result.VertxResultColumnMapper; import ru.tinkoff.kora.database.vertx.mapper.result.VertxRowMapper; import ru.tinkoff.kora.database.vertx.mapper.result.VertxRowSetMapper; import ru.tinkoff.kora.netty.common.NettyCommonModule; @@ -11,6 +18,7 @@ import java.math.BigInteger; import java.time.LocalDate; import java.time.LocalDateTime; +import java.util.HashMap; import java.util.Optional; import java.util.UUID; @@ -75,4 +83,72 @@ default VertxRowMapper bigIntegerTimeVertxRowMapper() { default VertxRowMapper uuidTimeVertxRowMapper() { return row -> row.getUUID(0); } + + // Parameter + @DefaultComponent + default & EnumColumnIntMapping> VertxParameterColumnMapper enumIntVertxParameterColumnMapper() { + return (o) -> o.valueAsInt(); + } + + @DefaultComponent + default & EnumColumnShortMapping> VertxParameterColumnMapper enumShortVertxParameterColumnMapper() { + return (o) -> o.valueAsShort(); + } + + @DefaultComponent + default & EnumColumnStringMapping> VertxParameterColumnMapper enumStringVertxParameterColumnMapper() { + return (o) -> o.toString(); + } + + // RowColumn + @DefaultComponent + default & EnumColumnIntMapping> VertxResultColumnMapper enumIntCassandraRowColumnMapper(TypeRef typeRef) { + final T[] enums = typeRef.getRawType().getEnumConstants(); + var enumMap = new HashMap(); + for (T e : enums) { + enumMap.put(e.valueAsInt(), e); + } + + return (row, index) -> { + var value = row.getInteger(index); + if (value == null) { + return null; + } + return enumMap.get(value); + }; + } + + @DefaultComponent + default & EnumColumnShortMapping> VertxResultColumnMapper enumShortCassandraRowColumnMapper(TypeRef typeRef) { + final T[] enums = typeRef.getRawType().getEnumConstants(); + var enumMap = new HashMap(); + for (T e : enums) { + enumMap.put(e.valueAsShort(), e); + } + + return (row, index) -> { + var value = row.getShort(index); + if (value == null) { + return null; + } + return enumMap.get(value); + }; + } + + @DefaultComponent + default & EnumColumnStringMapping> VertxResultColumnMapper enumStringCassandraRowColumnMapper(TypeRef typeRef) { + final T[] enums = typeRef.getRawType().getEnumConstants(); + var enumMap = new HashMap(); + for (T e : enums) { + enumMap.put(e.toString(), e); + } + + return (row, index) -> { + var value = row.getString(index); + if (value == null) { + return null; + } + return enumMap.get(value); + }; + } }