
slice seems broken on datamapper collections
Reported by pathsny (at gmail) | October 14th, 2010 @ 09:11 AM
[1,2,3][1..-1] = [2,3] Foo.all[1..-1]
ArgumentError: +options[:limit]+ must be greater than or equal
to 0, but was -1
from /Library/Ruby/Gems/1.8/gems/dm-core-1.0.2/lib/dm-core/query.rb:922:in `assert_valid_limit'
from /Library/Ruby/Gems/1.8/gems/dm-core-1.0.2/lib/dm-core/query.rb:773:in `assert_valid_options'
from /Library/Ruby/Gems/1.8/gems/dm-core-1.0.2/lib/dm-core/query.rb:767:in `each'
from /Library/Ruby/Gems/1.8/gems/dm-core-1.0.2/lib/dm-core/query.rb:767:in `assert_valid_options'
from /Library/Ruby/Gems/1.8/gems/dm-core-1.0.2/lib/dm-core/query.rb:363:in `update'
from /Library/Ruby/Gems/1.8/gems/dm-core-1.0.2/lib/dm-core/query.rb:596:in `slice!'
from /Library/Ruby/Gems/1.8/gems/dm-core-1.0.2/lib/dm-core/query.rb:568:in `slice'
from /Library/Ruby/Gems/1.8/gems/dm-core-1.0.2/lib/dm-core/collection.rb:1413:in `sliced_query'
from /Library/Ruby/Gems/1.8/gems/dm-core-1.0.2/lib/dm-core/collection.rb:400:in `[]'
from (irb):2
Comments and changes to this ticket
-
Dan Kubb (dkubb) October 24th, 2010 @ 10:08 PM
- State changed from new to unconfirmed
I think we can fix this, but I want to get clear on what sort of query should be executed under the hood. To constraint the problem set a bit, we should talk about SQL, and how a query like
Foo.all[1..-1]
should be satisfied.Given an Array,
[1..-1]
would cause every entry to be returned except the very first entry. For some DBs, in SQL, when you specify an offset you also need to specify a limit (a maximum number of rows to return).I've seen this handled in the past by specifying ridiculously large limits, like 2**64-1, which allows you to specify an offset and an effectively unlimited number of rows. This allows you to specify whatever offset you like, and have it work like it does with an Array. (well, except in the very rare case where you have more than 2**64-1 rows returned, but you probably have bigger problems if your query does return that many results and you plan to load them into memory ;)
Alternatively we could execute a COUNT query just before to find out how many rows there are, and then use that in place of -1.
Another approach would be to fetch all the rows, but tell the Collection to throw-away all rows before the offset.
I'm leaning towards the first approach, since I'm pretty sure it will work with more than just RDBMS, but it also doesn't feel as wasteful as the other approaches.
What does everyone else think?
Please Sign in or create a free account to add a new ticket.
With your very own profile, you can contribute to projects, track your activity, watch tickets, receive and update tickets through your email and much more.
Create your profile
Help contribute to this project by taking a few moments to create your personal profile. Create your profile »