graphql-engine/server/src-lib/Hasura/Backends/BigQuery/DDL.hs
Chris Done f7a202a363 BigQuery Feature Branch
This will implement BigQuery support.

Co-authored-by: Antoine Leblanc <1618949+nicuveo@users.noreply.github.com>
Co-authored-by: Sibi Prabakaran <737477+psibi@users.noreply.github.com>
Co-authored-by: Aniket Deshpande <922486+aniketd@users.noreply.github.com>
Co-authored-by: Vamshi Surabhi <6562944+0x777@users.noreply.github.com>
GitOrigin-RevId: 1a6ffaf34233e13e8125a5c908eaa7e32d65007b
2021-04-12 10:19:20 +00:00

142 lines
4.5 KiB
Haskell

module Hasura.Backends.BigQuery.DDL
( buildComputedFieldInfo
, buildRemoteFieldInfo
, fetchAndValidateEnumValues
, createTableEventTrigger
, buildEventTriggerInfo
, buildFunctionInfo
, updateColumnInEventTrigger
, parseBoolExpOperations
, parseCollectableType
, module M
)
where
import Hasura.Backends.BigQuery.DDL.BoolExp
import Hasura.Prelude
import Data.Aeson
import qualified Data.Environment as Env
import Hasura.RQL.IR.BoolExp
import Hasura.RQL.Types.Backend
import Hasura.RQL.Types.Column
import Hasura.RQL.Types.Common
import Hasura.RQL.Types.ComputedField
import Hasura.RQL.Types.Error
import Hasura.RQL.Types.EventTrigger
import Hasura.RQL.Types.Function
import Hasura.RQL.Types.RemoteRelationship
import Hasura.RQL.Types.SchemaCache
import Hasura.RQL.Types.Table
import Hasura.SQL.Backend
import Hasura.SQL.Types
import Hasura.Server.Types
import Hasura.Backends.BigQuery.Instances.Types ()
import Hasura.Server.Utils
import Hasura.Session
import qualified Hasura.Backends.BigQuery.Types as BigQuery
import Hasura.Backends.BigQuery.DDL.Source as M
buildComputedFieldInfo
:: (MonadError QErr m)
=> HashSet (TableName 'BigQuery)
-> TableName 'BigQuery
-> ComputedFieldName
-> ComputedFieldDefinition 'BigQuery
-> RawFunctionInfo
-> Maybe Text
-> m (ComputedFieldInfo 'BigQuery)
buildComputedFieldInfo _ _ _ _ _ _ =
throw400 NotSupported "Computed fields aren't supported for BigQuery sources"
buildRemoteFieldInfo
:: (MonadError QErr m)
=> RemoteRelationship 'BigQuery
-> [ColumnInfo 'BigQuery]
-> RemoteSchemaMap
-> m (RemoteFieldInfo 'BigQuery, [SchemaDependency])
buildRemoteFieldInfo _ _ _ =
throw400 NotSupported "Remote joins aren't supported for BigQuery sources"
fetchAndValidateEnumValues
:: (Monad m)
=> SourceConfig 'BigQuery
-> TableName 'BigQuery
-> Maybe (PrimaryKey 'BigQuery (RawColumnInfo 'BigQuery))
-> [RawColumnInfo 'BigQuery]
-> m (Either QErr EnumValues)
fetchAndValidateEnumValues _ _ _ _ = runExceptT $
throw400 NotSupported "Enum tables are not supported for BigQuery sources"
createTableEventTrigger
:: (Monad m)
=> ServerConfigCtx
-> SourceConfig 'BigQuery
-> TableName 'BigQuery
-> [ColumnInfo 'BigQuery]
-> TriggerName
-> TriggerOpsDef
-> m (Either QErr ())
createTableEventTrigger _ _ _ _ _ _ = runExceptT $
throw400 NotSupported "Cannot create table event triggers in BigQuery sources"
buildEventTriggerInfo
:: MonadError QErr m
=> Env.Environment
-> SourceName
-> TableName 'BigQuery
-> EventTriggerConf
-> m (EventTriggerInfo, [SchemaDependency])
buildEventTriggerInfo _ _ _ _ =
throw400 NotSupported "Table event triggers are not supported for BigQuery sources"
buildFunctionInfo
:: (MonadError QErr m)
=> SourceName
-> FunctionName 'BigQuery
-> SystemDefined
-> FunctionConfig
-> [FunctionPermissionMetadata]
-> RawFunctionInfo
-> m (FunctionInfo 'BigQuery, SchemaDependency)
buildFunctionInfo _ _ _ _ _ _ =
throw400 NotSupported "SQL Functions are not supported for BigQuery source"
updateColumnInEventTrigger
:: TableName 'BigQuery
-> Column 'BigQuery
-> Column 'BigQuery
-> TableName 'BigQuery
-> EventTriggerConf
-> EventTriggerConf
updateColumnInEventTrigger _ _ _ _ = id
parseCollectableType
:: (MonadError QErr m)
=> CollectableType (ColumnType 'BigQuery)
-> Value
-> m (PartialSQLExp 'BigQuery)
parseCollectableType collectableType = \case
String t
| isSessionVariable t -> pure $ mkTypedSessionVar collectableType $ mkSessionVariable t
| isReqUserId t -> pure $ mkTypedSessionVar collectableType userIdHeader
val -> case collectableType of
CollectableTypeScalar scalarType ->
PSESQLExp . BigQuery.ValueExpression <$> parseScalarValueColumnType scalarType val
CollectableTypeArray _ ->
throw400 NotSupported "Array types are not supported in BigQuery backend"
mkTypedSessionVar
:: CollectableType (ColumnType 'BigQuery)
-> SessionVariable -> PartialSQLExp 'BigQuery
mkTypedSessionVar columnType =
PSESessVar (msColumnTypeToScalarType <$> columnType)
msColumnTypeToScalarType :: ColumnType 'BigQuery -> ScalarType 'BigQuery
msColumnTypeToScalarType = \case
ColumnScalar scalarType -> scalarType
ColumnEnumReference _ -> BigQuery.StringScalarType