def _object_schema_to_line_tuples(cls, object_schema, columns_to_get, field_prefix):
""" Get the list of tuples describing lines in object_schema
- Sort fields by count
- Add the tuples describing each field in object
- Recursively add tuples for nested objects
:param object_schema: dict
:param columns_to_get: iterable
columns to create for each field
:param field_prefix: str, default ''
allows to create full name.
'.' is the separator for object subfields
':' is the separator for list of objects subfields
:return line_tuples: list of tuples describing lines
"""
line_tuples = []
sorted_fields = sorted(list(object_schema.items()),
key=lambda x: (-x[1]['count'], x[0]) if 'count' in x[1] else x[0])
for field, field_schema in sorted_fields:
line_columns = cls._field_schema_to_columns(
field, field_schema, field_prefix, columns_to_get)
line_tuples.append(line_columns)
types = field_schema.get('types_count', [field_schema['type']])
if 'object' in field_schema:
if 'ARRAY' in types:
current_prefix = field_prefix + field + ':'
elif 'OBJECT' in types:
current_prefix = field_prefix + field + '.'
else:
logger.warning('Field {} has key "object" but has types {} while should have '
'"OBJECT" or "ARRAY"'.format(field, types))
continue
line_tuples += cls._object_schema_to_line_tuples(
field_schema['object'], columns_to_get, field_prefix=current_prefix)
return line_tuples
评论列表
文章目录