From 813ce049a541ce2005bf2301956203c9f69052df Mon Sep 17 00:00:00 2001 From: Kseniya Tomskikh Date: Tue, 22 May 2018 19:45:57 -0700 Subject: HYPE-5 Support filters by date --- .../driver/restquery/db/SlickQueryBuilder.scala | 10 ++++---- .../rest/parsers/SearchFilterParser.scala | 13 ++++++++-- .../rest/parsers/SearchFilterParserSuite.scala | 28 ++++++++++++++++++++++ 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( -- cgit v1.2.3