Skip to content

Commit 6d1dcbc

Browse files
committed
allow priming loaders
1 parent 0ea30ed commit 6d1dcbc

File tree

4 files changed

+74
-6
lines changed

4 files changed

+74
-6
lines changed

spec/graphql-dataloader/loader_spec.cr

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,4 +100,42 @@ describe GraphQL::DataLoader::Loader do
100100
loader.batch_log.size.should eq(1)
101101
loader.batch_log.first.should eq([1, 2])
102102
end
103+
104+
it "primes the cache" do
105+
users = [
106+
User.new(1, "Ada"),
107+
User.new(2, "Grace"),
108+
]
109+
loader = UserLoader.new(users)
110+
loader.prime(1, users[0])
111+
loader.load(1).should eq(users[0])
112+
loader.load(2).should eq(users[0])
113+
loader.batch_log.size.should eq(1)
114+
end
115+
116+
it "clears the cache" do
117+
users = [
118+
User.new(1, "Ada"),
119+
User.new(2, "Grace"),
120+
]
121+
loader = UserLoader.new(users)
122+
loader.load(1).should eq(users[0])
123+
loader.clear
124+
loader.load(1).should eq(users[0])
125+
loader.batch_log.size.should eq(2)
126+
end
127+
128+
it "clears a single cache entry" do
129+
users = [
130+
User.new(1, "Ada"),
131+
User.new(2, "Grace"),
132+
]
133+
loader = UserLoader.new(users)
134+
loader.load(1).should eq(users[0])
135+
loader.prime(2, users[1])
136+
loader.clear(1)
137+
loader.load(1).should eq(users[0])
138+
loader.load(2).should eq(users[1])
139+
loader.batch_log.size.should eq(2)
140+
end
103141
end

src/graphql-dataloader/cache.cr

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,12 @@ module GraphQL::DataLoader
1111
end
1212
end
1313

14-
private abstract def has_key?(key : K) : Bool
15-
private abstract def [](key : K) : V
16-
private abstract def []=(key : K, value : V) : Nil
14+
abstract def has_key?(key : K) : Bool
15+
abstract def [](key : K) : V
16+
abstract def []?(key : K) : V?
17+
abstract def []=(key : K, value : V) : Nil
18+
abstract def delete(key : K) : Nil
19+
abstract def clear : Nil
1720

1821
# Override this method for caches where values expire for thread safety
1922
private def synchronize(&block : -> V) : V

src/graphql-dataloader/loader.cr

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,21 @@ module GraphQL::DataLoader
3939
objects.map { |object| load(object) }
4040
end
4141

42+
def prime(object : O, value : V) : self
43+
cache[key_for(object)] ||= value
44+
self
45+
end
46+
47+
def clear(object : O) : self
48+
cache.delete(key_for(object))
49+
self
50+
end
51+
52+
def clear : self
53+
cache.clear
54+
self
55+
end
56+
4257
# The batch loading method.
4358
# Gets called with all objects that have been passed to `#load` in the current batch.
4459
# A batch is fetched after 1 microsecond since the first call to `#load`.

src/graphql-dataloader/memory_cache.cr

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,28 @@ module GraphQL::DataLoader
44

55
private getter cache = Hash(K, V).new
66

7-
private def has_key?(key : K) : Bool
7+
def has_key?(key : K) : Bool
88
cache.has_key?(key)
99
end
1010

11-
private def [](key : K) : V
11+
def [](key : K) : V
1212
cache[key]
1313
end
1414

15-
private def []=(key : K, value : V) : Nil
15+
def []?(key : K) : V?
16+
cache[key]?
17+
end
18+
19+
def []=(key : K, value : V) : Nil
1620
cache[key] = value
1721
end
22+
23+
def clear : Nil
24+
cache.clear
25+
end
26+
27+
def delete(key : K) : Nil
28+
cache.delete(key)
29+
end
1830
end
1931
end

0 commit comments

Comments
 (0)