redis_app_join 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 443ea24957f1e3e8ea260db70ac1206aefee6be9
4
- data.tar.gz: be5d4b45715e15ef856fb3bd3ce0f92fc183baff
3
+ metadata.gz: f0254b1ea1caa6281771b11bb2457c7c27e0e1ca
4
+ data.tar.gz: f51c7597abee8e79fec7034a9fce12f5f1e1782d
5
5
  SHA512:
6
- metadata.gz: 3c649246ab9a2770fd5570877bc5490aafe8b86d7880f192a5bc4a5ddbb7d00d0fcf134e035a1ef16e7e1db6d5d231892ba7272d8b3fd56fbd801bd4b584ac1a
7
- data.tar.gz: 8c747b2de354770ebb916a23a75e51b5a078b48b56cea9ac866971591b036b34a4c3ec75cd171be00269f08eedca35934d08bde93a4f514d7ccd92402e57f80a
6
+ metadata.gz: bf7863cac7483b98c5bf03b8aa20794d98b7d907a3764e23264ec0e5f578ddc471901a48c045fe5cd3b6121f4b6b71b1af1ce739d3d3398c3eab383861bdc75f
7
+ data.tar.gz: 35b9feb9220403d25edb0be5402430a15998705ad127c64a6c385562e55fdd62c820ab3e37829cdc6bbff041cd2818ce6bc83af94f204a966f2da0be2fd82e80
data/.gitignore CHANGED
@@ -7,3 +7,5 @@
7
7
  /pkg/
8
8
  /spec/reports/
9
9
  /tmp/
10
+
11
+ *.gem
data/README.md CHANGED
@@ -33,7 +33,7 @@ In the Ruby class where you need to implement application-side join add `include
33
33
 
34
34
  ```ruby
35
35
  class ReportGen
36
- include RedisAppJoin
36
+ include RedisAppJoin
37
37
  def perform
38
38
  comments = Comment.gte(created_at: Date.yesterday).only(:body, :article_id)
39
39
  cache_records(records: comments)
@@ -47,7 +47,7 @@ include RedisAppJoin
47
47
  user_ids = fetch_records_field(record_class: 'Article', record_ids: article_ids, field: 'user_id')
48
48
  users = User.in(id: user_ids).only(:name)
49
49
  cache_records(records: users)
50
- # => instead of using cached comments we just query DB again
50
+ # => instead of using cached comments we could query DB again
51
51
  cached_comments = fetch_records(record_class: 'Comment', record_ids: comment_ids)
52
52
  cached_comments.each do |comment|
53
53
  article = fetch_records(record_class: 'Article', record_ids: [comment.article_id]).first
@@ -59,14 +59,6 @@ include RedisAppJoin
59
59
  end
60
60
  ```
61
61
 
62
- `cache_records` expects an array of [ActiveModels](http://api.rubyonrails.org/classes/ActiveModel/Model.html). It will loop through them creating keys using combination of class and ID. Hash value will be record's attributes.
63
-
64
- `delete_records` expects an array ActiveModels. You can pass different types of records (users and articles) in the same method call.
65
-
66
- `fetch_records` expects class name and array of IDs. It will return an array of objects and include the original record ID as one of the attributes for each object.
67
-
68
- `fetch_records_field` expects class name, array of IDs and the field name you want. It will return an array of values for that feild.
69
-
70
62
  Data in Redis will be stored like this:
71
63
 
72
64
  ```ruby
