packages feed

hsparql 0.3.3 → 0.3.4

raw patch · 4 files changed

+138/−48 lines, 4 filesPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

API changes (from Hackage documentation)

- Database.HSparql.QueryGenerator: [queryVars] :: SelectQuery -> [Variable]
+ Database.HSparql.QueryGenerator: SelectExpr :: Expr -> Variable -> SelectExpr
+ Database.HSparql.QueryGenerator: SelectVar :: Variable -> SelectExpr
+ Database.HSparql.QueryGenerator: [queryExpr] :: SelectQuery -> [SelectExpr]
+ Database.HSparql.QueryGenerator: as :: Expr -> Variable -> SelectExpr
+ Database.HSparql.QueryGenerator: avg :: BuiltinFunc1
+ Database.HSparql.QueryGenerator: count :: BuiltinFunc1
+ Database.HSparql.QueryGenerator: data SelectExpr
+ Database.HSparql.QueryGenerator: groupBy :: (TermLike a) => a -> Query [GroupBy]
+ Database.HSparql.QueryGenerator: infix 4 .>=.
+ Database.HSparql.QueryGenerator: instance Database.HSparql.QueryGenerator.QueryShow Database.HSparql.QueryGenerator.GroupBy
+ Database.HSparql.QueryGenerator: instance Database.HSparql.QueryGenerator.QueryShow Database.HSparql.QueryGenerator.SelectExpr
+ Database.HSparql.QueryGenerator: instance Database.HSparql.QueryGenerator.QueryShow [Database.HSparql.QueryGenerator.GroupBy]
+ Database.HSparql.QueryGenerator: instance Database.HSparql.QueryGenerator.QueryShow [Database.HSparql.QueryGenerator.OrderBy]
+ Database.HSparql.QueryGenerator: instance Database.HSparql.QueryGenerator.QueryShow [Database.HSparql.QueryGenerator.SelectExpr]
+ Database.HSparql.QueryGenerator: instance GHC.Show.Show Database.HSparql.QueryGenerator.SelectExpr
+ Database.HSparql.QueryGenerator: max_ :: BuiltinFunc1
+ Database.HSparql.QueryGenerator: min_ :: BuiltinFunc1
+ Database.HSparql.QueryGenerator: select :: [SelectExpr] -> Query SelectQuery
+ Database.HSparql.QueryGenerator: selectVars :: [Variable] -> Query SelectQuery
+ Database.HSparql.QueryGenerator: sum_ :: BuiltinFunc1
- Database.HSparql.QueryGenerator: SelectQuery :: [Variable] -> SelectQuery
+ Database.HSparql.QueryGenerator: SelectQuery :: [SelectExpr] -> SelectQuery

Files

