Skip to content

Commit b84523d

Browse files
Merge pull request #12 from vincentlauvlwj/entity-sequence
Entity sequence
2 parents 47ef102 + a590342 commit b84523d

File tree

18 files changed

+1112
-223
lines changed

18 files changed

+1112
-223
lines changed

.travis.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11

22
language: java
33

4+
env:
5+
- GRADLE_OPTS="-Xms2048m -Xmx2048m"
6+
47
services:
58
- mysql
69

Lines changed: 29 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package me.liuwj.ktorm.dsl
22

3-
import me.liuwj.ktorm.database.Database
4-
import me.liuwj.ktorm.database.prepareStatement
5-
import me.liuwj.ktorm.expression.*
3+
import me.liuwj.ktorm.entity.*
4+
import me.liuwj.ktorm.expression.AggregateExpression
5+
import me.liuwj.ktorm.expression.AggregateType
66
import me.liuwj.ktorm.schema.ColumnDeclaring
77
import me.liuwj.ktorm.schema.DoubleSqlType
88
import me.liuwj.ktorm.schema.IntSqlType
@@ -40,142 +40,87 @@ fun <C : Number> sumDistinct(column: ColumnDeclaring<C>): AggregateExpression<C>
4040
return AggregateExpression(AggregateType.SUM, column.asExpression(), true, column.sqlType)
4141
}
4242

