relational-query 0.8.3.0 → 0.8.3.1
raw patch · 14 files changed
+97/−91 lines, 14 files
Files
- ChangeLog.md +5/−0
- relational-query.cabal +1/−1
- src/Database/Relational/Query/Internal/Product.hs +20/−33
- src/Database/Relational/Query/Internal/Sub.hs +27/−15
- src/Database/Relational/Query/Monad/Aggregate.hs +2/−3
- src/Database/Relational/Query/Monad/Assign.hs +2/−2
- src/Database/Relational/Query/Monad/Restrict.hs +2/−2
- src/Database/Relational/Query/Monad/Simple.hs +2/−3
- src/Database/Relational/Query/Monad/Trans/Join.hs +2/−3
- src/Database/Relational/Query/Monad/Trans/JoinState.hs +8/−11
- src/Database/Relational/Query/Monad/Trans/Restricting.hs +2/−2
- src/Database/Relational/Query/Monad/Type.hs +2/−2
- src/Database/Relational/Query/Monad/Unique.hs +4/−4
- src/Database/Relational/Query/Sub.hs +18/−10
ChangeLog.md view
@@ -1,5 +1,10 @@ <!-- -*- Markdown -*- --> +## 0.8.3.1++- Refactor around sub-query and its builder.+- Compatibility with dlist-0.5.+ ## 0.8.3.0 - Add configuration to quote SQL string of table names.
relational-query.cabal view
@@ -1,5 +1,5 @@ name: relational-query-version: 0.8.3.0+version: 0.8.3.1 synopsis: Typeful, Modular, Relational, algebraic query engine description: This package contiains typeful relation structure and relational-algebraic query building DSL which can
src/Database/Relational/Query/Internal/Product.hs view
@@ -1,6 +1,6 @@ -- | -- Module : Database.Relational.Query.Internal.Product--- Copyright : 2013 Kei Hibino+-- Copyright : 2013-2016 Kei Hibino -- License : BSD3 -- -- Maintainer : ex8k.hibino@gmail.com@@ -9,58 +9,45 @@ -- -- This module defines product structure to compose SQL join. module Database.Relational.Query.Internal.Product (- -- * Product tree type- node, nodeAttr, nodeTree,+ -- * Interfaces to manipulate ProductTree type growProduct, restrictProduct, ) where import Prelude hiding (and, product)-import Control.Applicative (pure, empty)-import Data.Monoid ((<>))+import Control.Applicative (pure)+import Data.Monoid ((<>), mempty) import Database.Relational.Query.Context (Flat)-import Database.Relational.Query.Internal.Sub (NodeAttr (..), ProductTree (..), Node (..), Projection)+import Database.Relational.Query.Internal.Sub+ (NodeAttr (..), ProductTree (..), Node (..), Projection, Qualified, SubQuery,+ ProductTreeBuilder, ProductBuilder) --- | Get node attribute.-nodeAttr :: Node q -> NodeAttr-nodeAttr (Node a _) = a where---- | Get tree from node.-nodeTree :: Node q -> ProductTree q-nodeTree (Node _ t) = t---- | Make product node from node attribute and product tree.-node :: NodeAttr -- ^ Node attribute- -> ProductTree q -- ^ Product tree- -> Node q -- ^ Result node-node = Node- -- | Push new tree into product right term.-growRight :: Maybe (Node q) -- ^ Current tree- -> (NodeAttr, ProductTree q) -- ^ New tree to push into right- -> Node q -- ^ Result node+growRight :: Maybe ProductBuilder -- ^ Current tree+ -> (NodeAttr, ProductTreeBuilder) -- ^ New tree to push into right+ -> ProductBuilder -- ^ Result node growRight = d where- d Nothing (naR, q) = node naR q- d (Just l) (naR, q) = node Just' $ Join l (node naR q) empty+ d Nothing (naR, q) = Node naR q+ d (Just l) (naR, q) = Node Just' $ Join l (Node naR q) mempty -- | Push new leaf node into product right term.-growProduct :: Maybe (Node q) -- ^ Current tree- -> (NodeAttr, q) -- ^ New leaf to push into right- -> Node q -- ^ Result node+growProduct :: Maybe ProductBuilder -- ^ Current tree+ -> (NodeAttr, Qualified SubQuery) -- ^ New leaf to push into right+ -> ProductBuilder -- ^ Result node growProduct = match where match t (na, q) = growRight t (na, Leaf q) -- | Add restriction into top product of product tree.-restrictProduct' :: ProductTree q -- ^ Product to restrict+restrictProduct' :: ProductTreeBuilder -- ^ Product to restrict -> Projection Flat (Maybe Bool) -- ^ Restriction to add- -> ProductTree q -- ^ Result product+ -> ProductTreeBuilder -- ^ Result product restrictProduct' = d where d (Join lp rp rs) rs' = Join lp rp (rs <> pure rs') d leaf'@(Leaf _) _ = leaf' -- or error on compile -- | Add restriction into top product of product tree node.-restrictProduct :: Node q -- ^ Target node which has product to restrict+restrictProduct :: ProductBuilder -- ^ Target node which has product to restrict -> Projection Flat (Maybe Bool) -- ^ Restriction to add- -> Node q -- ^ Result node-restrictProduct (Node a t) e = node a (restrictProduct' t e)+ -> ProductBuilder -- ^ Result node+restrictProduct (Node a t) e = Node a (restrictProduct' t e)
src/Database/Relational/Query/Internal/Sub.hs view
@@ -1,6 +1,8 @@+{-# LANGUAGE DeriveFunctor #-}+ -- | -- Module : Database.Relational.Query.Internal.Sub--- Copyright : 2015 Kei Hibino+-- Copyright : 2015-2016 Kei Hibino -- License : BSD3 -- -- Maintainer : ex8k.hibino@gmail.com@@ -14,7 +16,8 @@ -- * Product tree type , NodeAttr (..), ProductTree (..), Node (..)- , JoinProduct, QueryProduct, QueryProductNode+ , JoinProduct, QueryProductTree+ , ProductTreeBuilder, ProductBuilder , Projection, untypeProjection, typedProjection @@ -26,7 +29,7 @@ import Data.Array (Array) import Data.DList (DList) -import qualified Database.Relational.Query.Context as Context+import Database.Relational.Query.Context (Flat, Aggregated) import Database.Relational.Query.Component (ColumnSQL, Config, Duplication (..), AggregateElem, OrderingTerms)@@ -42,11 +45,11 @@ -- | Sub-query type data SubQuery = Table Table.Untyped | Flat Config- UntypedProjection Duplication JoinProduct (QueryRestriction Context.Flat)+ UntypedProjection Duplication JoinProduct (QueryRestriction Flat) OrderingTerms | Aggregated Config- UntypedProjection Duplication JoinProduct (QueryRestriction Context.Flat)- [AggregateElem] (QueryRestriction Context.Aggregated) OrderingTerms+ UntypedProjection Duplication JoinProduct (QueryRestriction Flat)+ [AggregateElem] (QueryRestriction Aggregated) OrderingTerms | Bin BinOp SubQuery SubQuery deriving Show @@ -73,21 +76,30 @@ -- | node attribute for product. data NodeAttr = Just' | Maybe deriving Show +type QS = Qualified SubQuery++type QueryRestrictionBuilder = DList (Projection Flat (Maybe Bool))+ -- | Product tree type. Product tree is constructed by left node and right node.-data ProductTree q = Leaf q- | Join !(Node q) !(Node q) !(DList (Projection Context.Flat (Maybe Bool)))- deriving Show+data ProductTree rs+ = Leaf QS+ | Join !(Node rs) !(Node rs) !rs+ deriving (Show, Functor) -- | Product node. node attribute and product tree.-data Node q = Node !NodeAttr !(ProductTree q) deriving Show+data Node rs = Node !NodeAttr !(ProductTree rs) deriving (Show, Functor) --- | Product tree specialized by 'SubQuery'.-type QueryProduct = ProductTree (Qualified SubQuery)--- | Product node specialized by 'SubQuery'.-type QueryProductNode = Node (Qualified SubQuery)+-- | Product tree with join restriction.+type QueryProductTree = ProductTree (QueryRestriction Flat) +-- | Product tree with join restriction builder.+type ProductTreeBuilder = ProductTree QueryRestrictionBuilder++-- | Product noe with join restriction builder.+type ProductBuilder = Node QueryRestrictionBuilder+ -- | Type for join product of query.-type JoinProduct = Maybe QueryProduct+type JoinProduct = Maybe QueryProductTree -- | Phantom typed projection. Projected into Haskell record type 't'.
src/Database/Relational/Query/Monad/Aggregate.hs view
@@ -6,7 +6,7 @@ -- | -- Module : Database.Relational.Query.Monad.Aggregate--- Copyright : 2013 Kei Hibino+-- Copyright : 2013-2016 Kei Hibino -- License : BSD3 -- -- Maintainer : ex8k.hibino@gmail.com@@ -34,8 +34,7 @@ import qualified Database.Relational.Query.Projection as Projection import Database.Relational.Query.Component (AggregateColumnRef, Duplication, OrderingTerms, AggregateElem, composeOver, showsColumnSQL)-import Database.Relational.Query.Internal.Sub (SubQuery, QueryRestriction, JoinProduct)-import Database.Relational.Query.Sub (aggregatedSubQuery)+import Database.Relational.Query.Sub (SubQuery, QueryRestriction, JoinProduct, aggregatedSubQuery) import qualified Database.Relational.Query.Sub as SubQuery import Database.Relational.Query.Projectable (PlaceHolders, SqlProjectable)
src/Database/Relational/Query/Monad/Assign.hs view
@@ -4,7 +4,7 @@ -- | -- Module : Database.Relational.Query.Monad.Assign--- Copyright : 2013 Kei Hibino+-- Copyright : 2013-2016 Kei Hibino -- License : BSD3 -- -- Maintainer : ex8k.hibino@gmail.com@@ -19,7 +19,7 @@ extract, ) where -import Database.Relational.Query.Internal.Sub (QueryRestriction)+import Database.Relational.Query.Sub (QueryRestriction) import Database.Relational.Query.Component (Config, Assignments) import Database.Relational.Query.Context (Flat) import Database.Relational.Query.Table (Table)
src/Database/Relational/Query/Monad/Restrict.hs view
@@ -4,7 +4,7 @@ -- | -- Module : Database.Relational.Query.Monad.Restrict--- Copyright : 2013 Kei Hibino+-- Copyright : 2013-2016 Kei Hibino -- License : BSD3 -- -- Maintainer : ex8k.hibino@gmail.com@@ -20,7 +20,7 @@ extract ) where -import Database.Relational.Query.Internal.Sub (QueryRestriction)+import Database.Relational.Query.Sub (QueryRestriction) import Database.Relational.Query.Component (Config) import Database.Relational.Query.Context (Flat) import Database.Relational.Query.Projection (Projection)
src/Database/Relational/Query/Monad/Simple.hs view
@@ -4,7 +4,7 @@ -- | -- Module : Database.Relational.Query.Monad.Simple--- Copyright : 2013 Kei Hibino+-- Copyright : 2013-2016 Kei Hibino -- License : BSD3 -- -- Maintainer : ex8k.hibino@gmail.com@@ -35,8 +35,7 @@ import Database.Relational.Query.Projectable (PlaceHolders) import Database.Relational.Query.Component (Duplication, OrderingTerms)-import Database.Relational.Query.Internal.Sub (SubQuery, QueryRestriction, JoinProduct)-import Database.Relational.Query.Sub (flatSubQuery)+import Database.Relational.Query.Sub (SubQuery, QueryRestriction, JoinProduct, flatSubQuery) import qualified Database.Relational.Query.Sub as SubQuery
src/Database/Relational/Query/Monad/Trans/Join.hs view
@@ -5,7 +5,7 @@ -- | -- Module : Database.Relational.Query.Monad.Trans.Join--- Copyright : 2013 Kei Hibino+-- Copyright : 2013-2016 Kei Hibino -- License : BSD3 -- -- Maintainer : ex8k.hibino@gmail.com@@ -36,11 +36,10 @@ import Database.Relational.Query.Context (Flat) import Database.Relational.Query.Monad.Trans.JoinState (JoinContext, primeJoinContext, updateProduct, joinProduct)-import Database.Relational.Query.Internal.Sub (NodeAttr (Just', Maybe), Projection)+import Database.Relational.Query.Internal.Sub (NodeAttr (Just', Maybe), SubQuery, Qualified, JoinProduct, Projection) import Database.Relational.Query.Internal.Product (restrictProduct, growProduct) import qualified Database.Relational.Query.Projection as Projection import Database.Relational.Query.Component (Duplication (All))-import Database.Relational.Query.Internal.Sub (SubQuery, Qualified, JoinProduct) import Database.Relational.Query.Projectable (PlaceHolders, unsafeAddPlaceHolders) import Database.Relational.Query.Monad.BaseType (ConfigureQuery, qualifyQuery, Relation, untypeRelation)
src/Database/Relational/Query/Monad/Trans/JoinState.hs view
@@ -1,6 +1,6 @@ -- | -- Module : Database.Relational.Query.Monad.Trans.JoinState--- Copyright : 2013 Kei Hibino+-- Copyright : 2013-2016 Kei Hibino -- License : BSD3 -- -- Maintainer : ex8k.hibino@gmail.com@@ -15,15 +15,16 @@ ) where import Prelude hiding (product)+import Data.DList (toList) -import qualified Database.Relational.Query.Internal.Product as Product-import Database.Relational.Query.Internal.Sub (QueryProductNode, JoinProduct)+import qualified Database.Relational.Query.Sub as Product+import Database.Relational.Query.Sub (ProductBuilder, JoinProduct) -- | JoinContext type for QueryJoin. newtype JoinContext = JoinContext- { product :: Maybe QueryProductNode+ { product :: Maybe ProductBuilder } -- | Initial 'JoinContext'.@@ -31,13 +32,9 @@ primeJoinContext = JoinContext Nothing -- | Update product of 'JoinContext'.-updateProduct' :: (Maybe QueryProductNode -> Maybe QueryProductNode) -> JoinContext -> JoinContext-updateProduct' uf ctx = ctx { product = uf . product $ ctx }---- | Update product of 'JoinContext'.-updateProduct :: (Maybe QueryProductNode -> QueryProductNode) -> JoinContext -> JoinContext-updateProduct uf = updateProduct' (Just . uf)+updateProduct :: (Maybe ProductBuilder -> ProductBuilder) -> JoinContext -> JoinContext+updateProduct uf ctx = ctx { product = Just . uf . product $ ctx } -- | Finalize context to extract accumulated query product. joinProduct :: JoinContext -> JoinProduct-joinProduct = fmap Product.nodeTree . product+joinProduct = fmap (fmap toList . Product.nodeTree) . product
src/Database/Relational/Query/Monad/Trans/Restricting.hs view
@@ -4,7 +4,7 @@ -- | -- Module : Database.Relational.Query.Monad.Trans.Restricting--- Copyright : 2013 Kei Hibino+-- Copyright : 2014-2016 Kei Hibino -- License : BSD3 -- -- Maintainer : ex8k.hibino@gmail.com@@ -26,7 +26,7 @@ import Control.Arrow (second) import Data.DList (DList, toList) -import Database.Relational.Query.Internal.Sub (QueryRestriction, Projection)+import Database.Relational.Query.Sub (QueryRestriction, Projection) import Database.Relational.Query.Monad.Class (MonadQualify (..), MonadRestrict(..), MonadQuery (..), MonadAggregate(..))
src/Database/Relational/Query/Monad/Type.hs view
@@ -1,6 +1,6 @@ -- | -- Module : Database.Relational.Query.Monad.Type--- Copyright : 2013 Kei Hibino+-- Copyright : 2013-2016 Kei Hibino -- License : BSD3 -- -- Maintainer : ex8k.hibino@gmail.com@@ -15,7 +15,7 @@ ) where import Database.Relational.Query.Component (Duplication)-import Database.Relational.Query.Internal.Sub (JoinProduct, QueryRestriction)+import Database.Relational.Query.Sub (JoinProduct, QueryRestriction) import Database.Relational.Query.Context (Flat) import Database.Relational.Query.Projection (Projection) import Database.Relational.Query.Projectable (PlaceHolders)
src/Database/Relational/Query/Monad/Unique.hs view
@@ -5,7 +5,7 @@ -- | -- Module : Database.Relational.Query.Monad.Unique--- Copyright : 2013 Kei Hibino+-- Copyright : 2014-2016 Kei Hibino -- License : BSD3 -- -- Maintainer : ex8k.hibino@gmail.com@@ -22,7 +22,6 @@ import Control.Applicative (Applicative) import Database.Relational.Query.Context (Flat)-import Database.Relational.Query.Internal.Sub (NodeAttr) import Database.Relational.Query.Projection (Projection) import qualified Database.Relational.Query.Projection as Projection @@ -34,8 +33,9 @@ import Database.Relational.Query.Projectable (PlaceHolders) import Database.Relational.Query.Component (Duplication)-import Database.Relational.Query.Internal.Sub (SubQuery, QueryRestriction, Qualified, JoinProduct)-import Database.Relational.Query.Sub (flatSubQuery)+import Database.Relational.Query.Sub+ (SubQuery, QueryRestriction, Qualified, JoinProduct, NodeAttr, flatSubQuery)+ -- | Unique query monad type. newtype QueryUnique a = QueryUnique (QueryCore a)
src/Database/Relational/Query/Sub.hs view
@@ -2,7 +2,7 @@ -- | -- Module : Database.Relational.Query.Sub--- Copyright : 2013 Kei Hibino+-- Copyright : 2013-2016 Kei Hibino -- License : BSD3 -- -- Maintainer : ex8k.hibino@gmail.com@@ -25,7 +25,7 @@ column, -- * Projection- ProjectionUnit, UntypedProjection,+ Projection, ProjectionUnit, UntypedProjection, untypedProjectionFromColumns, untypedProjectionFromJoinedSubQuery, untypedProjectionFromScalarSubQuery, widthOfUntypedProjection, columnsOfUntypedProjection,@@ -33,26 +33,26 @@ projectionColumns, unsafeProjectionStringSql, unsafeProjectFromColumns, -- * Product of sub-queries- QueryProduct, QueryProductNode, JoinProduct,+ JoinProduct, NodeAttr,+ nodeTree,+ ProductBuilder, -- * Query restriction+ QueryRestriction, composeWhere, composeHaving ) where import Data.Array (listArray) import qualified Data.Array as Array import Data.Monoid (mempty, (<>), mconcat)-import Data.DList (toList) import qualified Database.Relational.Query.Context as Context import Database.Relational.Query.Internal.SQL (StringSQL, stringSQL, rowStringSQL, showStringSQL)-import Database.Relational.Query.Internal.Product- (nodeAttr, nodeTree) import Database.Relational.Query.Internal.Sub (SubQuery (..), Projection, untypeProjection, typedProjection, UntypedProjection, ProjectionUnit (..),- JoinProduct, QueryProduct, QueryProductNode,- NodeAttr (Just', Maybe), ProductTree (Leaf, Join),+ JoinProduct, QueryProductTree, ProductBuilder,+ NodeAttr (Just', Maybe), ProductTree (Leaf, Join), Node (Node), SetOp (..), BinOp (..), Qualifier (..), Qualified (..), QueryRestriction) import Database.Relational.Query.Component@@ -325,8 +325,16 @@ unsafeProjectFromColumns = typedProjection . untypedProjectionFromColumns +-- | Get node attribute.+nodeAttr :: Node rs -> NodeAttr+nodeAttr (Node a _) = a where++-- | Get tree from node.+nodeTree :: Node rs -> ProductTree rs+nodeTree (Node _ t) = t+ -- | Show product tree of query into SQL. StringSQL result.-showsQueryProduct :: QueryProduct -> StringSQL+showsQueryProduct :: QueryProductTree -> StringSQL showsQueryProduct = rec where joinType Just' Just' = INNER joinType Just' Maybe = LEFT@@ -342,7 +350,7 @@ joinType (nodeAttr left') (nodeAttr right'), JOIN, urec right', ON, foldr1 SQL.and $ ps ++ concat [ showConstantTermsSQL' True | null ps ] ]- where ps = [ unsafeProjectionStringSql p | p <- toList rs ]+ where ps = [ unsafeProjectionStringSql p | p <- rs ] -- | Shows join product of query. showsJoinProduct :: ProductUnitSupport -> JoinProduct -> StringSQL