{- |
Copyright : Flipstone Technology Partners 2023
License   : MIT
Stability : Stable

@since 1.0.0.0
-}
module Orville.PostgreSQL.Schema.TableIdentifier
  ( TableIdentifier
  , unqualifiedNameToTableId
  , setTableIdSchema
  , tableIdQualifiedName
  , tableIdUnqualifiedName
  , tableIdSchemaName
  , tableIdToString
  , tableIdUnqualifiedNameString
  , tableIdSchemaNameString
  )
where

import qualified Orville.PostgreSQL.Expr as Expr

{- |
  An identifier used by Orville to identify a particular table in a particular
  schema.

@since 1.0.0.0
-}
data TableIdentifier = TableIdentifier
  { TableIdentifier -> String
i_tableIdName :: String
  , TableIdentifier -> Maybe String
i_tableIdSchema :: Maybe String
  }
  deriving (TableIdentifier -> TableIdentifier -> Bool
(TableIdentifier -> TableIdentifier -> Bool)
-> (TableIdentifier -> TableIdentifier -> Bool)
-> Eq TableIdentifier
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: TableIdentifier -> TableIdentifier -> Bool
== :: TableIdentifier -> TableIdentifier -> Bool
$c/= :: TableIdentifier -> TableIdentifier -> Bool
/= :: TableIdentifier -> TableIdentifier -> Bool
Eq, Eq TableIdentifier
Eq TableIdentifier
-> (TableIdentifier -> TableIdentifier -> Ordering)
-> (TableIdentifier -> TableIdentifier -> Bool)
-> (TableIdentifier -> TableIdentifier -> Bool)
-> (TableIdentifier -> TableIdentifier -> Bool)
-> (TableIdentifier -> TableIdentifier -> Bool)
-> (TableIdentifier -> TableIdentifier -> TableIdentifier)
-> (TableIdentifier -> TableIdentifier -> TableIdentifier)
-> Ord TableIdentifier
TableIdentifier -> TableIdentifier -> Bool
TableIdentifier -> TableIdentifier -> Ordering
TableIdentifier -> TableIdentifier -> TableIdentifier
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: TableIdentifier -> TableIdentifier -> Ordering
compare :: TableIdentifier -> TableIdentifier -> Ordering
$c< :: TableIdentifier -> TableIdentifier -> Bool
< :: TableIdentifier -> TableIdentifier -> Bool
$c<= :: TableIdentifier -> TableIdentifier -> Bool
<= :: TableIdentifier -> TableIdentifier -> Bool
$c> :: TableIdentifier -> TableIdentifier -> Bool
> :: TableIdentifier -> TableIdentifier -> Bool
$c>= :: TableIdentifier -> TableIdentifier -> Bool
>= :: TableIdentifier -> TableIdentifier -> Bool
$cmax :: TableIdentifier -> TableIdentifier -> TableIdentifier
max :: TableIdentifier -> TableIdentifier -> TableIdentifier
$cmin :: TableIdentifier -> TableIdentifier -> TableIdentifier
min :: TableIdentifier -> TableIdentifier -> TableIdentifier
Ord, Int -> TableIdentifier -> ShowS
[TableIdentifier] -> ShowS
TableIdentifier -> String
(Int -> TableIdentifier -> ShowS)
-> (TableIdentifier -> String)
-> ([TableIdentifier] -> ShowS)
-> Show TableIdentifier
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> TableIdentifier -> ShowS
showsPrec :: Int -> TableIdentifier -> ShowS
$cshow :: TableIdentifier -> String
show :: TableIdentifier -> String
$cshowList :: [TableIdentifier] -> ShowS
showList :: [TableIdentifier] -> ShowS
Show)

{- |
  Constructs a 'TableIdentifier' where the table's name will not be qualified
  by a particular schema.

@since 1.0.0.0
-}
unqualifiedNameToTableId :: String -> TableIdentifier
unqualifiedNameToTableId :: String -> TableIdentifier
unqualifiedNameToTableId String
name =
  TableIdentifier
    { i_tableIdName :: String
i_tableIdName = String
name
    , i_tableIdSchema :: Maybe String
i_tableIdSchema = Maybe String
forall a. Maybe a
Nothing
    }

