Skip to content

Commit 8ddbfbc

Browse files
committed
Backend/fix : toClickHouseVal support for Boolean Values
1 parent 3dc55f8 commit 8ddbfbc

2 files changed

Lines changed: 20 additions & 3 deletions

File tree

lib/mobility-core/src/Kernel/Storage/ClickhouseV2/ClickhouseValue.hs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,12 @@ instance FromJSON (Value a) where
4848
class (Show a, Read a) => ClickhouseValue a where
4949
toClickhouseValue :: a -> Value a
5050
fromClickhouseValue :: Value a -> Except a
51+
toClickhouseFilterValues :: a -> NonEmpty (Value a)
5152
toClickhouseValue = String . show
5253
fromClickhouseValue (String str) = parseAsString @a str
5354
fromClickhouseValue (Number _) = fail "Unexpected Number"
5455
fromClickhouseValue Null = fail "Unexpected Null"
56+
toClickhouseFilterValues a = toClickhouseValue a :| []
5557

5658
-- For ATLAS_KAFKA env we store numbers as String, for APP_SERVICE_CLICKHOUSE env we store as Number. So we should be able to parse both
5759
instance ClickhouseValue HighPrecMoney where
@@ -101,6 +103,8 @@ parseAsNumber = Except . eitherResult . A.fromJSON @a . A.Number
101103
instance ClickhouseValue Bool where
102104
toClickhouseValue True = Number 1
103105
toClickhouseValue False = Number 0
106+
toClickhouseFilterValues True = Number 1 :| [String "True", String "TRUE", String "true"] -- we are not sure about the current clickhouse Bool format
107+
toClickhouseFilterValues False = Number 0 :| [String "False", String "FALSE", String "false"]
104108
fromClickhouseValue (String "1") = pure True
105109
fromClickhouseValue (String "0") = pure False
106110
fromClickhouseValue (String "True") = pure True

lib/mobility-core/src/Kernel/Storage/ClickhouseV2/Internal/ClickhouseQuery.hs

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,17 +73,30 @@ instance (ClickhouseTable t) => ClickhouseQuery (Clause t) where
7373
toClickhouseQuery (Val b) = RawQuery $ C.toLower <$> show @String @Bool b
7474

7575
instance ClickhouseValue value => ClickhouseQuery (Term value) where
76-
toClickhouseQuery (In valList) = " IN " <> (addBrackets . intercalate "," . (valToClickhouseQuery @value <$>) $ toList valList)
77-
toClickhouseQuery (Eq term) = "=" <> valToClickhouseQuery @value term
76+
toClickhouseQuery (In valList) = " IN " <> renderInList (toList valList >>= (toList . toClickhouseFilterValues @value))
77+
toClickhouseQuery (Eq term) = eqOrInClickhouseQuery @value term
7878
toClickhouseQuery NullTerm = " IS NULL"
7979
toClickhouseQuery NotNullTerm = " IS NOT NULL"
80-
toClickhouseQuery (NotEq term) = "!=" <> valToClickhouseQuery @value term
80+
toClickhouseQuery (NotEq term) = notEqOrNotInClickhouseQuery @value term
8181
toClickhouseQuery (GreaterThan term) = ">" <> valToClickhouseQuery @value term
8282
toClickhouseQuery (GreaterOrEqualThan term) = ">=" <> valToClickhouseQuery @value term
8383
toClickhouseQuery (LessThan term) = "<" <> valToClickhouseQuery @value term
8484
toClickhouseQuery (LessOrEqualThan term) = "<=" <> valToClickhouseQuery @value term
8585
toClickhouseQuery (Like term) = " LIKE " <> valToClickhouseQuery @value term
8686

87+
eqOrInClickhouseQuery :: forall value. ClickhouseValue value => value -> RawQuery
88+
eqOrInClickhouseQuery term = case toClickhouseFilterValues @value term of
89+
v :| [] -> "=" <> toClickhouseQuery @(Value value) v
90+
vs -> " IN " <> renderInList (toList vs)
91+
92+
notEqOrNotInClickhouseQuery :: forall value. ClickhouseValue value => value -> RawQuery
93+
notEqOrNotInClickhouseQuery term = case toClickhouseFilterValues @value term of
94+
v :| [] -> "!=" <> toClickhouseQuery @(Value value) v
95+
vs -> " NOT IN " <> renderInList (toList vs)
96+
97+
renderInList :: forall value. ClickhouseValue value => [Value value] -> RawQuery
98+
renderInList = addBrackets . intercalate "," . (toClickhouseQuery @(Value value) <$>)
99+
87100
-- do we need quotes for each datatype?
88101
valToClickhouseQuery :: forall value. ClickhouseValue value => value -> RawQuery
89102
valToClickhouseQuery = toClickhouseQuery @(Value value) . toClickhouseValue @value

0 commit comments

Comments
 (0)