batch-loader 1.3.0 → 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 +4 -4
- data/CHANGELOG.md +6 -2
- data/README.md +32 -10
- data/lib/batch_loader.rb +5 -3
- data/lib/batch_loader/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e5518ce90e0c03eda9c5717a9fb50ac7c159f551
|
4
|
+
data.tar.gz: 3081111f1bcaf9311d4de1769a3d8ce38f5f6552
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 658b9c3bb6e606f86aa5caa1b89d75e52445d6d227f0d7dd0ca91373144885c29f5a64ced62c602b4f61f816b65b87770bb82ef5ad8cb9314cb75a8baeab5ace
|
7
|
+
data.tar.gz: 394300f8a32614af28f17483485dc09efb1246d6f366c7458f3154bffac65660135811e2dee01e74330c1c0b928328037e48f8dbf674e3bda1b3c6d7e182f400
|
data/CHANGELOG.md
CHANGED
@@ -8,13 +8,17 @@ one of the following labels: `Added`, `Changed`, `Deprecated`,
|
|
8
8
|
to manage the versions of this gem so
|
9
9
|
that you can set version constraints properly.
|
10
10
|
|
11
|
-
#### [Unreleased](https://github.com/exAspArk/batch-loader/compare/v1.
|
11
|
+
#### [Unreleased](https://github.com/exAspArk/batch-loader/compare/v1.4.0...HEAD)
|
12
12
|
|
13
13
|
* WIP
|
14
14
|
|
15
|
+
#### [v1.4.0](https://github.com/exAspArk/batch-loader/compare/v1.3.0...v1.4.0)
|
16
|
+
|
17
|
+
* `Added`: new `replace_methods` argument to `BatchLoader#batch` to allow control over `define_method` calls. [#45](https://github.com/exAspArk/batch-loader/pull/45)
|
18
|
+
|
15
19
|
#### [v1.3.0](https://github.com/exAspArk/batch-loader/compare/v1.2.2...v1.3.0)
|
16
20
|
|
17
|
-
* `Added`: `BatchLoader::GraphQL` to make it
|
21
|
+
* `Added`: `BatchLoader::GraphQL.for` to make it compatible with `graphql` gem versions `>= 1.8.7`. [#30](https://github.com/exAspArk/batch-loader/issues/30)
|
18
22
|
|
19
23
|
#### [v1.2.2](https://github.com/exAspArk/batch-loader/compare/v1.2.1...v1.2.2)
|
20
24
|
|
data/README.md
CHANGED
@@ -20,6 +20,7 @@ This gem provides a generic lazy batching mechanism to avoid N+1 DB queries, HTT
|
|
20
20
|
* [Loading multiple items](#loading-multiple-items)
|
21
21
|
* [Batch key](#batch-key)
|
22
22
|
* [Caching](#caching)
|
23
|
+
* [Replacing methods](#replacing-methods)
|
23
24
|
* [Installation](#installation)
|
24
25
|
* [API](#api)
|
25
26
|
* [Implementation details](#implementation-details)
|
@@ -374,6 +375,21 @@ puts user_lazy(1) # SELECT * FROM users WHERE id IN (1)
|
|
374
375
|
puts user_lazy(1) # SELECT * FROM users WHERE id IN (1)
|
375
376
|
```
|
376
377
|
|
378
|
+
If you set `cache: false`, it's likely you also want `replace_methods: false` (see below section).
|
379
|
+
|
380
|
+
### Replacing methods
|
381
|
+
|
382
|
+
By default, `BatchLoader` replaces methods on its instance by calling `#define_method` after batching to copy methods from the loaded value.
|
383
|
+
This consumes some time but allows to speed up any future method calls on the instance.
|
384
|
+
In some cases, when there are a lot of instances with a huge number of defined methods, this initial process of replacing the methods can be slow.
|
385
|
+
You may consider avoiding the "up front payment" and "pay as you go" with `#method_missing` by disabling the method replacement:
|
386
|
+
|
387
|
+
```ruby
|
388
|
+
BatchLoader.for(id).batch(replace_methods: false) do |ids, loader|
|
389
|
+
# ...
|
390
|
+
end
|
391
|
+
```
|
392
|
+
|
377
393
|
## Installation
|
378
394
|
|
379
395
|
Add this line to your application's Gemfile:
|
@@ -393,20 +409,26 @@ Or install it yourself as:
|
|
393
409
|
## API
|
394
410
|
|
395
411
|
```ruby
|
396
|
-
BatchLoader.for(item).batch(
|
412
|
+
BatchLoader.for(item).batch(
|
413
|
+
default_value: default_value,
|
414
|
+
cache: cache,
|
415
|
+
replace_methods: replace_methods,
|
416
|
+
key: key
|
417
|
+
) do |items, loader, args|
|
397
418
|
# ...
|
398
419
|
end
|
399
420
|
```
|
400
421
|
|
401
|
-
| Argument Key
|
402
|
-
| ---------------
|
403
|
-
| `item`
|
404
|
-
| `default_value`
|
405
|
-
| `cache`
|
406
|
-
| `
|
407
|
-
| `
|
408
|
-
| `
|
409
|
-
| `
|
422
|
+
| Argument Key | Default | Description |
|
423
|
+
| --------------- | --------------------------------------------- | ------------------------------------------------------------- |
|
424
|
+
| `item` | - | Item which will be collected and used for batching. |
|
425
|
+
| `default_value` | `nil` | Value returned by default after batching. |
|
426
|
+
| `cache` | `true` | Set `false` to disable caching between the same executions. |
|
427
|
+
| `replace_methods` | `true` | Set `false` to use `#method_missing` instead of replacing the methods after batching. |
|
428
|
+
| `key` | `nil` | Pass custom key to uniquely identify the batch block. |
|
429
|
+
| `items` | - | List of collected items for batching. |
|
430
|
+
| `loader` | - | Lambda which should be called to load values loaded in batch. |
|
431
|
+
| `args` | `{default_value: nil, cache: true, replace_methods: true, key: nil}` | Arguments passed to the `batch` method. |
|
410
432
|
|
411
433
|
## Implementation details
|
412
434
|
|
data/lib/batch_loader.rb
CHANGED
@@ -23,11 +23,13 @@ class BatchLoader
|
|
23
23
|
@__executor_proxy = executor_proxy
|
24
24
|
end
|
25
25
|
|
26
|
-
def batch(default_value: nil, cache: true, key: nil, &batch_block)
|
26
|
+
def batch(default_value: nil, cache: true, replace_methods: nil, key: nil, &batch_block)
|
27
27
|
@default_value = default_value
|
28
28
|
@cache = cache
|
29
|
+
@replace_methods = replace_methods.nil? ? cache : replace_methods
|
29
30
|
@key = key
|
30
31
|
@batch_block = batch_block
|
32
|
+
|
31
33
|
__executor_proxy.add(item: @item)
|
32
34
|
|
33
35
|
__singleton_class.class_eval { undef_method(:batch) }
|
@@ -74,7 +76,7 @@ class BatchLoader
|
|
74
76
|
def __sync!
|
75
77
|
loaded_value = __sync
|
76
78
|
|
77
|
-
if @
|
79
|
+
if @replace_methods
|
78
80
|
__replace_with!(loaded_value)
|
79
81
|
else
|
80
82
|
loaded_value
|
@@ -86,7 +88,7 @@ class BatchLoader
|
|
86
88
|
|
87
89
|
items = __executor_proxy.list_items
|
88
90
|
loader = __loader
|
89
|
-
args = {default_value: @default_value, cache: @cache, key: @key}
|
91
|
+
args = {default_value: @default_value, cache: @cache, replace_methods: @replace_methods, key: @key}
|
90
92
|
@batch_block.call(items, loader, args)
|
91
93
|
items.each do |item|
|
92
94
|
next if __executor_proxy.value_loaded?(item: item)
|
data/lib/batch_loader/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: batch-loader
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- exAspArk
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-04-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|