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

@since 1.0.0.0
-}
module Orville.PostgreSQL.Schema.SequenceIdentifier
  ( SequenceIdentifier
  , unqualifiedNameToSequenceId
  , setSequenceIdSchema
  , sequenceIdQualifiedName
  , sequenceIdUnqualifiedName
  , sequenceIdSchemaName
  , sequenceIdToString
  , sequenceIdUnqualifiedNameString
  , sequenceIdSchemaNameString
  )
where

import qualified Orville.PostgreSQL.Expr as Expr

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

@since 1.0.0.0
-}
data SequenceIdentifier = SequenceIdentifier
  { SequenceIdentifier -> String
i_sequenceIdName :: String
  , SequenceIdentifier -> Maybe String
i_sequenceIdSchema :: Maybe String
  }
  deriving (SequenceIdentifier -> SequenceIdentifier -> Bool
(SequenceIdentifier -> SequenceIdentifier -> Bool)
-> (SequenceIdentifier -> SequenceIdentifier -> Bool)
-> Eq SequenceIdentifier
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: SequenceIdentifier -> SequenceIdentifier -> Bool
== :: SequenceIdentifier -> SequenceIdentifier -> Bool
$c/= :: SequenceIdentifier -> SequenceIdentifier -> Bool
/= :: SequenceIdentifier -> SequenceIdentifier -> Bool
Eq, Eq SequenceIdentifier
Eq SequenceIdentifier
-> (SequenceIdentifier -> SequenceIdentifier -> Ordering)
-> (SequenceIdentifier -> SequenceIdentifier -> Bool)
-> (SequenceIdentifier -> SequenceIdentifier -> Bool)
-> (SequenceIdentifier -> SequenceIdentifier -> Bool)
-> (SequenceIdentifier -> SequenceIdentifier -> Bool)
-> (SequenceIdentifier -> SequenceIdentifier -> SequenceIdentifier)
-> (SequenceIdentifier -> SequenceIdentifier -> SequenceIdentifier)
-> Ord SequenceIdentifier
SequenceIdentifier -> SequenceIdentifier -> Bool
SequenceIdentifier -> SequenceIdentifier -> Ordering
SequenceIdentifier -> SequenceIdentifier -> SequenceIdentifier
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 :: SequenceIdentifier -> SequenceIdentifier -> Ordering
compare :: SequenceIdentifier -> SequenceIdentifier -> Ordering
$c< :: SequenceIdentifier -> SequenceIdentifier -> Bool
< :: SequenceIdentifier -> SequenceIdentifier -> Bool
$c<= :: SequenceIdentifier -> SequenceIdentifier -> Bool
<= :: SequenceIdentifier -> SequenceIdentifier -> Bool
$c> :: SequenceIdentifier -> SequenceIdentifier -> Bool
> :: SequenceIdentifier -> SequenceIdentifier -> Bool
$c>= :: SequenceIdentifier -> SequenceIdentifier -> Bool
>= :: SequenceIdentifier -> SequenceIdentifier -> Bool
$cmax :: SequenceIdentifier -> SequenceIdentifier -> SequenceIdentifier
max :: SequenceIdentifier -> SequenceIdentifier -> SequenceIdentifier
$cmin :: SequenceIdentifier -> SequenceIdentifier -> SequenceIdentifier
min :: SequenceIdentifier -> SequenceIdentifier -> SequenceIdentifier
Ord, Int -> SequenceIdentifier -> ShowS
[SequenceIdentifier] -> ShowS
SequenceIdentifier -> String
(Int -> SequenceIdentifier -> ShowS)
-> (SequenceIdentifier -> String)
-> ([SequenceIdentifier] -> ShowS)
-> Show SequenceIdentifier
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> SequenceIdentifier -> ShowS
showsPrec :: Int -> SequenceIdentifier -> ShowS
$cshow :: SequenceIdentifier -> String
show :: SequenceIdentifier -> String
$cshowList :: [SequenceIdentifier] -> ShowS
showList :: [SequenceIdentifier] -> ShowS
Show)

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

