packages feed

postgresql-syntax-0.5.0.0: library-internal/PostgresqlSyntax/Ast/TablesampleClause.hs

module PostgresqlSyntax.Ast.TablesampleClause where

import qualified HeadedMegaparsec as Parser
import {-# SOURCE #-} PostgresqlSyntax.Ast.AExpr (AExpr)
import PostgresqlSyntax.Ast.ExprList
import PostgresqlSyntax.Ast.FuncName
import qualified PostgresqlSyntax.Helpers.Gens as Gens
import qualified PostgresqlSyntax.Helpers.Parsers as Parsers
import qualified PostgresqlSyntax.Helpers.TextBuilders as TextBuilders
import PostgresqlSyntax.IsAst
import PostgresqlSyntax.Prelude
import qualified Test.QuickCheck as Qc

-- |
-- ==== References
-- @
-- tablesample_clause:
--   | TABLESAMPLE func_name '(' expr_list ')' opt_repeatable_clause
-- @
--
-- @opt_repeatable_clause@ is a bare alias to 'PostgresqlSyntax.Ast.AExpr'.
data TablesampleClause = TablesampleClause FuncName ExprList (Maybe AExpr)
  deriving (Show, Generic, Eq, Ord, Data)

instance IsAst TablesampleClause where
  toTextBuilder settings (TablesampleClause a b c) =
    "TABLESAMPLE " <> toTextBuilder settings a <> " (" <> toTextBuilder settings b <> ")" <> TextBuilders.suffixMaybe repeatableClause c
    where
      repeatableClause a' = "REPEATABLE (" <> toTextBuilder settings a' <> ")"
  parser settings = do
    Parsers.keyword "tablesample"
    Parsers.space1
    Parser.endHead
    a <- parser settings
    Parsers.space
    b <- Parsers.inParens (parser settings)
    c <- optional (Parsers.space *> repeatableClause)
    return (TablesampleClause a b c)
    where
      repeatableClause = do
        Parsers.keyword "repeatable"
        Parsers.space
        Parsers.inParens (Parser.endHead *> parser settings)

instance Qc.Arbitrary TablesampleClause where
  shrink = Qc.genericShrink
  arbitrary = TablesampleClause <$> arbitrary <*> arbitrary <*> Gens.terminatingMaybe (Gens.downscale arbitrary)