blob: 2d1633697c1bb48bb9da128af604125fef626017 [file] [log] [blame]
#region License
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#endregion
using System;
using System.Collections.Generic;
using System.Linq;
using Gremlin.Net.Structure;
namespace Gremlin.Net.Process.Traversal
{
/// <summary>
/// Graph traversals are the primary way in which graphs are processed.
/// </summary>
public class GraphTraversal<TStart, TEnd> : DefaultTraversal<TStart, TEnd>
{
/// <summary>
/// Initializes a new instance of the <see cref="GraphTraversal{SType, EType}" /> class.
/// </summary>
public GraphTraversal()
: this(new List<ITraversalStrategy>(), new Bytecode(), true)
{
}
/// <summary>
/// Initializes a new instance of the <see cref="GraphTraversal{SType, EType}" /> class.
/// </summary>
/// <param name="traversalStrategies">The traversal strategies to be used by this graph traversal at evaluation time.</param>
/// <param name="bytecode">The <see cref="Bytecode" /> associated with the construction of this graph traversal.</param>
public GraphTraversal(ICollection<ITraversalStrategy> traversalStrategies, Bytecode bytecode)
: this(traversalStrategies, bytecode, false)
{
}
/// <summary>
/// Initializes a new instance of the <see cref="GraphTraversal{SType, EType}" /> class.
/// </summary>
/// <param name="traversalStrategies">The traversal strategies to be used by this graph traversal at evaluation time.</param>
/// <param name="bytecode">The <see cref="Bytecode" /> associated with the construction of this graph traversal.</param>
/// <param name="anonymous">Set to true if spawned from an anonymous traversal source and false otherwise.</param>
private GraphTraversal(ICollection<ITraversalStrategy> traversalStrategies, Bytecode bytecode, bool anonymous)
{
TraversalStrategies = traversalStrategies;
Bytecode = bytecode;
IsAnonymous = anonymous;
}
/// <inheritdoc />
public override Bytecode Bytecode { get; }
private static GraphTraversal<TNewStart, TNewEnd> Wrap<TNewStart, TNewEnd>(GraphTraversal<TStart, TEnd> traversal)
{
if (typeof(TNewStart) == typeof(TStart) && typeof(TNewEnd) == typeof(TEnd))
{
return (traversal as GraphTraversal<TNewStart, TNewEnd>)!;
}
// New wrapper
return new GraphTraversal<TNewStart, TNewEnd>(traversal.TraversalStrategies, traversal.Bytecode, traversal.IsAnonymous);
}
/// <summary>
/// Adds the V step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, Vertex> V (params object?[]? vertexIdsOrElements)
{
if (vertexIdsOrElements == null)
{
Bytecode.AddStep("V", new object?[] { null });
}
else
{
var args = new List<object?>(vertexIdsOrElements.Length);
args.AddRange(vertexIdsOrElements);
Bytecode.AddStep("V", args.ToArray());
}
return Wrap<TStart, Vertex>(this);
}
/// <summary>
/// Adds the E step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, Edge> E (params object?[]? edgeIdsOrElements)
{
if (edgeIdsOrElements == null)
{
Bytecode.AddStep("E", new object?[] { null });
}
else
{
var args = new List<object?>(edgeIdsOrElements.Length);
args.AddRange(edgeIdsOrElements);
Bytecode.AddStep("E", args.ToArray());
}
return Wrap<TStart, Edge>(this);
}
/// <summary>
/// Adds the addE step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, Edge> AddE (string edgeLabel)
{
Bytecode.AddStep("addE", edgeLabel);
return Wrap<TStart, Edge>(this);
}
/// <summary>
/// Adds the addE step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, Edge> AddE (ITraversal edgeLabelTraversal)
{
Bytecode.AddStep("addE", edgeLabelTraversal);
return Wrap<TStart, Edge>(this);
}
/// <summary>
/// Adds the addV step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, Vertex> AddV ()
{
Bytecode.AddStep("addV");
return Wrap<TStart, Vertex>(this);
}
/// <summary>
/// Adds the addV step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, Vertex> AddV (string vertexLabel)
{
Bytecode.AddStep("addV", vertexLabel);
return Wrap<TStart, Vertex>(this);
}
/// <summary>
/// Adds the addV step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, Vertex> AddV (ITraversal vertexLabelTraversal)
{
Bytecode.AddStep("addV", vertexLabelTraversal);
return Wrap<TStart, Vertex>(this);
}
/// <summary>
/// Adds the aggregate step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Aggregate (Scope scope, string sideEffectKey)
{
Bytecode.AddStep("aggregate", scope, sideEffectKey);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the aggregate step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Aggregate (string sideEffectKey)
{
Bytecode.AddStep("aggregate", sideEffectKey);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the and step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> And (params ITraversal[] andTraversals)
{
if (andTraversals == null) throw new ArgumentNullException(nameof(andTraversals));
var args = new List<object>(andTraversals.Length);
args.AddRange(andTraversals);
Bytecode.AddStep("and", args.ToArray());
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the as step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> As (string stepLabel, params string[] stepLabels)
{
if (stepLabel == null) throw new ArgumentNullException(nameof(stepLabel));
if (stepLabels == null) throw new ArgumentNullException(nameof(stepLabels));
var args = new List<object>(1 + stepLabels.Length) {stepLabel};
args.AddRange(stepLabels);
Bytecode.AddStep("as", args.ToArray());
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the barrier step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Barrier ()
{
Bytecode.AddStep("barrier");
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the barrier step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Barrier (IConsumer barrierConsumer)
{
Bytecode.AddStep("barrier", barrierConsumer);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the barrier step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Barrier (int maxBarrierSize)
{
Bytecode.AddStep("barrier", maxBarrierSize);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the both step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, Vertex> Both (params string?[] edgeLabels)
{
if (edgeLabels == null) throw new ArgumentNullException(nameof(edgeLabels));
var args = new List<object?>(edgeLabels.Length);
args.AddRange(edgeLabels);
Bytecode.AddStep("both", args.ToArray());
return Wrap<TStart, Vertex>(this);
}
/// <summary>
/// Adds the bothE step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, Edge> BothE (params string?[] edgeLabels)
{
if (edgeLabels == null) throw new ArgumentNullException(nameof(edgeLabels));
var args = new List<object?>(edgeLabels.Length);
args.AddRange(edgeLabels);
Bytecode.AddStep("bothE", args.ToArray());
return Wrap<TStart, Edge>(this);
}
/// <summary>
/// Adds the bothV step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, Vertex> BothV ()
{
Bytecode.AddStep("bothV");
return Wrap<TStart, Vertex>(this);
}
/// <summary>
/// Adds the branch step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Branch<TNewEnd> (IFunction? function)
{
Bytecode.AddStep("branch", function);
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the branch step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Branch<TNewEnd> (ITraversal branchTraversal)
{
Bytecode.AddStep("branch", branchTraversal);
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the by step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> By ()
{
Bytecode.AddStep("by");
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the by step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> By (IComparator comparator)
{
Bytecode.AddStep("by", comparator);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the by step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> By (IFunction function)
{
Bytecode.AddStep("by", function);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the by step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> By (IFunction function, IComparator comparator)
{
Bytecode.AddStep("by", function, comparator);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the by step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> By (Order order)
{
Bytecode.AddStep("by", order);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the by step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> By (string? key)
{
Bytecode.AddStep("by", key);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the by step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> By (string? key, IComparator comparator)
{
Bytecode.AddStep("by", key, comparator);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the by step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> By (T token)
{
Bytecode.AddStep("by", token);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the by step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> By (ITraversal traversal)
{
Bytecode.AddStep("by", traversal);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the by step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> By (ITraversal traversal, IComparator comparator)
{
Bytecode.AddStep("by", traversal, comparator);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the call step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Call<TNewEnd> (string? service)
{
Bytecode.AddStep("call", service);
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the call step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Call<TNewEnd> (string? service, ITraversal? t)
{
Bytecode.AddStep("call", service, t);
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the call step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Call<TNewEnd> (string? service, IDictionary<object,object>? m)
{
Bytecode.AddStep("call", service, m);
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the call step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Call<TNewEnd>(string? service, IDictionary<object, object>? m,
ITraversal? t)
{
Bytecode.AddStep("call", service, m, t);
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the cap step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Cap<TNewEnd> (string sideEffectKey, params string[] sideEffectKeys)
{
if (sideEffectKey == null) throw new ArgumentNullException(nameof(sideEffectKey));
if (sideEffectKeys == null) throw new ArgumentNullException(nameof(sideEffectKeys));
var args = new List<object>(1 + sideEffectKeys.Length) { sideEffectKey };
args.AddRange(sideEffectKeys);
Bytecode.AddStep("cap", args.ToArray());
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the choose step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Choose<TNewEnd> (IFunction choiceFunction)
{
Bytecode.AddStep("choose", choiceFunction);
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the choose step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Choose<TNewEnd> (IPredicate choosePredicate, ITraversal trueChoice)
{
Bytecode.AddStep("choose", choosePredicate, trueChoice);
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the choose step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Choose<TNewEnd> (IPredicate choosePredicate, ITraversal trueChoice, ITraversal falseChoice)
{
Bytecode.AddStep("choose", choosePredicate, trueChoice, falseChoice);
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the choose step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Choose<TNewEnd> (ITraversal choiceTraversal)
{
Bytecode.AddStep("choose", choiceTraversal);
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the choose step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Choose<TNewEnd> (ITraversal traversalPredicate, ITraversal trueChoice)
{
Bytecode.AddStep("choose", traversalPredicate, trueChoice);
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the choose step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Choose<TNewEnd> (ITraversal traversalPredicate, ITraversal trueChoice, ITraversal falseChoice)
{
Bytecode.AddStep("choose", traversalPredicate, trueChoice, falseChoice);
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the coalesce step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Coalesce<TNewEnd> (params ITraversal[] coalesceTraversals)
{
if (coalesceTraversals == null) throw new ArgumentNullException(nameof(coalesceTraversals));
var args = new List<object>(coalesceTraversals.Length);
args.AddRange(coalesceTraversals);
Bytecode.AddStep("coalesce", args.ToArray());
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the coin step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Coin (double probability)
{
Bytecode.AddStep("coin", probability);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the connectedComponent step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> ConnectedComponent ()
{
Bytecode.AddStep("connectedComponent");
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the constant step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Constant<TNewEnd> (TNewEnd e)
{
Bytecode.AddStep("constant", e);
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the count step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, long> Count ()
{
Bytecode.AddStep("count");
return Wrap<TStart, long>(this);
}
/// <summary>
/// Adds the count step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, long> Count (Scope scope)
{
Bytecode.AddStep("count", scope);
return Wrap<TStart, long>(this);
}
/// <summary>
/// Adds the cyclicPath step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> CyclicPath ()
{
Bytecode.AddStep("cyclicPath");
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the dedup step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Dedup (Scope scope, params string?[] dedupLabels)
{
if (dedupLabels == null) throw new ArgumentNullException(nameof(dedupLabels));
var args = new List<object?>(1 + dedupLabels.Length) { scope };
args.AddRange(dedupLabels);
Bytecode.AddStep("dedup", args.ToArray());
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the dedup step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Dedup (params string?[] dedupLabels)
{
if (dedupLabels == null) throw new ArgumentNullException(nameof(dedupLabels));
var args = new List<object?>(dedupLabels.Length);
args.AddRange(dedupLabels);
Bytecode.AddStep("dedup", args.ToArray());
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the drop step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Drop ()
{
Bytecode.AddStep("drop");
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the element step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, Element> Element ()
{
Bytecode.AddStep("element");
return Wrap<TStart, Element>(this);
}
/// <summary>
/// Adds the elementMap step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, IDictionary<object, TNewEnd>> ElementMap<TNewEnd> (params string?[] propertyKeys)
{
if (propertyKeys == null) throw new ArgumentNullException(nameof(propertyKeys));
var args = new List<object?>(0 + propertyKeys.Length);
args.AddRange(propertyKeys);
Bytecode.AddStep("elementMap", args.ToArray());
return Wrap<TStart, IDictionary<object, TNewEnd>>(this);
}
/// <summary>
/// Adds the emit step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Emit ()
{
Bytecode.AddStep("emit");
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the emit step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Emit (IPredicate emitPredicate)
{
Bytecode.AddStep("emit", emitPredicate);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the emit step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Emit (ITraversal emitTraversal)
{
Bytecode.AddStep("emit", emitTraversal);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the fail step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Fail ()
{
Bytecode.AddStep("fail");
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the fail step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Fail (string? msg)
{
Bytecode.AddStep("fail", msg);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the fail step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Fail (string? msg, IDictionary<string,object> m)
{
Bytecode.AddStep("fail", msg, m);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the filter step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Filter (IPredicate? predicate)
{
Bytecode.AddStep("filter", predicate);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the filter step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Filter (ITraversal filterTraversal)
{
Bytecode.AddStep("filter", filterTraversal);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the flatMap step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> FlatMap<TNewEnd> (IFunction? function)
{
Bytecode.AddStep("flatMap", function);
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the flatMap step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> FlatMap<TNewEnd> (ITraversal flatMapTraversal)
{
Bytecode.AddStep("flatMap", flatMapTraversal);
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the fold step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, IList<TEnd>> Fold ()
{
Bytecode.AddStep("fold");
return Wrap<TStart, IList<TEnd>>(this);
}
/// <summary>
/// Adds the fold step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Fold<TNewEnd> (TNewEnd seed, IBiFunction? foldFunction)
{
Bytecode.AddStep("fold", seed, foldFunction);
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the from step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> From (string? fromStepLabel)
{
Bytecode.AddStep("from", fromStepLabel);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the from step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> From (ITraversal fromVertex)
{
Bytecode.AddStep("from", fromVertex);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the from step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> From (Vertex? fromVertex)
{
Bytecode.AddStep("from", fromVertex);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the group step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, IDictionary<K, V>> Group<K, V> ()
{
Bytecode.AddStep("group");
return Wrap<TStart, IDictionary<K, V>>(this);
}
/// <summary>
/// Adds the group step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Group (string sideEffectKey)
{
Bytecode.AddStep("group", sideEffectKey);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the groupCount step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, IDictionary<K, long>> GroupCount<K> ()
{
Bytecode.AddStep("groupCount");
return Wrap<TStart, IDictionary<K, long>>(this);
}
/// <summary>
/// Adds the groupCount step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> GroupCount (string sideEffectKey)
{
Bytecode.AddStep("groupCount", sideEffectKey);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the has step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Has (string? propertyKey)
{
Bytecode.AddStep("has", propertyKey);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the has step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Has (string? propertyKey, object? value)
{
Bytecode.AddStep("has", propertyKey, value);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the has step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Has (string? propertyKey, P? predicate)
{
Bytecode.AddStep("has", propertyKey, predicate);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the has step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Has (string? label, string? propertyKey, object? value)
{
Bytecode.AddStep("has", label, propertyKey, value);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the has step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Has (string? label, string? propertyKey, P? predicate)
{
Bytecode.AddStep("has", label, propertyKey, predicate);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the has step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Has (string? propertyKey, ITraversal propertyTraversal)
{
Bytecode.AddStep("has", propertyKey, propertyTraversal);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the has step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Has (T accessor, object? value)
{
Bytecode.AddStep("has", accessor, value);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the has step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Has (T accessor, P? predicate)
{
Bytecode.AddStep("has", accessor, predicate);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the has step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Has (T accessor, ITraversal propertyTraversal)
{
Bytecode.AddStep("has", accessor, propertyTraversal);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the hasId step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> HasId (object? id, params object?[]? otherIds)
{
List<object?> args;
if (otherIds == null)
{
args = new List<object?> { id, null };
}
else
{
args = new List<object?>(1 + otherIds.Length) { id };
args.AddRange(otherIds);
}
Bytecode.AddStep("hasId", args.ToArray());
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the hasId step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> HasId (P? predicate)
{
Bytecode.AddStep("hasId", predicate);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the hasKey step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> HasKey (P? predicate)
{
Bytecode.AddStep("hasKey", predicate);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the hasKey step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> HasKey (string? label, params string?[]? otherLabels)
{
List<object?> args;
if (otherLabels == null)
{
args = new List<object?> { label, null };
}
else
{
args = new List<object?>(1 + otherLabels.Length) { label };
args.AddRange(otherLabels);
}
Bytecode.AddStep("hasKey", args.ToArray());
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the hasLabel step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> HasLabel (P? predicate)
{
Bytecode.AddStep("hasLabel", predicate);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the hasLabel step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> HasLabel (string? label, params string?[]? otherLabels)
{
List<object?> args;
if (otherLabels == null)
{
args = new List<object?> { label, null };
}
else
{
args = new List<object?>(1 + otherLabels.Length) { label };
args.AddRange(otherLabels);
}
Bytecode.AddStep("hasLabel", args.ToArray());
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the hasNot step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> HasNot (string? propertyKey)
{
Bytecode.AddStep("hasNot", propertyKey);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the hasValue step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> HasValue (object? value, params object?[]? otherValues)
{
List<object?> args;
if (otherValues == null)
{
args = new List<object?> { value, null };
}
else
{
args = new List<object?>(1 + otherValues.Length) { value };
args.AddRange(otherValues);
}
Bytecode.AddStep("hasValue", args.ToArray());
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the hasValue step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> HasValue (P? predicate)
{
Bytecode.AddStep("hasValue", predicate);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the id step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, object> Id ()
{
Bytecode.AddStep("id");
return Wrap<TStart, object>(this);
}
/// <summary>
/// Adds the identity step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Identity ()
{
Bytecode.AddStep("identity");
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the in step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, Vertex> In (params string?[] edgeLabels)
{
if (edgeLabels == null) throw new ArgumentNullException(nameof(edgeLabels));
var args = new List<object?>(edgeLabels.Length);
args.AddRange(edgeLabels);
Bytecode.AddStep("in", args.ToArray());
return Wrap<TStart, Vertex>(this);
}
/// <summary>
/// Adds the inE step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, Edge> InE (params string?[] edgeLabels)
{
if (edgeLabels == null) throw new ArgumentNullException(nameof(edgeLabels));
var args = new List<object?>(edgeLabels.Length);
args.AddRange(edgeLabels);
Bytecode.AddStep("inE", args.ToArray());
return Wrap<TStart, Edge>(this);
}
/// <summary>
/// Adds the inV step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, Vertex> InV ()
{
Bytecode.AddStep("inV");
return Wrap<TStart, Vertex>(this);
}
/// <summary>
/// Adds the index step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Index<TNewEnd> ()
{
Bytecode.AddStep("index");
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the inject step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Inject (params TEnd?[]? injections)
{
// null injections is treated as g.inject(null) meaning inject a single null traverser
if (injections == null)
{
Bytecode.AddStep("inject", new object?[] { null });
}
else
{
var args = new List<object?>(injections.Length);
args.AddRange(injections.Cast<object?>());
Bytecode.AddStep("inject", args.ToArray());
}
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the is step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Is (object? value)
{
Bytecode.AddStep("is", value);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the is step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Is (P? predicate)
{
Bytecode.AddStep("is", predicate);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the key step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, string> Key ()
{
Bytecode.AddStep("key");
return Wrap<TStart, string>(this);
}
/// <summary>
/// Adds the label step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, string> Label ()
{
Bytecode.AddStep("label");
return Wrap<TStart, string>(this);
}
/// <summary>
/// Adds the limit step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Limit<TNewEnd> (Scope scope, long limit)
{
Bytecode.AddStep("limit", scope, limit);
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the limit step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Limit<TNewEnd> (long limit)
{
Bytecode.AddStep("limit", limit);
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the local step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Local<TNewEnd> (ITraversal localTraversal)
{
Bytecode.AddStep("local", localTraversal);
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the loops step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, int> Loops ()
{
Bytecode.AddStep("loops");
return Wrap<TStart, int>(this);
}
/// <summary>
/// Adds the loops step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, int> Loops (string? loopName)
{
Bytecode.AddStep("loops", loopName);
return Wrap<TStart, int>(this);
}
/// <summary>
/// Adds the map step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Map<TNewEnd> (IFunction? function)
{
Bytecode.AddStep("map", function);
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the map step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Map<TNewEnd> (ITraversal mapTraversal)
{
Bytecode.AddStep("map", mapTraversal);
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the match step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, IDictionary<string, TNewEnd>> Match<TNewEnd> (params ITraversal[] matchTraversals)
{
if (matchTraversals == null) throw new ArgumentNullException(nameof(matchTraversals));
var args = new List<object>(matchTraversals.Length);
args.AddRange(matchTraversals);
Bytecode.AddStep("match", args.ToArray());
return Wrap<TStart, IDictionary<string, TNewEnd>>(this);
}
/// <summary>
/// Adds the math step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, double> Math (string expression)
{
Bytecode.AddStep("math", expression);
return Wrap<TStart, double>(this);
}
/// <summary>
/// Adds the max step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Max<TNewEnd> ()
{
Bytecode.AddStep("max");
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the max step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Max<TNewEnd> (Scope scope)
{
Bytecode.AddStep("max", scope);
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the mean step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Mean<TNewEnd> ()
{
Bytecode.AddStep("mean");
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the mean step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Mean<TNewEnd> (Scope scope)
{
Bytecode.AddStep("mean", scope);
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the mergeE step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, Edge> MergeE ()
{
Bytecode.AddStep("mergeE");
return Wrap<TStart, Edge>(this);
}
/// <summary>
/// Adds the mergeE step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, Edge> MergeE (IDictionary<object,object>? m)
{
Bytecode.AddStep("mergeE", m);
return Wrap<TStart, Edge>(this);
}
/// <summary>
/// Adds the mergeE step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, Edge> MergeE (ITraversal? t)
{
Bytecode.AddStep("mergeE", t);
return Wrap<TStart, Edge>(this);
}
/// <summary>
/// Adds the mergeV step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, Vertex> MergeV ()
{
Bytecode.AddStep("mergeV");
return Wrap<TStart, Vertex>(this);
}
/// <summary>
/// Adds the mergeV step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, Vertex> MergeV (IDictionary<object,object>? m)
{
Bytecode.AddStep("mergeV", m);
return Wrap<TStart, Vertex>(this);
}
/// <summary>
/// Adds the mergeV step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, Vertex> MergeV (ITraversal? t)
{
Bytecode.AddStep("mergeV", t);
return Wrap<TStart, Vertex>(this);
}
/// <summary>
/// Adds the min step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Min<TNewEnd> ()
{
Bytecode.AddStep("min");
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the min step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Min<TNewEnd> (Scope scope)
{
Bytecode.AddStep("min", scope);
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the none step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> None ()
{
Bytecode.AddStep("none");
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the not step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Not (ITraversal notTraversal)
{
Bytecode.AddStep("not", notTraversal);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the option step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Option (object pickToken, ITraversal? traversalOption)
{
Bytecode.AddStep("option", pickToken, traversalOption);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the option step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Option (object pickToken, IDictionary<object,object>? traversalOption)
{
Bytecode.AddStep("option", pickToken, traversalOption);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the option step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Option (ITraversal? traversalOption)
{
Bytecode.AddStep("option", traversalOption);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the optional step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Optional<TNewEnd> (ITraversal optionalTraversal)
{
Bytecode.AddStep("optional", optionalTraversal);
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the or step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Or (params ITraversal[] orTraversals)
{
if (orTraversals == null) throw new ArgumentNullException(nameof(orTraversals));
var args = new List<object>(orTraversals.Length);
args.AddRange(orTraversals);
Bytecode.AddStep("or", args.ToArray());
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the order step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Order ()
{
Bytecode.AddStep("order");
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the order step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Order (Scope scope)
{
Bytecode.AddStep("order", scope);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the otherV step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, Vertex> OtherV ()
{
Bytecode.AddStep("otherV");
return Wrap<TStart, Vertex>(this);
}
/// <summary>
/// Adds the out step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, Vertex> Out (params string?[] edgeLabels)
{
if (edgeLabels == null) throw new ArgumentNullException(nameof(edgeLabels));
var args = new List<object?>(edgeLabels.Length);
args.AddRange(edgeLabels);
Bytecode.AddStep("out", args.ToArray());
return Wrap<TStart, Vertex>(this);
}
/// <summary>
/// Adds the outE step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, Edge> OutE (params string?[] edgeLabels)
{
if (edgeLabels == null) throw new ArgumentNullException(nameof(edgeLabels));
var args = new List<object?>(edgeLabels.Length);
args.AddRange(edgeLabels);
Bytecode.AddStep("outE", args.ToArray());
return Wrap<TStart, Edge>(this);
}
/// <summary>
/// Adds the outV step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, Vertex> OutV ()
{
Bytecode.AddStep("outV");
return Wrap<TStart, Vertex>(this);
}
/// <summary>
/// Adds the pageRank step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> PageRank ()
{
Bytecode.AddStep("pageRank");
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the pageRank step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> PageRank (double alpha)
{
Bytecode.AddStep("pageRank", alpha);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the path step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, Path> Path ()
{
Bytecode.AddStep("path");
return Wrap<TStart, Path>(this);
}
/// <summary>
/// Adds the peerPressure step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> PeerPressure ()
{
Bytecode.AddStep("peerPressure");
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the profile step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Profile<TNewEnd> ()
{
Bytecode.AddStep("profile");
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the profile step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Profile (string sideEffectKey)
{
Bytecode.AddStep("profile", sideEffectKey);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the program step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Program (object vertexProgram)
{
Bytecode.AddStep("program", vertexProgram);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the project step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, IDictionary<string, TNewEnd>> Project<TNewEnd>(string? projectKey,
params string?[] otherProjectKeys)
{
// Using null as a key is allowed in Java, but we cannot support it in .NET as null is not allowed as a
// Dictionary key.
if (projectKey == null) throw new ArgumentNullException(nameof(projectKey));
if (otherProjectKeys == null) throw new ArgumentNullException(nameof(otherProjectKeys));
var args = new List<object?>(1 + otherProjectKeys.Length) { projectKey };
args.AddRange(otherProjectKeys);
Bytecode.AddStep("project", args.ToArray());
return Wrap<TStart, IDictionary<string, TNewEnd>>(this);
}
/// <summary>
/// Adds the properties step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Properties<TNewEnd> (params string?[] propertyKeys)
{
// Using null as a key is allowed in Java, but we cannot support it in .NET as null is not allowed as a
// Dictionary key.
if (propertyKeys == null) throw new ArgumentNullException(nameof(propertyKeys));
var args = new List<object?>(propertyKeys.Length);
args.AddRange(propertyKeys);
Bytecode.AddStep("properties", args.ToArray());
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the property step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Property(Cardinality cardinality, object? key, object? value,
params object?[] keyValues)
{
if (keyValues == null) throw new ArgumentNullException(nameof(keyValues));
var args = new List<object?>(3 + keyValues.Length) { cardinality, key, value };
args.AddRange(keyValues);
Bytecode.AddStep("property", args.ToArray());
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the property step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Property (object? key, object? value, params object?[] keyValues)
{
if (keyValues == null) throw new ArgumentNullException(nameof(keyValues));
var args = new List<object?>(2 + keyValues.Length) { key, value };
args.AddRange(keyValues);
Bytecode.AddStep("property", args.ToArray());
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the propertyMap step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, IDictionary<string, TNewEnd>> PropertyMap<TNewEnd> (params string?[] propertyKeys)
{
if (propertyKeys == null) throw new ArgumentNullException(nameof(propertyKeys));
var args = new List<object?>(propertyKeys.Length);
args.AddRange(propertyKeys);
Bytecode.AddStep("propertyMap", args.ToArray());
return Wrap<TStart, IDictionary<string, TNewEnd>>(this);
}
/// <summary>
/// Adds the range step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Range<TNewEnd> (Scope scope, long low, long high)
{
Bytecode.AddStep("range", scope, low, high);
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the range step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Range<TNewEnd> (long low, long high)
{
Bytecode.AddStep("range", low, high);
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the read step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Read ()
{
Bytecode.AddStep("read");
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the repeat step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Repeat (string loopName, ITraversal repeatTraversal)
{
Bytecode.AddStep("repeat", loopName, repeatTraversal);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the repeat step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Repeat (ITraversal repeatTraversal)
{
Bytecode.AddStep("repeat", repeatTraversal);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the sack step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Sack<TNewEnd> ()
{
Bytecode.AddStep("sack");
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the sack step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Sack (IBiFunction sackOperator)
{
Bytecode.AddStep("sack", sackOperator);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the sample step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Sample (Scope scope, int amountToSample)
{
Bytecode.AddStep("sample", scope, amountToSample);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the sample step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Sample (int amountToSample)
{
Bytecode.AddStep("sample", amountToSample);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the select step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, ICollection<TNewEnd>> Select<TNewEnd> (Column column)
{
Bytecode.AddStep("select", column);
return Wrap<TStart, ICollection<TNewEnd>>(this);
}
/// <summary>
/// Adds the select step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Select<TNewEnd> (Pop pop, string? selectKey)
{
Bytecode.AddStep("select", pop, selectKey);
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the select step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, IDictionary<string, TNewEnd>> Select<TNewEnd>(Pop pop, string? selectKey1,
string? selectKey2, params string?[] otherSelectKeys)
{
if (otherSelectKeys == null) throw new ArgumentNullException(nameof(otherSelectKeys));
var args = new List<object?>(3 + otherSelectKeys.Length) { pop, selectKey1, selectKey2 };
args.AddRange(otherSelectKeys);
Bytecode.AddStep("select", args.ToArray());
return Wrap<TStart, IDictionary<string, TNewEnd>>(this);
}
/// <summary>
/// Adds the select step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Select<TNewEnd> (Pop pop, ITraversal keyTraversal)
{
Bytecode.AddStep("select", pop, keyTraversal);
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the select step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Select<TNewEnd> (string? selectKey)
{
Bytecode.AddStep("select", selectKey);
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the select step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, IDictionary<string, TNewEnd>> Select<TNewEnd>(string? selectKey1,
string? selectKey2, params string?[] otherSelectKeys)
{
if (otherSelectKeys == null) throw new ArgumentNullException(nameof(otherSelectKeys));
var args = new List<object?>(2 + otherSelectKeys.Length) { selectKey1, selectKey2 };
args.AddRange(otherSelectKeys);
Bytecode.AddStep("select", args.ToArray());
return Wrap<TStart, IDictionary<string, TNewEnd>>(this);
}
/// <summary>
/// Adds the select step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Select<TNewEnd> (ITraversal keyTraversal)
{
Bytecode.AddStep("select", keyTraversal);
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the shortestPath step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, Path> ShortestPath ()
{
Bytecode.AddStep("shortestPath");
return Wrap<TStart, Path>(this);
}
/// <summary>
/// Adds the sideEffect step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> SideEffect (IConsumer? consumer)
{
Bytecode.AddStep("sideEffect", consumer);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the sideEffect step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> SideEffect (ITraversal sideEffectTraversal)
{
Bytecode.AddStep("sideEffect", sideEffectTraversal);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the simplePath step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> SimplePath ()
{
Bytecode.AddStep("simplePath");
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the skip step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Skip<TNewEnd> (Scope scope, long skip)
{
Bytecode.AddStep("skip", scope, skip);
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the skip step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Skip<TNewEnd> (long skip)
{
Bytecode.AddStep("skip", skip);
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the store step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Store (string sideEffectKey)
{
Bytecode.AddStep("store", sideEffectKey);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the subgraph step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, Edge> Subgraph (string sideEffectKey)
{
Bytecode.AddStep("subgraph", sideEffectKey);
return Wrap<TStart, Edge>(this);
}
/// <summary>
/// Adds the sum step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Sum<TNewEnd> ()
{
Bytecode.AddStep("sum");
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the sum step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Sum<TNewEnd> (Scope scope)
{
Bytecode.AddStep("sum", scope);
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the tail step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Tail<TNewEnd> ()
{
Bytecode.AddStep("tail");
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the tail step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Tail<TNewEnd> (Scope scope)
{
Bytecode.AddStep("tail", scope);
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the tail step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Tail<TNewEnd> (Scope scope, long limit)
{
Bytecode.AddStep("tail", scope, limit);
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the tail step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Tail<TNewEnd> (long limit)
{
Bytecode.AddStep("tail", limit);
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the timeLimit step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> TimeLimit (long timeLimit)
{
Bytecode.AddStep("timeLimit", timeLimit);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the times step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Times (int maxLoops)
{
Bytecode.AddStep("times", maxLoops);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the to step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, Vertex> To (Direction? direction, params string?[] edgeLabels)
{
if (edgeLabels == null) throw new ArgumentNullException(nameof(edgeLabels));
var args = new List<object?>(1 + edgeLabels.Length) { direction };
args.AddRange(edgeLabels);
Bytecode.AddStep("to", args.ToArray());
return Wrap<TStart, Vertex>(this);
}
/// <summary>
/// Adds the to step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> To (string? toStepLabel)
{
Bytecode.AddStep("to", toStepLabel);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the to step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> To (ITraversal toVertex)
{
Bytecode.AddStep("to", toVertex);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the to step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> To (Vertex? toVertex)
{
Bytecode.AddStep("to", toVertex);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the toE step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, Edge> ToE (Direction? direction, params string?[] edgeLabels)
{
if (edgeLabels == null) throw new ArgumentNullException(nameof(edgeLabels));
var args = new List<object?>(1 + edgeLabels.Length) {direction};
args.AddRange(edgeLabels);
Bytecode.AddStep("toE", args.ToArray());
return Wrap<TStart, Edge>(this);
}
/// <summary>
/// Adds the toV step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, Vertex> ToV (Direction? direction)
{
Bytecode.AddStep("toV", direction);
return Wrap<TStart, Vertex>(this);
}
/// <summary>
/// Adds the tree step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Tree<TNewEnd> ()
{
Bytecode.AddStep("tree");
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the tree step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Tree (string sideEffectKey)
{
Bytecode.AddStep("tree", sideEffectKey);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the unfold step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Unfold<TNewEnd> ()
{
Bytecode.AddStep("unfold");
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the union step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Union<TNewEnd> (params ITraversal[] unionTraversals)
{
if (unionTraversals == null) throw new ArgumentNullException(nameof(unionTraversals));
var args = new List<object>(unionTraversals.Length);
args.AddRange(unionTraversals);
Bytecode.AddStep("union", args.ToArray());
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the until step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Until (IPredicate untilPredicate)
{
Bytecode.AddStep("until", untilPredicate);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the until step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Until (ITraversal untilTraversal)
{
Bytecode.AddStep("until", untilTraversal);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the value step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Value<TNewEnd> ()
{
Bytecode.AddStep("value");
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the valueMap step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, IDictionary<TKey, TValue>> ValueMap<TKey, TValue> (params string?[] propertyKeys)
{
if (propertyKeys == null) throw new ArgumentNullException(nameof(propertyKeys));
var args = new List<object?>(propertyKeys.Length);
args.AddRange(propertyKeys);
Bytecode.AddStep("valueMap", args.ToArray());
return Wrap<TStart, IDictionary<TKey, TValue>>(this);
}
/// <summary>
/// Adds the valueMap step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, IDictionary<TKey, TValue>> ValueMap<TKey, TValue>(bool includeTokens,
params string?[] propertyKeys)
{
if (propertyKeys == null) throw new ArgumentNullException(nameof(propertyKeys));
var args = new List<object?>(1 + propertyKeys.Length) { includeTokens };
args.AddRange(propertyKeys);
Bytecode.AddStep("valueMap", args.ToArray());
return Wrap<TStart, IDictionary<TKey, TValue>>(this);
}
/// <summary>
/// Adds the values step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TNewEnd> Values<TNewEnd> (params string?[] propertyKeys)
{
if (propertyKeys == null) throw new ArgumentNullException(nameof(propertyKeys));
var args = new List<object?>(propertyKeys.Length);
args.AddRange(propertyKeys);
Bytecode.AddStep("values", args.ToArray());
return Wrap<TStart, TNewEnd>(this);
}
/// <summary>
/// Adds the where step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Where (P predicate)
{
Bytecode.AddStep("where", predicate);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the where step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Where (string startKey, P predicate)
{
Bytecode.AddStep("where", startKey, predicate);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the where step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Where (ITraversal whereTraversal)
{
Bytecode.AddStep("where", whereTraversal);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the with step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> With (string key)
{
Bytecode.AddStep("with", key);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the with step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> With (string key, object? value)
{
Bytecode.AddStep("with", key, value);
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Adds the write step to this <see cref="GraphTraversal{SType, EType}" />.
/// </summary>
public GraphTraversal<TStart, TEnd> Write ()
{
Bytecode.AddStep("write");
return Wrap<TStart, TEnd>(this);
}
/// <summary>
/// Make a copy of a traversal that is reset for iteration.
/// </summary>
public GraphTraversal<TStart, TEnd> Clone()
{
return new GraphTraversal<TStart, TEnd>(TraversalStrategies, new Bytecode(Bytecode));
}
}
}