Skip to content

Commit e17098f

Browse files
authored
db Cache: Implement package filtering (#317)
Signed-off-by: liamfallon <liam.fallon@est.tech>
1 parent 14d4f65 commit e17098f

5 files changed

Lines changed: 245 additions & 103 deletions

File tree

pkg/cache/dbcache/dbpackagerevisionsql.go

Lines changed: 1 addition & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import (
1919
"database/sql"
2020
"fmt"
2121

22-
"github.com/nephio-project/porch/api/porch/v1alpha1"
2322
cachetypes "github.com/nephio-project/porch/pkg/cache/types"
2423
"github.com/nephio-project/porch/pkg/repository"
2524
"go.opentelemetry.io/otel/trace"
@@ -97,7 +96,7 @@ func pkgRevReadFromDB(ctx context.Context, prk repository.PackageRevisionKey, re
9796
}
9897

9998
func pkgRevListPRsFromDB(ctx context.Context, filter repository.ListPackageRevisionFilter) ([]*dbPackageRevision, error) {
100-
_, span := tracer.Start(ctx, "dbrepositorysql::repoDeleteFromDB", trace.WithAttributes())
99+
_, span := tracer.Start(ctx, "dbrepositorysql::pkgRevListPRsFromDB", trace.WithAttributes())
101100
defer span.End()
102101

103102
klog.V(5).Infof("pkgRevListPRsFromDB: listing package revisions for filter %+v", filter)
@@ -444,94 +443,3 @@ func pkgRevDeleteFromDB(ctx context.Context, prk repository.PackageRevisionKey)
444443

445444
return err
446445
}
447-
448-
func prListFilter2WhereClause(filter repository.ListPackageRevisionFilter) string {
449-
whereStatement := ""
450-
451-
repoKey := filter.Key.RKey()
452-
whereStatement, first := prListFilter2SubClauseStr(whereStatement, repoKey.Namespace, "repositories.k8s_name_space", true)
453-
whereStatement, first = prListFilter2SubClauseStr(whereStatement, repoKey.Name, "repositories.k8s_name", first)
454-
whereStatement, first = prListFilter2SubClauseStr(whereStatement, repoKey.Path, "repositories.directory", first)
455-
whereStatement, first = prListFilter2SubClauseStr(whereStatement, repoKey.PlaceholderWSname, "repositories.default_ws_name", first)
456-
457-
pkgKey := filter.Key.PKey()
458-
whereStatement, first = prListFilter2SubClauseStr(whereStatement, pkgKey.K8SName(), "packages.k8s_name", first)
459-
whereStatement, first = prListFilter2SubClauseStr(whereStatement, pkgKey.Path, "packages.package_path", first)
460-
461-
prKey := filter.Key
462-
whereStatement, first = prListFilter2SubClauseStr(whereStatement, prKey.K8SName(), "package_revisions.k8s_name", first)
463-
whereStatement, first = prListFilter2SubClauseInt(whereStatement, prKey.Revision, "package_revisions.revision", first)
464-
whereStatement, first = prListFilter2SubClauseWorkspace(whereStatement, prKey.WorkspaceName, "package_revisions.k8s_name", first)
465-
466-
whereStatement, _ = prListFilter2SubClauseLifecycle(whereStatement, filter.Lifecycles, "package_revisions.lifecycle", first)
467-
468-
if whereStatement == "" {
469-
return whereStatement
470-
} else {
471-
return "WHERE\n" + whereStatement
472-
}
473-
}
474-
475-
func prListFilter2SubClauseStr(whereStatement, filterField, column string, first bool) (string, bool) {
476-
if filterField == "" {
477-
return whereStatement, first
478-
}
479-
480-
subClause := fmt.Sprintf("%s='%s'\n", column, filterField)
481-
482-
if first {
483-
return whereStatement + subClause, false
484-
} else {
485-
return whereStatement + "AND " + subClause, false
486-
}
487-
}
488-
489-
func prListFilter2SubClauseInt(whereStatement string, filterField int, column string, first bool) (string, bool) {
490-
if filterField == 0 {
491-
return whereStatement, first
492-
}
493-
494-
subClause := fmt.Sprintf("%s=%d\n", column, filterField)
495-
496-
if first {
497-
return whereStatement + subClause, false
498-
} else {
499-
return whereStatement + "AND " + subClause, false
500-
}
501-
}
502-
503-
func prListFilter2SubClauseWorkspace(whereStatement string, filterField string, column string, first bool) (string, bool) {
504-
if filterField == "" {
505-
return whereStatement, first
506-
}
507-
508-
subClause := fmt.Sprintf("%s LIKE '%%.%s'\n", column, filterField)
509-
510-
if first {
511-
return whereStatement + subClause, false
512-
} else {
513-
return whereStatement + "AND " + subClause, false
514-
}
515-
}
516-
517-
func prListFilter2SubClauseLifecycle(whereStatement string, filterField []v1alpha1.PackageRevisionLifecycle, column string, first bool) (string, bool) {
518-
if len(filterField) == 0 {
519-
return whereStatement, first
520-
}
521-
522-
subClause := "("
523-
for i, lifecycle := range filterField {
524-
if i == 0 {
525-
subClause = subClause + fmt.Sprintf("%s='%s'", column, lifecycle)
526-
} else {
527-
subClause = subClause + fmt.Sprintf(" OR %s='%s'", column, lifecycle)
528-
}
529-
}
530-
subClause += ")"
531-
532-
if first {
533-
return whereStatement + subClause, false
534-
} else {
535-
return whereStatement + "AND " + subClause, false
536-
}
537-
}

pkg/cache/dbcache/dbpackagesql.go

Lines changed: 64 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,21 @@ func pkgReadFromDB(ctx context.Context, pk repository.PackageKey) (*dbPackage, e
3333

3434
sqlStatement := `
3535
SELECT
36-
repositories.k8s_name_space, repositories.k8s_name, repositories.directory, repositories.default_ws_name,
37-
packages.k8s_name, packages.package_path, packages.meta, packages.spec, packages.updated, packages.updatedby
36+
repositories.k8s_name_space,
37+
repositories.k8s_name,
38+
repositories.directory,
39+
repositories.default_ws_name,
40+
packages.k8s_name,
41+
packages.package_path,
42+
packages.meta,
43+
packages.spec,
44+
packages.updated,
45+
packages.updatedby
3846
FROM packages INNER JOIN repositories
3947
ON packages.k8s_name_space=repositories.k8s_name_space AND packages.repo_k8s_name=repositories.k8s_name
40-
WHERE packages.k8s_name_space=$1 AND packages.k8s_name=$2`
48+
WHERE packages.k8s_name_space=$1 AND packages.k8s_name=$2
49+
ORDER BY packages.k8s_name_space, packages.k8s_name
50+
`
4151

4252
klog.V(5).Infof("pkgReadFromDB: running query %q on package %+v", sqlStatement, pk)
4353
rows, err := GetDB().db.Query(sqlStatement, pk.K8SNS(), pk.K8SName())
@@ -67,6 +77,44 @@ func pkgReadFromDB(ctx context.Context, pk repository.PackageKey) (*dbPackage, e
6777
return pkgs[0], err
6878
}
6979

80+
func pkgListPkgsFromDB(ctx context.Context, filter repository.ListPackageFilter) ([]*dbPackage, error) {
81+
_, span := tracer.Start(ctx, "dbrepositorysql::pkgListPkgsFromDB", trace.WithAttributes())
82+
defer span.End()
83+
84+
klog.V(5).Infof("pkgListPkgsFromDB: listing packages for filter %+v", filter)
85+
86+
sqlStatement := `
87+
SELECT
88+
repositories.k8s_name_space,
89+
repositories.k8s_name,
90+
repositories.directory,
91+
repositories.default_ws_name,
92+
packages.k8s_name,
93+
packages.package_path,
94+
packages.meta,
95+
packages.spec,
96+
packages.updated,
97+
packages.updatedby
98+
FROM packages INNER JOIN repositories
99+
ON packages.k8s_name_space=repositories.k8s_name_space AND packages.repo_k8s_name=repositories.k8s_name
100+
`
101+
102+
sqlStatement += pkgListFilter2WhereClause(filter)
103+
104+
sqlStatement += `
105+
ORDER BY packages.k8s_name_space, packages.k8s_name
106+
`
107+
108+
klog.V(6).Infof("pkgRevListPRsFromDB: running query %q on package revisions with filter %+v", sqlStatement, filter)
109+
rows, err := GetDB().db.Query(sqlStatement)
110+
if err != nil {
111+
klog.Warningf("pkgRevListPRsFromDB: reading package revision list for filter %+v returned err: %q", filter, err)
112+
return nil, err
113+
}
114+
115+
return pkgScanRowsFromDB(ctx, rows)
116+
}
117+
70118
func pkgReadPkgsFromDB(ctx context.Context, rk repository.RepositoryKey) ([]*dbPackage, error) {
71119
_, span := tracer.Start(ctx, "dbpackagesql::pkgReadPkgsFromDB", trace.WithAttributes())
72120
defer span.End()
@@ -75,11 +123,21 @@ func pkgReadPkgsFromDB(ctx context.Context, rk repository.RepositoryKey) ([]*dbP
75123

76124
sqlStatement := `
77125
SELECT
78-
repositories.k8s_name_space, repositories.k8s_name, repositories.directory, repositories.default_ws_name,
79-
packages.k8s_name, packages.package_path, packages.meta, packages.spec, packages.updated, packages.updatedby
126+
repositories.k8s_name_space,
127+
repositories.k8s_name,
128+
repositories.directory,
129+
repositories.default_ws_name,
130+
packages.k8s_name,
131+
packages.package_path,
132+
packages.meta,
133+
packages.spec,
134+
packages.updated,
135+
packages.updatedby
80136
FROM packages INNER JOIN repositories
81137
ON packages.k8s_name_space=repositories.k8s_name_space AND packages.repo_k8s_name=repositories.k8s_name
82-
WHERE packages.k8s_name_space=$1 AND packages.repo_k8s_name=$2`
138+
WHERE packages.k8s_name_space=$1 AND packages.repo_k8s_name=$2
139+
ORDER BY packages.k8s_name_space, packages.k8s_name
140+
`
83141

84142
klog.V(5).Infof("pkgReadPkgsFromDB: running query %q on packages in repository %+v", sqlStatement, rk)
85143
rows, err := GetDB().db.Query(sqlStatement, rk.Namespace, rk.Name)

pkg/cache/dbcache/dbpackagesql_test.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,47 @@ func TestMultiPackageRepo(t *testing.T) {
186186
deleteTestRepo(t, dbRepo22.Key())
187187
}
188188

189+
func TestPackageFilter(t *testing.T) {
190+
mockCache := mockcachetypes.NewMockCache(t)
191+
cachetypes.CacheInstance = mockCache
192+
mockCache.EXPECT().GetRepository(mock.Anything).Return(&dbRepository{})
193+
194+
dbRepo := createTestRepo(t, "my-ns", "my-repo")
195+
196+
dbRepoPkgs := createTestPkgs(t, dbRepo.Key(), "my-package", 4)
197+
198+
pkgFilter := repository.ListPackageFilter{}
199+
listPkgs, err := pkgListPkgsFromDB(context.TODO(), pkgFilter)
200+
assert.Nil(t, err)
201+
assert.Equal(t, 4, len(listPkgs))
202+
203+
pkgFilter.Key.RepoKey = dbRepo.repoKey
204+
pkgFilter.Key.Package = "my-package-2"
205+
listPkgs, err = pkgListPkgsFromDB(context.TODO(), pkgFilter)
206+
assert.Nil(t, err)
207+
assert.Equal(t, 1, len(listPkgs))
208+
209+
pkgFilter.Key.Package = "my-package-5"
210+
listPkgs, err = pkgListPkgsFromDB(context.TODO(), pkgFilter)
211+
assert.Nil(t, err)
212+
assert.Equal(t, 0, len(listPkgs))
213+
214+
pkgFilter.Key.Package = "my-package-2"
215+
pkgFilter.Key.Path = "a/path"
216+
listPkgs, err = pkgListPkgsFromDB(context.TODO(), pkgFilter)
217+
assert.Nil(t, err)
218+
assert.Equal(t, 0, len(listPkgs))
219+
220+
pkgFilter.Key.Path = ""
221+
listPkgs, err = pkgListPkgsFromDB(context.TODO(), pkgFilter)
222+
assert.Nil(t, err)
223+
assert.Equal(t, 1, len(listPkgs))
224+
225+
deleteTestRepo(t, dbRepo.Key())
226+
227+
assert.Equal(t, 0, len(readRepoPkgPRs(t, dbRepoPkgs)))
228+
}
229+
189230
func pkgDBWriteReadTest(t *testing.T, dbRepo *dbRepository, dbPkg, dbPkgUpdate dbPackage) {
190231
err := pkgWriteToDB(context.TODO(), &dbPkg)
191232
assert.NotNil(t, err)

pkg/cache/dbcache/dbrepository.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,6 @@ func (r *dbRepository) ListPackageRevisions(ctx context.Context, filter reposito
142142
foundPkgRevs, err := pkgRevListPRsFromDB(ctx, filter)
143143
if err != nil {
144144
klog.Warningf("ListPackageRevisions: listing package revisions in repository %+v with filter %+v failed: %q", r.Key(), filter, err)
145-
146145
return nil, err
147146
}
148147

@@ -282,16 +281,19 @@ func (r *dbRepository) ListPackages(ctx context.Context, filter repository.ListP
282281

283282
klog.V(5).Infof("ListPackages: listing packages in repository %+v with filter %+v", r.Key(), filter)
284283

285-
dbPkgs, err := pkgReadPkgsFromDB(ctx, r.Key())
284+
foundPkgs, err := pkgListPkgsFromDB(ctx, filter)
286285
if err != nil {
286+
klog.Warningf("ListPackages: listing packagess in repository %+v with filter %+v failed: %q", r.Key(), filter, err)
287287
return nil, err
288288
}
289289

290-
genericPkgs := make([]repository.Package, len(dbPkgs))
291-
for i, pkg := range dbPkgs {
290+
genericPkgs := make([]repository.Package, len(foundPkgs))
291+
for i, pkg := range foundPkgs {
292292
genericPkgs[i] = repository.Package(pkg)
293293
}
294294

295+
klog.V(5).Infof("ListPackages: listed packages in repository %+v with filter %+v", r.Key(), filter)
296+
295297
return genericPkgs, nil
296298
}
297299

0 commit comments

Comments
 (0)