import org.jooq.* import org.jooq.impl.DSL import java.sql.SQLFeatureNotSupportedException import java.sql.Types @Suppress("UNCHECKED_CAST") class PGVectorBinding : Binding> { override fun converter(): Converter> { return object : Converter> { override fun from(databaseObject: Any?): List { return databaseObject?.let { v -> v.toString().removeSurrounding("[", "]").split(",").map { it.toDouble() } } ?: emptyList() } override fun to(userObject: List): Any { return userObject.toString() } override fun fromType(): Class = Any::class.java override fun toType(): Class> = List::class.java as Class> } } override fun sql(ctx: BindingSQLContext>) { ctx.render().visit(DSL.`val`(ctx.convert(converter()).value())).sql("::vector") } override fun register(ctx: BindingRegisterContext>) { ctx.statement().registerOutParameter(ctx.index(), Types.ARRAY) } override fun get(ctx: BindingGetResultSetContext>) { val resultSet = ctx.resultSet() val vectorAsString = resultSet.getString(ctx.index()) ctx.value(converter().from(vectorAsString)) } override fun set(ctx: BindingSetStatementContext>) { val value = ctx.value() ctx.statement().setString(ctx.index(), value?.let { converter().to(it) as String } ?: "[]") } override fun get(ctx: BindingGetStatementContext>) { val statement = ctx.statement() val vectorAsString = statement.getString(ctx.index()) ctx.value(converter().from(vectorAsString)) } // the below methods aren't needed in Postgres: override fun get(ctx: BindingGetSQLInputContext>?) { throw SQLFeatureNotSupportedException() } override fun set(ctx: BindingSetSQLOutputContext>?) { throw SQLFeatureNotSupportedException() } }