{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
module Database.Bolt.Extras.Query.Set
(
setNode
) where
import Control.Monad.IO.Class (MonadIO)
import Data.Text (Text, append, intercalate)
import Database.Bolt (BoltActionT,
RecordValue (..), at,
exact, query, Value (..))
import Database.Bolt.Extras.Persisted (BoltId, fromInt)
import Database.Bolt.Extras.Query.Cypher (ToCypher (..))
import Database.Bolt.Extras.Query.Get (NodeGetter, condIdAsText,
nodeAsText)
import Database.Bolt.Extras.Template.Types (Property)
import NeatInterpolation (text)
setNode :: (MonadIO m) => NodeGetter -> [Property] -> BoltActionT m BoltId
setNode nodeGetter props = do
let nodeGetterT = nodeAsText (varQ, nodeGetter)
let condId = condIdAsText (varQ, nodeGetter)
let newProperties = intercalate "," $ fmap formPropertySet $ filter ((/= N ()) . snd) props
let getQuery = [text|MATCH $nodeGetterT
WHERE $condId
SET $newProperties
RETURN ID($varQ) as $varQ|]
record <- head <$> query getQuery
nodeIdentity' <- record `at` varQ >>= exact
pure $ fromInt nodeIdentity'
where
varQ = "n"
formPropertyName :: Text -> Text
formPropertyName n = varQ `append` "." `append` n
formPropertySet :: Property -> Text
formPropertySet (name, prop) = formPropertyName name `append` "=" `append` toCypher prop