From 81e46735df6fefe57c5eb944a8bb7bbfd6bf23c2 Mon Sep 17 00:00:00 2001 From: Fabrice Lecomte Date: Tue, 4 Jun 2019 13:28:38 +0200 Subject: [PATCH] implement SelectOne and multiple add Fixtures --- .../fr/postgresjson/connexion/Connection.kt | 14 ++++++++- .../fr/postgresjson/serializer/Serializer.kt | 12 ++++--- .../postgresjson/serializer/ConnectionTest.kt | 31 ++++++++++++++----- .../postgresjson/serializer/SerializerTest.kt | 9 +++--- src/test/resources/fixtures/init.sql | 20 ++++++++++++ 5 files changed, 69 insertions(+), 17 deletions(-) create mode 100644 src/test/resources/fixtures/init.sql diff --git a/src/main/kotlin/fr/postgresjson/connexion/Connection.kt b/src/main/kotlin/fr/postgresjson/connexion/Connection.kt index 8c36b34..fc3068f 100644 --- a/src/main/kotlin/fr/postgresjson/connexion/Connection.kt +++ b/src/main/kotlin/fr/postgresjson/connexion/Connection.kt @@ -26,7 +26,7 @@ class Connection( return connection } - inline fun > execute(sql: String, values: List = emptyList()): R? { + inline fun > selectOne(sql: String, values: List = emptyList()): R? { val future = connect().sendPreparedStatement(sql, values) val json = future.get().rows[0].getString(0) if (json === null) { @@ -37,4 +37,16 @@ class Connection( return obj } } + + inline fun >> select(sql: String, values: List = emptyList()): R { + val future = connect().sendPreparedStatement(sql, values) + val json = future.get().rows[0].getString(0) + if (json === null) { + return listOf>() as R + } else { + val obj = serializer.deserializeList(json) + + return obj + } + } } \ No newline at end of file diff --git a/src/main/kotlin/fr/postgresjson/serializer/Serializer.kt b/src/main/kotlin/fr/postgresjson/serializer/Serializer.kt index 9829a99..ab4e847 100644 --- a/src/main/kotlin/fr/postgresjson/serializer/Serializer.kt +++ b/src/main/kotlin/fr/postgresjson/serializer/Serializer.kt @@ -33,13 +33,15 @@ class Serializer(val mapper: ObjectMapper = jacksonObjectMapper()) { } inline fun > deserialize(json: String): E { - val unserialized = this.mapper.readValue(json) - return collection.get(unserialized.id) ?: unserialized + return this.mapper.readValue(json) } - inline fun > deserialize(json: String, target: E): E { - val unserialized = mapper.readerForUpdating(target).readValue(json) - return collection.get(unserialized.id) ?: unserialized + inline fun deserializeList(json: String): E { + return mapper.readValue(json) + } + + fun > deserialize(json: String, target: E): E { + return mapper.readerForUpdating(target).readValue(json) } } diff --git a/src/test/kotlin/fr/postgresjson/serializer/ConnectionTest.kt b/src/test/kotlin/fr/postgresjson/serializer/ConnectionTest.kt index 80ac535..7c18c93 100644 --- a/src/test/kotlin/fr/postgresjson/serializer/ConnectionTest.kt +++ b/src/test/kotlin/fr/postgresjson/serializer/ConnectionTest.kt @@ -16,15 +16,32 @@ class ConnectionTest() { @Test fun getObject() { - val obj: ObjTest? = connection.execute("select to_json(a) from test a limit 1") + val obj: ObjTest? = connection.selectOne("select to_json(a) from test a limit 1") assertTrue(obj is ObjTest) + assertTrue(obj!!.id == 1) } -// @Test -// fun getExistingObject() { -// val obj: ObjTest? = connection.execute("select to_json(a) from test a limit 1") -// assertTrue(obj is ObjTest) -// } + @Test + fun getExistingObject() { + val objs: List = connection.select(""" + select + json_agg(j) + FROM ( + SELECT + t.id, t.title, + t2 as test + from test2 t + JOIN test t2 ON t.test_id = t2.id + ) j; + """ + ) + assertTrue(objs !== null) + assertTrue(objs is List) + assertTrue(objs!!.size == 2) + assertTrue(objs[0].id == 1) + assertTrue(objs[0].test!!.id == 1) + } } -class ObjTest(var name: String): IdEntity() \ No newline at end of file +class ObjTest(var name: String): IdEntity() +class ObjTest2(var title: String, var test: ObjTest?): IdEntity() \ No newline at end of file diff --git a/src/test/kotlin/fr/postgresjson/serializer/SerializerTest.kt b/src/test/kotlin/fr/postgresjson/serializer/SerializerTest.kt index 34742e8..f97d3dd 100644 --- a/src/test/kotlin/fr/postgresjson/serializer/SerializerTest.kt +++ b/src/test/kotlin/fr/postgresjson/serializer/SerializerTest.kt @@ -1,6 +1,6 @@ package fr.postgresjson.serializer -import fr.postgresjson.entity.UuidEntity +import fr.postgresjson.entity.IdEntity import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Assertions.assertTrue import org.junit.jupiter.api.BeforeEach @@ -9,17 +9,18 @@ import org.junit.jupiter.api.TestInstance @TestInstance(TestInstance.Lifecycle.PER_CLASS) internal class SerializerTest { - class ObjTest(var val1: String, var val2: Int) : UuidEntity() + class ObjTest(var val1: String, var val2: Int) : IdEntity(1) private val serializer = Serializer() - private val objSerialized: String = """{"val1":"plop","val2":123,"id":"1362a162-df75-4995-ab46-4ad55fa07de2"}""" + private val objSerialized: String = """{"val1":"plop","val2":123,"id":2}""" private val objSerializedUpdate = """{"val1":"update","val2":123}""" private lateinit var obj: ObjTest @BeforeEach fun before() { obj = ObjTest("plop", 123) + obj.id = 2 } @Test @@ -36,7 +37,7 @@ internal class SerializerTest { @Test fun deserialize() { - val objDeserialized: ObjTest = serializer.deserialize(objSerialized) + val objDeserialized = serializer.deserialize(objSerialized) assertEquals(obj.val1, objDeserialized.val1) assertEquals(obj.val2, objDeserialized.val2) } diff --git a/src/test/resources/fixtures/init.sql b/src/test/resources/fixtures/init.sql new file mode 100644 index 0000000..8a0da48 --- /dev/null +++ b/src/test/resources/fixtures/init.sql @@ -0,0 +1,20 @@ +create table if not exists test +( + id serial not null + constraint test_pk + primary key, + name text +); + +create table if not exists test2 +( + id serial not null, + title text, + test_id integer + constraint test2_test_id_fk + references test +); +INSERT INTO public.test (id, name) VALUES (1, 'plop'); +INSERT INTO public.test2 (id, title, test_id) VALUES (1, 'plop', 1); +INSERT INTO public.test2 (id, title, test_id) VALUES (2, 'plip', 1); +INSERT INTO public.test2 (id, title, test_id) VALUES (3, 'ttt', null); \ No newline at end of file