这是indexloc提供的服务,不要输入任何密码
Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 39 additions & 2 deletions server/src-exec/Migrate.hs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import qualified Data.Yaml.TH as Y
import qualified Database.PG.Query as Q

curCatalogVer :: T.Text
curCatalogVer = "12"
curCatalogVer = "13"

migrateMetadata
:: ( MonadTx m
Expand Down Expand Up @@ -93,6 +93,20 @@ setAsSystemDefinedFor9 =
AND table_name = 'hdb_version';
|]

setAsSystemDefinedFor12 :: (MonadTx m) => m ()
setAsSystemDefinedFor12 =
liftTx $ Q.catchE defaultTxErrorHandler $
Q.multiQ [Q.sql|
UPDATE hdb_catalog.hdb_relationship
SET is_system_defined = 'true'
WHERE table_schema = 'hdb_catalog'
AND table_name = 'hdb_table';
UPDATE hdb_catalog.hdb_table
SET is_system_defined = 'true'
WHERE table_schema = 'hdb_catalog'
AND table_name = 'hdb_computed_column';
|]

getCatalogVersion
:: (MonadTx m)
=> m T.Text
Expand Down Expand Up @@ -265,6 +279,26 @@ from11To12 = liftTx $ do
$(Q.sqlFromFile "src-rsr/migrate_from_11_to_12.sql")
return ()

from12To13
:: ( MonadTx m
, HasHttpManager m
, HasSQLGenCtx m
, CacheRWM m
, UserInfoM m
, MonadIO m
)
=> m ()
from12To13 = do
-- Migrate database
Q.Discard () <- liftTx $ Q.multiQE defaultTxErrorHandler
$(Q.sqlFromFile "src-rsr/migrate_from_12_to_13.sql")
-- Migrate metadata
migrateMetadata True migrateMetadataFrom12
setAsSystemDefinedFor12
where
migrateMetadataFrom12 =
$(unTypeQ (Y.decodeFile "src-rsr/migrate_metadata_from_12_to_13.yaml" :: Q (TExp RQLQuery)))

