[
https://issues.apache.org/jira/browse/TINKERPOP-2789?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Bill Poole closed TINKERPOP-2789.
---------------------------------
Resolution: Workaround
Gremlin.Net works as expected when using a List<T> instead of an array T[].
> Gremlin.Net cannot distinguish between an array parameter and a parameter
> array
> -------------------------------------------------------------------------------
>
> Key: TINKERPOP-2789
> URL: https://issues.apache.org/jira/browse/TINKERPOP-2789
> Project: TinkerPop
> Issue Type: Bug
> Components: dotnet
> Affects Versions: 3.6.1
> Reporter: Bill Poole
> Priority: Major
>
> When an array is passed to a step (e.g., "inject(array)"), Gremlin.Net always
> "flattens" the array into separate parameters, assuming it is a parameter
> list (e.g., "inject(p1, p2, p3, ...)").
> This means that traversals in Gremlin.Net are not strictly correct when
> passing an array parameter. For example, this traversal below should actually
> require an "unfold" step:
> {code:java}
> await g.Inject<object>(array).Promise(t => t.ToList()); {code}
> i.e., it should be:
> {code:java}
> await g.Inject<object>(array).Unfold<object>().Promise(t => t.ToList());
> {code}
> This means that certain traversals like in the [Long
> Traversals|https://tinkerpop.apache.org/docs/current/recipes/#long-traversals]
> recipe shown below do not work in Gremlin.Net because the "unfold" step
> needs to be removed.
> {code:java}
> g.withSideEffect("rels", relations).
> inject(persons).sideEffect(
> unfold().
> addV("person").
> property(id, select("id")).
> property("name", select("name")).
> property("age", select("age")).
> group("m").
> by(id).
> by(unfold())).
> select("rels").unfold().as("r").
> addE("knows").
> from(select("m").select(select("r").select("from"))).
> to(select("m").select(select("r").select("to"))).
> property("since", select("since")).iterate() {code}
> I recognize that the C# language doesn't allow method overloads to
> distinguish between an array parameter and a params array. But as it stands,
> it is impossible to pass an array parameter to a step, so I think this needs
> to be remedied somehow.
> One possible solution could be for steps that accept a params array (like
> "inject") to inspect the given type parameter to determine if it is an
> array/list/collection and if so, recognize that the parameter being passed is
> an array. An extra bool parameter could then be passed to the
> Bytecode.AddStep method to specify whether the parameter being passed should
> be "flattened", which should only be the case if the parameter passed to the
> step (like "inject") was _not_ an array/list/collection - i.e., it was a
> params array.
> This same solution could also address the issue with
> GraphTraversalSource.WithSideEffect, where if an array parameter is passed,
> the Bytecode.AddSource method incorrectly flattens the array elements into
> separate parameters, which causes the server to throw an exception because
> its seeing "withSideEffect" being invoked with more parameters than expected.
>
--
This message was sent by Atlassian Jira
(v8.20.10#820010)