@since 1.0.0.0
-}
unqualifiedNameToSequenceId :: String -> SequenceIdentifier
unqualifiedNameToSequenceId :: String -> SequenceIdentifier
unqualifiedNameToSequenceId String
name =
  SequenceIdentifier
    { i_sequenceIdName :: String
i_sequenceIdName = String
name
    , i_sequenceIdSchema :: Maybe String
i_sequenceIdSchema = Maybe String
forall a. Maybe a
Nothing
    }

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

@since 1.0.0.0
-}
setSequenceIdSchema :: String -> SequenceIdentifier -> SequenceIdentifier
setSequenceIdSchema :: String -> SequenceIdentifier -> SequenceIdentifier
setSequenceIdSchema String
schema SequenceIdentifier
sequenceId =
  SequenceIdentifier
sequenceId
    { i_sequenceIdSchema :: Maybe String
i_sequenceIdSchema = String -> Maybe String
forall a. a -> Maybe a
Just String
schema
    }

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

@since 1.0.0.0
-}
sequenceIdQualifiedName :: SequenceIdentifier -> Expr.Qualified Expr.SequenceName
sequenceIdQualifiedName :: SequenceIdentifier -> Qualified SequenceName
sequenceIdQualifiedName SequenceIdentifier
sequenceId =
  Maybe SchemaName -> SequenceName -> Qualified SequenceName
Expr.qualifySequence
    (SequenceIdentifier -> Maybe SchemaName
sequenceIdSchemaName SequenceIdentifier
sequenceId)
    (SequenceIdentifier -> SequenceName
sequenceIdUnqualifiedName SequenceIdentifier
sequenceId)

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

@since 1.0.0.0
-}
sequenceIdUnqualifiedName :: SequenceIdentifier -> Expr.SequenceName
sequenceIdUnqualifiedName :: SequenceIdentifier -> SequenceName
sequenceIdUnqualifiedName =
  String -> SequenceName
Expr.sequenceName (String -> SequenceName)
-> (SequenceIdentifier -> String)
-> SequenceIdentifier
-> SequenceName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SequenceIdentifier -> String
i_sequenceIdName

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

@since 1.0.0.0
-}
sequenceIdSchemaName :: SequenceIdentifier -> Maybe Expr.SchemaName
sequenceIdSchemaName :: SequenceIdentifier -> Maybe SchemaName
sequenceIdSchemaName =
  (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)
-> (SequenceIdentifier -> Maybe String)
-> SequenceIdentifier
-> Maybe SchemaName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SequenceIdentifier -> Maybe String
i_sequenceIdSchema

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

@since 1.0.0.0
-}
sequenceIdUnqualifiedNameString :: SequenceIdentifier -> String
sequenceIdUnqualifiedNameString :: SequenceIdentifier -> String
sequenceIdUnqualifiedNameString =
  SequenceIdentifier -> String
i_sequenceIdName

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

@since 1.0.0.0
-}
sequenceIdSchemaNameString :: SequenceIdentifier -> Maybe String
sequenceIdSchemaNameString :: SequenceIdentifier -> Maybe String
sequenceIdSchemaNameString =
  SequenceIdentifier -> Maybe String
i_sequenceIdSchema

{- |
  Converts a 'SequenceIdentifier' for 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
  'sequenceIdQualifiedName' instead for that.

@since 1.0.0.0
-}
sequenceIdToString :: SequenceIdentifier -> String
sequenceIdToString :: SequenceIdentifier -> String
sequenceIdToString SequenceIdentifier
sequenceId =
  case SequenceIdentifier -> Maybe String
i_sequenceIdSchema SequenceIdentifier
sequenceId of
    Maybe String
Nothing ->
      SequenceIdentifier -> String
i_sequenceIdName SequenceIdentifier
sequenceId
    Just String
schema ->
      String
schema String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
"." String -> ShowS
forall a. Semigroup a => a -> a -> a
<> SequenceIdentifier -> String
i_sequenceIdName SequenceIdentifier
sequenceId