Skip to content

Commit 2348e75

Browse files
authored
Merge pull request #275 from erizocosmico/feature/new-squashes
*: add squashes for joining repos with commits, entries and blobs
2 parents aac2b56 + 44beda6 commit 2348e75

File tree

5 files changed

+602
-24
lines changed

5 files changed

+602
-24
lines changed

integration_test.go

+1
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,7 @@ func TestSquashCorrectness(t *testing.T) {
255255
t.Run(q, func(t *testing.T) {
256256
expected := queryResults(t, engine, pool, q)
257257
result := queryResults(t, squashEngine, pool, q)
258+
require.Len(t, result, len(expected))
258259
require.ElementsMatch(
259260
t,
260261
expected,

internal/rule/squashjoins.go

+54
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,19 @@ func buildSquashedTable(
223223
}
224224
case gitbase.CommitsTableName:
225225
switch it := iter.(type) {
226+
case gitbase.ReposIter:
227+
var f sql.Expression
228+
f, filters, err = filtersForJoin(
229+
gitbase.RepositoriesTableName,
230+
gitbase.CommitsTableName,
231+
filters,
232+
append(it.Schema(), gitbase.CommitsSchema...),
233+
)
234+
if err != nil {
235+
return nil, err
236+
}
237+
238+
iter = gitbase.NewRepoCommitsIter(it, f)
226239
case gitbase.RefsIter:
227240
var f sql.Expression
228241
onlyRefHEADCommits := hasRefHEADFilter(filters)
@@ -258,6 +271,19 @@ func buildSquashedTable(
258271
}
259272
case gitbase.TreeEntriesTableName:
260273
switch it := iter.(type) {
274+
case gitbase.ReposIter:
275+
var f sql.Expression
276+
f, filters, err = filtersForJoin(
277+
gitbase.RepositoriesTableName,
278+
gitbase.TreeEntriesTableName,
279+
filters,
280+
append(it.Schema(), gitbase.TreeEntriesSchema...),
281+
)
282+
if err != nil {
283+
return nil, err
284+
}
285+
286+
iter = gitbase.NewRepoTreeEntriesIter(it, f)
261287
case gitbase.RefsIter:
262288
var f sql.Expression
263289
f, filters, err = filtersForJoin(
@@ -321,6 +347,19 @@ func buildSquashedTable(
321347
}
322348

323349
switch it := iter.(type) {
350+
case gitbase.ReposIter:
351+
var f sql.Expression
352+
f, filters, err = filtersForJoin(
353+
gitbase.RepositoriesTableName,
354+
gitbase.BlobsTableName,
355+
filters,
356+
append(it.Schema(), gitbase.BlobsSchema...),
357+
)
358+
if err != nil {
359+
return nil, err
360+
}
361+
362+
iter = gitbase.NewRepoBlobsIter(it, f, readContent)
324363
case gitbase.RefsIter:
325364
var f sql.Expression
326365
f, filters, err = filtersForJoin(
@@ -846,6 +885,21 @@ func isRedundantFilter(f sql.Expression, t1, t2 string) bool {
846885
isCol(gitbase.TreeEntriesTableName, "blob_hash"),
847886
isCol(gitbase.BlobsTableName, "blob_hash"),
848887
)(f)
888+
case t1 == gitbase.RepositoriesTableName && t2 == gitbase.CommitsTableName:
889+
return isEq(
890+
isCol(gitbase.RepositoriesTableName, "repository_id"),
891+
isCol(gitbase.CommitsTableName, "repository_id"),
892+
)(f)
893+
case t1 == gitbase.RepositoriesTableName && t2 == gitbase.TreeEntriesTableName:
894+
return isEq(
895+
isCol(gitbase.RepositoriesTableName, "repository_id"),
896+
isCol(gitbase.TreeEntriesTableName, "repository_id"),
897+
)(f)
898+
case t1 == gitbase.RepositoriesTableName && t2 == gitbase.BlobsTableName:
899+
return isEq(
900+
isCol(gitbase.RepositoriesTableName, "repository_id"),
901+
isCol(gitbase.BlobsTableName, "repository_id"),
902+
)(f)
849903
}
850904
return false
851905
}

internal/rule/squashjoins_test.go

+135-24
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,9 @@ func TestBuildSquashedTable(t *testing.T) {
233233
treeEntryBlobsSchema := append(gitbase.TreeEntriesSchema, gitbase.BlobsSchema...)
234234
refsBlobsSchema := append(gitbase.RefsSchema, gitbase.BlobsSchema...)
235235
commitBlobsSchema := append(gitbase.CommitsSchema, gitbase.BlobsSchema...)
236+
repoCommitsSchema := append(gitbase.RepositoriesSchema, gitbase.CommitsSchema...)
237+
repoTreeEntriesSchema := append(gitbase.RepositoriesSchema, gitbase.TreeEntriesSchema...)
238+
repoBlobsSchema := append(gitbase.RepositoriesSchema, gitbase.BlobsSchema...)
236239

237240
repoFilter := eq(
238241
col(0, gitbase.RepositoriesTableName, "repository_id"),
@@ -279,6 +282,36 @@ func TestBuildSquashedTable(t *testing.T) {
279282
col(1, gitbase.ReferencesTableName, "repository_id"),
280283
)
281284

285+
repoCommitsFilter := eq(
286+
col(0, gitbase.RepositoriesTableName, "repository_id"),
287+
col(2, gitbase.CommitsTableName, "commit_hash"),
288+
)
289+
290+
repoCommitsRedundantFilter := eq(
291+
col(0, gitbase.RepositoriesTableName, "repository_id"),
292+
col(1, gitbase.CommitsTableName, "repository_id"),
293+
)
294+
295+
repoTreeEntriesFilter := eq(
296+
col(0, gitbase.RepositoriesTableName, "repository_id"),
297+
col(2, gitbase.TreeEntriesTableName, "tree_hash"),
298+
)
299+
300+
repoTreeEntriesRedundantFilter := eq(
301+
col(0, gitbase.RepositoriesTableName, "repository_id"),
302+
col(1, gitbase.TreeEntriesTableName, "repository_id"),
303+
)
304+
305+
repoBlobsFilter := eq(
306+
col(0, gitbase.RepositoriesTableName, "repository_id"),
307+
col(2, gitbase.BlobsTableName, "blob_hash"),
308+
)
309+
310+
repoBlobsRedundantFilter := eq(
311+
col(0, gitbase.RepositoriesTableName, "repository_id"),
312+
col(1, gitbase.BlobsTableName, "repository_id"),
313+
)
314+
282315
commitFilter := eq(
283316
col(4, gitbase.CommitsTableName, "commit_hash"),
284317
col(4, gitbase.CommitsTableName, "commit_hash"),
@@ -504,14 +537,6 @@ func TestBuildSquashedTable(t *testing.T) {
504537
gitbase.CommitsTableName,
505538
),
506539
},
507-
{
508-
"repos with commits",
509-
[]sql.Table{repositories, commits},
510-
nil,
511-
nil,
512-
errInvalidIteratorChain,
513-
nil,
514-
},
515540
{
516541
"remotes with commits",
517542
[]sql.Table{remotes, commits},
@@ -574,14 +599,6 @@ func TestBuildSquashedTable(t *testing.T) {
574599
gitbase.TreeEntriesTableName,
575600
),
576601
},
577-
{
578-
"repos with tree entries",
579-
[]sql.Table{repositories, treeEntries},
580-
nil,
581-
nil,
582-
errInvalidIteratorChain,
583-
nil,
584-
},
585602
{
586603
"refs with tree entries",
587604
[]sql.Table{refs, treeEntries},
@@ -648,14 +665,6 @@ func TestBuildSquashedTable(t *testing.T) {
648665
gitbase.BlobsTableName,
649666
),
650667
},
651-
{
652-
"repos with blobs",
653-
[]sql.Table{repositories, blobs},
654-
nil,
655-
nil,
656-
errInvalidIteratorChain,
657-
nil,
658-
},
659668
{
660669
"remotes with blobs",
661670
[]sql.Table{remotes, blobs},
@@ -751,6 +760,81 @@ func TestBuildSquashedTable(t *testing.T) {
751760
gitbase.BlobsTableName,
752761
),
753762
},
763+
{
764+
"repos with commits",
765+
[]sql.Table{repositories, commits},
766+
[]sql.Expression{
767+
repoFilter,
768+
commitFilter,
769+
repoCommitsFilter,
770+
repoCommitsRedundantFilter,
771+
},
772+
nil,
773+
nil,
774+
newSquashedTable(
775+
gitbase.NewRepoCommitsIter(
776+
gitbase.NewAllReposIter(repoFilter),
777+
and(
778+
fixIdx(t, commitFilter, repoCommitsSchema),
779+
fixIdx(t, repoCommitsFilter, repoCommitsSchema),
780+
),
781+
),
782+
nil,
783+
gitbase.RepositoriesTableName,
784+
gitbase.CommitsTableName,
785+
),
786+
},
787+
{
788+
"repositories with tree entries",
789+
[]sql.Table{repositories, treeEntries},
790+
[]sql.Expression{
791+
repoFilter,
792+
treeEntryFilter,
793+
repoTreeEntriesFilter,
794+
repoTreeEntriesRedundantFilter,
795+
},
796+
nil,
797+
nil,
798+
newSquashedTable(
799+
gitbase.NewRepoTreeEntriesIter(
800+
gitbase.NewAllReposIter(repoFilter),
801+
and(
802+
fixIdx(t, treeEntryFilter, repoTreeEntriesSchema),
803+
fixIdx(t, repoTreeEntriesFilter, repoTreeEntriesSchema),
804+
),
805+
),
806+
nil,
807+
gitbase.RepositoriesTableName,
808+
gitbase.TreeEntriesTableName,
809+
),
810+
},
811+
{
812+
"blobs with tree entries",
813+
[]sql.Table{repositories, blobs},
814+
[]sql.Expression{
815+
repoFilter,
816+
blobFilter,
817+
repoBlobsFilter,
818+
repoBlobsRedundantFilter,
819+
},
820+
[]sql.Expression{expression.NewGetFieldWithTable(
821+
0, sql.Int64, gitbase.BlobsTableName, "blob_content", false,
822+
)},
823+
nil,
824+
newSquashedTable(
825+
gitbase.NewRepoBlobsIter(
826+
gitbase.NewAllReposIter(repoFilter),
827+
and(
828+
fixIdx(t, blobFilter, repoBlobsSchema),
829+
fixIdx(t, repoBlobsFilter, repoBlobsSchema),
830+
),
831+
true,
832+
),
833+
nil,
834+
gitbase.RepositoriesTableName,
835+
gitbase.BlobsTableName,
836+
),
837+
},
754838
}
755839

756840
for _, tt := range testCases {
@@ -1271,6 +1355,33 @@ func TestIsRedundantFilter(t *testing.T) {
12711355
),
12721356
false,
12731357
},
1358+
{
1359+
gitbase.RepositoriesTableName,
1360+
gitbase.CommitsTableName,
1361+
eq(
1362+
col(0, gitbase.RepositoriesTableName, "repository_id"),
1363+
col(0, gitbase.CommitsTableName, "repository_id"),
1364+
),
1365+
true,
1366+
},
1367+
{
1368+
gitbase.RepositoriesTableName,
1369+
gitbase.TreeEntriesTableName,
1370+
eq(
1371+
col(0, gitbase.RepositoriesTableName, "repository_id"),
1372+
col(0, gitbase.TreeEntriesTableName, "repository_id"),
1373+
),
1374+
true,
1375+
},
1376+
{
1377+
gitbase.RepositoriesTableName,
1378+
gitbase.BlobsTableName,
1379+
eq(
1380+
col(0, gitbase.RepositoriesTableName, "repository_id"),
1381+
col(0, gitbase.BlobsTableName, "repository_id"),
1382+
),
1383+
true,
1384+
},
12741385
}
12751386

12761387
for _, tt := range testCases {

0 commit comments

Comments
 (0)