hasbolt-extras-0.0.0.14: src/Database/Bolt/Extras/DSL/Internal/Instances.hs
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE TypeSynonymInstances #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
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 NeatInterpolation (text)
import Text.Printf (printf)
instance SelectorLike NodeSelector where
withIdentifier idx node = node { nodeIdentifier = Just idx }
withLabel lbl node = node { nodeLabels = lbl : nodeLabels node }
withProp prop node = node { nodeProperties = prop : nodeProperties node }
instance SelectorLike RelSelector where
withIdentifier idx rel = rel { relIdentifier = Just idx }
withLabel lbl rel = rel { relLabel = lbl }
withProp prop rel = rel { relProperties = prop : relProperties rel }
instance ToCypher NodeSelector where
toCypher NodeSelector{..} = execWriter $ do
tell "("
case nodeIdentifier of
Just idx -> tell idx
Nothing -> pure ()
case nodeLabels of
[] -> pure ()
_ -> tell $ toCypher nodeLabels
case nodeProperties of
[] -> pure ()
_ -> do tell "{"
tell $ toCypher nodeProperties
tell "}"
tell ")"
instance ToCypher RelSelector where
toCypher RelSelector{..} = execWriter $ do
tell "["
case relIdentifier of
Just idx -> tell idx
Nothing -> pure ()
case relLabel of
"" -> pure ()
_ -> tell $ toCypher relLabel
case relProperties of
[] -> pure ()
_ -> do tell "{"
tell $ toCypher relProperties
tell "}"
tell "]"
instance ToCypher PathSelector where
toCypher (ps :-!: rs :!->: ns) = execWriter $ do
tell $ toCypher ps
tell "-"
tell $ toCypher rs
tell "->"
tell $ toCypher ns
toCypher (ps :<-!: rs :!-: ns) = execWriter $ do
tell $ toCypher ps
tell "<-"
tell $ toCypher rs
tell "-"
tell $ toCypher ns
toCypher (ps :-!: rs :!-: ns) = execWriter $ do
tell $ toCypher ps
tell "-"
tell $ toCypher rs
tell "-"
tell $ toCypher ns
toCypher (P ns) = execWriter $
tell $ toCypher ns
toCypher (_ :<-!: _ :!->: _) = error "Database.Bolt.Extras.DSL: incorrect path"
instance ToCypher Selector where
toCypher (PS ps) = toCypher ps
toCypher (TS txt) = txt
instance ToCypher Selectors where
toCypher = intercalate ", " . fmap toCypher
instance ToCypher Cond where
toCypher (ID t bId) = pack $ printf "ID(%s)=%d" t (fromInt bId)
toCypher (IDs t bIds) = pack $ printf "ID(%s) in [%s]" t (intercalate ", " $ fmap (pack . show) bIds)
toCypher (IN t txts) = pack $ printf "%s in [%s]" t (intercalate ", " $ fmap (\s -> [text|"$s"|]) txts)
toCypher (TC txt) = txt
instance ToCypher Conds where
toCypher (fcp :&&: scp) = toCypher fcp <> " AND " <> toCypher scp
toCypher (fcp :||: scp) = toCypher fcp <> " OR " <> toCypher scp
toCypher (Not cp) = "NOT " <> toCypher cp
toCypher (C cp) = toCypher cp