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

Explain the behaviour of forEach #1261

Open
NotJustAnna opened this issue Feb 17, 2020 · 9 comments
Open

Explain the behaviour of forEach #1261

NotJustAnna opened this issue Feb 17, 2020 · 9 comments

Comments

@NotJustAnna
Copy link
Member

Apparently, forEach merge and sums all objects given to them? This is undocumented on the docs.

image
image

@chipotle
Copy link
Contributor

What is it you're actually trying to do? forEach is described with:

Loop over a sequence, evaluating the given write query for each element.

And the examples you're giving are not write queries.

(I could have sworn that forEach had a warning somewhere that it was indeed only for write queries, but apparently not. But IIRC, it really means it, and I have a suspicion that what you want is more properly accomplished with map.)

@srh
Copy link
Contributor

srh commented Feb 18, 2020

If you run something like

r.expr([1,2,3]).forEach(function(a) { return r.table('foo').insert({id: a}); })

it will output


{

    "deleted": 0 ,
    "errors": 0 ,
    "inserted": 3 ,
    "replaced": 0 ,
    "skipped": 0 ,
    "unchanged": 0
}

That result was formed by combining together three different write result objects. The .forEach function adds the stats together and concatenates any arrays together.

It looks like it doesn't validate that the query result is necessarily a write result, it just evaluates the subqueries. Hence

r.expr([1,2,3]).forEach(function(a) { return {x: a}; }) returning {x: 6}.

It will only complain if it gets a value it refuses to merge together, like a number.

I don't know why you're getting "var_541". I don't get that when I run the query. That's definitely a bug, really a complete mystery; what version of RethinkDB are you running it's clear from the screenshot you're running 2.4.

@srh
Copy link
Contributor

srh commented Feb 18, 2020

It definitely could be better documented.

@srh
Copy link
Contributor

srh commented Feb 18, 2020

Could I say again how freaky that var_541 thing is? I can't reproduce it in 2.4 or before. What browser are you running? Could it be its JavaScript engine?

@NotJustAnna
Copy link
Member Author

Could I say again how freaky that var_541 thing is? I can't reproduce it in 2.4 or before. What browser are you running? Could it be its JavaScript engine?

It's the RethinkDB 2.4 Data Explorer

@NotJustAnna
Copy link
Member Author

Managed to reproduce it with literal + instead of add

image

@srh
Copy link
Contributor

srh commented Feb 19, 2020

That's because you wrote a + 1 instead of a.add(1). But in the ...

Okay. In the screenshot, I guess you ran a + 1, got the output, then edited the query to be a.add(1) without rerunning the query.

@NotJustAnna
Copy link
Member Author

Just to get back on track:

That result was formed by combining together three different write result objects. The .forEach function adds the stats together and concatenates any arrays together.

It looks like it doesn't validate that the query result is necessarily a write result, it just evaluates the subqueries. Hence

r.expr([1,2,3]).forEach(function(a) { return {x: a}; }) returning {x: 6}.

It will only complain if it gets a value it refuses to merge together, like a number.

This is what's missing from the docs.

@NotJustAnna
Copy link
Member Author

What is it you're actually trying to do? forEach is described with:

Loop over a sequence, evaluating the given write query for each element.

And the examples you're giving are not write queries.

(I could have sworn that forEach had a warning somewhere that it was indeed only for write queries, but apparently not. But IIRC, it really means it, and I have a suspicion that what you want is more properly accomplished with map.)

I'm not trying to do anything with it, I really tried to discover what the result type was. I have an issue tracking all RethinkDB types (rethinkdb/rethinkdb-java#18), and forEach just returned an object. No format, explaining, nothing. Just object. That's when I stumbled upon this behaviour.

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

No branches or pull requests

3 participants