[ 
https://issues.apache.org/jira/browse/TINKERPOP-2396?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17166623#comment-17166623
 ] 

redtree commented on TINKERPOP-2396:
------------------------------------

Just cut a pull request which is based on my first idea

[https://github.com/apache/tinkerpop/pull/1307]

I will add a test if the direction looks ok from maintainer's point of view.

> TraverserSet should be extendable for GraphDB provider
> ------------------------------------------------------
>
>                 Key: TINKERPOP-2396
>                 URL: https://issues.apache.org/jira/browse/TINKERPOP-2396
>             Project: TinkerPop
>          Issue Type: Improvement
>          Components: process
>            Reporter: redtree
>            Priority: Minor
>
> Currently in many TinkerPop steps, TraverserSet is internally created and 
> used. 
> However GraphDB provider may want to use their own TraverserSet to change the 
> logic  how it populates an inner Map.
> Just let me give one example
> Say internally we have a unique internal Id for each element and to get a 
> user facing Id we need to retrieve it from our Storage using the internal Id. 
> For example Element#id returns the user facing Id so one Storage API call is 
> required on our end. It is ok.
> What is unexpected for us was that when TraverserSet adds a 
> Traverser<Element> , the element's id is used for hashCode.
> So whenever some step with TraverserSet handles solution, as many Storage API 
> calls are required as a number of Traverser<Element>. As you may see, some 
> query like .count() at the end doesn't require the user facing value so we 
> want to avoid that if we can.
> We can simply achieve this by using internal id as a hashCode, but we can't 
> overwrite ElementHelper's behavior so first we overwrote Element#hashCode but 
> after that we saw that this test effectively fails.
> https://github.com/apache/tinkerpop/blob/cff4c161615f2b50bda27b6ba523c7f52b833532/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedVertexTest.java#L75
> Because v here is our own custom vertex instance which uses internal id for 
> hashCode but DetachedVertex just uses a user facing id copied from v, so they 
> are not considered as equal when used as hash key.
> We may skip this test but it's better to keep all Tinkerpop tests passed as 
> GraphDB provider I think.
> So instead, I will propose to change so that we can add a capability to swap 
> TraverserSet as needed.
> The change should be simple, 
> 1. ExpandableIterator should have constructor like ExpandableIterator(final 
> Step<S, ?> hostStep, final TraverserSet<S> traverserSet) and use the 
> traverserSet as its own traverserSet value.
> 2. AbstractStep should have construct like AbstractStep(final Traversal.Admin 
> traversal, final Supplier<TraverserSet<S>> traverserSetSupplier) and use 
> traverserSetSuppler.get() for all places that currently we instantiate new 
> TraverserSet.
>  Also this supplier.get() may be passed when AbstractStep instantiates 
> ExpandableIterator.
> So still GraphDB provider needs to extends all Steps that deals with 
> TraverserSet and overwrite their constructor to have their own 
> traverserSetSupplier, but after that they can freely use their own 
> TraverserSet, so the logic how the key of TraverserSet is determined is up to 
> GraphDB provider.
> Or if we add some helper method like getTraverserSetSupplier under, for 
> instance, Graph class, then instead of extending all steps we can just 
> override that method under our own Graph class. But I am not sure which is 
> better in this case, but either way the goal is the same.
> Any thoughts or objections on this idea ?



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

Reply via email to