{- |
  Sets the schema of the 'TableIdentifier'. Wherever applicable, references to
  the table will be qualified by the given schema name.

@since 1.0.0.0
-}
setTableIdSchema :: String -> TableIdentifier -> TableIdentifier
setTableIdSchema :: String -> TableIdentifier -> TableIdentifier
setTableIdSchema String
schema TableIdentifier
tableId =
  TableIdentifier
tableId
    { i_tableIdSchema :: Maybe String
i_tableIdSchema = String -> Maybe String
forall a. a -> Maybe a
Just String
schema
    }

{- |
  Returns the 'Expr.Qualified Expr.TableName' that should be used to refer to
  the table in SQL queries.

@since 1.0.0.0
-}
tableIdQualifiedName :: TableIdentifier -> Expr.Qualified Expr.TableName
tableIdQualifiedName :: TableIdentifier -> Qualified TableName
tableIdQualifiedName TableIdentifier
tableId =
  Maybe SchemaName -> TableName -> Qualified TableName
Expr.qualifyTable
    (TableIdentifier -> Maybe SchemaName
tableIdSchemaName TableIdentifier
tableId)
    (TableIdentifier -> TableName
tableIdUnqualifiedName TableIdentifier
tableId)

{- |
  Returns the unqualified 'Expr.TableName' that should be used to refer to the
  table in SQL queries where an unqualified reference is appropriate.

@since 1.0.0.0
-}
tableIdUnqualifiedName :: TableIdentifier -> Expr.TableName
tableIdUnqualifiedName :: TableIdentifier -> TableName
tableIdUnqualifiedName =
  String -> TableName
Expr.tableName (String -> TableName)
-> (TableIdentifier -> String) -> TableIdentifier -> TableName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TableIdentifier -> String
i_tableIdName

{- |
  Returns the 'Expr.SchemaName' (if any) that should be used to qualify
  references to the table in SQL queries.

@since 1.0.0.0
-}
tableIdSchemaName :: TableIdentifier -> Maybe Expr.SchemaName
tableIdSchemaName :: TableIdentifier -> Maybe SchemaName
tableIdSchemaName =
  (String -> SchemaName) -> Maybe String -> Maybe SchemaName
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap String -> SchemaName
Expr.schemaName (Maybe String -> Maybe SchemaName)
-> (TableIdentifier -> Maybe String)
-> TableIdentifier
-> Maybe SchemaName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TableIdentifier -> Maybe String
i_tableIdSchema

{- |
  Retrieves the unqualified name of the table as a 'String'.

@since 1.0.0.0
-}
tableIdUnqualifiedNameString :: TableIdentifier -> String
tableIdUnqualifiedNameString :: TableIdentifier -> String
tableIdUnqualifiedNameString =
  TableIdentifier -> String
i_tableIdName

{- |
  Retrieves the schema name of the table as a 'String'.

@since 1.0.0.0
-}
tableIdSchemaNameString :: TableIdentifier -> Maybe String
tableIdSchemaNameString :: TableIdentifier -> Maybe String
tableIdSchemaNameString =
  TableIdentifier -> Maybe String
i_tableIdSchema

{- |
  Converts a 'TableIdentifier' to a 'String' for descriptive purposes. The
  name will be qualified if a schema name has been set for the identifier.

  Note: You should not use this function for building SQL expressions. Use
  'tableIdQualifiedName' instead for that.

@since 1.0.0.0
-}
tableIdToString :: TableIdentifier -> String
tableIdToString :: TableIdentifier -> String
tableIdToString TableIdentifier
tableId =
  case TableIdentifier -> Maybe String
i_tableIdSchema TableIdentifier
tableId of
    Maybe String
Nothing ->
      TableIdentifier -> String
i_tableIdName TableIdentifier
tableId
    Just String
schema ->
      String
schema String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
"." String -> ShowS
forall a. Semigroup a => a -> a -> a
<> TableIdentifier -> String
i_tableIdName TableIdentifier
tableId