From 84d3228a365da48b52909f158e3dedd25075dca2 Mon Sep 17 00:00:00 2001 From: Pwootage Date: Mon, 25 Jun 2018 17:48:17 -0600 Subject: [PATCH 1/2] Allow overriding the fetch size for a Query This allows true lazy loading of a ResultSet --- .../kotlin/org/jetbrains/exposed/sql/Query.kt | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/org/jetbrains/exposed/sql/Query.kt b/src/main/kotlin/org/jetbrains/exposed/sql/Query.kt index 6ebbe1f110..6c24fe3d84 100644 --- a/src/main/kotlin/org/jetbrains/exposed/sql/Query.kt +++ b/src/main/kotlin/org/jetbrains/exposed/sql/Query.kt @@ -93,6 +93,8 @@ open class Query(set: FieldSet, where: Op?): SizedIterable, private set var offset: Int = 0 private set + var fetchSize: Int? = null + private set /** * Changes [set.fields] field of a Query, [set.source] will be preserved @@ -121,7 +123,13 @@ open class Query(set: FieldSet, where: Op?): SizedIterable, fun hasCustomForUpdateState() = forUpdate != null fun isForUpdate() = (forUpdate ?: false) && currentDialect.supportsSelectForUpdate() - override fun PreparedStatement.executeInternal(transaction: Transaction): ResultSet? = executeQuery() + override fun PreparedStatement.executeInternal(transaction: Transaction): ResultSet? { + val fetchSize = this@Query.fetchSize + if (fetchSize != null) { + this.fetchSize = fetchSize + } + return executeQuery() + } override fun arguments() = QueryBuilder(true).let { prepareSQL(it) @@ -232,6 +240,11 @@ open class Query(set: FieldSet, where: Op?): SizedIterable, return this } + fun fetchSize(n: Int): Query { + this.fetchSize = n + return this + } + private inner class ResultIterator(val rs: ResultSet): Iterator { private var hasNext: Boolean? = null private val fieldsIndex = HashMap, Int>() From 3a88718c5158a9fce4f13bbf8e18e689d4410ad5 Mon Sep 17 00:00:00 2001 From: Pwootage Date: Thu, 28 Jun 2018 14:19:19 -0600 Subject: [PATCH 2/2] Allow setting default fetch size in Database --- src/main/kotlin/org/jetbrains/exposed/sql/Database.kt | 8 ++++++++ src/main/kotlin/org/jetbrains/exposed/sql/Query.kt | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/org/jetbrains/exposed/sql/Database.kt b/src/main/kotlin/org/jetbrains/exposed/sql/Database.kt index 4445e660d3..6187d2ae62 100644 --- a/src/main/kotlin/org/jetbrains/exposed/sql/Database.kt +++ b/src/main/kotlin/org/jetbrains/exposed/sql/Database.kt @@ -57,6 +57,14 @@ class Database private constructor(val connector: () -> Connection) { } } + var defaultFetchSize: Int? = null + private set + + fun defaultFetchSize(size: Int): Database { + defaultFetchSize = size + return this + } + private fun String.isIdentifier() = !isEmpty() && first().isIdentifierStart() && all { it.isIdentifierStart() || it in '0'..'9' } private fun Char.isIdentifierStart(): Boolean = this in 'a'..'z' || this in 'A'..'Z' || this == '_' || this in extraNameCharacters diff --git a/src/main/kotlin/org/jetbrains/exposed/sql/Query.kt b/src/main/kotlin/org/jetbrains/exposed/sql/Query.kt index 6c24fe3d84..72a1fd884b 100644 --- a/src/main/kotlin/org/jetbrains/exposed/sql/Query.kt +++ b/src/main/kotlin/org/jetbrains/exposed/sql/Query.kt @@ -124,7 +124,7 @@ open class Query(set: FieldSet, where: Op?): SizedIterable, fun isForUpdate() = (forUpdate ?: false) && currentDialect.supportsSelectForUpdate() override fun PreparedStatement.executeInternal(transaction: Transaction): ResultSet? { - val fetchSize = this@Query.fetchSize + val fetchSize = this@Query.fetchSize ?: transaction.db.defaultFetchSize if (fetchSize != null) { this.fetchSize = fetchSize }