migrateCatalog
:: ( MonadTx m
, CacheRWM m
Expand All @@ -290,10 +324,13 @@ migrateCatalog migrationTime = do
| preVer == "9" -> from9ToCurrent
| preVer == "10" -> from10ToCurrent
| preVer == "11" -> from11ToCurrent
| preVer == "12" -> from12ToCurrent
| otherwise -> throw400 NotSupported $
"unsupported version : " <> preVer
where
from11ToCurrent = from11To12 >> postMigrate
from12ToCurrent = from12To13 >> postMigrate

from11ToCurrent = from11To12 >> from12ToCurrent

from10ToCurrent = from10To11 >> from11ToCurrent

Expand Down
2 changes: 1 addition & 1 deletion server/src-lib/Hasura/GraphQL/Context.hs
Original file line number Diff line number Diff line change
Expand Up @@ -375,7 +375,7 @@ mkGCtx tyAgg (RootFlds flds) insCtxMap =
where
TyAgg tyInfos fldInfos scalars ordByEnums = tyAgg
colTys = Set.toList $ Set.fromList $ map pgiType $
lefts $ Map.elems fldInfos
getColsFromSelFields $ Map.elems fldInfos
mkMutRoot =
mkHsraObjTyInfo (Just "mutation root") (G.NamedType "mutation_root") Set.empty .
mapFromL _fiName
Expand Down
14 changes: 8 additions & 6 deletions server/src-lib/Hasura/GraphQL/Resolve/BoolExp.hs
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,17 @@ module Hasura.GraphQL.Resolve.BoolExp
import Data.Has
import Hasura.Prelude

import qualified Data.HashMap.Strict as Map
import qualified Data.HashMap.Strict.InsOrd as OMap
import qualified Language.GraphQL.Draft.Syntax as G
import qualified Data.HashMap.Strict as Map
import qualified Data.HashMap.Strict.InsOrd as OMap
import qualified Language.GraphQL.Draft.Syntax as G

import Hasura.GraphQL.Resolve.Context
import Hasura.GraphQL.Resolve.ContextTypes
import Hasura.GraphQL.Resolve.InputValue
import Hasura.GraphQL.Validate.Types
import Hasura.RQL.Types
import Hasura.SQL.Value
import Hasura.SQL.Types
import Hasura.SQL.Value

type OpExp = OpExpG AnnPGVal

Expand Down Expand Up @@ -111,12 +112,13 @@ parseColExp
parseColExp f nt n val = do
fldInfo <- getFldInfo nt n
case fldInfo of
Left pgColInfo -> do
SFldPGCol pgColInfo -> do
opExps <- parseOpExps (pgiType pgColInfo) val
AVCol pgColInfo <$> traverse (traverse f) opExps
Right (relInfo, _, permExp, _) -> do
SFldRel (RelSelCtx relInfo permExp _ _) -> do
relBoolExp <- parseBoolExp f val
return $ AVRel relInfo $ andAnnBoolExps relBoolExp permExp
SFldCompCol _ _ -> throw500 "unexpected computed column in boolexp"

parseBoolExp
:: (MonadError QErr m, MonadReader r m, Has FieldMap r)
Expand Down
9 changes: 6 additions & 3 deletions server/src-lib/Hasura/GraphQL/Resolve/Context.hs
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ data AnnPGVal
getFldInfo
:: (MonadError QErr m, MonadReader r m, Has FieldMap r)
=> G.NamedType -> G.Name
-> m (Either PGColInfo (RelInfo, Bool, AnnBoolExpSQL, Maybe Int))
-> m SelFieldCtx
getFldInfo nt n = do
fldMap <- asks getter
onNothing (Map.lookup (nt,n) fldMap) $
Expand All @@ -91,10 +91,13 @@ getPGColInfo
getPGColInfo nt n = do
fldInfo <- getFldInfo nt n
case fldInfo of
Left pgColInfo -> return pgColInfo
Right _ -> throw500 $
SFldPGCol pgColInfo -> return pgColInfo
SFldRel{} -> throw500 $
"found relinfo when expecting pgcolinfo for "
<> showNamedTy nt <> ":" <> showName n
SFldCompCol _ _ -> throw500 $
"found computed column when expecting pgcolinfo for "
<> showNamedTy nt <> ":" <> showName n

getArg
:: (MonadError QErr m)
Expand Down
54 changes: 49 additions & 5 deletions server/src-lib/Hasura/GraphQL/Resolve/ContextTypes.hs
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,62 @@ module Hasura.GraphQL.Resolve.ContextTypes where

import Hasura.Prelude

import qualified Data.HashMap.Strict as Map
import qualified Data.Sequence as Seq
import qualified Language.GraphQL.Draft.Syntax as G
import qualified Data.HashMap.Strict as Map
import qualified Data.Sequence as Seq
import qualified Language.GraphQL.Draft.Syntax as G

import Hasura.RQL.Types.BoolExp
import Hasura.RQL.Types.Common
import Hasura.RQL.Types.SchemaCacheTypes
import Hasura.SQL.Types

data RelSelFld
= RelSelFld
{ _rsfInfo :: !RelInfo
, _rsfPermFltr :: !AnnBoolExpSQL
, _rsfPermLimit :: !(Maybe Int)
, _rsfAllowAgg :: !Bool
, _rsfIsNullable :: !Bool
} deriving (Show, Eq)

data SelFieldG a
= SFldPGCol !PGColInfo
| SFldCompCol !(Seq.Seq FuncArgItem) !CompColFunc
| SFldRel !a
deriving (Show, Eq)

type SelField = SelFieldG RelSelFld

data RelSelCtx
= RelSelCtx
{ _rscInfo :: !RelInfo
, _rscPermFltr :: !AnnBoolExpSQL
, _rscPermLimit :: !(Maybe Int)
, _rscIsAgg :: !Bool
} deriving (Show, Eq)

type SelFieldCtx = SelFieldG RelSelCtx

getColsFromSelFields :: [SelFieldG a] -> [PGColInfo]
getColsFromSelFields flds =
flip mapMaybe flds $ \case
SFldPGCol ci -> Just ci
_ -> Nothing

getRelsFromSelFields :: [SelField] -> [RelSelFld]
getRelsFromSelFields flds =
flip mapMaybe flds $ \case
SFldRel rcs -> Just rcs
_ -> Nothing

getCCFuncsFromSelFields :: [SelFieldG a] -> [CompColFunc]
getCCFuncsFromSelFields flds =
flip mapMaybe flds $ \case
SFldCompCol _ ccf -> Just ccf
_ -> Nothing

type FieldMap
= Map.HashMap (G.NamedType, G.Name)
(Either PGColInfo (RelInfo, Bool, AnnBoolExpSQL, Maybe Int))
= Map.HashMap (G.NamedType, G.Name) SelFieldCtx

-- order by context
data OrdByItem
Expand Down
35 changes: 22 additions & 13 deletions server/src-lib/Hasura/GraphQL/Resolve/Select.hs
Original file line number Diff line number Diff line change
Expand Up @@ -13,28 +13,29 @@ module Hasura.GraphQL.Resolve.Select
, fromFuncQueryField
) where

