forked from parquet-go/parquet-go
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcolumn_buffer_test.go
More file actions
132 lines (111 loc) · 2.77 KB
/
column_buffer_test.go
File metadata and controls
132 lines (111 loc) · 2.77 KB
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
package parquet
import (
"bytes"
"reflect"
"testing"
)
func TestBroadcastValueInt32(t *testing.T) {
buf := make([]int32, 123)
broadcastValueInt32(buf, 0x0A)
for i, v := range buf {
if v != 0x0A0A0A0A {
t.Fatalf("wrong value at index %d: %v", i, v)
}
}
}
func TestBroadcastRangeInt32(t *testing.T) {
buf := make([]int32, 123)
broadcastRangeInt32(buf, 1)
for i, v := range buf {
if v != int32(1+i) {
t.Fatalf("wrong value at index %d: %v", i, v)
}
}
}
func BenchmarkBroadcastValueInt32(b *testing.B) {
buf := make([]int32, 1000)
for i := 0; i < b.N; i++ {
broadcastValueInt32(buf, -1)
}
b.SetBytes(4 * int64(len(buf)))
}
func BenchmarkBroadcastRangeInt32(b *testing.B) {
buf := make([]int32, 1000)
for i := 0; i < b.N; i++ {
broadcastRangeInt32(buf, 0)
}
b.SetBytes(4 * int64(len(buf)))
}
func TestWriteAndReadOptionalList(t *testing.T) {
type record struct {
Values []float64 `parquet:"values,list,optional"`
}
records := []record{
{Values: []float64{1.0, 2.0, 3.0}},
{Values: []float64{}},
{Values: []float64{4.0, 5.0}},
}
buffer := new(bytes.Buffer)
if err := Write(buffer, records); err != nil {
t.Fatal(err)
}
found, err := Read[record](bytes.NewReader(buffer.Bytes()), int64(buffer.Len()))
if err != nil {
t.Fatal(err)
}
if !reflect.DeepEqual(records, found) {
t.Fatalf("expected %v, got %v", records, found)
}
}
func TestWriteAndReadOptionalPointer(t *testing.T) {
type record struct {
Value float64 `parquet:"values,optional"`
}
records := []record{
{Value: 1.0},
{Value: 0.0},
{Value: 2.0},
{Value: 0.0},
}
buffer := new(bytes.Buffer)
if err := Write(buffer, records); err != nil {
t.Fatal(err)
}
found, err := Read[record](bytes.NewReader(buffer.Bytes()), int64(buffer.Len()))
if err != nil {
t.Fatal(err)
}
if !reflect.DeepEqual(records, found) {
t.Fatalf("expected %v, got %v", records, found)
}
}
// https://github.com/segmentio/parquet-go/issues/501
func TestIssueSegmentio501(t *testing.T) {
col := newBooleanColumnBuffer(BooleanType, 0, 2055208)
// write all trues and then flush the buffer
_, err := col.WriteBooleans([]bool{true, true, true, true, true, true, true, true})
if err != nil {
t.Fatal(err)
}
col.Reset()
// write a single false, we are trying to trip a certain line of code in WriteBooleans
_, err = col.WriteBooleans([]bool{false})
if err != nil {
t.Fatal(err)
}
// now write 7 booleans at once, this will cause WriteBooleans to attempt its "alignment" logic
_, err = col.WriteBooleans([]bool{false, false, false, false, false, false, false})
if err != nil {
panic(err)
}
for i := range 8 {
read := make([]Value, 1)
_, err = col.ReadValuesAt(read, int64(i))
if err != nil {
t.Fatal(err)
}
if read[0].Boolean() {
t.Fatalf("expected false at index %d", i)
}
}
}