Skip to content

Commit

Permalink
version 0.0.0.14: merge graphs and return properties, refactoring (#21)
Browse files Browse the repository at this point in the history
* version 0.0.0.13: `ToJSON` and `FromJSON` instances for `Persisted a`

* merge graphs

* version 0.0.0.14: merge graphs and return properties, refactoring
  • Loading branch information
Cheshirrrrrr authored and ozzzzz committed Dec 26, 2018
1 parent 1ffc1c2 commit 7d33dfa
Show file tree
Hide file tree
Showing 28 changed files with 722 additions and 448 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,4 @@ cabal.sandbox.config
.stack-work/
cabal.project.local
.HTF/
*.swo
10 changes: 10 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,16 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.

## [Unreleased]

## [0.0.0.14] - 2018-12-25
### Added
- `mergeGraphs`, ability to take not all node properties from DB.
### Changed
- Refactoring.

## [0.0.0.13] - 2018-12-05
### Added
- `ToJSON` and `FromJSON` instances for `Persisted a`.

## [0.0.0.12] - 2018-10-15
### Added
- `REMOVE` query.
Expand Down
35 changes: 20 additions & 15 deletions hasbolt-extras.cabal
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
name: hasbolt-extras
version: 0.0.0.12
version: 0.0.0.14
synopsis: Extras for hasbolt library
description: Extras for hasbolt library
homepage: https://github.com/biocad/hasbolt-extras#readme
Expand All @@ -24,38 +24,43 @@ source-repository head
library
hs-source-dirs: src
exposed-modules: Database.Bolt.Extras
, Database.Bolt.Extras.Condition
, Database.Bolt.Extras.Graph
, Database.Bolt.Extras.Persisted
, Database.Bolt.Extras.Query
, Database.Bolt.Extras.Template
, Database.Bolt.Extras.Utils
, Database.Bolt.Extras.DSL
other-modules: Database.Bolt.Extras.Query.Get
, Database.Bolt.Extras.Query.Put
, Database.Bolt.Extras.Query.Set
, Database.Bolt.Extras.Query.Delete
, Database.Bolt.Extras.Query.Utils
, Database.Bolt.Extras.Query.Cypher

, Database.Bolt.Extras.Template.Types
, Database.Bolt.Extras.Template.Instances
, Database.Bolt.Extras.Template.Converters
, Database.Bolt.Extras.Utils
other-modules: Database.Bolt.Extras.Internal.Cypher
, Database.Bolt.Extras.Internal.Condition
, Database.Bolt.Extras.Internal.Persisted
, Database.Bolt.Extras.Internal.Instances
, Database.Bolt.Extras.Internal.Types

, Database.Bolt.Extras.Template.Internal.Converters

, Database.Bolt.Extras.DSL.Internal.Types
, Database.Bolt.Extras.DSL.Internal.Language
, Database.Bolt.Extras.DSL.Internal.Executer
, Database.Bolt.Extras.DSL.Internal.Instances

, Database.Bolt.Extras.Graph.Internal.AbstractGraph
, Database.Bolt.Extras.Graph.Internal.Class
, Database.Bolt.Extras.Graph.Internal.Get
, Database.Bolt.Extras.Graph.Internal.Put
, Database.Bolt.Extras.Graph.Internal.GraphQuery

build-depends: base >=4.7 && <5
, aeson
, aeson-casing
, containers
, free
, hasbolt
, lens
, mtl
, neat-interpolation
, scientific
, template-haskell
, text
, th-lift-instances
, vector
, unordered-containers
ghc-options: -Wall -O2
default-language: Haskell2010
19 changes: 9 additions & 10 deletions src/Database/Bolt/Extras.hs
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
module Database.Bolt.Extras
(
module Database.Bolt.Extras.Graph
, module Database.Bolt.Extras.Utils
, module Database.Bolt.Extras.Template
, module Database.Bolt.Extras.Query
, module Database.Bolt.Extras.Persisted
module Database.Bolt.Extras.Internal.Condition
, module Database.Bolt.Extras.Internal.Persisted
, module Database.Bolt.Extras.Internal.Cypher
, module Database.Bolt.Extras.Internal.Types
) where

import Database.Bolt.Extras.Graph
import Database.Bolt.Extras.Utils
import Database.Bolt.Extras.Template
import Database.Bolt.Extras.Query
import Database.Bolt.Extras.Persisted
import Database.Bolt.Extras.Internal.Condition
import Database.Bolt.Extras.Internal.Cypher
import Database.Bolt.Extras.Internal.Instances ()
import Database.Bolt.Extras.Internal.Persisted
import Database.Bolt.Extras.Internal.Types
8 changes: 4 additions & 4 deletions src/Database/Bolt/Extras/DSL.hs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ module Database.Bolt.Extras.DSL
, module Database.Bolt.Extras.DSL.Internal.Executer
) where