import Control.Arrow (first)
import Control.Arrow (first)
import Data.Has
import Data.Parser.JSONPath
import Hasura.Prelude

import qualified Data.HashMap.Strict as Map
import qualified Data.HashMap.Strict.InsOrd as OMap
import qualified Data.List.NonEmpty as NE
import qualified Data.Text as T
import qualified Language.GraphQL.Draft.Syntax as G
import qualified Data.HashMap.Strict as Map
import qualified Data.HashMap.Strict.InsOrd as OMap
import qualified Data.List.NonEmpty as NE
import qualified Data.Text as T
import qualified Language.GraphQL.Draft.Syntax as G

import qualified Hasura.RQL.DML.Select as RS
import qualified Hasura.SQL.DML as S
import qualified Hasura.RQL.DML.Select as RS
import qualified Hasura.SQL.DML as S

import Hasura.GraphQL.Context
import Hasura.GraphQL.Resolve.BoolExp
import Hasura.GraphQL.Resolve.Context
import Hasura.GraphQL.Resolve.ContextTypes
import Hasura.GraphQL.Resolve.InputValue
import Hasura.GraphQL.Schema (isAggFld)
import Hasura.GraphQL.Schema (isAggFld)
import Hasura.GraphQL.Validate.Field
import Hasura.GraphQL.Validate.Types
import Hasura.RQL.DML.Internal (onlyPositiveInt)
import Hasura.RQL.DML.Internal (onlyPositiveInt)
import Hasura.RQL.Types
import Hasura.SQL.Types
import Hasura.SQL.Value
Expand Down Expand Up @@ -74,10 +75,18 @@ fromSelSet f fldTy flds =
_ -> do
fldInfo <- getFldInfo fldTy fldName
case fldInfo of
Left colInfo ->
(RS.FCol colInfo) <$> (argsToColOp $ _fArguments fld)
SFldPGCol colInfo ->
RS.FCol colInfo <$> argsToColOp (_fArguments fld)
-- let jsonCol = return $ RS.FCol $ colInfo { pgiName = PGCol $ T.pack "metadata->'name'" }
Right (relInfo, isAgg, tableFilter, tableLimit) -> do
SFldCompCol argSeq ccf -> do
let qf = fiName ccf
retTy = fiReturnType ccf
args = _fArguments fld
funcArgsM <- withArgM args "args" $ parseFunctionArgs f argSeq
let funcArgs = fromMaybe [] funcArgsM
colOpM <- argsToColOp args
return $ RS.FCompCol (RS.CompColSel qf funcArgs retTy) colOpM
SFldRel (RelSelCtx relInfo tableFilter tableLimit isAgg) -> do
let relTN = riRTable relInfo
colMapping = riMapping relInfo
rn = riName relInfo
Expand Down
Loading