Skip to content

Commit 398e05c

Browse files
authored
feat: added avro schema map datatype (#2344)
1 parent f609c9e commit 398e05c

File tree

3 files changed

+58
-0
lines changed

3 files changed

+58
-0
lines changed

src/helpers/AvroToMetaModel.ts

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import {
22
AnyModel,
33
ArrayModel,
4+
DictionaryModel,
45
AvroSchema,
56
BooleanModel,
67
EnumModel,
@@ -109,6 +110,14 @@ export function AvroToMetaModel(
109110
if (unionModel !== undefined) {
110111
return unionModel;
111112
}
113+
const dictionaryModel = toDictionaryModel(
114+
avroSchemaModel,
115+
modelName,
116+
alreadySeenModels
117+
);
118+
if (dictionaryModel !== undefined) {
119+
return dictionaryModel;
120+
}
112121

113122
Logger.warn('Failed to convert to MetaModel, defaulting to AnyModel.');
114123
return new AnyModel(
@@ -366,3 +375,40 @@ export function toArrayModel(
366375
}
367376
return undefined;
368377
}
378+
export function toDictionaryModel(
379+
avroSchemaModel: AvroSchema,
380+
name: string,
381+
alreadySeenModels: Map<AvroSchema, MetaModel>
382+
): DictionaryModel | undefined {
383+
if (
384+
(typeof avroSchemaModel.type === 'string' ||
385+
Array.isArray(avroSchemaModel.type)) &&
386+
avroSchemaModel.type?.includes('map')
387+
) {
388+
const keyModel = new StringModel(
389+
'',
390+
undefined,
391+
getMetaModelOptions(avroSchemaModel)
392+
);
393+
let valueModel = new AnyModel(
394+
'',
395+
undefined,
396+
getMetaModelOptions(avroSchemaModel)
397+
);
398+
if (avroSchemaModel.values !== undefined) {
399+
const AvroModel = new AvroSchema();
400+
AvroModel.name = `${name}_${avroSchemaModel.values}`;
401+
AvroModel.type = avroSchemaModel.values;
402+
valueModel = AvroToMetaModel(AvroModel, alreadySeenModels);
403+
}
404+
405+
return new DictionaryModel(
406+
name,
407+
avroSchemaModel.originalInput,
408+
getMetaModelOptions(avroSchemaModel),
409+
keyModel,
410+
valueModel
411+
);
412+
}
413+
return undefined;
414+
}

src/models/AvroSchema.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,5 @@ export class AvroSchema {
2222
exclusiveMinimum?: unknown;
2323
exclusiveMaximum?: unknown;
2424
logicalType?: unknown;
25+
values?: string;
2526
}

test/helpers/AvroToMetaModel.spec.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
BooleanModel,
66
EnumModel,
77
FloatModel,
8+
DictionaryModel,
89
IntegerModel,
910
ObjectModel,
1011
StringModel
@@ -208,4 +209,14 @@ describe('AvroToMetaModel', () => {
208209
expect(model).not.toBeUndefined();
209210
expect(model instanceof IntegerModel).toBeTruthy();
210211
});
212+
test('should convert to dictionary model', () => {
213+
const av = new AvroSchema();
214+
av.name = 'test';
215+
av.type = { type: 'map', values: 'integer' };
216+
217+
const model = AvroToMetaModel(av);
218+
219+
expect(model).not.toBeUndefined();
220+
expect(model instanceof DictionaryModel).toBeTruthy();
221+
});
211222
});

0 commit comments

Comments
 (0)