Assert sql

This commit is contained in:
jilen 2025-06-29 19:15:27 +08:00
parent 23c0484609
commit c1f26a0704
7 changed files with 33 additions and 27 deletions

View file

@ -199,7 +199,7 @@ private def compileImpl[I <: Idiom, N <: NamingStrategy](
.getOrElse(report.errorAndAbort(s"NamingStrategy not known at compile")) .getOrElse(report.errorAndAbort(s"NamingStrategy not known at compile"))
val stmt = idiom.translate(ast)(using naming) val stmt = idiom.translate(ast)(using naming)
report.info(s"Static Query: ${stmt}") report.info(s"Static Query: ${stmt._2}")
Expr(stmt._2) Expr(stmt._2)
case None => case None =>
report.info("Dynamic Query") report.info("Dynamic Query")

View file

@ -85,13 +85,14 @@ case class SortBy(query: Ast, alias: Ident, criterias: Ast, ordering: Ordering)
sealed trait Ordering extends Ast sealed trait Ordering extends Ast
case class TupleOrdering(elems: List[Ordering]) extends Ordering case class TupleOrdering(elems: List[Ordering]) extends Ordering
sealed trait PropertyOrdering extends Ordering enum PropertyOrdering extends Ordering {
case object Asc extends PropertyOrdering case Asc
case object Desc extends PropertyOrdering case Desc
case object AscNullsFirst extends PropertyOrdering case AscNullsFirst
case object DescNullsFirst extends PropertyOrdering case DescNullsFirst
case object AscNullsLast extends PropertyOrdering case AscNullsLast
case object DescNullsLast extends PropertyOrdering case DescNullsLast
}
case class GroupBy(query: Ast, alias: Ident, body: Ast) extends Query case class GroupBy(query: Ast, alias: Ident, body: Ast) extends Query

View file

@ -77,6 +77,7 @@ private given FromExpr[Property] with {
private given FromExpr[Ordering] with { private given FromExpr[Ordering] with {
def unapply(x: Expr[Ordering])(using Quotes): Option[Ordering] = { def unapply(x: Expr[Ordering])(using Quotes): Option[Ordering] = {
import PropertyOrdering.*
x match { x match {
case '{ Asc } => Some(Asc) case '{ Asc } => Some(Asc)
case '{ Desc } => Some(Desc) case '{ Desc } => Some(Desc)

View file

@ -356,15 +356,17 @@ trait SqlIdiom extends Idiom {
astTokenizer: Tokenizer[Ast], astTokenizer: Tokenizer[Ast],
strategy: NamingStrategy strategy: NamingStrategy
): Tokenizer[OrderByCriteria] = Tokenizer[OrderByCriteria] { ): Tokenizer[OrderByCriteria] = Tokenizer[OrderByCriteria] {
case OrderByCriteria(ast, Asc) => stmt"${scopedTokenizer(ast)} ASC" case OrderByCriteria(ast, PropertyOrdering.Asc) =>
case OrderByCriteria(ast, Desc) => stmt"${scopedTokenizer(ast)} DESC" stmt"${scopedTokenizer(ast)} ASC"
case OrderByCriteria(ast, AscNullsFirst) => case OrderByCriteria(ast, PropertyOrdering.Desc) =>
stmt"${scopedTokenizer(ast)} DESC"
case OrderByCriteria(ast, PropertyOrdering.AscNullsFirst) =>
stmt"${scopedTokenizer(ast)} ASC NULLS FIRST" stmt"${scopedTokenizer(ast)} ASC NULLS FIRST"
case OrderByCriteria(ast, DescNullsFirst) => case OrderByCriteria(ast, PropertyOrdering.DescNullsFirst) =>
stmt"${scopedTokenizer(ast)} DESC NULLS FIRST" stmt"${scopedTokenizer(ast)} DESC NULLS FIRST"
case OrderByCriteria(ast, AscNullsLast) => case OrderByCriteria(ast, PropertyOrdering.AscNullsLast) =>
stmt"${scopedTokenizer(ast)} ASC NULLS LAST" stmt"${scopedTokenizer(ast)} ASC NULLS LAST"
case OrderByCriteria(ast, DescNullsLast) => case OrderByCriteria(ast, PropertyOrdering.DescNullsLast) =>
stmt"${scopedTokenizer(ast)} DESC NULLS LAST" stmt"${scopedTokenizer(ast)} DESC NULLS LAST"
} }

View file

@ -141,13 +141,13 @@ trait MirrorIdiomBase extends Idiom {
} }
implicit val orderingTokenizer: Tokenizer[Ordering] = Tokenizer[Ordering] { implicit val orderingTokenizer: Tokenizer[Ordering] = Tokenizer[Ordering] {
case TupleOrdering(elems) => stmt"Ord(${elems.token})" case TupleOrdering(elems) => stmt"Ord(${elems.token})"
case Asc => stmt"Ord.asc" case PropertyOrdering.Asc => stmt"Ord.asc"
case Desc => stmt"Ord.desc" case PropertyOrdering.Desc => stmt"Ord.desc"
case AscNullsFirst => stmt"Ord.ascNullsFirst" case PropertyOrdering.AscNullsFirst => stmt"Ord.ascNullsFirst"
case DescNullsFirst => stmt"Ord.descNullsFirst" case PropertyOrdering.DescNullsFirst => stmt"Ord.descNullsFirst"
case AscNullsLast => stmt"Ord.ascNullsLast" case PropertyOrdering.AscNullsLast => stmt"Ord.ascNullsLast"
case DescNullsLast => stmt"Ord.descNullsLast" case PropertyOrdering.DescNullsLast => stmt"Ord.descNullsLast"
} }
implicit def optionOperationTokenizer(implicit implicit def optionOperationTokenizer(implicit

View file

@ -44,11 +44,11 @@ class FromExprsSuite extends FunSuite {
} }
testFor("Ordering") { testFor("Ordering") {
Asc PropertyOrdering.Asc
} }
testFor("TupleOrdering") { testFor("TupleOrdering") {
TupleOrdering(List(Asc, Desc)) TupleOrdering(List(PropertyOrdering.Asc, PropertyOrdering.Desc))
} }
testFor("Entity") { testFor("Entity") {

View file

@ -20,16 +20,18 @@ class QuotedSuite extends munit.FunSuite {
query[Foo]( query[Foo](
"foo", "foo",
alias("id", "id1") alias("id", "id1")
).filter(_.id > 0) ).filter(x => x.id > 0)
) )
println(o) assertEquals(o.sql, "SELECT x.id1, x.name FROM foo x WHERE x.id1 > 0")
} }
test("Insert") { test("Insert") {
val v: Foo = Foo(0L, "foo") val v: Foo = Foo(0L, "foo")
val o = testContext.io(Foos.insert(v)) val o = testContext.io(Foos.insert(v))
println(o) assertEquals(
??? o.sql,
"INSERT INTO foo (id,name) VALUES (?, ?)"
)
} }
} }