Spaces:
Running
Running
// _ _ | |
// __ _____ __ ___ ___ __ _| |_ ___ | |
// \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \ | |
// \ V V / __/ (_| |\ V /| | (_| | || __/ | |
// \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___| | |
// | |
// Copyright © 2016 - 2024 Weaviate B.V. All rights reserved. | |
// | |
// CONTACT: [email protected] | |
// | |
package lsmkv | |
import ( | |
"testing" | |
"github.com/stretchr/testify/assert" | |
"github.com/stretchr/testify/require" | |
) | |
func Test_BinarySearchTreeMap(t *testing.T) { | |
t.Run("single row key, single map key", func(t *testing.T) { | |
tree := &binarySearchTreeMap{} | |
rowKey := []byte("rowkey") | |
pair1 := MapPair{ | |
Key: []byte("map-key-1"), | |
Value: []byte("map-value-1"), | |
} | |
tree.insert(rowKey, pair1) | |
res, err := tree.get(rowKey) | |
require.Nil(t, err) | |
assert.Equal(t, []MapPair{ | |
{ | |
Key: []byte("map-key-1"), | |
Value: []byte("map-value-1"), | |
}, | |
}, res) | |
}) | |
t.Run("single row key, updated map value", func(t *testing.T) { | |
tree := &binarySearchTreeMap{} | |
rowKey := []byte("rowkey") | |
tree.insert(rowKey, MapPair{ | |
Key: []byte("c"), | |
Value: []byte("c1"), | |
}) | |
tree.insert(rowKey, MapPair{ | |
Key: []byte("a"), | |
Value: []byte("a1"), | |
}) | |
tree.insert(rowKey, MapPair{ | |
Key: []byte("b"), | |
Value: []byte("b1"), | |
}) | |
tree.insert(rowKey, MapPair{ | |
Key: []byte("b"), | |
Value: []byte("b2"), | |
}) | |
tree.insert(rowKey, MapPair{ | |
Key: []byte("a"), | |
Value: []byte("a2"), | |
}) | |
res, err := tree.get(rowKey) | |
require.Nil(t, err) | |
assert.Equal(t, []MapPair{ | |
{ | |
Key: []byte("a"), | |
Value: []byte("a2"), | |
}, | |
{ | |
Key: []byte("b"), | |
Value: []byte("b2"), | |
}, | |
{ | |
Key: []byte("c"), | |
Value: []byte("c1"), | |
}, | |
}, res) | |
}) | |
t.Run("two row keys, updated map value", func(t *testing.T) { | |
tree := &binarySearchTreeMap{} | |
rowKey1 := []byte("rowkey") | |
rowKey2 := []byte("other-rowkey") | |
tree.insert(rowKey1, MapPair{ | |
Key: []byte("c"), | |
Value: []byte("c1"), | |
}) | |
tree.insert(rowKey1, MapPair{ | |
Key: []byte("a"), | |
Value: []byte("a1"), | |
}) | |
tree.insert(rowKey2, MapPair{ | |
Key: []byte("z"), | |
Value: []byte("z1"), | |
}) | |
tree.insert(rowKey1, MapPair{ | |
Key: []byte("b"), | |
Value: []byte("b1"), | |
}) | |
tree.insert(rowKey2, MapPair{ | |
Key: []byte("x"), | |
Value: []byte("x1"), | |
}) | |
tree.insert(rowKey1, MapPair{ | |
Key: []byte("b"), | |
Value: []byte("b2"), | |
}) | |
tree.insert(rowKey1, MapPair{ | |
Key: []byte("a"), | |
Value: []byte("a2"), | |
}) | |
tree.insert(rowKey2, MapPair{ | |
Key: []byte("x"), | |
Value: []byte("x2"), | |
}) | |
res, err := tree.get(rowKey1) | |
require.Nil(t, err) | |
assert.Equal(t, []MapPair{ | |
{ | |
Key: []byte("a"), | |
Value: []byte("a2"), | |
}, | |
{ | |
Key: []byte("b"), | |
Value: []byte("b2"), | |
}, | |
{ | |
Key: []byte("c"), | |
Value: []byte("c1"), | |
}, | |
}, res) | |
res, err = tree.get(rowKey2) | |
require.Nil(t, err) | |
assert.Equal(t, []MapPair{ | |
{ | |
Key: []byte("x"), | |
Value: []byte("x2"), | |
}, | |
{ | |
Key: []byte("z"), | |
Value: []byte("z1"), | |
}, | |
}, res) | |
}) | |
t.Run("single row key, deleted map values", func(t *testing.T) { | |
tree := &binarySearchTreeMap{} | |
rowKey := []byte("rowkey") | |
tree.insert(rowKey, MapPair{ | |
Key: []byte("c"), | |
Value: []byte("c1"), | |
}) | |
tree.insert(rowKey, MapPair{ | |
Key: []byte("a"), | |
Value: []byte("a1"), | |
}) | |
tree.insert(rowKey, MapPair{ | |
Key: []byte("b"), | |
Value: []byte("b1"), | |
}) | |
tree.insert(rowKey, MapPair{ | |
Key: []byte("b"), | |
Tombstone: true, | |
}) | |
tree.insert(rowKey, MapPair{ | |
Key: []byte("a"), | |
Tombstone: true, | |
}) | |
res, err := tree.get(rowKey) | |
require.Nil(t, err) | |
assert.Equal(t, []MapPair{ | |
{ | |
Key: []byte("a"), | |
Tombstone: true, | |
}, | |
{ | |
Key: []byte("b"), | |
Tombstone: true, | |
}, | |
{ | |
Key: []byte("c"), | |
Value: []byte("c1"), | |
}, | |
}, res) | |
}) | |
} | |