aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvlad <vlad@driver.xyz>2017-09-27 02:18:27 -0700
committervlad <vlad@driver.xyz>2017-09-27 02:18:27 -0700
commit36d217f00374525f604233e2ec248b9cca155bea (patch)
treeb7850404e60bb886c1ba4aecfeb452ea9e968dc4
parent45556d467b8dd22d9b7677c95d5c47f35905ca4a (diff)
downloadrest-query-36d217f00374525f604233e2ec248b9cca155bea.tar.gz
rest-query-36d217f00374525f604233e2ec248b9cca155bea.tar.bz2
rest-query-36d217f00374525f604233e2ec248b9cca155bea.zip
Allow parser to parse long numbers
-rw-r--r--src/main/scala/xyz/driver/pdsuicommon/parsers/SearchFilterParser.scala17
-rw-r--r--src/test/scala/xyz/driver/pdsuicommon/parsers/SearchFilterParserSuite.scala10
2 files changed, 21 insertions, 6 deletions
diff --git a/src/main/scala/xyz/driver/pdsuicommon/parsers/SearchFilterParser.scala b/src/main/scala/xyz/driver/pdsuicommon/parsers/SearchFilterParser.scala
index 7e86eae..11d336e 100644
--- a/src/main/scala/xyz/driver/pdsuicommon/parsers/SearchFilterParser.scala
+++ b/src/main/scala/xyz/driver/pdsuicommon/parsers/SearchFilterParser.scala
@@ -13,10 +13,15 @@ import scala.util.Try
object SearchFilterParser {
private object BinaryAtomFromTuple {
- def unapply(input: (SearchFilterExpr.Dimension, (String, String))): Option[SearchFilterExpr.Atom.Binary] = {
+ def unapply(input: (SearchFilterExpr.Dimension, (String, Any))): Option[SearchFilterExpr.Atom.Binary] = {
val (dimensionName, (strOperation, value)) = input
+ val updatedValue = value match {
+ case s: String => s.safeTrim
+ case a => a
+ }
+
parseOperation(strOperation.toLowerCase).map { op =>
- SearchFilterExpr.Atom.Binary(dimensionName, op, value.safeTrim)
+ SearchFilterExpr.Atom.Binary(dimensionName, op, updatedValue.asInstanceOf[AnyRef])
}
}
}
@@ -68,7 +73,7 @@ object SearchFilterParser {
}
private val numericOperatorParser: Parser[String] = {
- P((IgnoreCase("gt") | IgnoreCase("lt")) ~ IgnoreCase("eq").?).!
+ P(IgnoreCase("eq") | ((IgnoreCase("gt") | IgnoreCase("lt")) ~ IgnoreCase("eq").?)).!
}
private val naryOperatorParser: Parser[String] = P(IgnoreCase("in")).!
@@ -91,10 +96,12 @@ object SearchFilterParser {
private val nAryValueParser: Parser[String] = P(CharPred(_ != ',').rep(min = 1).!)
+ private val longParser: Parser[Long] = P(CharIn('0'to'9').rep(1).!.map(_.toLong))
+
private val binaryAtomParser: Parser[SearchFilterExpr.Atom.Binary] = P(
dimensionParser ~ whitespaceParser ~ (
- (numericOperatorParser.! ~/ whitespaceParser ~/ numberParser.!) |
- (commonOperatorParser.! ~/ whitespaceParser ~/ AnyChar.rep(min = 1).!)
+ (numericOperatorParser.! ~ whitespaceParser ~ (longParser | numberParser.!)) |
+ (commonOperatorParser.! ~ whitespaceParser ~ AnyChar.rep(min = 1).!)
) ~ End
).map {
case BinaryAtomFromTuple(atom) => atom
diff --git a/src/test/scala/xyz/driver/pdsuicommon/parsers/SearchFilterParserSuite.scala b/src/test/scala/xyz/driver/pdsuicommon/parsers/SearchFilterParserSuite.scala
index f47f4c2..ba67d13 100644
--- a/src/test/scala/xyz/driver/pdsuicommon/parsers/SearchFilterParserSuite.scala
+++ b/src/test/scala/xyz/driver/pdsuicommon/parsers/SearchFilterParserSuite.scala
@@ -9,6 +9,7 @@ import org.scalacheck.Arbitrary.arbitrary
import org.scalacheck.{Gen, Prop}
import org.scalatest.FreeSpecLike
import org.scalatest.prop.Checkers
+import xyz.driver.pdsuicommon.db.SearchFilterBinaryOperation.Eq
import xyz.driver.pdsuicommon.db.SearchFilterNAryOperation.In
import xyz.driver.pdsuicommon.utils.Utils
import xyz.driver.pdsuicommon.utils.Utils._
@@ -104,6 +105,13 @@ class SearchFilterParserSuite extends FreeSpecLike with Checkers {
}
}
+ "actual recordId" - {
+ "should not be parsed with text values" in {
+ val filter = SearchFilterParser.parse(Seq("filters" -> "recordId EQ 1"))
+ assert(filter === Success(SearchFilterExpr.Atom.Binary(Dimension(None, "record_id"), Eq, Long.box(1))))
+ }
+ }
+
"all operators" - {
"should be parsed with numeric values" in check {
val testQueryGen = queryGen(
@@ -181,7 +189,7 @@ class SearchFilterParserSuite extends FreeSpecLike with Checkers {
private val nonEmptyString = arbitrary[String].filter { s => !s.safeTrim.isEmpty }
- private val numericBinaryAtomValuesGen: Gen[String] = arbitrary[BigInt].map(_.toString)
+ private val numericBinaryAtomValuesGen: Gen[String] = arbitrary[Long].map(_.toString)
private val inValueGen: Gen[String] = {
Gen.nonEmptyContainerOf[Seq, Char](inValueCharsGen).map(_.mkString).filter(_.safeTrim.nonEmpty)
}