@@ -97,6 +89,10 @@ You can do `article.title` and `user = fetch_records(record_class: 'User', recor
97
89
 
98
90
  Write tests
99
91
 
92
+ Default TTL of 1.week
93
+
94
+ Support JSON structures in caching (getting data from API), not just ActiveModels
95
+
100
96
  Support non-string fields. For example, if your DB supports array fields you cannot store those attributes in Redis hash values.
101
97
 
102
98
  Methods to fetch associated records so we can do `article.user.name` from Redis cache.
@@ -2,6 +2,12 @@ require "redis_app_join/version"
2
2
 
3
3
  module RedisAppJoin
4
4
 
5
+ # will loop through records creating keys using combination of class and ID.
6
+ # can combine different record types (Users and Articles) in the same method call
7
+ # record's attributes will be hash fields
8
+ #
9
+ # @see https://github.com/dmitrypol/redis_app_join
10
+ # @param records [Array] ActiveModels to cache
5
11
  def cache_records(records:)
6
12
  records.each do |record|
7
13
  key = [record.class.name, record.id.to_s].join(':')
@@ -10,6 +16,10 @@ module RedisAppJoin
10
16
  end
11
17
  end
12
18
 
19
+ # used to delete cached records after the process is done
20
+ # can combine different record types (Users and Articles) in the same method call
21
+ #
22
+ # @param records [Array] ActiveModels to delete
13
23
  def delete_records(records:)
14
24
  records.each do |record|
15
25
  key = [record.class.name, record.id.to_s].join(':')
@@ -17,10 +27,16 @@ module RedisAppJoin
17
27
  end
18
28
  end
19
29
 
30
+ # fetch recors from cache,
31
+ # cannot combine different record types (Users and Articles) in the same method call
32
+ #
33
+ # @param record_class [String] - name of class, used in lookup
34
+ # @param record_ids [Array] array of IDs to lookup
35
+ # @return [Array] array of objects and include the original record ID as one of the attributes for each object.
20
36
  def fetch_records(record_class:, record_ids:)
21
37
  output = []
22
38
  record_ids.each do |record_id|
23
- key = [record_class.titleize, record_id.to_s].join(':')
39
+ key = [record_class, record_id.to_s].join(':')
24
40
  data = REDIS_APP_JOIN.hgetall(key)
25
41
  # => add the key as ID attribute
26
42
  output << OpenStruct.new(data.merge(id: record_id.to_s))
@@ -28,14 +44,22 @@ module RedisAppJoin
28
44
  return output
29
45
  end
30
46
 
47
+ # retrieves specific field for an array or records (all user_ids for articles)
48
+ # only returns the field if it's present
49
+ # cannot combine different record types in the same method call
50
+ #
51
+ # @param record_class [String] - name of class, used in lookup
52
+ # @param record_ids [Array] array of IDs to lookup
53
+ # @param field [String] name of field/attribute to retrieve
54
+ # @return [Array] array of unique strings
31
55
  def fetch_records_field(record_class:, record_ids:, field:)
32
56
  output = []
33
57
  record_ids.each do |record_id|
34
- key = [record_class.titleize, record_id.to_s].join(':')
58
+ key = [record_class, record_id.to_s].join(':')
35
59
  data = REDIS_APP_JOIN.hget(key, field)
36
60
  output << data
37
61
  end
38
- return output
62
+ return output.uniq
39
63
  end
40
64
 
41
65
  end
@@ -1,3 +1,3 @@
1
1
  module RedisAppJoin
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
10
10
  spec.email = ["dmitrypol@gmail.com"]
11
11
 
12
12
  spec.summary = %q{Uses Redis to cache data for application-side joins.}
13
- spec.description = %q{Instead of building your own data structures why not use Redis Hashes.}
13
+ spec.description = %q{Uses Redis hashes to cache data for application-side joins instead of building internal own data structures.}
14
14
  spec.homepage = "https://github.com/dmitrypol/redis_app_join"
15
15
 
16
16
  # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redis_app_join
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dmitry Polyakovsky
@@ -120,7 +120,8 @@ dependencies:
120
120
  - - ">="
121
121
  - !ruby/object:Gem::Version
122
122
  version: 1.3.0
123
- description: Instead of building your own data structures why not use Redis Hashes.
123
+ description: Uses Redis hashes to cache data for application-side joins instead of
124
+ building internal own data structures.
124
125
  email:
125
126
  - dmitrypol@gmail.com
126
127
  executables: []