sql-fragment-0.0.1.0: SQL query combinator

Safe HaskellNone
LanguageHaskell2010

Database.SQLFragment.SQLFragment

Contents

Synopsis

Types

data SQLFragment e p

Represents a bit of an SQL Query. Could be equivalent to

"name FROM user"
"FROM user WHERE name = Smith
"GROUP BY name ORDER BY name"

Fragments can be combined to form a full query. However, the type of the query "SELECT", "INSERT" is not carried by the fragment but decided when generating the query. Fragments also carry some phantom types which are used to type the query results and its parameters if any. Phantom types allow type safe query composition even though SQLFragment is designed to not be "on the way", and so can be retyped easily.

Fragments can be left untyped by simply using "SQLFragment '[] '[]"

SQLFragment can be constructing from a string using the OverloadedStrings extension.

Accepted format are :

column

table.column

table [AS] alias.column

table.

table [AS] alis.

database.table.column

>>> :set -XOverloadedStrings
>>> toSelectQuery "a"
"SELECT a"
>>> toSelectQuery "t.a"
"SELECT t.a\nFROM t"
>>> toSelectQuery "t as t2."
"FROM t as t2"
>>> toSelectQuery "db.t as t2.a"
"SELECT t2.a\nFROM db.t as t2"

Constructors

SQLFragment 

Fields

clauses :: Map Section [String]
 

Instances

Eq (SQLFragment e p) 
Fractionals a => Fractional (SQLFragment a ([] *)) 
Nums a => Num (SQLFragment a ([] *)) 
Show (SQLFragment e p) 
IsString (SQLFragment e p) 
Monoid (SQLFragment ([] *) ([] *)) 
Fractional a => Dequantify (SQLFragment ((:) * a ([] *)) p) (Unit d a) (SQLFragment ((:) * (Quantity d a) ([] *)) p) 
Fractional a => Dequantify (SQLFragment ((:) * (Tagged * l a) ([] *)) p) (Unit d a) (SQLFragment ((:) * (Tagged * l (Quantity d a)) ([] *)) p) 
Num a => Quantify (SQLFragment ((:) * a ([] *)) p) (Unit d a) (SQLFragment ((:) * (Quantity d a) ([] *)) p) 
Num a => Quantify (SQLFragment ((:) * (Tagged * l a) ([] *)) p) (Unit d a) (SQLFragment ((:) * (Tagged * l (Quantity d a)) ([] *)) p) 
(Num n, Mul a b c) => Divisible (SQLFragment ((:) * (Tagged * l (Dimensional v a n)) ([] *)) ([] *)) (SQLFragment ((:) * (Tagged * l' (Dimensional v b n)) ([] *)) ([] *)) (SQLFragment ((:) * (Tagged * l (Dimensional v c n)) ([] *)) ([] *)) 
(Num n, Div a b c) => Divisible (SQLFragment ((:) * (Dimensional v a n) ([] *)) ([] *)) (SQLFragment ((:) * (Dimensional v b n) ([] *)) ([] *)) (SQLFragment ((:) * (Dimensional v c n) ([] *)) ([] *)) 
(Num n, Mul a b c) => Multipliable (SQLFragment ((:) * (Tagged * l (Dimensional v a n)) ([] *)) ([] *)) (SQLFragment ((:) * (Tagged * l' (Dimensional v b n)) ([] *)) ([] *)) (SQLFragment ((:) * (Tagged * l (Dimensional v c n)) ([] *)) ([] *)) 
(Num n, Mul a b c) => Multipliable (SQLFragment ((:) * (Dimensional v a n) ([] *)) ([] *)) (SQLFragment ((:) * (Dimensional v b n) ([] *)) ([] *)) (SQLFragment ((:) * (Dimensional v c n) ([] *)) ([] *)) 
Num n => Addable (SQLFragment ((:) * (Tagged * l (Dimensional v a n)) ([] *)) ([] *)) (SQLFragment ((:) * (Tagged * l' (Dimensional v a n)) ([] *)) ([] *)) (SQLFragment ((:) * (Tagged * l (Dimensional v a n)) ([] *)) ([] *)) 
Num n => Addable (SQLFragment ((:) * (Dimensional v a n) ([] *)) ([] *)) (SQLFragment ((:) * (Dimensional v a n) ([] *)) ([] *)) (SQLFragment ((:) * (Dimensional v a n) ([] *)) ([] *)) 

Query Generations

toInsertQuery :: SQLFragment e p -> String

Insert using VALUES and ?

>>> toInsertQuery' $ "t.a"
"INSERT INTO t (t.a) VALUES (?)"

Types Manipulation

The following functions change the type signature of a fragment. Combined with OverloadedStrings, they can be used to create a fragment from a string.

forgetTypes :: SQLFragment e p -> SQLFragment e' p'

Forget the phantom types to whatever is needed.

>>> :set -XDataKinds
>>> let a = "a" :: SQLFragment '[] '[]
>>> let b = forgetTypes a :: SQLFragment '[String] '[]

nullable :: SQLFragment e p -> SQLFragment (Nullable e) (Nullable p)

Change types to Maybe version if needed

Joins

data JoinType

Type of Join. At the moment only left and inner join are supported.

Constructors

LEFT 
RIGHT 
INNER 
OUTER 

data Join

Join between 2 tables.

Instances

innerJoin :: Boolables a => SQLFragment a ([] *) -> Join

leftJoin :: Boolables a => SQLFragment a ([] *) -> Join

rightJoin :: Boolables a => SQLFragment a ([] *) -> Join

outerJoin :: Boolables a => SQLFragment a ([] *) -> Join

open :: Join -> Join

Miscellaneous

qualify :: String -> String -> String

>>> qualify "table" "column"
"table.column"

aliasWithPrefix

Arguments

:: String

Alias suffix

-> String

aliased

-> String 

Alias a string with a prefix

>>> aliasWithPrefix "2" "table"
"table table2"

from :: String -> SQLFragment [] []