narc-0.1.2: Query SQL databases using Nested Relational Calculus embedded in Haskell.




Query SQL databases using Nested Relational Calculus embedded in Haskell.

The primed functions in this module are in fact the syntactic forms of the embedded language. Use them as, for example:

  foreach (table "employees" []) $ \emp ->
    having (primApp "<" [cnst 20000, project emp "salary"]) $
    singleton (record [(project emp "name")])


The type of the embedded terms

type NarcTerm = Gensym (Term ())Source

Translation to an SQL representation

narcToSQL :: NarcTerm -> QuerySource

Translate a Narc term to an SQL query.

narcToSQLString :: NarcTerm -> StringSource

Translate a Narc term to an SQL query string--perhaps the central | function of the interface.

The language itself

unit :: NarcTermSource

A dummy value, or zero-width record.

table :: Tabname -> [(Field, Type)] -> NarcTermSource

A reference to a named database table; second argument is its schema type.

class Constable a whereSource

A polymorphic way of embedding constants into a term.


cnst :: a -> NarcTermSource

Lift a constant value into a query.

primApp :: String -> [NarcTerm] -> NarcTermSource

Apply some primitive function, such as (+) or avg, to a list of arguments.

abs :: (String -> NarcTerm) -> NarcTermSource

Create a functional abstraction.

app :: NarcTerm -> NarcTerm -> NarcTermSource

Apply a functional term to an argument.

ifthenelse :: NarcTerm -> NarcTerm -> NarcTerm -> NarcTermSource

A condition between two terms, as determined by the boolean value of the first term.

singleton :: NarcTerm -> NarcTermSource

A singleton collection of one item.

nil :: NarcTermSource

An empty collection.

union :: NarcTerm -> NarcTerm -> NarcTermSource

The union of two collections

record :: [(String, NarcTerm)] -> NarcTermSource

Construct a record (name-value pairs) out of other terms; usually used, with base values for the record elements, as the final result of a query, corresponding to the select clause of a SQL query, but can also be used with nested results internally in a query.

project :: NarcTerm -> String -> NarcTermSource

Project a field out of a record value.

foreach :: NarcTerm -> (NarcTerm -> NarcTerm) -> NarcTermSource

For each item in the collection resulting from the first argument, give it to the function which is the second argument and evaluate--this corresponds to a loop, or two one part of a cross in traditional SQL queries.

having :: NarcTerm -> NarcTerm -> NarcTermSource

Filter the current iteration as per the condition in the first argument. Corresponds to a where clause in a SQL query.