-- Copyright   :  Daan Leijen (c) 1999, daan@cs.uu.nl
--                HWT Group (c) 2003, haskelldb-users@lists.sourceforge.net
-- License     :  BSD-style

module Opaleye.Internal.HaskellDB.Sql where


import qualified Data.List.NonEmpty as NEL

-----------------------------------------------------------
-- * SQL data type
-----------------------------------------------------------

data SqlTable = SqlTable
  { SqlTable -> Maybe String
sqlTableSchemaName :: Maybe String
  , SqlTable -> String
sqlTableName       :: String
  } deriving Int -> SqlTable -> ShowS
[SqlTable] -> ShowS
SqlTable -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SqlTable] -> ShowS
$cshowList :: [SqlTable] -> ShowS
show :: SqlTable -> String
$cshow :: SqlTable -> String
showsPrec :: Int -> SqlTable -> ShowS
$cshowsPrec :: Int -> SqlTable -> ShowS
Show

newtype SqlColumn = SqlColumn String deriving Int -> SqlColumn -> ShowS
[SqlColumn] -> ShowS
SqlColumn -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SqlColumn] -> ShowS
$cshowList :: [SqlColumn] -> ShowS
show :: SqlColumn -> String
$cshow :: SqlColumn -> String
showsPrec :: Int -> SqlColumn -> ShowS
$cshowsPrec :: Int -> SqlColumn -> ShowS
Show

-- | A valid SQL name for a parameter.
type SqlName = String

data SqlOrderNulls = SqlNullsFirst | SqlNullsLast
                   deriving Int -> SqlOrderNulls -> ShowS
[SqlOrderNulls] -> ShowS
SqlOrderNulls -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SqlOrderNulls] -> ShowS
$cshowList :: [SqlOrderNulls] -> ShowS
show :: SqlOrderNulls -> String
$cshow :: SqlOrderNulls -> String
showsPrec :: Int -> SqlOrderNulls -> ShowS
$cshowsPrec :: Int -> SqlOrderNulls -> ShowS
Show

data SqlOrderDirection = SqlAsc | SqlDesc
                       deriving Int -> SqlOrderDirection -> ShowS
[SqlOrderDirection] -> ShowS
SqlOrderDirection -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SqlOrderDirection] -> ShowS
$cshowList :: [SqlOrderDirection] -> ShowS
show :: SqlOrderDirection -> String
$cshow :: SqlOrderDirection -> String
showsPrec :: Int -> SqlOrderDirection -> ShowS
$cshowsPrec :: Int -> SqlOrderDirection -> ShowS
Show

data SqlOrder = SqlOrder { SqlOrder -> SqlOrderDirection
sqlOrderDirection :: SqlOrderDirection
                         , SqlOrder -> SqlOrderNulls
sqlOrderNulls     :: SqlOrderNulls }
  deriving Int -> SqlOrder -> ShowS
[SqlOrder] -> ShowS
SqlOrder -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SqlOrder] -> ShowS
$cshowList :: [SqlOrder] -> ShowS
show :: SqlOrder -> String
$cshow :: SqlOrder -> String
showsPrec :: Int -> SqlOrder -> ShowS
$cshowsPrec :: Int -> SqlOrder -> ShowS
Show


data SqlPartition = SqlPartition
  { SqlPartition -> Maybe (NonEmpty SqlExpr)
sqlPartitionBy :: Maybe (NEL.NonEmpty SqlExpr)
  , SqlPartition -> Maybe (NonEmpty (SqlExpr, SqlOrder))
sqlOrderBy :: Maybe (NEL.NonEmpty (SqlExpr, SqlOrder))
  }
  deriving Int -> SqlPartition -> ShowS
[SqlPartition] -> ShowS
SqlPartition -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SqlPartition] -> ShowS
$cshowList :: [SqlPartition] -> ShowS
show :: SqlPartition -> String
$cshow :: SqlPartition -> String
showsPrec :: Int -> SqlPartition -> ShowS
$cshowsPrec :: Int -> SqlPartition -> ShowS
Show

data SqlRangeBound = Inclusive SqlExpr | Exclusive SqlExpr | PosInfinity | NegInfinity
                   deriving Int -> SqlRangeBound -> ShowS
[SqlRangeBound] -> ShowS
SqlRangeBound -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SqlRangeBound] -> ShowS
$cshowList :: [SqlRangeBound] -> ShowS
show :: SqlRangeBound -> String
$cshow :: SqlRangeBound -> String
showsPrec :: Int -> SqlRangeBound -> ShowS
$cshowsPrec :: Int -> SqlRangeBound -> ShowS
Show

data SqlDistinct = SqlDistinct | SqlNotDistinct
                 deriving Int -> SqlDistinct -> ShowS
[SqlDistinct] -> ShowS
SqlDistinct -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SqlDistinct] -> ShowS
$cshowList :: [SqlDistinct] -> ShowS
show :: SqlDistinct -> String
$cshow :: SqlDistinct -> String
showsPrec :: Int -> SqlDistinct -> ShowS
$cshowsPrec :: Int -> SqlDistinct -> ShowS
Show

-- | Expressions in SQL statements.
data SqlExpr = ColumnSqlExpr  SqlColumn
             | CompositeSqlExpr SqlExpr String
             | BinSqlExpr     String SqlExpr SqlExpr
             | SubscriptSqlExpr SqlExpr SqlExpr
             | PrefixSqlExpr  String SqlExpr
             | PostfixSqlExpr String SqlExpr
             | FunSqlExpr     String [SqlExpr]
             | AggrFunSqlExpr String [SqlExpr] [(SqlExpr, SqlOrder)] SqlDistinct -- ^ Aggregate functions separate from normal functions.
             | WndwFunSqlExpr String [SqlExpr] SqlPartition
             | ConstSqlExpr   String
             | CaseSqlExpr    (NEL.NonEmpty (SqlExpr,SqlExpr)) SqlExpr
             | ListSqlExpr    (NEL.NonEmpty SqlExpr)
             | ParamSqlExpr (Maybe SqlName) SqlExpr
             | PlaceHolderSqlExpr
             | ParensSqlExpr SqlExpr
             | CastSqlExpr String SqlExpr
             | DefaultSqlExpr
             | ArraySqlExpr [SqlExpr]
             | RangeSqlExpr String SqlRangeBound SqlRangeBound
  deriving Int -> SqlExpr -> ShowS
[SqlExpr] -> ShowS
SqlExpr -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SqlExpr] -> ShowS
$cshowList :: [SqlExpr] -> ShowS
show :: SqlExpr -> String
$cshow :: SqlExpr -> String
showsPrec :: Int -> SqlExpr -> ShowS
$cshowsPrec :: Int -> SqlExpr -> ShowS
Show

-- | Data type for SQL UPDATE statements.
data SqlUpdate  = SqlUpdate SqlTable [(SqlColumn,SqlExpr)] [SqlExpr]

-- | Data type for SQL DELETE statements.
data SqlDelete  = SqlDelete SqlTable [SqlExpr]

data OnConflict = DoNothing
                -- ^ @ON CONFLICT DO NOTHING@

--- | Data type for SQL INSERT statements.
data SqlInsert  = SqlInsert SqlTable [SqlColumn] (NEL.NonEmpty [SqlExpr]) (Maybe OnConflict)