import Database.Bolt.Extras.DSL.Internal.Types
import Database.Bolt.Extras.DSL.Internal.Language
import Database.Bolt.Extras.DSL.Internal.Executer
import Database.Bolt.Extras.DSL.Internal.Instances ()
import Database.Bolt.Extras.DSL.Internal.Executer
import Database.Bolt.Extras.DSL.Internal.Instances ()
import Database.Bolt.Extras.DSL.Internal.Language
import Database.Bolt.Extras.DSL.Internal.Types
2 changes: 1 addition & 1 deletion src/Database/Bolt/Extras/DSL/Internal/Executer.hs
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@ import Data.Monoid ((<>))
import Data.Text as T (Text,
intercalate,
unwords)
import Database.Bolt.Extras (ToCypher (..))
import Database.Bolt.Extras.DSL.Internal.Instances ()
import Database.Bolt.Extras.DSL.Internal.Types (Expr (..))
import Database.Bolt.Extras.Query.Cypher (ToCypher (..))

-- | Translates 'Expr' to cypher query.
--
Expand Down
4 changes: 2 additions & 2 deletions src/Database/Bolt/Extras/DSL/Internal/Instances.hs
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@ module Database.Bolt.Extras.DSL.Internal.Instances () where
import Control.Monad.Writer (execWriter, tell)
import Data.Monoid ((<>))
import Data.Text (intercalate, pack)
import Database.Bolt.Extras (ToCypher (..),
fromInt)
import Database.Bolt.Extras.DSL.Internal.Types
import Database.Bolt.Extras.Persisted (fromInt)
import Database.Bolt.Extras.Query.Cypher (ToCypher (..))
import NeatInterpolation (text)
import Text.Printf (printf)

Expand Down
10 changes: 5 additions & 5 deletions src/Database/Bolt/Extras/DSL/Internal/Types.hs
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,11 @@ module Database.Bolt.Extras.DSL.Internal.Types
, toRelSelector
) where

import Data.Map.Strict (toList)
import Data.Text (Text)
import Database.Bolt (Node (..), URelationship (..),
Value (..))
import Database.Bolt.Extras.Persisted (BoltId)
import Data.Map.Strict (toList)
import Data.Text (Text)
import Database.Bolt (Node (..), URelationship (..),
Value (..))
import Database.Bolt.Extras (BoltId)

