Class DefaultTraversalSideEffects
- java.lang.Object
-
- org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversalSideEffects
-
- All Implemented Interfaces:
Serializable
,AutoCloseable
,Cloneable
,TraversalSideEffects
public class DefaultTraversalSideEffects extends Object implements TraversalSideEffects
- Author:
- Marko A. Rodriguez (http://markorodriguez.com)
- See Also:
- Serialized Form
-
-
Nested Class Summary
-
Nested classes/interfaces inherited from interface org.apache.tinkerpop.gremlin.process.traversal.TraversalSideEffects
TraversalSideEffects.Exceptions
-
-
Field Summary
Fields Modifier and Type Field Description protected Set<String>
keys
protected Map<String,Object>
objectMap
protected Map<String,BinaryOperator>
reducerMap
protected Supplier
sackInitialValue
protected BinaryOperator
sackMergeOperator
protected UnaryOperator
sackSplitOperator
protected Map<String,Supplier>
supplierMap
-
Constructor Summary
Constructors Constructor Description DefaultTraversalSideEffects()
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description void
add(String key, Object value)
Add a value to the global side-effect value.DefaultTraversalSideEffects
clone()
Cloning is used to duplicate the sideEffects typically in distributed execution environments.boolean
exists(String key)
Return true if the key is a registered side-effect.<V> V
get(String key)
Get the sideEffect associated with the provided key.<V> BinaryOperator<V>
getReducer(String key)
Get the reducer associated with the side-effect key.<S> Supplier<S>
getSackInitialValue()
If sacks are enabled, get the initial value of theTraverser
sack.<S> BinaryOperator<S>
getSackMerger()
If sacks are enabled and a merge function has been specified, then get it (else getnull
).<S> UnaryOperator<S>
getSackSplitter()
If sacks are enabled and a split operator has been specified, then get it (else getnull
).<V> Supplier<V>
getSupplier(String key)
Get the supplier associated with the side-effect key.Set<String>
keys()
The keys of the sideEffect which includes registeredSupplier
keys.void
mergeInto(TraversalSideEffects sideEffects)
Add the currentTraversalSideEffects
values, suppliers, and reducers to the providedTraversalSideEffects
.<V> void
register(String key, Supplier<V> initialValue, BinaryOperator<V> reducer)
<V> void
registerIfAbsent(String key, Supplier<V> initialValue, BinaryOperator<V> reducer)
void
remove(String key)
Remove both the value and registeredSupplier
associated with provided key.void
set(String key, Object value)
Set the specified key to the specified value.<S> void
setSack(Supplier<S> initialValue, UnaryOperator<S> splitOperator, BinaryOperator<S> mergeOperator)
Set the initial value of eachTraverser
"sack" along with the operators for splitting and merging sacks.String
toString()
-
Methods inherited from class java.lang.Object
equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
-
Methods inherited from interface org.apache.tinkerpop.gremlin.process.traversal.TraversalSideEffects
close, forEach, isEmpty
-
-
-
-
Field Detail
-
reducerMap
protected Map<String,BinaryOperator> reducerMap
-
sackSplitOperator
protected UnaryOperator sackSplitOperator
-
sackMergeOperator
protected BinaryOperator sackMergeOperator
-
sackInitialValue
protected Supplier sackInitialValue
-
-
Method Detail
-
exists
public boolean exists(String key)
Return true if the key is a registered side-effect.- Specified by:
exists
in interfaceTraversalSideEffects
- Parameters:
key
- the key to check for existence- Returns:
- whether the key exists or not
-
get
public <V> V get(String key) throws IllegalArgumentException
Get the sideEffect associated with the provided key. If the sideEffect contains an object for the key, return it. Else if the sideEffect has a registeredSupplier
for that key, generate the object, store the object in the sideEffects, and return it.- Specified by:
get
in interfaceTraversalSideEffects
- Type Parameters:
V
- the type of the value to retrieve- Parameters:
key
- the key to get the value for- Returns:
- the value associated with key
- Throws:
IllegalArgumentException
- if the key does not reference an object or a registered supplier.
-
set
public void set(String key, Object value) throws IllegalArgumentException
Set the specified key to the specified value. This method should not be used in a distributed environment. Instead, useTraversalSideEffects.add(String, Object)
. This method is only safe when there is only one representation of the side-effect and thus, not distributed across threads or machines.- Specified by:
set
in interfaceTraversalSideEffects
- Parameters:
key
- the key they key of the side-effectvalue
- the value the new value for the side-effect- Throws:
IllegalArgumentException
- if the key does not reference a registered side-effect.
-
add
public void add(String key, Object value) throws IllegalArgumentException
Add a value to the global side-effect value. This should be used by steps to ensure that side-effects are merged properly in a distributed environment.TraversalSideEffects.set(String, Object)
should only be used in single-threaded systems or by a master traversal in a distributed environment.- Specified by:
add
in interfaceTraversalSideEffects
- Parameters:
key
- the key of the side-effect.value
- the partital value (to be merged) of the side-effect.- Throws:
IllegalArgumentException
- if no side-effect exists for the provided key
-
register
public <V> void register(String key, Supplier<V> initialValue, BinaryOperator<V> reducer)
Register a side-effect with theTraversalSideEffects
providing aSupplier
and aBinaryOperator
. If a null value is provided for the supplier or reducer, then it no supplier or reducer is registered.- Specified by:
register
in interfaceTraversalSideEffects
- Type Parameters:
V
- the type of the side-effect value- Parameters:
key
- the key of the side-effect valueinitialValue
- the initial value supplierreducer
- the reducer to use for merging a distributed side-effect value into a single value
-
registerIfAbsent
public <V> void registerIfAbsent(String key, Supplier<V> initialValue, BinaryOperator<V> reducer)
Register a side-effect with theTraversalSideEffects
providing aSupplier
and aBinaryOperator
. The registration will only overwrite a supplier or reducer if no supplier or reducer existed prior. If a null value is provided for the supplier or reducer, then it no supplier or reducer is registered.- Specified by:
registerIfAbsent
in interfaceTraversalSideEffects
- Type Parameters:
V
- the type of the side-effect value- Parameters:
key
- the key of the side-effect valueinitialValue
- the initial value supplierreducer
- the reducer to use for merging a distributed side-effect value into a single value
-
getReducer
public <V> BinaryOperator<V> getReducer(String key) throws IllegalArgumentException
Get the reducer associated with the side-effect key. If no reducer was registered, thenOperator.assign
is provided.- Specified by:
getReducer
in interfaceTraversalSideEffects
- Type Parameters:
V
- the type of the side-effect value- Parameters:
key
- the key of the side-effect- Returns:
- the registered reducer
- Throws:
IllegalArgumentException
- if no side-effect exists for the provided key
-
getSupplier
public <V> Supplier<V> getSupplier(String key) throws IllegalArgumentException
Get the supplier associated with the side-effect key. If no supplier was registered, thenConstantSupplier
is provided.- Specified by:
getSupplier
in interfaceTraversalSideEffects
- Type Parameters:
V
- the type of the side-effect value- Parameters:
key
- the key of the side-effect- Returns:
- the registered supplier
- Throws:
IllegalArgumentException
- if no side-effect exists for the provided key
-
setSack
public <S> void setSack(Supplier<S> initialValue, UnaryOperator<S> splitOperator, BinaryOperator<S> mergeOperator)
Set the initial value of eachTraverser
"sack" along with the operators for splitting and merging sacks. If no split operator is provided, then a direct memory copy is assumed (this is typically good for primitive types and strings). If no merge operator is provided, then traversers with sacks will not be merged.- Specified by:
setSack
in interfaceTraversalSideEffects
- Type Parameters:
S
- the sack type- Parameters:
initialValue
- the initial value supplier of the traverser sacksplitOperator
- the split operator for splitting traverser sacksmergeOperator
- the merge operator for merging traverser sacks
-
getSackInitialValue
public <S> Supplier<S> getSackInitialValue()
If sacks are enabled, get the initial value of theTraverser
sack. If its not enabled, thennull
is returned.- Specified by:
getSackInitialValue
in interfaceTraversalSideEffects
- Type Parameters:
S
- the sack type- Returns:
- the supplier of the initial value of the traverser sack
-
getSackSplitter
public <S> UnaryOperator<S> getSackSplitter()
If sacks are enabled and a split operator has been specified, then get it (else getnull
). The split operator is used to split a sack when a bifurcation in aTraverser
happens.- Specified by:
getSackSplitter
in interfaceTraversalSideEffects
- Type Parameters:
S
- the sack type- Returns:
- the operator for splitting a traverser sack
-
getSackMerger
public <S> BinaryOperator<S> getSackMerger()
If sacks are enabled and a merge function has been specified, then get it (else getnull
). The merge function is used to merge two sacks when twoTraverser
s converge.- Specified by:
getSackMerger
in interfaceTraversalSideEffects
- Type Parameters:
S
- the sack type- Returns:
- the operator for merging two traverser sacks
-
remove
public void remove(String key)
Remove both the value and registeredSupplier
associated with provided key.- Specified by:
remove
in interfaceTraversalSideEffects
- Parameters:
key
- the key of the value and registered supplier to remove
-
keys
public Set<String> keys()
The keys of the sideEffect which includes registeredSupplier
keys. In essence, that which is possible toTraversalSideEffects.get(String)
.- Specified by:
keys
in interfaceTraversalSideEffects
- Returns:
- the keys of the sideEffect
-
mergeInto
public void mergeInto(TraversalSideEffects sideEffects)
Add the currentTraversalSideEffects
values, suppliers, and reducers to the providedTraversalSideEffects
. The implementation should (under the hood), useTraversalSideEffects.registerIfAbsent(String, Supplier, BinaryOperator)
so that if the argumentTraversalSideEffects
already has a registered supplier or binary operator, then don't overwrite it.- Specified by:
mergeInto
in interfaceTraversalSideEffects
- Parameters:
sideEffects
- the sideEffects to add this traversal's sideEffect data to.
-
clone
public DefaultTraversalSideEffects clone()
Cloning is used to duplicate the sideEffects typically in distributed execution environments.- Specified by:
clone
in interfaceTraversalSideEffects
- Overrides:
clone
in classObject
- Returns:
- The cloned sideEffects
-
-