Skip to content

Commit

Permalink
Add DateQuotes
Browse files Browse the repository at this point in the history
  • Loading branch information
andrzejjozwik committed Jul 29, 2019
1 parent 0897891 commit 2017497
Show file tree
Hide file tree
Showing 8 changed files with 69 additions and 14 deletions.
@@ -0,0 +1,30 @@
package pl.jozwik.quillgeneric.quillmacro.quotes

import java.time.{ LocalDate, LocalDateTime }

import io.getquill.context.Context

trait DateQuotes {
this: Context[_, _] =>

implicit class LocalDateTimeQuotes(left: LocalDateTime) {
def >(right: LocalDateTime) = quote(infix"$left > $right".as[Boolean])

def <(right: LocalDateTime) = quote(infix"$left < $right".as[Boolean])

def >=(right: LocalDateTime) = quote(infix"$left >= $right".as[Boolean])

def <=(right: LocalDateTime) = quote(infix"$left <= $right".as[Boolean])
}

implicit class LocalDateQuotes(left: LocalDate) {
def >(right: LocalDate) = quote(infix"$left > $right".as[Boolean])

def <(right: LocalDate) = quote(infix"$left < $right".as[Boolean])

def >=(right: LocalDate) = quote(infix"$left >= $right".as[Boolean])

def <=(right: LocalDate) = quote(infix"$left <= $right".as[Boolean])
}

}
Expand Up @@ -4,14 +4,17 @@ import io.getquill.NamingStrategy
import io.getquill.context.jdbc.JdbcContext
import io.getquill.context.sql.idiom.SqlIdiom
import pl.jozwik.quillgeneric.quillmacro.WithId
import pl.jozwik.quillgeneric.quillmacro.quotes.DateQuotes

trait JdbcRepositoryWithGeneratedId[K, T <: WithId[K], Dialect <: SqlIdiom, Naming <: NamingStrategy]
extends RepositoryWithGeneratedId[K, T] {
protected val context: JdbcContext[Dialect, Naming] with QuillCrudWithContext
protected val context: JdbcContext[Dialect, Naming] with QuillCrudWithContext with DateQuotes

protected def dynamicSchema: context.DynamicEntityQuery[T]
}

trait JdbcRepository[K, T <: WithId[K], Dialect <: SqlIdiom, Naming <: NamingStrategy] extends Repository[K, T] {
protected val context: JdbcContext[Dialect, Naming] with QuillCrudWithContext
protected val context: JdbcContext[Dialect, Naming] with QuillCrudWithContext with DateQuotes

protected def dynamicSchema: context.DynamicEntityQuery[T]
}
Expand Up @@ -2,12 +2,13 @@ package pl.jozwik.quillgeneric.quillmacro.sync

import io.getquill.context.Context
import pl.jozwik.quillgeneric.quillmacro.WithId
import pl.jozwik.quillgeneric.quillmacro.quotes.DateQuotes

import scala.language.experimental.macros
import scala.util.Try

