packages feed

sqel-0.0.1.0: lib/Sqel/Sql/Type.hs

module Sqel.Sql.Type where

import qualified Exon

import qualified Sqel.Data.PgType as PgTable
import Sqel.Data.PgType (
  ColumnType (ColumnComp, ColumnPrim),
  PgColumn (PgColumn),
  PgColumnName (PgColumnName),
  PgColumns (PgColumns),
  PgComposite (PgComposite),
  PgPrimName (PgPrimName),
  PgTable (PgTable),
  PgTypeRef (PgTypeRef),
  )
import Sqel.Data.PgTypeName (PgTableName)
import Sqel.Data.Sql (Sql, sql)
import Sqel.Data.SqlFragment (CommaSep (CommaSep))
import Sqel.Text.Quote (dquote)

-- TODO why is unique not used?
columnSpec ::
  PgColumn ->
  Sql
columnSpec = \case
  PgColumn (PgColumnName name) (ColumnPrim (PgPrimName tpe) _ (Exon.intercalate " " -> params)) ->
    [sql|##{dquote name} ##{tpe} #{params}|]
  PgColumn (PgColumnName name) (ColumnComp (PgTypeRef tpe) _ (Exon.intercalate " " -> params)) ->
    [sql|##{dquote name} ##{tpe} #{params}|]

typeColumnSpec ::
  PgColumn ->
  Sql
typeColumnSpec = \case
  PgColumn (PgColumnName name) (ColumnPrim (PgPrimName tpe) _ _) ->
    [sql|##{dquote name} ##{tpe}|]
  PgColumn (PgColumnName name) (ColumnComp (PgTypeRef tpe) _ _) ->
    [sql|##{dquote name} ##{tpe}|]

createTable ::
  PgTable a ->
  Sql
createTable PgTable {name, columns = PgColumns cols} =
  [sql|create table ##{name} (##{CommaSep formattedColumns})|]
  where
    formattedColumns = toList (columnSpec <$> cols)

dropTable ::
  PgTableName ->
  Sql
dropTable name =
   [sql|drop table if exists ##{name}|]

-- TODO make PgTypeRef et al quote automatically by using @ToSegment@
createProdType ::
  PgComposite ->
  Sql
createProdType (PgComposite name (PgColumns cols)) =
  [sql|create type ##{name} as (##{CommaSep formattedColumns})|]
  where
    formattedColumns = toList (typeColumnSpec <$> cols)