pg-entity-0.0.4.1: A pleasant PostgreSQL layer
Copyright© Clément Delafargue 2018
Théophile Choutri 2021
LicenseMIT
Maintainertheophile@choutri.eu
Stabilitystable
Safe HaskellSafe-Inferred
LanguageHaskell2010

Database.PostgreSQL.Entity.Internal

Contents

Description

Internal helpers used to implement the high-level API and SQL combinators.

You can re-use those building blocks freely to create your own wrappers.

Synopsis

Helpers

isNotNull :: Vector Field -> Text Source #

Produce an IS NOT NULL statement given a vector of fields

>>> isNotNull [ [field| possibly_empty |] ]
"\"possibly_empty\" IS NOT NULL"
>>> isNotNull [[field| possibly_empty |], [field| that_one_too |]]
"\"possibly_empty\" IS NOT NULL AND \"that_one_too\" IS NOT NULL"

Since: 0.0.1.0

isNull :: Vector Field -> Text Source #

Produce an IS NULL statement given a vector of fields

>>> isNull [ [field| possibly_empty |] ]
"\"possibly_empty\" IS NULL"
>>> isNull [[field| possibly_empty |], [field| that_one_too |]]
"\"possibly_empty\" IS NULL AND \"that_one_too\" IS NULL"

Since: 0.0.1.0

inParens :: Text -> Text Source #

Wrap the given text between parentheses

Examples

>>> inParens "wrap me!"
"(wrap me!)"

Since: 0.0.1.0

quoteName :: Text -> Text Source #

Wrap the given text between double quotes

Examples

>>> quoteName "meow."
"\"meow.\""

Since: 0.0.1.0

literal :: Text -> Text Source #

Wrap the given text between single quotes, for literal text in an SQL query.

Examples

>>> literal "meow."
"'meow.'"

Since: 0.0.2.0

getTableName :: forall e. Entity e => Text Source #

Safe getter that quotes a table name

Examples

>>> getTableName @Author
"\"authors\""
>>> getTableName @Tags
"public.\"tags\""

Since: 0.0.1.0

getFieldName :: Field -> Text Source #

Accessor to the name of a field, with quotation.

>>> getFieldName ([field| author_id |])
"\"author_id\""

Since: 0.0.2.0

getPrimaryKey :: forall e. Entity e => Text Source #

Safe getter that quotes a table's primary key

Examples

>>> getPrimaryKey @Author
"\"author_id\""
>>> getPrimaryKey @Tags
"\"category\""

Since: 0.0.2.0

expandFields :: forall e. Entity e => Text Source #

Produce a comma-separated list of an entity's fields.

Examples

>>> expandFields @BlogPost
"\"blogpost_id\", \"author_id\", \"uuid_list\", \"title\", \"content\", \"created_at\""

Since: 0.0.1.0

expandQualifiedFields :: forall e. Entity e => Text Source #

Produce a comma-separated list of an entity's fields, qualified with the table name

Examples

>>> expandQualifiedFields @BlogPost
"blogposts.\"blogpost_id\", blogposts.\"author_id\", blogposts.\"uuid_list\", blogposts.\"title\", blogposts.\"content\", blogposts.\"created_at\""

Since: 0.0.1.0

expandQualifiedFields' :: Vector Field -> Text -> Text Source #

Produce a comma-separated list of an entity's fields, qualified with an arbitrary prefix

Examples

>>> expandQualifiedFields' (fields @BlogPost) "legacy"
"legacy.\"blogpost_id\", legacy.\"author_id\", legacy.\"uuid_list\", legacy.\"title\", legacy.\"content\", legacy.\"created_at\""

Since: 0.0.1.0

qualifyField :: forall e. Entity e => Field -> Text Source #

Take a prefix and a vector of fields, and qualifies each field with the prefix

Examples

>>> qualifyField @Author [field| name |]
"authors.\"name\""

Since: 0.0.2.0

qualifyFields :: Text -> Vector Field -> Vector Field Source #

Take a prefix and a vector of fields, and qualifies each field with the prefix

Examples

>>> qualifyFields "legacy" (fields @BlogPost)
[Field "legacy.\"blogpost_id\"" Nothing,Field "legacy.\"author_id\"" Nothing,Field "legacy.\"uuid_list\"" Nothing,Field "legacy.\"title\"" Nothing,Field "legacy.\"content\"" Nothing,Field "legacy.\"created_at\"" Nothing]

Since: 0.0.1.0

placeholder :: Field -> Text Source #

Produce a placeholder of the form "field" = ? with an optional type annotation.

Examples

>>> placeholder [field| id |]
"\"id\" = ?"
>>> placeholder $ [field| ids |]
"\"ids\" = ?"
>>> fmap placeholder $ fields @BlogPost
["\"blogpost_id\" = ?","\"author_id\" = ?","\"uuid_list\" = ?","\"title\" = ?","\"content\" = ?","\"created_at\" = ?"]

Since: 0.0.1.0

placeholder' :: forall e. Entity e => Field -> Text Source #

Produce a placeholder of the form table."field" = ? with an optional type annotation.

Examples

>>> placeholder' @BlogPost [field| id |]
"blogposts.\"id\" = ?"
>>> placeholder' @BlogPost $ [field| ids |]
"blogposts.\"ids\" = ?"

Since: 0.0.2.0

generatePlaceholders :: Vector Field -> Text Source #

Generate an appropriate number of “?” placeholders given a vector of fields.

Used to generate INSERT queries.

Examples

>>> generatePlaceholders $ fields @BlogPost
"?, ?, ?, ?, ?, ?"

Since: 0.0.1.0

textToQuery :: Text -> Query Source #

Since the Query type has an IsString instance, the process of converting from Text to String to Query is factored into this function

⚠ This may be dangerous and an unregulated usage of this function may expose to you SQL injection attacks @since 0.0.1.0

queryToText :: Query -> Text Source #

For cases where combinator composition is tricky, we can safely get back to a Text string from a Query

⚠ This may be dangerous and an unregulated usage of this function may expose to you SQL injection attacks @since 0.0.1.0

intercalateVector :: Text -> Vector Text -> Vector Text Source #

The intercalateVector function takes a Text and a Vector Text and concatenates the vector after interspersing the first argument between each element of the list.

Examples

>>> intercalateVector "~" []
[]
>>> intercalateVector "~" ["nyan"]
["nyan"]
>>> intercalateVector "~" ["nyan", "nyan", "nyan"]
["nyan","~","nyan","~","nyan"]

Since: 0.0.1.0

renderSortExpression :: (Field, SortKeyword) -> Text Source #

Examples

>>> renderSortExpression ([field| title |], ASC)
"\"title\" ASC"

Since: 0.0.2.0