server: fix missing/wrong graphql-default field name transformations

PR-URL: https://github.com/hasura/graphql-engine-mono/pull/4927
GitOrigin-RevId: 02dc61f05e06f46c193be3685abbef9c8535edef
This commit is contained in:
paritosh-08 2022-07-04 11:10:16 +05:30 committed by hasura-bot
parent edcbe129a7
commit 680cf5b3c0
3 changed files with 19 additions and 15 deletions

View File

@ -338,22 +338,22 @@ orderByOperators ::
orderByOperators tCase = orderByOperators tCase =
(Name._order_by,) $ (Name._order_by,) $
NE.fromList NE.fromList
[ ( define (applyFieldNameCaseCust tCase Name._asc) "in ascending order, nulls last", [ ( define (applyEnumValueCase tCase Name._asc) "in ascending order, nulls last",
(PG.OTAsc, PG.NLast) (PG.OTAsc, PG.NLast)
), ),
( define (applyFieldNameCaseCust tCase Name._asc_nulls_first) "in ascending order, nulls first", ( define (applyEnumValueCase tCase Name._asc_nulls_first) "in ascending order, nulls first",
(PG.OTAsc, PG.NFirst) (PG.OTAsc, PG.NFirst)
), ),
( define (applyFieldNameCaseCust tCase Name._asc_nulls_last) "in ascending order, nulls last", ( define (applyEnumValueCase tCase Name._asc_nulls_last) "in ascending order, nulls last",
(PG.OTAsc, PG.NLast) (PG.OTAsc, PG.NLast)
), ),
( define (applyFieldNameCaseCust tCase Name._desc) "in descending order, nulls first", ( define (applyEnumValueCase tCase Name._desc) "in descending order, nulls first",
(PG.OTDesc, PG.NFirst) (PG.OTDesc, PG.NFirst)
), ),
( define (applyFieldNameCaseCust tCase Name._desc_nulls_first) "in descending order, nulls first", ( define (applyEnumValueCase tCase Name._desc_nulls_first) "in descending order, nulls first",
(PG.OTDesc, PG.NFirst) (PG.OTDesc, PG.NFirst)
), ),
( define (applyFieldNameCaseCust tCase Name._desc_nulls_last) "in descending order, nulls last", ( define (applyEnumValueCase tCase Name._desc_nulls_last) "in descending order, nulls last",
(PG.OTDesc, PG.NLast) (PG.OTDesc, PG.NLast)
) )
] ]
@ -388,8 +388,8 @@ comparisonExps = memoize 'comparisonExps \columnType -> do
lqueryParser <- columnParser (ColumnScalar PGLquery) (G.Nullability False) lqueryParser <- columnParser (ColumnScalar PGLquery) (G.Nullability False)
-- `ltxtquery` represents a full-text-search-like pattern for matching `ltree` values. -- `ltxtquery` represents a full-text-search-like pattern for matching `ltree` values.
ltxtqueryParser <- columnParser (ColumnScalar PGLtxtquery) (G.Nullability False) ltxtqueryParser <- columnParser (ColumnScalar PGLtxtquery) (G.Nullability False)
maybeCastParser <- castExp columnType
tCase <- asks getter tCase <- asks getter
maybeCastParser <- castExp columnType tCase
let name = applyTypeNameCaseCust tCase $ P.getName typedParser <> Name.__comparison_exp let name = applyTypeNameCaseCust tCase $ P.getName typedParser <> Name.__comparison_exp
desc = desc =
G.Description $ G.Description $
@ -675,8 +675,8 @@ comparisonExps = memoize 'comparisonExps \columnType -> do
(ColumnScalar $ PG.PGArray scalarType) (ColumnScalar $ PG.PGArray scalarType)
(PG.PGValArray $ cvValue <$> columnValues) (PG.PGValArray $ cvValue <$> columnValues)
castExp :: ColumnType ('Postgres pgKind) -> m (Maybe (Parser 'Input n (CastExp ('Postgres pgKind) (IR.UnpreparedValue ('Postgres pgKind))))) castExp :: ColumnType ('Postgres pgKind) -> NamingCase -> m (Maybe (Parser 'Input n (CastExp ('Postgres pgKind) (IR.UnpreparedValue ('Postgres pgKind)))))
castExp sourceType = do castExp sourceType tCase = do
let maybeScalars = case sourceType of let maybeScalars = case sourceType of
ColumnScalar PGGeography -> Just (PGGeography, PGGeometry) ColumnScalar PGGeography -> Just (PGGeography, PGGeometry)
ColumnScalar PGGeometry -> Just (PGGeometry, PGGeography) ColumnScalar PGGeometry -> Just (PGGeometry, PGGeography)
@ -684,10 +684,11 @@ comparisonExps = memoize 'comparisonExps \columnType -> do
_ -> Nothing _ -> Nothing
forM maybeScalars $ \(sourceScalar, targetScalar) -> do forM maybeScalars $ \(sourceScalar, targetScalar) -> do
sourceName <- mkScalarTypeName sourceScalar <&> (<> Name.__cast_exp) scalarTypeName <- C.fromName <$> mkScalarTypeName sourceScalar
targetName <- mkScalarTypeName targetScalar targetName <- mkScalarTypeName targetScalar
targetOpExps <- comparisonExps $ ColumnScalar targetScalar targetOpExps <- comparisonExps $ ColumnScalar targetScalar
let field = P.fieldOptional targetName Nothing $ (targetScalar,) <$> targetOpExps let field = P.fieldOptional targetName Nothing $ (targetScalar,) <$> targetOpExps
sourceName = applyTypeNameCaseIdentifier tCase (scalarTypeName <> (C.fromTuple $$(G.litGQLIdentifier ["cast", "exp"])))
pure $ P.object sourceName Nothing $ M.fromList . maybeToList <$> field pure $ P.object sourceName Nothing $ M.fromList . maybeToList <$> field
geographyWithinDistanceInput :: geographyWithinDistanceInput ::

