Skip to content

Commit e387ec7

Browse files
author
Hyunsik Kang
authored
Improve create object performance for QueryDslImpl & ReactiveQueryDslImpl (#50)
* Improve create object performance for QueryDslImpl & ReactiveQueryDslImpl
1 parent 49fd084 commit e387ec7

File tree

3 files changed

+91
-61
lines changed

3 files changed

+91
-61
lines changed

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ plugins {
1313

1414
allprojects {
1515
group = "com.linecorp.kotlin-jdsl"
16-
version = "2.0.0.RELEASE"
16+
version = "2.0.1.RELEASE"
1717

1818
repositories {
1919
mavenCentral()

core/src/main/kotlin/com/linecorp/kotlinjdsl/querydsl/QueryDslImpl.kt

Lines changed: 45 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -45,23 +45,33 @@ import javax.persistence.criteria.JoinType
4545
*
4646
* Don't use this directly because it's an <string>INTERNAL</strong> class.
4747
* It does not support backward compatibility.
48+
* This class should be used with the understanding that it is not thread safe and therefore not suitable for parallel processing.
4849
*/
4950
open class QueryDslImpl<T>(
5051
private val returnType: Class<T>,
5152
) : CriteriaQueryDsl<T>, SubqueryDsl<T>, CriteriaUpdateQueryDsl, CriteriaDeleteQueryDsl {
5253
private var singleSelectClause: SingleSelectClause<T>? = null
5354
private var multiSelectClause: MultiSelectClause<T>? = null
5455
private var fromClause: FromClause<*>? = null
55-
private var joins: MutableList<JoinSpec<*>> = mutableListOf()
56-
private var wheres: MutableList<PredicateSpec> = mutableListOf()
57-
private var groupBys: MutableList<ExpressionSpec<*>> = mutableListOf()
58-
private var havings: MutableList<PredicateSpec> = mutableListOf()
59-
private var orderBys: MutableList<OrderSpec> = mutableListOf()
56+
private var joins: MutableList<JoinSpec<*>>? = null
57+
private var wheres: MutableList<PredicateSpec>? = null
58+
private var groupBys: MutableList<ExpressionSpec<*>>? = null
59+
private var havings: MutableList<PredicateSpec>? = null
60+
private var orderBys: MutableList<OrderSpec>? = null
6061
private var offset: Int? = null
6162
private var maxResults: Int? = null
62-
private var sqlHints: MutableList<String> = mutableListOf()
63-
private var jpaHints: MutableMap<String, Any> = mutableMapOf()
64-
private var params: MutableMap<ColumnSpec<*>, Any?> = mutableMapOf()
63+
private var sqlHints: MutableList<String>? = null
64+
private var jpaHints: MutableMap<String, Any>? = null
65+
private var params: MutableMap<ColumnSpec<*>, Any?>? = null
66+
67+
private fun lazyJoins() = (joins ?: mutableListOf<JoinSpec<*>>().apply { joins = this })
68+
private fun lazyWheres() = (wheres ?: mutableListOf<PredicateSpec>().apply { wheres = this })
69+
private fun lazyGroupBys() = (groupBys ?: mutableListOf<ExpressionSpec<*>>().apply { groupBys = this })
70+
private fun lazyHavings() = (havings ?: mutableListOf<PredicateSpec>().apply { havings = this })
71+
private fun lazyOrderBys() = (orderBys ?: mutableListOf<OrderSpec>().apply { orderBys = this })
72+
private fun lazySqlHints() = (sqlHints ?: mutableListOf<String>().apply { sqlHints = this })
73+
private fun lazyJpaHints() = (jpaHints ?: mutableMapOf<String, Any>().apply { jpaHints = this })
74+
private fun lazyParams() = (params ?: mutableMapOf<ColumnSpec<*>, Any?>().apply { params = this })
6575

6676
override fun select(distinct: Boolean, expression: ExpressionSpec<T>): SingleSelectClause<T> {
6777
return SingleSelectClause(
@@ -84,12 +94,12 @@ open class QueryDslImpl<T>(
8494
}
8595

8696
override fun <T, R> join(left: EntitySpec<T>, right: EntitySpec<R>, relation: Relation<T, R?>, joinType: JoinType) {
87-
joins.add(SimpleJoinSpec(left = left, right = right, path = relation.path, joinType = joinType))
97+
lazyJoins().add(SimpleJoinSpec(left = left, right = right, path = relation.path, joinType = joinType))
8898
}
8999

90100
override fun <T> join(entity: EntitySpec<T>, predicate: PredicateSpec) {
91-
joins.add(CrossJoinSpec(entity))
92-
wheres.add(predicate)
101+
lazyJoins().add(CrossJoinSpec(entity))
102+
lazyWheres().add(predicate)
93103
}
94104

95105
override fun <T, R> associate(
@@ -98,7 +108,7 @@ open class QueryDslImpl<T>(
98108
relation: Relation<T, R?>,
99109
joinType: JoinType
100110
) {
101-
joins.add(SimpleAssociatedJoinSpec(left = left, right = right, path = relation.path))
111+
lazyJoins().add(SimpleAssociatedJoinSpec(left = left, right = right, path = relation.path))
102112
}
103113

104114
override fun <T, R> fetch(
@@ -107,23 +117,23 @@ open class QueryDslImpl<T>(
107117
relation: Relation<T, R?>,
108118
joinType: JoinType
109119
) {
110-
joins.add(FetchJoinSpec(left = left, right = right, path = relation.path, joinType = joinType))
120+
lazyJoins().add(FetchJoinSpec(left = left, right = right, path = relation.path, joinType = joinType))
111121
}
112122

113123
override fun where(predicate: PredicateSpec) {
114-
wheres.add(predicate)
124+
lazyWheres().add(predicate)
115125
}
116126

117127
override fun groupBy(columns: List<ExpressionSpec<*>>) {
118-
groupBys.addAll(columns)
128+
lazyGroupBys().addAll(columns)
119129
}
120130

121131
override fun having(predicate: PredicateSpec) {
122-
havings.add(predicate)
132+
lazyHavings().add(predicate)
123133
}
124134

125135
override fun orderBy(orders: List<OrderSpec>) {
126-
orderBys.addAll(orders)
136+
lazyOrderBys().addAll(orders)
127137
}
128138

129139
override fun offset(offset: Int) {
@@ -135,19 +145,19 @@ open class QueryDslImpl<T>(
135145
}
136146

137147
override fun sqlHints(hints: List<String>) {
138-
sqlHints.addAll(hints)
148+
lazySqlHints().addAll(hints)
139149
}
140150

141151
override fun hints(hints: Map<String, Any>) {
142-
jpaHints.putAll(hints)
152+
lazyJpaHints().putAll(hints)
143153
}
144154

145155
override fun setParams(params: Map<ColumnSpec<*>, Any?>) {
146-
this.params.putAll(params)
156+
lazyParams().putAll(params)
147157
}
148158

149159
override fun set(column: ColumnSpec<*>, value: Any?) {
150-
params[column] = value
160+
lazyParams()[column] = value
151161
}
152162

153163
fun createCriteriaQuerySpec(): CriteriaQuerySpec<T, TypedQuery<T>> {
@@ -174,10 +184,13 @@ open class QueryDslImpl<T>(
174184
where = getWhereClause(),
175185
sqlHint = getSqlQueryHintClause(),
176186
jpaHint = getJpaQueryHintClause(),
177-
set = SetClause(params)
187+
set = getSetClause()
178188
)
179189
}
180190

191+
@Suppress("MemberVisibilityCanBePrivate")
192+
protected fun getSetClause() = SetClause(params.orEmpty())
193+
181194
@Suppress("UNCHECKED_CAST")
182195
fun createCriteriaDeleteQuerySpec(): CriteriaDeleteQuerySpec<T, Query> {
183196
return CriteriaDeleteQuerySpecImpl(
@@ -224,30 +237,32 @@ open class QueryDslImpl<T>(
224237

225238
@Suppress("MemberVisibilityCanBePrivate")
226239
protected fun getJoinClause(): JoinClause {
227-
return JoinClause(joins)
240+
return JoinClause(joins.orEmpty())
228241
}
229242

230243
@Suppress("MemberVisibilityCanBePrivate")
231244
protected fun getJoinClauseDoesNotHaveFetch(): JoinClause {
232-
mustBe(joins.filterIsInstance<FetchJoinSpec<*, *>>().isEmpty()) { "This query does not support fetch" }
245+
mustBe(joins.orEmpty().filterIsInstance<FetchJoinSpec<*, *>>().isEmpty()) { "This query does not support fetch" }
233246

234247
return getJoinClause()
235248
}
236249

250+
@Suppress("MemberVisibilityCanBePrivate")
237251
protected fun getSimpleAssociatedJoinClauseOnly(): SimpleAssociatedJoinClause {
252+
val joins = joins.orEmpty()
238253
return joins.filterIsInstance<SimpleAssociatedJoinSpec<*, *>>().let {
239254
mustBe(it.size == joins.size) { "This query only support associate" }
240255
SimpleAssociatedJoinClause(it)
241256
}
242257
}
243258

244259
protected fun getWhereClause(): WhereClause {
245-
return WhereClause(wheres.merge())
260+
return WhereClause(wheres.orEmpty().merge())
246261
}
247262

248263
@Suppress("MemberVisibilityCanBePrivate")
249264
protected fun getGroupByClause(): GroupByClause {
250-
return GroupByClause(groupBys)
265+
return GroupByClause(groupBys.orEmpty())
251266
}
252267

253268
protected fun getEmptyGroupByClause(): GroupByClause {
@@ -256,7 +271,7 @@ open class QueryDslImpl<T>(
256271

257272
@Suppress("MemberVisibilityCanBePrivate")
258273
protected fun getHavingClause(): HavingClause {
259-
return HavingClause(havings.merge())
274+
return HavingClause(havings.orEmpty().merge())
260275
}
261276

262277
protected fun getEmptyHavingClause(): HavingClause {
@@ -265,7 +280,7 @@ open class QueryDslImpl<T>(
265280

266281
@Suppress("MemberVisibilityCanBePrivate")
267282
protected fun getOrderByClause(): CriteriaQueryOrderByClause {
268-
return OrderByClause(orderBys)
283+
return OrderByClause(orderBys.orEmpty())
269284
}
270285

271286
protected fun getEmptyOrderByClause(): CriteriaQueryOrderByClause {
@@ -282,12 +297,12 @@ open class QueryDslImpl<T>(
282297
}
283298

284299
protected fun <Q : Query> getJpaQueryHintClause(): JpaQueryHintClause<Q> {
285-
return JpaQueryHintClauseImpl(jpaHints)
300+
return JpaQueryHintClauseImpl(jpaHints.orEmpty())
286301
}
287302

288303
@Suppress("UNCHECKED_CAST")
289304
protected fun <Q : Query> getSqlQueryHintClause(): SqlQueryHintClause<Q> {
290-
return SqlQueryHintClauseProvider.provide(sqlHints) as SqlQueryHintClause<Q>
305+
return SqlQueryHintClauseProvider.provide(sqlHints.orEmpty()) as SqlQueryHintClause<Q>
291306
}
292307

293308
@Suppress("MemberVisibilityCanBePrivate")

0 commit comments

Comments
 (0)