-
Notifications
You must be signed in to change notification settings - Fork 0
/
utils.go
101 lines (94 loc) · 2.98 KB
/
utils.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
package mergehelpers
import (
"sort"
"testing"
"github.com/stretchr/testify/require"
"github.com/wrgl/core/pkg/diff"
"github.com/wrgl/core/pkg/index"
"github.com/wrgl/core/pkg/merge"
"github.com/wrgl/core/pkg/misc"
"github.com/wrgl/core/pkg/objects"
"github.com/wrgl/core/pkg/ref"
"github.com/wrgl/core/pkg/sorter"
)
func CreateCollector(t *testing.T, db objects.Store, baseCom *objects.Commit) *merge.RowCollector {
t.Helper()
discardedRows, err := index.NewHashSet(misc.NewBuffer(nil), 0)
require.NoError(t, err)
baseT, err := objects.GetTable(db, baseCom.Table)
require.NoError(t, err)
collector, err := merge.NewCollector(db, baseT, discardedRows)
require.NoError(t, err)
return collector
}
func CollectUnresolvedMerges(t *testing.T, merger *merge.Merger) []*merge.Merge {
t.Helper()
mergeCh, err := merger.Start()
require.NoError(t, err)
merges := []*merge.Merge{}
for m := range mergeCh {
merges = append(merges, m)
}
sort.SliceStable(merges, func(i, j int) bool {
if merges[i].ColDiff != nil && merges[j].ColDiff == nil {
return true
}
if merges[j].ColDiff != nil && merges[i].ColDiff == nil {
return false
}
if merges[i].Base == nil && merges[j].Base != nil {
return true
}
if merges[j].Base == nil && merges[i].Base != nil {
return false
}
return string(merges[i].Base) < string(merges[j].Base)
})
return merges
}
func CollectSortedRows(t *testing.T, merger *merge.Merger, removedCols map[int]struct{}) ([]*sorter.Rows, uint32) {
t.Helper()
rows := []*sorter.Rows{}
ch, rowsCount, err := merger.SortedRows(removedCols)
require.NoError(t, err)
for blk := range ch {
rows = append(rows, blk)
}
require.NoError(t, merger.Error())
return rows, rowsCount
}
func CollectSortedBlocks(t *testing.T, merger *merge.Merger, removedCols map[int]struct{}) ([]*sorter.Block, uint32) {
t.Helper()
rows := []*sorter.Block{}
ch, rowsCount, err := merger.SortedBlocks(removedCols)
require.NoError(t, err)
for blk := range ch {
rows = append(rows, blk)
}
require.NoError(t, merger.Error())
return rows, rowsCount
}
func CreateMerger(t *testing.T, db objects.Store, commits ...[]byte) (*merge.Merger, *diff.BlockBuffer) {
base, err := ref.SeekCommonAncestor(db, commits...)
require.NoError(t, err)
baseCom, err := objects.GetCommit(db, base)
require.NoError(t, err)
baseT, err := objects.GetTable(db, baseCom.Table)
require.NoError(t, err)
otherTs := make([]*objects.Table, len(commits))
otherSums := make([][]byte, len(commits))
for i, sum := range commits {
com, err := objects.GetCommit(db, sum)
require.NoError(t, err)
otherT, err := objects.GetTable(db, com.Table)
require.NoError(t, err)
otherTs[i] = otherT
otherSums[i] = com.Table
}
collector := CreateCollector(t, db, baseCom)
buf, err := diff.BlockBufferWithSingleStore(db, append([]*objects.Table{baseT}, otherTs...))
require.NoError(t, err)
merger, err := merge.NewMerger(db, collector, buf, 0, baseT, otherTs, baseCom.Table, otherSums)
require.NoError(t, err)
return merger, buf
}