aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKseniya Tomskikh <ktomskih@datamonsters.co>2018-05-22 19:45:57 -0700
committerKseniya Tomskikh <ktomskih@datamonsters.co>2018-05-22 19:45:57 -0700
commit813ce049a541ce2005bf2301956203c9f69052df (patch)
treea7a68723dd88819ee8a82169ccb687cad1a3fca8
parent79f539d90b0f18b44c5ee6af08aeda6adfb08612 (diff)
downloadrest-query-813ce049a541ce2005bf2301956203c9f69052df.tar.gz
rest-query-813ce049a541ce2005bf2301956203c9f69052df.tar.bz2
rest-query-813ce049a541ce2005bf2301956203c9f69052df.zip
HYPE-5 Support filters by dateHYPE-50
-rw-r--r--src/main/scala/xyz/driver/restquery/db/SlickQueryBuilder.scala10
-rw-r--r--src/main/scala/xyz/driver/restquery/rest/parsers/SearchFilterParser.scala13
-rw-r--r--src/test/scala/xyz/driver/restquery/rest/parsers/SearchFilterParserSuite.scala28
3 files changed, 45 insertions, 6 deletions
diff --git a/src/main/scala/xyz/driver/restquery/db/SlickQueryBuilder.scala b/src/main/scala/xyz/driver/restquery/db/SlickQueryBuilder.scala
index 2947b3c..f7b5a7f 100644
--- a/src/main/scala/xyz/driver/restquery/db/SlickQueryBuilder.scala
+++ b/src/main/scala/xyz/driver/restquery/db/SlickQueryBuilder.scala
@@ -60,10 +60,12 @@ final case class SlickPostgresQueryBuilderParameters(
def limitToSql()(implicit profile: JdbcProfile): SQLActionBuilder = {
import profile.api._
- pagination.map { pagination =>
- val startFrom = (pagination.pageNumber - 1) * pagination.pageSize
- sql"limit #${pagination.pageSize} OFFSET #$startFrom"
- } getOrElse (sql"")
+ pagination
+ .map { pagination =>
+ val startFrom = (pagination.pageNumber - 1) * pagination.pageSize
+ sql"limit #${pagination.pageSize} OFFSET #$startFrom"
+ }
+ .getOrElse(sql"")
}
val qs = """""""
diff --git a/src/main/scala/xyz/driver/restquery/rest/parsers/SearchFilterParser.scala b/src/main/scala/xyz/driver/restquery/rest/parsers/SearchFilterParser.scala
index 23cb2f0..0d351e9 100644
--- a/src/main/scala/xyz/driver/restquery/rest/parsers/SearchFilterParser.scala
+++ b/src/main/scala/xyz/driver/restquery/rest/parsers/SearchFilterParser.scala
@@ -1,5 +1,6 @@
package xyz.driver.restquery.rest.parsers
+import java.time.LocalDate
import java.util.UUID
import fastparse.all._
@@ -121,9 +122,16 @@ object SearchFilterParser {
UUID.fromString(s"$group1-$group2-$group3-$group4-$group5")
}
+ private val dateParser: Parser[LocalDate] =
+ P(CharIn('0' to '9').rep(min = 4).! ~ "-" ~ CharIn('0' to '9').rep(1).! ~ "-" ~ CharIn('0' to '9').rep(1).!)
+ .map {
+ case (year, month, day) =>
+ LocalDate.of(year.toInt, month.toInt, day.toInt)
+ }
+
private val binaryAtomParser: Parser[SearchFilterExpr.Atom.Binary] = P(
dimensionParser ~ whitespaceParser ~
- ((numericOperatorParser.! ~ whitespaceParser ~ (longParser | numberParser.!) ~ End) |
+ ((numericOperatorParser.! ~ whitespaceParser ~ (dateParser | longParser | numberParser.!) ~ End) |
(commonOperatorParser.! ~ whitespaceParser ~ (uuidParser | booleanParser | AnyChar
.rep(min = 1)
.!) ~ End))
@@ -134,7 +142,8 @@ object SearchFilterParser {
private val nAryAtomParser: Parser[SearchFilterExpr.Atom.NAry] = P(
dimensionParser ~ whitespaceParser ~ (
naryOperatorParser ~ whitespaceParser ~
- ((uuidParser.rep(min = 1, sep = ",") ~ End) |
+ ((dateParser.rep(min = 1, sep = ",") ~ End) |
+ (uuidParser.rep(min = 1, sep = ",") ~ End) |
(longParser.rep(min = 1, sep = ",") ~ End) |
(booleanParser.rep(min = 1, sep = ",") ~ End) |
(nAryValueParser.!.rep(min = 1, sep = ",") ~ End))
diff --git a/src/test/scala/xyz/driver/restquery/rest/parsers/SearchFilterParserSuite.scala b/src/test/scala/xyz/driver/restquery/rest/parsers/SearchFilterParserSuite.scala
index 9abf372..4abf550 100644
--- a/src/test/scala/xyz/driver/restquery/rest/parsers/SearchFilterParserSuite.scala
+++ b/src/test/scala/xyz/driver/restquery/rest/parsers/SearchFilterParserSuite.scala
@@ -1,5 +1,6 @@
package xyz.driver.restquery.rest.parsers
+import java.time.LocalDate
import java.util.UUID
import fastparse.core.Parsed
@@ -162,6 +163,33 @@ class SearchFilterParserSuite extends FreeSpecLike with Checkers {
}
}
+ "actual startDate - date" - {
+ "should parse the full date as java.time.LocalDate type" in {
+ val filter = SearchFilterParser.parse(Seq("filters" -> "startDate EQ 2018-05-22"))
+ assert(
+ filter === Success(SearchFilterExpr.Atom
+ .Binary(Dimension(None, "start_date"), Eq, LocalDate.of(2018, 5, 22))))
+ }
+ }
+
+ "actual date list" - {
+ "should parse the list of dates as java.time.LocalDate type" in {
+ val filter = SearchFilterParser.parse(Seq("filters" -> ("startDate in 2018-05-19," +
+ "2018-05-20,2018-05-21")))
+ assert(
+ filter === Success(
+ SearchFilterExpr.Atom.NAry(
+ Dimension(None, "start_date"),
+ In,
+ Seq(
+ LocalDate.of(2018, 5, 19),
+ LocalDate.of(2018, 5, 20),
+ LocalDate.of(2018, 5, 21)
+ )
+ )))
+ }
+ }
+
"all operators" - {
"should be parsed with numeric values" in check {
val testQueryGen = queryGen(