Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Define start variable with local scope in the closure #1

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

JustATrick
Copy link

I had trouble with the step definition from friendsuggest.groovy introduced on page 236 of version P1.0 of the PDF. I, like another reader on the forum, get the following error:

gremlin> g.V.filter{it.name=='Patty'}.friendsuggest.name
==> No such property: start for class: groovysh_evaluate

I think it's related to variable scoping in the Groovy Shell, and the attached commit fixes it for me.

Here's my working:

gremlin> start
==> No such property: start for class: groovysh_evaluate
gremlin> Gremlin.defineStep( 'friendsuggest',
gremlin>   [Vertex, Pipe],
gremlin>   {
gremlin>     _().sideEffect{start = it}.both('friends').except(
gremlin>     [start]).out('likes').dedup
gremlin>   }
gremlin> )
==>
gremlin> g.V.filter{it.name=='Patty'}.friendsuggest.name
==> No such property: start for class: groovysh_evaluate
gremlin> start = 1
==> 1
gremlin> g.V.filter{it.name=='Patty'}.friendsuggest.name
==> Prancing Wolf Ice Wine 2007
==> Prancing Wolf Kabinett 2002
gremlin> start
==> v[8]
gremlin> start.name
==> Patty

This shows that we start with no shell variable name start, then define the friendsuggest step as in the book, and then see the error I report above. Then I define a shell variable named start and now the query works as expected. Notice that my shell variable has been overwritten by the execution of friendsuggest.

Here's the better result from using a step defined identically except with a local variable definition for the internal variable:

gremlin> Gremlin.defineStep( 'fwendsuggest',
gremlin>   [Vertex, Pipe],
gremlin>   {
gremlin>     def fwendstart
gremlin>     _().sideEffect{fwendstart = it}.both('friends').except(
gremlin>     [fwendstart]).out('likes').dedup
gremlin>   }
gremlin> )
==>
gremlin> fwendstart
==> No such property: fwendstart for class: groovysh_evaluate
gremlin> g.V.filter{it.name=='Patty'}.fwendsuggest.name
==> Prancing Wolf Ice Wine 2007
==> Prancing Wolf Kabinett 2002
gremlin> fwendstart
==> No such property: fwendstart for class: groovysh_evaluate

@nespera
Copy link

nespera commented Sep 12, 2012

As usual, I hit a problem, go to the forums and find you've solved it just ahead of me! Works for me too.

@reasonet
Copy link

reasonet commented Mar 7, 2013

If you're going to define fwendstart in the closure, then you don't need the sideEffect method:
gremlin> Gremlin.defineStep( 'fwendsuggest',
gremlin> [Vertex, Pipe],
gremlin> {
gremlin> fwendstart=_()
gremlin> fwendstart.both('friends').except([fwendstart]).out('likes').dedup
gremlin> }
gremlin> )

But in actuality, the variable is superfluous. The following works just as well:
gremlin> Gremlin.defineStep( 'fwendsuggest',
gremlin> [Vertex, Pipe],
gremlin> {
gremlin> ().both('friends').except([()]).out('likes').dedup
gremlin> }
gremlin> )

@yoni
Copy link

yoni commented Dec 24, 2013

Thanks for documenting this issue, @JustATrick. :)

FWIW, I ended up using @reasonet's syntax, which seems to make more sense.

@yoni
Copy link

yoni commented Dec 24, 2013

Opened #4 with @reasonet's fix.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants