-- 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
(Int -> SqlTable -> ShowS)
-> (SqlTable -> String) -> ([SqlTable] -> ShowS) -> Show SqlTable
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> SqlTable -> ShowS
showsPrec :: Int -> SqlTable -> ShowS
$cshow :: SqlTable -> String
show :: SqlTable -> String
$cshowList :: [SqlTable] -> ShowS
showList :: [SqlTable] -> ShowS
Show

newtype SqlColumn = SqlColumn String deriving Int -> SqlColumn -> ShowS
[SqlColumn] -> ShowS
SqlColumn -> String
(Int -> SqlColumn -> ShowS)
-> (SqlColumn -> String)
-> ([SqlColumn] -> ShowS)
-> Show SqlColumn
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> SqlColumn -> ShowS
showsPrec :: Int -> SqlColumn -> ShowS
$cshow :: SqlColumn -> String
show :: SqlColumn -> String
$cshowList :: [SqlColumn] -> ShowS
showList :: [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
(Int -> SqlOrderNulls -> ShowS)
-> (SqlOrderNulls -> String)
-> ([SqlOrderNulls] -> ShowS)
-> Show SqlOrderNulls
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> SqlOrderNulls -> ShowS
showsPrec :: Int -> SqlOrderNulls -> ShowS
$cshow :: SqlOrderNulls -> String
show :: SqlOrderNulls -> String
$cshowList :: [SqlOrderNulls] -> ShowS
showList :: [SqlOrderNulls] -> ShowS
Show

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

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

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

data SqlDistinct = SqlDistinct | SqlNotDistinct
                 deriving Int -> SqlDistinct -> ShowS
[SqlDistinct] -> ShowS
SqlDistinct -> String
(Int -> SqlDistinct -> ShowS)
-> (SqlDistinct -> String)
-> ([SqlDistinct] -> ShowS)
-> Show SqlDistinct
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> SqlDistinct -> ShowS
showsPrec :: Int -> SqlDistinct -> ShowS
$cshow :: SqlDistinct -> String
show :: SqlDistinct -> String
$cshowList :: [SqlDistinct] -> ShowS
showList :: [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 [(SqlExpr, SqlOrder)] (Maybe SqlExpr) -- ^ 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
(Int -> SqlExpr -> ShowS)
-> (SqlExpr -> String) -> ([SqlExpr] -> ShowS) -> Show SqlExpr
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> SqlExpr -> ShowS
showsPrec :: Int -> SqlExpr -> ShowS
$cshow :: SqlExpr -> String
show :: SqlExpr -> String
$cshowList :: [SqlExpr] -> ShowS
showList :: [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]

{-# DEPRECATED DoNothing "Use 'doNothing' instead.  @DoNothing@ will be removed in version 0.11" #-}
-- It won't be removed, it will just be made internal
data OnConflict = DoNothing
                -- ^ @ON CONFLICT DO NOTHING@

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