From 31cbebce7c9801db03f0e1f762218fb3806274ba Mon Sep 17 00:00:00 2001 From: Tapac Date: Fri, 1 Feb 2019 01:24:16 +0300 Subject: [PATCH] #476 No way to ORDER BY in DAO --- .../kotlin/org/jetbrains/exposed/dao/Entity.kt | 8 +------- .../org/jetbrains/exposed/sql/IterableEx.kt | 8 ++++++++ .../kotlin/org/jetbrains/exposed/sql/Query.kt | 2 +- .../exposed/sql/tests/shared/EntityTests.kt | 15 +++++++++++++++ 4 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/main/kotlin/org/jetbrains/exposed/dao/Entity.kt b/src/main/kotlin/org/jetbrains/exposed/dao/Entity.kt index 07aabf574c..ae49b5d2e6 100644 --- a/src/main/kotlin/org/jetbrains/exposed/dao/Entity.kt +++ b/src/main/kotlin/org/jetbrains/exposed/dao/Entity.kt @@ -125,6 +125,7 @@ class View> (val op : Op, val factory: EntityClas override operator fun iterator(): Iterator = factory.find(op).iterator() operator fun getValue(o: Any?, desc: KProperty<*>): SizedIterable = factory.find(op) override fun copy(): SizedIterable = View(op, factory) + override fun orderBy(vararg order: Pair, SortOrder>): SizedIterable = factory.find(op).orderBy(*order) } @Suppress("UNCHECKED_CAST") @@ -278,13 +279,6 @@ open class Entity>(val id: EntityID) { } } - operator fun ColumnWithTransform.getValue(o: Entity, desc: KProperty<*>): TReal = - toReal(column.getValue(o, desc)) - - operator fun ColumnWithTransform.setValue(o: Entity, desc: KProperty<*>, value: TReal) { - column.setValue(o, desc, toColumn(value)) - } - infix fun , Target:Entity> EntityClass.via(table: Table): InnerTableLink, TID, Target> = InnerTableLink(table, this@via) diff --git a/src/main/kotlin/org/jetbrains/exposed/sql/IterableEx.kt b/src/main/kotlin/org/jetbrains/exposed/sql/IterableEx.kt index 224749349c..29dd6bc45d 100644 --- a/src/main/kotlin/org/jetbrains/exposed/sql/IterableEx.kt +++ b/src/main/kotlin/org/jetbrains/exposed/sql/IterableEx.kt @@ -9,6 +9,7 @@ interface SizedIterable: Iterable { fun forUpdate(): SizedIterable = this fun notForUpdate(): SizedIterable = this fun copy() : SizedIterable + fun orderBy(vararg order: Pair, SortOrder>) : SizedIterable } fun emptySized() : SizedIterable = EmptySizedIterable() @@ -29,6 +30,8 @@ class EmptySizedIterable : SizedIterable, Iterator { override fun hasNext(): Boolean = false override fun copy(): SizedIterable = this + + override fun orderBy(vararg order: Pair, SortOrder>): SizedIterable = this } class SizedCollection(val delegate: Collection): SizedIterable { @@ -38,6 +41,7 @@ class SizedCollection(val delegate: Collection): SizedIterable { override fun count() = delegate.size override fun empty() = delegate.isEmpty() override fun copy(): SizedIterable = SizedCollection(delegate) + override fun orderBy(vararg order: Pair, SortOrder>): SizedIterable = this } class LazySizedCollection(val delegate: SizedIterable): SizedIterable { @@ -87,6 +91,9 @@ class LazySizedCollection(val delegate: SizedIterable): SizedIterable< } override fun copy(): SizedIterable = LazySizedCollection(delegate.copy()) + + override fun orderBy(vararg order: Pair, SortOrder>): SizedIterable + = LazySizedCollection(delegate.orderBy(*order)) } infix fun SizedIterable.mapLazy(f:(T)->R):SizedIterable { @@ -98,6 +105,7 @@ infix fun SizedIterable.mapLazy(f:(T)->R):SizedIterable { override fun count(): Int = source.count() override fun empty(): Boolean = source.empty() override fun copy(): SizedIterable = source.copy().mapLazy(f) + override fun orderBy(vararg order: Pair, SortOrder>) = source.orderBy(*order).mapLazy(f) override operator fun iterator(): Iterator { val sourceIterator = source.iterator() diff --git a/src/main/kotlin/org/jetbrains/exposed/sql/Query.kt b/src/main/kotlin/org/jetbrains/exposed/sql/Query.kt index a97a2f1208..bb2f1a7f38 100644 --- a/src/main/kotlin/org/jetbrains/exposed/sql/Query.kt +++ b/src/main/kotlin/org/jetbrains/exposed/sql/Query.kt @@ -252,7 +252,7 @@ open class Query(set: FieldSet, where: Op?): SizedIterable, return this } - fun orderBy(vararg columns: Pair, SortOrder>) : Query { + override fun orderBy(vararg columns: Pair, SortOrder>) : Query { (orderByExpressions as MutableList).addAll(columns) return this } diff --git a/src/test/kotlin/org/jetbrains/exposed/sql/tests/shared/EntityTests.kt b/src/test/kotlin/org/jetbrains/exposed/sql/tests/shared/EntityTests.kt index 3069195573..c4b7fffd2b 100644 --- a/src/test/kotlin/org/jetbrains/exposed/sql/tests/shared/EntityTests.kt +++ b/src/test/kotlin/org/jetbrains/exposed/sql/tests/shared/EntityTests.kt @@ -310,6 +310,9 @@ class EntityTests: DatabaseTestsBase() { val uniqueId by Categories.uniqueId var title by Categories.title val posts by Post optionalReferrersOn Posts.category + + override fun equals(other: Any?) = (other as? Category)?.id?.equals(id) == true + override fun hashCode() = id.value.hashCode() } @Test @@ -502,6 +505,18 @@ class EntityTests: DatabaseTestsBase() { } } + @Test fun testOrderByOnEntities() { + withTables(Categories) { + val category1 = Category.new { title = "Test1" } + val category3 = Category.new { title = "Test3" } + val category2 = Category.new { title = "Test2" } + + assertEqualLists(listOf(category1, category3, category2), Category.all().toList()) + assertEqualLists(listOf(category1, category2, category3), Category.all().orderBy(Categories.title to SortOrder.ASC).toList()) + assertEqualLists(listOf(category3, category2, category1), Category.all().orderBy(Categories.title to SortOrder.DESC).toList()) + } + } + private fun newTransaction(statement: Transaction.() -> T) = inTopLevelTransaction(TransactionManager.current().db.metadata.defaultTransactionIsolation, 1, null, statement)