1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package schema
18
19 import (
20 "github.com/apache/arrow/go/v15/parquet"
21 "golang.org/x/xerrors"
22 )
23
24
25
26
27
28
29
30
31
32
33
34
35 func ListOf(n Node, rep parquet.Repetition, fieldID int32) (*GroupNode, error) {
36 return ListOfWithName(n.Name(), n, rep, fieldID)
37 }
38
39
40
41
42
43
44
45
46
47
48
49
50 func ListOfWithName(listName string, element Node, rep parquet.Repetition, fieldID int32) (*GroupNode, error) {
51 if rep == parquet.Repetitions.Repeated {
52 return nil, xerrors.Errorf("parquet: listof repetition must not be repeated, got :%s", rep)
53 }
54
55 if element.RepetitionType() == parquet.Repetitions.Repeated {
56 return nil, xerrors.Errorf("parquet: element repetition must not be repeated, got: %s", element.RepetitionType())
57 }
58
59 switch n := element.(type) {
60 case *PrimitiveNode:
61 n.name = "element"
62 case *GroupNode:
63 n.name = "element"
64 }
65
66 list, err := NewGroupNode("list" , parquet.Repetitions.Repeated, FieldList{element}, -1 )
67 if err != nil {
68 return nil, err
69 }
70
71 return NewGroupNodeLogical(listName, rep, FieldList{list}, ListLogicalType{}, fieldID)
72 }
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91 func MapOf(name string, key Node, value Node, mapRep parquet.Repetition, fieldID int32) (*GroupNode, error) {
92 if mapRep == parquet.Repetitions.Repeated {
93 return nil, xerrors.Errorf("parquet: map repetition cannot be Repeated, got: %s", mapRep)
94 }
95
96 if key.RepetitionType() != parquet.Repetitions.Required {
97 return nil, xerrors.Errorf("parquet: map key repetition must be Required, got: %s", key.RepetitionType())
98 }
99
100 if value != nil {
101 if value.RepetitionType() == parquet.Repetitions.Repeated {
102 return nil, xerrors.New("parquet: map value cannot have repetition Repeated")
103 }
104 switch value := value.(type) {
105 case *PrimitiveNode:
106 value.name = "value"
107 case *GroupNode:
108 value.name = "value"
109 }
110 }
111
112 switch key := key.(type) {
113 case *PrimitiveNode:
114 key.name = "key"
115 case *GroupNode:
116 key.name = "key"
117 }
118
119 keyval := FieldList{key}
120 if value != nil {
121 keyval = append(keyval, value)
122 }
123
124 kvNode, err := NewGroupNode("key_value" , parquet.Repetitions.Repeated, keyval, -1 )
125 if err != nil {
126 return nil, err
127 }
128 return NewGroupNodeLogical(name, mapRep, FieldList{kvNode}, MapLogicalType{}, fieldID)
129 }
130
View as plain text