diff --git a/server/src-lib/Hasura/GraphQL/Resolve/BoolExp.hs b/server/src-lib/Hasura/GraphQL/Resolve/BoolExp.hs index 30321acccbf58..c13c700f2b878 100644 --- a/server/src-lib/Hasura/GraphQL/Resolve/BoolExp.hs +++ b/server/src-lib/Hasura/GraphQL/Resolve/BoolExp.hs @@ -1,7 +1,8 @@ -{-# LANGUAGE FlexibleContexts #-} -{-# LANGUAGE MultiWayIf #-} -{-# LANGUAGE NoImplicitPrelude #-} -{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE MultiParamTypeClasses #-} +{-# LANGUAGE MultiWayIf #-} +{-# LANGUAGE NoImplicitPrelude #-} +{-# LANGUAGE OverloadedStrings #-} module Hasura.GraphQL.Resolve.BoolExp ( parseBoolExp @@ -25,6 +26,7 @@ import Hasura.GraphQL.Validate.Types import Hasura.RQL.Types import Hasura.SQL.Types +import Hasura.SQL.Value parseOpExps :: (MonadError QErr m, MonadReader r m, Has FieldMap r) @@ -35,6 +37,7 @@ parseOpExps annVal = do "_eq" -> fmap RA.AEQ <$> asPGColValM v "_ne" -> fmap RA.ANE <$> asPGColValM v "_neq" -> fmap RA.ANE <$> asPGColValM v + "_is_null" -> resolveIsNull v "_in" -> fmap (RA.AIN . catMaybes) <$> parseMany asPGColValM v "_nin" -> fmap (RA.ANIN . catMaybes) <$> parseMany asPGColValM v @@ -59,6 +62,13 @@ parseOpExps annVal = do <> ": " <> showName k return $ map RA.OEVal $ catMaybes $ fromMaybe [] opExpsM + where + resolveIsNull v = case v of + AGScalar _ Nothing -> return Nothing + AGScalar _ (Just (PGValBoolean b)) -> + return $ Just $ bool RA.ANISNOTNULL RA.ANISNULL b + AGScalar _ _ -> throw500 "boolean value is expected" + _ -> tyMismatch "pgvalue" v parseColExp :: (MonadError QErr m, MonadReader r m, Has FieldMap r) diff --git a/server/src-lib/Hasura/GraphQL/Schema.hs b/server/src-lib/Hasura/GraphQL/Schema.hs index 8471170242800..697fa18c6528b 100644 --- a/server/src-lib/Hasura/GraphQL/Schema.hs +++ b/server/src-lib/Hasura/GraphQL/Schema.hs @@ -31,9 +31,9 @@ import qualified Language.GraphQL.Draft.Syntax as G import Hasura.GraphQL.Resolve.Context import Hasura.GraphQL.Validate.Types +import Hasura.Prelude import Hasura.RQL.Types import Hasura.SQL.Types -import Hasura.Prelude import qualified Hasura.SQL.DML as S @@ -116,6 +116,7 @@ mkCompExpInp colTy = [ map (mk colScalarTy) typedOps , map (mk $ G.toLT colScalarTy) listOps , bool [] (map (mk $ mkScalarTy PGText) stringOps) isStringTy + , [InpValInfo Nothing "_is_null" $ G.TypeNamed $ G.NamedType "Boolean"] ] where tyDesc = mconcat diff --git a/server/src-lib/Hasura/RQL/GBoolExp.hs b/server/src-lib/Hasura/RQL/GBoolExp.hs index d308cc652d2f9..c49b18872b616 100644 --- a/server/src-lib/Hasura/RQL/GBoolExp.hs +++ b/server/src-lib/Hasura/RQL/GBoolExp.hs @@ -1,9 +1,9 @@ -{-# LANGUAGE FlexibleContexts #-} -{-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE LambdaCase #-} -{-# LANGUAGE MultiWayIf #-} -{-# LANGUAGE OverloadedStrings #-} -{-# LANGUAGE TypeSynonymInstances #-} +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE MultiWayIf #-} +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE TypeSynonymInstances #-} module Hasura.RQL.GBoolExp where @@ -40,6 +40,9 @@ data AnnValOpExpG a | ASIMILAR !a -- similar, regex | ANSIMILAR !a-- not similar, regex + | ANISNULL -- IS NULL + | ANISNOTNULL -- IS NOT NULL + deriving (Eq, Show) data OpExpG a @@ -445,6 +448,8 @@ mkBoolExpBuilder rhsBldr lhs = \case ANILIKE val -> mkSimpleBoolExpBuilder (S.BECompare S.SNILIKE) val ASIMILAR val -> mkSimpleBoolExpBuilder (S.BECompare S.SSIMILAR) val ANSIMILAR val -> mkSimpleBoolExpBuilder (S.BECompare S.SNSIMILAR) val + ANISNULL -> return $ S.BENull lhs + ANISNOTNULL -> return $ S.BENotNull lhs where mkSimpleBoolExpBuilder beF pgColVal = beF lhs <$> rhsBldr pgColVal