View File

@ -7,6 +7,7 @@ module Hasura.GraphQL.Schema.OrderBy
where where
import Data.Has import Data.Has
import Data.Text.Casing qualified as C
import Data.Text.Extended import Data.Text.Extended
import Hasura.GraphQL.Parser.Class import Hasura.GraphQL.Parser.Class
import Hasura.GraphQL.Schema.Backend import Hasura.GraphQL.Schema.Backend
@ -99,7 +100,7 @@ orderByExp sourceInfo tableInfo = memoizeOn 'orderByExp (_siName sourceInfo, tab
otherTableOrderBy <- join <$> P.fieldOptional fieldName Nothing (P.nullable otherTableParser) otherTableOrderBy <- join <$> P.fieldOptional fieldName Nothing (P.nullable otherTableParser)
pure $ fmap (map $ fmap $ IR.AOCObjectRelation relationshipInfo newPerms) otherTableOrderBy pure $ fmap (map $ fmap $ IR.AOCObjectRelation relationshipInfo newPerms) otherTableOrderBy
ArrRel -> do ArrRel -> do
let aggregateFieldName = fieldName <> Name.__aggregate let aggregateFieldName = applyFieldNameCaseIdentifier tCase $ C.fromTuple (fieldName, [G.convertNameToSuffix Name._aggregate])
aggregationParser <- lift $ orderByAggregation sourceInfo remoteTableInfo aggregationParser <- lift $ orderByAggregation sourceInfo remoteTableInfo
pure $ do pure $ do
aggregationOrderBy <- join <$> P.fieldOptional aggregateFieldName Nothing (P.nullable aggregationParser) aggregationOrderBy <- join <$> P.fieldOptional aggregateFieldName Nothing (P.nullable aggregationParser)
@ -123,7 +124,7 @@ orderByExp sourceInfo tableInfo = memoizeOn 'orderByExp (_siName sourceInfo, tab
(orderByOperator @b tCase sourceInfo) (orderByOperator @b tCase sourceInfo)
<&> fmap (pure . mkOrderByItemG @b (IR.AOCComputedField computedFieldOrderBy)) . join <&> fmap (pure . mkOrderByItemG @b (IR.AOCComputedField computedFieldOrderBy)) . join
ReturnsTable table -> do ReturnsTable table -> do
let aggregateFieldName = fieldName <> Name.__aggregate let aggregateFieldName = applyFieldNameCaseIdentifier tCase $ C.fromTuple (fieldName, [G.convertNameToSuffix Name._aggregate])
tableInfo' <- askTableInfo sourceInfo table tableInfo' <- askTableInfo sourceInfo table
perms <- MaybeT $ tableSelectPermissions tableInfo' perms <- MaybeT $ tableSelectPermissions tableInfo'
let newPerms = fmap partialSQLExpToUnpreparedValue <$> spiFilter perms let newPerms = fmap partialSQLExpToUnpreparedValue <$> spiFilter perms
@ -238,7 +239,7 @@ orderByOperator' ::
Parser 'Both n (Maybe (BasicOrderType b, NullsOrderType b)) Parser 'Both n (Maybe (BasicOrderType b, NullsOrderType b))
orderByOperator' tCase sourceInfo = orderByOperator' tCase sourceInfo =
let (sourcePrefix, orderOperators) = orderByOperators @b sourceInfo tCase let (sourcePrefix, orderOperators) = orderByOperators @b sourceInfo tCase
in P.nullable $ P.enum (applyFieldNameCaseCust tCase sourcePrefix) (Just "column ordering options") $ orderOperators in P.nullable $ P.enum (applyTypeNameCaseCust tCase sourcePrefix) (Just "column ordering options") $ orderOperators
mkOrderByItemG :: forall b a. a -> (BasicOrderType b, NullsOrderType b) -> IR.OrderByItemG b a mkOrderByItemG :: forall b a. a -> (BasicOrderType b, NullsOrderType b) -> IR.OrderByItemG b a
mkOrderByItemG column (orderType, nullsOrder) = mkOrderByItemG column (orderType, nullsOrder) =

