diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c0ce1bae3c..10493609c9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,8 +9,10 @@ on: types: [ published ] # Triggers the CI when a new Github Release is published env: - JAVA_OPTS: -Xms6G -Xmx6G -XX:+UseG1GC - JDK_JAVA_OPTIONS: -Xms6G -Xmx6G -XX:+UseG1GC # See https://stackoverflow.com/a/73708006 + # See: + # - https://stackoverflow.com/a/73708006 + # - https://stackoverflow.com/questions/73465937/apache-spark-3-3-0-breaks-on-java-17-with-cannot-access-class-sun-nio-ch-direct + JDK_JAVA_OPTIONS: -Xms6G -Xmx6G -XX:+UseG1GC --add-exports java.base/sun.nio.ch=ALL-UNNAMED jobs: build: @@ -68,7 +70,7 @@ jobs: uses: actions/setup-java@v3.12.0 with: distribution: temurin - java-version: '8' + java-version: '17' check-latest: true - name: Build modules @@ -91,7 +93,7 @@ jobs: uses: actions/setup-java@v3.12.0 with: distribution: temurin - java-version: '8' + java-version: '17' check-latest: true - run: | sbt ++2.12.x -Dquill.scala.version=2.12.x -Dquill.macro.log=false ci-release diff --git a/build.sbt b/build.sbt index 304238945f..ee074ada2f 100644 --- a/build.sbt +++ b/build.sbt @@ -77,16 +77,6 @@ lazy val scala213Modules = lazy val scala3Modules = Seq[sbt.ClasspathDep[sbt.ProjectReference]](`quill-engine`, `quill-util`) -def javaMainVersion = { - val javaVersion = System.getProperty("java.version") - val versionSplit = javaVersion.split('.') - if (versionSplit.head.equals("1")) { - versionSplit(1).toInt - } else { - versionSplit(0).toInt - } -} - def isScala213 = { val scalaVersion = sys.props.get("quill.scala.version") scalaVersion.map(_.startsWith("2.13")).getOrElse(false) @@ -221,12 +211,7 @@ lazy val `quill-engine` = ("com.github.takayahilton" %% "sql-formatter" % "1.2.1").cross(CrossVersion.for3Use2_13), "io.suzaku" %% "boopickle" % "1.4.0", "com.lihaoyi" %% "pprint" % "0.8.1", - // caffeine 3.x doesn't support Java version lower than 11 - if (javaMainVersion >= 11) { - "com.github.ben-manes.caffeine" % "caffeine" % "3.1.8" - } else { - "com.github.ben-manes.caffeine" % "caffeine" % "2.9.3" - } + "com.github.ben-manes.caffeine" % "caffeine" % "3.1.8" ), coverageExcludedPackages := ";.*AstPrinter;.*Using;io.getquill.Model;io.getquill.ScalarTag;io.getquill.QuotationTag" ) @@ -587,7 +572,7 @@ lazy val excludeFilterSettings = Seq( excludeTests match { case ExcludeTests.Include => - excludePaths(List()) + excludePaths(List.empty) case _ => excludePaths(paths) } @@ -666,8 +651,9 @@ lazy val basicSettings = excludeFilterSettings ++ Seq( Test / unmanagedClasspath ++= Seq( baseDirectory.value / "src" / "test" / "resources" ), + javacOptions := Seq("-source", "11", "-target", "11"), scalacOptions ++= Seq( - "-release:8", + "-release:11", "-encoding", "UTF-8", "-feature", diff --git a/build/build.sh b/build/build.sh index 406cb24ddb..994c4b91da 100755 --- a/build/build.sh +++ b/build/build.sh @@ -23,7 +23,7 @@ export CASSANDRA_DC=datacenter1 export ORIENTDB_HOST=127.0.0.1 export ORIENTDB_PORT=12424 -export JAVA_OPTS="-Dquill.macro.log=false -Dquill.scala.version=$SCALA_VERSION -Xms3g -Xmx3g -Xss5m -XX:ReservedCodeCacheSize=256m -XX:+TieredCompilation -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC" +export JAVA_OPTS="-Dquill.macro.log=false -Dquill.scala.version=$SCALA_VERSION -Xms3g -Xmx3g -Xss5m -XX:ReservedCodeCacheSize=256m -XX:+TieredCompilation" modules=$1 echo "Start build modules: $modules" @@ -164,7 +164,7 @@ function wait_for_bigdata() { function base_build() { echo "build.sh =:> Base Build Specified" - export JAVA_OPTS="-Dquill.macro.log=false -Dquill.scala.version=$SCALA_VERSION -Xms4g -Xmx4g -Xss10m -XX:ReservedCodeCacheSize=256m -XX:+TieredCompilation -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC" + export JAVA_OPTS="-Dquill.macro.log=false -Dquill.scala.version=$SCALA_VERSION -Xms4g -Xmx4g -Xss10m -XX:ReservedCodeCacheSize=256m -XX:+TieredCompilation " echo "build.sh =:> Starting Base Build Primary" sbt "sbt -Dmodules=base $SBT_ARGS test" } @@ -172,19 +172,11 @@ function base_build() { function db_build() { echo "build.sh =:> DB Build Specified" wait_for_databases - export JAVA_OPTS="-Dquill.macro.log=false -Dquill.scala.version=$SCALA_VERSION -Xms4g -Xmx4g -Xss10m -XX:ReservedCodeCacheSize=256m -XX:+TieredCompilation -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC" + export JAVA_OPTS="-Dquill.macro.log=false -Dquill.scala.version=$SCALA_VERSION -Xms4g -Xmx4g -Xss10m -XX:ReservedCodeCacheSize=256m -XX:+TieredCompilation " echo "build.sh =:> Starting DB Build Primary" ./build/aware_run.sh "sbt -Dmodules=db $SBT_ARGS test" } -function js_build() { - echo "build.sh =:> JS Build Specified" - show_mem - export JAVA_OPTS="-Dquill.macro.log=false -Dquill.scala.version=$SCALA_VERSION -Xms4g -Xmx4g -Xss10m -XX:ReservedCodeCacheSize=256m -XX:+TieredCompilation -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC" - echo "build.sh =:> Starting JS Build Primary" - sbt -Dmodules=js $SBT_ARGS test -} - function async_build() { echo "build.sh =:> Async Build Specified" wait_for_mysql_postgres diff --git a/quill-cassandra-alpakka/src/test/scala/io/getquill/context/cassandra/alpakka/ListsEncodingSpec.scala b/quill-cassandra-alpakka/src/test/scala/io/getquill/context/cassandra/alpakka/ListsEncodingSpec.scala index 087fadc4d4..d566f00d4d 100644 --- a/quill-cassandra-alpakka/src/test/scala/io/getquill/context/cassandra/alpakka/ListsEncodingSpec.scala +++ b/quill-cassandra-alpakka/src/test/scala/io/getquill/context/cassandra/alpakka/ListsEncodingSpec.scala @@ -37,7 +37,9 @@ class ListsEncodingSpec extends CollectionsSpec with CassandraAlpakkaSpec { List(1f, 3f), List(5d), List(LocalDate.now()), - List(Instant.now()), + List( + Instant.now().truncatedTo(java.time.temporal.ChronoUnit.MILLIS) + ), // See https://stackoverflow.com/a/74781779/2431728 List(UUID.randomUUID()) ) diff --git a/quill-cassandra-alpakka/src/test/scala/io/getquill/context/cassandra/alpakka/MapsEncodingSpec.scala b/quill-cassandra-alpakka/src/test/scala/io/getquill/context/cassandra/alpakka/MapsEncodingSpec.scala index 9fe45c5ba7..d0a582a3ab 100644 --- a/quill-cassandra-alpakka/src/test/scala/io/getquill/context/cassandra/alpakka/MapsEncodingSpec.scala +++ b/quill-cassandra-alpakka/src/test/scala/io/getquill/context/cassandra/alpakka/MapsEncodingSpec.scala @@ -2,6 +2,7 @@ package io.getquill.context.cassandra.alpakka import io.getquill.context.cassandra.CollectionsSpec +import java.time.temporal.ChronoUnit import java.time.{Instant, LocalDate} import java.util.UUID @@ -20,11 +21,13 @@ class MapsEncodingSpec extends CollectionsSpec with CassandraAlpakkaSpec { val e = MapsEntity( 1, - Map("1" -> BigDecimal(1)), - Map(1 -> 1d, 2 -> 2d, 3 -> 3d), - Map(1L -> 3f), - Map(true -> LocalDate.now()), - Map(UUID.randomUUID() -> Instant.now()) + Map("1" -> BigDecimal(1)), + Map(1 -> 1d, 2 -> 2d, 3 -> 3d), + Map(1L -> 3f), + Map(true -> LocalDate.now()), + Map( + UUID.randomUUID() -> Instant.now().truncatedTo(ChronoUnit.MILLIS) + ) // See https://stackoverflow.com/a/74781779/2431728 ) val q = quote(query[MapsEntity]) diff --git a/quill-cassandra-alpakka/src/test/scala/io/getquill/context/cassandra/alpakka/SetsEncodingSpec.scala b/quill-cassandra-alpakka/src/test/scala/io/getquill/context/cassandra/alpakka/SetsEncodingSpec.scala index c7481e177b..bfa730bcc6 100644 --- a/quill-cassandra-alpakka/src/test/scala/io/getquill/context/cassandra/alpakka/SetsEncodingSpec.scala +++ b/quill-cassandra-alpakka/src/test/scala/io/getquill/context/cassandra/alpakka/SetsEncodingSpec.scala @@ -2,6 +2,7 @@ package io.getquill.context.cassandra.alpakka import io.getquill.context.cassandra.CollectionsSpec +import java.time.temporal.ChronoUnit import java.time.{Instant, LocalDate} import java.util.UUID @@ -33,7 +34,7 @@ class SetsEncodingSpec extends CollectionsSpec with CassandraAlpakkaSpec { Set(1f, 3f), Set(5d), Set(LocalDate.now()), - Set(Instant.now()), + Set(Instant.now().truncatedTo(ChronoUnit.MILLIS)), // See https://stackoverflow.com/a/74781779/2431728 Set(UUID.randomUUID()) ) val q = quote(query[SetsEntity]) diff --git a/quill-cassandra/src/test/scala/io/getquill/context/cassandra/ListsEncodingSpec.scala b/quill-cassandra/src/test/scala/io/getquill/context/cassandra/ListsEncodingSpec.scala index 35bbb3d5a0..5406a75e43 100644 --- a/quill-cassandra/src/test/scala/io/getquill/context/cassandra/ListsEncodingSpec.scala +++ b/quill-cassandra/src/test/scala/io/getquill/context/cassandra/ListsEncodingSpec.scala @@ -1,7 +1,7 @@ package io.getquill.context.cassandra -import java.util.{Date, UUID} import java.time.{Instant, LocalDate} +import java.util.UUID class ListsEncodingSpec extends CollectionsSpec { val ctx = testSyncDB @@ -34,7 +34,9 @@ class ListsEncodingSpec extends CollectionsSpec { List(1f, 3f), List(5d), List(LocalDate.now()), - List(Instant.now()), + List( + Instant.now().truncatedTo(java.time.temporal.ChronoUnit.MILLIS) + ), // See https://stackoverflow.com/a/74781779/2431728 List(UUID.randomUUID()) ) diff --git a/quill-cassandra/src/test/scala/io/getquill/context/cassandra/MapsEncodingSpec.scala b/quill-cassandra/src/test/scala/io/getquill/context/cassandra/MapsEncodingSpec.scala index b9314d1fdb..54a23916f5 100644 --- a/quill-cassandra/src/test/scala/io/getquill/context/cassandra/MapsEncodingSpec.scala +++ b/quill-cassandra/src/test/scala/io/getquill/context/cassandra/MapsEncodingSpec.scala @@ -1,7 +1,8 @@ package io.getquill.context.cassandra +import java.time.temporal.ChronoUnit import java.time.{Instant, LocalDate} -import java.util.{Date, UUID} +import java.util.UUID class MapsEncodingSpec extends CollectionsSpec { val ctx = testSyncDB @@ -17,11 +18,13 @@ class MapsEncodingSpec extends CollectionsSpec { ) val e = MapsEntity( 1, - Map("1" -> BigDecimal(1)), - Map(1 -> 1d, 2 -> 2d, 3 -> 3d), - Map(1L -> 3f), - Map(true -> LocalDate.now()), - Map(UUID.randomUUID() -> Instant.now()) + Map("1" -> BigDecimal(1)), + Map(1 -> 1d, 2 -> 2d, 3 -> 3d), + Map(1L -> 3f), + Map(true -> LocalDate.now()), + Map( + UUID.randomUUID() -> Instant.now().truncatedTo(ChronoUnit.MILLIS) + ) // See https://stackoverflow.com/a/74781779/2431728 ) val q = quote(query[MapsEntity]) diff --git a/quill-cassandra/src/test/scala/io/getquill/context/cassandra/SetsEncodingSpec.scala b/quill-cassandra/src/test/scala/io/getquill/context/cassandra/SetsEncodingSpec.scala index 27ab8997e0..d4dc0d06b3 100644 --- a/quill-cassandra/src/test/scala/io/getquill/context/cassandra/SetsEncodingSpec.scala +++ b/quill-cassandra/src/test/scala/io/getquill/context/cassandra/SetsEncodingSpec.scala @@ -1,7 +1,8 @@ package io.getquill.context.cassandra +import java.time.temporal.ChronoUnit import java.time.{Instant, LocalDate} -import java.util.{Date, UUID} +import java.util.UUID class SetsEncodingSpec extends CollectionsSpec { val ctx = testSyncDB @@ -30,7 +31,7 @@ class SetsEncodingSpec extends CollectionsSpec { Set(1f, 3f), Set(5d), Set(LocalDate.now()), - Set(Instant.now()), + Set(Instant.now().truncatedTo(ChronoUnit.MILLIS)), // See https://stackoverflow.com/a/74781779/2431728 Set(UUID.randomUUID()) ) val q = quote(query[SetsEntity]) diff --git a/quill-codegen-jdbc/src/test/scala/io/getquill/codegen/util/OptionOps.scala b/quill-codegen-jdbc/src/test/scala/io/getquill/codegen/util/OptionOps.scala index e92ad77af2..c4ce013a1f 100644 --- a/quill-codegen-jdbc/src/test/scala/io/getquill/codegen/util/OptionOps.scala +++ b/quill-codegen-jdbc/src/test/scala/io/getquill/codegen/util/OptionOps.scala @@ -10,6 +10,6 @@ object OptionOps { } } implicit class StringOptionExt(opt: Option[String]) { - def andNotEmpty = opt.flatMap(s => if (s.trim.isEmpty) None else Some(s)) + def andNotEmpty: Option[String] = opt.flatMap(s => if (s.trim.isEmpty) None else Some(s)) } } diff --git a/quill-core/src/main/scala/io/getquill/context/Expand.scala b/quill-core/src/main/scala/io/getquill/context/Expand.scala index 41013154ba..36261e95e9 100644 --- a/quill-core/src/main/scala/io/getquill/context/Expand.scala +++ b/quill-core/src/main/scala/io/getquill/context/Expand.scala @@ -1,10 +1,8 @@ package io.getquill.context +import io.getquill.{IdiomContext, NamingStrategy} import io.getquill.ast._ -import io.getquill.NamingStrategy import io.getquill.idiom._ -import io.getquill.IdiomContext -import io.getquill.quat.Quat object CanDoBatchedInsert { def apply(ast: Ast, idiom: Idiom, statement: Token, isReturning: Boolean, idiomContext: IdiomContext): Boolean = { @@ -17,8 +15,8 @@ object CanDoBatchedInsert { else { val validations = for { - _ <- validateConcatenatedIterationPossible(statement).right - _ <- validateIdiomSupportsConcatenatedIteration(idiom, isReturning).right + _ <- validateConcatenatedIterationPossible(statement) + _ <- validateIdiomSupportsConcatenatedIteration(idiom, isReturning) } yield () validations match { diff --git a/quill-core/src/main/scala/io/getquill/util/OrderedGroupByExt.scala b/quill-core/src/main/scala/io/getquill/util/OrderedGroupByExt.scala index b6943dbec9..a882ee79bb 100644 --- a/quill-core/src/main/scala/io/getquill/util/OrderedGroupByExt.scala +++ b/quill-core/src/main/scala/io/getquill/util/OrderedGroupByExt.scala @@ -1,19 +1,19 @@ package io.getquill.util -import collection.immutable.ListSet -import collection.mutable.{LinkedHashMap => MMap, Builder} -import scala.language.higherKinds +import scala.collection.immutable.ListSet +import scala.collection.mutable +import scala.collection.mutable.{LinkedHashMap => MMap} object OrderedGroupByExt { - implicit class GroupByOrderedImplicitImpl[A](val t: Traversable[A]) extends AnyVal { + implicit final class GroupByOrderedImplicitImpl[A](private val t: Iterable[A]) extends AnyVal { def groupByOrderedUnique[K](f: A => K): Map[K, ListSet[A]] = groupByGen(ListSet.newBuilder[A])(f) def groupByOrdered[K](f: A => K): Map[K, List[A]] = groupByGen(List.newBuilder[A])(f) - def groupByGen[K, C[_]](makeBuilder: => Builder[A, C[A]])(f: A => K): Map[K, C[A]] = { - val map = MMap[K, Builder[A, C[A]]]() + def groupByGen[K, C[_]](makeBuilder: => mutable.Builder[A, C[A]])(f: A => K): Map[K, C[A]] = { + val map = MMap[K, mutable.Builder[A, C[A]]]() for (i <- t) { val key = f(i) val builder = map.get(key) match { diff --git a/quill-core/src/test/scala/io/getquill/base/EncodingSpec.scala b/quill-core/src/test/scala/io/getquill/base/EncodingSpec.scala index e892a03ad9..69d9e3b57a 100644 --- a/quill-core/src/test/scala/io/getquill/base/EncodingSpec.scala +++ b/quill-core/src/test/scala/io/getquill/base/EncodingSpec.scala @@ -3,6 +3,7 @@ package io.getquill.base import io.getquill.context.Context import java.util.Date +import scala.annotation.nowarn trait EncodingSpec extends Spec { @@ -167,6 +168,7 @@ trait EncodingSpec extends Spec { ) ) + @nowarn("msg=match may not be exhaustive") def verify(result: List[EncodingTestEntity]) = result match { case List(e1, e2) => diff --git a/quill-jasync-mysql/src/test/scala/io/getquill/context/jasync/mysql/MysqlJAsyncEncodingSpec.scala b/quill-jasync-mysql/src/test/scala/io/getquill/context/jasync/mysql/MysqlJAsyncEncodingSpec.scala index d76542ca66..bc217ec4a9 100644 --- a/quill-jasync-mysql/src/test/scala/io/getquill/context/jasync/mysql/MysqlJAsyncEncodingSpec.scala +++ b/quill-jasync-mysql/src/test/scala/io/getquill/context/jasync/mysql/MysqlJAsyncEncodingSpec.scala @@ -1,14 +1,16 @@ package io.getquill.context.jasync.mysql import java.time.{LocalDate, LocalDateTime} - import io.getquill.context.sql.EncodingSpec import scala.concurrent.ExecutionContext.Implicits.global -import scala.concurrent.Await +import scala.concurrent.{Await, Future} import scala.concurrent.duration.Duration import java.util.Date import io.getquill.Query +import io.getquill.context.jasync.mysql + +import java.time.temporal.ChronoUnit class MysqlJAsyncEncodingSpec extends EncodingSpec { @@ -88,7 +90,11 @@ class MysqlJAsyncEncodingSpec extends EncodingSpec { "decode LocalDate and LocalDateTime types" in { case class DateEncodingTestEntity(v1: LocalDate, v2: LocalDateTime, v3: LocalDateTime) - val entity = DateEncodingTestEntity(LocalDate.now, LocalDateTime.now, LocalDateTime.now) + val entity = DateEncodingTestEntity( + LocalDate.now, + LocalDateTime.now.truncatedTo(ChronoUnit.MILLIS), + LocalDateTime.now.truncatedTo(ChronoUnit.MILLIS) + ) val r = for { _ <- testContext.run(query[DateEncodingTestEntity].delete) _ <- testContext.run(query[DateEncodingTestEntity].insertValue(lift(entity))) @@ -131,7 +137,7 @@ class MysqlJAsyncEncodingSpec extends EncodingSpec { "encodes custom type inside singleton object" in { object Singleton { - def apply()(implicit c: TestContext) = { + def apply()(implicit c: TestContext): Future[Seq[Long]] = { import c._ for { _ <- c.run(query[EncodingTestEntity].delete) @@ -144,7 +150,7 @@ class MysqlJAsyncEncodingSpec extends EncodingSpec { Await.result(Singleton(), Duration.Inf) } - private def prepareEncodingTestEntity() = { + private def prepareEncodingTestEntity(): Unit = { val prepare = for { _ <- testContext.run(delete) _ <- testContext.run(liftQuery(insertValues).foreach(e => insert(e))) diff --git a/quill-jasync-postgres/src/test/scala/io/getquill/context/jasync/postgres/ArrayAsyncEncodingSpec.scala b/quill-jasync-postgres/src/test/scala/io/getquill/context/jasync/postgres/ArrayAsyncEncodingSpec.scala index 6ef5d0ced5..3756cadb59 100644 --- a/quill-jasync-postgres/src/test/scala/io/getquill/context/jasync/postgres/ArrayAsyncEncodingSpec.scala +++ b/quill-jasync-postgres/src/test/scala/io/getquill/context/jasync/postgres/ArrayAsyncEncodingSpec.scala @@ -1,18 +1,19 @@ package io.getquill.context.jasync.postgres -import java.time.{LocalDate, LocalDateTime} -import java.util.{Date, UUID} - import io.getquill.context.sql.EncodingTestType import io.getquill.context.sql.encoding.ArrayEncodingBaseSpec -import scala.concurrent.ExecutionContext.Implicits.global +import java.time.temporal.ChronoUnit +import java.time.{LocalDate, LocalDateTime} +import java.util.{Date, UUID} class ArrayAsyncEncodingSpec extends ArrayEncodingBaseSpec { - val ctx = testContext + import scala.concurrent.ExecutionContext.Implicits.global + + private val ctx = testContext import ctx._ - val q = quote(query[ArraysTestEntity]) + private val q = quote(query[ArraysTestEntity]) "Support all sql base types and `Iterable` implementers" in { await(ctx.run(q.insertValue(lift(e)))) @@ -23,7 +24,8 @@ class ArrayAsyncEncodingSpec extends ArrayEncodingBaseSpec { "Java8 times" in { case class Java8Times(timestamps: Seq[LocalDateTime], dates: Seq[LocalDate]) - val jE = Java8Times(Seq(LocalDateTime.now()), Seq(LocalDate.now())) + // See https://stackoverflow.com/a/74781779/2431728 + val jE = Java8Times(Seq(LocalDateTime.now().truncatedTo(ChronoUnit.MICROS)), Seq(LocalDate.now())) val jQ = quote(querySchema[Java8Times]("ArraysTestEntity")) await(ctx.run(jQ.insertValue(lift(jE)))) val actual = await(ctx.run(jQ)).head diff --git a/quill-jasync-postgres/src/test/scala/io/getquill/context/jasync/postgres/PostgresAsyncEncodingSpec.scala b/quill-jasync-postgres/src/test/scala/io/getquill/context/jasync/postgres/PostgresAsyncEncodingSpec.scala index f428040e1d..8c2c51f64b 100644 --- a/quill-jasync-postgres/src/test/scala/io/getquill/context/jasync/postgres/PostgresAsyncEncodingSpec.scala +++ b/quill-jasync-postgres/src/test/scala/io/getquill/context/jasync/postgres/PostgresAsyncEncodingSpec.scala @@ -1,7 +1,6 @@ package io.getquill.context.jasync.postgres import java.time.{LocalDate, LocalDateTime} - import io.getquill.context.sql.EncodingSpec import scala.concurrent.ExecutionContext.Implicits.global @@ -11,6 +10,8 @@ import java.util.Date import java.util.UUID import io.getquill.Query +import java.time.temporal.ChronoUnit + class PostgresAsyncEncodingSpec extends EncodingSpec { val context = testContext @@ -92,7 +93,10 @@ class PostgresAsyncEncodingSpec extends EncodingSpec { "decodes LocalDate and LocalDateTime types" in { case class DateEncodingTestEntity(v1: LocalDate, v2: LocalDateTime) - val entity = DateEncodingTestEntity(LocalDate.now, LocalDateTime.now) + val entity = DateEncodingTestEntity( + LocalDate.now, + LocalDateTime.now.truncatedTo(ChronoUnit.MICROS) + ) // https://stackoverflow.com/a/74781779/2431728 val r = for { _ <- testContext.run(query[DateEncodingTestEntity].delete) _ <- testContext.run(query[DateEncodingTestEntity].insertValue(lift(entity))) diff --git a/quill-jasync-zio-postgres/src/test/scala/io/getquill/context/qzio/jasync/postgres/ArrayAsyncEncodingSpec.scala b/quill-jasync-zio-postgres/src/test/scala/io/getquill/context/qzio/jasync/postgres/ArrayAsyncEncodingSpec.scala index 8d14a01c8c..9349e7191a 100644 --- a/quill-jasync-zio-postgres/src/test/scala/io/getquill/context/qzio/jasync/postgres/ArrayAsyncEncodingSpec.scala +++ b/quill-jasync-zio-postgres/src/test/scala/io/getquill/context/qzio/jasync/postgres/ArrayAsyncEncodingSpec.scala @@ -3,6 +3,7 @@ package io.getquill.context.qzio.jasync.postgres import io.getquill.context.sql.EncodingTestType import io.getquill.context.sql.encoding.ArrayEncodingBaseSpec +import java.time.temporal.ChronoUnit import java.time.{LocalDate, LocalDateTime} import java.util.{Date, UUID} @@ -20,7 +21,7 @@ class ArrayAsyncEncodingSpec extends ArrayEncodingBaseSpec with ZioSpec { "Java8 times" in { case class Java8Times(timestamps: Seq[LocalDateTime], dates: Seq[LocalDate]) - val jE = Java8Times(Seq(LocalDateTime.now()), Seq(LocalDate.now())) + val jE = Java8Times(Seq(LocalDateTime.now().truncatedTo(ChronoUnit.MICROS)), Seq(LocalDate.now())) val jQ = quote(querySchema[Java8Times]("ArraysTestEntity")) runSyncUnsafe(context.run(jQ.insertValue(lift(jE)))) val actual = runSyncUnsafe(context.run(jQ)).head diff --git a/quill-jasync-zio-postgres/src/test/scala/io/getquill/context/qzio/jasync/postgres/PostgresAsyncEncodingSpec.scala b/quill-jasync-zio-postgres/src/test/scala/io/getquill/context/qzio/jasync/postgres/PostgresAsyncEncodingSpec.scala index 09ec7e74cb..c9642d24de 100644 --- a/quill-jasync-zio-postgres/src/test/scala/io/getquill/context/qzio/jasync/postgres/PostgresAsyncEncodingSpec.scala +++ b/quill-jasync-zio-postgres/src/test/scala/io/getquill/context/qzio/jasync/postgres/PostgresAsyncEncodingSpec.scala @@ -7,6 +7,8 @@ import java.util.Date import java.util.UUID import io.getquill.Query +import java.time.temporal.ChronoUnit + class PostgresAsyncEncodingSpec extends EncodingSpec with ZioSpec { import context._ @@ -83,7 +85,7 @@ class PostgresAsyncEncodingSpec extends EncodingSpec with ZioSpec { "decodes LocalDate and LocalDateTime types" in { case class DateEncodingTestEntity(v1: LocalDate, v2: LocalDateTime) - val entity = DateEncodingTestEntity(LocalDate.now, LocalDateTime.now) + val entity = DateEncodingTestEntity(LocalDate.now, LocalDateTime.now.truncatedTo(ChronoUnit.MICROS)) val r = for { _ <- testContext.run(query[DateEncodingTestEntity].delete) _ <- testContext.run(query[DateEncodingTestEntity].insertValue(lift(entity))) diff --git a/quill-jasync/src/test/scala/io/getquill/context/jasync/TransactionalExecutionContextSpec.scala b/quill-jasync/src/test/scala/io/getquill/context/jasync/TransactionalExecutionContextSpec.scala index deeedf53f7..1302d3b4d6 100644 --- a/quill-jasync/src/test/scala/io/getquill/context/jasync/TransactionalExecutionContextSpec.scala +++ b/quill-jasync/src/test/scala/io/getquill/context/jasync/TransactionalExecutionContextSpec.scala @@ -9,29 +9,29 @@ class TransactionalExecutionContextSpec extends Spec { "uses the wrapped context to execute runnables" in { val executed = ListBuffer[Runnable]() val ec = new ExecutionContext { - def execute(r: Runnable) = { + def execute(r: Runnable): Unit = { executed += r - r.run + r.run() } - def reportFailure(t: Throwable) = ??? + def reportFailure(t: Throwable): Unit = ??? } val runnable = new Runnable { - override def run = {} + override def run() = {} } TransactionalExecutionContext(ec, null).execute(runnable) - executed.result mustEqual List(runnable) + executed.result() mustEqual List(runnable) } "uses the wrapped context to report errors" in { val reported = ListBuffer[Throwable]() val ec = new ExecutionContext { - def execute(r: Runnable) = ??? - def reportFailure(t: Throwable) = { + def execute(r: Runnable): Unit = ??? + def reportFailure(t: Throwable): Unit = { val r = reported += t } } val exception = new IllegalStateException TransactionalExecutionContext(ec, null).reportFailure(exception) - reported.result mustEqual List(exception) + reported.result() mustEqual List(exception) } } diff --git a/quill-jdbc-zio/src/main/scala/io/getquill/context/qzio/ResultSetIterator.scala b/quill-jdbc-zio/src/main/scala/io/getquill/context/qzio/ResultSetIterator.scala index e119578034..d885b56bb1 100644 --- a/quill-jdbc-zio/src/main/scala/io/getquill/context/qzio/ResultSetIterator.scala +++ b/quill-jdbc-zio/src/main/scala/io/getquill/context/qzio/ResultSetIterator.scala @@ -9,7 +9,7 @@ import java.sql.{Connection, ResultSet} * straightforward implementation of a hasNext method. */ class ResultSetIterator[T](rs: ResultSet, conn: Connection, extractor: (ResultSet, Connection) => T) - extends BufferedIterator[T] { + extends scala.collection.BufferedIterator[T] { private[this] var state = 0 // 0: no data, 1: cached, 2: finished private[this] var cached: T = null.asInstanceOf[T] diff --git a/quill-jdbc/src/test/scala/io/getquill/context/jdbc/postgres/JdbcEncodingSpec.scala b/quill-jdbc/src/test/scala/io/getquill/context/jdbc/postgres/JdbcEncodingSpec.scala index 603bcf25ad..f6eb11b64e 100644 --- a/quill-jdbc/src/test/scala/io/getquill/context/jdbc/postgres/JdbcEncodingSpec.scala +++ b/quill-jdbc/src/test/scala/io/getquill/context/jdbc/postgres/JdbcEncodingSpec.scala @@ -4,6 +4,8 @@ import java.time._ import io.getquill.context.sql.EncodingSpec import io.getquill.Query +import java.time.temporal.ChronoUnit + class JdbcEncodingSpec extends EncodingSpec { val context = testContext @@ -33,7 +35,7 @@ class JdbcEncodingSpec extends EncodingSpec { "LocalDateTime" in { case class EncodingTestEntity(v11: Option[LocalDateTime]) - val now = LocalDateTime.now() + val now = LocalDateTime.now().truncatedTo(ChronoUnit.MICROS) // See https://stackoverflow.com/a/74781779/2431728 val e1 = EncodingTestEntity(Some(now)) val e2 = EncodingTestEntity(None) val res: (List[EncodingTestEntity], List[EncodingTestEntity]) = performIO { diff --git a/quill-sql/src/main/scala/io/getquill/context/sql/encoding/ArrayEncoding.scala b/quill-sql/src/main/scala/io/getquill/context/sql/encoding/ArrayEncoding.scala index 32bb7abbdd..a624dad8e6 100644 --- a/quill-sql/src/main/scala/io/getquill/context/sql/encoding/ArrayEncoding.scala +++ b/quill-sql/src/main/scala/io/getquill/context/sql/encoding/ArrayEncoding.scala @@ -49,7 +49,7 @@ trait ArrayEncoding { bf: Factory[O, Col[O]] ): Decoder[Col[O]] = mappedDecoder[Seq[I], Col[O]]( - MappedEncoding((col: Seq[I]) => col.foldLeft(bf.newBuilder)((b, x) => b += mapped.f(x)).result), + MappedEncoding((col: Seq[I]) => col.foldLeft(bf.newBuilder)((b, x) => b += mapped.f(x)).result()), d ) } diff --git a/quill-sql/src/test/scala/io/getquill/context/sql/GroupBySpec.scala b/quill-sql/src/test/scala/io/getquill/context/sql/GroupBySpec.scala index 170ed53018..b84fdc1531 100644 --- a/quill-sql/src/test/scala/io/getquill/context/sql/GroupBySpec.scala +++ b/quill-sql/src/test/scala/io/getquill/context/sql/GroupBySpec.scala @@ -6,7 +6,7 @@ import io.getquill.base.Spec import io.getquill.context.sql.util.StringOps._ class GroupBySpec extends Spec { - implicit val naming = new Literal {} + implicit val naming: Literal = new Literal {} import io.getquill.norm.{DisablePhase, OptionalPhase} import io.getquill.norm.ConfigList._ diff --git a/quill-sql/src/test/scala/io/getquill/context/sql/OrderBySpec.scala b/quill-sql/src/test/scala/io/getquill/context/sql/OrderBySpec.scala index 3593ede20b..60e18dc9c9 100644 --- a/quill-sql/src/test/scala/io/getquill/context/sql/OrderBySpec.scala +++ b/quill-sql/src/test/scala/io/getquill/context/sql/OrderBySpec.scala @@ -5,7 +5,7 @@ import io.getquill.base.Spec class OrderBySpec extends Spec { - implicit val naming = new Literal {} + implicit val naming: Literal = new Literal {} case class Country(id: Int, name: String) case class City(name: String, countryId: Int) diff --git a/quill-sql/src/test/scala/io/getquill/context/sql/SqlQuerySpec.scala b/quill-sql/src/test/scala/io/getquill/context/sql/SqlQuerySpec.scala index 98b7f9f01d..114f2e436a 100644 --- a/quill-sql/src/test/scala/io/getquill/context/sql/SqlQuerySpec.scala +++ b/quill-sql/src/test/scala/io/getquill/context/sql/SqlQuerySpec.scala @@ -10,7 +10,7 @@ import io.getquill.util.TraceConfig class SqlQuerySpec extends Spec { - implicit val naming = new Literal {} + implicit val naming: Literal = new Literal {} val SqlQuery = new SqlQueryApply(TraceConfig.Empty) diff --git a/quill-sql/src/test/scala/io/getquill/context/sql/TestDecoders.scala b/quill-sql/src/test/scala/io/getquill/context/sql/TestDecoders.scala index 3fc13333de..8e487df1a3 100644 --- a/quill-sql/src/test/scala/io/getquill/context/sql/TestDecoders.scala +++ b/quill-sql/src/test/scala/io/getquill/context/sql/TestDecoders.scala @@ -3,8 +3,9 @@ package io.getquill.context.sql import io.getquill.MappedEncoding trait TestDecoders { - implicit val encodingTestTypeDecoder = MappedEncoding[String, EncodingTestType](EncodingTestType) - implicit val nameDecoder = MappedEncoding[String, Number](s => + implicit val encodingTestTypeDecoder: MappedEncoding[String, EncodingTestType] = + MappedEncoding[String, EncodingTestType](EncodingTestType) + implicit val nameDecoder: MappedEncoding[String, Number] = MappedEncoding[String, Number](s => Number .withValidation(s) .getOrElse(throw new Exception(s"Illegal number $s")) diff --git a/quill-sql/src/test/scala/io/getquill/context/sql/TestEncoders.scala b/quill-sql/src/test/scala/io/getquill/context/sql/TestEncoders.scala index dd403288d5..942f11172f 100644 --- a/quill-sql/src/test/scala/io/getquill/context/sql/TestEncoders.scala +++ b/quill-sql/src/test/scala/io/getquill/context/sql/TestEncoders.scala @@ -3,6 +3,7 @@ package io.getquill.context.sql import io.getquill.MappedEncoding trait TestEncoders { - implicit val encodingTestTypeEncoder = MappedEncoding[EncodingTestType, String](_.value) - implicit val nameEncoder = MappedEncoding[Number, String](_.value) + implicit val encodingTestTypeEncoder: MappedEncoding[EncodingTestType, String] = + MappedEncoding[EncodingTestType, String](_.value) + implicit val nameEncoder: MappedEncoding[Number, String] = MappedEncoding[Number, String](_.value) } diff --git a/quill-sql/src/test/scala/io/getquill/context/sql/base/BatchValuesSpec.scala b/quill-sql/src/test/scala/io/getquill/context/sql/base/BatchValuesSpec.scala index 25b3b598d8..ccc2bb9f14 100644 --- a/quill-sql/src/test/scala/io/getquill/context/sql/base/BatchValuesSpec.scala +++ b/quill-sql/src/test/scala/io/getquill/context/sql/base/BatchValuesSpec.scala @@ -16,7 +16,7 @@ trait BatchValuesSpec extends Spec with BeforeAndAfterEach { quote((p: Product) => query[Product].insertValue(p)) def makeProducts(maxRows: Int = 22) = - (1 to maxRows).map(i => Product(i, s"Product-${i}", i * 100)) + (1 to maxRows).map(i => Product(i, s"Product-$i", i.toLong * 100)) object `Ex 1 - Batch Insert Normal` { implicit val meta = insertMeta[Product](_.id) diff --git a/quill-sql/src/test/scala/io/getquill/context/sql/dsl/SqlDslSpec.scala b/quill-sql/src/test/scala/io/getquill/context/sql/dsl/SqlDslSpec.scala index f4d551a450..279ba49994 100644 --- a/quill-sql/src/test/scala/io/getquill/context/sql/dsl/SqlDslSpec.scala +++ b/quill-sql/src/test/scala/io/getquill/context/sql/dsl/SqlDslSpec.scala @@ -26,7 +26,7 @@ class SqlDslSpec extends Spec { "forUpdate" in { val q: Quoted[Query[TestEntity]] = quote { - query[TestEntity].filter(t => t.s == "a").forUpdate + query[TestEntity].filter(t => t.s == "a").forUpdate() } testContext.run(q).string mustEqual "SELECT t.s, t.i, t.l, t.o, t.b FROM TestEntity t WHERE t.s = 'a' FOR UPDATE" } @@ -34,7 +34,7 @@ class SqlDslSpec extends Spec { "forUpdate naming schema" in { val q: Quoted[Query[TestEntity]] = quote { - query[TestEntity].filter(t => t.s == "a").forUpdate + query[TestEntity].filter(t => t.s == "a").forUpdate() } testContext.run(q).string mustEqual "SELECT t.s, t.i, t.l, t.o, t.b FROM TestEntity t WHERE t.s = 'a' FOR UPDATE" }