trait QuillCrudWithContext {
this: Context[_, _] =>
this: Context[_, _] with DateQuotes =>
type dQuery[T] = this.DynamicEntityQuery[T]

def all[T](implicit dSchema: dQuery[T]): Try[Seq[T]] = macro QuillCrudMacro.all
Expand Down
6 changes: 5 additions & 1 deletion src/test/scala/pl/jozwik/quillgeneric/AbstractSpec.scala
@@ -1,5 +1,7 @@
package pl.jozwik.quillgeneric

import java.time.LocalDate

import com.typesafe.scalalogging.StrictLogging
import org.scalatest.concurrent.{ AsyncTimeLimitedTests, TimeLimitedTests }
import org.scalatest.time.{ Seconds, Span }
Expand All @@ -13,6 +15,8 @@ trait Spec extends StrictLogging {
val timeLimit = Span(TIMEOUT_SECONDS, Seconds)
}

trait AbstractSpec extends WordSpecLike with TimeLimitedTests with Spec with Matchers with BeforeAndAfterAll
trait AbstractSpec extends WordSpecLike with TimeLimitedTests with Spec with Matchers with BeforeAndAfterAll {
protected val today: LocalDate = LocalDate.now
}

trait AbstractAsyncSpec extends AsyncWordSpecLike with AsyncTimeLimitedTests with Spec with Matchers
Expand Up @@ -4,12 +4,13 @@ import io.getquill.NamingStrategy
import io.getquill.context.jdbc.JdbcContext
import io.getquill.context.sql.idiom.SqlIdiom
import pl.jozwik.quillgeneric.model.{ Configuration, ConfigurationId }
import pl.jozwik.quillgeneric.quillmacro.quotes.DateQuotes
import pl.jozwik.quillgeneric.quillmacro.sync.{ JdbcRepository, QuillCrudWithContext }

import scala.util.Try

class ConfigurationRepository[Dialect <: SqlIdiom, Naming <: NamingStrategy](
protected val context: JdbcContext[Dialect, Naming] with QuillCrudWithContext,
protected val context: JdbcContext[Dialect, Naming] with QuillCrudWithContext with DateQuotes,
protected val tableName: String = "Configuration")
extends JdbcRepository[ConfigurationId, Configuration, Dialect, Naming] {

Expand Down
Expand Up @@ -4,12 +4,13 @@ import io.getquill.NamingStrategy
import io.getquill.context.jdbc.JdbcContext
import io.getquill.context.sql.idiom.SqlIdiom
import pl.jozwik.quillgeneric.model.{ Person, PersonId }
import pl.jozwik.quillgeneric.quillmacro.quotes.DateQuotes
import pl.jozwik.quillgeneric.quillmacro.sync.QuillCrudWithContext

import scala.util.Try

final class PersonRepository[Dialect <: SqlIdiom, Naming <: NamingStrategy](
protected val context: JdbcContext[Dialect, Naming] with QuillCrudWithContext,
protected val context: JdbcContext[Dialect, Naming] with QuillCrudWithContext with DateQuotes,
protected val tableName: String)
extends MyPersonRepository[Dialect, Naming] {

Expand Down Expand Up @@ -43,6 +44,5 @@ final class PersonRepository[Dialect <: SqlIdiom, Naming <: NamingStrategy](

override def delete(id: PersonId): Try[Boolean] =
context.delete[PersonId, Person](id)


}
28 changes: 22 additions & 6 deletions src/test/scala/pl/jozwik/quillgeneric/sync/QuillCrudSpec.scala
Expand Up @@ -2,17 +2,32 @@ package pl.jozwik.quillgeneric.sync

import java.time.LocalDate

import io.getquill.{ H2JdbcContext, SnakeCase }
import io.getquill.context.jdbc.JdbcContext
import io.getquill.context.sql.idiom.SqlIdiom
import io.getquill.{ H2JdbcContext, NamingStrategy, SnakeCase }
import org.scalatest.TryValues._
import pl.jozwik.quillgeneric.AbstractSpec
import pl.jozwik.quillgeneric.model.{ Configuration, ConfigurationId, Person, PersonId }
import pl.jozwik.quillgeneric.quillmacro.quotes.DateQuotes
import pl.jozwik.quillgeneric.quillmacro.sync.QuillCrudWithContext

import scala.util.{ Success, Try }

object QuillCrudSpec {
def youngerThan[Dialect <: SqlIdiom, Naming <: NamingStrategy](
from: LocalDate,
ctx: JdbcContext[Dialect, Naming] with QuillCrudWithContext with DateQuotes): Try[Seq[Person]] =
Try {
import ctx._
ctx.run(query[Person].filter(_.birthDate > lift(from)))
}
}

class QuillCrudSpec extends AbstractSpec {

private lazy val ctx = new H2JdbcContext(SnakeCase, "h2") with QuillCrudWithContext
import QuillCrudSpec._

private lazy val ctx = new H2JdbcContext(SnakeCase, "h2") with QuillCrudWithContext with DateQuotes

private val generateId = true

Expand All @@ -24,8 +39,9 @@ class QuillCrudSpec extends AbstractSpec {
"QueriesSync " should {
"Call all operations on Person" in {
val repository = new PersonRepository(ctx, "Person")
val person = Person(PersonId(1), "firstName", "lastName", LocalDate.now)
val notExisting = Person(PersonId(2), "firstName", "lastName", LocalDate.now)
val person = Person(PersonId(1), "firstName", "lastName", today)
val notExisting = Person(PersonId(2), "firstName", "lastName", today)
youngerThan(today, ctx)
repository.all shouldBe Success(Seq())
repository.create(person, false) shouldBe 'success
repository.read(notExisting.id).success.value shouldBe empty
Expand All @@ -41,7 +57,7 @@ class QuillCrudSpec extends AbstractSpec {
"Call all operations on Person with auto generated id and custom field" in {
val repository = new PersonCustomRepository(ctx, "Person3")
logger.debug("generated id with custom field")
val person = Person(PersonId.empty, "firstName", "lastName", LocalDate.now)
val person = Person(PersonId.empty, "firstName", "lastName", today)
repository.all shouldBe Try(Seq())
val personId = repository.create(person, generateId)
val personIdProvided = personId.success.value
Expand All @@ -62,7 +78,7 @@ class QuillCrudSpec extends AbstractSpec {
"Call all operations on Person2 with auto generated id" in {
val repository = new PersonRepository(ctx, "Person2")
logger.debug("generated id")
val person = Person(PersonId.empty, "firstName", "lastName", LocalDate.now)
val person = Person(PersonId.empty, "firstName", "lastName", today)
repository.all shouldBe Try(Seq())
val personId = repository.create(person)
val personIdProvided = personId.success.value
Expand Down
2 changes: 1 addition & 1 deletion version.sbt
@@ -1 +1 @@
ThisBuild / version := "0.3.2-SNAPSHOT"
ThisBuild / version := "0.3.2"

0 comments on commit 2017497

Please sign in to comment.