Skip to content

Commit 4eade59

Browse files
committed
Add cache for common models.
1 parent 0a6b57b commit 4eade59

File tree

1 file changed

+79
-8
lines changed

1 file changed

+79
-8
lines changed

models/packages/descriptor.go

Lines changed: 79 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -81,19 +81,23 @@ func (pd *PackageDescriptor) CalculateBlobSize() int64 {
8181

8282
// GetPackageDescriptor gets the package description for a version
8383
func GetPackageDescriptor(ctx context.Context, pv *PackageVersion) (*PackageDescriptor, error) {
84-
p, err := GetPackageByID(ctx, pv.PackageID)
84+
return getPackageDescriptor(ctx, pv, newQueryCache())
85+
}
86+
87+
func getPackageDescriptor(ctx context.Context, pv *PackageVersion, c *cache) (*PackageDescriptor, error) {
88+
p, err := c.QueryPackage(ctx, pv.PackageID)
8589
if err != nil {
8690
return nil, err
8791
}
88-
o, err := user_model.GetUserByID(ctx, p.OwnerID)
92+
o, err := c.QueryUser(ctx, p.OwnerID)
8993
if err != nil {
9094
return nil, err
9195
}
92-
repository, err := repo_model.GetRepositoryByID(ctx, p.RepoID)
93-
if err != nil && !repo_model.IsErrRepoNotExist(err) {
96+
repository, err := c.QueryRepository(ctx, p.RepoID)
97+
if err != nil {
9498
return nil, err
9599
}
96-
creator, err := user_model.GetUserByID(ctx, pv.CreatorID)
100+
creator, err := c.QueryUser(ctx, pv.CreatorID)
97101
if err != nil {
98102
return nil, err
99103
}
@@ -119,7 +123,7 @@ func GetPackageDescriptor(ctx context.Context, pv *PackageVersion) (*PackageDesc
119123

120124
pfds := make([]*PackageFileDescriptor, 0, len(pfs))
121125
for _, pf := range pfs {
122-
pfd, err := GetPackageFileDescriptor(ctx, pf)
126+
pfd, err := getPackageFileDescriptor(ctx, pf, c)
123127
if err != nil {
124128
return nil, err
125129
}
@@ -177,7 +181,11 @@ func GetPackageDescriptor(ctx context.Context, pv *PackageVersion) (*PackageDesc
177181

178182
// GetPackageFileDescriptor gets a package file descriptor for a package file
179183
func GetPackageFileDescriptor(ctx context.Context, pf *PackageFile) (*PackageFileDescriptor, error) {
180-
pb, err := GetBlobByID(ctx, pf.BlobID)
184+
return getPackageFileDescriptor(ctx, pf, newQueryCache())
185+
}
186+
187+
func getPackageFileDescriptor(ctx context.Context, pf *PackageFile, c *cache) (*PackageFileDescriptor, error) {
188+
pb, err := c.QueryBlob(ctx, pf.BlobID)
181189
if err != nil {
182190
return nil, err
183191
}
@@ -194,13 +202,76 @@ func GetPackageFileDescriptor(ctx context.Context, pf *PackageFile) (*PackageFil
194202

195203
// GetPackageDescriptors gets the package descriptions for the versions
196204
func GetPackageDescriptors(ctx context.Context, pvs []*PackageVersion) ([]*PackageDescriptor, error) {
205+
return getPackageDescriptors(ctx, pvs, newQueryCache())
206+
}
207+
208+
func getPackageDescriptors(ctx context.Context, pvs []*PackageVersion, c *cache) ([]*PackageDescriptor, error) {
197209
pds := make([]*PackageDescriptor, 0, len(pvs))
198210
for _, pv := range pvs {
199-
pd, err := GetPackageDescriptor(ctx, pv)
211+
pd, err := getPackageDescriptor(ctx, pv, c)
200212
if err != nil {
201213
return nil, err
202214
}
203215
pds = append(pds, pd)
204216
}
205217
return pds, nil
206218
}
219+
220+
type cache struct {
221+
Packages map[int64]*Package
222+
Users map[int64]*user_model.User
223+
Repositories map[int64]*repo_model.Repository
224+
Blobs map[int64]*PackageBlob
225+
}
226+
227+
func newQueryCache() *cache {
228+
return &cache{
229+
Packages: make(map[int64]*Package),
230+
Users: make(map[int64]*user_model.User),
231+
Repositories: map[int64]*repo_model.Repository{0: nil}, // 0 is an expected value
232+
Blobs: make(map[int64]*PackageBlob),
233+
}
234+
}
235+
236+
func (c *cache) QueryPackage(ctx context.Context, id int64) (*Package, error) {
237+
if p, found := c.Packages[id]; found {
238+
return p, nil
239+
}
240+
241+
p, err := GetPackageByID(ctx, id)
242+
c.Packages[id] = p
243+
return p, err
244+
}
245+
246+
func (c *cache) QueryUser(ctx context.Context, id int64) (*user_model.User, error) {
247+
if u, found := c.Users[id]; found {
248+
return u, nil
249+
}
250+
251+
u, err := user_model.GetUserByID(ctx, id)
252+
c.Users[id] = u
253+
return u, err
254+
}
255+
256+
func (c *cache) QueryRepository(ctx context.Context, id int64) (*repo_model.Repository, error) {
257+
if r, found := c.Repositories[id]; found {
258+
return r, nil
259+
}
260+
261+
r, err := repo_model.GetRepositoryByID(ctx, id)
262+
if err != nil && !repo_model.IsErrRepoNotExist(err) {
263+
err = nil
264+
}
265+
c.Repositories[id] = r
266+
return r, err
267+
}
268+
269+
func (c *cache) QueryBlob(ctx context.Context, id int64) (*PackageBlob, error) {
270+
if b, found := c.Blobs[id]; found {
271+
return b, nil
272+
}
273+
274+
b, err := GetBlobByID(ctx, id)
275+
c.Blobs[id] = b
276+
return b, err
277+
}

0 commit comments

Comments
 (0)