mongoid-scroll 0.3.5 → 0.3.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/.rubocop.yml +0 -2
 - data/.rubocop_todo.yml +23 -17
 - data/.travis.yml +7 -0
 - data/CHANGELOG.md +15 -19
 - data/Gemfile +7 -4
 - data/RELEASING.md +5 -7
 - data/Rakefile +1 -1
 - data/lib/mongoid-scroll.rb +1 -1
 - data/lib/mongoid/criteria/scrollable.rb +81 -0
 - data/lib/mongoid/scroll/cursor.rb +1 -1
 - data/lib/mongoid/scroll/version.rb +1 -1
 - data/spec/mongo/collection_view_spec.rb +100 -98
 - data/spec/mongoid/criteria_spec.rb +36 -1
 - data/spec/mongoid/scroll_cursor_spec.rb +1 -1
 - data/spec/moped/query_spec.rb +100 -98
 - data/spec/spec_helper.rb +3 -2
 - data/spec/support/feed/item.rb +5 -1
 - data/spec/support/feed/publisher.rb +9 -0
 - data/spec/support/mongodb.rb +9 -0
 - metadata +6 -4
 - data/lib/mongoid/criterion/scrollable.rb +0 -35
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA1:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 3c6aed40600433d3619cdc8839f6a2ad2da3b9c7
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: fbe2257d54b98c8aff1d8163f2a4dc15071c7d92
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 4936c9a792ec9950a4bbd5c02c8fcc89cedc44cd1900737d6e20106ad3810f1d27b7aa9bbb230f58177a2dd10ac251bfbaec4674a5e31855c5f5bf450fd7dfbf
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 5f087846be5d4870975de8841872320a6e0ce441b568e4db28526a2bb715264b92b7089aa70df9adb615d3f735b8079847472e55e9c8cd75cd0eca4b33cd01ca
         
     | 
    
        data/.rubocop.yml
    CHANGED
    
    
    
        data/.rubocop_todo.yml
    CHANGED
    
    | 
         @@ -1,31 +1,43 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # This configuration was generated by
         
     | 
| 
       2 
2 
     | 
    
         
             
            # `rubocop --auto-gen-config`
         
     | 
| 
       3 
     | 
    
         
            -
            # on  
     | 
| 
      
 3 
     | 
    
         
            +
            # on 2018-03-13 23:29:51 +0100 using RuboCop version 0.49.1.
         
     | 
| 
       4 
4 
     | 
    
         
             
            # The point is for the user to remove these configuration records
         
     | 
| 
       5 
5 
     | 
    
         
             
            # one by one as the offenses are removed from the code base.
         
     | 
| 
       6 
6 
     | 
    
         
             
            # Note that changes in the inspected code, or installation of new
         
     | 
| 
       7 
7 
     | 
    
         
             
            # versions of RuboCop, may require this file to be generated again.
         
     | 
| 
       8 
8 
     | 
    
         | 
| 
      
 9 
     | 
    
         
            +
            # Offense count: 6
         
     | 
| 
      
 10 
     | 
    
         
            +
            # Configuration parameters: Include.
         
     | 
| 
      
 11 
     | 
    
         
            +
            # Include: **/Gemfile, **/gems.rb
         
     | 
| 
      
 12 
     | 
    
         
            +
            Bundler/DuplicatedGem:
         
     | 
| 
      
 13 
     | 
    
         
            +
              Exclude:
         
     | 
| 
      
 14 
     | 
    
         
            +
                - 'Gemfile'
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
       9 
16 
     | 
    
         
             
            # Offense count: 6
         
     | 
| 
       10 
17 
     | 
    
         
             
            Metrics/AbcSize:
         
     | 
| 
       11 
18 
     | 
    
         
             
              Max: 67
         
     | 
| 
       12 
19 
     | 
    
         | 
| 
       13 
     | 
    
         
            -
            # Offense count:  
     | 
| 
      
 20 
     | 
    
         
            +
            # Offense count: 14
         
     | 
| 
      
 21 
     | 
    
         
            +
            # Configuration parameters: CountComments, ExcludedMethods.
         
     | 
| 
      
 22 
     | 
    
         
            +
            Metrics/BlockLength:
         
     | 
| 
      
 23 
     | 
    
         
            +
              Max: 216
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
            # Offense count: 5
         
     | 
| 
       14 
26 
     | 
    
         
             
            Metrics/CyclomaticComplexity:
         
     | 
| 
       15 
27 
     | 
    
         
             
              Max: 11
         
     | 
| 
       16 
28 
     | 
    
         | 
| 
       17 
     | 
    
         
            -
            # Offense count:  
     | 
| 
       18 
     | 
    
         
            -
            # Configuration parameters: AllowHeredoc, AllowURI, URISchemes.
         
     | 
| 
      
 29 
     | 
    
         
            +
            # Offense count: 121
         
     | 
| 
      
 30 
     | 
    
         
            +
            # Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
         
     | 
| 
       19 
31 
     | 
    
         
             
            # URISchemes: http, https
         
     | 
| 
       20 
32 
     | 
    
         
             
            Metrics/LineLength:
         
     | 
| 
       21 
     | 
    
         
            -
              Max:  
     | 
| 
      
 33 
     | 
    
         
            +
              Max: 172
         
     | 
| 
       22 
34 
     | 
    
         | 
| 
       23 
35 
     | 
    
         
             
            # Offense count: 6
         
     | 
| 
       24 
36 
     | 
    
         
             
            # Configuration parameters: CountComments.
         
     | 
| 
       25 
37 
     | 
    
         
             
            Metrics/MethodLength:
         
     | 
| 
       26 
38 
     | 
    
         
             
              Max: 25
         
     | 
| 
       27 
39 
     | 
    
         | 
| 
       28 
     | 
    
         
            -
            # Offense count:  
     | 
| 
      
 40 
     | 
    
         
            +
            # Offense count: 3
         
     | 
| 
       29 
41 
     | 
    
         
             
            Metrics/PerceivedComplexity:
         
     | 
| 
       30 
42 
     | 
    
         
             
              Max: 11
         
     | 
| 
       31 
43 
     | 
    
         | 
| 
         @@ -36,7 +48,7 @@ Style/Documentation: 
     | 
|
| 
       36 
48 
     | 
    
         
             
                - 'test/**/*'
         
     | 
| 
       37 
49 
     | 
    
         
             
                - 'examples/mongoid_scroll_feed.rb'
         
     | 
| 
       38 
50 
     | 
    
         
             
                - 'lib/mongo/scrollable.rb'
         
     | 
| 
       39 
     | 
    
         
            -
                - 'lib/mongoid/ 
     | 
| 
      
 51 
     | 
    
         
            +
                - 'lib/mongoid/criteria/scrollable.rb'
         
     | 
| 
       40 
52 
     | 
    
         
             
                - 'lib/mongoid/scroll/cursor.rb'
         
     | 
| 
       41 
53 
     | 
    
         
             
                - 'lib/mongoid/scroll/errors/base.rb'
         
     | 
| 
       42 
54 
     | 
    
         
             
                - 'lib/mongoid/scroll/errors/invalid_cursor_error.rb'
         
     | 
| 
         @@ -46,27 +58,21 @@ Style/Documentation: 
     | 
|
| 
       46 
58 
     | 
    
         
             
                - 'lib/moped/scrollable.rb'
         
     | 
| 
       47 
59 
     | 
    
         | 
| 
       48 
60 
     | 
    
         
             
            # Offense count: 1
         
     | 
| 
       49 
     | 
    
         
            -
            # Configuration parameters: ExpectMatchingDefinition, Regex, IgnoreExecutableScripts.
         
     | 
| 
      
 61 
     | 
    
         
            +
            # Configuration parameters: ExpectMatchingDefinition, Regex, IgnoreExecutableScripts, AllowedAcronyms.
         
     | 
| 
      
 62 
     | 
    
         
            +
            # AllowedAcronyms: CLI, DSL, ACL, API, ASCII, CPU, CSS, DNS, EOF, GUID, HTML, HTTP, HTTPS, ID, IP, JSON, LHS, QPS, RAM, RHS, RPC, SLA, SMTP, SQL, SSH, TCP, TLS, TTL, UDP, UI, UID, UUID, URI, URL, UTF8, VM, XML, XMPP, XSRF, XSS
         
     | 
| 
       50 
63 
     | 
    
         
             
            Style/FileName:
         
     | 
| 
       51 
64 
     | 
    
         
             
              Exclude:
         
     | 
| 
       52 
65 
     | 
    
         
             
                - 'lib/mongoid-scroll.rb'
         
     | 
| 
       53 
66 
     | 
    
         | 
| 
       54 
     | 
    
         
            -
            # Offense count:  
     | 
| 
      
 67 
     | 
    
         
            +
            # Offense count: 1
         
     | 
| 
       55 
68 
     | 
    
         
             
            # Configuration parameters: MinBodyLength.
         
     | 
| 
       56 
69 
     | 
    
         
             
            Style/GuardClause:
         
     | 
| 
       57 
70 
     | 
    
         
             
              Exclude:
         
     | 
| 
       58 
     | 
    
         
            -
                - 'lib/mongoid/criterion/scrollable.rb'
         
     | 
| 
       59 
71 
     | 
    
         
             
                - 'lib/moped/scrollable.rb'
         
     | 
| 
       60 
72 
     | 
    
         | 
| 
       61 
     | 
    
         
            -
            # Offense count:  
     | 
| 
      
 73 
     | 
    
         
            +
            # Offense count: 1
         
     | 
| 
       62 
74 
     | 
    
         
             
            # Cop supports --auto-correct.
         
     | 
| 
       63 
75 
     | 
    
         
             
            # Configuration parameters: SupportedStyles.
         
     | 
| 
       64 
76 
     | 
    
         
             
            # SupportedStyles: compact, exploded
         
     | 
| 
       65 
77 
     | 
    
         
             
            Style/RaiseArgs:
         
     | 
| 
       66 
78 
     | 
    
         
             
              EnforcedStyle: compact
         
     | 
| 
       67 
     | 
    
         
            -
             
     | 
| 
       68 
     | 
    
         
            -
            # Offense count: 1
         
     | 
| 
       69 
     | 
    
         
            -
            # Configuration parameters: SupportedStyles.
         
     | 
| 
       70 
     | 
    
         
            -
            # SupportedStyles: snake_case, normalcase, non_integer
         
     | 
| 
       71 
     | 
    
         
            -
            Style/VariableNumber:
         
     | 
