Skip to content

Commit de012b1

Browse files
author
Auke Booij
committed
Use record types rather than tuples fo IntrospectionResult and ParsedIntrospection
1 parent 82a0ada commit de012b1

File tree

5 files changed

+33
-28
lines changed

5 files changed

+33
-28
lines changed

server/src-lib/Hasura/GraphQL/RemoteServer.hs

+6-7
Original file line numberDiff line numberDiff line change
@@ -77,13 +77,15 @@ fetchRemoteSchema env manager schemaName schemaInfo@(RemoteSchemaInfo url header
7777
either (remoteSchemaErr . T.pack) return $ J.eitherDecode respData
7878

7979
-- Check that the parsed GraphQL type info is valid by running the schema generation
80-
parsers <- P.runSchemaT @m @(P.ParseT Identity) $ buildRemoteParser introspectRes schemaInfo
80+
(queryParsers, mutationParsers, subscriptionParsers) <-
81+
P.runSchemaT @m @(P.ParseT Identity) $ buildRemoteParser introspectRes schemaInfo
8182

8283
-- The 'rawIntrospectionResult' contains the 'Bytestring' response of
8384
-- the introspection result of the remote server. We store this in the
8485
-- 'RemoteSchemaCtx' because we can use this when the 'introspect_remote_schema'
8586
-- is called by simple encoding the result to JSON.
86-
return $ RemoteSchemaCtx schemaName introspectRes schemaInfo respData parsers
87+
return $ RemoteSchemaCtx schemaName introspectRes schemaInfo respData $
88+
ParsedIntrospection queryParsers mutationParsers subscriptionParsers
8789
where
8890
remoteSchemaErr :: T.Text -> m a
8991
remoteSchemaErr = throw400 RemoteSchemaError
@@ -295,11 +297,8 @@ instance J.FromJSON (FromIntrospection IntrospectionResult) where
295297
Just subsType -> do
296298
subRoot <- subsType .: "name"
297299
return $ Just subRoot
298-
let r = ( G.SchemaIntrospection (fmap fromIntrospection types)
299-
, queryRoot
300-
, mutationRoot
301-
, subsRoot
302-
)
300+
let r = IntrospectionResult (G.SchemaIntrospection (fmap fromIntrospection types))
301+
queryRoot mutationRoot subsRoot
303302
return $ FromIntrospection r
304303

305304
execRemoteGQ'

server/src-lib/Hasura/GraphQL/Schema.hs

+8-9
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ buildGQLContext =
7777

7878
allActionInfos = Map.elems allActions
7979
queryRemotesMap =
80-
fmap (map fDefinition . (\(x,_,_)->x) . rscParsed . fst) allRemoteSchemas
80+
fmap (map fDefinition . piQuery . rscParsed . fst) allRemoteSchemas
8181
buildFullestDBSchema
8282
:: m ( Parser 'Output (P.ParseT Identity) (OMap.InsOrdHashMap G.Name (QueryRootField UnpreparedValue))
8383
, Maybe (Parser 'Output (P.ParseT Identity) (OMap.InsOrdHashMap G.Name (MutationRootField UnpreparedValue)))
@@ -119,15 +119,14 @@ buildGQLContext =
119119
-- This block of code checks that there are no conflicting root field names between remotes.
120120
remotes ::
121121
[ ( RemoteSchemaName
122-
, ( [P.FieldParser (P.ParseT Identity) (RemoteSchemaInfo, G.Field G.NoFragments P.Variable)]
123-
, Maybe [P.FieldParser (P.ParseT Identity) (RemoteSchemaInfo, G.Field G.NoFragments P.Variable)]
124-
, Maybe [P.FieldParser (P.ParseT Identity) (RemoteSchemaInfo, G.Field G.NoFragments P.Variable)]
125-
)
122+
, ParsedIntrospection
126123
)
127124
] <- (| foldlA' (\okSchemas (newSchemaName, (newSchemaContext, newMetadataObject)) -> do
128125
checkedDuplicates <- (| withRecordInconsistency (do
129-
let (queryOld, mutationOld, _subscriptionOld) = unzip3 $ fmap snd okSchemas
130-
let (queryNew, mutationNew, _subscriptionNew) = rscParsed newSchemaContext
126+
let (queryOld, mutationOld) =
127+
unzip $ fmap ((\case ParsedIntrospection q m _ -> (q,m)) . snd) okSchemas
128+
let ParsedIntrospection queryNew mutationNew _subscriptionNew
129+
= rscParsed newSchemaContext
131130
-- Check for conflicts between remotes
132131
bindErrorA -<
133132
checkFieldNamesUnique (fmap (P.getName . fDefinition) (queryNew ++ concat queryOld))
@@ -165,8 +164,8 @@ buildGQLContext =
165164
-- | The 'query' type of the remotes. TODO: also expose mutation
166165
-- remotes. NOT TODO: subscriptions, as we do not yet aim to support
167166
-- these.
168-
queryRemotes = concatMap ((\(q,_,_)->q) . snd) remotes
169-
mutationRemotes = concatMap (concat . (\(_,m,_)->m) . snd) remotes
167+
queryRemotes = concatMap (piQuery . snd) remotes
168+
mutationRemotes = concatMap (concat . piMutation . snd) remotes
170169
queryHasuraOrRelay = case queryType of
171170
QueryHasura -> queryWithIntrospection (Set.fromMap $ validTables $> ())
172171
validFunctions queryRemotes mutationRemotes

server/src-lib/Hasura/GraphQL/Schema/Remote.hs

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ buildRemoteParser
2626
-> m ( [P.FieldParser n (RemoteSchemaInfo, Field NoFragments Variable)]
2727
, Maybe [P.FieldParser n (RemoteSchemaInfo, Field NoFragments Variable)]
2828
, Maybe [P.FieldParser n (RemoteSchemaInfo, Field NoFragments Variable)])
29-
buildRemoteParser (sdoc, query_root, mutation_root, subscription_root) info = do
29+
buildRemoteParser (IntrospectionResult sdoc query_root mutation_root subscription_root) info = do
3030
queryT <- makeParsers query_root
3131
mutationT <- traverse makeParsers mutation_root
3232
subscriptionT <- traverse makeParsers subscription_root

server/src-lib/Hasura/RQL/DDL/RemoteRelationship/Validate.hs

+3-1
Original file line numberDiff line numberDiff line change
@@ -92,9 +92,11 @@ validateRemoteRelationship remoteRelationship remoteSchemaMap pgColumns = do
9292
pure $ (variableName,v)
9393
)) $ (HM.toList $ mapFromL (pgiColumn) pgColumns)
9494
let pgColumnsVariablesMap = HM.fromList pgColumnsVariables
95-
(RemoteSchemaCtx rsName (schemaDoc@(G.SchemaIntrospection originalDefns),queryRootName,_,_) rsi _ _) <-
95+
(RemoteSchemaCtx rsName introspectionResult rsi _ _) <-
9696
onNothing (HM.lookup remoteSchemaName remoteSchemaMap) $
9797
throwError $ RemoteSchemaNotFound remoteSchemaName
98+
let schemaDoc@(G.SchemaIntrospection originalDefns) = irDoc introspectionResult
99+
queryRootName = irQueryRoot introspectionResult
98100
queryRoot <- onNothing (lookupObject schemaDoc queryRootName) $
99101
throwError $ FieldNotFoundInRemoteSchema queryRootName
100102
(_, (leafParamMap, leafTypeMap)) <-

server/src-lib/Hasura/RQL/Types/SchemaCache.hs

+15-10
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@ module Hasura.RQL.Types.SchemaCache
4343
, isMutable
4444
, mutableView
4545

46-
, IntrospectionResult
46+
, IntrospectionResult(..)
47+
, ParsedIntrospection(..)
4748
, RemoteSchemaCtx(..)
4849
, RemoteSchemaMap
4950

@@ -167,16 +168,20 @@ mkComputedFieldDep reason tn computedField =
167168

168169
type WithDeps a = (a, [SchemaDependency])
169170

170-
type IntrospectionResult = ( G.SchemaIntrospection
171-
, G.Name -- query_root
172-
, Maybe G.Name -- mutation_root
173-
, Maybe G.Name
174-
)
171+
data IntrospectionResult
172+
= IntrospectionResult
173+
{ irDoc :: G.SchemaIntrospection
174+
, irQueryRoot :: G.Name
175+
, irMutationRoot :: Maybe G.Name
176+
, irSubscriptionRoot :: Maybe G.Name
177+
}
175178

176-
type ParsedIntrospection =
177-
( [P.FieldParser (P.ParseT Identity) (RemoteSchemaInfo, G.Field G.NoFragments P.Variable)]
178-
, Maybe [P.FieldParser (P.ParseT Identity) (RemoteSchemaInfo, G.Field G.NoFragments P.Variable)]
179-
, Maybe [P.FieldParser (P.ParseT Identity) (RemoteSchemaInfo, G.Field G.NoFragments P.Variable)])
179+
data ParsedIntrospection
180+
= ParsedIntrospection
181+
{ piQuery :: [P.FieldParser (P.ParseT Identity) (RemoteSchemaInfo, G.Field G.NoFragments P.Variable)]
182+
, piMutation :: Maybe [P.FieldParser (P.ParseT Identity) (RemoteSchemaInfo, G.Field G.NoFragments P.Variable)]
183+
, piSubscription :: Maybe [P.FieldParser (P.ParseT Identity) (RemoteSchemaInfo, G.Field G.NoFragments P.Variable)]
184+
}
180185

181186
data RemoteSchemaCtx
182187
= RemoteSchemaCtx

0 commit comments

Comments
 (0)