From fcb963a5150fc2b267f6012fb0037948d93b0d4d Mon Sep 17 00:00:00 2001 From: davin111 Date: Thu, 13 Apr 2023 23:26:49 +0900 Subject: [PATCH 1/3] fix getColumnMetadatas() --- r2dbc-mysql/src/main/java/JasyncMetadata.kt | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/r2dbc-mysql/src/main/java/JasyncMetadata.kt b/r2dbc-mysql/src/main/java/JasyncMetadata.kt index f0f1eadd..e941474b 100644 --- a/r2dbc-mysql/src/main/java/JasyncMetadata.kt +++ b/r2dbc-mysql/src/main/java/JasyncMetadata.kt @@ -6,6 +6,10 @@ import io.r2dbc.spi.RowMetadata import io.r2dbc.spi.Type class JasyncMetadata(rows: ResultSet) : RowMetadata { + private val columnNames = rows.columnNames() + private val metadataList = columnNames.map { JasyncColumnMetadata(it) } + private val metadataMap = metadataList.reversed().associateBy { it.name } + override fun getColumnMetadata(index: Int): ColumnMetadata { if (index >= this.columnNames.size) { throw ArrayIndexOutOfBoundsException( @@ -25,22 +29,19 @@ class JasyncMetadata(rows: ResultSet) : RowMetadata { ) } - return this.metadata.getValue(columnNames[index]) + return this.metadataList[index] } override fun getColumnMetadata(name: String): ColumnMetadata { - return this.metadata[name] + return this.metadataMap[name] ?: throw NoSuchElementException( String .format("Column name '%s' does not exist in column names %s", name, columnNames) ) } - private val columnNames: List = rows.columnNames() - private val metadata: Map = columnNames.map { it to JasyncColumnMetadata(it) }.toMap() - override fun getColumnMetadatas(): MutableList { - return metadata.values.toMutableList() + return metadataList.toMutableList() } internal class JasyncColumnMetadata(private val name: String) : ColumnMetadata { From 378cf98dda19bd8a8ec5240d97b7292830432fcc Mon Sep 17 00:00:00 2001 From: davin111 Date: Mon, 17 Apr 2023 18:48:02 +0900 Subject: [PATCH 2/3] add test --- .../r2dbc/mysql/integ/JasyncR2dbcIntegTest.kt | 67 ++++++++++++++----- .../mysql/integ/R2dbcConnectionHelper.kt | 20 ++++-- 2 files changed, 65 insertions(+), 22 deletions(-) diff --git a/r2dbc-mysql/src/test/java/com/github/jasync/r2dbc/mysql/integ/JasyncR2dbcIntegTest.kt b/r2dbc-mysql/src/test/java/com/github/jasync/r2dbc/mysql/integ/JasyncR2dbcIntegTest.kt index 34f3a83d..d591377a 100644 --- a/r2dbc-mysql/src/test/java/com/github/jasync/r2dbc/mysql/integ/JasyncR2dbcIntegTest.kt +++ b/r2dbc-mysql/src/test/java/com/github/jasync/r2dbc/mysql/integ/JasyncR2dbcIntegTest.kt @@ -10,7 +10,7 @@ import io.r2dbc.spi.Parameter import io.r2dbc.spi.Result import io.r2dbc.spi.Type import mu.KotlinLogging -import org.assertj.core.api.Assertions +import org.assertj.core.api.Assertions.assertThat import org.awaitility.kotlin.await import org.hamcrest.core.IsEqual import org.junit.Test @@ -44,15 +44,15 @@ class JasyncR2dbcIntegTest : R2dbcConnectionHelper() { .flatMap { result -> result .map { row, rowMetadata -> - Assertions.assertThat(row.get("number_tinyint") as Byte).isEqualTo(-100) - Assertions.assertThat(row.get("number_smallint") as Short).isEqualTo(32766) - Assertions.assertThat(row.get("number_mediumint") as Int).isEqualTo(8388607) - Assertions.assertThat(row.get("number_int") as Int).isEqualTo(2147483647) - Assertions.assertThat(row.get("number_bigint") as Long).isEqualTo(9223372036854775807L) - Assertions.assertThat(row.get("number_decimal")).isEqualTo(BigDecimal("450.764491")) - Assertions.assertThat(row.get("number_float")).isEqualTo(14.7F) - Assertions.assertThat(row.get("number_double")).isEqualTo(87650.9876) - Assertions.assertThat(rowMetadata.columnMetadatas.map { it.name }).isEqualTo( + assertThat(row.get("number_tinyint") as Byte).isEqualTo(-100) + assertThat(row.get("number_smallint") as Short).isEqualTo(32766) + assertThat(row.get("number_mediumint") as Int).isEqualTo(8388607) + assertThat(row.get("number_int") as Int).isEqualTo(2147483647) + assertThat(row.get("number_bigint") as Long).isEqualTo(9223372036854775807L) + assertThat(row.get("number_decimal")).isEqualTo(BigDecimal("450.764491")) + assertThat(row.get("number_float")).isEqualTo(14.7F) + assertThat(row.get("number_double")).isEqualTo(87650.9876) + assertThat(rowMetadata.columnMetadatas.map { it.name }).isEqualTo( listOf( "id", "number_tinyint", @@ -78,8 +78,8 @@ class JasyncR2dbcIntegTest : R2dbcConnectionHelper() { withConnection { c -> var filtering = 0 var rows = 0 - executeQuery(c, createTable) - executeQuery(c, """INSERT INTO users (name) VALUES ('Boogie Man'),('Dambeldor')""") + executeQuery(c, createUserTable) + executeQuery(c, insertUsers) val cf = createJasyncConnectionFactory(c) Mono.from(cf.create()) .flatMapMany { connection -> @@ -109,8 +109,8 @@ class JasyncR2dbcIntegTest : R2dbcConnectionHelper() { fun `bind test`() { withConnection { c -> var rows = 0 - executeQuery(c, createTable) - executeQuery(c, """INSERT INTO users (name) VALUES ('Boogie Man'),('Dambeldor')""") + executeQuery(c, createUserTable) + executeQuery(c, insertUsers) val cf = createJasyncConnectionFactory(c) Mono.from(cf.create()) .flatMapMany { connection -> @@ -139,8 +139,8 @@ class JasyncR2dbcIntegTest : R2dbcConnectionHelper() { fun `bind test for parametrized`() { withConnection { c -> var rows = 0 - executeQuery(c, createTable) - executeQuery(c, """INSERT INTO users (name) VALUES ('Boogie Man'),('Dambeldor')""") + executeQuery(c, createUserTable) + executeQuery(c, insertUsers) val cf = createJasyncConnectionFactory(c) Mono.from(cf.create()) .flatMapMany { connection -> @@ -164,6 +164,41 @@ class JasyncR2dbcIntegTest : R2dbcConnectionHelper() { } } + @Test + fun `join tables which have column with the same names test`() { + withConnection { c -> + var rows = 0 + executeQuery(c, createUserTable) + executeQuery(c, insertUsers) + executeQuery(c, createPostTable) + executeQuery(c, insertPosts) + val cf = createJasyncConnectionFactory(c) + Mono.from(cf.create()) + .flatMapMany { connection -> + connection + .createStatement("SELECT * FROM users JOIN posts ON users.id = posts.user_id") + .execute() + } + .flatMap { result -> + result + .map { row, rowMetadata -> + assertThat(rowMetadata.columnMetadatas.map { it.name }).isEqualTo( + listOf( + "id", + "name", + "id", + "title", + "user_id", + ) + ) + } + } + .doOnNext { rows++ } + .subscribe() + await.until { rows == 2 } + } + } + private fun String.createParam(): Parameter = object : Parameter { override fun getType(): Type { TODO("Not implemented") diff --git a/r2dbc-mysql/src/test/java/com/github/jasync/r2dbc/mysql/integ/R2dbcConnectionHelper.kt b/r2dbc-mysql/src/test/java/com/github/jasync/r2dbc/mysql/integ/R2dbcConnectionHelper.kt index c7c216fc..919edfdc 100644 --- a/r2dbc-mysql/src/test/java/com/github/jasync/r2dbc/mysql/integ/R2dbcConnectionHelper.kt +++ b/r2dbc-mysql/src/test/java/com/github/jasync/r2dbc/mysql/integ/R2dbcConnectionHelper.kt @@ -79,15 +79,23 @@ open class R2dbcConnectionHelper : R2dbcContainerHelper() { insert into posts (created_at_date, created_at_datetime, created_at_timestamp, created_at_time, created_at_year) values ( '2038-01-19', '2013-01-19 03:14:07', '2020-01-19 03:14:07', '03:14:07', '1999' ) """ - val createTable = """CREATE TEMPORARY TABLE users ( + + val createUserTable = """CREATE TEMPORARY TABLE users ( id INT NOT NULL AUTO_INCREMENT , name VARCHAR(255) CHARACTER SET 'utf8' NOT NULL , PRIMARY KEY (id) );""" - val insert = """INSERT INTO users (name) VALUES ('Boogie Man')""" - val select = """SELECT * FROM users""" + val insertUsers = """INSERT INTO users (name) VALUES ('Boogie Man'), ('Dambeldor')""" + val selectUsers = """SELECT * FROM users""" + + val createPostTable = """CREATE TEMPORARY TABLE posts ( + id INT NOT NULL AUTO_INCREMENT , + title VARCHAR(255) CHARACTER SET 'utf8' NOT NULL , + user_id INT NOT NULL , + PRIMARY KEY (id) );""" + val insertPosts = """INSERT INTO posts (title, user_id) VALUES ('Hello World', 1), ('Hello World 2', 2)""" fun getConfiguration(): Configuration { - return R2dbcContainerHelper.defaultConfiguration + return defaultConfiguration } fun awaitFuture(f: CompletableFuture): T { @@ -95,7 +103,7 @@ open class R2dbcConnectionHelper : R2dbcContainerHelper() { } fun withPool(f: (ConnectionPool) -> T): T { - return withConfigurablePool(R2dbcContainerHelper.defaultConfiguration, f) + return withConfigurablePool(defaultConfiguration, f) } fun withConfigurablePool(configuration: Configuration, f: (ConnectionPool) -> T): T { @@ -127,7 +135,7 @@ open class R2dbcConnectionHelper : R2dbcContainerHelper() { } fun withConnection(fn: (MySQLConnection) -> T): T { - return withConfigurableConnection(R2dbcContainerHelper.defaultConfiguration, fn) + return withConfigurableConnection(defaultConfiguration, fn) } fun withSSLConnection( From 92fe92a2e4ab306b7c93b738d1e3c3fbf6f09d46 Mon Sep 17 00:00:00 2001 From: Ohad Shai Date: Tue, 18 Apr 2023 08:58:20 +0300 Subject: [PATCH 3/3] bump version to 2.1.25 --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 68a32f70..b351a901 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -24,7 +24,7 @@ apply(plugin = "io.github.gradle-nexus.publish-plugin") allprojects { group = "com.github.jasync-sql" - version = "2.1.24" + version = "2.1.25" apply(plugin = "kotlin") apply(plugin = "maven-publish")