Github user GCHQResearcher1337 commented on a diff in the pull request:

    https://github.com/apache/tinkerpop/pull/876#discussion_r202452106
  
    --- Diff: 
gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_LP_NL_O_P_S_SE_SL_Traverser.java
 ---
    @@ -0,0 +1,156 @@
    +/*
    + * 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.
    + */
    +package org.apache.tinkerpop.gremlin.process.traversal.traverser;
    +
    +import org.apache.commons.collections.map.ReferenceMap;
    +import org.apache.tinkerpop.gremlin.process.traversal.Step;
    +import 
org.apache.tinkerpop.gremlin.process.traversal.traverser.util.LabelledCounter;
    +
    +
    +import java.util.Iterator;
    +import java.util.Stack;
    +
    +public class B_LP_NL_O_P_S_SE_SL_Traverser<T> extends 
B_LP_O_P_S_SE_SL_Traverser<T> {
    +
    +    protected Stack<LabelledCounter> nestedLoops;
    +    protected ReferenceMap loopNames = null;
    --- End diff --
    
    Sure. So the loop stack is a stack of LabelledCounters which store the 
stepId and the loop counter. As per the second part of 
https://issues.apache.org/jira/browse/TINKERPOP-967 we want to be able to 
'name' a loop counter. I could store this in the LabelledCounter alongside the 
stepId and the counter, but to get more constant time lookup by name I use a 
separate Map from loop name -> LabelledCounter.
    
    When `resetLoops()` is called the counter is removed from the Stack and 
also needs to be removed from this lookup Map. Because the map is keyed on 
'name' not stepId, I don't know which entry to remove without either:
    * Checking every entry on the map to see if the LabelledCounter matches the 
one I'm removing from the stack.
    * Storing the 'name' in the stack of loop counter
    
    A Map with 'Weak values' only holds onto entries while the value (the 
reference to the LabelledCounter) is valid. When it gets released the entry 
(the 'name' and the Reference to the LabelledCounter) get removed. This avoids 
needing a second Map/second index/extra to store lookups from  
    
    I may have overcomplicated this. I was trying to avoid looping over the 
loopStack (which I expect to be small) and to keep storage down (which is hard 
to do) - especially considering the existing code seems to want to shave as 
many bytes as possible off the looping storage (using a short under the hood 
when the interface exposes an int):
    
https://github.com/apache/tinkerpop/blob/a80eb84169048ed74c5ad27ebc4d12944fd0136a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_S_SE_SL_Traverser.java#L34



---

Reply via email to