| 
       72 
     | 
    
         
            -
              EnforcedStyle: normalcase
         
     | 
    
        data/.travis.yml
    CHANGED
    
    
    
        data/CHANGELOG.md
    CHANGED
    
    | 
         @@ -1,50 +1,46 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            0.3. 
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
      
 1 
     | 
    
         
            +
            ### 0.3.6 (2018/05/01)
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            * [#18](https://github.com/mongoid/mongoid-scroll/pull/18): Fix mongoid scroll without block returning wrong criteria - [@asgerb](https://github.com/asgerb).
         
     | 
| 
      
 4 
     | 
    
         
            +
            * [#15](https://github.com/mongoid/mongoid-scroll/pull/15): Use MongoDB 3.4 in testing and fix tests w/ WiredTiger storage engine - [@dblock](https://github.com/dblock).
         
     | 
| 
      
 5 
     | 
    
         
            +
            * [#14](https://github.com/mongoid/mongoid-scroll/pull/14): Allow scrolling by foreign key - [@joeyAghion](https://github.com/joeyAghion).
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            ### 0.3.5 (2016/09/27)
         
     | 
| 
       3 
8 
     | 
    
         | 
| 
       4 
9 
     | 
    
         
             
            * [#11](https://github.com/mongoid/mongoid-scroll/pull/11): Compatibility with Mongoid 6 - [@dblock](https://github.com/dblock).
         
     | 
| 
       5 
10 
     | 
    
         
             
            * [#12](https://github.com/mongoid/mongoid-scroll/pull/12): Added Danger, PR linter - [@dblock](https://github.com/dblock).
         
     | 
| 
       6 
11 
     | 
    
         | 
| 
       7 
     | 
    
         
            -
            0.3.4 (2015/10/22)
         
     | 
| 
       8 
     | 
    
         
            -
            ------------------
         
     | 
| 
      
 12 
     | 
    
         
            +
            ### 0.3.4 (2015/10/22)
         
     | 
| 
       9 
13 
     | 
    
         | 
| 
       10 
14 
     | 
    
         
             
            * Added support for [mongo-ruby-driver](https://github.com/mongodb/mongo-ruby-driver), `Mongo::Collection::View` - [@dblock](https://github.com/dblock).
         
     | 
| 
       11 
15 
     | 
    
         | 
| 
       12 
     | 
    
         
            -
            0.3.3 (2015/09/17)
         
     | 
| 
       13 
     | 
    
         
            -
            ------------------
         
     | 
| 
      
 16 
     | 
    
         
            +
            ### 0.3.3 (2015/09/17)
         
     | 
| 
       14 
17 
     | 
    
         | 
| 
       15 
18 
     | 
    
         
             
            * Compatibility with Mongoid 5 - [@dblock](https://github.com/dblock).
         
     | 
| 
       16 
19 
     | 
    
         | 
| 
       17 
     | 
    
         
            -
            0.3.2 (2015/8/8)
         
     | 
| 
       18 
     | 
    
         
            -
            ----------------
         
     | 
| 
      
 20 
     | 
    
         
            +
            ### 0.3.2 (2015/8/8)
         
     | 
| 
       19 
21 
     | 
    
         | 
| 
       20 
22 
     | 
    
         
             
            * [#7](https://github.com/mongoid/mongoid-scroll/pull/7): Fix: pre-merge cursor criteria fields - [@sweir27](https://github.com/sweir27).
         
     | 
| 
       21 
23 
     | 
    
         | 
| 
       22 
     | 
    
         
            -
            0.3.1 (2015/7/27)
         
     | 
| 
       23 
     | 
    
         
            -
            -----------------
         
     | 
| 
      
 24 
     | 
    
         
            +
            ### 0.3.1 (2015/7/27)
         
     | 
| 
       24 
25 
     | 
    
         | 
| 
       25 
26 
     | 
    
         
             
            * Compatibility with Mongoid 5.x beta - [@dblock](https://github.com/dblock).
         
     | 
| 
       26 
27 
     | 
    
         
             
            * [#4](https://github.com/mongoid/mongoid-scroll/pull/4): Fix: support chaining `$or` criteria - [@sweir27](https://github.com/sweir27).
         
     | 
| 
       27 
28 
     | 
    
         
             
            * [#5](https://github.com/mongoid/mongoid-scroll/pull/5): Fix: embeddable objects now returned in pagination - [@sweir27](https://github.com/sweir27).
         
     | 
| 
       28 
29 
     | 
    
         | 
| 
       29 
     | 
    
         
            -
            0.3.0 (2014/1/7)
         
     | 
| 
       30 
     | 
    
         
            -
            ----------------
         
     | 
| 
      
 30 
     | 
    
         
            +
            ### 0.3.0 (2014/1/7)
         
     | 
| 
       31 
31 
     | 
    
         | 
| 
       32 
32 
     | 
    
         
             
            * Compatibility with Mongoid 4.x - [@dblock](https://github.com/dblock).
         
     | 
| 
       33 
33 
     | 
    
         
             
            * Implemeneted Rubocop, Ruby linter - [@dblock](https://github.com/dblock).
         
     | 
| 
       34 
34 
     | 
    
         | 
| 
       35 
     | 
    
         
            -
            0.2.1 (2013/3/21)
         
     | 
| 
       36 
     | 
    
         
            -
            -----------------
         
     | 
| 
      
 35 
     | 
    
         
            +
            ### 0.2.1 (2013/3/21)
         
     | 
| 
       37 
36 
     | 
    
         | 
| 
       38 
37 
     | 
    
         
             
            * Fix: scroll over a collection that has duplicate values while data is being modified in a way that causes a change in the natural sort order - [@dblock](https://github.com/dblock).
         
     | 
| 
       39 
38 
     | 
    
         | 
| 
       40 
     | 
    
         
            -
            0.2.0 (2013/3/14)
         
     | 
| 
       41 
     | 
    
         
            -
            -----------------
         
     | 
| 
      
 39 
     | 
    
         
            +
            ### 0.2.0 (2013/3/14)
         
     | 
| 
       42 
40 
     | 
    
         | 
| 
       43 
41 
     | 
    
         
             
            * Extended `Moped::Query` with `scroll` - [@dblock](https://github.com/dblock).
         
     | 
| 
       44 
42 
     | 
    
         
             
            * `Mongoid::Scroll::Cursor.from_record` can now be called with either a Mongoid field or `field_type` and `field_name` in the `options` hash - [@dblock](https://github.com/dblock).
         
     | 
| 
       45 
43 
     | 
    
         | 
| 
       46 
     | 
    
         
            -
            0.1.0 (2013/2/14)
         
     | 
| 
       47 
     | 
    
         
            -
            -----------------
         
     | 
| 
      
 44 
     | 
    
         
            +
            ### 0.1.0 (2013/2/14)
         
     | 
| 
       48 
45 
     | 
    
         | 
| 
       49 
46 
     | 
    
         
             
            * Initial public release, extends `Mongoid::Criteria` with `scroll` - [@dblock](https://github.com/dblock).
         
     | 
| 
       50 
     | 
    
         
            -
             
     | 
    
        data/Gemfile
    CHANGED
    
    | 
         @@ -5,6 +5,8 @@ gemspec 
     | 
|
| 
       5 
5 
     | 
    
         
             
            case version = ENV['MONGOID_VERSION'] || '~> 6.0'
         
     | 
| 
       6 
6 
     | 
    
         
             
            when 'HEAD'
         
     | 
| 
       7 
7 
     | 
    
         
             
              gem 'mongoid', github: 'mongodb/mongoid'
         
     | 
| 
      
 8 
     | 
    
         
            +
            when /7/
         
     | 
| 
      
 9 
     | 
    
         
            +
              gem 'mongoid', github: 'mongodb/mongoid', branch: '7.0-dev'
         
     | 
| 
       8 
10 
     | 
    
         
             
            when /6/
         
     | 
| 
       9 
11 
     | 
    
         
             
              gem 'mongoid', '~> 6.0'
         
     | 
| 
       10 
12 
     | 
    
         
             
            when /5/
         
     | 
| 
         @@ -18,11 +20,12 @@ else 
     | 
|
| 
       18 
20 
     | 
    
         
             
            end
         
     | 
| 
       19 
21 
     | 
    
         | 
| 
       20 
22 
     | 
    
         
             
            group :development, :test do
         
     | 
| 
       21 
     | 
    
         
            -
              gem 'rake'
         
     | 
| 
       22 
23 
     | 
    
         
             
              gem 'bundler'
         
     | 
| 
       23 
     | 
    
         
            -
              gem ' 
     | 
| 
       24 
     | 
    
         
            -
              gem 'rspec-its'
         
     | 
| 
      
 24 
     | 
    
         
            +
              gem 'database_cleaner'
         
     | 
| 
       25 
25 
     | 
    
         
             
              gem 'faker'
         
     | 
| 
       26 
     | 
    
         
            -
              gem 'rubocop', '0.43.0'
         
     | 
| 
       27 
26 
     | 
    
         
             
              gem 'mongoid-danger', '~> 0.1.0', require: false
         
     | 
| 
      
 27 
     | 
    
         
            +
              gem 'rake'
         
     | 
| 
      
 28 
     | 
    
         
            +
              gem 'rspec', '~> 3.0'
         
     | 
| 
      
 29 
     | 
    
         
            +
              gem 'rspec-its'
         
     | 
| 
      
 30 
     | 
    
         
            +
              gem 'rubocop', '0.49.1'
         
     | 
| 
       28 
31 
     | 
    
         
             
            end
         
     | 
    
        data/RELEASING.md
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            Releasing Mongoid::Scroll
         
     | 
| 
       2 
2 
     | 
    
         
             
            =========================
         
     | 
| 
       3 
3 
     | 
    
         | 
| 
       4 
     | 
    
         
            -
            There're no particular rules about when to release mongoid-scroll. Release bug fixes  
     | 
| 
      
 4 
     | 
    
         
            +
            There're no particular rules about when to release mongoid-scroll. Release bug fixes frequently, features not so frequently and breaking API changes rarely.
         
     | 
| 
       5 
5 
     | 
    
         | 
| 
       6 
6 
     | 
    
         
             
            ### Release
         
     | 
| 
       7 
7 
     | 
    
         | 
| 
         @@ -22,11 +22,10 @@ Increment the version, modify [lib/mongoid/scroll/version.rb](lib/mongoid/scroll 
     | 
|
| 
       22 
22 
     | 
    
         
             
            Change "Next Release" in [CHANGELOG.md](CHANGELOG.md) to the new version.
         
     | 
| 
       23 
23 
     | 
    
         | 
| 
       24 
24 
     | 
    
         
             
            ```
         
     | 
| 
       25 
     | 
    
         
            -
            0.4.0 ( 
     | 
| 
       26 
     | 
    
         
            -
            ==================
         
     | 
| 
      
 25 
     | 
    
         
            +
            ### 0.4.0 (2018/12/24)
         
     | 
| 
       27 
26 
     | 
    
         
             
            ```
         
     | 
| 
       28 
27 
     | 
    
         | 
| 
       29 
     | 
    
         
            -
            Remove the line with "Your contribution here.", since there will be no more contributions to this release.
         
     | 
| 
      
 28 
     | 
    
         
            +
            Remove the line with "* Your contribution here.", since there will be no more contributions to this release.
         
     | 
| 
       30 
29 
     | 
    
         | 
| 
       31 
30 
     | 
    
         
             
            Commit your changes.
         
     | 
| 
       32 
31 
     | 
    
         | 
| 
         @@ -52,15 +51,14 @@ Pushed mongoid-scroll 0.4.0 to rubygems.org. 
     | 
|
| 
       52 
51 
     | 
    
         
             
            Add the next release to [CHANGELOG.md](CHANGELOG.md).
         
     | 
| 
       53 
52 
     | 
    
         | 
| 
       54 
53 
     | 
    
         
             
            ```
         
     | 
| 
       55 
     | 
    
         
            -
            Next Release
         
     | 
| 
       56 
     | 
    
         
            -
            ============
         
     | 
| 
      
 54 
     | 
    
         
            +
            ### Next Release
         
     | 
| 
       57 
55 
     | 
    
         | 
| 
       58 
56 
     | 
    
         
             
            * Your contribution here.
         
     | 
| 
       59 
57 
     | 
    
         
             
            ```
         
     | 
| 
       60 
58 
     | 
    
         | 
| 
       61 
59 
     | 
    
         
             
            Increment the minor version, modify [lib/mongoid-scroll/version.rb](lib/mongoid-scroll/version.rb).
         
     | 
| 
       62 
60 
     | 
    
         | 
| 
       63 
     | 
    
         
            -
             
     | 
| 
      
 61 
     | 
    
         
            +
            Commit your changes.
         
     | 
| 
       64 
62 
     | 
    
         | 
| 
       65 
63 
     | 
    
         
             
            ```
         
     | 
| 
       66 
64 
     | 
    
         
             
            git add CHANGELOG.md lib/mongoid-scroll/version.rb
         
     | 
    
        data/Rakefile
    CHANGED
    
    
    
        data/lib/mongoid-scroll.rb
    CHANGED
    
    | 
         @@ -9,4 +9,4 @@ require 'mongoid/scroll/errors' 
     | 
|
| 
       9 
9 
     | 
    
         
             
            require 'mongoid/scroll/cursor'
         
     | 
| 
       10 
10 
     | 
    
         
             
            require 'moped/scrollable' if Object.const_defined?(:Moped)
         
     | 
| 
       11 
11 
     | 
    
         
             
            require 'mongo/scrollable' if Object.const_defined?(:Mongo)
         
     | 
| 
       12 
     | 
    
         
            -
            require 'mongoid/ 
     | 
| 
      
 12 
     | 
    
         
            +
            require 'mongoid/criteria/scrollable'
         
     | 
| 
         @@ -0,0 +1,81 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Mongoid
         
     | 
| 
      
 2 
     | 
    
         
            +
              class Criteria
         
     | 
| 
      
 3 
     | 
    
         
            +
                module Scrollable
         
     | 
| 
      
 4 
     | 
    
         
            +
                  def scroll(cursor = nil, &_block)
         
     | 
| 
      
 5 
     | 
    
         
            +
                    raise_multiple_sort_fields_error if multiple_sort_fields?
         
     | 
| 
      
 6 
     | 
    
         
            +
                    criteria = dup
         
     | 
| 
      
 7 
     | 
    
         
            +
                    criteria.merge!(default_sort) if no_sort_option?
         
     | 
| 
      
 8 
     | 
    
         
            +
                    cursor_options = build_cursor_options(criteria)
         
     | 
| 
      
 9 
     | 
    
         
            +
                    cursor = cursor.is_a?(Mongoid::Scroll::Cursor) ? cursor : new_cursor(cursor, cursor_options)
         
     | 
| 
      
 10 
     | 
    
         
            +
                    cursor_criteria = build_cursor_criteria(criteria, cursor)
         
     | 
| 
      
 11 
     | 
    
         
            +
                    if block_given?
         
     | 
| 
      
 12 
     | 
    
         
            +
                      cursor_criteria.order_by(_id: scroll_direction(criteria)).each do |record|
         
     | 
| 
      
 13 
     | 
    
         
            +
                        yield record, cursor_from_record(record, cursor_options)
         
     | 
| 
      
 14 
     | 
    
         
            +
                      end
         
     | 
| 
      
 15 
     | 
    
         
            +
                    else
         
     | 
| 
      
 16 
     | 
    
         
            +
                      cursor_criteria
         
     | 
| 
      
 17 
     | 
    
         
            +
                    end
         
     | 
| 
      
 18 
     | 
    
         
            +
                  end
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
                  private
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
                  def raise_multiple_sort_fields_error
         
     | 
| 
      
 23 
     | 
    
         
            +
                    raise Mongoid::Scroll::Errors::MultipleSortFieldsError.new(sort: criteria.options.sort)
         
     | 
| 
      
 24 
     | 
    
         
            +
                  end
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                  def multiple_sort_fields?
         
     | 
| 
      
 27 
     | 
    
         
            +
                    options.sort && options.sort.keys.size != 1
         
     | 
| 
      
 28 
     | 
    
         
            +
                  end
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
                  def no_sort_option?
         
     | 
| 
      
 31 
     | 
    
         
            +
                    options.sort.blank? || options.sort.empty?
         
     | 
| 
      
 32 
     | 
    
         
            +
                  end
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
                  def default_sort
         
     | 
| 
      
 35 
     | 
    
         
            +
                    asc(:_id)
         
     | 
| 
      
 36 
     | 
    
         
            +
                  end
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
                  def scroll_field(criteria)
         
     | 
| 
      
 39 
     | 
    
         
            +
                    criteria.options.sort.keys.first
         
     | 
| 
      
 40 
     | 
    
         
            +
                  end
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
                  def scroll_direction(criteria)
         
     | 
| 
      
 43 
     | 
    
         
            +
                    criteria.options.sort.values.first.to_i
         
     | 
| 
      
 44 
     | 
    
         
            +
                  end
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
                  def build_cursor_options(criteria)
         
     | 
| 
      
 47 
     | 
    
         
            +
                    {
         
     | 
| 
      
 48 
     | 
    
         
            +
                      field_type: scroll_field_type(criteria),
         
     | 
| 
      
 49 
     | 
    
         
            +
                      field_name: scroll_field(criteria),
         
     | 
| 
      
 50 
     | 
    
         
            +
                      direction: scroll_direction(criteria)
         
     | 
| 
      
 51 
     | 
    
         
            +
                    }
         
     | 
| 
      
 52 
     | 
    
         
            +
                  end
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
                  def new_cursor(cursor, cursor_options)
         
     | 
| 
      
 55 
     | 
    
         
            +
                    Mongoid::Scroll::Cursor.new(cursor, cursor_options)
         
     | 
| 
      
 56 
     | 
    
         
            +
                  end
         
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
      
 58 
     | 
    
         
            +
                  def build_cursor_criteria(criteria, cursor)
         
     | 
| 
      
 59 
     | 
    
         
            +
                    cursor_criteria = criteria.dup
         
     | 
| 
      
 60 
     | 
    
         
            +
                    cursor_criteria.selector = { '$and' => [criteria.selector, cursor.criteria] }
         
     | 
| 
      
 61 
     | 
    
         
            +
                    cursor_criteria
         
     | 
| 
      
 62 
     | 
    
         
            +
                  end
         
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
| 
      
 64 
     | 
    
         
            +
                  def cursor_from_record(record, cursor_options)
         
     | 
| 
      
 65 
     | 
    
         
            +
                    Mongoid::Scroll::Cursor.from_record(record, cursor_options)
         
     | 
| 
      
 66 
     | 
    
         
            +
                  end
         
     | 
| 
      
 67 
     | 
    
         
            +
             
     | 
| 
      
 68 
     | 
    
         
            +
                  def scroll_field_type(criteria)
         
     | 
| 
      
 69 
     | 
    
         
            +
                    scroll_field = scroll_field(criteria)
         
     | 
| 
      
 70 
     | 
    
         
            +
                    field = criteria.klass.fields[scroll_field.to_s]
         
     | 
| 
      
 71 
     | 
    
         
            +
                    field.foreign_key? && field.object_id_field? ? bson_type : field.type
         
     | 
| 
      
 72 
     | 
    
         
            +
                  end
         
     | 
| 
      
 73 
     | 
    
         
            +
             
     | 
| 
      
 74 
     | 
    
         
            +
                  def bson_type
         
     | 
| 
      
 75 
     | 
    
         
            +
                    Mongoid::Compatibility::Version.mongoid3? ? Moped::BSON::ObjectId : BSON::ObjectId
         
     | 
| 
      
 76 
     | 
    
         
            +
                  end
         
     | 
| 
      
 77 
     | 
    
         
            +
                end
         
     | 
| 
      
 78 
     | 
    
         
            +
              end
         
     | 
| 
      
 79 
     | 
    
         
            +
            end
         
     | 
| 
      
 80 
     | 
    
         
            +
             
     | 
| 
      
 81 
     | 
    
         
            +
            Mongoid::Criteria.send(:include, Mongoid::Criteria::Scrollable)
         
     | 
| 
         @@ -14,7 +14,7 @@ module Mongoid 
     | 
|
| 
       14 
14 
     | 
    
         
             
                    compare_direction = direction == 1 ? '$gt' : '$lt'
         
     | 
| 
       15 
15 
     | 
    
         
             
                    cursor_criteria = { field_name => { compare_direction => mongo_value } } if mongo_value
         
     | 
| 
       16 
16 
     | 
    
         
             
                    tiebreak_criteria = { field_name => mongo_value, :_id => { compare_direction => tiebreak_id } } if mongo_value && tiebreak_id
         
     | 
| 
       17 
     | 
    
         
            -
                    cursor_selector = if Mongoid::Compatibility::Version.mongoid6?
         
     | 
| 
      
 17 
     | 
    
         
            +
                    cursor_selector = if Mongoid::Compatibility::Version.mongoid6? || Mongoid::Compatibility::Version.mongoid7?
         
     | 
| 
       18 
18 
     | 
    
         
             
                                        Mongoid::Criteria::Queryable::Selector.new
         
     | 
| 
       19 
19 
     | 
    
         
             
                                      else
         
     | 
| 
       20 
20 
     | 
    
         
             
                                        Origin::Selector.new
         
     | 
| 
         @@ -1,124 +1,126 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require 'spec_helper'
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
             
     | 
| 
       4 
     | 
    
         
            -
               
     | 
| 
       5 
     | 
    
         
            -
                 
     | 
| 
       6 
     | 
    
         
            -
                   
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
     | 
    
         
            -
                   
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
              context 'with multiple sort fields' do
         
     | 
| 
       13 
     | 
    
         
            -
                subject do
         
     | 
| 
       14 
     | 
    
         
            -
                  Mongoid.default_client['feed_items'].find.sort(name: 1, value: -1)
         
     | 
| 
       15 
     | 
    
         
            -
                end
         
     | 
| 
       16 
     | 
    
         
            -
                it 'raises Mongoid::Scroll::Errors::MultipleSortFieldsError' do
         
     | 
| 
       17 
     | 
    
         
            -
                  expect { subject.scroll }.to raise_error Mongoid::Scroll::Errors::MultipleSortFieldsError,
         
     | 
| 
       18 
     | 
    
         
            -
                                                           /You're attempting to scroll over data with a sort order that includes multiple fields: name, value./
         
     | 
| 
       19 
     | 
    
         
            -
                end
         
     | 
| 
       20 
     | 
    
         
            -
              end
         
     | 
| 
       21 
     | 
    
         
            -
              context 'with no sort' do
         
     | 
| 
       22 
     | 
    
         
            -
                subject do
         
     | 
| 
       23 
     | 
    
         
            -
                  Mongoid.default_client['feed_items'].find
         
     | 
| 
      
 3 
     | 
    
         
            +
            if Object.const_defined?(:Mongo)
         
     | 
| 
      
 4 
     | 
    
         
            +
              describe Mongo::Collection::View do
         
     | 
| 
      
 5 
     | 
    
         
            +
                context 'scrollable' do
         
     | 
| 
      
 6 
     | 
    
         
            +
                  subject do
         
     | 
| 
      
 7 
     | 
    
         
            +
                    Mongoid.default_client['feed_items'].find
         
     | 
| 
      
 8 
     | 
    
         
            +
                  end
         
     | 
| 
      
 9 
     | 
    
         
            +
                  it ':scroll' do
         
     | 
| 
      
 10 
     | 
    
         
            +
                    expect(subject).to respond_to(:scroll)
         
     | 
| 
      
 11 
     | 
    
         
            +
                  end
         
     | 
| 
       24 
12 
     | 
    
         
             
                end
         
     | 
| 
       25 
     | 
    
         
            -
                 
     | 
| 
       26 
     | 
    
         
            -
                   
     | 
| 
      
 13 
     | 
    
         
            +
                context 'with multiple sort fields' do
         
     | 
| 
      
 14 
     | 
    
         
            +
                  subject do
         
     | 
| 
      
 15 
     | 
    
         
            +
                    Mongoid.default_client['feed_items'].find.sort(name: 1, value: -1)
         
     | 
| 
      
 16 
     | 
    
         
            +
                  end
         
     | 
| 
      
 17 
     | 
    
         
            +
                  it 'raises Mongoid::Scroll::Errors::MultipleSortFieldsError' do
         
     | 
| 
      
 18 
     | 
    
         
            +
                    expect { subject.scroll }.to raise_error Mongoid::Scroll::Errors::MultipleSortFieldsError,
         
     | 
| 
      
 19 
     | 
    
         
            +
                                                             /You're attempting to scroll over data with a sort order that includes multiple fields: name, value./
         
     | 
| 
      
 20 
     | 
    
         
            +
                  end
         
     | 
| 
       27 
21 
     | 
    
         
             
                end
         
     | 
| 
       28 
     | 
    
         
            -
             
     | 
| 
       29 
     | 
    
         
            -
             
     | 
| 
       30 
     | 
    
         
            -
             
     | 
| 
       31 
     | 
    
         
            -
                   
     | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
       33 
     | 
    
         
            -
             
     | 
| 
       34 
     | 
    
         
            -
                      a_integer: i,
         
     | 
| 
       35 
     | 
    
         
            -
                      a_datetime: DateTime.mongoize(DateTime.new(2013, i + 1, 21, 1, 42, 3, 'UTC')),
         
     | 
| 
       36 
     | 
    
         
            -
                      a_date: Date.mongoize(Date.new(2013, i + 1, 21)),
         
     | 
| 
       37 
     | 
    
         
            -
                      a_time: Time.mongoize(Time.at(Time.now.to_i + i))
         
     | 
| 
       38 
     | 
    
         
            -
                    )
         
     | 
| 
      
 22 
     | 
    
         
            +
                context 'with no sort' do
         
     | 
| 
      
 23 
     | 
    
         
            +
                  subject do
         
     | 
| 
      
 24 
     | 
    
         
            +
                    Mongoid.default_client['feed_items'].find
         
     | 
| 
      
 25 
     | 
    
         
            +
                  end
         
     | 
| 
      
 26 
     | 
    
         
            +
                  it 'adds a default sort by _id' do
         
     | 
| 
      
 27 
     | 
    
         
            +
                    expect(subject.scroll.sort).to eq('_id' => 1)
         
     | 
| 
       39 
28 
     | 
    
         
             
                  end
         
     | 
| 
       40 
29 
     | 
    
         
             
                end
         
     | 
| 
       41 
     | 
    
         
            -
                context ' 
     | 
| 
       42 
     | 
    
         
            -
                   
     | 
| 
       43 
     | 
    
         
            -
                     
     | 
| 
       44 
     | 
    
         
            -
             
     | 
| 
       45 
     | 
    
         
            -
             
     | 
| 
      
 30 
     | 
    
         
            +
                context 'with data' do
         
     | 
| 
      
 31 
     | 
    
         
            +
                  before :each do
         
     | 
| 
      
 32 
     | 
    
         
            +
                    10.times do |i|
         
     | 
| 
      
 33 
     | 
    
         
            +
                      Mongoid.default_client['feed_items'].insert_one(
         
     | 
| 
      
 34 
     | 
    
         
            +
                        a_string: i.to_s,
         
     | 
| 
      
 35 
     | 
    
         
            +
                        a_integer: i,
         
     | 
| 
      
 36 
     | 
    
         
            +
                        a_datetime: DateTime.mongoize(DateTime.new(2013, i + 1, 21, 1, 42, 3, 'UTC')),
         
     | 
| 
      
 37 
     | 
    
         
            +
                        a_date: Date.mongoize(Date.new(2013, i + 1, 21)),
         
     | 
| 
      
 38 
     | 
    
         
            +
                        a_time: Time.mongoize(Time.at(Time.now.to_i + i))
         
     | 
| 
      
 39 
     | 
    
         
            +
                      )
         
     | 
| 
       46 
40 
     | 
    
         
             
                    end
         
     | 
| 
       47 
     | 
    
         
            -
                    expect(records.size).to eq 10
         
     | 
| 
       48 
     | 
    
         
            -
                    expect(records).to eq Mongoid.default_client['feed_items'].find.to_a
         
     | 
| 
       49 
41 
     | 
    
         
             
                  end
         
     | 
| 
       50 
     | 
    
         
            -
             
     | 
| 
       51 
     | 
    
         
            -
             
     | 
| 
       52 
     | 
    
         
            -
                  context field_type do
         
     | 
| 
       53 
     | 
    
         
            -
                    it 'scrolls all with a block' do
         
     | 
| 
      
 42 
     | 
    
         
            +
                  context 'default' do
         
     | 
| 
      
 43 
     | 
    
         
            +
                    it 'scrolls all' do
         
     | 
| 
       54 
44 
     | 
    
         
             
                      records = []
         
     | 
| 
       55 
     | 
    
         
            -
                      Mongoid.default_client['feed_items'].find. 
     | 
| 
      
 45 
     | 
    
         
            +
                      Mongoid.default_client['feed_items'].find.scroll do |record, _next_cursor|
         
     | 
| 
       56 
46 
     | 
    
         
             
                        records << record
         
     | 
| 
       57 
47 
     | 
    
         
             
                      end
         
     | 
| 
       58 
48 
     | 
    
         
             
                      expect(records.size).to eq 10
         
     | 
| 
       59 
49 
     | 
    
         
             
                      expect(records).to eq Mongoid.default_client['feed_items'].find.to_a
         
     | 
| 
       60 
50 
     | 
    
         
             
                    end
         
     | 
| 
       61 
     | 
    
         
            -
             
     | 
| 
      
 51 
     | 
    
         
            +
                  end
         
     | 
| 
      
 52 
     | 
    
         
            +
                  { a_string: String, a_integer: Integer, a_date: Date, a_datetime: DateTime }.each_pair do |field_name, field_type|
         
     | 
| 
      
 53 
     | 
    
         
            +
                    context field_type do
         
     | 
| 
      
 54 
     | 
    
         
            +
                      it 'scrolls all with a block' do
         
     | 
| 
      
 55 
     | 
    
         
            +
                        records = []
         
     | 
| 
      
 56 
     | 
    
         
            +
                        Mongoid.default_client['feed_items'].find.sort(field_name => 1).scroll(nil, field_type: field_type) do |record, _next_cursor|
         
     | 
| 
      
 57 
     | 
    
         
            +
                          records << record
         
     | 
| 
      
 58 
     | 
    
         
            +
                        end
         
     | 
| 
      
 59 
     | 
    
         
            +
                        expect(records.size).to eq 10
         
     | 
| 
      
 60 
     | 
    
         
            +
                        expect(records).to eq Mongoid.default_client['feed_items'].find.to_a
         
     | 
| 
      
 61 
     | 
    
         
            +
                      end
         
     | 
| 
      
 62 
     | 
    
         
            +
                      it 'scrolls all with a break' do
         
     | 
| 
      
 63 
     | 
    
         
            +
                        records = []
         
     | 
| 
      
 64 
     | 
    
         
            +
                        cursor = nil
         
     | 
| 
      
 65 
     | 
    
         
            +
                        Mongoid.default_client['feed_items'].find.sort(field_name => 1).limit(5).scroll(nil, field_type: field_type) do |record, next_cursor|
         
     | 
| 
      
 66 
     | 
    
         
            +
                          records << record
         
     | 
| 
      
 67 
     | 
    
         
            +
                          cursor = next_cursor
         
     | 
| 
      
 68 
     | 
    
         
            +
                        end
         
     | 
| 
      
 69 
     | 
    
         
            +
                        expect(records.size).to eq 5
         
     | 
| 
      
 70 
     | 
    
         
            +
                        Mongoid.default_client['feed_items'].find.sort(field_name => 1).scroll(cursor, field_type: field_type) do |record, next_cursor|
         
     | 
| 
      
 71 
     | 
    
         
            +
                          records << record
         
     | 
| 
      
 72 
     | 
    
         
            +
                          cursor = next_cursor
         
     | 
| 
      
 73 
     | 
    
         
            +
                        end
         
     | 
| 
      
 74 
     | 
    
         
            +
                        expect(records.size).to eq 10
         
     | 
| 
      
 75 
     | 
    
         
            +
                        expect(records).to eq Mongoid.default_client['feed_items'].find.to_a
         
     | 
| 
      
 76 
     | 
    
         
            +
                      end
         
     | 
| 
      
 77 
     | 
    
         
            +
                      it 'scrolls in descending order' do
         
     | 
| 
      
 78 
     | 
    
         
            +
                        records = []
         
     | 
| 
      
 79 
     | 
    
         
            +
                        Mongoid.default_client['feed_items'].find.sort(field_name => -1).limit(3).scroll(nil, field_type: field_type, field_name: field_name) do |record, _next_cursor|
         
     | 
| 
      
 80 
     | 
    
         
            +
                          records << record
         
     | 
| 
      
 81 
     | 
    
         
            +
                        end
         
     | 
| 
      
 82 
     | 
    
         
            +
                        expect(records.size).to eq 3
         
     | 
| 
      
 83 
     | 
    
         
            +
                        expect(records).to eq Mongoid.default_client['feed_items'].find.sort(field_name => -1).limit(3).to_a
         
     | 
| 
      
 84 
     | 
    
         
            +
                      end
         
     | 
| 
      
 85 
     | 
    
         
            +
                      it 'map' do
         
     | 
| 
      
 86 
     | 
    
         
            +
                        record = Mongoid.default_client['feed_items'].find.limit(3).scroll(nil, field_type: field_type, field_name: field_name).map { |r| r }.last
         
     | 
| 
      
 87 
     | 
    
         
            +
                        cursor = Mongoid::Scroll::Cursor.from_record(record, field_type: field_type, field_name: field_name)
         
     | 
| 
      
 88 
     | 
    
         
            +
                        expect(cursor).to_not be nil
         
     | 
| 
      
 89 
     | 
    
         
            +
                        expect(cursor.to_s.split(':')).to eq [
         
     | 
| 
      
 90 
     | 
    
         
            +
                          Mongoid::Scroll::Cursor.transform_field_value(field_type, field_name, record[field_name.to_s]).to_s,
         
     | 
| 
      
 91 
     | 
    
         
            +
                          record['_id'].to_s
         
     | 
| 
      
 92 
     | 
    
         
            +
                        ]
         
     | 
| 
      
 93 
     | 
    
         
            +
                      end
         
     | 
| 
      
 94 
     | 
    
         
            +
                    end
         
     | 
| 
      
 95 
     | 
    
         
            +
                  end
         
     | 
| 
      
 96 
     | 
    
         
            +
                end
         
     | 
| 
      
 97 
     | 
    
         
            +
                context 'with overlapping data', if: MongoDB.mmapv1? do
         
     | 
| 
      
 98 
     | 
    
         
            +
                  before :each do
         
     | 
| 
      
 99 
     | 
    
         
            +
                    3.times { Feed::Item.create! a_integer: 5 }
         
     | 
| 
      
 100 
     | 
    
         
            +
                    Feed::Item.first.update_attributes!(name: Array(1000).join('a'))
         
     | 
| 
      
 101 
     | 
    
         
            +
                  end
         
     | 
| 
      
 102 
     | 
    
         
            +
                  it 'natural order is different from order by id' do
         
     | 
| 
      
 103 
     | 
    
         
            +
                    # natural order isn't necessarily going to be the same as _id order
         
     | 
| 
      
 104 
     | 
    
         
            +
                    # if a document is updated and grows in size, it may need to be relocated and
         
     | 
| 
      
 105 
     | 
    
         
            +
                    # thus cause the natural order to change
         
     | 
| 
      
 106 
     | 
    
         
            +
                    expect(Feed::Item.order_by('$natural' => 1).to_a).to_not eq Feed::Item.order_by(_id: 1).to_a
         
     | 
| 
      
 107 
     | 
    
         
            +
                  end
         
     | 
| 
      
 108 
     | 
    
         
            +
                  [{ a_integer: 1 }, { a_integer: -1 }].each do |sort_order|
         
     | 
| 
      
 109 
     | 
    
         
            +
                    it "scrolls by #{sort_order}" do
         
     | 
| 
       62 
110 
     | 
    
         
             
                      records = []
         
     | 
| 
       63 
111 
     | 
    
         
             
                      cursor = nil
         
     | 
| 
       64 
     | 
    
         
            -
                      Mongoid.default_client['feed_items'].find.sort( 
     | 
| 
      
 112 
     | 
    
         
            +
                      Mongoid.default_client['feed_items'].find.sort(sort_order).limit(2).scroll do |record, next_cursor|
         
     | 
| 
       65 
113 
     | 
    
         
             
                        records << record
         
     | 
| 
       66 
114 
     | 
    
         
             
                        cursor = next_cursor
         
     | 
| 
       67 
115 
     | 
    
         
             
                      end
         
     | 
| 
       68 
     | 
    
         
            -
                      expect(records.size).to eq  
     | 
| 
       69 
     | 
    
         
            -
                      Mongoid.default_client['feed_items'].find.sort( 
     | 
| 
       70 
     | 
    
         
            -
                        records << record
         
     | 
| 
       71 
     | 
    
         
            -
                        cursor = next_cursor
         
     | 
| 
       72 
     | 
    
         
            -
                      end
         
     | 
| 
       73 
     | 
    
         
            -
                      expect(records.size).to eq 10
         
     | 
| 
       74 
     | 
    
         
            -
                      expect(records).to eq Mongoid.default_client['feed_items'].find.to_a
         
     | 
| 
       75 
     | 
    
         
            -
                    end
         
     | 
| 
       76 
     | 
    
         
            -
                    it 'scrolls in descending order' do
         
     | 
| 
       77 
     | 
    
         
            -
                      records = []
         
     | 
| 
       78 
     | 
    
         
            -
                      Mongoid.default_client['feed_items'].find.sort(field_name => -1).limit(3).scroll(nil, field_type: field_type, field_name: field_name) do |record, _next_cursor|
         
     | 
| 
      
 116 
     | 
    
         
            +
                      expect(records.size).to eq 2
         
     | 
| 
      
 117 
     | 
    
         
            +
                      Mongoid.default_client['feed_items'].find.sort(sort_order).scroll(cursor) do |record, _next_cursor|
         
     | 
| 
       79 
118 
     | 
    
         
             
                        records << record
         
     | 
| 
       80 
119 
     | 
    
         
             
                      end
         
     | 
| 
       81 
120 
     | 
    
         
             
                      expect(records.size).to eq 3
         
     | 
| 
       82 
     | 
    
         
            -
                      expect(records).to eq Mongoid.default_client['feed_items'].find.sort( 
     | 
| 
       83 
     | 
    
         
            -
                    end
         
     | 
| 
       84 
     | 
    
         
            -
                    it 'map' do
         
     | 
| 
       85 
     | 
    
         
            -
                      record = Mongoid.default_client['feed_items'].find.limit(3).scroll(nil, field_type: field_type, field_name: field_name).map { |r| r }.last
         
     | 
| 
       86 
     | 
    
         
            -
                      cursor = Mongoid::Scroll::Cursor.from_record(record, field_type: field_type, field_name: field_name)
         
     | 
| 
       87 
     | 
    
         
            -
                      expect(cursor).to_not be nil
         
     | 
| 
       88 
     | 
    
         
            -
                      expect(cursor.to_s.split(':')).to eq [
         
     | 
| 
       89 
     | 
    
         
            -
                        Mongoid::Scroll::Cursor.transform_field_value(field_type, field_name, record[field_name.to_s]).to_s,
         
     | 
| 
       90 
     | 
    
         
            -
                        record['_id'].to_s
         
     | 
| 
       91 
     | 
    
         
            -
                      ]
         
     | 
| 
       92 
     | 
    
         
            -
                    end
         
     | 
| 
       93 
     | 
    
         
            -
                  end
         
     | 
| 
       94 
     | 
    
         
            -
                end
         
     | 
| 
       95 
     | 
    
         
            -
              end
         
     | 
| 
       96 
     | 
    
         
            -
              context 'with overlapping data' do
         
     | 
| 
       97 
     | 
    
         
            -
                before :each do
         
     | 
| 
       98 
     | 
    
         
            -
                  3.times { Feed::Item.create! a_integer: 5 }
         
     | 
| 
       99 
     | 
    
         
            -
                  Feed::Item.first.update_attributes!(name: Array(1000).join('a'))
         
     | 
| 
       100 
     | 
    
         
            -
                end
         
     | 
| 
       101 
     | 
    
         
            -
                it 'natural order is different from order by id' do
         
     | 
| 
       102 
     | 
    
         
            -
                  # natural order isn't necessarily going to be the same as _id order
         
     | 
| 
       103 
     | 
    
         
            -
                  # if a document is updated and grows in size, it may need to be relocated and
         
     | 
| 
       104 
     | 
    
         
            -
                  # thus cause the natural order to change
         
     | 
| 
       105 
     | 
    
         
            -
                  expect(Feed::Item.order_by('$natural' => 1).to_a).to_not eq Feed::Item.order_by(_id: 1).to_a
         
     | 
| 
       106 
     | 
    
         
            -
                end
         
     | 
| 
       107 
     | 
    
         
            -
                [{ a_integer: 1 }, { a_integer: -1 }].each do |sort_order|
         
     | 
| 
       108 
     | 
    
         
            -
                  it "scrolls by #{sort_order}" do
         
     | 
| 
       109 
     | 
    
         
            -
                    records = []
         
     | 
| 
       110 
     | 
    
         
            -
                    cursor = nil
         
     | 
| 
       111 
     | 
    
         
            -
                    Mongoid.default_client['feed_items'].find.sort(sort_order).limit(2).scroll do |record, next_cursor|
         
     | 
| 
       112 
     | 
    
         
            -
                      records << record
         
     | 
| 
       113 
     | 
    
         
            -
                      cursor = next_cursor
         
     | 
| 
       114 
     | 
    
         
            -
                    end
         
     | 
| 
       115 
     | 
    
         
            -
                    expect(records.size).to eq 2
         
     | 
| 
       116 
     | 
    
         
            -
                    Mongoid.default_client['feed_items'].find.sort(sort_order).scroll(cursor) do |record, _next_cursor|
         
     | 
| 
       117 
     | 
    
         
            -
                      records << record
         
     | 
| 
      
 121 
     | 
    
         
            +
                      expect(records).to eq Mongoid.default_client['feed_items'].find.sort(sort_order.merge(_id: sort_order[:a_integer])).to_a
         
     | 
| 
       118 
122 
     | 
    
         
             
                    end
         
     | 
| 
       119 
     | 
    
         
            -
                    expect(records.size).to eq 3
         
     | 
| 
       120 
     | 
    
         
            -
                    expect(records).to eq Mongoid.default_client['feed_items'].find.sort(sort_order.merge(_id: sort_order[:a_integer])).to_a
         
     | 
| 
       121 
123 
     | 
    
         
             
                  end
         
     | 
| 
       122 
124 
     | 
    
         
             
                end
         
     | 
| 
       123 
125 
     | 
    
         
             
              end
         
     | 
| 
       124 
     | 
    
         
            -
            end 
     | 
| 
      
 126 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -13,6 +13,7 @@ describe Mongoid::Criteria do 
     | 
|
| 
       13 
13 
     | 
    
         
             
                                                           /You're attempting to scroll over data with a sort order that includes multiple fields: name, value./
         
     | 
| 
       14 
14 
     | 
    
         
             
                end
         
     | 
| 
       15 
15 
     | 
    
         
             
              end
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
       16 
17 
     | 
    
         
             
              context 'with no sort' do
         
     | 
| 
       17 
18 
     | 
    
         
             
                subject do
         
     | 
| 
       18 
19 
     | 
    
         
             
                  Feed::Item.all
         
     | 
| 
         @@ -42,7 +43,30 @@ describe Mongoid::Criteria do 
     | 
|
| 
       42 
43 
     | 
    
         
             
                    expect(records.size).to eq 10
         
     | 
| 
       43 
44 
     | 
    
         
             
                    expect(records).to eq Feed::Item.all.to_a
         
     | 
| 
       44 
45 
     | 
    
         
             
                  end
         
     | 
| 
      
 46 
     | 
    
         
            +
                  it 'does not change original criteria' do
         
     | 
| 
      
 47 
     | 
    
         
            +
                    criteria = Feed::Item.where(:a_time.gt => Time.new(2013, 7, 22, 1, 2, 3))
         
     | 
| 
      
 48 
     | 
    
         
            +
                    original_criteria = criteria.dup
         
     | 
| 
      
 49 
     | 
    
         
            +
                    criteria.limit(2).scroll
         
     | 
| 
      
 50 
     | 
    
         
            +
                    expect(criteria).to eq original_criteria
         
     | 
| 
      
 51 
     | 
    
         
            +
                    cursor = nil
         
     | 
| 
      
 52 
     | 
    
         
            +
                    criteria.limit(2).scroll(cursor) do |_record, next_cursor|
         
     | 
| 
      
 53 
     | 
    
         
            +
                      cursor = next_cursor
         
     | 
| 
      
 54 
     | 
    
         
            +
                    end
         
     | 
| 
      
 55 
     | 
    
         
            +
                    criteria.scroll(cursor) do |_record, next_cursor|
         
     | 
| 
      
 56 
     | 
    
         
            +
                      cursor = next_cursor
         
     | 
| 
      
 57 
     | 
    
         
            +
                    end
         
     | 
| 
      
 58 
     | 
    
         
            +
                    expect(criteria).to eq original_criteria
         
     | 
| 
      
 59 
     | 
    
         
            +
                  end
         
     | 
| 
       45 
60 
     | 
    
         
             
                end
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
      
 62 
     | 
    
         
            +
                context 'with a foreign key' do
         
     | 
| 
      
 63 
     | 
    
         
            +
                  it 'sorts by object id' do
         
     | 
| 
      
 64 
     | 
    
         
            +
                    records = []
         
     | 
| 
      
 65 
     | 
    
         
            +
                    Feed::Item.asc('publisher_id').scroll { |r, _| records << r }
         
     | 
| 
      
 66 
     | 
    
         
            +
                    expect(records).not_to be_empty
         
     | 
| 
      
 67 
     | 
    
         
            +
                  end
         
     | 
| 
      
 68 
     | 
    
         
            +
                end
         
     | 
| 
      
 69 
     | 
    
         
            +
             
     | 
| 
       46 
70 
     | 
    
         
             
                { a_string: String, a_integer: Integer, a_date: Date, a_datetime: DateTime }.each_pair do |field_name, field_type|
         
     | 
| 
       47 
71 
     | 
    
         
             
                  context field_type do
         
     | 
| 
       48 
72 
     | 
    
         
             
                    it 'scrolls all with a block' do
         
     | 
| 
         @@ -68,6 +92,17 @@ describe Mongoid::Criteria do 
     | 
|
| 
       68 
92 
     | 
    
         
             
                      expect(records.size).to eq 10
         
     | 
| 
       69 
93 
     | 
    
         
             
                      expect(records).to eq Feed::Item.all.to_a
         
     | 
| 
       70 
94 
     | 
    
         
             
                    end
         
     | 
| 
      
 95 
     | 
    
         
            +
                    it 'scrolls from a cursor' do
         
     | 
| 
      
 96 
     | 
    
         
            +
                      last_record = nil
         
     | 
| 
      
 97 
     | 
    
         
            +
                      cursor = nil
         
     | 
| 
      
 98 
     | 
    
         
            +
                      Feed::Item.asc(field_name).limit(5).scroll do |record, next_cursor|
         
     | 
| 
      
 99 
     | 
    
         
            +
                        last_record = record
         
     | 
| 
      
 100 
     | 
    
         
            +
                        cursor = next_cursor
         
     | 
| 
      
 101 
     | 
    
         
            +
                      end
         
     | 
| 
      
 102 
     | 
    
         
            +
                      sixth_item = Feed::Item.asc(field_name).to_a[5]
         
     | 
| 
      
 103 
     | 
    
         
            +
                      from_item = Feed::Item.asc(field_name).scroll(cursor).to_a.first
         
     | 
| 
      
 104 
     | 
    
         
            +
                      expect(from_item).to eq sixth_item
         
     | 
| 
      
 105 
     | 
    
         
            +
                    end
         
     | 
| 
       71 
106 
     | 
    
         
             
                    it 'scrolls in descending order' do
         
     | 
| 
       72 
107 
     | 
    
         
             
                      records = []
         
     | 
| 
       73 
108 
     | 
    
         
             
                      Feed::Item.desc(field_name).limit(3).scroll do |record, _next_cursor|
         
     | 
| 
         @@ -160,7 +195,7 @@ describe Mongoid::Criteria do 
     | 
|
| 
       160 
195 
     | 
    
         
             
                  expect(records.map(&:name)).to eq ['embedded']
         
     | 
| 
       161 
196 
     | 
    
         
             
                end
         
     | 
| 
       162 
197 
     | 
    
         
             
              end
         
     | 
| 
       163 
     | 
    
         
            -
              context 'with overlapping data' do
         
     | 
| 
      
 198 
     | 
    
         
            +
              context 'with overlapping data', if: MongoDB.mmapv1? do
         
     | 
| 
       164 
199 
     | 
    
         
             
                before :each do
         
     | 
| 
       165 
200 
     | 
    
         
             
                  3.times { Feed::Item.create! a_integer: 5 }
         
     | 
| 
       166 
201 
     | 
    
         
             
                  Feed::Item.first.update_attributes!(name: Array(1000).join('a'))
         
     | 
| 
         @@ -124,7 +124,7 @@ describe Mongoid::Scroll::Cursor do 
     | 
|
| 
       124 
124 
     | 
    
         
             
                end
         
     | 
| 
       125 
125 
     | 
    
         
             
              end
         
     | 
| 
       126 
126 
     | 
    
         
             
              context 'an array field cursor' do
         
     | 
| 
       127 
     | 
    
         
            -
                let(:feed_item) { Feed::Item.create!(a_array: %w 
     | 
| 
      
 127 
     | 
    
         
            +
                let(:feed_item) { Feed::Item.create!(a_array: %w[x y]) }
         
     | 
| 
       128 
128 
     | 
    
         
             
                it 'is not supported' do
         
     | 
| 
       129 
129 
     | 
    
         
             
                  expect do
         
     | 
| 
       130 
130 
     | 
    
         
             
                    Mongoid::Scroll::Cursor.from_record feed_item, field_name: 'a_array', field_type: Array
         
     | 
    
        data/spec/moped/query_spec.rb
    CHANGED
    
    | 
         @@ -1,124 +1,126 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require 'spec_helper'
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
             
     | 
| 
       4 
     | 
    
         
            -
               
     | 
| 
       5 
     | 
    
         
            -
                 
     | 
| 
       6 
     | 
    
         
            -
                   
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
     | 
    
         
            -
                   
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
              context 'with multiple sort fields' do
         
     | 
| 
       13 
     | 
    
         
            -
                subject do
         
     | 
| 
       14 
     | 
    
         
            -
                  Mongoid.default_session['feed_items'].find.sort(name: 1, value: -1)
         
     | 
| 
       15 
     | 
    
         
            -
                end
         
     | 
| 
       16 
     | 
    
         
            -
                it 'raises Mongoid::Scroll::Errors::MultipleSortFieldsError' do
         
     | 
| 
       17 
     | 
    
         
            -
                  expect { subject.scroll }.to raise_error Mongoid::Scroll::Errors::MultipleSortFieldsError,
         
     | 
| 
       18 
     | 
    
         
            -
                                                           /You're attempting to scroll over data with a sort order that includes multiple fields: name, value./
         
     | 
| 
       19 
     | 
    
         
            -
                end
         
     | 
| 
       20 
     | 
    
         
            -
              end
         
     | 
| 
       21 
     | 
    
         
            -
              context 'with no sort' do
         
     | 
| 
       22 
     | 
    
         
            -
                subject do
         
     | 
| 
       23 
     | 
    
         
            -
                  Mongoid.default_session['feed_items'].find
         
     | 
| 
      
 3 
     | 
    
         
            +
            if Object.const_defined?(:Moped)
         
     | 
| 
      
 4 
     | 
    
         
            +
              describe Moped::Query do
         
     | 
| 
      
 5 
     | 
    
         
            +
                context 'scrollable' do
         
     | 
| 
      
 6 
     | 
    
         
            +
                  subject do
         
     | 
| 
      
 7 
     | 
    
         
            +
                    Mongoid.default_session['feed_items'].find
         
     | 
| 
      
 8 
     | 
    
         
            +
                  end
         
     | 
| 
      
 9 
     | 
    
         
            +
                  it ':scroll' do
         
     | 
| 
      
 10 
     | 
    
         
            +
                    expect(subject).to respond_to(:scroll)
         
     | 
| 
      
 11 
     | 
    
         
            +
                  end
         
     | 
| 
       24 
12 
     | 
    
         
             
                end
         
     | 
| 
       25 
     | 
    
         
            -
                 
     | 
| 
       26 
     | 
    
         
            -
                   
     | 
| 
      
 13 
     | 
    
         
            +
                context 'with multiple sort fields' do
         
     | 
| 
      
 14 
     | 
    
         
            +
                  subject do
         
     | 
| 
      
 15 
     | 
    
         
            +
                    Mongoid.default_session['feed_items'].find.sort(name: 1, value: -1)
         
     | 
| 
      
 16 
     | 
    
         
            +
                  end
         
     | 
| 
      
 17 
     | 
    
         
            +
                  it 'raises Mongoid::Scroll::Errors::MultipleSortFieldsError' do
         
     | 
| 
      
 18 
     | 
    
         
            +
                    expect { subject.scroll }.to raise_error Mongoid::Scroll::Errors::MultipleSortFieldsError,
         
     | 
| 
      
 19 
     | 
    
         
            +
                                                             /You're attempting to scroll over data with a sort order that includes multiple fields: name, value./
         
     | 
| 
      
 20 
     | 
    
         
            +
                  end
         
     | 
| 
       27 
21 
     | 
    
         
             
                end
         
     | 
| 
       28 
     | 
    
         
            -
             
     | 
| 
       29 
     | 
    
         
            -
             
     | 
| 
       30 
     | 
    
         
            -
             
     | 
| 
       31 
     | 
    
         
            -
                   
     | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
       33 
     | 
    
         
            -
             
     | 
| 
       34 
     | 
    
         
            -
                      a_integer: i,
         
     | 
| 
       35 
     | 
    
         
            -
                      a_datetime: DateTime.mongoize(DateTime.new(2013, i + 1, 21, 1, 42, 3, 'UTC')),
         
     | 
| 
       36 
     | 
    
         
            -
                      a_date: Date.mongoize(Date.new(2013, i + 1, 21)),
         
     | 
| 
       37 
     | 
    
         
            -
                      a_time: Time.mongoize(Time.at(Time.now.to_i + i))
         
     | 
| 
       38 
     | 
    
         
            -
                    )
         
     | 
| 
      
 22 
     | 
    
         
            +
                context 'with no sort' do
         
     | 
| 
      
 23 
     | 
    
         
            +
                  subject do
         
     | 
| 
      
 24 
     | 
    
         
            +
                    Mongoid.default_session['feed_items'].find
         
     | 
| 
      
 25 
     | 
    
         
            +
                  end
         
     | 
| 
      
 26 
     | 
    
         
            +
                  it 'adds a default sort by _id' do
         
     | 
| 
      
 27 
     | 
    
         
            +
                    expect(subject.scroll.operation.selector['$orderby']).to eq(_id: 1)
         
     | 
| 
       39 
28 
     | 
    
         
             
                  end
         
     | 
| 
       40 
29 
     | 
    
         
             
                end
         
     | 
| 
       41 
     | 
    
         
            -
                context ' 
     | 
| 
       42 
     | 
    
         
            -
                   
     | 
| 
       43 
     | 
    
         
            -
                     
     | 
| 
       44 
     | 
    
         
            -
             
     | 
| 
       45 
     | 
    
         
            -
             
     | 
| 
      
 30 
     | 
    
         
            +
                context 'with data' do
         
     | 
| 
      
 31 
     | 
    
         
            +
                  before :each do
         
     | 
| 
      
 32 
     | 
    
         
            +
                    10.times do |i|
         
     | 
| 
      
 33 
     | 
    
         
            +
                      Mongoid.default_session['feed_items'].insert(
         
     | 
| 
      
 34 
     | 
    
         
            +
                        a_string: i.to_s,
         
     | 
| 
      
 35 
     | 
    
         
            +
                        a_integer: i,
         
     | 
| 
      
 36 
     | 
    
         
            +
                        a_datetime: DateTime.mongoize(DateTime.new(2013, i + 1, 21, 1, 42, 3, 'UTC')),
         
     | 
| 
      
 37 
     | 
    
         
            +
                        a_date: Date.mongoize(Date.new(2013, i + 1, 21)),
         
     | 
| 
      
 38 
     | 
    
         
            +
                        a_time: Time.mongoize(Time.at(Time.now.to_i + i))
         
     | 
| 
      
 39 
     | 
    
         
            +
                      )
         
     | 
| 
       46 
40 
     | 
    
         
             
                    end
         
     | 
| 
       47 
     | 
    
         
            -
                    expect(records.size).to eq 10
         
     | 
| 
       48 
     | 
    
         
            -
                    expect(records).to eq Mongoid.default_session['feed_items'].find.to_a
         
     | 
| 
       49 
41 
     | 
    
         
             
                  end
         
     | 
| 
       50 
     | 
    
         
            -
             
     | 
| 
       51 
     | 
    
         
            -
             
     | 
| 
       52 
     | 
    
         
            -
                  context field_type do
         
     | 
| 
       53 
     | 
    
         
            -
                    it 'scrolls all with a block' do
         
     | 
| 
      
 42 
     | 
    
         
            +
                  context 'default' do
         
     | 
| 
      
 43 
     | 
    
         
            +
                    it 'scrolls all' do
         
     | 
| 
       54 
44 
     | 
    
         
             
                      records = []
         
     | 
| 
       55 
     | 
    
         
            -
                      Mongoid.default_session['feed_items'].find. 
     | 
| 
      
 45 
     | 
    
         
            +
                      Mongoid.default_session['feed_items'].find.scroll do |record, _next_cursor|
         
     | 
| 
       56 
46 
     | 
    
         
             
                        records << record
         
     | 
| 
       57 
47 
     | 
    
         
             
                      end
         
     | 
| 
       58 
48 
     | 
    
         
             
                      expect(records.size).to eq 10
         
     | 
| 
       59 
49 
     | 
    
         
             
                      expect(records).to eq Mongoid.default_session['feed_items'].find.to_a
         
     | 
| 
       60 
50 
     | 
    
         
             
                    end
         
     | 
| 
       61 
     | 
    
         
            -
             
     | 
| 
      
 51 
     | 
    
         
            +
                  end
         
     | 
| 
      
 52 
     | 
    
         
            +
                  { a_string: String, a_integer: Integer, a_date: Date, a_datetime: DateTime }.each_pair do |field_name, field_type|
         
     | 
| 
      
 53 
     | 
    
         
            +
                    context field_type do
         
     | 
| 
      
 54 
     | 
    
         
            +
                      it 'scrolls all with a block' do
         
     | 
| 
      
 55 
     | 
    
         
            +
                        records = []
         
     | 
| 
      
 56 
     | 
    
         
            +
                        Mongoid.default_session['feed_items'].find.sort(field_name => 1).scroll(nil, field_type: field_type) do |record, _next_cursor|
         
     | 
| 
      
 57 
     | 
    
         
            +
                          records << record
         
     | 
| 
      
 58 
     | 
    
         
            +
                        end
         
     | 
| 
      
 59 
     | 
    
         
            +
                        expect(records.size).to eq 10
         
     | 
| 
      
 60 
     | 
    
         
            +
                        expect(records).to eq Mongoid.default_session['feed_items'].find.to_a
         
     | 
| 
      
 61 
     | 
    
         
            +
                      end
         
     | 
| 
      
 62 
     | 
    
         
            +
                      it 'scrolls all with a break' do
         
     | 
| 
      
 63 
     | 
    
         
            +
                        records = []
         
     | 
| 
      
 64 
     | 
    
         
            +
                        cursor = nil
         
     | 
| 
      
 65 
     | 
    
         
            +
                        Mongoid.default_session['feed_items'].find.sort(field_name => 1).limit(5).scroll(nil, field_type: field_type) do |record, next_cursor|
         
     | 
| 
      
 66 
     | 
    
         
            +
                          records << record
         
     | 
| 
      
 67 
     | 
    
         
            +
                          cursor = next_cursor
         
     | 
| 
      
 68 
     | 
    
         
            +
                        end
         
     | 
| 
      
 69 
     | 
    
         
            +
                        expect(records.size).to eq 5
         
     | 
| 
      
 70 
     | 
    
         
            +
                        Mongoid.default_session['feed_items'].find.sort(field_name => 1).scroll(cursor, field_type: field_type) do |record, next_cursor|
         
     | 
| 
      
 71 
     | 
    
         
            +
                          records << record
         
     | 
| 
      
 72 
     | 
    
         
            +
                          cursor = next_cursor
         
     | 
| 
      
 73 
     | 
    
         
            +
                        end
         
     | 
| 
      
 74 
     | 
    
         
            +
                        expect(records.size).to eq 10
         
     | 
| 
      
 75 
     | 
    
         
            +
                        expect(records).to eq Mongoid.default_session['feed_items'].find.to_a
         
     | 
| 
      
 76 
     | 
    
         
            +
                      end
         
     | 
| 
      
 77 
     | 
    
         
            +
                      it 'scrolls in descending order' do
         
     | 
| 
      
 78 
     | 
    
         
            +
                        records = []
         
     | 
| 
      
 79 
     | 
    
         
            +
                        Mongoid.default_session['feed_items'].find.sort(field_name => -1).limit(3).scroll(nil, field_type: field_type, field_name: field_name) do |record, _next_cursor|
         
     | 
| 
      
 80 
     | 
    
         
            +
                          records << record
         
     | 
| 
      
 81 
     | 
    
         
            +
                        end
         
     | 
| 
      
 82 
     | 
    
         
            +
                        expect(records.size).to eq 3
         
     | 
| 
      
 83 
     | 
    
         
            +
                        expect(records).to eq Mongoid.default_session['feed_items'].find.sort(field_name => -1).limit(3).to_a
         
     | 
| 
      
 84 
     | 
    
         
            +
                      end
         
     | 
| 
      
 85 
     | 
    
         
            +
                      it 'map' do
         
     | 
| 
      
 86 
     | 
    
         
            +
                        record = Mongoid.default_session['feed_items'].find.limit(3).scroll(nil, field_type: field_type, field_name: field_name).map { |r| r }.last
         
     | 
| 
      
 87 
     | 
    
         
            +
                        cursor = Mongoid::Scroll::Cursor.from_record(record, field_type: field_type, field_name: field_name)
         
     | 
| 
      
 88 
     | 
    
         
            +
                        expect(cursor).to_not be nil
         
     | 
| 
      
 89 
     | 
    
         
            +
                        expect(cursor.to_s.split(':')).to eq [
         
     | 
| 
      
 90 
     | 
    
         
            +
                          Mongoid::Scroll::Cursor.transform_field_value(field_type, field_name, record[field_name.to_s]).to_s,
         
     | 
| 
      
 91 
     | 
    
         
            +
                          record['_id'].to_s
         
     | 
| 
      
 92 
     | 
    
         
            +
                        ]
         
     | 
| 
      
 93 
     | 
    
         
            +
                      end
         
     | 
| 
      
 94 
     | 
    
         
            +
                    end
         
     | 
| 
      
 95 
     | 
    
         
            +
                  end
         
     | 
| 
      
 96 
     | 
    
         
            +
                end
         
     | 
| 
      
 97 
     | 
    
         
            +
                context 'with overlapping data', if: MongoDB.mmapv1? do
         
     | 
| 
      
 98 
     | 
    
         
            +
                  before :each do
         
     | 
| 
      
 99 
     | 
    
         
            +
                    3.times { Feed::Item.create! a_integer: 5 }
         
     | 
| 
      
 100 
     | 
    
         
            +
                    Feed::Item.first.update_attributes!(name: Array(1000).join('a'))
         
     | 
| 
      
 101 
     | 
    
         
            +
                  end
         
     | 
| 
      
 102 
     | 
    
         
            +
                  it 'natural order is different from order by id' do
         
     | 
| 
      
 103 
     | 
    
         
            +
                    # natural order isn't necessarily going to be the same as _id order
         
     | 
| 
      
 104 
     | 
    
         
            +
                    # if a document is updated and grows in size, it may need to be relocated and
         
     | 
| 
      
 105 
     | 
    
         
            +
                    # thus cause the natural order to change
         
     | 
| 
      
 106 
     | 
    
         
            +
                    expect(Feed::Item.order_by('$natural' => 1).to_a).to_not eq Feed::Item.order_by(_id: 1).to_a
         
     | 
| 
      
 107 
     | 
    
         
            +
                  end
         
     | 
| 
      
 108 
     | 
    
         
            +
                  [{ a_integer: 1 }, { a_integer: -1 }].each do |sort_order|
         
     | 
| 
      
 109 
     | 
    
         
            +
                    it "scrolls by #{sort_order}" do
         
     | 
| 
       62 
110 
     | 
    
         
             
                      records = []
         
     | 
| 
       63 
111 
     | 
    
         
             
                      cursor = nil
         
     | 
| 
       64 
     | 
    
         
            -
                      Mongoid.default_session['feed_items'].find.sort( 
     | 
| 
      
 112 
     | 
    
         
            +
                      Mongoid.default_session['feed_items'].find.sort(sort_order).limit(2).scroll do |record, next_cursor|
         
     | 
| 
       65 
113 
     | 
    
         
             
                        records << record
         
     | 
| 
       66 
114 
     | 
    
         
             
                        cursor = next_cursor
         
     | 
| 
       67 
115 
     | 
    
         
             
                      end
         
     | 
| 
       68 
     | 
    
         
            -
                      expect(records.size).to eq  
     | 
| 
       69 
     | 
    
         
            -
                      Mongoid.default_session['feed_items'].find.sort( 
     | 
| 
       70 
     | 
    
         
            -
                        records << record
         
     | 
| 
       71 
     | 
    
         
            -
                        cursor = next_cursor
         
     | 
| 
       72 
     | 
    
         
            -
                      end
         
     | 
| 
       73 
     | 
    
         
            -
                      expect(records.size).to eq 10
         
     | 
| 
       74 
     | 
    
         
            -
                      expect(records).to eq Mongoid.default_session['feed_items'].find.to_a
         
     | 
| 
       75 
     | 
    
         
            -
                    end
         
     | 
| 
       76 
     | 
    
         
            -
                    it 'scrolls in descending order' do
         
     | 
| 
       77 
     | 
    
         
            -
                      records = []
         
     | 
| 
       78 
     | 
    
         
            -
                      Mongoid.default_session['feed_items'].find.sort(field_name => -1).limit(3).scroll(nil, field_type: field_type, field_name: field_name) do |record, _next_cursor|
         
     | 
| 
      
 116 
     | 
    
         
            +
                      expect(records.size).to eq 2
         
     | 
| 
      
 117 
     | 
    
         
            +
                      Mongoid.default_session['feed_items'].find.sort(sort_order).scroll(cursor) do |record, _next_cursor|
         
     | 
| 
       79 
118 
     | 
    
         
             
                        records << record
         
     | 
| 
       80 
119 
     | 
    
         
             
                      end
         
     | 
| 
       81 
120 
     | 
    
         
             
                      expect(records.size).to eq 3
         
     | 
| 
       82 
     | 
    
         
            -
                      expect(records).to eq Mongoid.default_session['feed_items'].find.sort( 
     | 
| 
       83 
     | 
    
         
            -
                    end
         
     | 
| 
       84 
     | 
    
         
            -
                    it 'map' do
         
     | 
| 
       85 
     | 
    
         
            -
                      record = Mongoid.default_session['feed_items'].find.limit(3).scroll(nil, field_type: field_type, field_name: field_name).map { |r| r }.last
         
     | 
| 
       86 
     | 
    
         
            -
                      cursor = Mongoid::Scroll::Cursor.from_record(record, field_type: field_type, field_name: field_name)
         
     | 
| 
       87 
     | 
    
         
            -
                      expect(cursor).to_not be nil
         
     | 
| 
       88 
     | 
    
         
            -
                      expect(cursor.to_s.split(':')).to eq [
         
     | 
| 
       89 
     | 
    
         
            -
                        Mongoid::Scroll::Cursor.transform_field_value(field_type, field_name, record[field_name.to_s]).to_s,
         
     | 
| 
       90 
     | 
    
         
            -
                        record['_id'].to_s
         
     | 
| 
       91 
     | 
    
         
            -
                      ]
         
     | 
| 
       92 
     | 
    
         
            -
                    end
         
     | 
| 
       93 
     | 
    
         
            -
                  end
         
     | 
| 
       94 
     | 
    
         
            -
                end
         
     | 
| 
       95 
     | 
    
         
            -
              end
         
     | 
| 
       96 
     | 
    
         
            -
              context 'with overlapping data' do
         
     | 
| 
       97 
     | 
    
         
            -
                before :each do
         
     | 
| 
       98 
     | 
    
         
            -
                  3.times { Feed::Item.create! a_integer: 5 }
         
     | 
| 
       99 
     | 
    
         
            -
                  Feed::Item.first.update_attributes!(name: Array(1000).join('a'))
         
     | 
| 
       100 
     | 
    
         
            -
                end
         
     | 
| 
       101 
     | 
    
         
            -
                it 'natural order is different from order by id' do
         
     | 
| 
       102 
     | 
    
         
            -
                  # natural order isn't necessarily going to be the same as _id order
         
     | 
| 
       103 
     | 
    
         
            -
                  # if a document is updated and grows in size, it may need to be relocated and
         
     | 
| 
       104 
     | 
    
         
            -
                  # thus cause the natural order to change
         
     | 
| 
       105 
     | 
    
         
            -
                  expect(Feed::Item.order_by('$natural' => 1).to_a).to_not eq Feed::Item.order_by(_id: 1).to_a
         
     | 
| 
       106 
     | 
    
         
            -
                end
         
     | 
| 
       107 
     | 
    
         
            -
                [{ a_integer: 1 }, { a_integer: -1 }].each do |sort_order|
         
     | 
| 
       108 
     | 
    
         
            -
                  it "scrolls by #{sort_order}" do
         
     | 
| 
       109 
     | 
    
         
            -
                    records = []
         
     | 
| 
       110 
     | 
    
         
            -
                    cursor = nil
         
     | 
| 
       111 
     | 
    
         
            -
                    Mongoid.default_session['feed_items'].find.sort(sort_order).limit(2).scroll do |record, next_cursor|
         
     | 
| 
       112 
     | 
    
         
            -
                      records << record
         
     | 
| 
       113 
     | 
    
         
            -
                      cursor = next_cursor
         
     | 
| 
       114 
     | 
    
         
            -
                    end
         
     | 
| 
       115 
     | 
    
         
            -
                    expect(records.size).to eq 2
         
     | 
| 
       116 
     | 
    
         
            -
                    Mongoid.default_session['feed_items'].find.sort(sort_order).scroll(cursor) do |record, _next_cursor|
         
     | 
| 
       117 
     | 
    
         
            -
                      records << record
         
     | 
| 
      
 121 
     | 
    
         
            +
                      expect(records).to eq Mongoid.default_session['feed_items'].find.sort(sort_order.merge(_id: sort_order[:a_integer])).to_a
         
     | 
| 
       118 
122 
     | 
    
         
             
                    end
         
     | 
| 
       119 
     | 
    
         
            -
                    expect(records.size).to eq 3
         
     | 
| 
       120 
     | 
    
         
            -
                    expect(records).to eq Mongoid.default_session['feed_items'].find.sort(sort_order.merge(_id: sort_order[:a_integer])).to_a
         
     | 
| 
       121 
123 
     | 
    
         
             
                  end
         
     | 
| 
       122 
124 
     | 
    
         
             
                end
         
     | 
| 
       123 
125 
     | 
    
         
             
              end
         
     | 
| 
       124 
     | 
    
         
            -
            end 
     | 
| 
      
 126 
     | 
    
         
            +
            end
         
     | 
    
        data/spec/spec_helper.rb
    CHANGED
    
    | 
         @@ -4,6 +4,7 @@ $LOAD_PATH.unshift(File.dirname(__FILE__)) 
     | 
|
| 
       4 
4 
     | 
    
         
             
            require 'rubygems'
         
     | 
| 
       5 
5 
     | 
    
         
             
            require 'rspec'
         
     | 
| 
       6 
6 
     | 
    
         
             
            require 'rspec/its'
         
     | 
| 
      
 7 
     | 
    
         
            +
            require 'database_cleaner'
         
     | 
| 
       7 
8 
     | 
    
         
             
            require 'mongoid-scroll'
         
     | 
| 
       8 
9 
     | 
    
         | 
| 
       9 
10 
     | 
    
         
             
            Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each do |f|
         
     | 
| 
         @@ -17,9 +18,9 @@ end 
     | 
|
| 
       17 
18 
     | 
    
         
             
            RSpec.configure do |config|
         
     | 
| 
       18 
19 
     | 
    
         
             
              config.before :all do
         
     | 
| 
       19 
20 
     | 
    
         
             
                Mongoid.logger.level = Logger::INFO
         
     | 
| 
       20 
     | 
    
         
            -
                Mongo::Logger.logger.level = Logger::INFO if Mongoid::Compatibility::Version.mongoid5?
         
     | 
| 
      
 21 
     | 
    
         
            +
                Mongo::Logger.logger.level = Logger::INFO if Mongoid::Compatibility::Version.mongoid5? || Mongoid::Compatibility::Version.mongoid6?
         
     | 
| 
       21 
22 
     | 
    
         
             
              end
         
     | 
| 
       22 
23 
     | 
    
         
             
              config.before :each do
         
     | 
| 
       23 
     | 
    
         
            -
                 
     | 
| 
      
 24 
     | 
    
         
            +
                DatabaseCleaner.clean
         
     | 
| 
       24 
25 
     | 
    
         
             
              end
         
     | 
| 
       25 
26 
     | 
    
         
             
            end
         
     | 
    
        data/spec/support/feed/item.rb
    CHANGED
    
    | 
         @@ -10,6 +10,10 @@ module Feed 
     | 
|
| 
       10 
10 
     | 
    
         
             
                field :a_time, type: Time
         
     | 
| 
       11 
11 
     | 
    
         
             
                field :a_array, type: Array
         
     | 
| 
       12 
12 
     | 
    
         | 
| 
       13 
     | 
    
         
            -
                embeds_many :embedded_items
         
     | 
| 
      
 13 
     | 
    
         
            +
                embeds_many :embedded_items, class_name: 'Feed::EmbeddedItem'
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                publisher_options = { class_name: 'Feed::Publisher' }
         
     | 
| 
      
 16 
     | 
    
         
            +
                publisher_options[:optional] = true if Mongoid::Compatibility::Version.mongoid6? || Mongoid::Compatibility::Version.mongoid7?
         
     | 
| 
      
 17 
     | 
    
         
            +
                belongs_to :publisher, publisher_options
         
     | 
| 
       14 
18 
     | 
    
         
             
              end
         
     | 
| 
       15 
19 
     | 
    
         
             
            end
         
     | 
| 
         @@ -0,0 +1,9 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module MongoDB
         
     | 
| 
      
 2 
     | 
    
         
            +
              def self.mmapv1?
         
     | 
| 
      
 3 
     | 
    
         
            +
                if Mongoid.respond_to?(:default_session)
         
     | 
| 
      
 4 
     | 
    
         
            +
                  Mongoid.default_session.command(serverStatus: 1)['storageEngine']['name'] == 'mmapv1'
         
     | 
| 
      
 5 
     | 
    
         
            +
                else
         
     | 
| 
      
 6 
     | 
    
         
            +
                  Mongoid.default_client.command(serverStatus: 1).first['storageEngine']['name'] == 'mmapv1'
         
     | 
| 
      
 7 
     | 
    
         
            +
                end
         
     | 
| 
      
 8 
     | 
    
         
            +
              end
         
     | 
| 
      
 9 
     | 
    
         
            +
            end
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: mongoid-scroll
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 0.3. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.3.6
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Daniel Doubrovkine
         
     | 
| 
         @@ -9,7 +9,7 @@ authors: 
     | 
|
| 
       9 
9 
     | 
    
         
             
            autorequire: 
         
     | 
| 
       10 
10 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       11 
11 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       12 
     | 
    
         
            -
            date:  
     | 
| 
      
 12 
     | 
    
         
            +
            date: 2018-05-01 00:00:00.000000000 Z
         
     | 
| 
       13 
13 
     | 
    
         
             
            dependencies:
         
     | 
| 
       14 
14 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       15 
15 
     | 
    
         
             
              name: mongoid
         
     | 
| 
         @@ -77,7 +77,7 @@ files: 
     | 
|
| 
       77 
77 
     | 
    
         
             
            - lib/config/locales/en.yml
         
     | 
| 
       78 
78 
     | 
    
         
             
            - lib/mongo/scrollable.rb
         
     | 
| 
       79 
79 
     | 
    
         
             
            - lib/mongoid-scroll.rb
         
     | 
| 
       80 
     | 
    
         
            -
            - lib/mongoid/ 
     | 
| 
      
 80 
     | 
    
         
            +
            - lib/mongoid/criteria/scrollable.rb
         
     | 
| 
       81 
81 
     | 
    
         
             
            - lib/mongoid/scroll/cursor.rb
         
     | 
| 
       82 
82 
     | 
    
         
             
            - lib/mongoid/scroll/errors.rb
         
     | 
| 
       83 
83 
     | 
    
         
             
            - lib/mongoid/scroll/errors/base.rb
         
     | 
| 
         @@ -97,6 +97,8 @@ files: 
     | 
|
| 
       97 
97 
     | 
    
         
             
            - spec/spec_helper.rb
         
     | 
| 
       98 
98 
     | 
    
         
             
            - spec/support/feed/embedded_item.rb
         
     | 
| 
       99 
99 
     | 
    
         
             
            - spec/support/feed/item.rb
         
     | 
| 
      
 100 
     | 
    
         
            +
            - spec/support/feed/publisher.rb
         
     | 
| 
      
 101 
     | 
    
         
            +
            - spec/support/mongodb.rb
         
     | 
| 
       100 
102 
     | 
    
         
             
            homepage: http://github.com/mongoid/mongoid-scroll
         
     | 
| 
       101 
103 
     | 
    
         
             
            licenses:
         
     | 
| 
       102 
104 
     | 
    
         
             
            - MIT
         
     | 
| 
         @@ -117,7 +119,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement 
     | 
|
| 
       117 
119 
     | 
    
         
             
                  version: 1.3.6
         
     | 
| 
       118 
120 
     | 
    
         
             
            requirements: []
         
     | 
| 
       119 
121 
     | 
    
         
             
            rubyforge_project: 
         
     | 
| 
       120 
     | 
    
         
            -
            rubygems_version: 2. 
     | 
| 
      
 122 
     | 
    
         
            +
            rubygems_version: 2.6.12
         
     | 
| 
       121 
123 
     | 
    
         
             
            signing_key: 
         
     | 
| 
       122 
124 
     | 
    
         
             
            specification_version: 4
         
     | 
| 
       123 
125 
     | 
    
         
             
            summary: Mongoid extensions to enable infinite scroll.
         
     | 
| 
         @@ -1,35 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            module Mongoid
         
     | 
| 
       2 
     | 
    
         
            -
              module Criterion
         
     | 
| 
       3 
     | 
    
         
            -
                module Scrollable
         
     | 
| 
       4 
     | 
    
         
            -
                  def scroll(cursor = nil, &_block)
         
     | 
| 
       5 
     | 
    
         
            -
                    criteria = self
         
     | 
| 
       6 
     | 
    
         
            -
                    # we don't support scrolling over a criteria with multiple fields
         
     | 
| 
       7 
     | 
    
         
            -
                    if criteria.options[:sort] && criteria.options[:sort].keys.size != 1
         
     | 
| 
       8 
     | 
    
         
            -
                      raise Mongoid::Scroll::Errors::MultipleSortFieldsError.new(sort: criteria.options[:sort])
         
     | 
| 
       9 
     | 
    
         
            -
                    elsif !criteria.options.key?(:sort) || criteria.options[:sort].empty?
         
     | 
| 
       10 
     | 
    
         
            -
                      # introduce a default sort order if there's none
         
     | 
| 
       11 
     | 
    
         
            -
                      criteria = criteria.asc(:_id)
         
     | 
| 
       12 
     | 
    
         
            -
                    end
         
     | 
| 
       13 
     | 
    
         
            -
                    # scroll field and direction
         
     | 
| 
       14 
     | 
    
         
            -
                    scroll_field = criteria.options[:sort].keys.first
         
     | 
| 
       15 
     | 
    
         
            -
                    scroll_direction = criteria.options[:sort].values.first.to_i
         
     | 
| 
       16 
     | 
    
         
            -
                    # scroll cursor from the parameter, with value and tiebreak_id
         
     | 
| 
       17 
     | 
    
         
            -
                    field = criteria.klass.fields[scroll_field.to_s]
         
     | 
| 
       18 
     | 
    
         
            -
                    cursor_options = { field_type: field.type, field_name: scroll_field, direction: scroll_direction }
         
     | 
| 
       19 
     | 
    
         
            -
                    cursor = cursor.is_a?(Mongoid::Scroll::Cursor) ? cursor : Mongoid::Scroll::Cursor.new(cursor, cursor_options)
         
     | 
| 
       20 
     | 
    
         
            -
                    # scroll
         
     | 
| 
       21 
     | 
    
         
            -
                    if block_given?
         
     | 
| 
       22 
     | 
    
         
            -
                      cursor_criteria = criteria.dup
         
     | 
| 
       23 
     | 
    
         
            -
                      cursor_criteria.selector = { '$and' => [criteria.selector, cursor.criteria] }
         
     | 
| 
       24 
     | 
    
         
            -
                      cursor_criteria.order_by(_id: scroll_direction).each do |record|
         
     | 
| 
       25 
     | 
    
         
            -
                        yield record, Mongoid::Scroll::Cursor.from_record(record, cursor_options)
         
     | 
| 
       26 
     | 
    
         
            -
                      end
         
     | 
| 
       27 
     | 
    
         
            -
                    else
         
     | 
| 
       28 
     | 
    
         
            -
                      criteria
         
     | 
| 
       29 
     | 
    
         
            -
                    end
         
     | 
| 
       30 
     | 
    
         
            -
                  end
         
     | 
| 
       31 
     | 
    
         
            -
                end
         
     | 
| 
       32 
     | 
    
         
            -
              end
         
     | 
| 
       33 
     | 
    
         
            -
            end
         
     | 
| 
       34 
     | 
    
         
            -
             
     | 
| 
       35 
     | 
    
         
            -
            Mongoid::Criteria.send(:include, Mongoid::Criterion::Scrollable)
         
     |