second_level_cache 2.1.9 → 2.1.10
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/lib/second_level_cache/active_record/finder_methods.rb +47 -2
- data/lib/second_level_cache/version.rb +1 -1
- data/test/finder_methods_test.rb +31 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 162eeb4c9ac6637270a5057e684b336573101aab
|
4
|
+
data.tar.gz: 87a40f18f2b5ff2e946fef7d9a63a7e060da7636
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8086b2e29a478df84b0cc71313b9ae3a37afa4b0d76cb45ba8f82507867d3b24942d8ef82aeee480674010992029ac974b7114172171c2bfb994ad0d64aa9950
|
7
|
+
data.tar.gz: e42a65a6bd42be458c6b389a7b69b8389c667b9f174416a8da590fb7752ab376a457f218bfe60177ef18b2979249f4fe98d4acb62342ecd842b1c5eb5c1daaf9
|
data/CHANGELOG.md
CHANGED
@@ -6,10 +6,9 @@ module SecondLevelCache
|
|
6
6
|
|
7
7
|
included do
|
8
8
|
alias_method_chain :find_one, :second_level_cache
|
9
|
+
alias_method_chain :find_some, :second_level_cache
|
9
10
|
end
|
10
11
|
|
11
|
-
# TODO find_some
|
12
|
-
# https://github.com/rails/rails/blob/master/activerecord/lib/active_record/relation/finder_methods.rb#L289-L309
|
13
12
|
#
|
14
13
|
# Cacheable:
|
15
14
|
#
|
@@ -39,6 +38,52 @@ module SecondLevelCache
|
|
39
38
|
record
|
40
39
|
end
|
41
40
|
|
41
|
+
def find_some_with_second_level_cache(ids)
|
42
|
+
return find_some_without_second_level_cache(id) unless second_level_cache_enabled?
|
43
|
+
return find_some_without_second_level_cache(id) unless select_all_column?
|
44
|
+
|
45
|
+
if cachable?
|
46
|
+
result = multi_read_from_cache(ids)
|
47
|
+
else
|
48
|
+
result = where(:id => ids).all
|
49
|
+
end
|
50
|
+
|
51
|
+
expected_size =
|
52
|
+
if limit_value && ids.size > limit_value
|
53
|
+
limit_value
|
54
|
+
else
|
55
|
+
ids.size
|
56
|
+
end
|
57
|
+
|
58
|
+
# 11 ids with limit 3, offset 9 should give 2 results.
|
59
|
+
if offset_value && (ids.size - offset_value < expected_size)
|
60
|
+
expected_size = ids.size - offset_value
|
61
|
+
end
|
62
|
+
|
63
|
+
if result.size == expected_size
|
64
|
+
result
|
65
|
+
else
|
66
|
+
raise_record_not_found_exception!(ids, result.size, expected_size)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
|
71
|
+
def multi_read_from_cache(ids)
|
72
|
+
map_cache_keys = ids.map{|id| klass.second_level_cache_key(id)}
|
73
|
+
records_from_cache = ::SecondLevelCache.cache_store.read_multi(*map_cache_keys)
|
74
|
+
hitted_ids = records_from_cache.map{|key, _| key.split("/")[2].to_i}
|
75
|
+
missed_ids = ids.map{|x| x.to_i} - hitted_ids
|
76
|
+
|
77
|
+
::SecondLevelCache::Config.logger.info "missed ids -> #{missed_ids.inspect} | hitted ids -> #{hitted_ids.inspect}"
|
78
|
+
|
79
|
+
if missed_ids.empty?
|
80
|
+
RecordMarshal.load_multi(records_from_cache.values)
|
81
|
+
else
|
82
|
+
records_from_db = where(:id => missed_ids)
|
83
|
+
records_from_db.map{|record| record.write_second_level_cache ; record} + RecordMarshal.load_multi(records_from_cache.values)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
42
87
|
private
|
43
88
|
|
44
89
|
def cachable?
|
data/test/finder_methods_test.rb
CHANGED
@@ -4,6 +4,7 @@ require 'test_helper'
|
|
4
4
|
class FinderMethodsTest < ActiveSupport::TestCase
|
5
5
|
def setup
|
6
6
|
@user = User.create :name => 'csdn', :email => 'test@csdn.com'
|
7
|
+
@other_user = User.create :name => 'shopper+', :email => 'test@shopperplus.com'
|
7
8
|
end
|
8
9
|
|
9
10
|
def test_should_find_without_cache
|
@@ -41,4 +42,34 @@ class FinderMethodsTest < ActiveSupport::TestCase
|
|
41
42
|
end
|
42
43
|
refute_equal @user.name, @from_db.name
|
43
44
|
end
|
45
|
+
|
46
|
+
def test_find_some_record
|
47
|
+
@users = User.find(@user.id, @other_user.id)
|
48
|
+
assert_equal 2, @users.size
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_missing_id_will_raise_for_find_some
|
52
|
+
assert_raises(ActiveRecord::RecordNotFound) do
|
53
|
+
@users = User.find(@user.id, User.last.id + 10000)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_filter_works_fine_for_find_some
|
58
|
+
assert_raises(ActiveRecord::RecordNotFound) do
|
59
|
+
@users = User.where("name is null").find(@user.id, @other_user.id)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_half_in_cache_for_find_some
|
64
|
+
@user.expire_second_level_cache
|
65
|
+
@users = User.find(@user.id, @other_user.id)
|
66
|
+
assert_equal 2, @users.size
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_no_record_in_cache_for_find_some
|
70
|
+
@user.expire_second_level_cache
|
71
|
+
@other_user.expire_second_level_cache
|
72
|
+
@users = User.find(@user.id, @other_user.id)
|
73
|
+
assert_equal 2, @users.size
|
74
|
+
end
|
44
75
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: second_level_cache
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.1.
|
4
|
+
version: 2.1.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hooopo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-10-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -173,7 +173,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
173
173
|
version: '0'
|
174
174
|
requirements: []
|
175
175
|
rubyforge_project:
|
176
|
-
rubygems_version: 2.
|
176
|
+
rubygems_version: 2.5.1
|
177
177
|
signing_key:
|
178
178
|
specification_version: 4
|
179
179
|
summary: 'SecondLevelCache is a write-through and read-through caching library inspired
|