[ 
https://issues.apache.org/jira/browse/TINKERPOP-2342?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Florian G updated TINKERPOP-2342:
---------------------------------
    Description: 
The implementation of {{IncidentToAdjacentStrategy}} replaces steps from V to E 
followed by a step from E to V by a single step from V to V. In order to avoid 
touching parts of the query which may not be reordered, this strategy marks 
certain steps with a special label.

In some cases however, these labels are pushed to other steps by the 
FilterRankingStrategy. As a consequence, the IncidentToAdjacentStrategy does 
not behave as expected anymore.

See the following example:
 Assume a graph consisting of a single Vertex {{v}} connected to itself by an 
edge with the property {{dist = 10}}.
{code:java}
g.V().repeat(outE().has("dist", 10).inV().outE().inV().sideEffect{i = 
0}).times(1).path()
{code}
 - The {{sideEffect}} step just sets a dummy variable and is necessary to cause 
the problem.
 - The {{has}} step has no semantic effect of filtering but is necessary to 
cause the problem as well.
 - The {{path}} step shows how the output differs from the expected output.

One would expect a result like:
{code:java}
path[v[1], e[2][1->label->1], v[1], e[2][1->label->1], v[1]]
{code}
But the actual result is:
{code:java}
path[v[1], e[2][1->label->1], v[1], v[1]]
{code}
Let's call {{explain()}} on the above query to see why this happens:
{code:java}
==>Traversal Explanation
=================================================================================================================================================================================================================================================================================================
Original Traversal                          [GraphStep(vertex,[]), 
RepeatStep([VertexStep(OUT,edge), HasStep([dist.eq(10)]),  EdgeVertexStep(IN), 
VertexStep(OUT,edge), EdgeVertexStep(IN), LambdaSideEffectStep(lambda),  
RepeatEndStep],until(loops(1)),emit(false)), PathStep]

ConnectiveStrategy                    [D]   [GraphStep(vertex,[]), 
RepeatStep([VertexStep(OUT,edge), HasStep([dist.eq(10)]), EdgeVertexStep(IN), 
VertexStep(OUT,edge), EdgeVertexStep(IN), LambdaSideEffectStep(lambda), 
RepeatEndStep],until(loops(1)),emit(false)), PathStep]
EarlyLimitStrategy                    [O]   [GraphStep(vertex,[]), 
RepeatStep([VertexStep(OUT,edge), HasStep([dist.eq(10)]), EdgeVertexStep(IN), 
VertexStep(OUT,edge), EdgeVertexStep(IN), LambdaSideEffectStep(lambda), 
RepeatEndStep],until(loops(1)),emit(false)), PathStep]
MatchPredicateStrategy                [O]   [GraphStep(vertex,[]), 
RepeatStep([VertexStep(OUT,edge), HasStep([dist.eq(10)]), EdgeVertexStep(IN), 
VertexStep(OUT,edge), EdgeVertexStep(IN), LambdaSideEffectStep(lambda), 
RepeatEndStep],until(loops(1)),emit(false)), PathStep]
FilterRankingStrategy                 [O]   [GraphStep(vertex,[]), 
RepeatStep([VertexStep(OUT,edge), HasStep([dist.eq(10)]), EdgeVertexStep(IN), 
VertexStep(OUT,edge), EdgeVertexStep(IN), LambdaSideEffectStep(lambda), 
RepeatEndStep],until(loops(1)),emit(false)), PathStep]
InlineFilterStrategy                  [O]   [GraphStep(vertex,[]), 
RepeatStep([VertexStep(OUT,edge), HasStep([dist.eq(10)]), EdgeVertexStep(IN), 
VertexStep(OUT,edge), EdgeVertexStep(IN), LambdaSideEffectStep(lambda), 
RepeatEndStep],until(loops(1)),emit(false)), PathStep]
RepeatUnrollStrategy                  [O]   [GraphStep(vertex,[]), 
RepeatStep([VertexStep(OUT,edge), HasStep([dist.eq(10)]), EdgeVertexStep(IN), 
VertexStep(OUT,edge), EdgeVertexStep(IN), LambdaSideEffectStep(lambda), 
RepeatEndStep],until(loops(1)),emit(false)), PathStep]
IncidentToAdjacentStrategy            [O]   [GraphStep(vertex,[]), 
RepeatStep([VertexStep(OUT,edge), 
HasStep([dist.eq(10)])@[~gremlin.incidentToAdjacent], EdgeVertexStep(IN), 
VertexStep(OUT,vertex), LambdaSideEffectStep(lambda), 
RepeatEndStep],until(loops(1)),emit(false)), PathStep]
CountStrategy                         [O]   [GraphStep(vertex,[]), 
RepeatStep([VertexStep(OUT,edge), 
HasStep([dist.eq(10)])@[~gremlin.incidentToAdjacent], EdgeVertexStep(IN), 
VertexStep(OUT,vertex), LambdaSideEffectStep(lambda), 
RepeatEndStep],until(loops(1)),emit(false)), PathStep]
PathRetractionStrategy                [O]   [GraphStep(vertex,[]), 
RepeatStep([VertexStep(OUT,edge), 
HasStep([dist.eq(10)])@[~gremlin.incidentToAdjacent], EdgeVertexStep(IN), 
VertexStep(OUT,vertex), LambdaSideEffectStep(lambda), 
RepeatEndStep],until(loops(1)),emit(false)), PathStep]
AdjacentToIncidentStrategy            [O]   [GraphStep(vertex,[]), 
RepeatStep([VertexStep(OUT,edge), 
HasStep([dist.eq(10)])@[~gremlin.incidentToAdjacent], EdgeVertexStep(IN), 
VertexStep(OUT,vertex), LambdaSideEffectStep(lambda), 
RepeatEndStep],until(loops(1)),emit(false)), PathStep]
LazyBarrierStrategy                   [O]   [GraphStep(vertex,[]), 
RepeatStep([VertexStep(OUT,edge), 
HasStep([dist.eq(10)])@[~gremlin.incidentToAdjacent], EdgeVertexStep(IN), 
VertexStep(OUT,vertex), LambdaSideEffectStep(lambda), 
RepeatEndStep],until(loops(1)),emit(false)), PathStep]
AdjacentVertexFilterOptimizerStrategy [P]   [GraphStep(vertex,[]), 
RepeatStep([VertexStep(OUT,edge), 
HasStep([dist.eq(10)])@[~gremlin.incidentToAdjacent], EdgeVertexStep(IN), 
VertexStep(OUT,vertex), LambdaSideEffectStep(lambda), 
RepeatEndStep],until(loops(1)),emit(false)), PathStep]
JanusGraphLocalQueryOptimizerStrategy [P]   [GraphStep(vertex,[]), 
RepeatStep([JanusGraphVertexStep([dist.eq(10)])@[~gremlin.incidentToAdjacent], 
EdgeVertexStep(IN), JanusGraphVertexStep(OUT,vertex), 
LambdaSideEffectStep(lambda), RepeatEndStep],until(loops(1)),emit(false)), 
PathStep]
JanusGraphStepStrategy                [P]   [JanusGraphStep(vertex,[]), 
RepeatStep([JanusGraphVertexStep([dist.eq(10)])@[~gremlin.incidentToAdjacent], 
EdgeVertexStep(IN), JanusGraphVertexStep(OUT,vertex), 
LambdaSideEffectStep(lambda), RepeatEndStep],until(loops(1)),emit(false)), 
PathStep]
JanusGraphIoRegistrationStrategy      [P]   [JanusGraphStep(vertex,[]), 
RepeatStep([JanusGraphVertexStep([dist.eq(10)])@[~gremlin.incidentToAdjacent], 
EdgeVertexStep(IN), JanusGraphVertexStep(OUT,vertex), 
LambdaSideEffectStep(lambda), RepeatEndStep],until(loops(1)),emit(false)), 
PathStep]
ProfileStrategy                       [F]   [JanusGraphStep(vertex,[]), 
RepeatStep([JanusGraphVertexStep([dist.eq(10)])@[~gremlin.incidentToAdjacent], 
EdgeVertexStep(IN), JanusGraphVertexStep(OUT,vertex), 
LambdaSideEffectStep(lambda), RepeatEndStep],until(loops(1)),emit(false)), 
PathStep]
StandardVerificationStrategy          [V]   [JanusGraphStep(vertex,[]), 
RepeatStep([JanusGraphVertexStep([dist.eq(10)]), EdgeVertexStep(IN), 
JanusGraphVertexStep(OUT,vertex), LambdaSideEffectStep(lambda), 
RepeatEndStep],until(loops(1)),emit(false)), PathStep]

Final Traversal                             [JanusGraphStep(vertex,[]), 
RepeatStep([JanusGraphVertexStep([dist.eq(10)]), EdgeVertexStep(IN), 
JanusGraphVertexStep(OUT,vertex), LambdaSideEffectStep(lambda), 
RepeatEndStep],until(loops(1)),emit(false)), PathStep]
{code}
As one can see, after the IncidentToAdjacentStrategy call, there exists a 
hidden label on the HasStep. This label was originally placed on the preceeding 
VertexStep by the IncidentToAdjacentStrategy in order to avoid optimizations on 
the inner part of the query. However, an intermediate call of the 
FilterRankingStrategy pushes this label one step to the right, which causes the 
IncidentToAdjacentStrategy to "forget" it's restrictions.
 Consequently, the query is in optimized by mistake.

Just for comparison: If the sideEffect step is removed, the query returns the 
expected result.

  was:
The implementation of {{IncidentToAdjacentStrategy}} replaces steps from V to E 
followed by a step from E to V by a single step from V to V. In order to avoid 
touching parts of the query which may not be reordered, this strategy marks 
certain steps with a special label.

In some cases however, these labels are pushed to other steps by the 
FilterRankingStrategy. As a consequence, the IncidentToAdjacentStrategy does 
not behave as expected anymore.

See the following example:
 Assume a graph consisting of a single Vertex {{v}} connected to itself by an 
edge with the property {{dist = 10}}.
{code:java}
g.V().repeat(outE().has("dist", 10).inV().outE().inV().sideEffect{i = 
0}).times(1).path()
{code}
 - The {{sideEffect}} step just sets a dummy variable and is necessary to cause 
the problem.
 - The {{has}} step has no semantic effect of filtering but is necessary to 
cause the problem as well.
 - The {{path}} step shows how the output differs from the expected output.

One would expect a result like:
{code:java}
path[v[1], e[2][1->label->1], v[1], e[2][1->label->1], v[1]]
{code}
But the actual result is:
{code:java}
path[v[1], e[2][1->label->1], v[1], v[1]]
{code}
Let's call {{explain()}} on the above query to see why this happens:
{code:java}
==>Traversal Explanation
=================================================================================================================================================================================================================================================================================================
Original Traversal                          [GraphStep(vertex,[]), 
RepeatStep([VertexStep(OUT,edge), HasStep([dist.eq(10)]),  EdgeVertexStep(IN), 
VertexStep(OUT,edge), EdgeVertexStep(IN), LambdaSideEffectStep(lambda),  
RepeatEndStep],until(loops(1)),emit(false)), PathStep]

ConnectiveStrategy                    [D]   [GraphStep(vertex,[]), 
RepeatStep([VertexStep(OUT,edge), HasStep([dist.eq(10)]), EdgeVertexStep(IN), 
VertexStep(OUT,edge), EdgeVertexStep(IN), LambdaSideEffectStep(lambda), 
RepeatEndStep],until(loops(1)),emit(false)), PathStep]
EarlyLimitStrategy                    [O]   [GraphStep(vertex,[]), 
RepeatStep([VertexStep(OUT,edge), HasStep([dist.eq(10)]), EdgeVertexStep(IN), 
VertexStep(OUT,edge), EdgeVertexStep(IN), LambdaSideEffectStep(lambda), 
RepeatEndStep],until(loops(1)),emit(false)), PathStep]
MatchPredicateStrategy                [O]   [GraphStep(vertex,[]), 
RepeatStep([VertexStep(OUT,edge), HasStep([dist.eq(10)]), EdgeVertexStep(IN), 
VertexStep(OUT,edge), EdgeVertexStep(IN), LambdaSideEffectStep(lambda), 
RepeatEndStep],until(loops(1)),emit(false)), PathStep]
FilterRankingStrategy                 [O]   [GraphStep(vertex,[]), 
RepeatStep([VertexStep(OUT,edge), HasStep([dist.eq(10)]), EdgeVertexStep(IN), 
VertexStep(OUT,edge), EdgeVertexStep(IN), LambdaSideEffectStep(lambda), 
RepeatEndStep],until(loops(1)),emit(false)), PathStep]
InlineFilterStrategy                  [O]   [GraphStep(vertex,[]), 
RepeatStep([VertexStep(OUT,edge), HasStep([dist.eq(10)]), EdgeVertexStep(IN), 
VertexStep(OUT,edge), EdgeVertexStep(IN), LambdaSideEffectStep(lambda), 
RepeatEndStep],until(loops(1)),emit(false)), PathStep]
RepeatUnrollStrategy                  [O]   [GraphStep(vertex,[]), 
RepeatStep([VertexStep(OUT,edge), HasStep([dist.eq(10)]), EdgeVertexStep(IN), 
VertexStep(OUT,edge), EdgeVertexStep(IN), LambdaSideEffectStep(lambda), 
RepeatEndStep],until(loops(1)),emit(false)), PathStep]
IncidentToAdjacentStrategy            [O]   [GraphStep(vertex,[]), 
RepeatStep([VertexStep(OUT,edge), 
HasStep([dist.eq(10)])@[~gremlin.incidentToAdjacent], EdgeVertexStep(IN), 
VertexStep(OUT,vertex), LambdaSideEffectStep(lambda), 
RepeatEndStep],until(loops(1)),emit(false)), PathStep]
CountStrategy                         [O]   [GraphStep(vertex,[]), 
RepeatStep([VertexStep(OUT,edge), 
HasStep([dist.eq(10)])@[~gremlin.incidentToAdjacent], EdgeVertexStep(IN), 
VertexStep(OUT,vertex), LambdaSideEffectStep(lambda), 
RepeatEndStep],until(loops(1)),emit(false)), PathStep]
PathRetractionStrategy                [O]   [GraphStep(vertex,[]), 
RepeatStep([VertexStep(OUT,edge), 
HasStep([dist.eq(10)])@[~gremlin.incidentToAdjacent], EdgeVertexStep(IN), 
VertexStep(OUT,vertex), LambdaSideEffectStep(lambda), 
RepeatEndStep],until(loops(1)),emit(false)), PathStep]
AdjacentToIncidentStrategy            [O]   [GraphStep(vertex,[]), 
RepeatStep([VertexStep(OUT,edge), 
HasStep([dist.eq(10)])@[~gremlin.incidentToAdjacent], EdgeVertexStep(IN), 
VertexStep(OUT,vertex), LambdaSideEffectStep(lambda), 
RepeatEndStep],until(loops(1)),emit(false)), PathStep]
LazyBarrierStrategy                   [O]   [GraphStep(vertex,[]), 
RepeatStep([VertexStep(OUT,edge), 
HasStep([dist.eq(10)])@[~gremlin.incidentToAdjacent], EdgeVertexStep(IN), 
VertexStep(OUT,vertex), LambdaSideEffectStep(lambda), 
RepeatEndStep],until(loops(1)),emit(false)), PathStep]
AdjacentVertexFilterOptimizerStrategy [P]   [GraphStep(vertex,[]), 
RepeatStep([VertexStep(OUT,edge), 
HasStep([dist.eq(10)])@[~gremlin.incidentToAdjacent], EdgeVertexStep(IN), 
VertexStep(OUT,vertex), LambdaSideEffectStep(lambda), 
RepeatEndStep],until(loops(1)),emit(false)), PathStep]
JanusGraphLocalQueryOptimizerStrategy [P]   [GraphStep(vertex,[]), 
RepeatStep([JanusGraphVertexStep([dist.eq(10)])@[~gremlin.incidentToAdjacent], 
EdgeVertexStep(IN), JanusGraphVertexStep(OUT,vertex), 
LambdaSideEffectStep(lambda), RepeatEndStep],until(loops(1)),emit(false)), 
PathStep]
JanusGraphStepStrategy                [P]   [JanusGraphStep(vertex,[]), 
RepeatStep([JanusGraphVertexStep([dist.eq(10)])@[~gremlin.incidentToAdjacent], 
EdgeVertexStep(IN), JanusGraphVertexStep(OUT,vertex), 
LambdaSideEffectStep(lambda), RepeatEndStep],until(loops(1)),emit(false)), 
PathStep]
JanusGraphIoRegistrationStrategy      [P]   [JanusGraphStep(vertex,[]), 
RepeatStep([JanusGraphVertexStep([dist.eq(10)])@[~gremlin.incidentToAdjacent], 
EdgeVertexStep(IN), JanusGraphVertexStep(OUT,vertex), 
LambdaSideEffectStep(lambda), RepeatEndStep],until(loops(1)),emit(false)), 
PathStep]
ProfileStrategy                       [F]   [JanusGraphStep(vertex,[]), 
RepeatStep([JanusGraphVertexStep([dist.eq(10)])@[~gremlin.incidentToAdjacent], 
EdgeVertexStep(IN), JanusGraphVertexStep(OUT,vertex), 
LambdaSideEffectStep(lambda), RepeatEndStep],until(loops(1)),emit(false)), 
PathStep]
StandardVerificationStrategy          [V]   [JanusGraphStep(vertex,[]), 
RepeatStep([JanusGraphVertexStep([dist.eq(10)]), EdgeVertexStep(IN), 
JanusGraphVertexStep(OUT,vertex), LambdaSideEffectStep(lambda), 
RepeatEndStep],until(loops(1)),emit(false)), PathStep]

Final Traversal                             [JanusGraphStep(vertex,[]), 
RepeatStep([JanusGraphVertexStep([dist.eq(10)]), EdgeVertexStep(IN), 
JanusGraphVertexStep(OUT,vertex), LambdaSideEffectStep(lambda), 
RepeatEndStep],until(loops(1)),emit(false)), PathStep]
{code}
AS one can see, after the IncidentToAdjacentStrategy call, there exists a 
hidden label on the HasStep. This label was originally placed on the preceeding 
VertexStep by the IncidentToAdjacentStrategy in order to avoid optimizations on 
the inner part of the query. However, an intermediate call of the 
FilterRankingStrategy pushes this label one step to the right, which causes the 
IncidentToAdjacentStrategy to "forget" it's restrictions.
 Consequently, the query is in optimized by mistake.

Just for comparison: If the sideEffect step is removed, the query returns the 
expected result.


> FilterRankingStrategy interferes with IncidentToAdjacentStrategy
> ----------------------------------------------------------------
>
>                 Key: TINKERPOP-2342
>                 URL: https://issues.apache.org/jira/browse/TINKERPOP-2342
>             Project: TinkerPop
>          Issue Type: Bug
>          Components: process
>    Affects Versions: 3.4.4
>            Reporter: Florian G
>            Priority: Minor
>         Attachments: explain.txt
>
>
> The implementation of {{IncidentToAdjacentStrategy}} replaces steps from V to 
> E followed by a step from E to V by a single step from V to V. In order to 
> avoid touching parts of the query which may not be reordered, this strategy 
> marks certain steps with a special label.
> In some cases however, these labels are pushed to other steps by the 
> FilterRankingStrategy. As a consequence, the IncidentToAdjacentStrategy does 
> not behave as expected anymore.
> See the following example:
>  Assume a graph consisting of a single Vertex {{v}} connected to itself by an 
> edge with the property {{dist = 10}}.
> {code:java}
> g.V().repeat(outE().has("dist", 10).inV().outE().inV().sideEffect{i = 
> 0}).times(1).path()
> {code}
>  - The {{sideEffect}} step just sets a dummy variable and is necessary to 
> cause the problem.
>  - The {{has}} step has no semantic effect of filtering but is necessary to 
> cause the problem as well.
>  - The {{path}} step shows how the output differs from the expected output.
> One would expect a result like:
> {code:java}
> path[v[1], e[2][1->label->1], v[1], e[2][1->label->1], v[1]]
> {code}
> But the actual result is:
> {code:java}
> path[v[1], e[2][1->label->1], v[1], v[1]]
> {code}
> Let's call {{explain()}} on the above query to see why this happens:
> {code:java}
> ==>Traversal Explanation
> =================================================================================================================================================================================================================================================================================================
> Original Traversal                          [GraphStep(vertex,[]), 
> RepeatStep([VertexStep(OUT,edge), HasStep([dist.eq(10)]),  
> EdgeVertexStep(IN), VertexStep(OUT,edge), EdgeVertexStep(IN), 
> LambdaSideEffectStep(lambda),  RepeatEndStep],until(loops(1)),emit(false)), 
> PathStep]
> ConnectiveStrategy                    [D]   [GraphStep(vertex,[]), 
> RepeatStep([VertexStep(OUT,edge), HasStep([dist.eq(10)]), EdgeVertexStep(IN), 
> VertexStep(OUT,edge), EdgeVertexStep(IN), LambdaSideEffectStep(lambda), 
> RepeatEndStep],until(loops(1)),emit(false)), PathStep]
> EarlyLimitStrategy                    [O]   [GraphStep(vertex,[]), 
> RepeatStep([VertexStep(OUT,edge), HasStep([dist.eq(10)]), EdgeVertexStep(IN), 
> VertexStep(OUT,edge), EdgeVertexStep(IN), LambdaSideEffectStep(lambda), 
> RepeatEndStep],until(loops(1)),emit(false)), PathStep]
> MatchPredicateStrategy                [O]   [GraphStep(vertex,[]), 
> RepeatStep([VertexStep(OUT,edge), HasStep([dist.eq(10)]), EdgeVertexStep(IN), 
> VertexStep(OUT,edge), EdgeVertexStep(IN), LambdaSideEffectStep(lambda), 
> RepeatEndStep],until(loops(1)),emit(false)), PathStep]
> FilterRankingStrategy                 [O]   [GraphStep(vertex,[]), 
> RepeatStep([VertexStep(OUT,edge), HasStep([dist.eq(10)]), EdgeVertexStep(IN), 
> VertexStep(OUT,edge), EdgeVertexStep(IN), LambdaSideEffectStep(lambda), 
> RepeatEndStep],until(loops(1)),emit(false)), PathStep]
> InlineFilterStrategy                  [O]   [GraphStep(vertex,[]), 
> RepeatStep([VertexStep(OUT,edge), HasStep([dist.eq(10)]), EdgeVertexStep(IN), 
> VertexStep(OUT,edge), EdgeVertexStep(IN), LambdaSideEffectStep(lambda), 
> RepeatEndStep],until(loops(1)),emit(false)), PathStep]
> RepeatUnrollStrategy                  [O]   [GraphStep(vertex,[]), 
> RepeatStep([VertexStep(OUT,edge), HasStep([dist.eq(10)]), EdgeVertexStep(IN), 
> VertexStep(OUT,edge), EdgeVertexStep(IN), LambdaSideEffectStep(lambda), 
> RepeatEndStep],until(loops(1)),emit(false)), PathStep]
> IncidentToAdjacentStrategy            [O]   [GraphStep(vertex,[]), 
> RepeatStep([VertexStep(OUT,edge), 
> HasStep([dist.eq(10)])@[~gremlin.incidentToAdjacent], EdgeVertexStep(IN), 
> VertexStep(OUT,vertex), LambdaSideEffectStep(lambda), 
> RepeatEndStep],until(loops(1)),emit(false)), PathStep]
> CountStrategy                         [O]   [GraphStep(vertex,[]), 
> RepeatStep([VertexStep(OUT,edge), 
> HasStep([dist.eq(10)])@[~gremlin.incidentToAdjacent], EdgeVertexStep(IN), 
> VertexStep(OUT,vertex), LambdaSideEffectStep(lambda), 
> RepeatEndStep],until(loops(1)),emit(false)), PathStep]
> PathRetractionStrategy                [O]   [GraphStep(vertex,[]), 
> RepeatStep([VertexStep(OUT,edge), 
> HasStep([dist.eq(10)])@[~gremlin.incidentToAdjacent], EdgeVertexStep(IN), 
> VertexStep(OUT,vertex), LambdaSideEffectStep(lambda), 
> RepeatEndStep],until(loops(1)),emit(false)), PathStep]
> AdjacentToIncidentStrategy            [O]   [GraphStep(vertex,[]), 
> RepeatStep([VertexStep(OUT,edge), 
> HasStep([dist.eq(10)])@[~gremlin.incidentToAdjacent], EdgeVertexStep(IN), 
> VertexStep(OUT,vertex), LambdaSideEffectStep(lambda), 
> RepeatEndStep],until(loops(1)),emit(false)), PathStep]
> LazyBarrierStrategy                   [O]   [GraphStep(vertex,[]), 
> RepeatStep([VertexStep(OUT,edge), 
> HasStep([dist.eq(10)])@[~gremlin.incidentToAdjacent], EdgeVertexStep(IN), 
> VertexStep(OUT,vertex), LambdaSideEffectStep(lambda), 
> RepeatEndStep],until(loops(1)),emit(false)), PathStep]
> AdjacentVertexFilterOptimizerStrategy [P]   [GraphStep(vertex,[]), 
> RepeatStep([VertexStep(OUT,edge), 
> HasStep([dist.eq(10)])@[~gremlin.incidentToAdjacent], EdgeVertexStep(IN), 
> VertexStep(OUT,vertex), LambdaSideEffectStep(lambda), 
> RepeatEndStep],until(loops(1)),emit(false)), PathStep]
> JanusGraphLocalQueryOptimizerStrategy [P]   [GraphStep(vertex,[]), 
> RepeatStep([JanusGraphVertexStep([dist.eq(10)])@[~gremlin.incidentToAdjacent],
>  EdgeVertexStep(IN), JanusGraphVertexStep(OUT,vertex), 
> LambdaSideEffectStep(lambda), RepeatEndStep],until(loops(1)),emit(false)), 
> PathStep]
> JanusGraphStepStrategy                [P]   [JanusGraphStep(vertex,[]), 
> RepeatStep([JanusGraphVertexStep([dist.eq(10)])@[~gremlin.incidentToAdjacent],
>  EdgeVertexStep(IN), JanusGraphVertexStep(OUT,vertex), 
> LambdaSideEffectStep(lambda), RepeatEndStep],until(loops(1)),emit(false)), 
> PathStep]
> JanusGraphIoRegistrationStrategy      [P]   [JanusGraphStep(vertex,[]), 
> RepeatStep([JanusGraphVertexStep([dist.eq(10)])@[~gremlin.incidentToAdjacent],
>  EdgeVertexStep(IN), JanusGraphVertexStep(OUT,vertex), 
> LambdaSideEffectStep(lambda), RepeatEndStep],until(loops(1)),emit(false)), 
> PathStep]
> ProfileStrategy                       [F]   [JanusGraphStep(vertex,[]), 
> RepeatStep([JanusGraphVertexStep([dist.eq(10)])@[~gremlin.incidentToAdjacent],
>  EdgeVertexStep(IN), JanusGraphVertexStep(OUT,vertex), 
> LambdaSideEffectStep(lambda), RepeatEndStep],until(loops(1)),emit(false)), 
> PathStep]
> StandardVerificationStrategy          [V]   [JanusGraphStep(vertex,[]), 
> RepeatStep([JanusGraphVertexStep([dist.eq(10)]), EdgeVertexStep(IN), 
> JanusGraphVertexStep(OUT,vertex), LambdaSideEffectStep(lambda), 
> RepeatEndStep],until(loops(1)),emit(false)), PathStep]
> Final Traversal                             [JanusGraphStep(vertex,[]), 
> RepeatStep([JanusGraphVertexStep([dist.eq(10)]), EdgeVertexStep(IN), 
> JanusGraphVertexStep(OUT,vertex), LambdaSideEffectStep(lambda), 
> RepeatEndStep],until(loops(1)),emit(false)), PathStep]
> {code}
> As one can see, after the IncidentToAdjacentStrategy call, there exists a 
> hidden label on the HasStep. This label was originally placed on the 
> preceeding VertexStep by the IncidentToAdjacentStrategy in order to avoid 
> optimizations on the inner part of the query. However, an intermediate call 
> of the FilterRankingStrategy pushes this label one step to the right, which 
> causes the IncidentToAdjacentStrategy to "forget" it's restrictions.
>  Consequently, the query is in optimized by mistake.
> Just for comparison: If the sideEffect step is removed, the query returns the 
> expected result.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to