def walk()

in mrs_plugin/lib/db_objects.py [0:0]


def walk(fields, parent_id=None, level=1, add_data_type=False, current_object=None):
    result = ""
    filtered_fields = list(
        filter(
            lambda f: f.get("reduceToValueOfFieldId", {}).get(
                "reduce_to_value_of_field_id"
            ),
            fields,
        )
    )
    reduce_to_field_ids = [
        f.get("reduceToValueOfFieldId", {}).get("reduce_to_value_of_field_id", "")
        for f in filtered_fields
    ]

    indent = " " * level * 4

    for field in fields:
        if field.get("parent_reference_id") != parent_id:
            continue

        if not field.get("object_reference") and (
            field["enabled"] or field["id"] in reduce_to_field_ids
        ):
            attributes = []
            inout = f'@{"IN" if field["db_column"].get("in") else ""}{"OUT" if field["db_column"].get("out") else ""}'
            inout != "@" and attributes.append(inout)
            field.get("db_column", {}).get("is_primary", False) and attributes.append("@KEY")
            field.get("no_check") and attributes.append("@NOCHECK")
            field.get("no_update") and attributes.append("@NOUPDATE")
            field.get("allow_sorting") and attributes.append("@SORTABLE")
            not field.get("allow_filtering") and attributes.append("@NOFILTERING")
            add_data_type and field["db_column"] and field["db_column"][
                "datatype"
            ] and attributes.append(f'@DATATYPE("{field["db_column"]["datatype"]}")')

            if field["id"] == current_object.get("row_ownership_field_id", None):
                attributes.append("@ROWOWNERSHIP")

            result += f"{indent}{field['name']}: {field['db_column']['name']}"
            if attributes:
                result = f"{result} {' '.join(attributes)}"
            result = f"{result},\n"
        elif (
            field.get("object_reference")
            and field["object_reference"].get("unnest")
            or field["enabled"]
        ):
            ref_table = f'{field["object_reference"]["reference_mapping"]["referenced_schema"]}.{field["object_reference"]["reference_mapping"]["referenced_table"]}'

            attributes = []
            options = field["object_reference"].get("options", {})
            if options is None:
                options = {}

            if options.get("dataMappingViewInsert", False):
                attributes.append("@INSERT")
            if options.get("dataMappingViewUpdate", False):
                attributes.append("@UPDATE")
            if options.get("dataMappingViewDelete", False):
                attributes.append("@DELETE")
            if options.get("dataMappingViewNoCheck", False):
                attributes.append("@NOCHECK")

            if field["object_reference"]["unnest"] or field["object_reference"].get(
                "reduce_to_value_of_field_id"
            ):
                attributes.append("@UNNEST")

            children = core.cut_last_comma(
                walk(
                    fields=fields,
                    parent_id=field["represents_reference_id"],
                    level=level + 1,
                    add_data_type=add_data_type,
                    current_object=field["object_reference"],
                )
            )

            result = f'{result}{indent}{field["name"]}: {ref_table}'

            if attributes:
                result = f'{result} {" ".join(attributes)}'

            if children:
                result = f"{result} {{\n{children}\n{indent}}},\n"

    return result