mirror of
https://github.com/featurebasedb/featurebase.git
synced 2026-08-28 10:54:59 +00:00
This commit adds id-to-key translation to make it easier for users to provide non-integer identifiers for rows & columns.
132 lines
3.6 KiB
Go
132 lines
3.6 KiB
Go
package inmem_test
|
|
|
|
import (
|
|
"fmt"
|
|
"math/rand"
|
|
"reflect"
|
|
"testing"
|
|
|
|
"github.com/pilosa/pilosa/inmem"
|
|
)
|
|
|
|
func TestTranslateStore_TranslateColumn(t *testing.T) {
|
|
s := inmem.NewTranslateStore()
|
|
|
|
// First translation should start id at zero.
|
|
if ids, err := s.TranslateColumnsToUint64("IDX0", []string{"foo"}); err != nil {
|
|
t.Fatal(err)
|
|
} else if !reflect.DeepEqual(ids, []uint64{1}) {
|
|
t.Fatalf("unexpected id: %#v", ids)
|
|
}
|
|
|
|
// Next translation on the same index should move to one.
|
|
if ids, err := s.TranslateColumnsToUint64("IDX0", []string{"bar"}); err != nil {
|
|
t.Fatal(err)
|
|
} else if !reflect.DeepEqual(ids, []uint64{2}) {
|
|
t.Fatalf("unexpected id: %#v", ids)
|
|
}
|
|
|
|
// Translation on a different index restarts at 0.
|
|
if ids, err := s.TranslateColumnsToUint64("IDX1", []string{"bar"}); err != nil {
|
|
t.Fatal(err)
|
|
} else if !reflect.DeepEqual(ids, []uint64{1}) {
|
|
t.Fatalf("unexpected id: %#v", ids)
|
|
}
|
|
|
|
// Ensure that string values can be looked up by ID.
|
|
if value, err := s.TranslateColumnToString("IDX0", 2); err != nil {
|
|
t.Fatal(err)
|
|
} else if value != "bar" {
|
|
t.Fatalf("unexpected value: %s", value)
|
|
}
|
|
}
|
|
|
|
func TestTranslateStore_TranslateRow(t *testing.T) {
|
|
s := inmem.NewTranslateStore()
|
|
|
|
// First translation should start id at zero.
|
|
if ids, err := s.TranslateRowsToUint64("IDX0", "FRAME0", []string{"foo"}); err != nil {
|
|
t.Fatal(err)
|
|
} else if !reflect.DeepEqual(ids, []uint64{1}) {
|
|
t.Fatalf("unexpected id: %#v", ids)
|
|
}
|
|
|
|
// Next translation on the same index should move to one.
|
|
if ids, err := s.TranslateRowsToUint64("IDX0", "FRAME0", []string{"bar"}); err != nil {
|
|
t.Fatal(err)
|
|
} else if !reflect.DeepEqual(ids, []uint64{2}) {
|
|
t.Fatalf("unexpected id: %#v", ids)
|
|
}
|
|
|
|
// Translation on a different index restarts at 0.
|
|
if ids, err := s.TranslateRowsToUint64("IDX1", "FRAME0", []string{"bar"}); err != nil {
|
|
t.Fatal(err)
|
|
} else if !reflect.DeepEqual(ids, []uint64{1}) {
|
|
t.Fatalf("unexpected id: %#v", ids)
|
|
}
|
|
|
|
// Translation on a different frame restarts at 0.
|
|
if ids, err := s.TranslateRowsToUint64("IDX0", "FRAME1", []string{"bar"}); err != nil {
|
|
t.Fatal(err)
|
|
} else if !reflect.DeepEqual(ids, []uint64{1}) {
|
|
t.Fatalf("unexpected id: %#v", ids)
|
|
}
|
|
|
|
// Ensure that string values can be looked up by ID.
|
|
if value, err := s.TranslateRowToString("IDX0", "FRAME0", 2); err != nil {
|
|
t.Fatal(err)
|
|
} else if value != "bar" {
|
|
t.Fatalf("unexpected value: %s", value)
|
|
}
|
|
}
|
|
|
|
func BenchmarkTranslateStore_TranslateColumnsToUint64(b *testing.B) {
|
|
const batchSize = 1000
|
|
|
|
s := inmem.NewTranslateStore()
|
|
|
|
// Generate keys before benchmark begins
|
|
keySets := make([][]string, b.N/1000)
|
|
for i := range keySets {
|
|
keySets[i] = make([]string, batchSize)
|
|
for j, jv := range rand.New(rand.NewSource(0)).Perm(batchSize) {
|
|
keySets[i][j] = fmt.Sprintf("%08d%08d", jv, i)
|
|
}
|
|
}
|
|
|
|
b.ResetTimer()
|
|
|
|
for _, keySet := range keySets {
|
|
if _, err := s.TranslateColumnsToUint64("IDX0", keySet); err != nil {
|
|
b.Fatal(err)
|
|
}
|
|
}
|
|
}
|
|
|
|
func BenchmarkTranslateStore_TranslateColumnToString(b *testing.B) {
|
|
const batchSize = 1000
|
|
|
|
s := inmem.NewTranslateStore()
|
|
|
|
// Generate keys before benchmark begins
|
|
for i := 0; i < b.N; i += batchSize {
|
|
keySet := make([]string, batchSize)
|
|
for j, jv := range rand.New(rand.NewSource(0)).Perm(batchSize) {
|
|
keySet[j] = fmt.Sprintf("%08d%08d", jv, i)
|
|
}
|
|
if _, err := s.TranslateColumnsToUint64("IDX0", keySet); err != nil {
|
|
b.Fatal(err)
|
|
}
|
|
}
|
|
|
|
// Generate random key access.
|
|
perm := rand.New(rand.NewSource(0)).Perm(b.N)
|
|
|
|
b.ResetTimer()
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
if _, err := s.TranslateColumnToString("IDX0", uint64(perm[i])); err != nil {
|
|
b.Fatal(err)
|
|
}
|
|
}
|
|
}
|