So I did a quick experiment of:

--- 
a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GremlinGroovyScriptEngine.java
+++ 
b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GremlinGroovyScriptEngine.java
-        
CoreGremlinPlugin.instance().getCustomizers("gremlin-groovy").ifPresent(c -> 
listOfCustomizers.addAll(Arrays.asList(c)));
+        
CoreGremlinPlugin.instance().getCustomizers("gremlin-groovy").ifPresent(c -> 
listOfCustomizers.addAll(0, Arrays.asList(c)));


While this does allow my DSL's __ to be the one found, oddly, some other static 
imports no longer appear in the interpreter; specifically 'label'.  
(Referencing 'T.label' works fine.)  It isn't that the symbol lookup finds the 
incorrect class; I get the error "groovy.lang.MissingPropertyException: No such 
property: label for class: Script2", however, some other enums (ie, 'incr') are 
imported just fine.

Any ideas why that would occur?

On 2/14/18, 10:46 AM, "Stephen Mallette" <spmalle...@gmail.com> wrote:

    There was a time when I looked into that in pretty grave detail. I don't
    recall my findings exactly, but I obviously didn't come up with a nice
    solution. I'm not sure that I ever became convinced that any of this groovy
    import stuff behaves in a completely deterministic way. I suppose you could
    try it out and see if that change helps or not....
    
    On Wed, Feb 14, 2018 at 12:42 PM, Moore, Branden James <bjm...@sandia.gov>
    wrote:
    
    > Thanks for fixing issue #1.   I figured that one would be easy to fix.
    >
    > As for issue #2, I'm wondering if changing the GremlinGroovyScriptEngine
    > to add it's ImportCustomizer  (line 247) to the beginning of the list of
    > customizers, rather than the end, would allow DSLs (and any other imports)
    > to override the default Gremlin imports.
    >
    > - Branden
    >
    > On 2/14/18, 8:23 AM, "Stephen Mallette" <spmalle...@gmail.com> wrote:
    >
    >     Oops - the `getAnonymousTraversalClass()` should get generated
    > properly. I
    >     created this issue:
    >
    >     https://issues.apache.org/jira/browse/TINKERPOP-1890
    >
    >     which i already pushed a fix for:
    >
    >     https://github.com/apache/tinkerpop/commit/
    > 2d7113aaa166b69a8503be27aebf36a8063b82bd
    >
    >     your second problem....hmm - not sure what to do with that. Trying to
    > think
    >     of what could be done:
    >
    >     1. Ugly, but you could always specify the package name......super 
gross
    >     2. You could statically import your anonymous steps in a custom import
    > in
    >     Gremlin Server so instead of g.persons(__.xxx()) you would do
    >     g.persons(xxx()).
    >     3. It would be a bit of work, but I suppose the DSL processor could be
    >     modified somehow to allow you to rename the DSL double underscore
    > class to
    >     something else (triple underscore ??? hehe), then you could just
    > import it.
    >
    >     Seems like option 2 would work best in the short term.
    >
    >
    >
    >
    >
    >     On Tue, Feb 13, 2018 at 6:50 PM, Moore, Branden James <
    > bjm...@sandia.gov>
    >     wrote:
    >
    >     > Hi all,
    >     >
    >     >   We are using the @GremlinDsl annotation to extend the Gremlin
    > language
    >     > into our own DSL.   I’ve run into two issues with anonymous
    > traversals so
    >     > far that I’d like to bring up.  One has a work-around, the other, I
    > have
    >     > not yet found a work-around.
    >     >
    >     > First (the one with the work-around):  The <DSL>TraversalSource
    > class that
    >     > is generated does not override the ‘getAnonymousTraversalClass()’
    > method of
    >     > GraphTraversalSource, so the returned class is
    > org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
    >     >  rather than the auto-generated, DSL-specific version of ‘__’.
    > This can
    >     > be worked around by specifying your own base class that implementes
    >     > ‘getAnonymousTraversalClass()’.   However, this still requires some
    >     > oddities, as the code generator interprets the method as a method to
    > be
    >     > auto-generated.   My solution was to create two levels of
    > inheritance:
    >     >
    >     >   1.  MyDSLTraversalSourceDsl0 extends GraphTraversalSource, and
    >     > implements ‘getAnonymousTraversalClass()’
    >     >   2.  MyDSLTraversalSourceDsl1 extends MyDSLTraversalSourceDsl0, but
    > does
    >     > nothing else
    >     >   3.  MyDSLTraversalDSL extends GraphTRaversal.Admin<S,E>, and uses
    > the
    >     > @GremlinDsl(traversalSource = “MyDSLTraversalDSL1”)
    >     >
    >     >
    >     >
    >     > The second issue, for which I have not yet found a work-around, is
    > that
    >     > when using the Gremlin-Groovy scriptEngine as a Gremlin Server, and
    > sending
    >     > “gremlin” to the server (rather than bytecode), anonymous traversals
    > do not
    >     > find my DSL’s implementation of __, but rather the TinkerPop __.
    >  I’ve
    >     > added my ‘__’ to the ImportGremlinPlugin’s classImports.  This is
    >     > sufficient for sending bytecode and having my __ found.   However,
    > when
    >     > sending “gremlin” to the Session Processor, with “eval” as the OP,
    > the
    >     > groovy class cache finds TinkerPop’s __ rather than my __.    This 
is
    >     > appears to be because in GremlinGroovyScriptEngine, the
    > CoreGremlinPlugin’s
    >     > customizers get added last to the list of ImportCustomizers.  As it
    > is
    >     > processed last, when building the map of class names to
    > fully-qualified
    >     > class names, the Gremlin ‘__’ key overwrites the ‘__’ key which was
    >     > specified to be imported in the server’s YAML.   I also came across
    > an
    >     > interesting comment in ‘ImportGroovyCustomizer’ which forces an
    > import of
    >     > Tinkerpop’s ‘__’ as well.
    >     >
    >     > It's quite possible that I’m missing something, if so, could you
    > please
    >     > point me to how one is supposed to enable a custom DSL with the
    >     > Gremlin-Groovy script engine?
    >     >
    >     > Thanks much,
    >     >
    >     >   *   Branden
    >     >
    >     >
    >
    >
    >
    

Reply via email to