-- | Class for Selectors, which can update identifier, labels and props.
--
Expand Down
49 changes: 10 additions & 39 deletions src/Database/Bolt/Extras/Graph.hs
Original file line number Diff line number Diff line change
@@ -1,43 +1,14 @@
{-# LANGUAGE TemplateHaskell #-}

module Database.Bolt.Extras.Graph
(
Graph (..)
, emptyGraph
, addNode
, addRelation
module Database.Bolt.Extras.Graph.Internal.AbstractGraph
, module Database.Bolt.Extras.Graph.Internal.Class
, module Database.Bolt.Extras.Graph.Internal.Get
, module Database.Bolt.Extras.Graph.Internal.GraphQuery
, module Database.Bolt.Extras.Graph.Internal.Put
) where

import Control.Lens (makeLenses, over)
import Data.Map.Strict (Map, insert, notMember)
import Text.Printf (printf)

-- | 'Graph' contains vertices, that are parameterized by some type @n@, and relations,
-- that parameterized by pair of type @n@. This pair represents vertices, that are connected with this relation.
--
data Graph n a b = Graph { _vertices :: Map n a
, _relations :: Map (n, n) b
} deriving (Show)

makeLenses ''Graph

-- | Creates empty graph.
--
emptyGraph :: Ord n => Graph n a b
emptyGraph = Graph mempty mempty

-- | Adds node to graph by it's @name@ and @node@ content.
-- If graph already contains vertex with given @name@, error will be thrown.
--
addNode :: (Show n, Ord n) => n -> a -> Graph n a b -> Graph n a b
addNode name node graph = if name `notMember` _vertices graph
then over vertices (insert name node) graph
else error . printf "vertex with name %s key already exists" . show $ name

-- | Adds relation to graph by @startName@ of vertex, @endName@ of vertex, and @rel@ with relation content.
-- If graph already contains relation with given @(startName, endName)@, error will be thrown.
--
addRelation :: (Show n, Ord n) => n -> n -> b -> Graph n a b -> Graph n a b
addRelation startName endName rel graph = if (startName, endName) `notMember` _relations graph
then over relations (insert (startName, endName) rel) graph
else error $ printf "relation with names (%s, %s) already exists" (show startName) (show endName)
import Database.Bolt.Extras.Graph.Internal.AbstractGraph
import Database.Bolt.Extras.Graph.Internal.Class
import Database.Bolt.Extras.Graph.Internal.Get
import Database.Bolt.Extras.Graph.Internal.GraphQuery
import Database.Bolt.Extras.Graph.Internal.Put
45 changes: 45 additions & 0 deletions src/Database/Bolt/Extras/Graph/Internal/AbstractGraph.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
{-# LANGUAGE TemplateHaskell #-}

module Database.Bolt.Extras.Graph.Internal.AbstractGraph
(
Graph (..)
, vertices
, relations
, emptyGraph
, addNode
, addRelation
) where

import Control.Lens (makeLenses, over)
import Data.Map.Strict (Map, insert, notMember)
import Text.Printf (printf)

-- | 'Graph' contains vertices, that are parameterized by some type @n@, and relations,
-- that parameterized by pair of type @n@. This pair represents vertices, that are connected with this relation.
--
data Graph n a b = Graph { _vertices :: Map n a
, _relations :: Map (n, n) b
} deriving (Show)

makeLenses ''Graph

-- | Creates empty graph.
--
emptyGraph :: Ord n => Graph n a b
emptyGraph = Graph mempty mempty

-- | Adds node to graph by it's @name@ and @node@ content.
-- If graph already contains vertex with given @name@, error will be thrown.
--
addNode :: (Show n, Ord n) => n -> a -> Graph n a b -> Graph n a b
addNode name node graph = if name `notMember` _vertices graph
then over vertices (insert name node) graph
else error . printf "vertex with name %s key already exists" . show $ name

-- | Adds relation to graph by @startName@ of vertex, @endName@ of vertex, and @rel@ with relation content.
-- If graph already contains relation with given @(startName, endName)@, error will be thrown.
--
addRelation :: (Show n, Ord n) => n -> n -> b -> Graph n a b -> Graph n a b
addRelation startName endName rel graph = if (startName, endName) `notMember` _relations graph
then over relations (insert (startName, endName) rel) graph
else error $ printf "relation with names (%s, %s) already exists" (show startName) (show endName)
29 changes: 29 additions & 0 deletions src/Database/Bolt/Extras/Graph/Internal/Class.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
module Database.Bolt.Extras.Graph.Internal.Class
(
Requestable (..)
, Returnable (..)
, Extractable (..)
) where

import Control.Monad.IO.Class (MonadIO)
import Data.Text (Text)
import Database.Bolt (BoltActionT, Record)

-- | Class describes entity, which can be requested.
--
class Requestable a where
-- | Condition for BoltId like "ID(a) = b" if BoltId is presented.
maybeBoltIdCond :: a -> Maybe Text
-- | How to convert entity to Cypher.
request :: a -> Text

-- | Class describes entity, which can be returned.
--
class Returnable a where
-- | How to return entity in the Cypher.
return' :: a -> Text

-- | Class describes entity, which can be extracted from records by name.
--
class Extractable a where
extract :: MonadIO m => Text -> [Record] -> BoltActionT m [a]
Loading

0 comments on commit 7d33dfa

Please sign in to comment.