forked from TrueCloudLab/frostfs-node
Revert "[#972] pilorama: Remove removeDuplicatesInPlace()"
This reverts commit 45fd4e4ff1
.
Signed-off-by: Evgenii Stratonikov <e.stratonikov@yadro.com>
This commit is contained in:
parent
dad56d2e98
commit
9f68305c2e
2 changed files with 83 additions and 2 deletions
|
@ -2,7 +2,6 @@ package pilorama
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"slices"
|
|
||||||
"sort"
|
"sort"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
@ -51,7 +50,7 @@ func (b *batch) run() {
|
||||||
sort.Slice(b.operations, func(i, j int) bool {
|
sort.Slice(b.operations, func(i, j int) bool {
|
||||||
return b.operations[i].Time < b.operations[j].Time
|
return b.operations[i].Time < b.operations[j].Time
|
||||||
})
|
})
|
||||||
b.operations = slices.CompactFunc(b.operations, func(x, y *Move) bool { return x.Time == y.Time })
|
b.operations = removeDuplicatesInPlace(b.operations)
|
||||||
|
|
||||||
// Our main use-case is addition of new items. In this case,
|
// Our main use-case is addition of new items. In this case,
|
||||||
// we do not need to perform undo()/redo(), just do().
|
// we do not need to perform undo()/redo(), just do().
|
||||||
|
@ -116,3 +115,15 @@ func (b *batch) run() {
|
||||||
b.results[i] <- err
|
b.results[i] <- err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func removeDuplicatesInPlace(a []*Move) []*Move {
|
||||||
|
equalCount := 0
|
||||||
|
for i := 1; i < len(a); i++ {
|
||||||
|
if a[i].Time == a[i-1].Time {
|
||||||
|
equalCount++
|
||||||
|
} else {
|
||||||
|
a[i-equalCount] = a[i]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return a[:len(a)-equalCount]
|
||||||
|
}
|
||||||
|
|
70
pkg/local_object_storage/pilorama/batch_test.go
Normal file
70
pkg/local_object_storage/pilorama/batch_test.go
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
package pilorama
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Test_removeDuplicatesInPlace(t *testing.T) {
|
||||||
|
testCases := []struct {
|
||||||
|
before []int
|
||||||
|
after []int
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
before: []int{},
|
||||||
|
after: []int{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
before: []int{1},
|
||||||
|
after: []int{1},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
before: []int{1, 2},
|
||||||
|
after: []int{1, 2},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
before: []int{1, 2, 3},
|
||||||
|
after: []int{1, 2, 3},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
before: []int{1, 1, 2},
|
||||||
|
after: []int{1, 2},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
before: []int{1, 2, 2},
|
||||||
|
after: []int{1, 2},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
before: []int{1, 2, 2, 3},
|
||||||
|
after: []int{1, 2, 3},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
before: []int{1, 1, 1},
|
||||||
|
after: []int{1},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
before: []int{1, 1, 2, 2},
|
||||||
|
after: []int{1, 2},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
before: []int{1, 1, 1, 2, 3, 3, 3},
|
||||||
|
after: []int{1, 2, 3},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tc := range testCases {
|
||||||
|
ops := make([]*Move, len(tc.before))
|
||||||
|
for i := range ops {
|
||||||
|
ops[i] = &Move{Meta: Meta{Time: Timestamp(tc.before[i])}}
|
||||||
|
}
|
||||||
|
|
||||||
|
expected := make([]*Move, len(tc.after))
|
||||||
|
for i := range expected {
|
||||||
|
expected[i] = &Move{Meta: Meta{Time: Timestamp(tc.after[i])}}
|
||||||
|
}
|
||||||
|
|
||||||
|
actual := removeDuplicatesInPlace(ops)
|
||||||
|
require.Equal(t, expected, actual, "%d", tc.before)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue