diff options
Diffstat (limited to 'weed/compress')
| -rw-r--r-- | weed/compress/compression_test.go | 45 | ||||
| -rw-r--r-- | weed/compress/delta_binary_pack32.go | 32 |
2 files changed, 77 insertions, 0 deletions
diff --git a/weed/compress/compression_test.go b/weed/compress/compression_test.go new file mode 100644 index 000000000..83b7c0055 --- /dev/null +++ b/weed/compress/compression_test.go @@ -0,0 +1,45 @@ +package compress + +import ( + "math/rand" + "testing" +) + +func TestSortedData(t *testing.T) { + data := make([]int32, 102400) + for i := 1; i < len(data); i++ { + data[i] = data[i-1] + rand.Int31n(15) + } + testCompressAndUncompress(t, data, "Sorted data") +} + +func TestUnsortedData(t *testing.T) { + data := make([]int32, 102400) + for i := 0; i < len(data); i++ { + data[i] = rand.Int31n(255) + } + testCompressAndUncompress(t, data, "Unsorted data") +} + +func testCompressAndUncompress(t *testing.T, data []int32, desc string) { + + compressed_data, err := Compress32(data) + if err != nil { + t.Fatal("Compress error", err.Error()) + } + uncompressed_data, err := Uncompress32(compressed_data, make([]int32, len(data)*2)) + if err != nil { + t.Fatal("Compress error", err.Error()) + } + if len(uncompressed_data) != len(data) { + t.Fatal("Len differs", len(data), len(uncompressed_data)) + } + for i := 0; i < len(data); i++ { + if data[i] != uncompressed_data[i] { + t.Fatal("Data differs:", i, data[i], uncompressed_data[i]) + } + } + + println(desc, " Data length:", len(data), " => Compressed length:", len(compressed_data)) + +} diff --git a/weed/compress/delta_binary_pack32.go b/weed/compress/delta_binary_pack32.go new file mode 100644 index 000000000..42ae8d42d --- /dev/null +++ b/weed/compress/delta_binary_pack32.go @@ -0,0 +1,32 @@ +package compress + +import ( + "github.com/reducedb/encoding/cursor" + "github.com/reducedb/encoding/delta/bp32" +) + +// Compress compresses in[]int32 to out[]int32 +func Compress32(in []int32) (out []int32, err error) { + out = make([]int32, len(in)*2) + inpos := cursor.New() + outpos := cursor.New() + + if err = bp32.New().Compress(in, inpos, len(in), out, outpos); err != nil { + return nil, err + } + + return out[:outpos.Get()], nil +} + +// Uncompress uncompresses in[]int32 to out[]int32 +func Uncompress32(in []int32, buffer []int32) (out []int32, err error) { + out = buffer + inpos := cursor.New() + outpos := cursor.New() + + if err = bp32.New().Uncompress(in, inpos, len(in), out, outpos); err != nil { + return nil, err + } + + return out[:outpos.Get()], nil +} |
