occams-record 1.4.0.pre.beta1 → 1.4.0
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
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: c1dc718c0f99f5ad039974f8db3bd1c5304e41a3b3275d26dd1d86235c7790fe
|
|
4
|
+
data.tar.gz: 8af374148ca1f1c8342b7eb8fdb30031d6c31a1d923a6e7cab55b96712ed2602
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 54b539bc70b1fc92c087fbc91f7edbaa1eb4dabacfda80ca0afa4ccd4ac53e832d431f3c95e35785cfa7bd7075879c655ae54019c3f341255b4411929b5ae615
|
|
7
|
+
data.tar.gz: c1c9aed1007bcfeb0e577d08af6f86fa340e375fede08af03bd18fbc2538cfcbd4838fc5bd07c672fca6e02ca3c0ec9e8d442b3e3275deff58215dfba873df7a
|
data/README.md
CHANGED
|
@@ -9,6 +9,7 @@ OccamsRecord is a high-efficiency, advanced query library for use alongside Acti
|
|
|
9
9
|
* 3x-5x faster than ActiveRecord queries, *minimum*.
|
|
10
10
|
* Uses 1/3 the memory of ActiveRecord query results.
|
|
11
11
|
* Eliminates the N+1 query problem. (This often exceeds the baseline 3x-5x gain.)
|
|
12
|
+
* Support for cursors (Postgres only, new in v1.4.0-beta1)
|
|
12
13
|
|
|
13
14
|
### 2) Supercharged querying & eager loading
|
|
14
15
|
|
|
@@ -32,6 +33,16 @@ OccamsRecord
|
|
|
32
33
|
}
|
|
33
34
|
```
|
|
34
35
|
|
|
36
|
+
**Use cursors**
|
|
37
|
+
|
|
38
|
+
```ruby
|
|
39
|
+
OccamsRecord
|
|
40
|
+
.query(Order.order("created_at DESC"))
|
|
41
|
+
.find_each_with_cursor { |order|
|
|
42
|
+
...
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
35
46
|
**Use `find_each`/`find_in_batches` with raw SQL**
|
|
36
47
|
|
|
37
48
|
```ruby
|
|
@@ -156,15 +167,59 @@ orders = OccamsRecord
|
|
|
156
167
|
.run
|
|
157
168
|
```
|
|
158
169
|
|
|
159
|
-
Occams Record also supports loading ad hoc associations using raw SQL. We'll get to that in
|
|
170
|
+
Occams Record also supports loading ad hoc associations using raw SQL. We'll get to that in a later section.
|
|
171
|
+
|
|
172
|
+
## Query with cursors
|
|
173
|
+
|
|
174
|
+
`find_each_with_cursor`/`find_in_batches_with_cursor` work like `find_each`/`find_in_batches`, except they use cursors. For large data sets, cursors offer a noticible speed boost. Postgres only.
|
|
175
|
+
|
|
176
|
+
```ruby
|
|
177
|
+
OccamsRecord
|
|
178
|
+
.query(q)
|
|
179
|
+
.eager_load(:customer)
|
|
180
|
+
.find_each_with_cursor do |order|
|
|
181
|
+
...
|
|
182
|
+
end
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
The `cursor.open` method allows lower level access to cursor behavior. See `OccamsRecord::Cursor` for more info.
|
|
186
|
+
|
|
187
|
+
```ruby
|
|
188
|
+
orders = OccamsRecord
|
|
189
|
+
.query(q)
|
|
190
|
+
.eager_load(:customer)
|
|
191
|
+
.cursor
|
|
192
|
+
.open do |cursor|
|
|
193
|
+
cursor.move(:forward, 300)
|
|
194
|
+
cursor.fetch(:forward, 100)
|
|
195
|
+
end
|
|
196
|
+
```
|
|
160
197
|
|
|
161
198
|
## Raw SQL queries
|
|
162
199
|
|
|
163
200
|
ActiveRecord has raw SQL escape hatches like `find_by_sql` and `exec_query`, but they give up critical features like eager loading and `find_each`/`find_in_batches`. Occams Record's escape hatches don't make you give up anything.
|
|
164
201
|
|
|
165
|
-
**Batched loading**
|
|
202
|
+
**Batched loading with cursors**
|
|
203
|
+
|
|
204
|
+
`find_each_with_cursor`, `find_in_batches_with_cursor`, and `cursor.open` are all available.
|
|
205
|
+
|
|
206
|
+
```ruby
|
|
207
|
+
OccamsRecord
|
|
208
|
+
.sql("
|
|
209
|
+
SELECT * FROM orders
|
|
210
|
+
WHERE order_date > %{date}
|
|
211
|
+
ORDER BY order_date DESC, id
|
|
212
|
+
", {
|
|
213
|
+
date: 10.years.ago
|
|
214
|
+
})
|
|
215
|
+
.find_each_with_cursor(batch_size: 1000) do |order|
|
|
216
|
+
...
|
|
217
|
+
end
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
**Batched loading without cursors**
|
|
166
221
|
|
|
167
|
-
|
|
222
|
+
If your database doesn't support cursors, you can use `find_each`/`find_in_batches`. Just provide `LIMIT` and `OFFSET` (see below), and Occams will plug in the right numbers.
|
|
168
223
|
|
|
169
224
|
```ruby
|
|
170
225
|
OccamsRecord
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
module OccamsRecord
|
|
2
|
-
#
|
|
3
|
-
# Methods for building batch finding methods. It expects "model" and "scope" methods to be present.
|
|
4
|
-
#
|
|
5
2
|
module Batches
|
|
6
3
|
module OffsetLimit
|
|
4
|
+
#
|
|
5
|
+
# Implements batched loading for ActiveRecord model scopes.
|
|
6
|
+
#
|
|
7
7
|
class Scoped
|
|
8
8
|
def initialize(model, scope, use: nil, query_logger: nil, eager_loaders: nil)
|
|
9
9
|
@model, @scope = model, scope
|
data/lib/occams-record/cursor.rb
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
require 'securerandom'
|
|
2
2
|
|
|
3
3
|
module OccamsRecord
|
|
4
|
-
#
|
|
5
|
-
# An interface to database cursors. Supported databases:
|
|
6
|
-
# * PostgreSQL
|
|
7
|
-
#
|
|
4
|
+
#
|
|
5
|
+
# An interface to database cursors. Supported databases:
|
|
6
|
+
# * PostgreSQL
|
|
7
|
+
#
|
|
8
8
|
class Cursor
|
|
9
9
|
# @private
|
|
10
10
|
SCROLL = {
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: occams-record
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.4.0
|
|
4
|
+
version: 1.4.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Jordan Hollinger
|
|
8
|
-
autorequire:
|
|
8
|
+
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2022-05-
|
|
11
|
+
date: 2022-05-25 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: activerecord
|
|
@@ -83,7 +83,7 @@ homepage: https://jhollinger.github.io/occams-record/
|
|
|
83
83
|
licenses:
|
|
84
84
|
- MIT
|
|
85
85
|
metadata: {}
|
|
86
|
-
post_install_message:
|
|
86
|
+
post_install_message:
|
|
87
87
|
rdoc_options: []
|
|
88
88
|
require_paths:
|
|
89
89
|
- lib
|
|
@@ -94,12 +94,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
94
94
|
version: 2.3.0
|
|
95
95
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
96
96
|
requirements:
|
|
97
|
-
- - "
|
|
97
|
+
- - ">="
|
|
98
98
|
- !ruby/object:Gem::Version
|
|
99
|
-
version:
|
|
99
|
+
version: '0'
|
|
100
100
|
requirements: []
|
|
101
|
-
rubygems_version: 3.1
|
|
102
|
-
signing_key:
|
|
101
|
+
rubygems_version: 3.0.3.1
|
|
102
|
+
signing_key:
|
|
103
103
|
specification_version: 4
|
|
104
104
|
summary: The missing high-efficiency query API for ActiveRecord
|
|
105
105
|
test_files: []
|