(type_resolver, field_names, serializers, nullable_map=None, field_infos_list=None)
| 1006 | |
| 1007 | |
| 1008 | def group_fields(type_resolver, field_names, serializers, nullable_map=None, field_infos_list=None): |
| 1009 | nullable_map = nullable_map or {} |
| 1010 | field_info_map = {} |
| 1011 | if field_infos_list: |
| 1012 | field_info_map = {fi.name: fi for fi in field_infos_list} |
| 1013 | boxed_types = [] |
| 1014 | nullable_boxed_types = [] |
| 1015 | non_primitive_types = [] |
| 1016 | collection_types = [] |
| 1017 | set_types = [] |
| 1018 | map_types = [] |
| 1019 | other_types = [] |
| 1020 | type_ids = [] |
| 1021 | for field_name, serializer in zip(field_names, serializers): |
| 1022 | fi = field_info_map.get(field_name) |
| 1023 | tag_id = fi.tag_id if fi else -1 |
| 1024 | if tag_id >= 0: |
| 1025 | sort_key = (0, tag_id, "") |
| 1026 | else: |
| 1027 | sort_key = (1, _to_snake_case(field_name), field_name) |
| 1028 | if serializer is None: |
| 1029 | non_primitive_types.append((_UNKNOWN_TYPE_ID, serializer, field_name, sort_key)) |
| 1030 | else: |
| 1031 | type_ids.append( |
| 1032 | ( |
| 1033 | type_resolver.get_type_info(serializer.type_).type_id, |
| 1034 | serializer, |
| 1035 | field_name, |
| 1036 | sort_key, |
| 1037 | ) |
| 1038 | ) |
| 1039 | for type_id, serializer, field_name, sort_key in type_ids: |
| 1040 | if is_union_type(type_id): |
| 1041 | type_id = TypeId.UNION |
| 1042 | is_nullable = nullable_map.get(field_name, False) |
| 1043 | if is_primitive_type(type_id): |
| 1044 | container = nullable_boxed_types if is_nullable else boxed_types |
| 1045 | else: |
| 1046 | container = non_primitive_types |
| 1047 | container.append((type_id, serializer, field_name, sort_key)) |
| 1048 | |
| 1049 | def numeric_sorter(item): |
| 1050 | id_ = item[0] |
| 1051 | compress = id_ in { |
| 1052 | # Signed compressed types |
| 1053 | TypeId.VARINT32, |
| 1054 | TypeId.VARINT64, |
| 1055 | TypeId.TAGGED_INT64, |
| 1056 | # Unsigned compressed types |
| 1057 | TypeId.VAR_UINT32, |
| 1058 | TypeId.VAR_UINT64, |
| 1059 | TypeId.TAGGED_UINT64, |
| 1060 | } |
| 1061 | # Sort by: compress flag, -size (largest first), type_id (lower first), field_name |
| 1062 | return int(compress), -get_primitive_type_size(id_), id_, item[3] |
| 1063 | |
| 1064 | boxed_types = sorted(boxed_types, key=numeric_sorter) |
| 1065 | nullable_boxed_types = sorted(nullable_boxed_types, key=numeric_sorter) |
no test coverage detected