Skip to content

Commit

Permalink
Add postgres json operator support and move postgres specific feature…
Browse files Browse the repository at this point in the history
…s into postgres module (#7)
  • Loading branch information
MineKing9534 authored Oct 22, 2024
1 parent 026c925 commit 0b47ecf
Show file tree
Hide file tree
Showing 49 changed files with 84 additions and 63 deletions.
2 changes: 0 additions & 2 deletions core/src/main/kotlin/de/mineking/database/Conditions.kt
Original file line number Diff line number Diff line change
Expand Up @@ -81,8 +81,6 @@ infix fun Node.isEqualTo(other: Node) = Where(this + " = " + other)
infix fun Node.isNotEqualTo(other: Node) = Where(this + " != " + other)

infix fun Node.isLike(other: String) = Where(this + " like '" + other + "'")
infix fun Node.matches(other: String) = Where(this + " ~ '" + other + "'")
infix fun Node.contains(other: Node) = Where(other + " = any(" + this + ")")

fun Node.isIn(nodes: Array<Node>) = Where(this + " in (" + nodes.join() + ")")
fun Node.isIn(nodes: Collection<Node>) = isIn(nodes.toTypedArray())
Expand Down
10 changes: 5 additions & 5 deletions core/src/main/kotlin/de/mineking/database/Nodes.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package de.mineking.database

import org.jdbi.v3.core.argument.Argument
import javax.swing.text.html.StyleSheet.BoxPainter
import kotlin.reflect.KType
import kotlin.reflect.full.isSubtypeOf
import kotlin.reflect.jvm.jvmErasure
Expand All @@ -26,7 +27,6 @@ fun length(node: Node) = "len"(node)
fun lowerCase(node: Node) = "lower"(node)
fun upperCase(node: Node) = "upper"(node)

fun arrayLength(node: Node) = "array_length"(node)
fun abs(node: Node) = "abs"(node)

operator fun Node.get(index: Node) = this + "[" + index + "]"
Expand All @@ -38,23 +38,23 @@ fun property(name: String): PropertyNode = object : PropertyNode {
override fun columnContext(table: TableStructure<*>): ColumnInfo = parseColumnSpecification(name, table)
}

fun <T> value(value: T, type: KType): ValueNode = object : ValueNode {
fun <T> value(value: T, type: KType, static: Boolean = false): ValueNode = object : ValueNode {
override fun format(table: TableStructure<*>): String = ":${ hashCode() }"

override fun values(table: TableStructure<*>, column: ColumnData<*, *>?): Map<String, Argument> {
@Suppress("UNCHECKED_CAST")
val manager = column?.takeIf { it.type.isSubtypeOf(type) }?.mapper as TypeMapper<T, *>? ?: table.manager.getTypeMapper<T, Any>(type, column?.getRootColumn()?.property) ?: throw IllegalArgumentException("Cannot find suitable TypeMapper for $type")
val manager = column?.takeIf { !static && it.type.isSubtypeOf(type) }?.mapper as TypeMapper<T, *>? ?: table.manager.getTypeMapper<T, Any>(type, column?.getRootColumn()?.property?.takeIf { !static }) ?: throw IllegalArgumentException("Cannot find suitable TypeMapper for $type")
return mapOf(hashCode().toString() to manager.write(column, table, type, value))
}
}

inline fun <reified T> value(value: T, static: Boolean = false) = value(value, typeOf<T>(), static)

fun nullValue() = object : ValueNode {
override fun format(table: TableStructure<*>): String = "null"
override fun values(table: TableStructure<*>, column: ColumnData<*, *>?): Map<String, Argument> = emptyMap()
}

inline fun <reified T> value(value: T) = value(value, typeOf<T>())

fun unsafeNode(string: String, values: Map<String, Argument> = emptyMap()) = object : Node {
override fun format(table: TableStructure<*>): String = string
override fun values(table: TableStructure<*>, column: ColumnData<*, *>?): Map<String, Argument> = values
Expand Down
4 changes: 2 additions & 2 deletions discord/src/test/kotlin/tests/discord/Discord.kt
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package tests.discord

import de.mineking.database.*
import de.mineking.database.vendors.PostgresConnection
import de.mineking.database.vendors.PostgresMappers
import de.mineking.database.vendors.postgres.PostgresConnection
import de.mineking.database.vendors.postgres.PostgresMappers
import net.dv8tion.jda.api.entities.*
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel
import net.dv8tion.jda.api.entities.emoji.CustomEmoji
Expand Down
4 changes: 2 additions & 2 deletions discord/src/test/kotlin/tests/discord/Snowflake.kt
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package tests.discord

import de.mineking.database.*
import de.mineking.database.vendors.PostgresConnection
import de.mineking.database.vendors.PostgresMappers
import de.mineking.database.vendors.postgres.PostgresConnection
import de.mineking.database.vendors.postgres.PostgresMappers
import net.dv8tion.jda.api.entities.Guild
import net.dv8tion.jda.api.entities.ISnowflake
import org.junit.jupiter.api.Assertions.assertEquals
Expand Down
4 changes: 2 additions & 2 deletions minecraft/src/test/kotlin/tests/minecraft/Location.kt
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package tests.minecraft

import de.mineking.database.*
import de.mineking.database.vendors.PostgresConnection
import de.mineking.database.vendors.PostgresMappers
import de.mineking.database.vendors.postgres.PostgresConnection
import de.mineking.database.vendors.postgres.PostgresMappers
import org.bukkit.Location
import org.bukkit.World
import org.junit.jupiter.api.Assertions.assertEquals
Expand Down
4 changes: 2 additions & 2 deletions minecraft/src/test/kotlin/tests/minecraft/Player.kt
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package tests.minecraft

import de.mineking.database.*
import de.mineking.database.vendors.PostgresConnection
import de.mineking.database.vendors.PostgresMappers
import de.mineking.database.vendors.postgres.PostgresConnection
import de.mineking.database.vendors.postgres.PostgresMappers
import org.bukkit.OfflinePlayer
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package de.mineking.database.vendors.postgres

import de.mineking.database.*
import kotlin.reflect.typeOf

fun arrayLength(node: Node) = "array_length"(node)

infix fun Node.matches(other: String) = Where(this + " ~ '" + other + "'")
infix fun Node.contains(other: Node) = Where(other + " = any(" + this + ")")

fun Node.json(vararg path: String) = this + " #>> " + value(path, typeOf<Array<String>>(), static = true)
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package de.mineking.database.vendors
package de.mineking.database.vendors.postgres

import de.mineking.database.DatabaseConnection
import de.mineking.database.NamingStrategy
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package de.mineking.database.vendors
package de.mineking.database.vendors.postgres

import de.mineking.database.*
import de.mineking.database.vendors.PostgresConnection.Companion.logger
import de.mineking.database.vendors.postgres.PostgresConnection.Companion.logger
import org.jdbi.v3.core.kotlin.useHandleUnchecked
import org.jdbi.v3.core.result.ResultIterable
import org.jdbi.v3.core.statement.UnableToExecuteStatementException
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package de.mineking.database.vendors
package de.mineking.database.vendors.postgres

import com.google.gson.GsonBuilder
import com.google.gson.ToNumberStrategy
Expand Down Expand Up @@ -40,7 +40,8 @@ object PostgresMappers {
val STRING = typeMapper<String?>(PostgresType.TEXT, ResultSet::getString)
val ENUM = object : TypeMapper<Enum<*>?, String?> {
override fun accepts(manager: DatabaseConnection, property: KProperty<*>?, type: KType): Boolean = type.jvmErasure.java.isEnum
override fun getType(column: ColumnData<*, *>?, table: TableStructure<*>, type: KType): DataType = PostgresType.TEXT
override fun getType(column: ColumnData<*, *>?, table: TableStructure<*>, type: KType): DataType =
PostgresType.TEXT

override fun format(column: ColumnData<*, *>?, table: TableStructure<*>, type: KType, value: Enum<*>?): String? = value?.name

Expand Down
2 changes: 1 addition & 1 deletion postgres/src/test/kotlin/tests/postgres/general/Delete.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package tests.postgres.general
import de.mineking.database.isBetween
import de.mineking.database.property
import de.mineking.database.value
import de.mineking.database.vendors.PostgresConnection
import de.mineking.database.vendors.postgres.PostgresConnection
import org.junit.jupiter.api.Test
import setup.ConsoleSqlLogger
import setup.UserDao
Expand Down
2 changes: 1 addition & 1 deletion postgres/src/test/kotlin/tests/postgres/general/Insert.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package tests.postgres.general

import de.mineking.database.vendors.PostgresConnection
import de.mineking.database.vendors.postgres.PostgresConnection
import org.junit.jupiter.api.Test
import setup.ConsoleSqlLogger
import setup.UserDao
Expand Down
2 changes: 1 addition & 1 deletion postgres/src/test/kotlin/tests/postgres/general/Select.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package tests.postgres.general

import de.mineking.database.*
import de.mineking.database.vendors.PostgresConnection
import de.mineking.database.vendors.postgres.PostgresConnection
import org.junit.jupiter.api.Test
import setup.ConsoleSqlLogger
import setup.UserDao
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package tests.postgres.general

import de.mineking.database.vendors.PostgresConnection
import de.mineking.database.vendors.postgres.PostgresConnection
import org.junit.jupiter.api.Test
import setup.ConsoleSqlLogger
import setup.UserDao
Expand Down
2 changes: 1 addition & 1 deletion postgres/src/test/kotlin/tests/postgres/general/Update.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import de.mineking.database.isEqualTo
import de.mineking.database.property
import de.mineking.database.select
import de.mineking.database.value
import de.mineking.database.vendors.PostgresConnection
import de.mineking.database.vendors.postgres.PostgresConnection
import org.junit.jupiter.api.Test
import setup.ConsoleSqlLogger
import setup.UserDao
Expand Down
2 changes: 1 addition & 1 deletion postgres/src/test/kotlin/tests/postgres/general/Upsert.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package tests.postgres.general

import de.mineking.database.*
import de.mineking.database.vendors.PostgresConnection
import de.mineking.database.vendors.postgres.PostgresConnection
import org.junit.jupiter.api.Test
import setup.ConsoleSqlLogger
import setup.recreate
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import de.mineking.database.AutoIncrement
import de.mineking.database.Column
import de.mineking.database.Key
import de.mineking.database.Reference
import de.mineking.database.vendors.PostgresConnection
import de.mineking.database.vendors.postgres.PostgresConnection
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import setup.ConsoleSqlLogger
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package tests.postgres.reference

import de.mineking.database.*
import de.mineking.database.vendors.PostgresConnection
import de.mineking.database.vendors.postgres.PostgresConnection
import org.junit.jupiter.api.Test
import setup.ConsoleSqlLogger
import setup.recreate
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
package tests.postgres.reference

import de.mineking.database.*
import de.mineking.database.vendors.PostgresConnection
import de.mineking.database.vendors.postgres.PostgresConnection
import de.mineking.database.vendors.postgres.contains
import org.junit.jupiter.api.Test
import setup.ConsoleSqlLogger
import setup.recreate
Expand Down
3 changes: 2 additions & 1 deletion postgres/src/test/kotlin/tests/postgres/specific/Array.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
package tests.postgres.specific

import de.mineking.database.*
import de.mineking.database.vendors.PostgresConnection
import de.mineking.database.vendors.postgres.PostgresConnection
import de.mineking.database.vendors.postgres.contains
import org.junit.jupiter.api.Assertions.assertArrayEquals
import org.junit.jupiter.api.Test
import setup.ConsoleSqlLogger
Expand Down
2 changes: 1 addition & 1 deletion postgres/src/test/kotlin/tests/postgres/specific/Date.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package tests.postgres.specific

import de.mineking.database.*
import de.mineking.database.vendors.PostgresConnection
import de.mineking.database.vendors.postgres.PostgresConnection
import org.junit.jupiter.api.Test
import setup.ConsoleSqlLogger
import setup.recreate
Expand Down
2 changes: 1 addition & 1 deletion postgres/src/test/kotlin/tests/postgres/specific/Enum.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package tests.postgres.specific

import de.mineking.database.*
import de.mineking.database.vendors.PostgresConnection
import de.mineking.database.vendors.postgres.PostgresConnection
import org.junit.jupiter.api.Test
import setup.ConsoleSqlLogger
import setup.recreate
Expand Down
8 changes: 7 additions & 1 deletion postgres/src/test/kotlin/tests/postgres/specific/Json.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
package tests.postgres.specific

import de.mineking.database.*
import de.mineking.database.vendors.PostgresConnection
import de.mineking.database.vendors.postgres.PostgresConnection
import de.mineking.database.vendors.postgres.json
import org.junit.jupiter.api.Test
import setup.ConsoleSqlLogger
import setup.recreate
Expand Down Expand Up @@ -37,4 +38,9 @@ class JsonTest {
fun selectSingle() {
assertEquals(linkedMapOf("a" to "b", "b" to "a"), table.select<LinkedHashMap<String, String>>(property("map1")).first())
}

@Test
fun selectChild() {
assertEquals("b", table.select<String>(property("map1").json("a")).first())
}
}
2 changes: 1 addition & 1 deletion postgres/src/test/kotlin/tests/postgres/specific/Null.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package tests.postgres.specific

import de.mineking.database.*
import de.mineking.database.vendors.PostgresConnection
import de.mineking.database.vendors.postgres.PostgresConnection
import org.junit.jupiter.api.Test
import setup.ConsoleSqlLogger
import setup.recreate
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package tests.postgres.specific
import de.mineking.database.AutoIncrement
import de.mineking.database.Column
import de.mineking.database.Key
import de.mineking.database.vendors.PostgresConnection
import de.mineking.database.vendors.postgres.PostgresConnection
import org.junit.jupiter.api.Test
import setup.ConsoleSqlLogger
import setup.recreate
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import de.mineking.database.Table
import de.mineking.database.isEqualTo
import de.mineking.database.property
import de.mineking.database.value
import de.mineking.database.vendors.PostgresConnection
import de.mineking.database.vendors.postgres.PostgresConnection
import setup.ConsoleSqlLogger
import setup.UserDao
import setup.recreate
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package tests.postgres.table

import de.mineking.database.*
import de.mineking.database.vendors.PostgresConnection
import de.mineking.database.vendors.postgres.PostgresConnection
import setup.ConsoleSqlLogger
import setup.recreate
import kotlin.test.Test
Expand Down
2 changes: 1 addition & 1 deletion postgres/src/test/kotlin/tests/postgres/table/Unique.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import de.mineking.database.AutoIncrement
import de.mineking.database.Column
import de.mineking.database.Key
import de.mineking.database.Unique
import de.mineking.database.vendors.PostgresConnection
import de.mineking.database.vendors.postgres.PostgresConnection
import org.junit.jupiter.api.Test
import setup.ConsoleSqlLogger
import setup.recreate
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package de.mineking.database.vendors
package de.mineking.database.vendors.sqlite

import de.mineking.database.*
import mu.KotlinLogging
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package de.mineking.database.vendors
package de.mineking.database.vendors.sqlite

import de.mineking.database.*
import de.mineking.database.vendors.SQLiteConnection.Companion.logger
import de.mineking.database.vendors.sqlite.SQLiteConnection.Companion.logger
import org.jdbi.v3.core.kotlin.useHandleUnchecked
import org.jdbi.v3.core.result.ResultIterable
import org.jdbi.v3.core.statement.UnableToExecuteStatementException
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package de.mineking.database.vendors
package de.mineking.database.vendors.sqlite

import com.google.gson.GsonBuilder
import com.google.gson.ToNumberStrategy
Expand Down Expand Up @@ -36,7 +36,8 @@ object SQLiteMappers {
val ENUM = object : TypeMapper<Enum<*>?, String?> {
override fun accepts(manager: DatabaseConnection, property: KProperty<*>?, type: KType): Boolean = type.jvmErasure.java.isEnum

override fun getType(column: ColumnData<*, *>?, table: TableStructure<*>, type: KType): DataType = SQLiteType.TEXT
override fun getType(column: ColumnData<*, *>?, table: TableStructure<*>, type: KType): DataType =
SQLiteType.TEXT

override fun format(column: ColumnData<*, *>?, table: TableStructure<*>, type: KType, value: Enum<*>?): String? = value?.name

Expand All @@ -55,7 +56,8 @@ object SQLiteMappers {
.create()

override fun accepts(manager: DatabaseConnection, property: KProperty<*>?, type: KType): Boolean = property?.hasDatabaseAnnotation<Json>() == true
override fun getType(column: ColumnData<*, *>?, table: TableStructure<*>, type: KType): DataType = SQLiteType.TEXT
override fun getType(column: ColumnData<*, *>?, table: TableStructure<*>, type: KType): DataType =
SQLiteType.TEXT

override fun format(column: ColumnData<*, *>?, table: TableStructure<*>, type: KType, value: Any?): String? = value?.let { gson.toJson(value) }
override fun createArgument(column: ColumnData<*, *>?, table: TableStructure<*>, type: KType, value: String?): Argument = object : Argument {
Expand Down Expand Up @@ -85,7 +87,8 @@ object SQLiteMappers {
fun Collection<*>.createArray(component: KType) = (this as java.util.Collection<*>).toArray { java.lang.reflect.Array.newInstance(component.jvmErasure.java, it) as Array<*> }

override fun accepts(manager: DatabaseConnection, property: KProperty<*>?, type: KType): Boolean = type.isArray()
override fun getType(column: ColumnData<*, *>?, table: TableStructure<*>, type: KType): DataType = SQLiteType.BLOB
override fun getType(column: ColumnData<*, *>?, table: TableStructure<*>, type: KType): DataType =
SQLiteType.BLOB

override fun <O: Any> initialize(column: DirectColumnData<O, *>, type: KType) {
val component = type.component()
Expand Down
2 changes: 1 addition & 1 deletion sqlite/src/test/kotlin/tests/sqlite/general/Delete.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package tests.sqlite.general
import de.mineking.database.isBetween
import de.mineking.database.property
import de.mineking.database.value
import de.mineking.database.vendors.SQLiteConnection
import de.mineking.database.vendors.sqlite.SQLiteConnection
import org.junit.jupiter.api.Test
import setup.ConsoleSqlLogger
import setup.UserDao
Expand Down
2 changes: 1 addition & 1 deletion sqlite/src/test/kotlin/tests/sqlite/general/Insert.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package tests.sqlite.general

import de.mineking.database.vendors.SQLiteConnection
import de.mineking.database.vendors.sqlite.SQLiteConnection
import org.junit.jupiter.api.Test
import setup.ConsoleSqlLogger
import setup.UserDao
Expand Down
2 changes: 1 addition & 1 deletion sqlite/src/test/kotlin/tests/sqlite/general/Select.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package tests.sqlite.general

import de.mineking.database.*
import de.mineking.database.vendors.SQLiteConnection
import de.mineking.database.vendors.sqlite.SQLiteConnection
import org.junit.jupiter.api.Test
import setup.ConsoleSqlLogger
import setup.UserDao
Expand Down
Loading

0 comments on commit 0b47ecf

Please sign in to comment.