Portability | non portable |
---|---|
Stability | experimental |
Maintainer | [email protected] |
Database.HaskellDB.Query
Description
Basic combinators for building type-safe queries.
The Query monad constructs a relational expression
(PrimQuery
).
- data Rel r = Rel Alias Scheme
- data Attr f a = Attr Attribute
- data Table r = Table TableName Assoc
- data Query a
- newtype Expr a = Expr PrimExpr
- data OrderExpr
- class ToPrimExprs r
- class ConstantRecord r cr | r -> cr where
- constantRecord :: r -> cr
- class ShowConstant a
- class ExprC e
- class ExprC e => ProjectExpr e
- class ProjectRec r er | r -> er
- class InsertRec r er | r -> er
- newtype ExprAggr a = ExprAggr PrimExpr
- newtype ExprDefault a = ExprDefault PrimExpr
- copy :: HasField f r => Attr f a -> Rel r -> Record (RecCons f (Expr a) RecNil)
- copyAll :: RelToRec r => Rel r -> Record r
- class RelToRec a
- (.==.) :: Eq a => Expr a -> Expr a -> Expr Bool
- (.<>.) :: Eq a => Expr a -> Expr a -> Expr Bool
- (.<.) :: Ord a => Expr a -> Expr a -> Expr Bool
- (.<=.) :: Ord a => Expr a -> Expr a -> Expr Bool
- (.>.) :: Ord a => Expr a -> Expr a -> Expr Bool
- (.>=.) :: Ord a => Expr a -> Expr a -> Expr Bool
- (.&&.) :: Expr Bool -> Expr Bool -> Expr Bool
- (.||.) :: Expr Bool -> Expr Bool -> Expr Bool
- (.*.) :: Num a => Expr a -> Expr a -> Expr a
- (./.) :: Num a => Expr a -> Expr a -> Expr a
- (.+.) :: Num a => Expr a -> Expr a -> Expr a
- (.-.) :: Num a => Expr a -> Expr a -> Expr a
- (.%.) :: Num a => Expr a -> Expr a -> Expr a
- (.++.) :: Expr String -> Expr String -> Expr String
- (<<) :: Attr f a -> e a -> Record (RecCons f (e a) RecNil)
- (<<-) :: ShowConstant a => Attr f a -> a -> Record (RecCons f (Expr a) RecNil)
- project :: (ShowLabels r, ToPrimExprs r, ProjectRec r er) => Record r -> Query (Rel er)
- restrict :: Expr Bool -> Query ()
- table :: ShowRecRow r => Table r -> Query (Rel r)
- unique :: Query ()
- union :: Query (Rel r) -> Query (Rel r) -> Query (Rel r)
- intersect :: Query (Rel r) -> Query (Rel r) -> Query (Rel r)
- divide :: Query (Rel r) -> Query (Rel r) -> Query (Rel r)
- minus :: Query (Rel r) -> Query (Rel r) -> Query (Rel r)
- _not :: Expr Bool -> Expr Bool
- like :: Expr String -> Expr String -> Expr Bool
- _in :: Eq a => Expr a -> [Expr a] -> Expr Bool
- cat :: Expr String -> Expr String -> Expr String
- _length :: Expr String -> Expr Int
- isNull :: Expr a -> Expr Bool
- notNull :: Expr a -> Expr Bool
- fromNull :: Expr a -> Expr (Maybe a) -> Expr a
- fromVal :: ShowConstant a => a -> Expr (Maybe a) -> Expr a
- constant :: ShowConstant a => a -> Expr a
- constVal :: ShowConstant a => a -> Expr (Maybe a)
- constNull :: Expr (Maybe a)
- constExpr :: Expr a -> Expr (Maybe a)
- param :: Expr a -> Expr a
- namedParam :: Name -> Expr a -> Expr a
- class Args a
- func :: Args a => String -> a
- cast :: String -> Expr a -> Expr b
- toStr :: BStrToStr s d => s -> d
- coerce :: Expr a -> Expr b
- select :: HasField f r => Attr f a -> Rel r -> Expr a
- count :: Expr a -> ExprAggr Int
- _sum :: Num a => Expr a -> ExprAggr a
- _max :: Ord a => Expr a -> ExprAggr a
- _min :: Ord a => Expr a -> ExprAggr a
- avg :: Num a => Expr a -> ExprAggr a
- literal :: String -> Expr a
- stddev :: Num a => Expr a -> ExprAggr a
- stddevP :: Num a => Expr a -> ExprAggr a
- variance :: Num a => Expr a -> ExprAggr a
- varianceP :: Num a => Expr a -> ExprAggr a
- asc :: HasField f r => Rel r -> Attr f a -> OrderExpr
- desc :: HasField f r => Rel r -> Attr f a -> OrderExpr
- order :: [OrderExpr] -> Query ()
- top :: Int -> Query ()
- _case :: [(Expr Bool, Expr a)] -> Expr a -> Expr a
- _default :: ExprDefault a
- runQuery :: Query (Rel r) -> PrimQuery
- runQueryRel :: Query (Rel r) -> (PrimQuery, Rel r)
- unQuery :: Query a -> a
- subQuery :: Query (Rel r) -> Query (Rel r)
- attribute :: String -> Expr a
- attributeName :: Attr f a -> Attribute
- tableName :: Table t -> TableName
- baseTable :: (ShowLabels r, ToPrimExprs r) => TableName -> Record r -> Table r
- emptyTable :: TableName -> Table (Record RecNil)
- exprs :: ToPrimExprs r => Record r -> [PrimExpr]
- labels :: ShowLabels r => r -> [String]
- tableRec :: Table (Record r) -> Record r
Data and class declarations
Type of relations, contains the attributes
of the relation and an Alias
to which the
attributes are renamed in the PrimQuery
.
Instances
Show (Query (Rel r)) | Shows the optimized SQL for the query. |
ExprTypes r => ExprTypes (Rel r) | |
ExprType a => ExprType (Rel a) | |
HasField f r => Select (Attr f a) (Rel r) (Expr a) | Field selection operator. It is overloaded to work for both
relations in a query and the result of a query.
That is, it corresponds to both |
Typed attributes
Instances
HasField f r => Select (Attr f a) (Rel r) (Expr a) | Field selection operator. It is overloaded to work for both
relations in a query and the result of a query.
That is, it corresponds to both |
Basic tables, contains table name and an association from attributes to attribute names in the real table.
Type of normal expressions, contains the untyped PrimExpr.
Instances
ProjectExpr Expr | |
InsertExpr Expr | |
ExprC Expr | |
Read (Expr a) | |
Show (Expr a) | |
IsExpr (Expr a) | |
Args (Expr a) | |
ExprType a => ExprType (Expr a) | |
BStrToStr (Expr String) (Expr String) | |
BStrToStr (Expr (Maybe String)) (Expr (Maybe String)) | |
Size n => BStrToStr (Expr (Maybe (BoundedString n))) (Expr (Maybe String)) | |
Size n => BStrToStr (Expr (BoundedString n)) (Expr String) | |
IsExpr tail => IsExpr (Expr a -> tail) | |
Args (Expr a -> ExprAggr c) | |
(IsExpr tail, Args tail) => Args (Expr a -> tail) | |
HasField f r => Select (Attr f a) (Rel r) (Expr a) | Field selection operator. It is overloaded to work for both
relations in a query and the result of a query.
That is, it corresponds to both |
(RelToRec rest, FieldTag f) => RelToRec (RecCons f (Expr a) rest) | |
(ShowConstant a, ConstantRecord r cr) => ConstantRecord (RecCons f a r) (RecCons f (Expr a) cr) | |
(ProjectExpr e, ProjectRec r er) => ProjectRec (RecCons f (e a) r) (RecCons f (Expr a) er) | |
(InsertExpr e, InsertRec r er) => InsertRec (RecCons f (e a) r) (RecCons f (Expr a) er) | |
(GetValue a, GetRec er vr) => GetRec (RecCons f (Expr a) er) (RecCons f a vr) |
class ToPrimExprs r Source
Instances
ToPrimExprs RecNil | |
(ExprC e, ToPrimExprs r) => ToPrimExprs (RecCons l (e a) r) |
class ConstantRecord r cr | r -> cr whereSource
Converts records w/o Expr (usually from database queries) to records with Expr types.
Methods
constantRecord :: r -> crSource
Instances
ConstantRecord RecNil RecNil | |
ConstantRecord r cr => ConstantRecord (Record r) (Record cr) | |
(ShowConstant a, ConstantRecord r cr) => ConstantRecord (RecCons f a r) (RecCons f (Expr a) cr) |
class ShowConstant a Source
Instances
class ProjectRec r er | r -> erSource
Class of records that can be used with project
.
All all the values must be instances of ProjectExpr
for the
record to be an instance of ProjectRec
.
Instances
ProjectRec RecNil RecNil | |
(ProjectExpr e, ProjectRec r er) => ProjectRec (RecCons f (e a) r) (RecCons f (Expr a) er) |
class InsertRec r er | r -> erSource
Class of records that can be used with insert
.
All all the values must be instances of InsertExpr
for the
record to be an instance of InsertRec
.
Type of aggregate expressions.
newtype ExprDefault a Source
The type of default expressions.
Constructors
ExprDefault PrimExpr |
Instances
InsertExpr ExprDefault | |
ExprC ExprDefault | |
Read (ExprDefault a) | |
Show (ExprDefault a) |
copy :: HasField f r => Attr f a -> Rel r -> Record (RecCons f (Expr a) RecNil)Source
Creates a single-field record from an attribute and a table. Useful
for building projections that will re-use the same attribute name. copy attr tbl
is
equivalent to:
attr .=. (tbl .!. attr)
copyAll :: RelToRec r => Rel r -> Record rSource
Copies all columns in the relation given. Useful for appending the remaining columns in a table to a projection. For example:
query = do tbl <- table some_table project $ copyAll tbl
will add all columns in some_table to the query.
Helper class which gives a polymorphic copy function that can turn a Rel into a Record.
Operators
Creates a record field.
Similar to '(.=.)', but gets the field label from an Attr
.
Arguments
:: ShowConstant a | |
=> Attr f a | Field label |
-> a | Field value |
-> Record (RecCons f (Expr a) RecNil) | New record |
Convenience operator for constructing records of constants.
Useful primarily with insert
.
f <<- x
is the same as f << constant x
Function declarations
project :: (ShowLabels r, ToPrimExprs r, ProjectRec r er) => Record r -> Query (Rel er)Source
Specifies a subset of the columns in the table.
restrict :: Expr Bool -> Query ()Source
Restricts the records to only those who evaluates the expression to True.
Restricts the relation given to only return unique records. Upshot
is all projected attributes will be grouped
.
union :: Query (Rel r) -> Query (Rel r) -> Query (Rel r)Source
Return all records which are present in at least one of the relations.
intersect :: Query (Rel r) -> Query (Rel r) -> Query (Rel r)Source
Return all records which are present in both relations.
minus :: Query (Rel r) -> Query (Rel r) -> Query (Rel r)Source
Return all records from the first relation that are not present in the second relation.
like :: Expr String -> Expr String -> Expr BoolSource
The HaskellDB counterpart to the SQL LIKE keyword. In the expresions, % is a wildcard representing any characters in the same position relavtive to the given characters and _ is a wildcard representing one character e.g.
like (constant "ABCDEFFF") (constant "AB%F_F")
is true while
like (constant "ABCDEF") (constant "AC%F")
is false.
Note that SQL92 does not specify whether LIKE is case-sensitive or not. Different database systems implement this differently.
_in :: Eq a => Expr a -> [Expr a] -> Expr BoolSource
Returns true if the value of the first operand is equal to the value of any of the expressions in the list operand.
cat :: Expr String -> Expr String -> Expr StringSource
Produces the concatenation of two String-expressions.
notNull :: Expr a -> Expr BoolSource
The inverse of isNull
, returns false
if the expression supplied is Null.
Arguments
:: Expr a | Default value (to be returned for |
-> Expr (Maybe a) | A nullable expression |
-> Expr a |
Takes a default value a and a nullable value. If the value is NULL,
the default value is returned, otherwise the value itself is returned.
Simliar to fromMaybe
fromVal :: ShowConstant a => a -> Expr (Maybe a) -> Expr aSource
Similar to fromNull, but takes a value argument rather than an Expr.
constant :: ShowConstant a => a -> Expr aSource
Creates a constant expression from a haskell value.
constVal :: ShowConstant a => a -> Expr (Maybe a)Source
Turn constant data into a nullable expression.
Same as constant . Just
constExpr :: Expr a -> Expr (Maybe a)Source
Turn constant data into a nullable expression.
Same as constant . Just
Create an anonymous parameter with a default value.
Create a named parameter with a default value.
Used to implement variable length arguments to func
, below.
func :: Args a => String -> aSource
Can be used to define SQL functions which will appear in queries. Each argument for the function is specified by its own Expr value. Examples include:
lower :: Expr a -> Expr (Maybe String) lower str = func "lower" str
The arguments to the function do not have to be Expr if they can be converted to Expr:
data DatePart = Day | Century deriving Show
datePart :: DatePart -> Expr (Maybe CalendarTime) -> Expr (Maybe Int) datePart date col = func "date_part" (constant $ show date) col
Aggregate functions can also be defined. For example:
every :: Expr Bool -> ExprAggr Bool every col = func "every" col
Aggregates are implemented to always take one argument, so any attempt to define an aggregate with any more or less arguments will result in an error.
Note that type signatures are usually required for each function defined, unless the arguments can be inferred.
Generates a CAST
expression for the given
expression, using the argument given as the destination
type.
Coerce the type of an expression
to another type. Does not affect the actual
primitive value - only the phantom
type.
asc :: HasField f r => Rel r -> Attr f a -> OrderExprSource
Use this together with the function order
to
order the results of a query in ascending order.
Takes a relation and an attribute of that relation, which
is used for the ordering.
desc :: HasField f r => Rel r -> Attr f a -> OrderExprSource
Use this together with the function order
to
order the results of a query in descending order.
Takes a relation and an attribute of that relation, which
is used for the ordering.
Arguments
:: [(Expr Bool, Expr a)] | A list of conditions and expressions. |
-> Expr a | Else-expression. |
-> Expr a |
Creates a conditional expression. Returns the value of the expression corresponding to the first true condition. If none of the conditions are true, the value of the else-expression is returned.
_default :: ExprDefault aSource
The default value of the column. Only works with insert
.
Internals
subQuery :: Query (Rel r) -> Query (Rel r)Source
Allows a subquery to be created between another query and this query. Normally query definition is associative and query definition is interleaved. This combinator ensures the given query is added as a whole piece.
attributeName :: Attr f a -> AttributeSource
baseTable :: (ShowLabels r, ToPrimExprs r) => TableName -> Record r -> Table rSource
emptyTable :: TableName -> Table (Record RecNil)Source
For queries against fake tables, such as 'information_schema.information_schema_catalog_name'. Useful for constructing queries that contain constant data (and do not select from columns) but need a table to select from.
exprs :: ToPrimExprs r => Record r -> [PrimExpr]Source
labels :: ShowLabels r => r -> [String]Source