You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tinkerpop.apache.org by "Bill Poole (Jira)" <ji...@apache.org> on 2022/09/06 07:38:00 UTC

[jira] [Closed] (TINKERPOP-2789) Gremlin.Net cannot distinguish between an array parameter and a parameter array

     [ 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)