greskell-2.0.0.0: Haskell binding for Gremlin graph query language
MaintainerToshio Ito <debug.ito@gmail.com>
Safe HaskellNone
LanguageHaskell2010

Data.Greskell.Extra

Description

Extra utility functions implemented by Greskell.

Since: 0.2.3.0

Synopsis

Property readers

Re-export property readers.

Since: 1.0.0.0

lookupAs :: (PMapKey k, NonEmptyLike c, PMapValue k ~ a, FromGraphSON a) => k -> PMap c GValue -> Either PMapLookupException a Source #

Lookup the value and parse it into a.

lookupAs' :: (PMapKey k, NonEmptyLike c, PMapValue k ~ Maybe a, FromGraphSON a) => k -> PMap c GValue -> Either PMapLookupException (Maybe a) Source #

Similar to lookupAs, but this function converts a null result into Nothing.

A null result is either (1) the key k is not found in the map, or (2) the key is found, but the value is null.

lookupListAs :: (PMapKey k, NonEmptyLike c, PMapValue k ~ a, FromGraphSON a) => k -> PMap c GValue -> Either PMapLookupException (NonEmpty a) Source #

Look up the values and parse them into a.

lookupListAs' :: (PMapKey k, NonEmptyLike c, PMapValue k ~ Maybe a, FromGraphSON a) => k -> PMap c GValue -> Either PMapLookupException [Maybe a] Source #

Similar to lookupListAs, but this function accepts null results.

If the key k is not found in the map, it returns an empty list. If the key k is found and nulls are included in the values, they are obtained as Nothing.

pMapToFail :: MonadFail m => Either PMapLookupException a -> m a Source #

Convert the lookup result into a MonadFail. It fails with the description returned by pMapDecribeError.

Property writers

writeKeyValues :: Element e => [KeyValue e] -> Walk SideEffect e e Source #

Make a series of .property steps to write the given key-value pairs as properties. Use <=:> and <=?> to make a KeyValue within Binder.

>>> let keyAge = ("age" :: Key AVertex Int)
>>> let keyName = ("name" :: Key AVertex Text)
>>> let (walk, binding) = runBinder $ writeKeyValues <$> sequence [keyAge <=:> 21, keyName <=:> "Josh"]
>>> toGremlin walk
"__.property(\"age\",__v0).property(\"name\",__v1).identity()"
>>> sortBy (comparing fst) $ KeyMap.toList binding
[("__v0",Number 21.0),("__v1",String "Josh")]

Since: 1.0.0.0

(<=:>) :: ToJSON b => Key a b -> b -> Binder (KeyValue a) Source #

Like =:, but this one takes a real value, binds it into a Greskell value and returns KeyValue.

Since: 1.0.0.0

(<=?>) :: ToJSON b => Key a (Maybe b) -> Maybe b -> Binder (KeyValue a) Source #

Like <=:>, but this one is for an optional property. If the value is Just, it's equivalent to <=:>. If the value is Nothing, it returns KeyNoValue.

>>> let keyNName = ("nickname" :: Key AVertex (Maybe Text))
>>> let keyCompany = ("company" :: Key AVertex (Maybe Text))
>>> let (walk, binding) = runBinder $ writeKeyValues <$> sequence [keyNName <=?> Nothing, keyCompany <=?> Just "foobar.com"]
>>> toGremlin walk
"__.property(\"company\",__v0).identity()"
>>> sortBy (comparing fst) $ KeyMap.toList binding
[("__v0",String "foobar.com")]

Since: 1.0.0.0

writePropertyKeyValues :: (ToJSON v, Element e) => [(Text, v)] -> Binder (Walk SideEffect e e) Source #

Make a series of .property steps to write the given key-value pairs as properties.

>>> let binder = (writePropertyKeyValues [("age", (21 :: Int))] :: Binder (Walk SideEffect AVertex AVertex))
>>> let (walk, binding) = runBinder binder
>>> toGremlin walk
"__.property(\"age\",__v0).identity()"
>>> sortBy (comparing fst) $ KeyMap.toList binding
[("__v0",Number 21.0)]

Since: 0.2.3.0

writePMapProperties :: (Foldable c, ToJSON v, Element e) => PMap c v -> Binder (Walk SideEffect e e) Source #

Make a series of .property steps to write all properties in the given PMap.

Since: 1.0.0.0

Control idioms

gWhenEmptyInput Source #

Arguments

:: (ToGTraversal g, Split cc c, Lift Transform cc, Lift Transform c, WalkType c, WalkType cc) 
=> g cc [s] s

the body traversal

-> Walk c s s

the result walk

The result Walk emits the input elements as-is when there is at least one input element. If there is no input element, it runs the body traversal once and outputs its result.

You can use this function to implement "upsert" a vertex (i.e. add a vertex if not exist).

>>> let getMarko = (source "g" & sV' [] &. gHas2 "name" "marko" :: GTraversal Transform () AVertex)
>>> let upsertMarko = (liftWalk getMarko &. gWhenEmptyInput (gAddV "person" >>> gProperty "name" "marko") :: GTraversal SideEffect () AVertex)

See also: https://stackoverflow.com/questions/46027444/

Since: 1.1.0.0