{-| Module : Database.HaskRel.RDBMS Description : A re-export of the modules that form the HList record based HaskRel library Copyright : © Thor Michael Støre, 2015 License : GPL v2 without "any later version" clause Maintainer : thormichael át gmail døt com Stability : experimental Exports the pertinent parts of HaskRel building on HList records. This gives most features of the relational algebra, relation variable support, HList CommonMain, as well as certain non-relational features such as ordering. /This section below belongs in the package description, but Hackage doesn't/ /format the package description in a satisfactory manner/. = Examples The examples in this documentation are based on "the old warhorse" that is the suppliers-parts database (see [1] for more). This gives a body of relational expressions with known results to base examples upon. See also examples\/SuppliersPartsExamples.hs (not visible from this documentation) for Haskell versions of a selection of the Tutorial D expressions given as examples in chapters 6 and 7 of [1]. These can be run by starting examples\/suppliersPartsDB.sh and then running @snrt2ndExamples@. While most Tutorial D expressions translate fairly verbatim to Haskell there are a few where one must be a bit more explicit. While most Tutorial D expressions translate fairly verbatim to Haskell there are a few where Haskell is stricter than Tutorial D and one must be a bit more explicit. $ is always used after `p`\/`rPrint` or `pt`\/`rPrintTyped` in the examples to keep them uniform (and so it kinda looks like a prompt), even when not required. The short forms `p` and `pt` are used whenever there isn't a conflict with other identifiers, whereas for the SuppliersPartsExample, which has a relvar "@p@", `rPrint` is used instead of `p` for presentation of relational objects without type information. = Terminology Since this builds on both Haskell and relational theory this documentation uses terms as they have been established in material related to either. Several terms of Haskell and HList have been redefined in terms of relational theory in this library, mostly to illustrate how terms and concepts have been mapped from the latter to the former. (I'm trying to keep this open to change later if it turns out to be an unhelpful crutch.) The following table gives a quick overview of either terms or concepts as found in Haskell, the relational model (as presented in [1]), HaskRel and SQL, and how they are mapped from the second to the first: @ ┌───────────────────────────┬────────────────────┬────────────┬────────────────────────────────────────────────┐ │ haskell │ relModel │ haskRel │ sql │ ╞═══════════════════════════╪════════════════════╪════════════╪════════════════════════════════════════════════╡ │ │ attribute │ Attr │ field, column │ │ │ tuple │ RTuple │ row │ │ ( ( a) ) │ relation │ Relation a │ table │ │ ( ( a)) │ relvar │ Relvar a │ table │ │ │ attribute name │ Label │ field name, column name │ │ │ attribute name set │ Labels │ list of field/column names │ │ function, operator │ operator │ function │ operator, function, procedure, routine, method │ └───────────────────────────┴────────────────────┴────────────┴────────────────────────────────────────────────┘ @ Found in "example\/Terminology.hs". Note that this is just an overview, study of [1] or [2], Haskell itself, HList and HaskRel is required to see how terms and concepts correlate. The term \"RTuple\", or "r-tuple", is chosen to simultaneously distinguish the concept from Haskell tuples while relating it to tuples of the relational model. For the type of either "Record a" or "Set ( Record a )" in Haskell the term "heading" is used in relational theory, and "row type" or "composite type" in SQL. In relational theory the term "scalar" is used to refer to data types that are neither tuples nor relations, which corresponds to everything but "Record a" or "Set ( Record a )" in Haskell. Note also that HaskRel /does/ use the term "table", but then only in the sense of "presentation of a relation value" (see above). [1] [2] -} {- TODO: Should call this something else than RDBMS seeing as it's so far just a DBMS + relational algebra + base relvars -} module Database.HaskRel.RDBMS ( module Data.HList.CommonMain, -- * The relational model of database management: A subset thereof module Database.HaskRel.Relational.Definition, Relvar ( Relvar, relvarPath ), relvarType, readRelvar, module Database.HaskRel.Relational.Expression, module Database.HaskRel.Relational.Unicode, -- * Non-relational features module Database.HaskRel.Order, module Database.HaskRel.Support ) where {- TODO: Only import relevant parts of HList. Variant, TIPs and TICs aren't required. -} import Data.HList.CommonMain import Data.Tagged (Tagged) -- The relational model, and features defined together with it import Database.HaskRel.Relational.Definition import Database.HaskRel.Relational.Variable ( Relvar (Relvar), relvarPath, relvarType, readRelvar ) import Database.HaskRel.Relational.Expression import Database.HaskRel.Relational.Unicode -- Features not of the relational model import Database.HaskRel.Order import Database.HaskRel.Support