@@ -113,55 +113,68 @@ private void processField(BsonDocument doc, Struct struct, Field field) {
113
113
case INT64 :
114
114
case STRING :
115
115
case BYTES :
116
- handlePrimitiveField (doc , struct , field );
116
+ handlePrimitiveField (doc , struct . get ( field ) , field );
117
117
break ;
118
118
case STRUCT :
119
- handleStructField (doc , struct , field );
119
+ handleStructField (doc , ( Struct ) struct . get ( field ) , field );
120
120
break ;
121
121
case ARRAY :
122
- handleArrayField (doc , struct , field );
122
+ handleArrayField (doc , ( List ) struct . get ( field ) , field );
123
123
break ;
124
124
case MAP :
125
- handleMapField (doc , struct , field );
125
+ handleMapField (doc , ( Map ) struct . get ( field ) , field );
126
126
break ;
127
127
default :
128
+ logger .error ("Invalid schema. unexpected / unsupported schema type '"
129
+ + field .schema ().type () + "' for field '"
130
+ + field .name () + "' value='" + struct + "'" );
128
131
throw new DataException ("unexpected / unsupported schema type " + field .schema ().type ());
129
132
}
130
133
} catch (Exception exc ) {
134
+ logger .error ("Error while processing field. schema type '"
135
+ + field .schema ().type () + "' for field '"
136
+ + field .name () + "' value='" + struct + "'" );
131
137
throw new DataException ("error while processing field " + field .name (), exc );
132
138
}
133
139
134
140
}
135
141
136
- private void handleMapField (BsonDocument doc , Struct struct , Field field ) {
142
+ private void handleMapField (BsonDocument doc , Map m , Field field ) {
137
143
logger .trace ("handling complex type 'map'" );
138
- BsonDocument bd = new BsonDocument ();
139
- if (struct .get (field )==null ) {
144
+ if (m ==null ) {
140
145
logger .trace ("no field in struct -> adding null" );
141
146
doc .put (field .name (), BsonNull .VALUE );
142
147
return ;
143
148
}
144
- Map m = ( Map ) struct . get ( field );
149
+ BsonDocument bd = new BsonDocument ( );
145
150
for (Object entry : m .keySet ()) {
146
151
String key = (String )entry ;
147
- if (field .schema ().valueSchema ().type ().isPrimitive ()) {
152
+ Schema .Type valueSchemaType = field .schema ().valueSchema ().type ();
153
+ if (valueSchemaType .isPrimitive ()) {
148
154
bd .put (key , getConverter (field .schema ().valueSchema ()).toBson (m .get (key ),field .schema ()));
155
+ } else if (valueSchemaType .equals (Schema .Type .ARRAY )) {
156
+ final Field elementField = new Field (key , 0 , field .schema ().valueSchema ());
157
+ final List list = (List )m .get (key );
158
+ logger .trace ("adding array values to {} of type valueSchema={} value='{}'" ,
159
+ elementField .name (), elementField .schema ().valueSchema (), list );
160
+ handleArrayField (bd , list , elementField );
149
161
} else {
150
162
bd .put (key , toBsonDoc (field .schema ().valueSchema (), m .get (key )));
151
163
}
152
164
}
153
165
doc .put (field .name (), bd );
154
166
}
155
167
156
- private void handleArrayField (BsonDocument doc , Struct struct , Field field ) {
157
- logger .trace ("handling complex type 'array'" );
158
- BsonArray array = new BsonArray ( );
159
- if (struct . get ( field ) ==null ) {
160
- logger .trace ("no field in struct -> adding null" );
168
+ private void handleArrayField (BsonDocument doc , List list , Field field ) {
169
+ logger .trace ("handling complex type 'array' of types '{}'" ,
170
+ field . schema (). valueSchema (). type () );
171
+ if (list ==null ) {
172
+ logger .trace ("no array -> adding null" );
161
173
doc .put (field .name (), BsonNull .VALUE );
162
174
return ;
163
175
}
164
- for (Object element : (List )struct .get (field )) {
176
+ BsonArray array = new BsonArray ();
177
+ for (Object element : list ) {
165
178
if (field .schema ().valueSchema ().type ().isPrimitive ()) {
166
179
array .add (getConverter (field .schema ().valueSchema ()).toBson (element ,field .schema ()));
167
180
} else {
@@ -173,18 +186,18 @@ private void handleArrayField(BsonDocument doc, Struct struct, Field field) {
173
186
174
187
private void handleStructField (BsonDocument doc , Struct struct , Field field ) {
175
188
logger .trace ("handling complex type 'struct'" );
176
- if (struct . get ( field ) !=null ) {
177
- logger .trace (struct .get ( field ). toString ());
178
- doc .put (field .name (), toBsonDoc (field .schema (), struct . get ( field ) ));
189
+ if (struct !=null ) {
190
+ logger .trace (struct .toString ());
191
+ doc .put (field .name (), toBsonDoc (field .schema (), struct ));
179
192
} else {
180
193
logger .trace ("no field in struct -> adding null" );
181
194
doc .put (field .name (), BsonNull .VALUE );
182
195
}
183
196
}
184
197
185
- private void handlePrimitiveField (BsonDocument doc , Struct struct , Field field ) {
186
- logger .trace ("handling primitive type '{}'" ,field .schema ().type ());
187
- doc .put (field .name (), getConverter (field .schema ()).toBson (struct . get ( field ) ,field .schema ()));
198
+ private void handlePrimitiveField (BsonDocument doc , Object value , Field field ) {
199
+ logger .trace ("handling primitive type '{}' name='{}' " ,field .schema ().type (), field . name ());
200
+ doc .put (field .name (), getConverter (field .schema ()).toBson (value ,field .schema ()));
188
201
}
189
202
190
203
private boolean isSupportedLogicalType (Schema schema ) {
0 commit comments