From 96d5627a4eebf1b53a8764bc610472c09d19c420 Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Tue, 19 Nov 2019 21:51:35 -0500 Subject: [PATCH 1/8] Fix for Kotlin This change removes the old extension methods in favor of builder classes. This is important because there was a possibility of incorrect code generating if the wrong imports were used. The old method had such highly overloaded methods names that the wrong method could have easily been specified which would cause unpredictable results. --- .../sql/util/kotlin/CountDSLExtensions.kt | 123 +++++++++++--- .../sql/util/kotlin/DeleteDSLExtensions.kt | 66 +++++--- .../kotlin/QueryExpressionDSLExtensions.kt | 150 +++++++++++++++--- .../sql/util/kotlin/UpdateDSLExtensions.kt | 68 +++++--- .../mybatis3/ProviderBuilderFunctions.kt | 49 ++++-- .../kotlin/spring/ProviderBuilderFunctions.kt | 46 ++++-- .../canonical/PersonMapperExtensions.kt | 11 +- .../mybatis3/canonical/PersonMapperTest.kt | 4 - 8 files changed, 388 insertions(+), 129 deletions(-) diff --git a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/CountDSLExtensions.kt b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/CountDSLExtensions.kt index 80769bfc2..884c262e2 100644 --- a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/CountDSLExtensions.kt +++ b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/CountDSLExtensions.kt @@ -16,36 +16,113 @@ package org.mybatis.dynamic.sql.util.kotlin import org.mybatis.dynamic.sql.BindableColumn +import org.mybatis.dynamic.sql.SqlTable import org.mybatis.dynamic.sql.VisitableCondition import org.mybatis.dynamic.sql.select.CountDSL import org.mybatis.dynamic.sql.select.SelectModel -import org.mybatis.dynamic.sql.util.Buildable -typealias CountCompleter = CountDSL.() -> Buildable +typealias CountCompleter = KotlinCountBuilder.() -> KotlinCountBuilder -fun CountDSL.where(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver) = - apply { - where().where(column, condition, collect) - } +class KotlinCountBuilder(val dsl: CountDSL) { + fun join(table: SqlTable, receiver: JoinReceiver) = + apply { + val collector = JoinCollector() + receiver(collector) + dsl.join(table, collector.onJoinCriterion, collector.andJoinCriteria) + } -fun CountDSL.and(column: BindableColumn, condition: VisitableCondition) = - apply { - where().and(column, condition) - } + fun join(table: SqlTable, alias: String, receiver: JoinReceiver) = + apply { + val collector = JoinCollector() + receiver(collector) + dsl.join(table, alias, collector.onJoinCriterion, collector.andJoinCriteria) + } -fun CountDSL.and(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver) = - apply { - where().and(column, condition, collect) - } + fun fullJoin(table: SqlTable, receiver: JoinReceiver) = + apply { + val collector = JoinCollector() + receiver(collector) + dsl.fullJoin(table, collector.onJoinCriterion, collector.andJoinCriteria) + } -fun CountDSL.or(column: BindableColumn, condition: VisitableCondition) = - apply { - where().or(column, condition) - } + fun fullJoin(table: SqlTable, alias: String, receiver: JoinReceiver) = + apply { + val collector = JoinCollector() + receiver(collector) + dsl.fullJoin(table, alias, collector.onJoinCriterion, collector.andJoinCriteria) + } -fun CountDSL.or(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver) = - apply { - where().or(column, condition, collect) - } + fun leftJoin(table: SqlTable, receiver: JoinReceiver) = + apply { + val collector = JoinCollector() + receiver(collector) + dsl.leftJoin(table, collector.onJoinCriterion, collector.andJoinCriteria) + } -fun CountDSL.allRows() = this as Buildable + fun leftJoin(table: SqlTable, alias: String, receiver: JoinReceiver) = + apply { + val collector = JoinCollector() + receiver(collector) + dsl.leftJoin(table, alias, collector.onJoinCriterion, collector.andJoinCriteria) + } + + fun rightJoin(table: SqlTable, receiver: JoinReceiver) = + apply { + val collector = JoinCollector() + receiver(collector) + dsl.rightJoin(table, collector.onJoinCriterion, collector.andJoinCriteria) + } + + fun rightJoin(table: SqlTable, alias: String, receiver: JoinReceiver) = + apply { + val collector = JoinCollector() + receiver(collector) + dsl.rightJoin(table, alias, collector.onJoinCriterion, collector.andJoinCriteria) + } + + fun where(column: BindableColumn, condition: VisitableCondition) = + apply { + dsl.where(column, condition) + } + + fun where(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver) = + apply { + val collector = CriteriaCollector() + collect(collector) + // TODO...awkward + dsl.where(column, condition, *collector.criteria.toTypedArray()) + } + + fun applyWhere(whereApplier: WhereApplier) = + apply { + dsl.applyWhere(whereApplier) + } + + fun and(column: BindableColumn, condition: VisitableCondition) = + apply { + dsl.where().and(column, condition) + } + + fun and(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver) = + apply { + val collector = CriteriaCollector() + collect(collector) + // TODO...awkward + dsl.where().and(column, condition, *collector.criteria.toTypedArray()) + } + + fun or(column: BindableColumn, condition: VisitableCondition) = + apply { + dsl.where().or(column, condition) + } + + fun or(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver) = + apply { + val collector = CriteriaCollector() + collect(collector) + // TODO...awkward + dsl.where().or(column, condition, *collector.criteria.toTypedArray()) + } + + fun allRows() = this +} diff --git a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/DeleteDSLExtensions.kt b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/DeleteDSLExtensions.kt index f17f87870..5270453dc 100644 --- a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/DeleteDSLExtensions.kt +++ b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/DeleteDSLExtensions.kt @@ -19,33 +19,53 @@ import org.mybatis.dynamic.sql.BindableColumn import org.mybatis.dynamic.sql.VisitableCondition import org.mybatis.dynamic.sql.delete.DeleteDSL import org.mybatis.dynamic.sql.delete.DeleteModel -import org.mybatis.dynamic.sql.util.Buildable -typealias DeleteCompleter = DeleteDSL.() -> Buildable +typealias DeleteCompleter = KotlinDeleteBuilder.() -> KotlinDeleteBuilder -fun DeleteDSL.where(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver) = - apply { - where().where(column, condition, collect) - } +class KotlinDeleteBuilder(val dsl: DeleteDSL) { + fun where(column: BindableColumn, condition: VisitableCondition) = + apply { + dsl.where(column, condition) + } -fun DeleteDSL.and(column: BindableColumn, condition: VisitableCondition) = - apply { - where().and(column, condition) - } + fun where(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver) = + apply { + val collector = CriteriaCollector() + collect(collector) + // TODO...awkward + dsl.where(column, condition, *collector.criteria.toTypedArray()) + } -fun DeleteDSL.and(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver) = - apply { - where().and(column, condition, collect) - } + fun applyWhere(whereApplier: WhereApplier) = + apply { + dsl.applyWhere(whereApplier) + } -fun DeleteDSL.or(column: BindableColumn, condition: VisitableCondition) = - apply { - where().or(column, condition) - } + fun and(column: BindableColumn, condition: VisitableCondition) = + apply { + dsl.where().and(column, condition) + } -fun DeleteDSL.or(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver) = - apply { - where().or(column, condition, collect) - } + fun and(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver) = + apply { + val collector = CriteriaCollector() + collect(collector) + // TODO...awkward + dsl.where().and(column, condition, *collector.criteria.toTypedArray()) + } -fun DeleteDSL.allRows() = this as Buildable + fun or(column: BindableColumn, condition: VisitableCondition) = + apply { + dsl.where().or(column, condition) + } + + fun or(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver) = + apply { + val collector = CriteriaCollector() + collect(collector) + // TODO...awkward + dsl.where().or(column, condition, *collector.criteria.toTypedArray()) + } + + fun allRows() = this +} diff --git a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/QueryExpressionDSLExtensions.kt b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/QueryExpressionDSLExtensions.kt index a65297909..1abbbc21a 100644 --- a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/QueryExpressionDSLExtensions.kt +++ b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/QueryExpressionDSLExtensions.kt @@ -15,37 +15,137 @@ */ package org.mybatis.dynamic.sql.util.kotlin -import org.mybatis.dynamic.sql.BindableColumn -import org.mybatis.dynamic.sql.VisitableCondition +import org.mybatis.dynamic.sql.* import org.mybatis.dynamic.sql.select.QueryExpressionDSL import org.mybatis.dynamic.sql.select.SelectModel -import org.mybatis.dynamic.sql.util.Buildable -typealias SelectCompleter = QueryExpressionDSL.() -> Buildable +typealias SelectCompleter = KotlinQueryBuilder.() -> KotlinQueryBuilder -fun QueryExpressionDSL.where(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver) = - apply { - where().where(column, condition, collect) - } +class KotlinQueryBuilder(val dsl: QueryExpressionDSL) { + fun join(table: SqlTable, receiver: JoinReceiver) = + apply { + val collector = JoinCollector() + receiver(collector) + dsl.join(table, collector.onJoinCriterion, collector.andJoinCriteria) + } -fun QueryExpressionDSL.and(column: BindableColumn, condition: VisitableCondition) = - apply { - where().and(column, condition) - } + fun join(table: SqlTable, alias: String, receiver: JoinReceiver) = + apply { + val collector = JoinCollector() + receiver(collector) + dsl.join(table, alias, collector.onJoinCriterion, collector.andJoinCriteria) + } -fun QueryExpressionDSL.and(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver) = - apply { - where().and(column, condition, collect) - } + fun fullJoin(table: SqlTable, receiver: JoinReceiver) = + apply { + val collector = JoinCollector() + receiver(collector) + dsl.fullJoin(table, collector.onJoinCriterion, collector.andJoinCriteria) + } -fun QueryExpressionDSL.or(column: BindableColumn, condition: VisitableCondition) = - apply { - where().or(column, condition) - } + fun fullJoin(table: SqlTable, alias: String, receiver: JoinReceiver) = + apply { + val collector = JoinCollector() + receiver(collector) + dsl.fullJoin(table, alias, collector.onJoinCriterion, collector.andJoinCriteria) + } -fun QueryExpressionDSL.or(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver) = - apply { - where().or(column, condition, collect) - } + fun leftJoin(table: SqlTable, receiver: JoinReceiver) = + apply { + val collector = JoinCollector() + receiver(collector) + dsl.leftJoin(table, collector.onJoinCriterion, collector.andJoinCriteria) + } -fun QueryExpressionDSL.allRows() = this as Buildable + fun leftJoin(table: SqlTable, alias: String, receiver: JoinReceiver) = + apply { + val collector = JoinCollector() + receiver(collector) + dsl.leftJoin(table, alias, collector.onJoinCriterion, collector.andJoinCriteria) + } + + fun rightJoin(table: SqlTable, receiver: JoinReceiver) = + apply { + val collector = JoinCollector() + receiver(collector) + dsl.rightJoin(table, collector.onJoinCriterion, collector.andJoinCriteria) + } + + fun rightJoin(table: SqlTable, alias: String, receiver: JoinReceiver) = + apply { + val collector = JoinCollector() + receiver(collector) + dsl.rightJoin(table, alias, collector.onJoinCriterion, collector.andJoinCriteria) + } + + fun where(column: BindableColumn, condition: VisitableCondition) = + apply { + dsl.where(column, condition) + } + + fun where(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver) = + apply { + val collector = CriteriaCollector() + collect(collector) + // TODO...awkward + dsl.where(column, condition, *collector.criteria.toTypedArray()) + } + + fun applyWhere(whereApplier: WhereApplier) = + apply { + dsl.applyWhere(whereApplier) + } + + fun and(column: BindableColumn, condition: VisitableCondition) = + apply { + dsl.where().and(column, condition) + } + + fun and(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver) = + apply { + val collector = CriteriaCollector() + collect(collector) + // TODO...awkward + dsl.where().and(column, condition, *collector.criteria.toTypedArray()) + } + + fun or(column: BindableColumn, condition: VisitableCondition) = + apply { + dsl.where().or(column, condition) + } + + fun or(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver) = + apply { + val collector = CriteriaCollector() + collect(collector) + // TODO...awkward + dsl.where().or(column, condition, *collector.criteria.toTypedArray()) + } + + fun groupBy(vararg columns: BasicColumn) = + apply { + dsl.groupBy(*columns) + } + + fun orderBy(vararg columns: SortSpecification) = + apply { + dsl.orderBy(*columns) + } + + fun limit(limit: Long) = + apply { + dsl.limit(limit) + } + + fun offset(offset: Long) = + apply { + dsl.offset(offset) + } + + fun fetchFirst(fetchFirstRows: Long) = + apply { + dsl.fetchFirst(fetchFirstRows) + } + + fun allRows() = this +} diff --git a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/UpdateDSLExtensions.kt b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/UpdateDSLExtensions.kt index e59aaa3e5..74fd1acf1 100644 --- a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/UpdateDSLExtensions.kt +++ b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/UpdateDSLExtensions.kt @@ -16,40 +16,66 @@ package org.mybatis.dynamic.sql.util.kotlin import org.mybatis.dynamic.sql.BindableColumn +import org.mybatis.dynamic.sql.SqlColumn import org.mybatis.dynamic.sql.VisitableCondition import org.mybatis.dynamic.sql.insert.InsertDSL import org.mybatis.dynamic.sql.insert.MultiRowInsertDSL import org.mybatis.dynamic.sql.update.UpdateDSL import org.mybatis.dynamic.sql.update.UpdateModel -import org.mybatis.dynamic.sql.util.Buildable // insert completers are here because sonar doesn't see them as covered if they are in a file by themselves typealias InsertCompleter = InsertDSL.() -> InsertDSL + typealias MultiRowInsertCompleter = MultiRowInsertDSL.() -> MultiRowInsertDSL -typealias UpdateCompleter = UpdateDSL.() -> Buildable +typealias UpdateCompleter = KotlinUpdateBuilder.() -> KotlinUpdateBuilder -fun UpdateDSL.where(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver) = - apply { - where().where(column, condition, collect) - } +class KotlinUpdateBuilder(val dsl: UpdateDSL) { + fun where(column: BindableColumn, condition: VisitableCondition) = + apply { + dsl.where(column, condition) + } -fun UpdateDSL.and(column: BindableColumn, condition: VisitableCondition) = - apply { - where().and(column, condition) - } + fun where(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver) = + apply { + val collector = CriteriaCollector() + collect(collector) + // TODO...awkward + dsl.where(column, condition, *collector.criteria.toTypedArray()) + } -fun UpdateDSL.and(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver) = - apply { - where().and(column, condition, collect) - } + fun applyWhere(whereApplier: WhereApplier) = + apply { + dsl.applyWhere(whereApplier) + } -fun UpdateDSL.or(column: BindableColumn, condition: VisitableCondition) = - apply { - where().or(column, condition) - } + fun and(column: BindableColumn, condition: VisitableCondition) = + apply { + dsl.where().and(column, condition) + } + + fun and(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver) = + apply { + val collector = CriteriaCollector() + collect(collector) + // TODO...awkward + dsl.where().and(column, condition, *collector.criteria.toTypedArray()) + } + + fun or(column: BindableColumn, condition: VisitableCondition) = + apply { + dsl.where().or(column, condition) + } + + fun or(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver) = + apply { + val collector = CriteriaCollector() + collect(collector) + // TODO...awkward + dsl.where().or(column, condition, *collector.criteria.toTypedArray()) + } -fun UpdateDSL.or(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver) = - apply { - where().or(column, condition, collect) + fun set(column: SqlColumn): UpdateDSL.SetClauseFinisher { + return dsl.set(column) } +} diff --git a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/mybatis3/ProviderBuilderFunctions.kt b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/mybatis3/ProviderBuilderFunctions.kt index eaa27d54d..b5993e2df 100644 --- a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/mybatis3/ProviderBuilderFunctions.kt +++ b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/mybatis3/ProviderBuilderFunctions.kt @@ -17,6 +17,7 @@ package org.mybatis.dynamic.sql.util.kotlin.mybatis3 import org.mybatis.dynamic.sql.SqlBuilder import org.mybatis.dynamic.sql.SqlTable +import org.mybatis.dynamic.sql.delete.render.DeleteStatementProvider import org.mybatis.dynamic.sql.insert.InsertDSL import org.mybatis.dynamic.sql.insert.MultiRowInsertDSL import org.mybatis.dynamic.sql.insert.render.InsertStatementProvider @@ -24,28 +25,48 @@ import org.mybatis.dynamic.sql.insert.render.MultiRowInsertStatementProvider import org.mybatis.dynamic.sql.render.RenderingStrategies import org.mybatis.dynamic.sql.select.QueryExpressionDSL import org.mybatis.dynamic.sql.select.SelectModel +import org.mybatis.dynamic.sql.select.render.SelectStatementProvider +import org.mybatis.dynamic.sql.update.render.UpdateStatementProvider import org.mybatis.dynamic.sql.util.kotlin.* -fun countFrom(table: SqlTable, completer: CountCompleter) = - completer(SqlBuilder.countFrom(table)).build().render(RenderingStrategies.MYBATIS3) +fun countFrom(table: SqlTable, completer: CountCompleter): SelectStatementProvider { + val builder = KotlinCountBuilder(SqlBuilder.countFrom(table)) + completer(builder) + return builder.dsl.build().render(RenderingStrategies.MYBATIS3) +} -fun deleteFrom(table: SqlTable, completer: DeleteCompleter) = - completer(SqlBuilder.deleteFrom(table)).build().render(RenderingStrategies.MYBATIS3) +fun deleteFrom(table: SqlTable, completer: DeleteCompleter): DeleteStatementProvider { + val builder = KotlinDeleteBuilder(SqlBuilder.deleteFrom(table)) + completer(builder) + return builder.dsl.build().render(RenderingStrategies.MYBATIS3) +} fun InsertDSL.IntoGatherer.into(table: SqlTable, completer: InsertCompleter): InsertStatementProvider = - completer(into(table)).build().render(RenderingStrategies.MYBATIS3) + completer(into(table)).build().render(RenderingStrategies.MYBATIS3) fun MultiRowInsertDSL.IntoGatherer.into(table: SqlTable, completer: MultiRowInsertCompleter): MultiRowInsertStatementProvider = - completer(into(table)).build().render(RenderingStrategies.MYBATIS3) + completer(into(table)).build().render(RenderingStrategies.MYBATIS3) -fun QueryExpressionDSL.FromGatherer.from(table: SqlTable, completer: SelectCompleter) = - completer(from(table)).build().render(RenderingStrategies.MYBATIS3) +fun QueryExpressionDSL.FromGatherer.from(table: SqlTable, completer: SelectCompleter): SelectStatementProvider { + val builder = KotlinQueryBuilder(from(table)) + completer(builder) + return builder.dsl.build().render(RenderingStrategies.MYBATIS3) +} -fun QueryExpressionDSL.FromGatherer.from(table: SqlTable, alias: String, completer: SelectCompleter) = - completer(from(table, alias)).build().render(RenderingStrategies.MYBATIS3) +fun QueryExpressionDSL.FromGatherer.from(table: SqlTable, alias: String, completer: SelectCompleter): SelectStatementProvider { + val builder = KotlinQueryBuilder(from(table, alias)) + completer(builder) + return builder.dsl.build().render(RenderingStrategies.MYBATIS3) +} -fun select(start: QueryExpressionDSL, completer: SelectCompleter) = - completer(start).build().render(RenderingStrategies.MYBATIS3) +fun select(start: QueryExpressionDSL, completer: SelectCompleter): SelectStatementProvider { + val builder = KotlinQueryBuilder(start) + completer(builder) + return builder.dsl.build().render(RenderingStrategies.MYBATIS3) +} -fun update(table: SqlTable, completer: UpdateCompleter) = - completer(SqlBuilder.update(table)).build().render(RenderingStrategies.MYBATIS3) +fun update(table: SqlTable, completer: UpdateCompleter): UpdateStatementProvider { + val builder = KotlinUpdateBuilder(SqlBuilder.update(table)) + completer(builder) + return builder.dsl.build().render(RenderingStrategies.MYBATIS3) +} diff --git a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/spring/ProviderBuilderFunctions.kt b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/spring/ProviderBuilderFunctions.kt index 9b6b33719..b1acf1576 100644 --- a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/spring/ProviderBuilderFunctions.kt +++ b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/spring/ProviderBuilderFunctions.kt @@ -17,27 +17,51 @@ package org.mybatis.dynamic.sql.util.kotlin.spring import org.mybatis.dynamic.sql.SqlBuilder import org.mybatis.dynamic.sql.SqlTable +import org.mybatis.dynamic.sql.delete.render.DeleteStatementProvider import org.mybatis.dynamic.sql.insert.InsertDSL import org.mybatis.dynamic.sql.insert.render.InsertStatementProvider import org.mybatis.dynamic.sql.render.RenderingStrategies import org.mybatis.dynamic.sql.select.QueryExpressionDSL import org.mybatis.dynamic.sql.select.SelectModel +import org.mybatis.dynamic.sql.select.render.SelectStatementProvider +import org.mybatis.dynamic.sql.update.render.UpdateStatementProvider import org.mybatis.dynamic.sql.util.kotlin.* -fun countFrom(table: SqlTable, completer: CountCompleter) = - completer(SqlBuilder.countFrom(table)).build().render(RenderingStrategies.SPRING_NAMED_PARAMETER) +fun countFrom(table: SqlTable, completer: CountCompleter): SelectStatementProvider { + val builder = KotlinCountBuilder(SqlBuilder.countFrom(table)) + completer(builder) + return builder.dsl.build().render(RenderingStrategies.SPRING_NAMED_PARAMETER) +} -fun deleteFrom(table: SqlTable, completer: DeleteCompleter) = - completer(SqlBuilder.deleteFrom(table)).build().render(RenderingStrategies.SPRING_NAMED_PARAMETER) +fun deleteFrom(table: SqlTable, completer: DeleteCompleter): DeleteStatementProvider { + val builder = KotlinDeleteBuilder(SqlBuilder.deleteFrom(table)) + completer(builder) + return builder.dsl.build().render(RenderingStrategies.SPRING_NAMED_PARAMETER) +} fun InsertDSL.IntoGatherer.into(table: SqlTable, completer: InsertCompleter): InsertStatementProvider = - completer(into(table)).build().render(RenderingStrategies.SPRING_NAMED_PARAMETER) + completer(into(table)).build().render(RenderingStrategies.SPRING_NAMED_PARAMETER) -fun QueryExpressionDSL.FromGatherer.from(table: SqlTable, completer: SelectCompleter) = - completer(from(table)).build().render(RenderingStrategies.SPRING_NAMED_PARAMETER) +fun QueryExpressionDSL.FromGatherer.from(table: SqlTable, completer: SelectCompleter): SelectStatementProvider { + val builder = KotlinQueryBuilder(from(table)) + completer(builder) + return builder.dsl.build().render(RenderingStrategies.SPRING_NAMED_PARAMETER) +} -fun QueryExpressionDSL.FromGatherer.from(table: SqlTable, alias: String, completer: SelectCompleter) = - completer(from(table, alias)).build().render(RenderingStrategies.SPRING_NAMED_PARAMETER) +fun QueryExpressionDSL.FromGatherer.from(table: SqlTable, alias: String, completer: SelectCompleter): SelectStatementProvider { + val builder = KotlinQueryBuilder(from(table, alias)) + completer(builder) + return builder.dsl.build().render(RenderingStrategies.SPRING_NAMED_PARAMETER) +} -fun update(table: SqlTable, completer: UpdateCompleter) = - completer(SqlBuilder.update(table)).build().render(RenderingStrategies.SPRING_NAMED_PARAMETER) +fun select(start: QueryExpressionDSL, completer: SelectCompleter): SelectStatementProvider { + val builder = KotlinQueryBuilder(start) + completer(builder) + return builder.dsl.build().render(RenderingStrategies.SPRING_NAMED_PARAMETER) +} + +fun update(table: SqlTable, completer: UpdateCompleter): UpdateStatementProvider { + val builder = KotlinUpdateBuilder(SqlBuilder.update(table)) + completer(builder) + return builder.dsl.build().render(RenderingStrategies.SPRING_NAMED_PARAMETER) +} diff --git a/src/test/kotlin/examples/kotlin/mybatis3/canonical/PersonMapperExtensions.kt b/src/test/kotlin/examples/kotlin/mybatis3/canonical/PersonMapperExtensions.kt index f9bb4bdc9..5c7926212 100644 --- a/src/test/kotlin/examples/kotlin/mybatis3/canonical/PersonMapperExtensions.kt +++ b/src/test/kotlin/examples/kotlin/mybatis3/canonical/PersonMapperExtensions.kt @@ -24,12 +24,7 @@ import examples.kotlin.mybatis3.canonical.PersonDynamicSqlSupport.Person.id import examples.kotlin.mybatis3.canonical.PersonDynamicSqlSupport.Person.lastName import examples.kotlin.mybatis3.canonical.PersonDynamicSqlSupport.Person.occupation import org.mybatis.dynamic.sql.SqlBuilder.isEqualTo -import org.mybatis.dynamic.sql.update.UpdateDSL -import org.mybatis.dynamic.sql.update.UpdateModel -import org.mybatis.dynamic.sql.util.kotlin.CountCompleter -import org.mybatis.dynamic.sql.util.kotlin.DeleteCompleter -import org.mybatis.dynamic.sql.util.kotlin.SelectCompleter -import org.mybatis.dynamic.sql.util.kotlin.UpdateCompleter +import org.mybatis.dynamic.sql.util.kotlin.* import org.mybatis.dynamic.sql.util.kotlin.mybatis3.* fun PersonMapper.count(completer: CountCompleter) = @@ -98,7 +93,7 @@ fun PersonMapper.selectByPrimaryKey(id_: Int) = fun PersonMapper.update(completer: UpdateCompleter) = update(this::update, Person, completer) -fun UpdateDSL.updateAllColumns(record: PersonRecord) = +fun KotlinUpdateBuilder.updateAllColumns(record: PersonRecord) = apply { set(id).equalTo(record::id) set(firstName).equalTo(record::firstName) @@ -109,7 +104,7 @@ fun UpdateDSL.updateAllColumns(record: PersonRecord) = set(addressId).equalTo(record::addressId) } -fun UpdateDSL.updateSelectiveColumns(record: PersonRecord) = +fun KotlinUpdateBuilder.updateSelectiveColumns(record: PersonRecord) = apply { set(id).equalToWhenPresent(record::id) set(firstName).equalToWhenPresent(record::firstName) diff --git a/src/test/kotlin/examples/kotlin/mybatis3/canonical/PersonMapperTest.kt b/src/test/kotlin/examples/kotlin/mybatis3/canonical/PersonMapperTest.kt index 931d6793d..e784a476a 100644 --- a/src/test/kotlin/examples/kotlin/mybatis3/canonical/PersonMapperTest.kt +++ b/src/test/kotlin/examples/kotlin/mybatis3/canonical/PersonMapperTest.kt @@ -30,10 +30,6 @@ import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test import org.mybatis.dynamic.sql.SqlBuilder.* -import org.mybatis.dynamic.sql.util.kotlin.allRows -import org.mybatis.dynamic.sql.util.kotlin.and -import org.mybatis.dynamic.sql.util.kotlin.or -import org.mybatis.dynamic.sql.util.kotlin.where import java.io.InputStreamReader import java.sql.DriverManager import java.util.* From a67ef635931f38c6248ae59585af5da202edadd7 Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Wed, 20 Nov 2019 05:58:48 -0500 Subject: [PATCH 2/8] Refinements to the Fix for Kotlin --- .../mybatis/dynamic/sql/delete/DeleteDSL.java | 7 ++ .../mybatis/dynamic/sql/select/CountDSL.java | 7 ++ .../sql/select/QueryExpressionDSL.java | 6 ++ .../mybatis/dynamic/sql/update/UpdateDSL.java | 6 ++ ...DSLExtensions.kt => KotlinCountBuilder.kt} | 16 ++-- ...SLExtensions.kt => KotlinDeleteBuilder.kt} | 16 ++-- ...DSLExtensions.kt => KotlinQueryBuilder.kt} | 16 ++-- ...SLExtensions.kt => KotlinUpdateBuilder.kt} | 16 ++-- .../mybatis3/ProviderBuilderFunctions.kt | 12 +-- .../kotlin/spring/ProviderBuilderFunctions.kt | 12 +-- .../mybatis3/canonical/PersonMapperTest.kt | 21 ++++++ .../kotlin/mybatis3/joins/JoinMapperTest.kt | 74 +++++++++---------- 12 files changed, 126 insertions(+), 83 deletions(-) rename src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/{CountDSLExtensions.kt => KotlinCountBuilder.kt} (90%) rename src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/{DeleteDSLExtensions.kt => KotlinDeleteBuilder.kt} (81%) rename src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/{QueryExpressionDSLExtensions.kt => KotlinQueryBuilder.kt} (90%) rename src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/{UpdateDSLExtensions.kt => KotlinUpdateBuilder.kt} (84%) diff --git a/src/main/java/org/mybatis/dynamic/sql/delete/DeleteDSL.java b/src/main/java/org/mybatis/dynamic/sql/delete/DeleteDSL.java index 73bdaad45..5e53a1772 100644 --- a/src/main/java/org/mybatis/dynamic/sql/delete/DeleteDSL.java +++ b/src/main/java/org/mybatis/dynamic/sql/delete/DeleteDSL.java @@ -15,6 +15,7 @@ */ package org.mybatis.dynamic.sql.delete; +import java.util.List; import java.util.Objects; import java.util.function.Function; import java.util.function.ToIntFunction; @@ -51,6 +52,12 @@ public DeleteWhereBuilder where(BindableColumn column, VisitableCondition return whereBuilder; } + public DeleteWhereBuilder where(BindableColumn column, VisitableCondition condition, + List> subCriteria) { + whereBuilder.where(column, condition, subCriteria); + return whereBuilder; + } + @SuppressWarnings("unchecked") public DeleteWhereBuilder applyWhere(WhereApplier whereApplier) { return (DeleteWhereBuilder) whereApplier.apply(whereBuilder); diff --git a/src/main/java/org/mybatis/dynamic/sql/select/CountDSL.java b/src/main/java/org/mybatis/dynamic/sql/select/CountDSL.java index 8d7f10dcc..42e104468 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/CountDSL.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/CountDSL.java @@ -15,6 +15,7 @@ */ package org.mybatis.dynamic.sql.select; +import java.util.List; import java.util.Objects; import java.util.function.Function; @@ -57,6 +58,12 @@ public CountWhereBuilder where(BindableColumn column, VisitableCondition< return whereBuilder; } + public CountWhereBuilder where(BindableColumn column, VisitableCondition condition, + List> subCriteria) { + whereBuilder.where(column, condition, subCriteria); + return whereBuilder; + } + @SuppressWarnings("unchecked") public CountWhereBuilder applyWhere(WhereApplier whereApplier) { return (CountWhereBuilder) whereApplier.apply(whereBuilder); diff --git a/src/main/java/org/mybatis/dynamic/sql/select/QueryExpressionDSL.java b/src/main/java/org/mybatis/dynamic/sql/select/QueryExpressionDSL.java index f2daf2491..b3d893570 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/QueryExpressionDSL.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/QueryExpressionDSL.java @@ -69,6 +69,12 @@ public QueryExpressionWhereBuilder where(BindableColumn column, Visitable return whereBuilder; } + public QueryExpressionWhereBuilder where(BindableColumn column, VisitableCondition condition, + List> subCriteria) { + whereBuilder.where(column, condition, subCriteria); + return whereBuilder; + } + @SuppressWarnings("unchecked") public QueryExpressionWhereBuilder applyWhere(WhereApplier whereApplier) { return (QueryExpressionWhereBuilder) whereApplier.apply(whereBuilder); diff --git a/src/main/java/org/mybatis/dynamic/sql/update/UpdateDSL.java b/src/main/java/org/mybatis/dynamic/sql/update/UpdateDSL.java index bcce877cc..6f5fc7305 100644 --- a/src/main/java/org/mybatis/dynamic/sql/update/UpdateDSL.java +++ b/src/main/java/org/mybatis/dynamic/sql/update/UpdateDSL.java @@ -69,6 +69,12 @@ public UpdateWhereBuilder where(BindableColumn column, VisitableCondition return whereBuilder; } + public UpdateWhereBuilder where(BindableColumn column, VisitableCondition condition, + List> subCriteria) { + whereBuilder.where(column, condition, subCriteria); + return whereBuilder; + } + @SuppressWarnings("unchecked") public UpdateWhereBuilder applyWhere(WhereApplier whereApplier) { return (UpdateWhereBuilder) whereApplier.apply(whereBuilder); diff --git a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/CountDSLExtensions.kt b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinCountBuilder.kt similarity index 90% rename from src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/CountDSLExtensions.kt rename to src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinCountBuilder.kt index 884c262e2..fac8737f1 100644 --- a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/CountDSLExtensions.kt +++ b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinCountBuilder.kt @@ -20,10 +20,11 @@ import org.mybatis.dynamic.sql.SqlTable import org.mybatis.dynamic.sql.VisitableCondition import org.mybatis.dynamic.sql.select.CountDSL import org.mybatis.dynamic.sql.select.SelectModel +import org.mybatis.dynamic.sql.util.Buildable -typealias CountCompleter = KotlinCountBuilder.() -> KotlinCountBuilder +typealias CountCompleter = KotlinCountBuilder.() -> Buildable -class KotlinCountBuilder(val dsl: CountDSL) { +class KotlinCountBuilder(private val dsl: CountDSL): Buildable { fun join(table: SqlTable, receiver: JoinReceiver) = apply { val collector = JoinCollector() @@ -89,8 +90,7 @@ class KotlinCountBuilder(val dsl: CountDSL) { apply { val collector = CriteriaCollector() collect(collector) - // TODO...awkward - dsl.where(column, condition, *collector.criteria.toTypedArray()) + dsl.where(column, condition, collector.criteria) } fun applyWhere(whereApplier: WhereApplier) = @@ -107,8 +107,7 @@ class KotlinCountBuilder(val dsl: CountDSL) { apply { val collector = CriteriaCollector() collect(collector) - // TODO...awkward - dsl.where().and(column, condition, *collector.criteria.toTypedArray()) + dsl.where().and(column, condition, collector.criteria) } fun or(column: BindableColumn, condition: VisitableCondition) = @@ -120,9 +119,10 @@ class KotlinCountBuilder(val dsl: CountDSL) { apply { val collector = CriteriaCollector() collect(collector) - // TODO...awkward - dsl.where().or(column, condition, *collector.criteria.toTypedArray()) + dsl.where().or(column, condition, collector.criteria) } fun allRows() = this + + override fun build(): SelectModel = dsl.build() } diff --git a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/DeleteDSLExtensions.kt b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinDeleteBuilder.kt similarity index 81% rename from src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/DeleteDSLExtensions.kt rename to src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinDeleteBuilder.kt index 5270453dc..ac8c20f5e 100644 --- a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/DeleteDSLExtensions.kt +++ b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinDeleteBuilder.kt @@ -19,10 +19,11 @@ import org.mybatis.dynamic.sql.BindableColumn import org.mybatis.dynamic.sql.VisitableCondition import org.mybatis.dynamic.sql.delete.DeleteDSL import org.mybatis.dynamic.sql.delete.DeleteModel +import org.mybatis.dynamic.sql.util.Buildable -typealias DeleteCompleter = KotlinDeleteBuilder.() -> KotlinDeleteBuilder +typealias DeleteCompleter = KotlinDeleteBuilder.() -> Buildable -class KotlinDeleteBuilder(val dsl: DeleteDSL) { +class KotlinDeleteBuilder(private val dsl: DeleteDSL): Buildable { fun where(column: BindableColumn, condition: VisitableCondition) = apply { dsl.where(column, condition) @@ -32,8 +33,7 @@ class KotlinDeleteBuilder(val dsl: DeleteDSL) { apply { val collector = CriteriaCollector() collect(collector) - // TODO...awkward - dsl.where(column, condition, *collector.criteria.toTypedArray()) + dsl.where(column, condition, collector.criteria) } fun applyWhere(whereApplier: WhereApplier) = @@ -50,8 +50,7 @@ class KotlinDeleteBuilder(val dsl: DeleteDSL) { apply { val collector = CriteriaCollector() collect(collector) - // TODO...awkward - dsl.where().and(column, condition, *collector.criteria.toTypedArray()) + dsl.where().and(column, condition, collector.criteria) } fun or(column: BindableColumn, condition: VisitableCondition) = @@ -63,9 +62,10 @@ class KotlinDeleteBuilder(val dsl: DeleteDSL) { apply { val collector = CriteriaCollector() collect(collector) - // TODO...awkward - dsl.where().or(column, condition, *collector.criteria.toTypedArray()) + dsl.where().or(column, condition, collector.criteria) } fun allRows() = this + + override fun build(): DeleteModel = dsl.build() } diff --git a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/QueryExpressionDSLExtensions.kt b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinQueryBuilder.kt similarity index 90% rename from src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/QueryExpressionDSLExtensions.kt rename to src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinQueryBuilder.kt index 1abbbc21a..b7be50f2e 100644 --- a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/QueryExpressionDSLExtensions.kt +++ b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinQueryBuilder.kt @@ -18,10 +18,11 @@ package org.mybatis.dynamic.sql.util.kotlin import org.mybatis.dynamic.sql.* import org.mybatis.dynamic.sql.select.QueryExpressionDSL import org.mybatis.dynamic.sql.select.SelectModel +import org.mybatis.dynamic.sql.util.Buildable -typealias SelectCompleter = KotlinQueryBuilder.() -> KotlinQueryBuilder +typealias SelectCompleter = KotlinQueryBuilder.() -> Buildable -class KotlinQueryBuilder(val dsl: QueryExpressionDSL) { +class KotlinQueryBuilder(private val dsl: QueryExpressionDSL): Buildable { fun join(table: SqlTable, receiver: JoinReceiver) = apply { val collector = JoinCollector() @@ -87,8 +88,7 @@ class KotlinQueryBuilder(val dsl: QueryExpressionDSL) { apply { val collector = CriteriaCollector() collect(collector) - // TODO...awkward - dsl.where(column, condition, *collector.criteria.toTypedArray()) + dsl.where(column, condition, collector.criteria) } fun applyWhere(whereApplier: WhereApplier) = @@ -105,8 +105,7 @@ class KotlinQueryBuilder(val dsl: QueryExpressionDSL) { apply { val collector = CriteriaCollector() collect(collector) - // TODO...awkward - dsl.where().and(column, condition, *collector.criteria.toTypedArray()) + dsl.where().and(column, condition, collector.criteria) } fun or(column: BindableColumn, condition: VisitableCondition) = @@ -118,8 +117,7 @@ class KotlinQueryBuilder(val dsl: QueryExpressionDSL) { apply { val collector = CriteriaCollector() collect(collector) - // TODO...awkward - dsl.where().or(column, condition, *collector.criteria.toTypedArray()) + dsl.where().or(column, condition, collector.criteria) } fun groupBy(vararg columns: BasicColumn) = @@ -148,4 +146,6 @@ class KotlinQueryBuilder(val dsl: QueryExpressionDSL) { } fun allRows() = this + + override fun build(): SelectModel = dsl.build() } diff --git a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/UpdateDSLExtensions.kt b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinUpdateBuilder.kt similarity index 84% rename from src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/UpdateDSLExtensions.kt rename to src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinUpdateBuilder.kt index 74fd1acf1..eac4216ec 100644 --- a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/UpdateDSLExtensions.kt +++ b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinUpdateBuilder.kt @@ -22,15 +22,16 @@ import org.mybatis.dynamic.sql.insert.InsertDSL import org.mybatis.dynamic.sql.insert.MultiRowInsertDSL import org.mybatis.dynamic.sql.update.UpdateDSL import org.mybatis.dynamic.sql.update.UpdateModel +import org.mybatis.dynamic.sql.util.Buildable // insert completers are here because sonar doesn't see them as covered if they are in a file by themselves typealias InsertCompleter = InsertDSL.() -> InsertDSL typealias MultiRowInsertCompleter = MultiRowInsertDSL.() -> MultiRowInsertDSL -typealias UpdateCompleter = KotlinUpdateBuilder.() -> KotlinUpdateBuilder +typealias UpdateCompleter = KotlinUpdateBuilder.() -> Buildable -class KotlinUpdateBuilder(val dsl: UpdateDSL) { +class KotlinUpdateBuilder(private val dsl: UpdateDSL) : Buildable { fun where(column: BindableColumn, condition: VisitableCondition) = apply { dsl.where(column, condition) @@ -40,8 +41,7 @@ class KotlinUpdateBuilder(val dsl: UpdateDSL) { apply { val collector = CriteriaCollector() collect(collector) - // TODO...awkward - dsl.where(column, condition, *collector.criteria.toTypedArray()) + dsl.where(column, condition, collector.criteria) } fun applyWhere(whereApplier: WhereApplier) = @@ -58,8 +58,7 @@ class KotlinUpdateBuilder(val dsl: UpdateDSL) { apply { val collector = CriteriaCollector() collect(collector) - // TODO...awkward - dsl.where().and(column, condition, *collector.criteria.toTypedArray()) + dsl.where().and(column, condition, collector.criteria) } fun or(column: BindableColumn, condition: VisitableCondition) = @@ -71,11 +70,12 @@ class KotlinUpdateBuilder(val dsl: UpdateDSL) { apply { val collector = CriteriaCollector() collect(collector) - // TODO...awkward - dsl.where().or(column, condition, *collector.criteria.toTypedArray()) + dsl.where().or(column, condition, collector.criteria) } fun set(column: SqlColumn): UpdateDSL.SetClauseFinisher { return dsl.set(column) } + + override fun build(): UpdateModel = dsl.build() } diff --git a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/mybatis3/ProviderBuilderFunctions.kt b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/mybatis3/ProviderBuilderFunctions.kt index b5993e2df..e6bc19aa9 100644 --- a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/mybatis3/ProviderBuilderFunctions.kt +++ b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/mybatis3/ProviderBuilderFunctions.kt @@ -32,13 +32,13 @@ import org.mybatis.dynamic.sql.util.kotlin.* fun countFrom(table: SqlTable, completer: CountCompleter): SelectStatementProvider { val builder = KotlinCountBuilder(SqlBuilder.countFrom(table)) completer(builder) - return builder.dsl.build().render(RenderingStrategies.MYBATIS3) + return builder.build().render(RenderingStrategies.MYBATIS3) } fun deleteFrom(table: SqlTable, completer: DeleteCompleter): DeleteStatementProvider { val builder = KotlinDeleteBuilder(SqlBuilder.deleteFrom(table)) completer(builder) - return builder.dsl.build().render(RenderingStrategies.MYBATIS3) + return builder.build().render(RenderingStrategies.MYBATIS3) } fun InsertDSL.IntoGatherer.into(table: SqlTable, completer: InsertCompleter): InsertStatementProvider = @@ -50,23 +50,23 @@ fun MultiRowInsertDSL.IntoGatherer.into(table: SqlTable, completer: Multi fun QueryExpressionDSL.FromGatherer.from(table: SqlTable, completer: SelectCompleter): SelectStatementProvider { val builder = KotlinQueryBuilder(from(table)) completer(builder) - return builder.dsl.build().render(RenderingStrategies.MYBATIS3) + return builder.build().render(RenderingStrategies.MYBATIS3) } fun QueryExpressionDSL.FromGatherer.from(table: SqlTable, alias: String, completer: SelectCompleter): SelectStatementProvider { val builder = KotlinQueryBuilder(from(table, alias)) completer(builder) - return builder.dsl.build().render(RenderingStrategies.MYBATIS3) + return builder.build().render(RenderingStrategies.MYBATIS3) } fun select(start: QueryExpressionDSL, completer: SelectCompleter): SelectStatementProvider { val builder = KotlinQueryBuilder(start) completer(builder) - return builder.dsl.build().render(RenderingStrategies.MYBATIS3) + return builder.build().render(RenderingStrategies.MYBATIS3) } fun update(table: SqlTable, completer: UpdateCompleter): UpdateStatementProvider { val builder = KotlinUpdateBuilder(SqlBuilder.update(table)) completer(builder) - return builder.dsl.build().render(RenderingStrategies.MYBATIS3) + return builder.build().render(RenderingStrategies.MYBATIS3) } diff --git a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/spring/ProviderBuilderFunctions.kt b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/spring/ProviderBuilderFunctions.kt index b1acf1576..116d6154b 100644 --- a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/spring/ProviderBuilderFunctions.kt +++ b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/spring/ProviderBuilderFunctions.kt @@ -30,13 +30,13 @@ import org.mybatis.dynamic.sql.util.kotlin.* fun countFrom(table: SqlTable, completer: CountCompleter): SelectStatementProvider { val builder = KotlinCountBuilder(SqlBuilder.countFrom(table)) completer(builder) - return builder.dsl.build().render(RenderingStrategies.SPRING_NAMED_PARAMETER) + return builder.build().render(RenderingStrategies.SPRING_NAMED_PARAMETER) } fun deleteFrom(table: SqlTable, completer: DeleteCompleter): DeleteStatementProvider { val builder = KotlinDeleteBuilder(SqlBuilder.deleteFrom(table)) completer(builder) - return builder.dsl.build().render(RenderingStrategies.SPRING_NAMED_PARAMETER) + return builder.build().render(RenderingStrategies.SPRING_NAMED_PARAMETER) } fun InsertDSL.IntoGatherer.into(table: SqlTable, completer: InsertCompleter): InsertStatementProvider = @@ -45,23 +45,23 @@ fun InsertDSL.IntoGatherer.into(table: SqlTable, completer: InsertComplet fun QueryExpressionDSL.FromGatherer.from(table: SqlTable, completer: SelectCompleter): SelectStatementProvider { val builder = KotlinQueryBuilder(from(table)) completer(builder) - return builder.dsl.build().render(RenderingStrategies.SPRING_NAMED_PARAMETER) + return builder.build().render(RenderingStrategies.SPRING_NAMED_PARAMETER) } fun QueryExpressionDSL.FromGatherer.from(table: SqlTable, alias: String, completer: SelectCompleter): SelectStatementProvider { val builder = KotlinQueryBuilder(from(table, alias)) completer(builder) - return builder.dsl.build().render(RenderingStrategies.SPRING_NAMED_PARAMETER) + return builder.build().render(RenderingStrategies.SPRING_NAMED_PARAMETER) } fun select(start: QueryExpressionDSL, completer: SelectCompleter): SelectStatementProvider { val builder = KotlinQueryBuilder(start) completer(builder) - return builder.dsl.build().render(RenderingStrategies.SPRING_NAMED_PARAMETER) + return builder.build().render(RenderingStrategies.SPRING_NAMED_PARAMETER) } fun update(table: SqlTable, completer: UpdateCompleter): UpdateStatementProvider { val builder = KotlinUpdateBuilder(SqlBuilder.update(table)) completer(builder) - return builder.dsl.build().render(RenderingStrategies.SPRING_NAMED_PARAMETER) + return builder.build().render(RenderingStrategies.SPRING_NAMED_PARAMETER) } diff --git a/src/test/kotlin/examples/kotlin/mybatis3/canonical/PersonMapperTest.kt b/src/test/kotlin/examples/kotlin/mybatis3/canonical/PersonMapperTest.kt index e784a476a..2170c607e 100644 --- a/src/test/kotlin/examples/kotlin/mybatis3/canonical/PersonMapperTest.kt +++ b/src/test/kotlin/examples/kotlin/mybatis3/canonical/PersonMapperTest.kt @@ -308,6 +308,27 @@ class PersonMapperTest { } } + @Test + fun testUpdateOneFieldInAllRows() { + newSession().use { session -> + val mapper = session.getMapper(PersonMapper::class.java) + + val record = PersonRecord(100, "Joe", LastName("Jones"), Date(), true, "Developer", 1) + + var rows = mapper.insert(record) + assertThat(rows).isEqualTo(1) + + rows = mapper.update { + set(occupation).equalTo("Programmer") + } + + assertThat(rows).isEqualTo(7) + + val newRecord = mapper.selectByPrimaryKey(100) + assertThat(newRecord?.occupation).isEqualTo("Programmer") + } + } + @Test fun testUpdateAll() { newSession().use { session -> diff --git a/src/test/kotlin/examples/kotlin/mybatis3/joins/JoinMapperTest.kt b/src/test/kotlin/examples/kotlin/mybatis3/joins/JoinMapperTest.kt index fc45a1752..37d360f3c 100644 --- a/src/test/kotlin/examples/kotlin/mybatis3/joins/JoinMapperTest.kt +++ b/src/test/kotlin/examples/kotlin/mybatis3/joins/JoinMapperTest.kt @@ -29,11 +29,7 @@ import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test import org.mybatis.dynamic.sql.SqlBuilder.* -import org.mybatis.dynamic.sql.util.kotlin.fullJoin -import org.mybatis.dynamic.sql.util.kotlin.join -import org.mybatis.dynamic.sql.util.kotlin.leftJoin import org.mybatis.dynamic.sql.util.kotlin.mybatis3.from -import org.mybatis.dynamic.sql.util.kotlin.rightJoin import java.io.InputStreamReader import java.sql.DriverManager @@ -62,14 +58,14 @@ class JoinMapperTest { val mapper = session.getMapper(JoinMapper::class.java) val selectStatement = select(OrderMaster.orderId, OrderMaster.orderDate, OrderDetail.lineNumber, - OrderDetail.description, OrderDetail.quantity).from(OrderMaster, "om") { + OrderDetail.description, OrderDetail.quantity).from(OrderMaster, "om") { join(OrderDetail, "od") { on(OrderMaster.orderId, equalTo(OrderDetail.orderId)) } } val expectedStatement = "select om.order_id, om.order_date, od.line_number, od.description, od.quantity" + - " from OrderMaster om join OrderDetail od on om.order_id = od.order_id" + " from OrderMaster om join OrderDetail od on om.order_id = od.order_id" assertThat(selectStatement.selectStatement).isEqualTo(expectedStatement) val rows = mapper.selectMany(selectStatement) @@ -95,7 +91,7 @@ class JoinMapperTest { fun testCompoundJoin1() { // this is a nonsensical join, but it does test the "and" capability val selectStatement = select(OrderMaster.orderId, OrderMaster.orderDate, OrderDetail.lineNumber, - OrderDetail.description, OrderDetail.quantity).from(OrderMaster, "om") { + OrderDetail.description, OrderDetail.quantity).from(OrderMaster, "om") { join(OrderDetail, "od") { on(OrderMaster.orderId, equalTo(OrderDetail.orderId)) and(OrderMaster.orderId, equalTo(OrderDetail.orderId)) @@ -103,7 +99,7 @@ class JoinMapperTest { } val expectedStatement = "select om.order_id, om.order_date, od.line_number, od.description, od.quantity" + - " from OrderMaster om join OrderDetail od on om.order_id = od.order_id and om.order_id = od.order_id" + " from OrderMaster om join OrderDetail od on om.order_id = od.order_id and om.order_id = od.order_id" assertThat(selectStatement.selectStatement).isEqualTo(expectedStatement) } @@ -111,7 +107,7 @@ class JoinMapperTest { fun testCompoundJoin2() { // this is a nonsensical join, but it does test the "and" capability val selectStatement = select(OrderMaster.orderId, OrderMaster.orderDate, OrderDetail.lineNumber, - OrderDetail.description, OrderDetail.quantity).from(OrderMaster, "om") { + OrderDetail.description, OrderDetail.quantity).from(OrderMaster, "om") { join(OrderDetail, "od") { on(OrderMaster.orderId, equalTo(OrderDetail.orderId)) and(OrderMaster.orderId, equalTo(OrderDetail.orderId)) @@ -120,8 +116,8 @@ class JoinMapperTest { } val expectedStatement = "select om.order_id, om.order_date, od.line_number, od.description, od.quantity" + - " from OrderMaster om join OrderDetail od on om.order_id = od.order_id and om.order_id = od.order_id" + - " where om.order_id = #{parameters.p1,jdbcType=INTEGER}" + " from OrderMaster om join OrderDetail od on om.order_id = od.order_id and om.order_id = od.order_id" + + " where om.order_id = #{parameters.p1,jdbcType=INTEGER}" assertThat(selectStatement.selectStatement).isEqualTo(expectedStatement) } @@ -131,7 +127,7 @@ class JoinMapperTest { val mapper = session.getMapper(JoinMapper::class.java) val selectStatement = select(OrderMaster.orderId, OrderMaster.orderDate, OrderLine.lineNumber, - ItemMaster.description, OrderLine.quantity).from(OrderMaster, "om") { + ItemMaster.description, OrderLine.quantity).from(OrderMaster, "om") { join(OrderLine, "ol") { on(OrderMaster.orderId, equalTo(OrderLine.orderId)) } @@ -142,9 +138,9 @@ class JoinMapperTest { } val expectedStatement = "select om.order_id, om.order_date, ol.line_number, im.description, ol.quantity" + - " from OrderMaster om join OrderLine ol" + - " on om.order_id = ol.order_id join ItemMaster im on ol.item_id = im.item_id" + - " where om.order_id = #{parameters.p1,jdbcType=INTEGER}" + " from OrderMaster om join OrderLine ol" + + " on om.order_id = ol.order_id join ItemMaster im on ol.item_id = im.item_id" + + " where om.order_id = #{parameters.p1,jdbcType=INTEGER}" assertThat(selectStatement.selectStatement).isEqualTo(expectedStatement) val rows = mapper.selectMany(selectStatement) @@ -165,7 +161,7 @@ class JoinMapperTest { val mapper = session.getMapper(JoinMapper::class.java) val selectStatement = select(OrderLine.orderId, OrderLine.quantity, ItemMaster.itemId, - ItemMaster.description).from(OrderMaster, "om") { + ItemMaster.description).from(OrderMaster, "om") { join(OrderLine, "ol") { on(OrderMaster.orderId, equalTo(OrderLine.orderId)) } @@ -176,9 +172,9 @@ class JoinMapperTest { } val expectedStatement = "select ol.order_id, ol.quantity, im.item_id, im.description" + - " from OrderMaster om join OrderLine ol on om.order_id = ol.order_id" + - " full join ItemMaster im on ol.item_id = im.item_id" + - " order by order_id, item_id" + " from OrderMaster om join OrderLine ol on om.order_id = ol.order_id" + + " full join ItemMaster im on ol.item_id = im.item_id" + + " order by order_id, item_id" assertThat(selectStatement.selectStatement).isEqualTo(expectedStatement) @@ -215,7 +211,7 @@ class JoinMapperTest { val mapper = session.getMapper(JoinMapper::class.java) val selectStatement = select(OrderLine.orderId, OrderLine.quantity, ItemMaster.itemId, - ItemMaster.description).from(OrderMaster, "om") { + ItemMaster.description).from(OrderMaster, "om") { join(OrderLine, "ol") { on(OrderMaster.orderId, equalTo(OrderLine.orderId)) } @@ -226,9 +222,9 @@ class JoinMapperTest { } val expectedStatement = "select ol.order_id, ol.quantity, ItemMaster.item_id, ItemMaster.description" + - " from OrderMaster om join OrderLine ol on om.order_id = ol.order_id" + - " full join ItemMaster on ol.item_id = ItemMaster.item_id" + - " order by order_id, item_id" + " from OrderMaster om join OrderLine ol on om.order_id = ol.order_id" + + " full join ItemMaster on ol.item_id = ItemMaster.item_id" + + " order by order_id, item_id" assertThat(selectStatement.selectStatement).isEqualTo(expectedStatement) @@ -265,7 +261,7 @@ class JoinMapperTest { val mapper = session.getMapper(JoinMapper::class.java) val selectStatement = select(OrderLine.orderId, OrderLine.quantity, ItemMaster.itemId, - ItemMaster.description).from(OrderMaster, "om") { + ItemMaster.description).from(OrderMaster, "om") { join(OrderLine, "ol") { on(OrderMaster.orderId, equalTo(OrderLine.orderId)) } @@ -276,9 +272,9 @@ class JoinMapperTest { } val expectedStatement = "select ol.order_id, ol.quantity, im.item_id, im.description" + - " from OrderMaster om join OrderLine ol on om.order_id = ol.order_id" + - " left join ItemMaster im on ol.item_id = im.item_id" + - " order by order_id, item_id" + " from OrderMaster om join OrderLine ol on om.order_id = ol.order_id" + + " left join ItemMaster im on ol.item_id = im.item_id" + + " order by order_id, item_id" assertThat(selectStatement.selectStatement).isEqualTo(expectedStatement) @@ -308,7 +304,7 @@ class JoinMapperTest { val mapper = session.getMapper(JoinMapper::class.java) val selectStatement = select(OrderLine.orderId, OrderLine.quantity, ItemMaster.itemId, - ItemMaster.description).from(OrderMaster, "om") { + ItemMaster.description).from(OrderMaster, "om") { join(OrderLine, "ol") { on(OrderMaster.orderId, equalTo(OrderLine.orderId)) } @@ -319,9 +315,9 @@ class JoinMapperTest { } val expectedStatement = "select ol.order_id, ol.quantity, ItemMaster.item_id, ItemMaster.description" + - " from OrderMaster om join OrderLine ol on om.order_id = ol.order_id" + - " left join ItemMaster on ol.item_id = ItemMaster.item_id" + - " order by order_id, item_id" + " from OrderMaster om join OrderLine ol on om.order_id = ol.order_id" + + " left join ItemMaster on ol.item_id = ItemMaster.item_id" + + " order by order_id, item_id" assertThat(selectStatement.selectStatement).isEqualTo(expectedStatement) @@ -351,7 +347,7 @@ class JoinMapperTest { val mapper = session.getMapper(JoinMapper::class.java) val selectStatement = select(OrderLine.orderId, OrderLine.quantity, ItemMaster.itemId, - ItemMaster.description).from(OrderMaster, "om") { + ItemMaster.description).from(OrderMaster, "om") { join(OrderLine, "ol") { on(OrderMaster.orderId, equalTo(OrderLine.orderId)) } @@ -362,9 +358,9 @@ class JoinMapperTest { } val expectedStatement = "select ol.order_id, ol.quantity, im.item_id, im.description" + - " from OrderMaster om join OrderLine ol on om.order_id = ol.order_id" + - " right join ItemMaster im on ol.item_id = im.item_id" + - " order by order_id, item_id" + " from OrderMaster om join OrderLine ol on om.order_id = ol.order_id" + + " right join ItemMaster im on ol.item_id = im.item_id" + + " order by order_id, item_id" assertThat(selectStatement.selectStatement).isEqualTo(expectedStatement) @@ -393,7 +389,7 @@ class JoinMapperTest { val mapper = session.getMapper(JoinMapper::class.java) val selectStatement = select(OrderLine.orderId, OrderLine.quantity, ItemMaster.itemId, - ItemMaster.description).from(OrderMaster, "om") { + ItemMaster.description).from(OrderMaster, "om") { join(OrderLine, "ol") { on(OrderMaster.orderId, equalTo(OrderLine.orderId)) } @@ -404,9 +400,9 @@ class JoinMapperTest { } val expectedStatement = "select ol.order_id, ol.quantity, ItemMaster.item_id, ItemMaster.description" + - " from OrderMaster om join OrderLine ol on om.order_id = ol.order_id" + - " right join ItemMaster on ol.item_id = ItemMaster.item_id" + - " order by order_id, item_id" + " from OrderMaster om join OrderLine ol on om.order_id = ol.order_id" + + " right join ItemMaster on ol.item_id = ItemMaster.item_id" + + " order by order_id, item_id" assertThat(selectStatement.selectStatement).isEqualTo(expectedStatement) From bf5ac7d16d8d41748233c5189c21e746d0397be5 Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Wed, 20 Nov 2019 07:13:14 -0500 Subject: [PATCH 3/8] Optimizing --- .../mybatis/dynamic/sql/delete/DeleteDSL.java | 7 --- .../mybatis/dynamic/sql/select/CountDSL.java | 7 --- .../sql/select/QueryExpressionDSL.java | 6 --- .../mybatis/dynamic/sql/update/UpdateDSL.java | 6 --- .../sql/util/kotlin/KotlinCountBuilder.kt | 44 +++++-------------- .../sql/util/kotlin/KotlinDeleteBuilder.kt | 12 ++--- .../sql/util/kotlin/KotlinQueryBuilder.kt | 44 +++++-------------- .../sql/util/kotlin/KotlinUpdateBuilder.kt | 16 ++----- 8 files changed, 29 insertions(+), 113 deletions(-) diff --git a/src/main/java/org/mybatis/dynamic/sql/delete/DeleteDSL.java b/src/main/java/org/mybatis/dynamic/sql/delete/DeleteDSL.java index 5e53a1772..73bdaad45 100644 --- a/src/main/java/org/mybatis/dynamic/sql/delete/DeleteDSL.java +++ b/src/main/java/org/mybatis/dynamic/sql/delete/DeleteDSL.java @@ -15,7 +15,6 @@ */ package org.mybatis.dynamic.sql.delete; -import java.util.List; import java.util.Objects; import java.util.function.Function; import java.util.function.ToIntFunction; @@ -52,12 +51,6 @@ public DeleteWhereBuilder where(BindableColumn column, VisitableCondition return whereBuilder; } - public DeleteWhereBuilder where(BindableColumn column, VisitableCondition condition, - List> subCriteria) { - whereBuilder.where(column, condition, subCriteria); - return whereBuilder; - } - @SuppressWarnings("unchecked") public DeleteWhereBuilder applyWhere(WhereApplier whereApplier) { return (DeleteWhereBuilder) whereApplier.apply(whereBuilder); diff --git a/src/main/java/org/mybatis/dynamic/sql/select/CountDSL.java b/src/main/java/org/mybatis/dynamic/sql/select/CountDSL.java index 42e104468..8d7f10dcc 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/CountDSL.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/CountDSL.java @@ -15,7 +15,6 @@ */ package org.mybatis.dynamic.sql.select; -import java.util.List; import java.util.Objects; import java.util.function.Function; @@ -58,12 +57,6 @@ public CountWhereBuilder where(BindableColumn column, VisitableCondition< return whereBuilder; } - public CountWhereBuilder where(BindableColumn column, VisitableCondition condition, - List> subCriteria) { - whereBuilder.where(column, condition, subCriteria); - return whereBuilder; - } - @SuppressWarnings("unchecked") public CountWhereBuilder applyWhere(WhereApplier whereApplier) { return (CountWhereBuilder) whereApplier.apply(whereBuilder); diff --git a/src/main/java/org/mybatis/dynamic/sql/select/QueryExpressionDSL.java b/src/main/java/org/mybatis/dynamic/sql/select/QueryExpressionDSL.java index b3d893570..f2daf2491 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/QueryExpressionDSL.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/QueryExpressionDSL.java @@ -69,12 +69,6 @@ public QueryExpressionWhereBuilder where(BindableColumn column, Visitable return whereBuilder; } - public QueryExpressionWhereBuilder where(BindableColumn column, VisitableCondition condition, - List> subCriteria) { - whereBuilder.where(column, condition, subCriteria); - return whereBuilder; - } - @SuppressWarnings("unchecked") public QueryExpressionWhereBuilder applyWhere(WhereApplier whereApplier) { return (QueryExpressionWhereBuilder) whereApplier.apply(whereBuilder); diff --git a/src/main/java/org/mybatis/dynamic/sql/update/UpdateDSL.java b/src/main/java/org/mybatis/dynamic/sql/update/UpdateDSL.java index 6f5fc7305..bcce877cc 100644 --- a/src/main/java/org/mybatis/dynamic/sql/update/UpdateDSL.java +++ b/src/main/java/org/mybatis/dynamic/sql/update/UpdateDSL.java @@ -69,12 +69,6 @@ public UpdateWhereBuilder where(BindableColumn column, VisitableCondition return whereBuilder; } - public UpdateWhereBuilder where(BindableColumn column, VisitableCondition condition, - List> subCriteria) { - whereBuilder.where(column, condition, subCriteria); - return whereBuilder; - } - @SuppressWarnings("unchecked") public UpdateWhereBuilder applyWhere(WhereApplier whereApplier) { return (UpdateWhereBuilder) whereApplier.apply(whereBuilder); diff --git a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinCountBuilder.kt b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinCountBuilder.kt index fac8737f1..d37f217b6 100644 --- a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinCountBuilder.kt +++ b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinCountBuilder.kt @@ -27,58 +27,42 @@ typealias CountCompleter = KotlinCountBuilder.() -> Buildable class KotlinCountBuilder(private val dsl: CountDSL): Buildable { fun join(table: SqlTable, receiver: JoinReceiver) = apply { - val collector = JoinCollector() - receiver(collector) - dsl.join(table, collector.onJoinCriterion, collector.andJoinCriteria) + dsl.join(table, receiver) } fun join(table: SqlTable, alias: String, receiver: JoinReceiver) = apply { - val collector = JoinCollector() - receiver(collector) - dsl.join(table, alias, collector.onJoinCriterion, collector.andJoinCriteria) + dsl.join(table, alias, receiver) } fun fullJoin(table: SqlTable, receiver: JoinReceiver) = apply { - val collector = JoinCollector() - receiver(collector) - dsl.fullJoin(table, collector.onJoinCriterion, collector.andJoinCriteria) + dsl.fullJoin(table, receiver) } fun fullJoin(table: SqlTable, alias: String, receiver: JoinReceiver) = apply { - val collector = JoinCollector() - receiver(collector) - dsl.fullJoin(table, alias, collector.onJoinCriterion, collector.andJoinCriteria) + dsl.fullJoin(table, alias, receiver) } fun leftJoin(table: SqlTable, receiver: JoinReceiver) = apply { - val collector = JoinCollector() - receiver(collector) - dsl.leftJoin(table, collector.onJoinCriterion, collector.andJoinCriteria) + dsl.leftJoin(table, receiver) } fun leftJoin(table: SqlTable, alias: String, receiver: JoinReceiver) = apply { - val collector = JoinCollector() - receiver(collector) - dsl.leftJoin(table, alias, collector.onJoinCriterion, collector.andJoinCriteria) + dsl.leftJoin(table, alias, receiver) } fun rightJoin(table: SqlTable, receiver: JoinReceiver) = apply { - val collector = JoinCollector() - receiver(collector) - dsl.rightJoin(table, collector.onJoinCriterion, collector.andJoinCriteria) + dsl.rightJoin(table, receiver) } fun rightJoin(table: SqlTable, alias: String, receiver: JoinReceiver) = apply { - val collector = JoinCollector() - receiver(collector) - dsl.rightJoin(table, alias, collector.onJoinCriterion, collector.andJoinCriteria) + dsl.rightJoin(table, alias, receiver) } fun where(column: BindableColumn, condition: VisitableCondition) = @@ -88,9 +72,7 @@ class KotlinCountBuilder(private val dsl: CountDSL): Buildable where(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver) = apply { - val collector = CriteriaCollector() - collect(collector) - dsl.where(column, condition, collector.criteria) + dsl.where().where(column, condition, collect) } fun applyWhere(whereApplier: WhereApplier) = @@ -105,9 +87,7 @@ class KotlinCountBuilder(private val dsl: CountDSL): Buildable and(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver) = apply { - val collector = CriteriaCollector() - collect(collector) - dsl.where().and(column, condition, collector.criteria) + dsl.where().and(column, condition, collect) } fun or(column: BindableColumn, condition: VisitableCondition) = @@ -117,9 +97,7 @@ class KotlinCountBuilder(private val dsl: CountDSL): Buildable or(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver) = apply { - val collector = CriteriaCollector() - collect(collector) - dsl.where().or(column, condition, collector.criteria) + dsl.where().or(column, condition, collect) } fun allRows() = this diff --git a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinDeleteBuilder.kt b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinDeleteBuilder.kt index ac8c20f5e..dc4092192 100644 --- a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinDeleteBuilder.kt +++ b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinDeleteBuilder.kt @@ -31,9 +31,7 @@ class KotlinDeleteBuilder(private val dsl: DeleteDSL): Buildable where(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver) = apply { - val collector = CriteriaCollector() - collect(collector) - dsl.where(column, condition, collector.criteria) + dsl.where().where(column, condition, collect) } fun applyWhere(whereApplier: WhereApplier) = @@ -48,9 +46,7 @@ class KotlinDeleteBuilder(private val dsl: DeleteDSL): Buildable and(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver) = apply { - val collector = CriteriaCollector() - collect(collector) - dsl.where().and(column, condition, collector.criteria) + dsl.where().and(column, condition, collect) } fun or(column: BindableColumn, condition: VisitableCondition) = @@ -60,9 +56,7 @@ class KotlinDeleteBuilder(private val dsl: DeleteDSL): Buildable or(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver) = apply { - val collector = CriteriaCollector() - collect(collector) - dsl.where().or(column, condition, collector.criteria) + dsl.where().or(column, condition, collect) } fun allRows() = this diff --git a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinQueryBuilder.kt b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinQueryBuilder.kt index b7be50f2e..783bbc760 100644 --- a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinQueryBuilder.kt +++ b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinQueryBuilder.kt @@ -25,58 +25,42 @@ typealias SelectCompleter = KotlinQueryBuilder.() -> Buildable class KotlinQueryBuilder(private val dsl: QueryExpressionDSL): Buildable { fun join(table: SqlTable, receiver: JoinReceiver) = apply { - val collector = JoinCollector() - receiver(collector) - dsl.join(table, collector.onJoinCriterion, collector.andJoinCriteria) + dsl.join(table, receiver) } fun join(table: SqlTable, alias: String, receiver: JoinReceiver) = apply { - val collector = JoinCollector() - receiver(collector) - dsl.join(table, alias, collector.onJoinCriterion, collector.andJoinCriteria) + dsl.join(table, alias, receiver) } fun fullJoin(table: SqlTable, receiver: JoinReceiver) = apply { - val collector = JoinCollector() - receiver(collector) - dsl.fullJoin(table, collector.onJoinCriterion, collector.andJoinCriteria) + dsl.fullJoin(table, receiver) } fun fullJoin(table: SqlTable, alias: String, receiver: JoinReceiver) = apply { - val collector = JoinCollector() - receiver(collector) - dsl.fullJoin(table, alias, collector.onJoinCriterion, collector.andJoinCriteria) + dsl.fullJoin(table, alias, receiver) } fun leftJoin(table: SqlTable, receiver: JoinReceiver) = apply { - val collector = JoinCollector() - receiver(collector) - dsl.leftJoin(table, collector.onJoinCriterion, collector.andJoinCriteria) + dsl.leftJoin(table, receiver) } fun leftJoin(table: SqlTable, alias: String, receiver: JoinReceiver) = apply { - val collector = JoinCollector() - receiver(collector) - dsl.leftJoin(table, alias, collector.onJoinCriterion, collector.andJoinCriteria) + dsl.leftJoin(table, alias, receiver) } fun rightJoin(table: SqlTable, receiver: JoinReceiver) = apply { - val collector = JoinCollector() - receiver(collector) - dsl.rightJoin(table, collector.onJoinCriterion, collector.andJoinCriteria) + dsl.rightJoin(table, receiver) } fun rightJoin(table: SqlTable, alias: String, receiver: JoinReceiver) = apply { - val collector = JoinCollector() - receiver(collector) - dsl.rightJoin(table, alias, collector.onJoinCriterion, collector.andJoinCriteria) + dsl.rightJoin(table, alias, receiver) } fun where(column: BindableColumn, condition: VisitableCondition) = @@ -86,9 +70,7 @@ class KotlinQueryBuilder(private val dsl: QueryExpressionDSL): Buil fun where(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver) = apply { - val collector = CriteriaCollector() - collect(collector) - dsl.where(column, condition, collector.criteria) + dsl.where().where(column, condition, collect) } fun applyWhere(whereApplier: WhereApplier) = @@ -103,9 +85,7 @@ class KotlinQueryBuilder(private val dsl: QueryExpressionDSL): Buil fun and(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver) = apply { - val collector = CriteriaCollector() - collect(collector) - dsl.where().and(column, condition, collector.criteria) + dsl.where().and(column, condition, collect) } fun or(column: BindableColumn, condition: VisitableCondition) = @@ -115,9 +95,7 @@ class KotlinQueryBuilder(private val dsl: QueryExpressionDSL): Buil fun or(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver) = apply { - val collector = CriteriaCollector() - collect(collector) - dsl.where().or(column, condition, collector.criteria) + dsl.where().or(column, condition, collect) } fun groupBy(vararg columns: BasicColumn) = diff --git a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinUpdateBuilder.kt b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinUpdateBuilder.kt index eac4216ec..14d21e0f1 100644 --- a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinUpdateBuilder.kt +++ b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinUpdateBuilder.kt @@ -39,9 +39,7 @@ class KotlinUpdateBuilder(private val dsl: UpdateDSL) : Buildable where(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver) = apply { - val collector = CriteriaCollector() - collect(collector) - dsl.where(column, condition, collector.criteria) + dsl.where().where(column, condition, collect) } fun applyWhere(whereApplier: WhereApplier) = @@ -56,9 +54,7 @@ class KotlinUpdateBuilder(private val dsl: UpdateDSL) : Buildable and(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver) = apply { - val collector = CriteriaCollector() - collect(collector) - dsl.where().and(column, condition, collector.criteria) + dsl.where().and(column, condition, collect) } fun or(column: BindableColumn, condition: VisitableCondition) = @@ -68,14 +64,10 @@ class KotlinUpdateBuilder(private val dsl: UpdateDSL) : Buildable or(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver) = apply { - val collector = CriteriaCollector() - collect(collector) - dsl.where().or(column, condition, collector.criteria) + dsl.where().or(column, condition, collect) } - fun set(column: SqlColumn): UpdateDSL.SetClauseFinisher { - return dsl.set(column) - } + fun set(column: SqlColumn): UpdateDSL.SetClauseFinisher = dsl.set(column) override fun build(): UpdateModel = dsl.build() } From c48a1d261da4d5505d18940f9b1a55942816c3e7 Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Wed, 20 Nov 2019 18:16:23 -0500 Subject: [PATCH 4/8] Optimizing --- pom.xml | 1 + .../mybatis/dynamic/sql/delete/DeleteDSL.java | 5 +- .../mybatis/dynamic/sql/select/CountDSL.java | 3 +- .../sql/select/QueryExpressionDSL.java | 3 +- .../mybatis/dynamic/sql/update/UpdateDSL.java | 3 +- .../dynamic/sql/where/AbstractWhereDSL.java | 7 +- .../sql/util/kotlin/KotlinBaseBuilders.kt | 108 ++++++++++++++++++ .../sql/util/kotlin/KotlinCountBuilder.kt | 84 +------------- .../sql/util/kotlin/KotlinDeleteBuilder.kt | 43 +------ .../sql/util/kotlin/KotlinQueryBuilder.kt | 87 ++------------ .../sql/util/kotlin/KotlinUpdateBuilder.kt | 43 +------ .../kotlin/spring/ProviderBuilderFunctions.kt | 6 - .../mybatis3/canonical/PersonMapperTest.kt | 2 +- .../mybatis3/general/GeneralKotlinTest.kt | 25 ++++ 14 files changed, 172 insertions(+), 248 deletions(-) create mode 100644 src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinBaseBuilders.kt diff --git a/pom.xml b/pom.xml index 959a3f20f..e32208cad 100644 --- a/pom.xml +++ b/pom.xml @@ -43,6 +43,7 @@ pom.xml,src/main/java,src/main/kotlin src/test/java,src/test/kotlin 0.8.4 + official diff --git a/src/main/java/org/mybatis/dynamic/sql/delete/DeleteDSL.java b/src/main/java/org/mybatis/dynamic/sql/delete/DeleteDSL.java index 73bdaad45..231e21398 100644 --- a/src/main/java/org/mybatis/dynamic/sql/delete/DeleteDSL.java +++ b/src/main/java/org/mybatis/dynamic/sql/delete/DeleteDSL.java @@ -51,9 +51,8 @@ public DeleteWhereBuilder where(BindableColumn column, VisitableCondition return whereBuilder; } - @SuppressWarnings("unchecked") public DeleteWhereBuilder applyWhere(WhereApplier whereApplier) { - return (DeleteWhereBuilder) whereApplier.apply(whereBuilder); + return whereBuilder.applyWhere(whereApplier); } /** @@ -99,7 +98,7 @@ public class DeleteWhereBuilder extends AbstractWhereDSL imp private DeleteWhereBuilder() { super(); } - + @Override public R build() { return DeleteDSL.this.build(); diff --git a/src/main/java/org/mybatis/dynamic/sql/select/CountDSL.java b/src/main/java/org/mybatis/dynamic/sql/select/CountDSL.java index 8d7f10dcc..00f25b307 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/CountDSL.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/CountDSL.java @@ -57,9 +57,8 @@ public CountWhereBuilder where(BindableColumn column, VisitableCondition< return whereBuilder; } - @SuppressWarnings("unchecked") public CountWhereBuilder applyWhere(WhereApplier whereApplier) { - return (CountWhereBuilder) whereApplier.apply(whereBuilder); + return whereBuilder.applyWhere(whereApplier); } @Override diff --git a/src/main/java/org/mybatis/dynamic/sql/select/QueryExpressionDSL.java b/src/main/java/org/mybatis/dynamic/sql/select/QueryExpressionDSL.java index f2daf2491..1a32f1fc8 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/QueryExpressionDSL.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/QueryExpressionDSL.java @@ -69,9 +69,8 @@ public QueryExpressionWhereBuilder where(BindableColumn column, Visitable return whereBuilder; } - @SuppressWarnings("unchecked") public QueryExpressionWhereBuilder applyWhere(WhereApplier whereApplier) { - return (QueryExpressionWhereBuilder) whereApplier.apply(whereBuilder); + return whereBuilder.applyWhere(whereApplier); } @Override diff --git a/src/main/java/org/mybatis/dynamic/sql/update/UpdateDSL.java b/src/main/java/org/mybatis/dynamic/sql/update/UpdateDSL.java index bcce877cc..7980eb697 100644 --- a/src/main/java/org/mybatis/dynamic/sql/update/UpdateDSL.java +++ b/src/main/java/org/mybatis/dynamic/sql/update/UpdateDSL.java @@ -69,9 +69,8 @@ public UpdateWhereBuilder where(BindableColumn column, VisitableCondition return whereBuilder; } - @SuppressWarnings("unchecked") public UpdateWhereBuilder applyWhere(WhereApplier whereApplier) { - return (UpdateWhereBuilder) whereApplier.apply(whereBuilder); + return whereBuilder.applyWhere(whereApplier); } /** diff --git a/src/main/java/org/mybatis/dynamic/sql/where/AbstractWhereDSL.java b/src/main/java/org/mybatis/dynamic/sql/where/AbstractWhereDSL.java index 45c55d6cb..c75417d4f 100644 --- a/src/main/java/org/mybatis/dynamic/sql/where/AbstractWhereDSL.java +++ b/src/main/java/org/mybatis/dynamic/sql/where/AbstractWhereDSL.java @@ -44,7 +44,12 @@ public T where(BindableColumn column, VisitableCondition condition, Li addCriterion(column, condition, subCriteria); return getThis(); } - + + @SuppressWarnings("unchecked") + public T applyWhere(WhereApplier whereApplier) { + return (T) whereApplier.apply(this); + } + public T and(BindableColumn column, VisitableCondition condition) { addCriterion("and", column, condition); //$NON-NLS-1$ return getThis(); diff --git a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinBaseBuilders.kt b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinBaseBuilders.kt new file mode 100644 index 000000000..c26e96935 --- /dev/null +++ b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinBaseBuilders.kt @@ -0,0 +1,108 @@ +/** + * Copyright 2016-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.mybatis.dynamic.sql.util.kotlin + +import org.mybatis.dynamic.sql.BindableColumn +import org.mybatis.dynamic.sql.SqlTable +import org.mybatis.dynamic.sql.VisitableCondition +import org.mybatis.dynamic.sql.select.AbstractQueryExpressionDSL +import org.mybatis.dynamic.sql.select.SelectModel +import org.mybatis.dynamic.sql.util.Buildable +import org.mybatis.dynamic.sql.where.AbstractWhereDSL + +abstract class KotlinBaseBuilder, B : KotlinBaseBuilder> : Buildable { + fun where(column: BindableColumn, condition: VisitableCondition): B { + getWhere().where(column, condition) + return getThis() + } + + fun where(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver): B { + getWhere().where(column, condition, collect) + return getThis() + } + + fun applyWhere(whereApplier: WhereApplier): B { + getWhere().applyWhere(whereApplier) + return getThis() + } + + fun and(column: BindableColumn, condition: VisitableCondition): B { + getWhere().and(column, condition) + return getThis() + } + + fun and(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver): B { + getWhere().and(column, condition, collect) + return getThis() + } + + fun or(column: BindableColumn, condition: VisitableCondition): B { + getWhere().or(column, condition) + return getThis() + } + + fun or(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver): B { + getWhere().or(column, condition, collect) + return getThis() + } + + protected abstract fun getWhere(): W + protected abstract fun getThis(): B +} + +abstract class KotlinBaseJoiningBuilder, W: AbstractWhereDSL, B : KotlinBaseJoiningBuilder>(private val dsl: AbstractQueryExpressionDSL) : + KotlinBaseBuilder() { + + fun join(table: SqlTable, receiver: JoinReceiver) = + apply { + dsl.join(table, receiver) + } + + fun join(table: SqlTable, alias: String, receiver: JoinReceiver) = + apply { + dsl.join(table, alias, receiver) + } + + fun fullJoin(table: SqlTable, receiver: JoinReceiver) = + apply { + dsl.fullJoin(table, receiver) + } + + fun fullJoin(table: SqlTable, alias: String, receiver: JoinReceiver) = + apply { + dsl.fullJoin(table, alias, receiver) + } + + fun leftJoin(table: SqlTable, receiver: JoinReceiver) = + apply { + dsl.leftJoin(table, receiver) + } + + fun leftJoin(table: SqlTable, alias: String, receiver: JoinReceiver) = + apply { + dsl.leftJoin(table, alias, receiver) + } + + fun rightJoin(table: SqlTable, receiver: JoinReceiver) = + apply { + dsl.rightJoin(table, receiver) + } + + fun rightJoin(table: SqlTable, alias: String, receiver: JoinReceiver) = + apply { + dsl.rightJoin(table, alias, receiver) + } +} diff --git a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinCountBuilder.kt b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinCountBuilder.kt index d37f217b6..17149aa7d 100644 --- a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinCountBuilder.kt +++ b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinCountBuilder.kt @@ -15,92 +15,20 @@ */ package org.mybatis.dynamic.sql.util.kotlin -import org.mybatis.dynamic.sql.BindableColumn -import org.mybatis.dynamic.sql.SqlTable -import org.mybatis.dynamic.sql.VisitableCondition import org.mybatis.dynamic.sql.select.CountDSL import org.mybatis.dynamic.sql.select.SelectModel import org.mybatis.dynamic.sql.util.Buildable typealias CountCompleter = KotlinCountBuilder.() -> Buildable -class KotlinCountBuilder(private val dsl: CountDSL): Buildable { - fun join(table: SqlTable, receiver: JoinReceiver) = - apply { - dsl.join(table, receiver) - } +class KotlinCountBuilder(private val dsl: CountDSL) : + KotlinBaseJoiningBuilder, CountDSL.CountWhereBuilder, KotlinCountBuilder>(dsl) { - fun join(table: SqlTable, alias: String, receiver: JoinReceiver) = - apply { - dsl.join(table, alias, receiver) - } - - fun fullJoin(table: SqlTable, receiver: JoinReceiver) = - apply { - dsl.fullJoin(table, receiver) - } - - fun fullJoin(table: SqlTable, alias: String, receiver: JoinReceiver) = - apply { - dsl.fullJoin(table, alias, receiver) - } - - fun leftJoin(table: SqlTable, receiver: JoinReceiver) = - apply { - dsl.leftJoin(table, receiver) - } - - fun leftJoin(table: SqlTable, alias: String, receiver: JoinReceiver) = - apply { - dsl.leftJoin(table, alias, receiver) - } - - fun rightJoin(table: SqlTable, receiver: JoinReceiver) = - apply { - dsl.rightJoin(table, receiver) - } - - fun rightJoin(table: SqlTable, alias: String, receiver: JoinReceiver) = - apply { - dsl.rightJoin(table, alias, receiver) - } - - fun where(column: BindableColumn, condition: VisitableCondition) = - apply { - dsl.where(column, condition) - } - - fun where(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver) = - apply { - dsl.where().where(column, condition, collect) - } - - fun applyWhere(whereApplier: WhereApplier) = - apply { - dsl.applyWhere(whereApplier) - } - - fun and(column: BindableColumn, condition: VisitableCondition) = - apply { - dsl.where().and(column, condition) - } - - fun and(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver) = - apply { - dsl.where().and(column, condition, collect) - } - - fun or(column: BindableColumn, condition: VisitableCondition) = - apply { - dsl.where().or(column, condition) - } + fun allRows() = this - fun or(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver) = - apply { - dsl.where().or(column, condition, collect) - } + override fun build(): SelectModel = dsl.build() - fun allRows() = this + override fun getWhere(): CountDSL.CountWhereBuilder = dsl.where() - override fun build(): SelectModel = dsl.build() + override fun getThis() = this } diff --git a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinDeleteBuilder.kt b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinDeleteBuilder.kt index dc4092192..cdf4bd4d7 100644 --- a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinDeleteBuilder.kt +++ b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinDeleteBuilder.kt @@ -15,51 +15,20 @@ */ package org.mybatis.dynamic.sql.util.kotlin -import org.mybatis.dynamic.sql.BindableColumn -import org.mybatis.dynamic.sql.VisitableCondition import org.mybatis.dynamic.sql.delete.DeleteDSL import org.mybatis.dynamic.sql.delete.DeleteModel import org.mybatis.dynamic.sql.util.Buildable typealias DeleteCompleter = KotlinDeleteBuilder.() -> Buildable -class KotlinDeleteBuilder(private val dsl: DeleteDSL): Buildable { - fun where(column: BindableColumn, condition: VisitableCondition) = - apply { - dsl.where(column, condition) - } - - fun where(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver) = - apply { - dsl.where().where(column, condition, collect) - } - - fun applyWhere(whereApplier: WhereApplier) = - apply { - dsl.applyWhere(whereApplier) - } - - fun and(column: BindableColumn, condition: VisitableCondition) = - apply { - dsl.where().and(column, condition) - } - - fun and(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver) = - apply { - dsl.where().and(column, condition, collect) - } - - fun or(column: BindableColumn, condition: VisitableCondition) = - apply { - dsl.where().or(column, condition) - } - - fun or(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver) = - apply { - dsl.where().or(column, condition, collect) - } +class KotlinDeleteBuilder(private val dsl: DeleteDSL) : + KotlinBaseBuilder.DeleteWhereBuilder, KotlinDeleteBuilder>() { fun allRows() = this override fun build(): DeleteModel = dsl.build() + + override fun getWhere(): DeleteDSL.DeleteWhereBuilder = dsl.where() + + override fun getThis(): KotlinDeleteBuilder = this } diff --git a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinQueryBuilder.kt b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinQueryBuilder.kt index 783bbc760..5338eda3a 100644 --- a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinQueryBuilder.kt +++ b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinQueryBuilder.kt @@ -17,86 +17,14 @@ package org.mybatis.dynamic.sql.util.kotlin import org.mybatis.dynamic.sql.* import org.mybatis.dynamic.sql.select.QueryExpressionDSL +import org.mybatis.dynamic.sql.select.SelectDSL import org.mybatis.dynamic.sql.select.SelectModel import org.mybatis.dynamic.sql.util.Buildable typealias SelectCompleter = KotlinQueryBuilder.() -> Buildable -class KotlinQueryBuilder(private val dsl: QueryExpressionDSL): Buildable { - fun join(table: SqlTable, receiver: JoinReceiver) = - apply { - dsl.join(table, receiver) - } - - fun join(table: SqlTable, alias: String, receiver: JoinReceiver) = - apply { - dsl.join(table, alias, receiver) - } - - fun fullJoin(table: SqlTable, receiver: JoinReceiver) = - apply { - dsl.fullJoin(table, receiver) - } - - fun fullJoin(table: SqlTable, alias: String, receiver: JoinReceiver) = - apply { - dsl.fullJoin(table, alias, receiver) - } - - fun leftJoin(table: SqlTable, receiver: JoinReceiver) = - apply { - dsl.leftJoin(table, receiver) - } - - fun leftJoin(table: SqlTable, alias: String, receiver: JoinReceiver) = - apply { - dsl.leftJoin(table, alias, receiver) - } - - fun rightJoin(table: SqlTable, receiver: JoinReceiver) = - apply { - dsl.rightJoin(table, receiver) - } - - fun rightJoin(table: SqlTable, alias: String, receiver: JoinReceiver) = - apply { - dsl.rightJoin(table, alias, receiver) - } - - fun where(column: BindableColumn, condition: VisitableCondition) = - apply { - dsl.where(column, condition) - } - - fun where(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver) = - apply { - dsl.where().where(column, condition, collect) - } - - fun applyWhere(whereApplier: WhereApplier) = - apply { - dsl.applyWhere(whereApplier) - } - - fun and(column: BindableColumn, condition: VisitableCondition) = - apply { - dsl.where().and(column, condition) - } - - fun and(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver) = - apply { - dsl.where().and(column, condition, collect) - } - - fun or(column: BindableColumn, condition: VisitableCondition) = - apply { - dsl.where().or(column, condition) - } - - fun or(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver) = - apply { - dsl.where().or(column, condition, collect) - } +class KotlinQueryBuilder(private val dsl: QueryExpressionDSL) : + KotlinBaseJoiningBuilder, QueryExpressionDSL.QueryExpressionWhereBuilder, KotlinQueryBuilder>(dsl) { fun groupBy(vararg columns: BasicColumn) = apply { @@ -118,12 +46,13 @@ class KotlinQueryBuilder(private val dsl: QueryExpressionDSL): Buil dsl.offset(offset) } - fun fetchFirst(fetchFirstRows: Long) = - apply { - dsl.fetchFirst(fetchFirstRows) - } + fun fetchFirst(fetchFirstRows: Long): SelectDSL.FetchFirstFinisher = dsl.fetchFirst(fetchFirstRows) fun allRows() = this override fun build(): SelectModel = dsl.build() + + override fun getWhere(): QueryExpressionDSL.QueryExpressionWhereBuilder = dsl.where() + + override fun getThis() = this } diff --git a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinUpdateBuilder.kt b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinUpdateBuilder.kt index 14d21e0f1..e7dc3beb8 100644 --- a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinUpdateBuilder.kt +++ b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/KotlinUpdateBuilder.kt @@ -15,9 +15,7 @@ */ package org.mybatis.dynamic.sql.util.kotlin -import org.mybatis.dynamic.sql.BindableColumn import org.mybatis.dynamic.sql.SqlColumn -import org.mybatis.dynamic.sql.VisitableCondition import org.mybatis.dynamic.sql.insert.InsertDSL import org.mybatis.dynamic.sql.insert.MultiRowInsertDSL import org.mybatis.dynamic.sql.update.UpdateDSL @@ -31,43 +29,14 @@ typealias MultiRowInsertCompleter = MultiRowInsertDSL.() -> MultiRowInsert typealias UpdateCompleter = KotlinUpdateBuilder.() -> Buildable -class KotlinUpdateBuilder(private val dsl: UpdateDSL) : Buildable { - fun where(column: BindableColumn, condition: VisitableCondition) = - apply { - dsl.where(column, condition) - } - - fun where(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver) = - apply { - dsl.where().where(column, condition, collect) - } - - fun applyWhere(whereApplier: WhereApplier) = - apply { - dsl.applyWhere(whereApplier) - } - - fun and(column: BindableColumn, condition: VisitableCondition) = - apply { - dsl.where().and(column, condition) - } - - fun and(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver) = - apply { - dsl.where().and(column, condition, collect) - } - - fun or(column: BindableColumn, condition: VisitableCondition) = - apply { - dsl.where().or(column, condition) - } - - fun or(column: BindableColumn, condition: VisitableCondition, collect: CriteriaReceiver) = - apply { - dsl.where().or(column, condition, collect) - } +class KotlinUpdateBuilder(private val dsl: UpdateDSL) : + KotlinBaseBuilder.UpdateWhereBuilder, KotlinUpdateBuilder>() { fun set(column: SqlColumn): UpdateDSL.SetClauseFinisher = dsl.set(column) override fun build(): UpdateModel = dsl.build() + + override fun getWhere(): UpdateDSL.UpdateWhereBuilder = dsl.where() + + override fun getThis(): KotlinUpdateBuilder = this } diff --git a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/spring/ProviderBuilderFunctions.kt b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/spring/ProviderBuilderFunctions.kt index 116d6154b..e3a032135 100644 --- a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/spring/ProviderBuilderFunctions.kt +++ b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/spring/ProviderBuilderFunctions.kt @@ -54,12 +54,6 @@ fun QueryExpressionDSL.FromGatherer.from(table: SqlTable, alias: St return builder.build().render(RenderingStrategies.SPRING_NAMED_PARAMETER) } -fun select(start: QueryExpressionDSL, completer: SelectCompleter): SelectStatementProvider { - val builder = KotlinQueryBuilder(start) - completer(builder) - return builder.build().render(RenderingStrategies.SPRING_NAMED_PARAMETER) -} - fun update(table: SqlTable, completer: UpdateCompleter): UpdateStatementProvider { val builder = KotlinUpdateBuilder(SqlBuilder.update(table)) completer(builder) diff --git a/src/test/kotlin/examples/kotlin/mybatis3/canonical/PersonMapperTest.kt b/src/test/kotlin/examples/kotlin/mybatis3/canonical/PersonMapperTest.kt index 2170c607e..204e9ca26 100644 --- a/src/test/kotlin/examples/kotlin/mybatis3/canonical/PersonMapperTest.kt +++ b/src/test/kotlin/examples/kotlin/mybatis3/canonical/PersonMapperTest.kt @@ -456,7 +456,7 @@ class PersonMapperTest { newSession().use { session -> val mapper = session.getMapper(PersonMapper::class.java) - val rows = mapper.count { allRows() } + val rows = mapper.count { allRows() } assertThat(rows).isEqualTo(6L) } diff --git a/src/test/kotlin/examples/kotlin/mybatis3/general/GeneralKotlinTest.kt b/src/test/kotlin/examples/kotlin/mybatis3/general/GeneralKotlinTest.kt index ac8bfde0f..4b6aa9b0f 100644 --- a/src/test/kotlin/examples/kotlin/mybatis3/general/GeneralKotlinTest.kt +++ b/src/test/kotlin/examples/kotlin/mybatis3/general/GeneralKotlinTest.kt @@ -547,6 +547,31 @@ class GeneralKotlinTest { } } + @Test + fun testSelectWithFetchFirst() { + newSession().use { session -> + val mapper = session.getMapper(PersonMapper::class.java) + + val rows = mapper.select { + allRows() + orderBy(id) + offset(2) + fetchFirst(3).rowsOnly() + } + + assertThat(rows.size).isEqualTo(3) + with(rows[0]) { + assertThat(id).isEqualTo(3) + assertThat(firstName).isEqualTo("Pebbles") + assertThat(lastName?.name).isEqualTo("Flintstone") + assertThat(birthDate).isNotNull() + assertThat(employed).isFalse() + assertThat(occupation).isNull() + assertThat(addressId).isEqualTo(1) + } + } + } + @Test fun testRawUpdate1() { newSession().use { session -> From acdd4a225fc0b1065418d385b2367486d94f37dc Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Wed, 20 Nov 2019 19:45:34 -0500 Subject: [PATCH 5/8] Coverage --- .../mybatis3/canonical/PersonMapperTest.kt | 2 +- .../mybatis3/general/GeneralKotlinTest.kt | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/test/kotlin/examples/kotlin/mybatis3/canonical/PersonMapperTest.kt b/src/test/kotlin/examples/kotlin/mybatis3/canonical/PersonMapperTest.kt index 204e9ca26..2170c607e 100644 --- a/src/test/kotlin/examples/kotlin/mybatis3/canonical/PersonMapperTest.kt +++ b/src/test/kotlin/examples/kotlin/mybatis3/canonical/PersonMapperTest.kt @@ -456,7 +456,7 @@ class PersonMapperTest { newSession().use { session -> val mapper = session.getMapper(PersonMapper::class.java) - val rows = mapper.count { allRows() } + val rows = mapper.count { allRows() } assertThat(rows).isEqualTo(6L) } diff --git a/src/test/kotlin/examples/kotlin/mybatis3/general/GeneralKotlinTest.kt b/src/test/kotlin/examples/kotlin/mybatis3/general/GeneralKotlinTest.kt index 4b6aa9b0f..866e419f2 100644 --- a/src/test/kotlin/examples/kotlin/mybatis3/general/GeneralKotlinTest.kt +++ b/src/test/kotlin/examples/kotlin/mybatis3/general/GeneralKotlinTest.kt @@ -572,6 +572,24 @@ class GeneralKotlinTest { } } + @Test + fun testRawSelectWithGroupBy() { + + val ss = select(lastName, count()) + .from(Person) { + where(firstName, isNotEqualTo("Bamm Bamm")) + groupBy(lastName) + orderBy(lastName) + } + + val expected = "select last_name, count(*) from Person " + + "where first_name <> #{parameters.p1,jdbcType=VARCHAR} " + + "group by last_name " + + "order by last_name" + + assertThat(ss.selectStatement).isEqualTo(expected) + } + @Test fun testRawUpdate1() { newSession().use { session -> From 451cad6cfc39a9564dbb92b880c9e10471b76ac2 Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Wed, 20 Nov 2019 19:57:49 -0500 Subject: [PATCH 6/8] Documentation --- src/site/markdown/docs/kotlinMyBatis3.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/site/markdown/docs/kotlinMyBatis3.md b/src/site/markdown/docs/kotlinMyBatis3.md index 59a06fabd..f546d3d23 100644 --- a/src/site/markdown/docs/kotlinMyBatis3.md +++ b/src/site/markdown/docs/kotlinMyBatis3.md @@ -340,7 +340,7 @@ val rows = mapper.update { It is also possible to write a utility method that will set values. For example: ```kotlin -fun UpdateDSL.updateSelectiveColumns(record: PersonRecord) = +fun KotlinUpdateBuilder.updateSelectiveColumns(record: PersonRecord) = apply { set(id).equalToWhenPresent(record::id) set(firstName).equalToWhenPresent(record::firstName) From 13d262170beda0d3bc0411d332fc48612ab53736 Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Wed, 20 Nov 2019 20:30:57 -0500 Subject: [PATCH 7/8] Documentation --- CHANGELOG.md | 2 +- src/site/markdown/docs/kotlinSpring.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e3bbace15..b310ac446 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ GitHub milestone: [https://github.com/mybatis/mybatis-dynamic-sql/issues?q=miles ### Added - Added support for reusing WHERE clauses among count, delete, select, and update statements ([#152](https://github.com/mybatis/mybatis-dynamic-sql/pull/152)) - +- Improved Kotlin support. Previously, several overloaded methods could collide causing queries to be fragile and very dependent on having the correct imports in a Kotlin file. With this improved support there is no longer any ambiguity. ### Bugs Fixed diff --git a/src/site/markdown/docs/kotlinSpring.md b/src/site/markdown/docs/kotlinSpring.md index 2d1d68e1c..25b6567fa 100644 --- a/src/site/markdown/docs/kotlinSpring.md +++ b/src/site/markdown/docs/kotlinSpring.md @@ -280,7 +280,7 @@ This is the two step execution process. This can be combined into a single step } ``` -There a many different set mappings the allow setting values to null, constantats, etc. There is also a maping that will only set the column value if the passed value is non null. +There a many different set mappings the allow setting values to null, constants, etc. There is also a mapping that will only set the column value if the passed value is non null. If you wish to update all rows in a table, simply omit the where clause: From 3fa8862fb47bfa7801a4087b6c79a6b8d8a64dda Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Wed, 20 Nov 2019 20:40:33 -0500 Subject: [PATCH 8/8] Add link to GH Pull Request --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b310ac446..ba97b68ff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ GitHub milestone: [https://github.com/mybatis/mybatis-dynamic-sql/issues?q=miles ### Added - Added support for reusing WHERE clauses among count, delete, select, and update statements ([#152](https://github.com/mybatis/mybatis-dynamic-sql/pull/152)) -- Improved Kotlin support. Previously, several overloaded methods could collide causing queries to be fragile and very dependent on having the correct imports in a Kotlin file. With this improved support there is no longer any ambiguity. +- Improved Kotlin support. Previously, several overloaded methods could collide causing queries to be fragile and very dependent on having the correct imports in a Kotlin file. With this improved support there is no longer any ambiguity. ([#154](https://github.com/mybatis/mybatis-dynamic-sql/pull/154)) ### Bugs Fixed