queryparser-presto-0.1.0.0: src/Database/Sql/Presto/Type.hs
-- Copyright (c) 2017 Uber Technologies, Inc.
--
-- Permission is hereby granted, free of charge, to any person obtaining a copy
-- of this software and associated documentation files (the "Software"), to deal
-- in the Software without restriction, including without limitation the rights
-- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-- copies of the Software, and to permit persons to whom the Software is
-- furnished to do so, subject to the following conditions:
--
-- The above copyright notice and this permission notice shall be included in
-- all copies or substantial portions of the Software.
--
-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-- THE SOFTWARE.
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DeriveTraversable #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE UndecidableInstances #-}
module Database.Sql.Presto.Type where
import Database.Sql.Type
import Database.Sql.Position (Range)
import Database.Sql.Util.Columns
import Database.Sql.Util.Joins
import Database.Sql.Util.Lineage.Table
import Database.Sql.Util.Lineage.ColumnPlus
import Database.Sql.Util.Schema
import Database.Sql.Util.Scope
import Database.Sql.Util.Tables
import Data.Aeson as JSON
import Data.Proxy (Proxy (..))
import qualified Data.Set as S
import qualified Data.Map as M
import Data.Data (Data)
import GHC.Generics (Generic)
data Presto
deriving instance Data Presto
dialectProxy :: Proxy Presto
dialectProxy = Proxy
instance Dialect Presto where
shouldCTEsShadowTables _ = True
resolveCreateTableExtra _ Unused = pure Unused
getSelectScope _ fromColumns selectionAliases = SelectScope
{ bindForWhere = bindFromColumns fromColumns
, bindForGroup = bindFromColumns fromColumns
, bindForHaving = bindFromColumns fromColumns
, bindForOrder = bindBothColumns fromColumns selectionAliases
, bindForNamedWindow = bindColumns [] -- Presto doesn't have this language feature
}
areLcolumnsVisibleInLateralViews _ = True
data PrestoStatement r a = PrestoStandardSqlStatement (Statement Presto r a)
| PrestoUnhandledStatement a
deriving instance (ConstrainSNames Data r a, Data r) => Data (PrestoStatement r a)
deriving instance Generic (PrestoStatement r a)
deriving instance ConstrainSNames Eq r a => Eq (PrestoStatement r a)
deriving instance ConstrainSNames Show r a => Show (PrestoStatement r a)
deriving instance ConstrainSASNames Functor r => Functor (PrestoStatement r)
deriving instance ConstrainSASNames Foldable r => Foldable (PrestoStatement r)
deriving instance ConstrainSASNames Traversable r => Traversable (PrestoStatement r)
instance HasJoins (PrestoStatement ResolvedNames a) where
getJoins (PrestoStandardSqlStatement stmt) = getJoins stmt
getJoins (PrestoUnhandledStatement _) = S.empty
instance HasTableLineage (PrestoStatement ResolvedNames a) where
getTableLineage (PrestoStandardSqlStatement stmt) = tableLineage stmt
getTableLineage (PrestoUnhandledStatement _) = M.empty
instance HasColumnLineage (PrestoStatement ResolvedNames Range) where
getColumnLineage (PrestoStandardSqlStatement stmt) = columnLineage stmt
getColumnLineage (PrestoUnhandledStatement _) = returnNothing M.empty
resolvePrestoStatement :: PrestoStatement RawNames a -> Resolver (PrestoStatement ResolvedNames) a
resolvePrestoStatement (PrestoStandardSqlStatement stmt) =
PrestoStandardSqlStatement <$> resolveStatement stmt
resolvePrestoStatement (PrestoUnhandledStatement info) = pure $ PrestoUnhandledStatement info
instance HasSchemaChange (PrestoStatement ResolvedNames a) where
getSchemaChange (PrestoStandardSqlStatement stmt) = getSchemaChange stmt
getSchemaChange (PrestoUnhandledStatement _) = []
instance (ConstrainSNames ToJSON r a, ToJSON a) => ToJSON (PrestoStatement r a) where
toJSON (PrestoStandardSqlStatement stmt) = toJSON stmt
toJSON (PrestoUnhandledStatement info) = JSON.object
[ "tag" .= JSON.String "PrestoUnhandledStatement"
, "info" .= info
]
typeExample :: ()
typeExample = const () $ toJSON (undefined :: PrestoStatement ResolvedNames Range)
instance HasTables (PrestoStatement ResolvedNames a) where
goTables (PrestoStandardSqlStatement s) = goTables s
goTables (PrestoUnhandledStatement _) = return ()
instance HasColumns (PrestoStatement ResolvedNames a) where
goColumns (PrestoStandardSqlStatement s) = goColumns s
goColumns (PrestoUnhandledStatement _) = return ()