2021-12-13 19:48:10 +03:00
|
|
|
|
{-# LANGUAGE DeriveAnyClass #-}
|
2022-03-16 03:39:21 +03:00
|
|
|
|
{-# LANGUAGE TemplateHaskell #-}
|
2020-10-22 23:42:27 +03:00
|
|
|
|
{-# LANGUAGE UndecidableInstances #-}
|
2018-12-12 15:58:39 +03:00
|
|
|
|
|
2021-09-24 01:56:37 +03:00
|
|
|
|
-- | This modules defines the tree of Select types: how we represent a query internally, from its top
|
|
|
|
|
-- level 'QueryDB' down to each individual field. Most of those types have three type arguments:
|
|
|
|
|
--
|
|
|
|
|
-- b: BackendType
|
|
|
|
|
-- The backend that is targeted by that specific select (Postgres Vanilla, MSSQL...); we use the
|
|
|
|
|
-- type families in the Backend class to decide how different parts of the IR are represented in
|
|
|
|
|
-- different backends.
|
|
|
|
|
--
|
|
|
|
|
-- v: Type
|
|
|
|
|
-- The type of the leaf values in our AST; used almost exclusively for column values, over which
|
|
|
|
|
-- queries can be parameterized. The output of the parser phase will use @UnpreparedValue b@ for
|
|
|
|
|
-- the leaves, and most backends will then transform the AST to interpret those values and
|
|
|
|
|
-- consequently change @v@ to be @SQLExpression b@
|
|
|
|
|
--
|
|
|
|
|
-- r: BackendType -> Type
|
|
|
|
|
-- Joins across backends mean that the aforementioned @b@ parameter won't be the same throughout
|
|
|
|
|
-- the entire tree; at some point we will have an 'AnyBackend' used to encapsulate a branch that
|
|
|
|
|
-- uses a different @b@. We still want, however, to be able to parameterize the values of the
|
|
|
|
|
-- leaves in that separate branch, and that's what the @r@ parameter is for. We also use
|
|
|
|
|
-- 'UnpreparedValue' here during the parsing phase, meaning all leaf values will be
|
|
|
|
|
-- @UnpreparedValue b@ for their respective backend @b@, and most backends will then transform
|
|
|
|
|
-- their AST, cutting all such remote branches, and therefore using @Const Void@ for @r@.
|
2021-11-04 19:08:33 +03:00
|
|
|
|
module Hasura.RQL.IR.Select
|
2022-03-03 06:43:27 +03:00
|
|
|
|
( AggregateField (..),
|
2021-11-04 19:08:33 +03:00
|
|
|
|
AggregateFields,
|
|
|
|
|
AggregateOp (..),
|
|
|
|
|
AnnAggregateSelect,
|
|
|
|
|
AnnAggregateSelectG,
|
|
|
|
|
AnnColumnField (..),
|
|
|
|
|
AnnField,
|
|
|
|
|
AnnFieldG (..),
|
|
|
|
|
AnnFields,
|
|
|
|
|
AnnFieldsG,
|
|
|
|
|
AnnObjectSelect,
|
|
|
|
|
AnnObjectSelectG (..),
|
|
|
|
|
AnnRelationSelectG (..),
|
|
|
|
|
AnnSelectG (..),
|
2022-04-07 17:41:43 +03:00
|
|
|
|
AnnSelectStreamG (..),
|
2021-11-04 19:08:33 +03:00
|
|
|
|
AnnSimpleSelect,
|
|
|
|
|
AnnSimpleSelectG,
|
2022-04-07 17:41:43 +03:00
|
|
|
|
AnnSimpleStreamSelect,
|
|
|
|
|
AnnSimpleStreamSelectG,
|
2021-11-04 19:08:33 +03:00
|
|
|
|
AnnotatedAggregateOrderBy (..),
|
|
|
|
|
AnnotatedOrderByElement (..),
|
|
|
|
|
AnnotatedOrderByItem,
|
|
|
|
|
AnnotatedOrderByItemG,
|
|
|
|
|
ArgumentExp (..),
|
|
|
|
|
ArrayAggregateSelect,
|
|
|
|
|
ArrayAggregateSelectG,
|
|
|
|
|
ArrayConnectionSelect,
|
|
|
|
|
ArrayRelationSelectG,
|
|
|
|
|
ArraySelect,
|
|
|
|
|
ArraySelectFieldsG,
|
|
|
|
|
ArraySelectG (..),
|
|
|
|
|
ColFld (..),
|
|
|
|
|
ColumnFields,
|
|
|
|
|
ComputedFieldOrderBy (..),
|
|
|
|
|
ComputedFieldOrderByElement (..),
|
|
|
|
|
ComputedFieldScalarSelect (..),
|
|
|
|
|
ComputedFieldSelect (..),
|
|
|
|
|
ConnectionField (..),
|
|
|
|
|
ConnectionFields,
|
|
|
|
|
ConnectionSelect (..),
|
|
|
|
|
ConnectionSlice (..),
|
|
|
|
|
ConnectionSplit (..),
|
|
|
|
|
ConnectionSplitKind (..),
|
|
|
|
|
EdgeField (..),
|
|
|
|
|
EdgeFields,
|
|
|
|
|
FunctionArgExp,
|
|
|
|
|
FunctionArgsExpG (..),
|
|
|
|
|
FunctionArgsExpTableRow,
|
2021-12-13 19:48:10 +03:00
|
|
|
|
FIIdentifier (..),
|
2021-11-04 19:08:33 +03:00
|
|
|
|
ObjectRelationSelect,
|
|
|
|
|
ObjectRelationSelectG,
|
|
|
|
|
PageInfoField (..),
|
|
|
|
|
PageInfoFields,
|
|
|
|
|
QueryDB (..),
|
|
|
|
|
RemoteSourceSelect (..),
|
|
|
|
|
SelectArgs,
|
|
|
|
|
SelectArgsG (..),
|
2022-04-07 17:41:43 +03:00
|
|
|
|
SelectStreamArgsG (..),
|
|
|
|
|
SelectStreamArgs,
|
2021-11-04 19:08:33 +03:00
|
|
|
|
SelectFrom,
|
|
|
|
|
SelectFromG (..),
|
2021-12-07 16:12:02 +03:00
|
|
|
|
RemoteRelationshipSelect (..),
|
2021-11-04 19:08:33 +03:00
|
|
|
|
SourceRelationshipSelection (..),
|
2022-04-07 17:41:43 +03:00
|
|
|
|
StreamCursorItem (..),
|
2021-11-04 19:08:33 +03:00
|
|
|
|
TableAggregateField,
|
|
|
|
|
TableAggregateFieldG (..),
|
|
|
|
|
TableAggregateFields,
|
|
|
|
|
TableAggregateFieldsG,
|
|
|
|
|
TablePerm,
|
|
|
|
|
TablePermG (..),
|
2022-01-18 17:53:44 +03:00
|
|
|
|
CountDistinct (..),
|
2021-12-13 19:48:10 +03:00
|
|
|
|
actionResponsePayloadColumn,
|
2022-03-10 09:17:48 +03:00
|
|
|
|
aarRelationshipName,
|
|
|
|
|
aarColumnMapping,
|
|
|
|
|
aarAnnSelect,
|
|
|
|
|
aosFields,
|
|
|
|
|
aosTableFrom,
|
|
|
|
|
aosTableFilter,
|
2021-11-04 19:08:33 +03:00
|
|
|
|
asnArgs,
|
|
|
|
|
asnFields,
|
|
|
|
|
asnFrom,
|
|
|
|
|
asnPerm,
|
|
|
|
|
asnStrfyNum,
|
2022-03-08 11:22:20 +03:00
|
|
|
|
bifoldMapAnnSelectG,
|
2022-03-10 09:17:48 +03:00
|
|
|
|
csXRelay,
|
|
|
|
|
csPrimaryKeyColumns,
|
|
|
|
|
csSplit,
|
|
|
|
|
csSlice,
|
|
|
|
|
csSelect,
|
2021-11-04 19:08:33 +03:00
|
|
|
|
emptyFunctionArgsExp,
|
|
|
|
|
functionArgsWithTableRowAndSession,
|
|
|
|
|
insertFunctionArg,
|
|
|
|
|
mkAnnColumnField,
|
|
|
|
|
mkAnnColumnFieldAsText,
|
|
|
|
|
noSelectArgs,
|
|
|
|
|
noTablePermissions,
|
2021-12-13 19:48:10 +03:00
|
|
|
|
onArgumentExp,
|
2021-11-04 19:08:33 +03:00
|
|
|
|
saDistinct,
|
|
|
|
|
saLimit,
|
|
|
|
|
saOffset,
|
|
|
|
|
saOrderBy,
|
|
|
|
|
saWhere,
|
2022-04-06 10:18:59 +03:00
|
|
|
|
traverseSourceRelationshipSelection,
|
2021-11-04 19:08:33 +03:00
|
|
|
|
_AFArrayRelation,
|
|
|
|
|
_AFColumn,
|
|
|
|
|
_AFComputedField,
|
|
|
|
|
_AFExpression,
|
|
|
|
|
_AFNodeId,
|
|
|
|
|
_AFObjectRelation,
|
|
|
|
|
_AFRemote,
|
|
|
|
|
_AOCArrayAggregation,
|
|
|
|
|
_AOCColumn,
|
|
|
|
|
_AOCComputedField,
|
|
|
|
|
_AOCObjectRelation,
|
2022-03-10 09:17:48 +03:00
|
|
|
|
_TAFAgg,
|
|
|
|
|
_TAFNodes,
|
|
|
|
|
_TAFExp,
|
|
|
|
|
_ConnectionTypename,
|
|
|
|
|
_ConnectionPageInfo,
|
|
|
|
|
_ConnectionEdges,
|
|
|
|
|
_EdgeTypename,
|
|
|
|
|
_EdgeCursor,
|
|
|
|
|
_EdgeNode,
|
2021-11-04 19:08:33 +03:00
|
|
|
|
)
|
|
|
|
|
where
|
2018-12-12 15:58:39 +03:00
|
|
|
|
|
2021-09-24 01:56:37 +03:00
|
|
|
|
import Control.Lens.TH (makeLenses, makePrisms)
|
2022-03-08 11:22:20 +03:00
|
|
|
|
import Data.Bifoldable
|
2021-09-24 01:56:37 +03:00
|
|
|
|
import Data.HashMap.Strict qualified as HM
|
|
|
|
|
import Data.Int (Int64)
|
|
|
|
|
import Data.Kind (Type)
|
|
|
|
|
import Data.List.NonEmpty qualified as NE
|
|
|
|
|
import Data.Sequence qualified as Seq
|
2021-12-13 19:48:10 +03:00
|
|
|
|
import Hasura.Backends.Postgres.SQL.Types qualified as PG
|
2021-09-24 01:56:37 +03:00
|
|
|
|
import Hasura.Prelude
|
|
|
|
|
import Hasura.RQL.IR.BoolExp
|
|
|
|
|
import Hasura.RQL.IR.OrderBy
|
|
|
|
|
import Hasura.RQL.Types.Backend
|
|
|
|
|
import Hasura.RQL.Types.Column
|
|
|
|
|
import Hasura.RQL.Types.Common
|
|
|
|
|
import Hasura.RQL.Types.ComputedField
|
|
|
|
|
import Hasura.RQL.Types.Function
|
|
|
|
|
import Hasura.RQL.Types.Instances ()
|
2021-12-01 07:53:34 +03:00
|
|
|
|
import Hasura.RQL.Types.Relationships.Local
|
2021-12-22 02:14:56 +03:00
|
|
|
|
import Hasura.RQL.Types.Relationships.Remote
|
2022-04-07 17:41:43 +03:00
|
|
|
|
import Hasura.RQL.Types.Subscription
|
2021-09-24 01:56:37 +03:00
|
|
|
|
import Hasura.SQL.Backend
|
2020-11-02 14:50:40 +03:00
|
|
|
|
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
-- Root selection
|
2019-04-17 12:48:41 +03:00
|
|
|
|
|
2021-12-07 16:12:02 +03:00
|
|
|
|
data QueryDB (b :: BackendType) (r :: Type) v
|
2021-09-24 01:56:37 +03:00
|
|
|
|
= QDBMultipleRows (AnnSimpleSelectG b r v)
|
|
|
|
|
| QDBSingleRow (AnnSimpleSelectG b r v)
|
|
|
|
|
| QDBAggregation (AnnAggregateSelectG b r v)
|
|
|
|
|
| QDBConnection (ConnectionSelect b r v)
|
2022-04-07 17:41:43 +03:00
|
|
|
|
| QDBStreamMultipleRows (AnnSimpleStreamSelectG b r v)
|
2021-07-08 18:41:59 +03:00
|
|
|
|
deriving stock (Generic, Functor, Foldable, Traversable)
|
2020-06-08 15:13:01 +03:00
|
|
|
|
|
2022-03-08 11:22:20 +03:00
|
|
|
|
instance Backend b => Bifoldable (QueryDB b) where
|
|
|
|
|
bifoldMap f g = \case
|
|
|
|
|
QDBMultipleRows annSel -> bifoldMapAnnSelectG f g annSel
|
|
|
|
|
QDBSingleRow annSel -> bifoldMapAnnSelectG f g annSel
|
|
|
|
|
QDBAggregation annSel -> bifoldMapAnnSelectG f g annSel
|
|
|
|
|
QDBConnection connSel -> bifoldMap f g connSel
|
2022-04-07 17:41:43 +03:00
|
|
|
|
QDBStreamMultipleRows annSel -> bifoldMapAnnSelectStreamG f g annSel
|
2022-03-08 11:22:20 +03:00
|
|
|
|
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
-- Select
|
2018-12-12 15:58:39 +03:00
|
|
|
|
|
2022-03-08 11:22:20 +03:00
|
|
|
|
data AnnSelectG (b :: BackendType) (f :: Type -> Type) (v :: Type) = AnnSelectG
|
2022-02-25 23:37:32 +03:00
|
|
|
|
{ _asnFields :: Fields (f v),
|
|
|
|
|
_asnFrom :: SelectFromG b v,
|
|
|
|
|
_asnPerm :: TablePermG b v,
|
|
|
|
|
_asnArgs :: SelectArgsG b v,
|
2022-02-23 23:17:58 +03:00
|
|
|
|
_asnStrfyNum :: StringifyNumbers
|
2021-09-24 01:56:37 +03:00
|
|
|
|
}
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock (Functor, Foldable, Traversable)
|
2020-06-25 06:33:37 +03:00
|
|
|
|
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock instance
|
2021-09-24 01:56:37 +03:00
|
|
|
|
( Backend b,
|
|
|
|
|
Eq (BooleanOperators b v),
|
|
|
|
|
Eq v,
|
|
|
|
|
Eq (f v)
|
|
|
|
|
) =>
|
2022-03-08 11:22:20 +03:00
|
|
|
|
Eq (AnnSelectG b f v)
|
2021-09-22 13:43:05 +03:00
|
|
|
|
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock instance
|
2021-09-24 01:56:37 +03:00
|
|
|
|
( Backend b,
|
|
|
|
|
Show (BooleanOperators b v),
|
|
|
|
|
Show v,
|
|
|
|
|
Show (f v)
|
|
|
|
|
) =>
|
2022-03-08 11:22:20 +03:00
|
|
|
|
Show (AnnSelectG b f v)
|
2021-09-24 01:56:37 +03:00
|
|
|
|
|
2022-04-07 17:41:43 +03:00
|
|
|
|
-- | IR type representing nodes for streaming subscriptions
|
|
|
|
|
data
|
|
|
|
|
AnnSelectStreamG
|
|
|
|
|
(b :: BackendType)
|
|
|
|
|
(f :: Type -> Type)
|
|
|
|
|
(v :: Type) = AnnSelectStreamG
|
|
|
|
|
{ -- | type to indicate if streaming subscription has been enabled in the `BackendType`.
|
|
|
|
|
-- This type helps avoiding missing case match patterns for backends where it's disabled.
|
|
|
|
|
_assnXStreamingSubscription :: XStreamingSubscription b,
|
|
|
|
|
-- | output selection fields
|
|
|
|
|
_assnFields :: Fields (f v),
|
|
|
|
|
-- | table information to select from
|
|
|
|
|
_assnFrom :: SelectFromG b v,
|
|
|
|
|
-- | select permissions
|
|
|
|
|
_assnPerm :: TablePermG b v,
|
|
|
|
|
-- | streaming arguments
|
|
|
|
|
_assnArgs :: SelectStreamArgsG b v,
|
|
|
|
|
_assnStrfyNum :: StringifyNumbers
|
|
|
|
|
}
|
|
|
|
|
deriving (Functor, Foldable, Traversable)
|
|
|
|
|
|
|
|
|
|
deriving instance
|
|
|
|
|
( Backend b,
|
|
|
|
|
Eq (BooleanOperators b v),
|
|
|
|
|
Eq v,
|
|
|
|
|
Eq (f v)
|
|
|
|
|
) =>
|
|
|
|
|
Eq (AnnSelectStreamG b f v)
|
|
|
|
|
|
|
|
|
|
deriving instance
|
|
|
|
|
( Backend b,
|
|
|
|
|
Show (BooleanOperators b v),
|
|
|
|
|
Show v,
|
|
|
|
|
Show (f v)
|
|
|
|
|
) =>
|
|
|
|
|
Show (AnnSelectStreamG b f v)
|
|
|
|
|
|
2022-03-08 11:22:20 +03:00
|
|
|
|
type AnnSimpleSelectG b r v = AnnSelectG b (AnnFieldG b r) v
|
2021-09-22 13:43:05 +03:00
|
|
|
|
|
2022-03-08 11:22:20 +03:00
|
|
|
|
type AnnAggregateSelectG b r v = AnnSelectG b (TableAggregateFieldG b r) v
|
2020-06-25 06:33:37 +03:00
|
|
|
|
|
2022-04-07 17:41:43 +03:00
|
|
|
|
type AnnSimpleStreamSelectG b r v = AnnSelectStreamG b (AnnFieldG b r) v
|
|
|
|
|
|
2021-12-07 16:12:02 +03:00
|
|
|
|
type AnnSimpleSelect b = AnnSimpleSelectG b Void (SQLExpression b)
|
2021-09-24 01:56:37 +03:00
|
|
|
|
|
2021-12-07 16:12:02 +03:00
|
|
|
|
type AnnAggregateSelect b = AnnAggregateSelectG b Void (SQLExpression b)
|
2020-06-08 15:13:01 +03:00
|
|
|
|
|
2022-04-07 17:41:43 +03:00
|
|
|
|
type AnnSimpleStreamSelect b = AnnSimpleStreamSelectG b Void (SQLExpression b)
|
|
|
|
|
|
2022-03-08 11:22:20 +03:00
|
|
|
|
-- | We can't write a Bifoldable instance for AnnSelectG because the types don't line up.
|
|
|
|
|
-- Instead, we provide this function which can be used to help define Bifoldable instances of other types
|
|
|
|
|
-- containing AnnSelectG values.
|
|
|
|
|
bifoldMapAnnSelectG :: (Backend b, Bifoldable (f b), Monoid m) => (r -> m) -> (v -> m) -> AnnSelectG b (f b r) v -> m
|
|
|
|
|
bifoldMapAnnSelectG f g AnnSelectG {..} =
|
|
|
|
|
foldMap (foldMap $ bifoldMap f g) _asnFields
|
|
|
|
|
<> foldMap g _asnFrom
|
|
|
|
|
<> foldMap g _asnPerm
|
|
|
|
|
<> foldMap g _asnArgs
|
|
|
|
|
|
2022-04-07 17:41:43 +03:00
|
|
|
|
bifoldMapAnnSelectStreamG :: (Backend b, Bifoldable (f b), Monoid m) => (r -> m) -> (v -> m) -> AnnSelectStreamG b (f b r) v -> m
|
|
|
|
|
bifoldMapAnnSelectStreamG f g AnnSelectStreamG {..} =
|
|
|
|
|
foldMap (foldMap $ bifoldMap f g) _assnFields
|
|
|
|
|
<> foldMap g _assnFrom
|
|
|
|
|
<> foldMap g _assnPerm
|
|
|
|
|
<> foldMap g _assnArgs
|
|
|
|
|
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
-- Relay select
|
2020-06-08 15:13:01 +03:00
|
|
|
|
|
2021-12-07 16:12:02 +03:00
|
|
|
|
data ConnectionSelect (b :: BackendType) (r :: Type) v = ConnectionSelect
|
2022-02-25 23:37:32 +03:00
|
|
|
|
{ _csXRelay :: XRelay b,
|
|
|
|
|
_csPrimaryKeyColumns :: PrimaryKeyColumns b,
|
|
|
|
|
_csSplit :: Maybe (NE.NonEmpty (ConnectionSplit b v)),
|
|
|
|
|
_csSlice :: Maybe ConnectionSlice,
|
2022-03-08 11:22:20 +03:00
|
|
|
|
_csSelect :: (AnnSelectG b (ConnectionField b r) v)
|
2021-09-24 01:56:37 +03:00
|
|
|
|
}
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock (Functor, Foldable, Traversable)
|
2021-05-21 05:46:58 +03:00
|
|
|
|
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock instance
|
2021-09-24 01:56:37 +03:00
|
|
|
|
( Backend b,
|
|
|
|
|
Eq (BooleanOperators b v),
|
|
|
|
|
Eq v,
|
2021-12-07 16:12:02 +03:00
|
|
|
|
Eq r
|
2021-09-24 01:56:37 +03:00
|
|
|
|
) =>
|
|
|
|
|
Eq (ConnectionSelect b r v)
|
2021-09-22 13:43:05 +03:00
|
|
|
|
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock instance
|
2021-09-24 01:56:37 +03:00
|
|
|
|
( Backend b,
|
|
|
|
|
Show (BooleanOperators b v),
|
|
|
|
|
Show v,
|
2021-12-07 16:12:02 +03:00
|
|
|
|
Show r
|
2021-09-24 01:56:37 +03:00
|
|
|
|
) =>
|
|
|
|
|
Show (ConnectionSelect b r v)
|
|
|
|
|
|
2022-03-08 11:22:20 +03:00
|
|
|
|
instance Backend b => Bifoldable (ConnectionSelect b) where
|
|
|
|
|
bifoldMap f g ConnectionSelect {..} =
|
|
|
|
|
foldMap (foldMap $ foldMap g) _csSplit
|
|
|
|
|
<> bifoldMapAnnSelectG f g _csSelect
|
|
|
|
|
|
2021-09-24 01:56:37 +03:00
|
|
|
|
data ConnectionSplit (b :: BackendType) v = ConnectionSplit
|
2022-02-23 23:17:58 +03:00
|
|
|
|
{ _csKind :: ConnectionSplitKind,
|
|
|
|
|
_csValue :: v,
|
|
|
|
|
_csOrderBy :: (OrderByItemG b (AnnotatedOrderByElement b v))
|
2021-09-24 01:56:37 +03:00
|
|
|
|
}
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock (Functor, Generic, Foldable, Traversable)
|
2021-09-22 13:43:05 +03:00
|
|
|
|
|
|
|
|
|
deriving stock instance
|
2021-09-24 01:56:37 +03:00
|
|
|
|
( Backend b,
|
|
|
|
|
Eq v,
|
|
|
|
|
Eq (BooleanOperators b v)
|
|
|
|
|
) =>
|
|
|
|
|
Eq (ConnectionSplit b v)
|
2021-09-22 13:43:05 +03:00
|
|
|
|
|
|
|
|
|
deriving stock instance
|
2021-09-24 01:56:37 +03:00
|
|
|
|
( Backend b,
|
|
|
|
|
Show v,
|
|
|
|
|
Show (BooleanOperators b v)
|
|
|
|
|
) =>
|
|
|
|
|
Show (ConnectionSplit b v)
|
2021-09-22 13:43:05 +03:00
|
|
|
|
|
|
|
|
|
instance
|
2021-09-24 01:56:37 +03:00
|
|
|
|
( Backend b,
|
|
|
|
|
Hashable (BooleanOperators b v),
|
|
|
|
|
Hashable (ColumnInfo b),
|
|
|
|
|
Hashable v
|
|
|
|
|
) =>
|
|
|
|
|
Hashable (ConnectionSplit b v)
|
2019-03-25 16:45:35 +03:00
|
|
|
|
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
data ConnectionSlice
|
2022-02-23 23:17:58 +03:00
|
|
|
|
= SliceFirst Int
|
|
|
|
|
| SliceLast Int
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock (Show, Eq, Generic)
|
|
|
|
|
deriving anyclass (Hashable)
|
[Preview] Inherited roles for postgres read queries
fixes #3868
docker image - `hasura/graphql-engine:inherited-roles-preview-48b73a2de`
Note:
To be able to use the inherited roles feature, the graphql-engine should be started with the env variable `HASURA_GRAPHQL_EXPERIMENTAL_FEATURES` set to `inherited_roles`.
Introduction
------------
This PR implements the idea of multiple roles as presented in this [paper](https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/FGALanguageICDE07.pdf). The multiple roles feature in this PR can be used via inherited roles. An inherited role is a role which can be created by combining multiple singular roles. For example, if there are two roles `author` and `editor` configured in the graphql-engine, then we can create a inherited role with the name of `combined_author_editor` role which will combine the select permissions of the `author` and `editor` roles and then make GraphQL queries using the `combined_author_editor`.
How are select permissions of different roles are combined?
------------------------------------------------------------
A select permission includes 5 things:
1. Columns accessible to the role
2. Row selection filter
3. Limit
4. Allow aggregation
5. Scalar computed fields accessible to the role
Suppose there are two roles, `role1` gives access to the `address` column with row filter `P1` and `role2` gives access to both the `address` and the `phone` column with row filter `P2` and we create a new role `combined_roles` which combines `role1` and `role2`.
Let's say the following GraphQL query is queried with the `combined_roles` role.
```graphql
query {
employees {
address
phone
}
}
```
This will translate to the following SQL query:
```sql
select
(case when (P1 or P2) then address else null end) as address,
(case when P2 then phone else null end) as phone
from employee
where (P1 or P2)
```
The other parameters of the select permission will be combined in the following manner:
1. Limit - Minimum of the limits will be the limit of the inherited role
2. Allow aggregations - If any of the role allows aggregation, then the inherited role will allow aggregation
3. Scalar computed fields - same as table column fields, as in the above example
APIs for inherited roles:
----------------------
1. `add_inherited_role`
`add_inherited_role` is the [metadata API](https://hasura.io/docs/1.0/graphql/core/api-reference/index.html#schema-metadata-api) to create a new inherited role. It accepts two arguments
`role_name`: the name of the inherited role to be added (String)
`role_set`: list of roles that need to be combined (Array of Strings)
Example:
```json
{
"type": "add_inherited_role",
"args": {
"role_name":"combined_user",
"role_set":[
"user",
"user1"
]
}
}
```
After adding the inherited role, the inherited role can be used like single roles like earlier
Note:
An inherited role can only be created with non-inherited/singular roles.
2. `drop_inherited_role`
The `drop_inherited_role` API accepts the name of the inherited role and drops it from the metadata. It accepts a single argument:
`role_name`: name of the inherited role to be dropped
Example:
```json
{
"type": "drop_inherited_role",
"args": {
"role_name":"combined_user"
}
}
```
Metadata
---------
The derived roles metadata will be included under the `experimental_features` key while exporting the metadata.
```json
{
"experimental_features": {
"derived_roles": [
{
"role_name": "manager_is_employee_too",
"role_set": [
"employee",
"manager"
]
}
]
}
}
```
Scope
------
Only postgres queries and subscriptions are supported in this PR.
Important points:
-----------------
1. All columns exposed to an inherited role will be marked as `nullable`, this is done so that cell value nullification can be done.
TODOs
-------
- [ ] Tests
- [ ] Test a GraphQL query running with a inherited role without enabling inherited roles in experimental features
- [] Tests for aggregate queries, limit, computed fields, functions, subscriptions (?)
- [ ] Introspection test with a inherited role (nullability changes in a inherited role)
- [ ] Docs
- [ ] Changelog
Co-authored-by: Vamshi Surabhi <6562944+0x777@users.noreply.github.com>
GitOrigin-RevId: 3b8ee1e11f5ceca80fe294f8c074d42fbccfec63
2021-03-08 14:14:13 +03:00
|
|
|
|
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
data ConnectionSplitKind
|
|
|
|
|
= CSKBefore
|
|
|
|
|
| CSKAfter
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock (Show, Eq, Generic)
|
|
|
|
|
deriving anyclass (Hashable)
|
2020-10-22 23:42:27 +03:00
|
|
|
|
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
-- From
|
2018-12-12 15:58:39 +03:00
|
|
|
|
|
2021-12-13 19:48:10 +03:00
|
|
|
|
-- | Identifier used exclusively as the argument to 'FromIdentifier'
|
|
|
|
|
newtype FIIdentifier = FIIdentifier
|
|
|
|
|
{ unFIIdentifier :: Text
|
|
|
|
|
}
|
|
|
|
|
deriving stock (Generic)
|
|
|
|
|
deriving newtype (Eq, Show)
|
|
|
|
|
deriving anyclass (Hashable)
|
|
|
|
|
|
|
|
|
|
instance PG.IsIdentifier FIIdentifier where
|
|
|
|
|
toIdentifier = coerce
|
|
|
|
|
{-# INLINE toIdentifier #-}
|
|
|
|
|
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
data SelectFromG (b :: BackendType) v
|
2022-02-23 23:17:58 +03:00
|
|
|
|
= FromTable (TableName b)
|
|
|
|
|
| FromIdentifier FIIdentifier
|
2021-09-24 01:56:37 +03:00
|
|
|
|
| FromFunction
|
2022-02-23 23:17:58 +03:00
|
|
|
|
(FunctionName b)
|
|
|
|
|
(FunctionArgsExpTableRow v)
|
2021-09-24 01:56:37 +03:00
|
|
|
|
-- a definition list
|
2022-02-23 23:17:58 +03:00
|
|
|
|
(Maybe [(Column b, ScalarType b)])
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock (Functor, Foldable, Traversable, Generic)
|
2021-09-24 01:56:37 +03:00
|
|
|
|
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock instance (Backend b, Eq v) => Eq (SelectFromG b v)
|
2021-09-24 01:56:37 +03:00
|
|
|
|
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock instance (Backend b, Show v) => Show (SelectFromG b v)
|
2021-09-22 13:43:05 +03:00
|
|
|
|
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
instance (Backend b, Hashable v) => Hashable (SelectFromG b v)
|
[Preview] Inherited roles for postgres read queries
fixes #3868
docker image - `hasura/graphql-engine:inherited-roles-preview-48b73a2de`
Note:
To be able to use the inherited roles feature, the graphql-engine should be started with the env variable `HASURA_GRAPHQL_EXPERIMENTAL_FEATURES` set to `inherited_roles`.
Introduction
------------
This PR implements the idea of multiple roles as presented in this [paper](https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/FGALanguageICDE07.pdf). The multiple roles feature in this PR can be used via inherited roles. An inherited role is a role which can be created by combining multiple singular roles. For example, if there are two roles `author` and `editor` configured in the graphql-engine, then we can create a inherited role with the name of `combined_author_editor` role which will combine the select permissions of the `author` and `editor` roles and then make GraphQL queries using the `combined_author_editor`.
How are select permissions of different roles are combined?
------------------------------------------------------------
A select permission includes 5 things:
1. Columns accessible to the role
2. Row selection filter
3. Limit
4. Allow aggregation
5. Scalar computed fields accessible to the role
Suppose there are two roles, `role1` gives access to the `address` column with row filter `P1` and `role2` gives access to both the `address` and the `phone` column with row filter `P2` and we create a new role `combined_roles` which combines `role1` and `role2`.
Let's say the following GraphQL query is queried with the `combined_roles` role.
```graphql
query {
employees {
address
phone
}
}
```
This will translate to the following SQL query:
```sql
select
(case when (P1 or P2) then address else null end) as address,
(case when P2 then phone else null end) as phone
from employee
where (P1 or P2)
```
The other parameters of the select permission will be combined in the following manner:
1. Limit - Minimum of the limits will be the limit of the inherited role
2. Allow aggregations - If any of the role allows aggregation, then the inherited role will allow aggregation
3. Scalar computed fields - same as table column fields, as in the above example
APIs for inherited roles:
----------------------
1. `add_inherited_role`
`add_inherited_role` is the [metadata API](https://hasura.io/docs/1.0/graphql/core/api-reference/index.html#schema-metadata-api) to create a new inherited role. It accepts two arguments
`role_name`: the name of the inherited role to be added (String)
`role_set`: list of roles that need to be combined (Array of Strings)
Example:
```json
{
"type": "add_inherited_role",
"args": {
"role_name":"combined_user",
"role_set":[
"user",
"user1"
]
}
}
```
After adding the inherited role, the inherited role can be used like single roles like earlier
Note:
An inherited role can only be created with non-inherited/singular roles.
2. `drop_inherited_role`
The `drop_inherited_role` API accepts the name of the inherited role and drops it from the metadata. It accepts a single argument:
`role_name`: name of the inherited role to be dropped
Example:
```json
{
"type": "drop_inherited_role",
"args": {
"role_name":"combined_user"
}
}
```
Metadata
---------
The derived roles metadata will be included under the `experimental_features` key while exporting the metadata.
```json
{
"experimental_features": {
"derived_roles": [
{
"role_name": "manager_is_employee_too",
"role_set": [
"employee",
"manager"
]
}
]
}
}
```
Scope
------
Only postgres queries and subscriptions are supported in this PR.
Important points:
-----------------
1. All columns exposed to an inherited role will be marked as `nullable`, this is done so that cell value nullification can be done.
TODOs
-------
- [ ] Tests
- [ ] Test a GraphQL query running with a inherited role without enabling inherited roles in experimental features
- [] Tests for aggregate queries, limit, computed fields, functions, subscriptions (?)
- [ ] Introspection test with a inherited role (nullability changes in a inherited role)
- [ ] Docs
- [ ] Changelog
Co-authored-by: Vamshi Surabhi <6562944+0x777@users.noreply.github.com>
GitOrigin-RevId: 3b8ee1e11f5ceca80fe294f8c074d42fbccfec63
2021-03-08 14:14:13 +03:00
|
|
|
|
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
type SelectFrom b = SelectFromG b (SQLExpression b)
|
2019-11-07 08:14:36 +03:00
|
|
|
|
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
-- Select arguments
|
2020-06-08 15:13:01 +03:00
|
|
|
|
|
2022-04-07 17:41:43 +03:00
|
|
|
|
data SelectStreamArgsG (b :: BackendType) v = SelectStreamArgsG
|
|
|
|
|
{ -- | optional filter to filter the stream results
|
|
|
|
|
_ssaWhere :: !(Maybe (AnnBoolExp b v)),
|
|
|
|
|
-- | maximum number of rows to be returned in a single fetch
|
|
|
|
|
_ssaBatchSize :: !Int,
|
|
|
|
|
-- | info related to the cursor column, a single item data type
|
|
|
|
|
-- currently because only single column cursors are supported
|
|
|
|
|
_ssaCursorArg :: !(StreamCursorItem b)
|
|
|
|
|
}
|
|
|
|
|
deriving (Generic, Functor, Foldable, Traversable)
|
|
|
|
|
|
|
|
|
|
type SelectStreamArgs b = SelectStreamArgsG b (SQLExpression b)
|
|
|
|
|
|
|
|
|
|
deriving instance
|
|
|
|
|
( Backend b,
|
|
|
|
|
Eq (BooleanOperators b v),
|
|
|
|
|
Eq v
|
|
|
|
|
) =>
|
|
|
|
|
Eq (SelectStreamArgsG b v)
|
|
|
|
|
|
|
|
|
|
deriving instance
|
|
|
|
|
( Backend b,
|
|
|
|
|
Show (BooleanOperators b v),
|
|
|
|
|
Show v
|
|
|
|
|
) =>
|
|
|
|
|
Show (SelectStreamArgsG b v)
|
|
|
|
|
|
2021-09-24 01:56:37 +03:00
|
|
|
|
data SelectArgsG (b :: BackendType) v = SelectArgs
|
2022-02-25 23:37:32 +03:00
|
|
|
|
{ _saWhere :: Maybe (AnnBoolExp b v),
|
|
|
|
|
_saOrderBy :: Maybe (NE.NonEmpty (AnnotatedOrderByItemG b v)),
|
|
|
|
|
_saLimit :: Maybe Int,
|
|
|
|
|
_saOffset :: Maybe Int64,
|
2022-02-23 23:17:58 +03:00
|
|
|
|
_saDistinct :: (Maybe (NE.NonEmpty (Column b)))
|
2021-09-24 01:56:37 +03:00
|
|
|
|
}
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock (Generic, Functor, Foldable, Traversable)
|
2021-03-25 20:50:08 +03:00
|
|
|
|
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock instance
|
2021-09-24 01:56:37 +03:00
|
|
|
|
( Backend b,
|
|
|
|
|
Eq (BooleanOperators b v),
|
|
|
|
|
Eq v
|
|
|
|
|
) =>
|
|
|
|
|
Eq (SelectArgsG b v)
|
2021-03-25 20:50:08 +03:00
|
|
|
|
|
|
|
|
|
instance
|
2021-09-24 01:56:37 +03:00
|
|
|
|
( Backend b,
|
|
|
|
|
Hashable (BooleanOperators b v),
|
|
|
|
|
Hashable v
|
|
|
|
|
) =>
|
|
|
|
|
Hashable (SelectArgsG b v)
|
2021-03-25 20:50:08 +03:00
|
|
|
|
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock instance
|
2021-09-24 01:56:37 +03:00
|
|
|
|
( Backend b,
|
|
|
|
|
Show (BooleanOperators b v),
|
|
|
|
|
Show v
|
|
|
|
|
) =>
|
|
|
|
|
Show (SelectArgsG b v)
|
2021-09-22 13:43:05 +03:00
|
|
|
|
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
type SelectArgs b = SelectArgsG b (SQLExpression b)
|
|
|
|
|
|
2020-10-22 23:42:27 +03:00
|
|
|
|
noSelectArgs :: SelectArgsG backend v
|
2020-06-08 15:13:01 +03:00
|
|
|
|
noSelectArgs = SelectArgs Nothing Nothing Nothing Nothing Nothing
|
2018-12-12 15:58:39 +03:00
|
|
|
|
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
-- Order by argument
|
2018-12-12 15:58:39 +03:00
|
|
|
|
|
2021-07-27 19:27:28 +03:00
|
|
|
|
-- | The order by element for a computed field based on its return type
|
|
|
|
|
data ComputedFieldOrderByElement (b :: BackendType) v
|
2021-09-24 01:56:37 +03:00
|
|
|
|
= -- | Sort by the scalar computed field
|
2022-02-23 23:17:58 +03:00
|
|
|
|
CFOBEScalar (ScalarType b)
|
2021-09-24 01:56:37 +03:00
|
|
|
|
| CFOBETableAggregation
|
2022-02-23 23:17:58 +03:00
|
|
|
|
(TableName b)
|
|
|
|
|
(AnnBoolExp b v)
|
2021-09-24 01:56:37 +03:00
|
|
|
|
-- ^ Permission filter of the retuning table
|
2022-02-23 23:17:58 +03:00
|
|
|
|
(AnnotatedAggregateOrderBy b)
|
2021-09-24 01:56:37 +03:00
|
|
|
|
-- ^ Sort by aggregation fields of table rows returned by computed field
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock (Generic, Functor, Foldable, Traversable)
|
2021-09-24 01:56:37 +03:00
|
|
|
|
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock instance (Backend b, Eq v, Eq (BooleanOperators b v)) => Eq (ComputedFieldOrderByElement b v)
|
2021-09-24 01:56:37 +03:00
|
|
|
|
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock instance (Backend b, Show v, Show (BooleanOperators b v)) => Show (ComputedFieldOrderByElement b v)
|
2021-09-22 13:43:05 +03:00
|
|
|
|
|
2021-07-27 19:27:28 +03:00
|
|
|
|
instance (Backend b, Hashable v, Hashable (BooleanOperators b v)) => Hashable (ComputedFieldOrderByElement b v)
|
|
|
|
|
|
2021-09-24 01:56:37 +03:00
|
|
|
|
data ComputedFieldOrderBy (b :: BackendType) v = ComputedFieldOrderBy
|
2022-02-25 23:37:32 +03:00
|
|
|
|
{ _cfobXField :: XComputedField b,
|
2022-02-23 23:17:58 +03:00
|
|
|
|
_cfobName :: ComputedFieldName,
|
2022-02-25 23:37:32 +03:00
|
|
|
|
_cfobFunction :: FunctionName b,
|
|
|
|
|
_cfobFunctionArgsExp :: FunctionArgsExpTableRow v,
|
2022-02-23 23:17:58 +03:00
|
|
|
|
_cfobOrderByElement :: (ComputedFieldOrderByElement b v)
|
2021-09-24 01:56:37 +03:00
|
|
|
|
}
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock (Generic, Functor, Foldable, Traversable)
|
2021-09-24 01:56:37 +03:00
|
|
|
|
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock instance (Backend b, Eq v, Eq (BooleanOperators b v)) => Eq (ComputedFieldOrderBy b v)
|
2021-09-24 01:56:37 +03:00
|
|
|
|
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock instance (Backend b, Show v, Show (BooleanOperators b v)) => Show (ComputedFieldOrderBy b v)
|
2021-09-22 13:43:05 +03:00
|
|
|
|
|
2021-07-27 19:27:28 +03:00
|
|
|
|
instance (Backend b, Hashable v, Hashable (BooleanOperators b v)) => Hashable (ComputedFieldOrderBy b v)
|
|
|
|
|
|
|
|
|
|
data AnnotatedOrderByElement (b :: BackendType) v
|
2022-02-23 23:17:58 +03:00
|
|
|
|
= AOCColumn (ColumnInfo b)
|
2021-09-24 01:56:37 +03:00
|
|
|
|
| AOCObjectRelation
|
2022-02-23 23:17:58 +03:00
|
|
|
|
(RelInfo b)
|
|
|
|
|
(AnnBoolExp b v)
|
2021-09-24 01:56:37 +03:00
|
|
|
|
-- ^ Permission filter of the remote table to which the relationship is defined
|
2022-02-23 23:17:58 +03:00
|
|
|
|
(AnnotatedOrderByElement b v)
|
2021-09-24 01:56:37 +03:00
|
|
|
|
| AOCArrayAggregation
|
2022-02-23 23:17:58 +03:00
|
|
|
|
(RelInfo b)
|
|
|
|
|
(AnnBoolExp b v)
|
2021-09-24 01:56:37 +03:00
|
|
|
|
-- ^ Permission filter of the remote table to which the relationship is defined
|
2022-02-23 23:17:58 +03:00
|
|
|
|
(AnnotatedAggregateOrderBy b)
|
|
|
|
|
| AOCComputedField (ComputedFieldOrderBy b v)
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock (Generic, Functor, Foldable, Traversable)
|
2021-09-24 01:56:37 +03:00
|
|
|
|
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock instance (Backend b, Eq v, Eq (BooleanOperators b v)) => Eq (AnnotatedOrderByElement b v)
|
2021-09-24 01:56:37 +03:00
|
|
|
|
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock instance (Backend b, Show v, Show (BooleanOperators b v)) => Show (AnnotatedOrderByElement b v)
|
2021-09-22 13:43:05 +03:00
|
|
|
|
|
2021-07-27 19:27:28 +03:00
|
|
|
|
instance (Backend b, Hashable v, Hashable (BooleanOperators b v)) => Hashable (AnnotatedOrderByElement b v)
|
2018-12-12 15:58:39 +03:00
|
|
|
|
|
2021-07-27 19:27:28 +03:00
|
|
|
|
data AnnotatedAggregateOrderBy (b :: BackendType)
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
= AAOCount
|
2022-02-23 23:17:58 +03:00
|
|
|
|
| AAOOp Text !(ColumnInfo b)
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock (Generic)
|
2021-09-24 01:56:37 +03:00
|
|
|
|
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock instance (Backend b) => Eq (AnnotatedAggregateOrderBy b)
|
2021-09-24 01:56:37 +03:00
|
|
|
|
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock instance (Backend b) => Show (AnnotatedAggregateOrderBy b)
|
2021-09-22 13:43:05 +03:00
|
|
|
|
|
2021-07-27 19:27:28 +03:00
|
|
|
|
instance (Backend b) => Hashable (AnnotatedAggregateOrderBy b)
|
2019-04-17 12:48:41 +03:00
|
|
|
|
|
2021-07-27 19:27:28 +03:00
|
|
|
|
type AnnotatedOrderByItemG b v = OrderByItemG b (AnnotatedOrderByElement b v)
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
|
2021-09-24 01:56:37 +03:00
|
|
|
|
type AnnotatedOrderByItem b = AnnotatedOrderByItemG b (SQLExpression b)
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
|
2022-04-07 17:41:43 +03:00
|
|
|
|
-- | Cursor for streaming subscription
|
|
|
|
|
data StreamCursorItem (b :: BackendType) = StreamCursorItem
|
|
|
|
|
{ -- | Specifies how the cursor item should be ordered
|
|
|
|
|
_sciOrdering :: !CursorOrdering,
|
|
|
|
|
-- | Column info of the cursor item
|
|
|
|
|
_sciColInfo :: !(ColumnInfo b),
|
|
|
|
|
-- | Initial value of the cursor item from where the streaming should start
|
|
|
|
|
_sciInitialValue :: !(ColumnValue b)
|
|
|
|
|
}
|
|
|
|
|
deriving (Generic)
|
|
|
|
|
|
|
|
|
|
deriving instance (Backend b) => Eq (StreamCursorItem b)
|
|
|
|
|
|
|
|
|
|
deriving instance (Backend b) => Show (StreamCursorItem b)
|
|
|
|
|
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
-- Fields
|
|
|
|
|
|
2021-12-07 16:12:02 +03:00
|
|
|
|
-- | captures a remote relationship's selection and the necessary context
|
|
|
|
|
data RemoteRelationshipSelect b r = RemoteRelationshipSelect
|
|
|
|
|
{ -- | The fields on the table that are required for the join condition
|
|
|
|
|
-- of the remote relationship
|
|
|
|
|
_rrsLHSJoinFields :: HashMap FieldName (DBJoinField b),
|
|
|
|
|
-- | The field that captures the relationship
|
|
|
|
|
-- r ~ (RemoteRelationshipField UnpreparedValue) when the AST is emitted by the parser.
|
|
|
|
|
-- r ~ Void when an execution tree is constructed so that a backend is
|
|
|
|
|
-- absolved of dealing with remote relationships.
|
|
|
|
|
_rrsRelationship :: r
|
|
|
|
|
}
|
|
|
|
|
deriving (Eq, Show, Functor, Foldable, Traversable)
|
|
|
|
|
|
|
|
|
|
data AnnFieldG (b :: BackendType) (r :: Type) v
|
2022-02-23 23:17:58 +03:00
|
|
|
|
= AFColumn (AnnColumnField b v)
|
|
|
|
|
| AFObjectRelation (ObjectRelationSelectG b r v)
|
|
|
|
|
| AFArrayRelation (ArraySelectG b r v)
|
|
|
|
|
| AFComputedField (XComputedField b) !ComputedFieldName !(ComputedFieldSelect b r v)
|
2021-12-07 16:12:02 +03:00
|
|
|
|
| -- | A remote relationship field
|
2022-02-23 23:17:58 +03:00
|
|
|
|
AFRemote (RemoteRelationshipSelect b r)
|
|
|
|
|
| AFNodeId (XRelay b) !(TableName b) !(PrimaryKeyColumns b)
|
|
|
|
|
| AFExpression Text
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock (Functor, Foldable, Traversable)
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock instance
|
2021-09-24 01:56:37 +03:00
|
|
|
|
( Backend b,
|
|
|
|
|
Eq (BooleanOperators b v),
|
|
|
|
|
Eq v,
|
2021-12-07 16:12:02 +03:00
|
|
|
|
Eq r
|
2021-09-24 01:56:37 +03:00
|
|
|
|
) =>
|
|
|
|
|
Eq (AnnFieldG b r v)
|
2021-09-22 13:43:05 +03:00
|
|
|
|
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock instance
|
2021-09-24 01:56:37 +03:00
|
|
|
|
( Backend b,
|
|
|
|
|
Show (BooleanOperators b v),
|
|
|
|
|
Show v,
|
2021-12-07 16:12:02 +03:00
|
|
|
|
Show r
|
2021-09-24 01:56:37 +03:00
|
|
|
|
) =>
|
|
|
|
|
Show (AnnFieldG b r v)
|
|
|
|
|
|
2022-03-08 11:22:20 +03:00
|
|
|
|
instance Backend b => Bifoldable (AnnFieldG b) where
|
|
|
|
|
bifoldMap f g = \case
|
|
|
|
|
AFColumn col -> foldMap g col
|
|
|
|
|
AFObjectRelation objRel -> foldMap (bifoldMap f g) objRel
|
|
|
|
|
AFArrayRelation arrRel -> bifoldMap f g arrRel
|
|
|
|
|
AFComputedField _ _ cf -> bifoldMap f g cf
|
|
|
|
|
AFRemote r -> foldMap f r
|
|
|
|
|
AFNodeId {} -> mempty
|
|
|
|
|
AFExpression {} -> mempty
|
|
|
|
|
|
2021-12-07 16:12:02 +03:00
|
|
|
|
type AnnField b = AnnFieldG b Void (SQLExpression b)
|
2021-09-22 13:43:05 +03:00
|
|
|
|
|
2021-12-07 16:12:02 +03:00
|
|
|
|
type AnnFields b = AnnFieldsG b Void (SQLExpression b)
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
|
2021-09-24 01:56:37 +03:00
|
|
|
|
mkAnnColumnField ::
|
|
|
|
|
Column backend ->
|
|
|
|
|
ColumnType backend ->
|
|
|
|
|
Maybe (AnnColumnCaseBoolExp backend v) ->
|
2022-05-03 11:58:56 +03:00
|
|
|
|
Maybe (ScalarSelectionArguments backend) ->
|
2021-09-24 01:56:37 +03:00
|
|
|
|
AnnFieldG backend r v
|
2021-09-22 13:43:05 +03:00
|
|
|
|
mkAnnColumnField col typ caseBoolExp colOpM =
|
|
|
|
|
AFColumn (AnnColumnField col typ False colOpM caseBoolExp)
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
|
2021-09-24 01:56:37 +03:00
|
|
|
|
mkAnnColumnFieldAsText ::
|
|
|
|
|
ColumnInfo backend ->
|
|
|
|
|
AnnFieldG backend r v
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
mkAnnColumnFieldAsText ci =
|
2022-01-19 11:37:50 +03:00
|
|
|
|
AFColumn (AnnColumnField (ciColumn ci) (ciType ci) True Nothing Nothing)
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
|
2022-04-06 10:18:59 +03:00
|
|
|
|
traverseSourceRelationshipSelection ::
|
|
|
|
|
(Applicative f, Backend backend) =>
|
|
|
|
|
(vf backend -> f (vg backend)) ->
|
|
|
|
|
SourceRelationshipSelection backend r vf ->
|
|
|
|
|
f (SourceRelationshipSelection backend r vg)
|
|
|
|
|
traverseSourceRelationshipSelection f = \case
|
|
|
|
|
SourceRelationshipObject s ->
|
|
|
|
|
SourceRelationshipObject <$> traverse f s
|
|
|
|
|
SourceRelationshipArray s ->
|
|
|
|
|
SourceRelationshipArray <$> traverse f s
|
|
|
|
|
SourceRelationshipArrayAggregate s ->
|
|
|
|
|
SourceRelationshipArrayAggregate <$> traverse f s
|
|
|
|
|
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
-- Aggregation fields
|
2018-12-12 15:58:39 +03:00
|
|
|
|
|
2021-12-07 16:12:02 +03:00
|
|
|
|
data TableAggregateFieldG (b :: BackendType) (r :: Type) v
|
2022-02-23 23:17:58 +03:00
|
|
|
|
= TAFAgg (AggregateFields b)
|
|
|
|
|
| TAFNodes (XNodesAgg b) (AnnFieldsG b r v)
|
|
|
|
|
| TAFExp Text
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock (Functor, Foldable, Traversable)
|
2018-12-12 15:58:39 +03:00
|
|
|
|
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock instance
|
2021-09-24 01:56:37 +03:00
|
|
|
|
( Backend b,
|
|
|
|
|
Eq (BooleanOperators b v),
|
|
|
|
|
Eq v,
|
2021-12-07 16:12:02 +03:00
|
|
|
|
Eq r
|
2021-09-24 01:56:37 +03:00
|
|
|
|
) =>
|
|
|
|
|
Eq (TableAggregateFieldG b r v)
|
2021-09-22 13:43:05 +03:00
|
|
|
|
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock instance
|
2021-09-24 01:56:37 +03:00
|
|
|
|
( Backend b,
|
|
|
|
|
Show (BooleanOperators b v),
|
|
|
|
|
Show v,
|
2021-12-07 16:12:02 +03:00
|
|
|
|
Show r
|
2021-09-24 01:56:37 +03:00
|
|
|
|
) =>
|
|
|
|
|
Show (TableAggregateFieldG b r v)
|
2021-09-22 13:43:05 +03:00
|
|
|
|
|
2022-03-08 11:22:20 +03:00
|
|
|
|
instance Backend b => Bifoldable (TableAggregateFieldG b) where
|
|
|
|
|
bifoldMap f g = \case
|
|
|
|
|
TAFAgg {} -> mempty
|
|
|
|
|
TAFNodes _ fields -> foldMap (foldMap $ bifoldMap f g) fields
|
|
|
|
|
TAFExp {} -> mempty
|
|
|
|
|
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
data AggregateField (b :: BackendType)
|
2022-02-23 23:17:58 +03:00
|
|
|
|
= AFCount (CountType b)
|
|
|
|
|
| AFOp (AggregateOp b)
|
|
|
|
|
| AFExp Text
|
2021-09-24 01:56:37 +03:00
|
|
|
|
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock instance (Backend b) => Eq (AggregateField b)
|
2021-09-24 01:56:37 +03:00
|
|
|
|
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock instance (Backend b) => Show (AggregateField b)
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
|
2021-09-24 01:56:37 +03:00
|
|
|
|
data AggregateOp (b :: BackendType) = AggregateOp
|
2022-02-23 23:17:58 +03:00
|
|
|
|
{ _aoOp :: Text,
|
|
|
|
|
_aoFields :: (ColumnFields b)
|
2021-09-24 01:56:37 +03:00
|
|
|
|
}
|
|
|
|
|
deriving stock (Eq, Show)
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
|
|
|
|
|
data ColFld (b :: BackendType)
|
2022-02-23 23:17:58 +03:00
|
|
|
|
= CFCol (Column b) !(ColumnType b)
|
|
|
|
|
| CFExp Text
|
2021-09-22 13:43:05 +03:00
|
|
|
|
deriving stock (Eq, Show)
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
|
2021-12-07 16:12:02 +03:00
|
|
|
|
type TableAggregateField b = TableAggregateFieldG b Void (SQLExpression b)
|
2021-09-24 01:56:37 +03:00
|
|
|
|
|
2021-12-07 16:12:02 +03:00
|
|
|
|
type TableAggregateFields b = TableAggregateFieldsG b Void (SQLExpression b)
|
2021-09-24 01:56:37 +03:00
|
|
|
|
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
type TableAggregateFieldsG b r v = Fields (TableAggregateFieldG b r v)
|
|
|
|
|
|
2021-09-24 01:56:37 +03:00
|
|
|
|
type ColumnFields b = Fields (ColFld b)
|
|
|
|
|
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
type AggregateFields b = Fields (AggregateField b)
|
|
|
|
|
|
2021-09-24 01:56:37 +03:00
|
|
|
|
type AnnFieldsG b r v = Fields (AnnFieldG b r v)
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
|
|
|
|
|
-- Relay fields
|
|
|
|
|
|
2021-12-07 16:12:02 +03:00
|
|
|
|
data ConnectionField (b :: BackendType) (r :: Type) v
|
2022-02-23 23:17:58 +03:00
|
|
|
|
= ConnectionTypename Text
|
|
|
|
|
| ConnectionPageInfo PageInfoFields
|
|
|
|
|
| ConnectionEdges (EdgeFields b r v)
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock (Functor, Foldable, Traversable)
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock instance
|
2021-09-24 01:56:37 +03:00
|
|
|
|
( Backend b,
|
|
|
|
|
Eq (BooleanOperators b v),
|
|
|
|
|
Eq v,
|
2021-12-07 16:12:02 +03:00
|
|
|
|
Eq r
|
2021-09-24 01:56:37 +03:00
|
|
|
|
) =>
|
|
|
|
|
Eq (ConnectionField b r v)
|
2021-09-22 13:43:05 +03:00
|
|
|
|
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock instance
|
2021-09-24 01:56:37 +03:00
|
|
|
|
( Backend b,
|
|
|
|
|
Show (BooleanOperators b v),
|
|
|
|
|
Show v,
|
2021-12-07 16:12:02 +03:00
|
|
|
|
Show r
|
2021-09-24 01:56:37 +03:00
|
|
|
|
) =>
|
|
|
|
|
Show (ConnectionField b r v)
|
2021-09-22 13:43:05 +03:00
|
|
|
|
|
2022-03-08 11:22:20 +03:00
|
|
|
|
instance Backend b => Bifoldable (ConnectionField b) where
|
|
|
|
|
bifoldMap f g = \case
|
|
|
|
|
ConnectionTypename {} -> mempty
|
|
|
|
|
ConnectionPageInfo {} -> mempty
|
|
|
|
|
ConnectionEdges edgeFields -> foldMap (foldMap $ bifoldMap f g) edgeFields
|
|
|
|
|
|
2020-06-08 15:13:01 +03:00
|
|
|
|
data PageInfoField
|
2022-02-23 23:17:58 +03:00
|
|
|
|
= PageInfoTypename Text
|
2020-06-08 15:13:01 +03:00
|
|
|
|
| PageInfoHasNextPage
|
|
|
|
|
| PageInfoHasPreviousPage
|
|
|
|
|
| PageInfoStartCursor
|
|
|
|
|
| PageInfoEndCursor
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock (Show, Eq)
|
2021-04-22 00:44:37 +03:00
|
|
|
|
|
2021-12-07 16:12:02 +03:00
|
|
|
|
data EdgeField (b :: BackendType) (r :: Type) v
|
2022-02-23 23:17:58 +03:00
|
|
|
|
= EdgeTypename Text
|
2020-06-08 15:13:01 +03:00
|
|
|
|
| EdgeCursor
|
2022-02-23 23:17:58 +03:00
|
|
|
|
| EdgeNode (AnnFieldsG b r v)
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock (Functor, Foldable, Traversable)
|
2020-06-08 15:13:01 +03:00
|
|
|
|
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock instance
|
2021-09-24 01:56:37 +03:00
|
|
|
|
( Backend b,
|
|
|
|
|
Eq (BooleanOperators b v),
|
|
|
|
|
Eq v,
|
2021-12-07 16:12:02 +03:00
|
|
|
|
Eq r
|
2021-09-24 01:56:37 +03:00
|
|
|
|
) =>
|
|
|
|
|
Eq (EdgeField b r v)
|
2021-09-22 13:43:05 +03:00
|
|
|
|
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock instance
|
2021-09-24 01:56:37 +03:00
|
|
|
|
( Backend b,
|
|
|
|
|
Show (BooleanOperators b v),
|
|
|
|
|
Show v,
|
2021-12-07 16:12:02 +03:00
|
|
|
|
Show r
|
2021-09-24 01:56:37 +03:00
|
|
|
|
) =>
|
|
|
|
|
Show (EdgeField b r v)
|
2021-09-22 13:43:05 +03:00
|
|
|
|
|
2022-03-08 11:22:20 +03:00
|
|
|
|
instance Backend b => Bifoldable (EdgeField b) where
|
|
|
|
|
bifoldMap f g = \case
|
|
|
|
|
EdgeTypename {} -> mempty
|
|
|
|
|
EdgeCursor -> mempty
|
|
|
|
|
EdgeNode annFields -> foldMap (foldMap $ bifoldMap f g) annFields
|
|
|
|
|
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
type ConnectionFields b r v = Fields (ConnectionField b r v)
|
2021-04-22 00:44:37 +03:00
|
|
|
|
|
2021-09-24 01:56:37 +03:00
|
|
|
|
type PageInfoFields = Fields PageInfoField
|
|
|
|
|
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
type EdgeFields b r v = Fields (EdgeField b r v)
|
2020-06-08 15:13:01 +03:00
|
|
|
|
|
2021-09-24 01:56:37 +03:00
|
|
|
|
data AnnColumnField (b :: BackendType) v = AnnColumnField
|
2022-02-25 23:37:32 +03:00
|
|
|
|
{ _acfColumn :: Column b,
|
|
|
|
|
_acfType :: ColumnType b,
|
2022-05-03 11:58:56 +03:00
|
|
|
|
-- | If this field is 'True', columns are explicitly casted to @text@ when
|
|
|
|
|
-- fetched, which avoids an issue that occurs because we don’t currently
|
|
|
|
|
-- have proper support for array types. See
|
2021-09-24 01:56:37 +03:00
|
|
|
|
-- https://github.com/hasura/graphql-engine/pull/3198 for more details.
|
2022-02-23 23:17:58 +03:00
|
|
|
|
_acfAsText :: Bool,
|
2022-05-03 11:58:56 +03:00
|
|
|
|
-- | Arguments of this column's selection. See 'ScalarSelectionArguments'
|
|
|
|
|
_acfArguments :: Maybe (ScalarSelectionArguments b),
|
2022-02-25 23:37:32 +03:00
|
|
|
|
-- | This type is used to determine whether the column
|
2021-09-24 01:56:37 +03:00
|
|
|
|
-- should be nullified. When the value is `Nothing`, the column value
|
|
|
|
|
-- will be outputted as computed and when the value is `Just c`, the
|
|
|
|
|
-- column will be outputted when `c` evaluates to `true` and `null`
|
|
|
|
|
-- when `c` evaluates to `false`.
|
2022-02-23 23:17:58 +03:00
|
|
|
|
_acfCaseBoolExpression :: (Maybe (AnnColumnCaseBoolExp b v))
|
2021-09-24 01:56:37 +03:00
|
|
|
|
}
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock (Functor, Foldable, Traversable)
|
2021-05-21 05:46:58 +03:00
|
|
|
|
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock instance
|
2021-09-24 01:56:37 +03:00
|
|
|
|
( Backend b,
|
|
|
|
|
Eq (BooleanOperators b v),
|
|
|
|
|
Eq v
|
|
|
|
|
) =>
|
|
|
|
|
Eq (AnnColumnField b v)
|
2021-09-22 13:43:05 +03:00
|
|
|
|
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock instance
|
2021-09-24 01:56:37 +03:00
|
|
|
|
( Backend b,
|
|
|
|
|
Show (BooleanOperators b v),
|
|
|
|
|
Show v
|
|
|
|
|
) =>
|
|
|
|
|
Show (AnnColumnField b v)
|
|
|
|
|
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
-- Computed field
|
2019-04-17 12:48:41 +03:00
|
|
|
|
|
2021-09-24 01:56:37 +03:00
|
|
|
|
data ComputedFieldScalarSelect (b :: BackendType) v = ComputedFieldScalarSelect
|
2022-02-25 23:37:32 +03:00
|
|
|
|
{ _cfssFunction :: FunctionName b,
|
|
|
|
|
_cfssArguments :: FunctionArgsExpTableRow v,
|
|
|
|
|
_cfssType :: ScalarType b,
|
2022-05-03 11:58:56 +03:00
|
|
|
|
_cfssScalarArguments :: (Maybe (ScalarSelectionArguments b))
|
2021-09-24 01:56:37 +03:00
|
|
|
|
}
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock (Functor, Foldable, Traversable)
|
2021-09-24 01:56:37 +03:00
|
|
|
|
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock instance (Backend b, Show v) => Show (ComputedFieldScalarSelect b v)
|
2021-09-24 01:56:37 +03:00
|
|
|
|
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock instance (Backend b, Eq v) => Eq (ComputedFieldScalarSelect b v)
|
2018-12-12 15:58:39 +03:00
|
|
|
|
|
2021-12-07 16:12:02 +03:00
|
|
|
|
data ComputedFieldSelect (b :: BackendType) (r :: Type) v
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
= CFSScalar
|
2022-02-23 23:17:58 +03:00
|
|
|
|
(ComputedFieldScalarSelect b v)
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
-- ^ Type containing info about the computed field
|
2022-02-23 23:17:58 +03:00
|
|
|
|
(Maybe (AnnColumnCaseBoolExp b v))
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
-- ^ This type is used to determine if whether the scalar
|
|
|
|
|
-- computed field should be nullified. When the value is `Nothing`,
|
|
|
|
|
-- the scalar computed value will be outputted as computed and when the
|
|
|
|
|
-- value is `Just c`, the scalar computed field will be outputted when
|
|
|
|
|
-- `c` evaluates to `true` and `null` when `c` evaluates to `false`
|
2022-02-23 23:17:58 +03:00
|
|
|
|
| CFSTable JsonAggSelect !(AnnSimpleSelectG b r v)
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock (Functor, Foldable, Traversable)
|
2019-04-17 12:48:41 +03:00
|
|
|
|
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock instance
|
2021-09-24 01:56:37 +03:00
|
|
|
|
( Backend b,
|
|
|
|
|
Eq (BooleanOperators b v),
|
|
|
|
|
Eq v,
|
2021-12-07 16:12:02 +03:00
|
|
|
|
Eq r
|
2021-09-24 01:56:37 +03:00
|
|
|
|
) =>
|
|
|
|
|
Eq (ComputedFieldSelect b r v)
|
2021-09-22 13:43:05 +03:00
|
|
|
|
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock instance
|
2021-09-24 01:56:37 +03:00
|
|
|
|
( Backend b,
|
|
|
|
|
Show (BooleanOperators b v),
|
|
|
|
|
Show v,
|
2021-12-07 16:12:02 +03:00
|
|
|
|
Show r
|
2021-09-24 01:56:37 +03:00
|
|
|
|
) =>
|
|
|
|
|
Show (ComputedFieldSelect b r v)
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
|
2022-03-08 11:22:20 +03:00
|
|
|
|
instance Backend b => Bifoldable (ComputedFieldSelect b) where
|
|
|
|
|
bifoldMap f g = \case
|
|
|
|
|
CFSScalar cfsSelect caseBoolExp -> foldMap g cfsSelect <> foldMap (foldMap $ foldMap g) caseBoolExp
|
|
|
|
|
CFSTable _ simpleSelect -> bifoldMapAnnSelectG f g simpleSelect
|
|
|
|
|
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
-- Local relationship
|
|
|
|
|
|
2021-09-24 01:56:37 +03:00
|
|
|
|
data AnnRelationSelectG (b :: BackendType) a = AnnRelationSelectG
|
2022-03-10 09:17:48 +03:00
|
|
|
|
{ _aarRelationshipName :: RelName, -- Relationship name
|
|
|
|
|
_aarColumnMapping :: HashMap (Column b) (Column b), -- Column of left table to join with
|
|
|
|
|
_aarAnnSelect :: a -- Current table. Almost ~ to SQL Select
|
2021-09-24 01:56:37 +03:00
|
|
|
|
}
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock (Functor, Foldable, Traversable)
|
2021-09-24 01:56:37 +03:00
|
|
|
|
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock instance (Backend b, Eq v) => Eq (AnnRelationSelectG b v)
|
2021-09-24 01:56:37 +03:00
|
|
|
|
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock instance (Backend b, Show v) => Show (AnnRelationSelectG b v)
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
|
2021-09-24 01:56:37 +03:00
|
|
|
|
type ArrayRelationSelectG b r v = AnnRelationSelectG b (AnnSimpleSelectG b r v)
|
|
|
|
|
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
type ArrayAggregateSelectG b r v = AnnRelationSelectG b (AnnAggregateSelectG b r v)
|
|
|
|
|
|
2021-09-24 01:56:37 +03:00
|
|
|
|
type ArrayConnectionSelect b r v = AnnRelationSelectG b (ConnectionSelect b r v)
|
|
|
|
|
|
2021-12-07 16:12:02 +03:00
|
|
|
|
type ArrayAggregateSelect b = ArrayAggregateSelectG b Void (SQLExpression b)
|
2021-09-24 01:56:37 +03:00
|
|
|
|
|
2021-12-07 16:12:02 +03:00
|
|
|
|
data AnnObjectSelectG (b :: BackendType) (r :: Type) v = AnnObjectSelectG
|
2022-02-25 23:37:32 +03:00
|
|
|
|
{ _aosFields :: AnnFieldsG b r v,
|
|
|
|
|
_aosTableFrom :: TableName b,
|
2022-02-23 23:17:58 +03:00
|
|
|
|
_aosTableFilter :: (AnnBoolExp b v)
|
2021-09-24 01:56:37 +03:00
|
|
|
|
}
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock (Functor, Foldable, Traversable)
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock instance
|
2021-09-24 01:56:37 +03:00
|
|
|
|
( Backend b,
|
|
|
|
|
Eq (BooleanOperators b v),
|
|
|
|
|
Eq v,
|
2021-12-07 16:12:02 +03:00
|
|
|
|
Eq r
|
2021-09-24 01:56:37 +03:00
|
|
|
|
) =>
|
|
|
|
|
Eq (AnnObjectSelectG b r v)
|
2021-09-22 13:43:05 +03:00
|
|
|
|
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock instance
|
2021-09-24 01:56:37 +03:00
|
|
|
|
( Backend b,
|
|
|
|
|
Show (BooleanOperators b v),
|
|
|
|
|
Show v,
|
2021-12-07 16:12:02 +03:00
|
|
|
|
Show r
|
2021-09-24 01:56:37 +03:00
|
|
|
|
) =>
|
|
|
|
|
Show (AnnObjectSelectG b r v)
|
2021-09-22 13:43:05 +03:00
|
|
|
|
|
2022-03-08 11:22:20 +03:00
|
|
|
|
instance Backend b => Bifoldable (AnnObjectSelectG b) where
|
|
|
|
|
bifoldMap f g AnnObjectSelectG {..} =
|
|
|
|
|
foldMap (foldMap $ bifoldMap f g) _aosFields <> foldMap (foldMap g) _aosTableFilter
|
|
|
|
|
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
type AnnObjectSelect b r = AnnObjectSelectG b r (SQLExpression b)
|
|
|
|
|
|
|
|
|
|
type ObjectRelationSelectG b r v = AnnRelationSelectG b (AnnObjectSelectG b r v)
|
|
|
|
|
|
2021-12-07 16:12:02 +03:00
|
|
|
|
type ObjectRelationSelect b = ObjectRelationSelectG b Void (SQLExpression b)
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
|
2021-12-07 16:12:02 +03:00
|
|
|
|
data ArraySelectG (b :: BackendType) (r :: Type) v
|
2022-02-23 23:17:58 +03:00
|
|
|
|
= ASSimple (ArrayRelationSelectG b r v)
|
|
|
|
|
| ASAggregate (ArrayAggregateSelectG b r v)
|
|
|
|
|
| ASConnection (ArrayConnectionSelect b r v)
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock (Functor, Foldable, Traversable)
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock instance
|
2021-09-24 01:56:37 +03:00
|
|
|
|
( Backend b,
|
|
|
|
|
Eq (BooleanOperators b v),
|
|
|
|
|
Eq v,
|
2021-12-07 16:12:02 +03:00
|
|
|
|
Eq r
|
2021-09-24 01:56:37 +03:00
|
|
|
|
) =>
|
|
|
|
|
Eq (ArraySelectG b r v)
|
2021-09-22 13:43:05 +03:00
|
|
|
|
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock instance
|
2021-09-24 01:56:37 +03:00
|
|
|
|
( Backend b,
|
|
|
|
|
Show (BooleanOperators b v),
|
|
|
|
|
Show v,
|
2021-12-07 16:12:02 +03:00
|
|
|
|
Show r
|
2021-09-24 01:56:37 +03:00
|
|
|
|
) =>
|
|
|
|
|
Show (ArraySelectG b r v)
|
2021-09-22 13:43:05 +03:00
|
|
|
|
|
2022-03-08 11:22:20 +03:00
|
|
|
|
instance Backend b => Bifoldable (ArraySelectG b) where
|
|
|
|
|
bifoldMap f g = \case
|
|
|
|
|
ASSimple arrayRelationSelect -> foldMap (bifoldMapAnnSelectG f g) arrayRelationSelect
|
|
|
|
|
ASAggregate arrayAggregateSelect -> foldMap (bifoldMapAnnSelectG f g) arrayAggregateSelect
|
|
|
|
|
ASConnection arrayConnectionSelect -> foldMap (bifoldMap f g) arrayConnectionSelect
|
|
|
|
|
|
2021-12-07 16:12:02 +03:00
|
|
|
|
type ArraySelect b = ArraySelectG b Void (SQLExpression b)
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
|
2021-09-24 01:56:37 +03:00
|
|
|
|
type ArraySelectFieldsG b r v = Fields (ArraySelectG b r v)
|
2019-04-17 12:48:41 +03:00
|
|
|
|
|
2021-07-26 16:03:51 +03:00
|
|
|
|
-- | Captures the selection set of a remote source relationship.
|
2021-09-24 01:56:37 +03:00
|
|
|
|
data
|
|
|
|
|
SourceRelationshipSelection
|
2021-07-26 16:03:51 +03:00
|
|
|
|
(b :: BackendType)
|
2021-12-07 16:12:02 +03:00
|
|
|
|
(r :: Type)
|
2021-07-26 16:03:51 +03:00
|
|
|
|
(vf :: BackendType -> Type)
|
2022-02-23 23:17:58 +03:00
|
|
|
|
= SourceRelationshipObject (AnnObjectSelectG b r (vf b))
|
|
|
|
|
| SourceRelationshipArray (AnnSimpleSelectG b r (vf b))
|
|
|
|
|
| SourceRelationshipArrayAggregate (AnnAggregateSelectG b r (vf b))
|
2021-07-26 16:03:51 +03:00
|
|
|
|
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock instance
|
2021-09-24 01:56:37 +03:00
|
|
|
|
( Backend b,
|
|
|
|
|
Eq (BooleanOperators b (v b)),
|
|
|
|
|
Eq (v b),
|
2021-12-07 16:12:02 +03:00
|
|
|
|
Eq r
|
2021-09-24 01:56:37 +03:00
|
|
|
|
) =>
|
|
|
|
|
Eq (SourceRelationshipSelection b r v)
|
2021-09-22 13:43:05 +03:00
|
|
|
|
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock instance
|
2021-09-24 01:56:37 +03:00
|
|
|
|
( Backend b,
|
|
|
|
|
Show (BooleanOperators b (v b)),
|
|
|
|
|
Show (v b),
|
2021-12-07 16:12:02 +03:00
|
|
|
|
Show r
|
2021-09-24 01:56:37 +03:00
|
|
|
|
) =>
|
|
|
|
|
Show (SourceRelationshipSelection b r v)
|
2021-09-22 13:43:05 +03:00
|
|
|
|
|
2021-07-26 16:03:51 +03:00
|
|
|
|
-- | A relationship to a remote source. 'vf' (could use a better name) is
|
|
|
|
|
-- analogous to 'v' in other IR types such as 'AnnFieldG'. vf's kind is
|
|
|
|
|
-- (BackendType -> Type) instead of v's 'Type' so that 'v' of 'AnnFieldG' can
|
|
|
|
|
-- be specific to the backend that it captures ('b' of an AnnFieldG changes as
|
|
|
|
|
-- we walk down the IR branches which capture relationships to other databases)
|
2021-09-24 01:56:37 +03:00
|
|
|
|
data
|
|
|
|
|
RemoteSourceSelect
|
2021-12-07 16:12:02 +03:00
|
|
|
|
(r :: Type)
|
2021-07-26 16:03:51 +03:00
|
|
|
|
(vf :: BackendType -> Type)
|
2021-09-24 01:56:37 +03:00
|
|
|
|
(tgt :: BackendType) = RemoteSourceSelect
|
2022-02-23 23:17:58 +03:00
|
|
|
|
{ _rssName :: SourceName,
|
2022-02-25 23:37:32 +03:00
|
|
|
|
_rssConfig :: SourceConfig tgt,
|
|
|
|
|
_rssSelection :: SourceRelationshipSelection tgt r vf,
|
2021-09-24 01:56:37 +03:00
|
|
|
|
-- | Additional information about the source's join columns:
|
2021-07-26 16:03:51 +03:00
|
|
|
|
-- (ScalarType tgt) so that the remote can interpret the join values coming
|
|
|
|
|
-- from src
|
|
|
|
|
-- (Column tgt) so that an appropriate join condition / IN clause can be built
|
|
|
|
|
-- by the remote
|
2022-02-23 23:17:58 +03:00
|
|
|
|
_rssJoinMapping :: (HM.HashMap FieldName (ScalarType tgt, Column tgt))
|
2021-09-24 01:56:37 +03:00
|
|
|
|
}
|
2021-07-26 16:03:51 +03:00
|
|
|
|
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
-- Permissions
|
|
|
|
|
|
2021-09-24 01:56:37 +03:00
|
|
|
|
data TablePermG (b :: BackendType) v = TablePerm
|
2022-02-25 23:37:32 +03:00
|
|
|
|
{ _tpFilter :: AnnBoolExp b v,
|
2022-02-23 23:17:58 +03:00
|
|
|
|
_tpLimit :: (Maybe Int)
|
2021-09-24 01:56:37 +03:00
|
|
|
|
}
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock (Generic, Functor, Foldable, Traversable)
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock instance
|
2021-09-24 01:56:37 +03:00
|
|
|
|
( Backend b,
|
|
|
|
|
Eq (BooleanOperators b v),
|
|
|
|
|
Eq v
|
|
|
|
|
) =>
|
|
|
|
|
Eq (TablePermG b v)
|
2021-09-22 13:43:05 +03:00
|
|
|
|
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock instance
|
2021-09-24 01:56:37 +03:00
|
|
|
|
( Backend b,
|
|
|
|
|
Show (BooleanOperators b v),
|
|
|
|
|
Show v
|
|
|
|
|
) =>
|
|
|
|
|
Show (TablePermG b v)
|
2021-09-22 13:43:05 +03:00
|
|
|
|
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
instance
|
2021-09-24 01:56:37 +03:00
|
|
|
|
( Backend b,
|
|
|
|
|
Hashable (BooleanOperators b v),
|
|
|
|
|
Hashable (ColumnInfo b),
|
|
|
|
|
Hashable v
|
|
|
|
|
) =>
|
|
|
|
|
Hashable (TablePermG b v)
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
|
|
|
|
|
type TablePerm b = TablePermG b (SQLExpression b)
|
|
|
|
|
|
|
|
|
|
noTablePermissions :: TablePermG backend v
|
2021-07-08 18:41:59 +03:00
|
|
|
|
noTablePermissions = TablePerm annBoolExpTrue Nothing
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
|
|
|
|
|
-- Function arguments
|
2019-04-17 12:48:41 +03:00
|
|
|
|
|
2021-12-13 19:48:10 +03:00
|
|
|
|
data ArgumentExp a
|
|
|
|
|
= -- | Table row accessor
|
|
|
|
|
AETableRow
|
|
|
|
|
| -- | Hardcoded reference to @hdb_catalog.hdb_action_log.response_payload@
|
|
|
|
|
AEActionResponsePayload
|
2021-09-24 01:56:37 +03:00
|
|
|
|
| -- | JSON/JSONB hasura session variable object
|
2022-02-23 23:17:58 +03:00
|
|
|
|
AESession a
|
|
|
|
|
| AEInput a
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock (Eq, Show, Functor, Foldable, Traversable, Generic)
|
|
|
|
|
deriving anyclass (Hashable)
|
2021-09-24 01:56:37 +03:00
|
|
|
|
|
2021-12-13 19:48:10 +03:00
|
|
|
|
-- | Eliminate 'ArgumentExp'
|
|
|
|
|
--
|
|
|
|
|
-- Used to ensure that the right column is used for 'AEActionResponsePayload'.
|
|
|
|
|
onArgumentExp ::
|
|
|
|
|
-- | Value to return for 'AETableRow'
|
|
|
|
|
a ->
|
|
|
|
|
-- | Create value to return for 'AEResponsePayload' given column text
|
|
|
|
|
(Text -> a) ->
|
|
|
|
|
-- | 'ArgumentExp' to eliminate
|
|
|
|
|
ArgumentExp a ->
|
|
|
|
|
a
|
|
|
|
|
onArgumentExp tableRow fromColumn = \case
|
|
|
|
|
AETableRow -> tableRow
|
|
|
|
|
AEActionResponsePayload -> fromColumn actionResponsePayloadColumn
|
|
|
|
|
AESession a -> a
|
|
|
|
|
AEInput a -> a
|
|
|
|
|
|
|
|
|
|
-- | Hardcoded @hdb_catalog.hdb_action_log.response_payload@ column name
|
|
|
|
|
actionResponsePayloadColumn :: Text
|
|
|
|
|
actionResponsePayloadColumn = "response_payload"
|
|
|
|
|
{-# INLINE actionResponsePayloadColumn #-}
|
2021-07-08 18:41:59 +03:00
|
|
|
|
|
2021-09-24 01:56:37 +03:00
|
|
|
|
data FunctionArgsExpG a = FunctionArgsExp
|
2022-02-23 23:17:58 +03:00
|
|
|
|
{ _faePositional :: [a],
|
|
|
|
|
_faeNamed :: (HM.HashMap Text a)
|
2021-09-24 01:56:37 +03:00
|
|
|
|
}
|
2021-12-13 19:48:10 +03:00
|
|
|
|
deriving stock (Show, Eq, Functor, Foldable, Traversable, Generic)
|
|
|
|
|
deriving anyclass (Hashable)
|
2019-08-28 22:27:15 +03:00
|
|
|
|
|
2021-12-13 19:48:10 +03:00
|
|
|
|
type FunctionArgsExpTableRow v = FunctionArgsExpG (ArgumentExp v)
|
2021-09-24 01:56:37 +03:00
|
|
|
|
|
|
|
|
|
type FunctionArgExp b = FunctionArgsExpG (SQLExpression b)
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
|
2019-08-28 22:27:15 +03:00
|
|
|
|
emptyFunctionArgsExp :: FunctionArgsExpG a
|
|
|
|
|
emptyFunctionArgsExp = FunctionArgsExp [] HM.empty
|
|
|
|
|
|
2021-09-24 01:56:37 +03:00
|
|
|
|
functionArgsWithTableRowAndSession ::
|
|
|
|
|
v ->
|
|
|
|
|
FunctionTableArgument ->
|
|
|
|
|
Maybe FunctionSessionArgument ->
|
2021-12-13 19:48:10 +03:00
|
|
|
|
[ArgumentExp v]
|
|
|
|
|
functionArgsWithTableRowAndSession _ _ Nothing = [AETableRow] -- No session argument
|
|
|
|
|
functionArgsWithTableRowAndSession sess (FTAFirst) _ = [AETableRow, AESession sess]
|
|
|
|
|
functionArgsWithTableRowAndSession sess (FTANamed _ 0) _ = [AETableRow, AESession sess] -- Index is 0 implies table argument is first
|
|
|
|
|
functionArgsWithTableRowAndSession sess _ _ = [AESession sess, AETableRow]
|
2021-07-27 19:27:28 +03:00
|
|
|
|
|
2020-06-08 15:13:01 +03:00
|
|
|
|
-- | If argument positional index is less than or equal to length of
|
|
|
|
|
-- 'positional' arguments then insert the value in 'positional' arguments else
|
|
|
|
|
-- insert the value with argument name in 'named' arguments
|
2021-09-24 01:56:37 +03:00
|
|
|
|
insertFunctionArg ::
|
|
|
|
|
FunctionArgName ->
|
|
|
|
|
Int ->
|
|
|
|
|
a ->
|
|
|
|
|
FunctionArgsExpG a ->
|
|
|
|
|
FunctionArgsExpG a
|
2020-05-27 18:02:58 +03:00
|
|
|
|
insertFunctionArg argName idx value (FunctionArgsExp positional named) =
|
2021-09-24 01:56:37 +03:00
|
|
|
|
if (idx + 1) <= length positional
|
|
|
|
|
then FunctionArgsExp (insertAt idx value positional) named
|
|
|
|
|
else
|
|
|
|
|
FunctionArgsExp positional $
|
|
|
|
|
HM.insert (getFuncArgNameTxt argName) value named
|
2019-10-18 11:29:47 +03:00
|
|
|
|
where
|
|
|
|
|
insertAt i a = toList . Seq.insertAt i a . Seq.fromList
|
|
|
|
|
|
2022-01-18 17:53:44 +03:00
|
|
|
|
-- | The "distinct" input field inside "count" aggregate field
|
|
|
|
|
--
|
|
|
|
|
-- count (
|
|
|
|
|
-- distinct: Boolean
|
2022-02-23 23:17:58 +03:00
|
|
|
|
-- ): Int
|
2022-01-18 17:53:44 +03:00
|
|
|
|
data CountDistinct
|
|
|
|
|
= SelectCountDistinct
|
|
|
|
|
| SelectCountNonDistinct
|
|
|
|
|
|
server: IR for DB-DB joins
### Description
This PR adds the required IR for DB to DB joins, based on @paf31 and @0x777 's `feature/db-to-db` branch.
To do so, it also refactors the IR to introduce a new type parameter, `r`, which is used to recursively constructs the `v` parameter of remote QueryDBs. When collecting remote joins, we replace `r` with `Const Void`, indicating at the type level that there cannot be any leftover remote join.
Furthermore, this PR refactors IR.Select for readability, moves some code from IR.Root to IR.Select to avoid having to deal with circular dependencies, and makes it compile by adding `error` in all new cases in the execution pipeline.
The diff doesn't make it clear, but most of Select.hs is actually unchanged. Declarations have just been reordered by topic, in the following order:
- type declarations
- instance declarations
- type aliases
- constructor functions
- traverse functions
https://github.com/hasura/graphql-engine-mono/pull/1580
Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com>
GitOrigin-RevId: bbdcb4119cec8bb3fc32f1294f91b8dea0728721
2021-06-18 02:12:11 +03:00
|
|
|
|
-- Lenses
|
|
|
|
|
|
2020-06-08 15:13:01 +03:00
|
|
|
|
$(makeLenses ''AnnSelectG)
|
2022-03-10 09:17:48 +03:00
|
|
|
|
$(makeLenses ''AnnObjectSelectG)
|
|
|
|
|
$(makeLenses ''AnnRelationSelectG)
|
|
|
|
|
$(makeLenses ''ConnectionSelect)
|
2021-09-21 13:39:34 +03:00
|
|
|
|
$(makeLenses ''SelectArgsG)
|
2020-06-08 15:13:01 +03:00
|
|
|
|
$(makePrisms ''AnnFieldG)
|
2021-07-27 19:27:28 +03:00
|
|
|
|
$(makePrisms ''AnnotatedOrderByElement)
|
2022-03-10 09:17:48 +03:00
|
|
|
|
$(makePrisms ''TableAggregateFieldG)
|
|
|
|
|
$(makePrisms ''ConnectionField)
|
|
|
|
|
$(makePrisms ''EdgeField)
|