Database/HSparql/QueryGenerator.hs view
@@ -22,6 +22,9 @@   , union   , filterExpr   , bind+  , select+  , selectVars+  , as    -- ** Duplicate handling   , distinct@@ -30,6 +33,9 @@   -- ** Limit handling   , limit +  -- ** Groups handling+  , groupBy+   -- ** Order handling   , orderNext   , orderNextAsc@@ -50,6 +56,13 @@   -- ** Negation   , notExpr +  -- ** Builtin aggregation functions+  , count+  , sum_+  , min_+  , max_+  , avg+   -- ** Builtin Functions   , str   , lang@@ -73,6 +86,7 @@   , BlankNodePattern   , Pattern   , SelectQuery(..)+  , SelectExpr(..)   , ConstructQuery(..)   , AskQuery(..)   , UpdateQuery(..)@@ -107,7 +121,7 @@   where specifyVars :: Query ()         specifyVars = do           query <- q-          modify $ \s -> s { vars = queryVars query , queryType = SelectType }+          modify $ \s -> s { vars = queryExpr query, queryType = SelectType }  -- |Execute a 'Construct Query' action, returning the 'String' representation of the query. createConstructQuery :: Query ConstructQuery -> String@@ -188,7 +202,12 @@   modify $ \s -> s { describeURI = Just newIri }   return newIri +selectVars :: [Variable] -> Query SelectQuery+selectVars vs = return SelectQuery { queryExpr = fmap SelectVar vs } +select :: [SelectExpr] -> Query SelectQuery+select es = return SelectQuery { queryExpr = es }+ -- |Add optional constraints on matches. Variable bindings within the optional --  action are lost, so variables must always be defined prior to opening the --  optional block.@@ -248,6 +267,14 @@ limit n = do modify $ \s -> s { limits = Limit n }              gets limits +-- Grouping++-- |Divide the solution into one or more groups.+groupBy :: (TermLike a) => a -> Query [GroupBy]+groupBy e = do+  modify $ \s -> s { groups = groups s ++ [GroupBy . expr $ e] }+  gets groups+ -- Order handling  -- |Alias of 'orderNextAsc'.@@ -412,6 +439,8 @@ (.>=.) :: (TermLike a, TermLike b) => a -> b -> Expr (.>=.) = relation GreaterThanOrEqual +infix 4 .==., .!=., .<., .<=., .>., .>=.+ -- Negation  -- |Negate any term-like expression, for use, e.g., in filtering.@@ -431,6 +460,21 @@ builtinFunc3 :: Function -> BuiltinFunc3 builtinFunc3 f x y z = BuiltinCall f [expr x, expr y, expr z] +count :: BuiltinFunc1+count = builtinFunc1 CountFunc++sum_ :: BuiltinFunc1+sum_ = builtinFunc1 SumFunc++min_ :: BuiltinFunc1+min_ = builtinFunc1 MinFunc++max_ :: BuiltinFunc1+max_ = builtinFunc1 MaxFunc++avg :: BuiltinFunc1+avg = builtinFunc1 AvgFunc+ str :: BuiltinFunc1 str = builtinFunc1 StrFunc @@ -480,8 +524,9 @@     , updateTriples = []     , describeURI = Nothing     , duplicates = NoLimits-    , limits     = NoLimit+    , groups    = []     , ordering   = []+    , limits     = NoLimit     }  @@ -580,9 +625,11 @@ data Relation = Equal | NotEqual | LessThan | GreaterThan | LessThanOrEqual | GreaterThanOrEqual               deriving (Show) -data Function = StrFunc | LangFunc | LangMatchesFunc | DataTypeFunc | BoundFunc-              | SameTermFunc | IsIRIFunc | IsURIFunc | IsBlankFunc-              | IsLiteralFunc | RegexFunc+data Function = CountFunc| SumFunc | MinFunc | MaxFunc | AvgFunc+              | StrFunc | LangFunc | LangMatchesFunc+              | DataTypeFunc | BoundFunc | SameTermFunc+              | IsIRIFunc | IsURIFunc | IsBlankFunc | IsLiteralFunc+              | RegexFunc               deriving (Show)  data Expr = OrExpr [Expr]@@ -594,6 +641,13 @@           | VarOrTermExpr VarOrTerm           deriving (Show) +data SelectExpr = SelectExpr Expr Variable+                | SelectVar Variable+                deriving (Show)++as :: Expr -> Variable -> SelectExpr+e `as` v = SelectExpr e v+ data Pattern = QTriple VarOrTerm VarOrTerm VarOrTerm              | Filter Expr              | Bind Expr Variable@@ -602,6 +656,8 @@  data GroupGraphPattern = GroupGraphPattern [Pattern] +newtype GroupBy = GroupBy Expr+ data OrderBy = Asc Expr              | Desc Expr @@ -616,7 +672,7 @@ data QueryData = QueryData     { prefixes   :: [Prefix]     , varsIdx    :: Int-    , vars       :: [Variable]+    , vars       :: [SelectExpr]     , queryType  :: QueryType     , pattern    :: GroupGraphPattern     , constructTriples :: [Pattern] -- QTriple@@ -624,8 +680,9 @@     , updateTriples :: [Pattern]     , describeURI :: Maybe IRIRef     , duplicates :: Duplicates-    , limits     :: Limit+    , groups    :: [GroupBy]     , ordering   :: [OrderBy]+    , limits     :: Limit     }  @@ -643,12 +700,11 @@     { queryUpdate :: [Pattern] }  data SelectQuery = SelectQuery-    { queryVars :: [Variable] }+    { queryExpr :: [SelectExpr] }  data DescribeQuery = DescribeQuery     { queryDescribe :: IRIRef } - -- QueryShow instances instance QueryShow BlankNodePattern where   qshow [] = "[]"@@ -735,6 +791,11 @@   qshow GreaterThanOrEqual = ">="  instance QueryShow Function where+  qshow CountFunc       = "COUNT"+  qshow SumFunc         = "SUM"+  qshow MinFunc         = "MIN"+  qshow MaxFunc         = "MAX"+  qshow AvgFunc         = "AVG"   qshow StrFunc         = "STR"   qshow LangFunc        = "LANG"   qshow LangMatchesFunc = "LANGMATCHES"@@ -758,6 +819,13 @@           qshow' (BuiltinCall f es) = wrap $ qshow f ++ "(" ++ intercalate ", " (map qshow es) ++ ")"           wrap e = "(" ++ e ++ ")" +instance QueryShow SelectExpr where+  qshow (SelectVar v) = qshow v+  qshow (SelectExpr e v) = mconcat ["(", qshow e, " AS ", qshow v, ")"]++instance QueryShow [SelectExpr] where+  qshow = intercalate " " . fmap qshow+ instance QueryShow Pattern where   qshow (QTriple a b c) = intercalate " " [qshow a, qshow b, qshow c, "."]   qshow (Filter e)      = "FILTER " ++ qshow e ++ " ."@@ -771,10 +839,21 @@ instance QueryShow GroupGraphPattern where   qshow (GroupGraphPattern ps) = "{" ++ qshow ps ++ "}" +instance QueryShow GroupBy where+  qshow (GroupBy e) = qshow e++instance QueryShow [GroupBy] where+  qshow [] = ""+  qshow gs = unwords $ "GROUP BY" : fmap qshow gs+ instance QueryShow OrderBy where   qshow (Asc e)  = "ASC(" ++ qshow e ++ ")"   qshow (Desc e) = "DESC(" ++ qshow e ++ ")" +instance QueryShow [OrderBy] where+  qshow [] = ""+  qshow os = unwords $ "ORDER BY" : fmap qshow os+ instance QueryShow QueryForm where   qshow (SelectForm qd) =  unwords                         [ "SELECT"@@ -787,42 +866,43 @@   qshow (DescribeForm qd) = "DESCRIBE " ++ qshow (describeURI qd)  instance QueryShow QueryData where-  qshow qd = let whereStmt = unwords $-                              ["WHERE"-                              , qshow (pattern qd)-                              ] ++ case ordering qd of-                                      [] -> []-                                      os -> "ORDER BY" : map qshow os--                 query = case queryType qd of-                  SelectType ->-                   unwords [ qshow (prefixes qd)-                           , qshow (SelectForm qd)-                           , whereStmt-                           , qshow (limits qd)-                           ]-                  ConstructType ->-                   unwords [ qshow (prefixes qd)-                           , qshow (ConstructForm qd)-                           , whereStmt-                           ]-                  DescribeType ->-                   unwords [ qshow (prefixes qd)-                           , qshow (DescribeForm qd)-                           , whereStmt-                           ]-                  AskType ->-                   unwords [ qshow (prefixes qd)-                           , qshow (AskForm qd)-                           ]-                  UpdateType ->-                   unwords [ qshow (prefixes qd)-                           , qshow (UpdateForm qd)-                           ]-                  -- FIXME-                  TypeNotSet ->-                    error "instance QueryShow QueryData: TypeNotSet not supported."-             in query+  qshow qd = query+    where prefixDecl = qshow (prefixes qd)+          whereClause = unwords ["WHERE", qshow (pattern qd)]+          groupClause = qshow . groups $ qd+          -- TODO: HAVING clause+          orderClause = qshow . ordering $ qd+          -- TODO: Offset+          limitOffsetClauses = qshow (limits qd)+          solutionModifier = unwords' [groupClause, orderClause, limitOffsetClauses]+          query = case queryType qd of+            SelectType ->+             unwords' [ prefixDecl+                      , qshow (SelectForm qd)+                      , whereClause+                      , solutionModifier+                      ]+            ConstructType ->+             unwords [ prefixDecl+                     , qshow (ConstructForm qd)+                     , whereClause+                     ]+            DescribeType ->+             unwords [ prefixDecl+                     , qshow (DescribeForm qd)+                     , whereClause+                     ]+            AskType ->+             unwords [ prefixDecl+                     , qshow (AskForm qd)+                     ]+            UpdateType ->+             unwords [ prefixDecl+                     , qshow (UpdateForm qd)+                     ]+            -- FIXME+            TypeNotSet ->+              error "instance QueryShow QueryData: TypeNotSet not supported."   -- Internal utilities@@ -835,3 +915,13 @@         handleChar '"'  = "\\\""         handleChar '\\' = "\\\\"         handleChar c    = T.singleton c++-- | Alternative version of 'unwords' that avoid adding spaces on empty strings.+{-# NOINLINE [1] unwords' #-}+unwords'        :: [String] -> String+unwords' []     =  ""+unwords' (w:ws) = w ++ go ws+  where+    go []      = ""+    go ("":vs) = go vs+    go (v:vs)  = ' ' : (v ++ go vs)
hsparql.cabal view
@@ -1,6 +1,6 @@ Name:          hsparql Homepage:      https://github.com/robstewart57/hsparql-Version:       0.3.3+Version:       0.3.4 Synopsis:      A SPARQL query generator and DSL, and a client to query a SPARQL server. Category:      Database Description:
tests/AllTests.hs view
@@ -21,7 +21,7 @@ app req respond = respond $ response req    where      response req_ = case rawQueryString req_ of-                      "?query=PREFIX%20foaf%3A%20%3Chttp%3A%2F%2Fxmlns.com%2Ffoaf%2F0.1%2F%3E%20PREFIX%20dbpedia%3A%20%3Chttp%3A%2F%2Fdbpedia.org%2Fproperty%2F%3E%20PREFIX%20dbprop%3A%20%3Chttp%3A%2F%2Fdbpedia.org%2Fresource%2F%3E%20SELECT%20%20%3Fx1%20WHERE%20%7B%3Fx0%20dbpedia%3Agenre%20dbprop%3AWeb_browser%20.%20%3Fx0%20foaf%3Aname%20%3Fx1%20.%7D%20"+                      "?query=PREFIX%20foaf%3A%20%3Chttp%3A%2F%2Fxmlns.com%2Ffoaf%2F0.1%2F%3E%20PREFIX%20dbpedia%3A%20%3Chttp%3A%2F%2Fdbpedia.org%2Fproperty%2F%3E%20PREFIX%20dbprop%3A%20%3Chttp%3A%2F%2Fdbpedia.org%2Fresource%2F%3E%20SELECT%20%20%3Fx1%20WHERE%20%7B%3Fx0%20dbpedia%3Agenre%20dbprop%3AWeb_browser%20.%20%3Fx0%20foaf%3Aname%20%3Fx1%20.%7D"                           -> selectResponse                       "?query=PREFIX%20dbprop%3A%20%3Chttp%3A%2F%2Fdbpedia.org%2Fproperty%2F%3E%20PREFIX%20dbpedia%3A%20%3Chttp%3A%2F%2Fdbpedia.org%2Fresource%2F%3E%20ASK%20%7B%20%3Fx0%20dbprop%3Agenre%20dbpedia%3AWeb_browser%20.%20%7D"                           -> askResponse
tests/Database/HSparql/ConnectionTest.hs view
@@ -42,7 +42,7 @@               _ <- triple x (dbpprop .:. "genre") (resource .:. "Web_browser")               _ <- triple x (foaf .:. "name") name -              return SelectQuery { queryVars = [name] }+              select [SelectVar name]  test_askQuery :: IO () test_askQuery = do