View File

@ -7,6 +7,7 @@ import Control.Lens
import Data.Has import Data.Has
import Data.HashMap.Strict.Extended qualified as Map import Data.HashMap.Strict.Extended qualified as Map
import Data.List.NonEmpty qualified as NE import Data.List.NonEmpty qualified as NE
import Data.Text.Casing qualified as C
import Data.Text.Extended import Data.Text.Extended
import Hasura.Base.Error import Hasura.Base.Error
import Hasura.GraphQL.Schema.Backend import Hasura.GraphQL.Schema.Backend
@ -29,7 +30,7 @@ import Hasura.RQL.Types.RemoteSchema
import Hasura.RQL.Types.ResultCustomization import Hasura.RQL.Types.ResultCustomization
import Hasura.RQL.Types.SchemaCache hiding (askTableInfo) import Hasura.RQL.Types.SchemaCache hiding (askTableInfo)
import Hasura.RQL.Types.Source import Hasura.RQL.Types.Source
import Hasura.RQL.Types.SourceCustomization (NamingCase (..), mkCustomizedTypename) import Hasura.RQL.Types.SourceCustomization
import Hasura.SQL.AnyBackend import Hasura.SQL.AnyBackend
import Hasura.Session import Hasura.Session
import Language.GraphQL.Draft.Syntax qualified as G import Language.GraphQL.Draft.Syntax qualified as G
@ -182,6 +183,7 @@ remoteRelationshipToSourceField ::
m [FieldParser n (IR.RemoteSourceSelect (IR.RemoteRelationshipField IR.UnpreparedValue) IR.UnpreparedValue tgt)] m [FieldParser n (IR.RemoteSourceSelect (IR.RemoteRelationshipField IR.UnpreparedValue) IR.UnpreparedValue tgt)]
remoteRelationshipToSourceField sourceCache RemoteSourceFieldInfo {..} = remoteRelationshipToSourceField sourceCache RemoteSourceFieldInfo {..} =
P.withTypenameCustomization (mkCustomizedTypename (Just _rsfiSourceCustomization) HasuraCase) do P.withTypenameCustomization (mkCustomizedTypename (Just _rsfiSourceCustomization) HasuraCase) do
tCase <- asks getter
sourceInfo <- sourceInfo <-
onNothing (unsafeSourceInfo @tgt =<< Map.lookup _rsfiSource sourceCache) $ onNothing (unsafeSourceInfo @tgt =<< Map.lookup _rsfiSource sourceCache) $
throw500 $ "source not found " <> dquote _rsfiSource throw500 $ "source not found " <> dquote _rsfiSource
@ -202,7 +204,7 @@ remoteRelationshipToSourceField sourceCache RemoteSourceFieldInfo {..} =
IR.SourceRelationshipObject $ IR.SourceRelationshipObject $
IR.AnnObjectSelectG fields _rsfiTable $ IR._tpFilter $ tablePermissionsInfo tablePerms IR.AnnObjectSelectG fields _rsfiTable $ IR._tpFilter $ tablePermissionsInfo tablePerms
ArrRel -> do ArrRel -> do
let aggFieldName = fieldName <> Name.__aggregate let aggFieldName = applyFieldNameCaseIdentifier tCase $ C.fromTuple (fieldName, [G.convertNameToSuffix Name._aggregate])
selectionSetParser <- selectTable sourceInfo tableInfo fieldName Nothing selectionSetParser <- selectTable sourceInfo tableInfo fieldName Nothing
aggSelectionSetParser <- selectTableAggregate sourceInfo tableInfo aggFieldName Nothing aggSelectionSetParser <- selectTableAggregate sourceInfo tableInfo aggFieldName Nothing
pure $ pure $