Cole Greer created TINKERPOP-3306:
-------------------------------------

             Summary: SugarLoader `methodMissing` turns misspelled steps and 
wrong-type calls into `values()`
                 Key: TINKERPOP-3306
                 URL: https://issues.apache.org/jira/browse/TINKERPOP-3306
             Project: TinkerPop
          Issue Type: Bug
          Components: console
    Affects Versions: 3.8.2, 3.7.7
            Reporter: Cole Greer


{{SugarLoader}} adds this catch-all to {{GraphTraversal}} so that property 
access like {{g.V().age}} works:

{code:groovy}
// 
gremlin-groovy/src/main/groovy/org/apache/tinkerpop/gremlin/groovy/loaders/SugarLoader.groovy
GraphTraversal.metaClass.methodMissing = { final String name, final def args ->
    return ((GraphTraversal) delegate).values(name);
}
{code}

The closure ignores {{args}}. Groovy calls it for every method call it can't 
resolve, so a typo or an argument type that matches no overload doesn't raise 
an error. The call becomes {{values(<methodName>)}}, the arguments are thrown 
away, and the traversal usually returns an empty result. The user gets no sign 
that anything went wrong.

Reproduce in the Gremlin Console with {{TinkerFactory.createModern()}}:

{code:groovy}
gremlin> g.V().hasLabl('person')            // misspelled hasLabel
// compiles to g.V().values("hasLabl")  -> []

gremlin> g.V().outE('knows').inv()          // misspelled inV
// compiles to g.V().outE("knows").values("inv")  -> []

gremlin> g.V().limit('2')                   // String where a long is expected
// compiles to g.V().values("limit")  -> []
{code}

*Expected:* a {{MissingMethodException}}, which is what you get without the 
sugar plugin, or with the grammar, where these are parse errors.

*Proposed fix:* use the {{values(name)}} fallback only when {{args}} is empty, 
which is the property-access case it exists for. Otherwise throw {{new 
MissingMethodException(name, delegate.getClass(), args)}}. {{g.V().age}} keeps 
working, and calls with arguments that match no step fail loudly. The fix needs 
a test showing that {{g.V().age}} still compiles to {{values("age")}}.



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to