I think I figured out why 'label' isn't getting imported...   It is being 
overwritten in the import map by the  __.label() method static import.   
Normally, the CoreGremlinPlugin imports 'T.label' and '__.label()'  is filtered 
out of the imports on line 59 of ImportGroovyCustomizer.java  (It was probably 
taken care of via line 55).

Perhaps if there was a way to specify a custom "__" class to the 
ImportCustomizer, this would all solve itself?


On 2/14/18, 12:32 PM, "Stephen Mallette" <spmalle...@gmail.com> wrote:

    Sorry - those imports are really mysterious to me. I dug through a fair bit
    of groovy code trying to figure out what the rules were for that import
    stuff and i don't recall getting to the bottom of it.
    
    On Wed, Feb 14, 2018 at 2:27 PM, Moore, Branden James <bjm...@sandia.gov>
    wrote:
    
    > 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