Add a CustomOperator (#753)

This commit is contained in:
François Gelineau
2020-01-25 10:21:13 +01:00
committed by Andrey.Tarashevskiy
parent 11c237631d
commit 19d50073a5
2 changed files with 25 additions and 0 deletions

View File

@@ -23,6 +23,17 @@ open class CustomFunction<T>(val functionName: String, _columnType: IColumnType,
}
}
// create a Function corresponding to a SQL binary operator
open class CustomOperator<T>(val operatorName: String, _columnType: IColumnType, val expr1: Expression<*>, val expr2: Expression<*>) : Function<T>(_columnType) {
override fun toQueryBuilder(queryBuilder: QueryBuilder) = queryBuilder {
+"("
+expr1
+" $operatorName "
+expr2
+")"
}
}
class NextVal(val seq: Sequence) : Function<Int>(IntegerColumnType()) {
override fun toQueryBuilder(queryBuilder: QueryBuilder) {
currentDialect.functionProvider.nextVal(seq, queryBuilder)

View File

@@ -259,7 +259,21 @@ class FunctionsTests : DatabaseTestsBase() {
assertEquals("$initialOp OR $initialOp OR $initialOp OR $initialOp", (initialOp or initialOp or initialOp or initialOp).toString())
assertEquals("$initialOp OR $initialOp OR $initialOp OR $initialOp", (initialOp or (initialOp or initialOp) or initialOp).toString())
assertEquals("$initialOp OR ($initialOp AND $initialOp) OR $initialOp", (initialOp or (initialOp and initialOp) or initialOp).toString())
}
}
@Test
fun testCustomOperator() {
// implement a + operator using CustomOperator
infix fun Expression<*>.plus(operand: Int) =
CustomOperator<Int>("+", IntegerColumnType(), this, intParam(operand))
withCitiesAndUsers { cities, users, userData ->
userData
.select { (userData.value plus 15).eq(35) }
.forEach {
assertEquals(it[userData.value], 20)
}
}
}
}