Skip to content

Instantly share code, notes, and snippets.

@rlawlstjd0077
Created January 8, 2023 09:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rlawlstjd0077/097d3d349a6343b09091020f18f39cb3 to your computer and use it in GitHub Desktop.
Save rlawlstjd0077/097d3d349a6343b09091020f18f39cb3 to your computer and use it in GitHub Desktop.
class PrestoTemplate(private val jdbcTemplate: JdbcTemplate) {
fun queryForList(sql: String, properties: Map<String, String>): List<Map<String, Any>> {
val creator = generatePreparedStatementCreator()
return jdbcTemplate.query(creator, ColumnMapRowMapper())
}
private fun generatePreparedStatementCreator(sql: String, properties: Map<String, String>): PrestoDelegatePreparedStatementCreator {
return PrestoDelegatePreparedStatementCreator(sql = sql) { con ->
properties.forEach { con.setClientInfo(it.key, it.value) }
con.timeZoneId = ZoneOffset.UTC.id
}
}
}
fun interface PrestoConnectionDecorator {
fun decorate(connection: PrestoConnection)
}
class PrestoDelegatePreparedStatementCreator(
private val sql: String,
private val decorator: PrestoConnectionDecorator
) : PreparedStatementCreator {
override fun createPreparedStatement(con: Connection): PreparedStatement {
val statement = con.unwrap(PrestoConnection::class.java).apply(decorator::decorate).createStatement()
return DelegatePreparedStatement(sql, statement)
}
}
class DelegatePreparedStatement(
private val sql: String,
private val delegate: Statement
) : PreparedStatement, Statement by delegate {
override fun executeQuery(): ResultSet = delegate.executeQuery(sql)
override fun executeUpdate(): Int = delegate.executeUpdate(sql)
override fun execute(): Boolean = delegate.execute(sql)
override fun addBatch() = delegate.addBatch(sql)
private fun notSupported(): Nothing = throw SQLFeatureNotSupportedException()
override fun setNull(parameterIndex: Int, sqlType: Int) = notSupported()
override fun setNull(parameterIndex: Int, sqlType: Int, typeName: String?) = notSupported()
override fun setBoolean(parameterIndex: Int, x: Boolean) = notSupported()
override fun setByte(parameterIndex: Int, x: Byte) = notSupported()
override fun setShort(parameterIndex: Int, x: Short) = notSupported()
override fun setInt(parameterIndex: Int, x: Int) = notSupported()
override fun setLong(parameterIndex: Int, x: Long) = notSupported()
override fun setFloat(parameterIndex: Int, x: Float) = notSupported()
override fun setDouble(parameterIndex: Int, x: Double) = notSupported()
override fun setBigDecimal(parameterIndex: Int, x: BigDecimal?) = notSupported()
override fun setString(parameterIndex: Int, x: String?) = notSupported()
override fun setBytes(parameterIndex: Int, x: ByteArray?) = notSupported()
override fun setDate(parameterIndex: Int, x: Date?) = notSupported()
override fun setDate(parameterIndex: Int, x: Date?, cal: Calendar?) = notSupported()
override fun setTime(parameterIndex: Int, x: Time?) = notSupported()
override fun setTime(parameterIndex: Int, x: Time?, cl: Calendar?) = notSupported()
override fun setTimestamp(parameterIndex: Int, x: Timestamp?) = notSupported()
override fun setTimestamp(parameterIndex: Int, x: Timestamp?, cal: Calendar?) = notSupported()
override fun setAsciiStream(parameterIndex: Int, x: InputStream?, length: Int) = notSupported()
override fun setAsciiStream(parameterIndex: Int, x: InputStream?, length: Long) = notSupported()
override fun setAsciiStream(parameterIndex: Int, x: InputStream?) = notSupported()
@Deprecated("Deprecated in Java")
override fun setUnicodeStream(parameterIndex: Int, x: InputStream?, length: Int) = notSupported()
override fun setBinaryStream(parameterIndex: Int, x: InputStream?, length: Int) = notSupported()
override fun setBinaryStream(parameterIndex: Int, x: InputStream?, length: Long) = notSupported()
override fun setBinaryStream(parameterIndex: Int, x: InputStream?) = notSupported()
override fun clearParameters() = notSupported()
override fun setObject(parameterIndex: Int, x: Any?, targetSqlType: Int) = notSupported()
override fun setObject(parameterIndex: Int, x: Any?) = notSupported()
override fun setObject(parameterIndex: Int, x: Any?, targetSqlType: Int, scaleOrLength: Int) = notSupported()
override fun setCharacterStream(parameterIndex: Int, reader: Reader?, length: Int) = notSupported()
override fun setCharacterStream(parameterIndex: Int, reader: Reader?, length: Long) = notSupported()
override fun setCharacterStream(parameterIndex: Int, reader: Reader?) = notSupported()
override fun setRef(parameterIndex: Int, x: Ref?) = notSupported()
override fun setBlob(parameterIndex: Int, x: Blob?) = notSupported()
override fun setBlob(parameterIndex: Int, inputStream: InputStream?, length: Long) = notSupported()
override fun setBlob(parameterIndex: Int, inputStream: InputStream?) = notSupported()
override fun setClob(parameterIndex: Int, x: Clob?) = notSupported()
override fun setClob(parameterIndex: Int, reader: Reader?, length: Long) = notSupported()
override fun setClob(parameterIndex: Int, reader: Reader?) = notSupported()
override fun setArray(parameterIndex: Int, x: Array?) = notSupported()
override fun getMetaData(): ResultSetMetaData = notSupported()
override fun setURL(parameterIndex: Int, x: URL?) = notSupported()
override fun getParameterMetaData(): ParameterMetaData = notSupported()
override fun setRowId(parameterIndex: Int, x: RowId?) = notSupported()
override fun setNString(parameterIndex: Int, value: String?) = notSupported()
override fun setNCharacterStream(parameterIndex: Int, value: Reader?, length: Long) = notSupported()
override fun setNCharacterStream(parameterIndex: Int, value: Reader?) = notSupported()
override fun setNClob(parameterIndex: Int, value: NClob?) = notSupported()
override fun setNClob(parameterIndex: Int, reader: Reader?, length: Long) = notSupported()
override fun setNClob(parameterIndex: Int, reader: Reader?) = notSupported()
override fun setSQLXML(parameterIndex: Int, xmlObject: SQLXML?) = notSupported()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment