diff --git a/lib/mobility-core/src/Kernel/Storage/ClickhouseV2/Internal/ClickhouseQuery.hs b/lib/mobility-core/src/Kernel/Storage/ClickhouseV2/Internal/ClickhouseQuery.hs index abb517ae0..af9bb8dd8 100644 --- a/lib/mobility-core/src/Kernel/Storage/ClickhouseV2/Internal/ClickhouseQuery.hs +++ b/lib/mobility-core/src/Kernel/Storage/ClickhouseV2/Internal/ClickhouseQuery.hs @@ -50,6 +50,7 @@ instance <> selectModifier <> mkMaybeClause @(Where t) q.whereQ <> toClickhouseQuery @(GroupBy a gr) groupBy + <> mkMaybeClause @(Having t) (q.havingQ <&> ($ cols)) <> mkMaybeClause @(OrderBy ord) (q.orderByQ <&> ($ cols)) <> mkMaybeClause @Limit q.limitQ <> mkMaybeClause @Offset q.offsetQ @@ -121,6 +122,9 @@ instance ClickhouseQuery gr => ClickhouseQuery (GroupBy a gr) where toClickhouseQuery Aggregate = mempty toClickhouseQuery NotGrouped = mempty +instance ClickhouseTable t => ClickhouseQuery (Having t) where + toClickhouseQuery (Having clause) = " HAVING " <> addBrackets (toClickhouseQuery @(Clause t) clause) + instance ClickhouseTable t => ClickhouseQuery (Column a t value) where toClickhouseQuery = fromString . showColumn diff --git a/lib/mobility-core/src/Kernel/Storage/ClickhouseV2/Internal/Types.hs b/lib/mobility-core/src/Kernel/Storage/ClickhouseV2/Internal/Types.hs index 37b120783..144d3a683 100644 --- a/lib/mobility-core/src/Kernel/Storage/ClickhouseV2/Internal/Types.hs +++ b/lib/mobility-core/src/Kernel/Storage/ClickhouseV2/Internal/Types.hs @@ -100,6 +100,8 @@ data Term value where newtype Where table = Where (Clause table) +newtype Having table = Having (Clause table) + class IsGroupColumns cols where type GroupColumnsType cols groupColumns :: cols -> GroupColumnsType cols @@ -195,6 +197,7 @@ data Q db table cols ord acols = (ClickhouseDb db) => limitQ :: Maybe Limit, offsetQ :: Maybe Offset, orderByQ :: Maybe (cols -> OrderBy ord), + havingQ :: Maybe (cols -> Having table), selectModifierOverrideQ :: Maybe SelectModifier } diff --git a/lib/mobility-core/src/Kernel/Storage/ClickhouseV2/Operators.hs b/lib/mobility-core/src/Kernel/Storage/ClickhouseV2/Operators.hs index 3efde7854..18ca229a0 100644 --- a/lib/mobility-core/src/Kernel/Storage/ClickhouseV2/Operators.hs +++ b/lib/mobility-core/src/Kernel/Storage/ClickhouseV2/Operators.hs @@ -113,6 +113,9 @@ asc = OrderBy Asc desc :: forall ord. IsOrderColumns ord => ord -> OrderBy ord desc = OrderBy Desc +having :: forall db table cols ord acols. (cols -> Having table) -> Q db table cols ord acols -> Q db table cols ord acols +having havingClause q = q {havingQ = Just havingClause} + groupBy :: forall cols gr. IsGroupColumns gr => gr -> (GroupColumnsType gr -> cols) -> (cols, GroupBy 'AGG gr) groupBy gr mkCols = (mkCols (groupColumns gr), GroupBy gr) @@ -153,6 +156,7 @@ filter_ filterClause (table, level) = limitQ = Nothing, offsetQ = Nothing, orderByQ = Nothing, + havingQ = Nothing, selectModifierOverrideQ = Nothing } @@ -168,6 +172,7 @@ emptyFilter (table, level) = limitQ = Nothing, offsetQ = Nothing, orderByQ = Nothing, + havingQ = Nothing, selectModifierOverrideQ = Nothing }