-
Notifications
You must be signed in to change notification settings - Fork 46
/
Copy pathtreereaderfactory.go
148 lines (145 loc) · 3.92 KB
/
treereaderfactory.go
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
package orc
import (
"fmt"
"github.com/scritchley/orc/proto"
)
func createTreeReader(schema *TypeDescription, s *Stripe) (TreeReader, error) {
id := schema.getID()
encoding, err := s.getColumn(id)
if err != nil {
return nil, err
}
switch category := schema.getCategory(); category {
case CategoryBoolean:
return NewBooleanTreeReader(
s.get(streamName{id, proto.Stream_PRESENT}),
s.get(streamName{id, proto.Stream_DATA}),
encoding,
)
case CategoryByte:
return NewByteTreeReader(
s.get(streamName{id, proto.Stream_PRESENT}),
s.get(streamName{id, proto.Stream_DATA}),
encoding,
)
case CategoryShort, CategoryInt, CategoryLong:
return NewIntegerTreeReader(
s.get(streamName{id, proto.Stream_PRESENT}),
s.get(streamName{id, proto.Stream_DATA}),
encoding,
)
case CategoryFloat:
return NewFloatTreeReader(
4, // Byte width
s.get(streamName{id, proto.Stream_PRESENT}),
s.get(streamName{id, proto.Stream_DATA}),
encoding,
)
case CategoryDouble:
return NewFloatTreeReader(
8, // Byte width
s.get(streamName{id, proto.Stream_PRESENT}),
s.get(streamName{id, proto.Stream_DATA}),
encoding,
)
case CategoryString, CategoryVarchar, CategoryChar:
return NewStringTreeReader(
s.get(streamName{id, proto.Stream_PRESENT}),
s.get(streamName{id, proto.Stream_DATA}),
s.get(streamName{id, proto.Stream_LENGTH}),
s.get(streamName{id, proto.Stream_DICTIONARY_DATA}),
encoding,
)
case CategoryDate:
return NewDateTreeReader(
s.get(streamName{id, proto.Stream_PRESENT}),
s.get(streamName{id, proto.Stream_DATA}),
encoding,
)
case CategoryTimestamp:
return NewTimestampTreeReader(
s.get(streamName{id, proto.Stream_PRESENT}),
s.get(streamName{id, proto.Stream_DATA}),
s.get(streamName{id, proto.Stream_SECONDARY}),
encoding,
)
case CategoryBinary:
return NewBinaryTreeReader(
s.get(streamName{id, proto.Stream_PRESENT}),
s.get(streamName{id, proto.Stream_DATA}),
s.get(streamName{id, proto.Stream_LENGTH}),
encoding,
)
case CategoryDecimal:
return NewDecimalTreeReader(
s.get(streamName{id, proto.Stream_PRESENT}),
s.get(streamName{id, proto.Stream_DATA}),
s.get(streamName{id, proto.Stream_SECONDARY}),
encoding,
schema.precision,
schema.scale,
)
case CategoryList:
if len(schema.children) != 1 {
return nil, fmt.Errorf("expect 1 child for list type, got: %v", len(schema.children))
}
valueReader, err := createTreeReader(schema.children[0], s)
if err != nil {
return nil, err
}
return NewListTreeReader(
s.get(streamName{id, proto.Stream_PRESENT}),
s.get(streamName{id, proto.Stream_LENGTH}),
valueReader,
encoding,
)
case CategoryMap:
if len(schema.children) != 2 {
return nil, fmt.Errorf("expect 2 children for map type, got: %v", len(schema.children))
}
keyReader, err := createTreeReader(schema.children[0], s)
if err != nil {
return nil, err
}
valueReader, err := createTreeReader(schema.children[1], s)
if err != nil {
return nil, err
}
return NewMapTreeReader(
s.get(streamName{id, proto.Stream_PRESENT}),
s.get(streamName{id, proto.Stream_LENGTH}),
keyReader,
valueReader,
encoding,
)
case CategoryStruct:
children := make(map[string]TreeReader)
for i := range schema.children {
child, err := createTreeReader(schema.children[i], s)
if err != nil {
return nil, err
}
children[schema.fieldNames[i]] = child
}
return NewStructTreeReader(
s.get(streamName{id, proto.Stream_PRESENT}),
children,
)
case CategoryUnion:
children := make([]TreeReader, len(schema.children))
for i := range schema.children {
child, err := createTreeReader(schema.children[i], s)
if err != nil {
return nil, err
}
children[i] = child
}
return NewUnionTreeReader(
s.get(streamName{id, proto.Stream_PRESENT}),
s.get(streamName{id, proto.Stream_DATA}),
children,
)
default:
return nil, fmt.Errorf("unsupported type: %s", category)
}
}