43-
fun <C : Any> count(column: ColumnDeclaring<C>): AggregateExpression<Int> {
44-
return AggregateExpression(AggregateType.COUNT, column.asExpression(), false, IntSqlType)
43+
fun count(column: ColumnDeclaring<*>? = null): AggregateExpression<Int> {
44+
return AggregateExpression(AggregateType.COUNT, column?.asExpression(), false, IntSqlType)
4545
}
4646

47-
fun <C : Any> countDistinct(column: ColumnDeclaring<C>): AggregateExpression<Int> {
48-
return AggregateExpression(AggregateType.COUNT, column.asExpression(), true, IntSqlType)
47+
fun countDistinct(column: ColumnDeclaring<*>? = null): AggregateExpression<Int> {
48+
return AggregateExpression(AggregateType.COUNT, column?.asExpression(), true, IntSqlType)
4949
}
5050

5151
/**
5252
* 如果表中的所有行都符合指定条件,返回 true,否则 false
5353
*/
54-
fun <T : Table<*>> T.all(block: (T) -> ScalarExpression<Boolean>): Boolean {
55-
return none { !block(this) }
54+
inline fun <E : Entity<E>, T : Table<E>> T.all(predicate: (T) -> ColumnDeclaring<Boolean>): Boolean {
55+
return asSequence().all(predicate)
5656
}
5757

5858
/**
5959
* 如果表中有数据,返回 true,否则 false
6060
*/
61-
fun Table<*>.any(): Boolean {
62-
return count() > 0
61+
fun <E : Entity<E>, T : Table<E>> T.any(): Boolean {
62+
return asSequence().any()
6363
}
6464

6565
/**
6666
* 如果表中存在任何一条记录满足指定条件,返回 true,否则 false
6767
*/
68-
fun <T : Table<*>> T.any(block: (T) -> ScalarExpression<Boolean>): Boolean {
69-
return count(block) > 0
68+
inline fun <E : Entity<E>, T : Table<E>> T.any(predicate: (T) -> ColumnDeclaring<Boolean>): Boolean {
69+
return asSequence().any(predicate)
7070
}
7171

7272
/**
7373
* 如果表中没有数据,返回 true,否则 false
7474
*/
75-
fun Table<*>.none(): Boolean {
76-
return count() == 0
75+
fun <E : Entity<E>, T : Table<E>> T.none(): Boolean {
76+
return asSequence().none()
7777
}
7878

7979
/**
8080
* 如果表中所有记录都不满足指定条件,返回 true,否则 false
8181
*/
82-
fun <T : Table<*>> T.none(block: (T) -> ScalarExpression<Boolean>): Boolean {
83-
return count(block) == 0
82+
inline fun <E : Entity<E>, T : Table<E>> T.none(predicate: (T) -> ColumnDeclaring<Boolean>): Boolean {
83+
return asSequence().none(predicate)
8484
}
8585

8686
/**
8787
* 返回表中的记录数
8888
*/
89-
fun Table<*>.count(): Int {
90-
return doCount(null)
89+
fun <E : Entity<E>, T : Table<E>> T.count(): Int {
90+
return asSequence().count()
9191
}
9292

9393
/**
9494
* 返回表中满足指定条件的记录数
9595
*/
96-
fun <T : Table<*>> T.count(block: (T) -> ScalarExpression<Boolean>): Int {
97-
return doCount(block)
98-
}
99-
100-
private fun <T : Table<*>> T.doCount(block: ((T) -> ScalarExpression<Boolean>)?): Int {
101-
val expression = SelectExpression(
102-
columns = listOf(
103-
ColumnDeclaringExpression(
104-
expression = AggregateExpression(
105-
type = AggregateType.COUNT,
106-
argument = null,
107-
isDistinct = false,
108-
sqlType = IntSqlType
109-
)
110-
)
111-
),
112-
from = this.asExpression(),
113-
where = block?.invoke(this)
114-
)
115-
116-
expression.prepareStatement { statement, logger ->
117-
statement.executeQuery().use { rs ->
118-
if (rs.next()) {
119-
return rs.getInt(1).also { logger.debug("Count: {}", it) }
120-
} else {
121-
val (sql, _) = Database.global.formatExpression(expression, beautifySql = true)
122-
throw IllegalStateException("No result return for sql: $sql")
123-
}
124-
}
125-
}
96+
inline fun <E : Entity<E>, T : Table<E>> T.count(predicate: (T) -> ColumnDeclaring<Boolean>): Int {
97+
return asSequence().count(predicate)
12698
}
12799

128100
/**
129101
* 返回表中指定字段的和,若表中没有数据,返回 null
130102
*/
131-
fun <T : Table<*>, C : Number> T.sumBy(block: (T) -> ColumnDeclaring<C>): C? {
132-
return doAggregation(sum(block(this)))
103+
inline fun <E : Entity<E>, T : Table<E>, C : Number> T.sumBy(selector: (T) -> ColumnDeclaring<C>): C? {
104+
return asSequence().sumBy(selector)
133105
}
134106

135107
/**
136108
* 返回表中指定字段的最大值,若表中没有数据,返回 null
137109
*/
138-
fun <T : Table<*>, C : Number> T.maxBy(block: (T) -> ColumnDeclaring<C>): C? {
139-
return doAggregation(max(block(this)))
110+
inline fun <E : Entity<E>, T : Table<E>, C : Number> T.maxBy(selector: (T) -> ColumnDeclaring<C>): C? {
111+
return asSequence().maxBy(selector)
140112
}
141113

142114
/**
143115
* 返回表中指定字段的最小值,若表中没有数据,返回 null
144116
*/
145-
fun <T : Table<*>, C : Number> T.minBy(block: (T) -> ColumnDeclaring<C>): C? {
146-
return doAggregation(min(block(this)))
117+
inline fun <E : Entity<E>, T : Table<E>, C : Number> T.minBy(selector: (T) -> ColumnDeclaring<C>): C? {
118+
return asSequence().minBy(selector)
147119
}
148120

149121
/**
150122
* 返回表中指定字段的平均值,若表中没有数据,返回 null
151123
*/
152-
fun <T : Table<*>> T.avgBy(block: (T) -> ColumnDeclaring<out Number>): Double? {
153-
return doAggregation(avg(block(this)))
154-
}
155-
156-
private fun <R : Number> Table<*>.doAggregation(aggregation: AggregateExpression<R>): R? {
157-
val expression = SelectExpression(
158-
columns = listOf(
159-
ColumnDeclaringExpression(
160-
expression = aggregation.asExpression()
161-
)
162-
),
163-
from = this.asExpression()
164-
)
165-
166-
expression.prepareStatement { statement, logger ->
167-
statement.executeQuery().use { rs ->
168-
if (rs.next()) {
169-
val result = aggregation.sqlType.getResult(rs, 1)
170-
171-
if (logger.isDebugEnabled) {
172-
logger.debug("{}: {}", aggregation.type.toString().capitalize(), result)
173-
}
174-
175-
return result
176-
} else {
177-
return null
178-
}
179-
}
180-
}
124+
inline fun <E : Entity<E>, T : Table<E>> T.averageBy(selector: (T) -> ColumnDeclaring<out Number>): Double? {
125+
return asSequence().averageBy(selector)
181126
}

ktorm-core/src/main/kotlin/me/liuwj/ktorm/dsl/CountExpression.kt

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,10 @@
11
package me.liuwj.ktorm.dsl
22

33
import me.liuwj.ktorm.expression.*
4-
import me.liuwj.ktorm.schema.IntSqlType
54

65
internal fun QueryExpression.toCountExpression(): SelectExpression {
76
val expression = OrderByRemover.visit(this) as QueryExpression
8-
9-
val countColumns = listOf(
10-
ColumnDeclaringExpression(
11-
expression = AggregateExpression(
12-
type = AggregateType.COUNT,
13-
argument = null,
14-
isDistinct = false,
15-
sqlType = IntSqlType
16-
)
17-
)
18-
)
7+
val countColumns = listOf(count().asDeclaringExpression())
198

209
if (expression is SelectExpression && expression.isSimpleSelect()) {
2110
return expression.copy(columns = countColumns, offset = null, limit = null)

ktorm-core/src/main/kotlin/me/liuwj/ktorm/dsl/Dml.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ fun <T : Table<*>> T.update(block: UpdateStatementBuilder.(T) -> Unit): Int {
1717
val assignments = ArrayList<ColumnAssignmentExpression<*>>()
1818
val builder = UpdateStatementBuilder(assignments).apply { block(this@update) }
1919

20-
val expression = AliasRemover.visit(UpdateExpression(asExpression(), assignments, builder.where))
20+
val expression = AliasRemover.visit(UpdateExpression(asExpression(), assignments, builder.where?.asExpression()))
2121

2222
expression.prepareStatement { statement, logger ->
2323
return statement.executeUpdate().also { logger.debug("Effects: {}", it) }
@@ -145,8 +145,8 @@ fun Query.insertTo(table: Table<*>, vararg columns: Column<*>): Int {
145145
/**
146146
* 根据条件删除表中的记录,返回受影响的记录数
147147
*/
148-
fun <T : Table<*>> T.delete(block: (T) -> ScalarExpression<Boolean>): Int {
149-
val expression = AliasRemover.visit(DeleteExpression(asExpression(), block(this)))
148+
fun <T : Table<*>> T.delete(block: (T) -> ColumnDeclaring<Boolean>): Int {
149+
val expression = AliasRemover.visit(DeleteExpression(asExpression(), block(this).asExpression()))
150150

151151
expression.prepareStatement { statement, logger ->
152152
return statement.executeUpdate().also { logger.debug("Effects: {}", it) }
@@ -191,9 +191,9 @@ open class AssignmentsBuilder(private val assignments: MutableList<ColumnAssignm
191191

192192
@KtormDsl
193193
class UpdateStatementBuilder(assignments: MutableList<ColumnAssignmentExpression<*>>) : AssignmentsBuilder(assignments) {
194-
internal var where: ScalarExpression<Boolean>? = null
194+
internal var where: ColumnDeclaring<Boolean>? = null
195195

196-
fun where(block: () -> ScalarExpression<Boolean>) {
196+
fun where(block: () -> ColumnDeclaring<Boolean>) {
197197
this.where = block()
198198
}
199199
}
@@ -208,7 +208,7 @@ class BatchUpdateStatementBuilder<T : Table<*>>(internal val table: T) {
208208
val builder = UpdateStatementBuilder(assignments)
209209
builder.block(table)
210210

211-
val expr = UpdateExpression(table.asExpression(), assignments, builder.where)
211+
val expr = UpdateExpression(table.asExpression(), assignments, builder.where?.asExpression())
212212

213213
val (sql, _) = Database.global.formatExpression(expr, beautifySql = true)
214214

ktorm-core/src/main/kotlin/me/liuwj/ktorm/dsl/Join.kt

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,68 +4,69 @@
44
package me.liuwj.ktorm.dsl
55

66
import me.liuwj.ktorm.expression.*
7+
import me.liuwj.ktorm.schema.ColumnDeclaring
78
import me.liuwj.ktorm.schema.Table
89

9-
fun QuerySourceExpression.crossJoin(right: QuerySourceExpression, on: ScalarExpression<Boolean>? = null): JoinExpression {
10-
return JoinExpression(type = JoinType.CROSS_JOIN, left = this, right = right, condition = on)
10+
fun QuerySourceExpression.crossJoin(right: QuerySourceExpression, on: ColumnDeclaring<Boolean>? = null): JoinExpression {
11+
return JoinExpression(type = JoinType.CROSS_JOIN, left = this, right = right, condition = on?.asExpression())
1112
}
1213

13-
fun QuerySourceExpression.crossJoin(right: Table<*>, on: ScalarExpression<Boolean>? = null): JoinExpression {
14+
fun QuerySourceExpression.crossJoin(right: Table<*>, on: ColumnDeclaring<Boolean>? = null): JoinExpression {
1415
return crossJoin(right.asExpression(), on)
1516
}
1617

17-
fun Table<*>.crossJoin(right: QuerySourceExpression, on: ScalarExpression<Boolean>? = null): JoinExpression {
18+
fun Table<*>.crossJoin(right: QuerySourceExpression, on: ColumnDeclaring<Boolean>? = null): JoinExpression {
1819
return asExpression().crossJoin(right, on)
1920
}
2021

21-
fun Table<*>.crossJoin(right: Table<*>, on: ScalarExpression<Boolean>? = null): JoinExpression {
22+
fun Table<*>.crossJoin(right: Table<*>, on: ColumnDeclaring<Boolean>? = null): JoinExpression {
2223
return crossJoin(right.asExpression(), on)
2324
}
2425

25-
fun QuerySourceExpression.innerJoin(right: QuerySourceExpression, on: ScalarExpression<Boolean>? = null): JoinExpression {
26-
return JoinExpression(type = JoinType.INNER_JOIN, left = this, right = right, condition = on)
26+
fun QuerySourceExpression.innerJoin(right: QuerySourceExpression, on: ColumnDeclaring<Boolean>? = null): JoinExpression {
27+
return JoinExpression(type = JoinType.INNER_JOIN, left = this, right = right, condition = on?.asExpression())
2728
}
2829

29-
fun QuerySourceExpression.innerJoin(right: Table<*>, on: ScalarExpression<Boolean>? = null): JoinExpression {
30+
fun QuerySourceExpression.innerJoin(right: Table<*>, on: ColumnDeclaring<Boolean>? = null): JoinExpression {
3031
return innerJoin(right.asExpression(), on)
3132
}
3233

33-
fun Table<*>.innerJoin(right: QuerySourceExpression, on: ScalarExpression<Boolean>? = null): JoinExpression {
34+
fun Table<*>.innerJoin(right: QuerySourceExpression, on: ColumnDeclaring<Boolean>? = null): JoinExpression {
3435
return asExpression().innerJoin(right, on)
3536
}
3637

37-
fun Table<*>.innerJoin(right: Table<*>, on: ScalarExpression<Boolean>? = null): JoinExpression {
38+
fun Table<*>.innerJoin(right: Table<*>, on: ColumnDeclaring<Boolean>? = null): JoinExpression {
3839
return innerJoin(right.asExpression(), on)
3940
}
4041

41-
fun QuerySourceExpression.leftJoin(right: QuerySourceExpression, on: ScalarExpression<Boolean>? = null): JoinExpression {
42-
return JoinExpression(type = JoinType.LEFT_JOIN, left = this, right = right, condition = on)
42+
fun QuerySourceExpression.leftJoin(right: QuerySourceExpression, on: ColumnDeclaring<Boolean>? = null): JoinExpression {
43+
return JoinExpression(type = JoinType.LEFT_JOIN, left = this, right = right, condition = on?.asExpression())
4344
}
4445

45-
fun QuerySourceExpression.leftJoin(right: Table<*>, on: ScalarExpression<Boolean>? = null): JoinExpression {
46+
fun QuerySourceExpression.leftJoin(right: Table<*>, on: ColumnDeclaring<Boolean>? = null): JoinExpression {
4647
return leftJoin(right.asExpression(), on)
4748
}
4849

49-
fun Table<*>.leftJoin(right: QuerySourceExpression, on: ScalarExpression<Boolean>? = null): JoinExpression {
50+
fun Table<*>.leftJoin(right: QuerySourceExpression, on: ColumnDeclaring<Boolean>? = null): JoinExpression {
5051
return asExpression().leftJoin(right, on)
5152
}
5253

53-
fun Table<*>.leftJoin(right: Table<*>, on: ScalarExpression<Boolean>? = null): JoinExpression {
54+
fun Table<*>.leftJoin(right: Table<*>, on: ColumnDeclaring<Boolean>? = null): JoinExpression {
5455
return leftJoin(right.asExpression(), on)
5556
}
5657

57-
fun QuerySourceExpression.rightJoin(right: QuerySourceExpression, on: ScalarExpression<Boolean>? = null): JoinExpression {
58-
return JoinExpression(type = JoinType.RIGHT_JOIN, left = this, right = right, condition = on)
58+
fun QuerySourceExpression.rightJoin(right: QuerySourceExpression, on: ColumnDeclaring<Boolean>? = null): JoinExpression {
59+
return JoinExpression(type = JoinType.RIGHT_JOIN, left = this, right = right, condition = on?.asExpression())
5960
}
6061

61-
fun QuerySourceExpression.rightJoin(right: Table<*>, on: ScalarExpression<Boolean>? = null): JoinExpression {
62+
fun QuerySourceExpression.rightJoin(right: Table<*>, on: ColumnDeclaring<Boolean>? = null): JoinExpression {
6263
return rightJoin(right.asExpression(), on)
6364
}
6465

65-
fun Table<*>.rightJoin(right: QuerySourceExpression, on: ScalarExpression<Boolean>? = null): JoinExpression {
66+
fun Table<*>.rightJoin(right: QuerySourceExpression, on: ColumnDeclaring<Boolean>? = null): JoinExpression {
6667
return asExpression().rightJoin(right, on)
6768
}
6869

69-
fun Table<*>.rightJoin(right: Table<*>, on: ScalarExpression<Boolean>? = null): JoinExpression {
70+
fun Table<*>.rightJoin(right: Table<*>, on: ColumnDeclaring<Boolean>? = null): JoinExpression {
7071
return rightJoin(right.asExpression(), on)
7172
}

0 commit comments

Comments
 (0)