Soy nuevo en Open Policy Agent (OPA) y el lenguaje Rego. Necesito convertir una lista de objetos que obtengo de la entrada a un objeto (en el mejor de los casos en el tiempo O (n)). El problema es que la clave usada puede estar duplicada en una lista. Ejemplo de entrada:

[
    {
        "id": "a",
        "body": {...}
    },
    {
        "id": "b",
        "body": {...}
    },
    {
        "id": "a",
        "body": {...}
    }
]

Salida esperada:

{
    "a": [
        {
            "id": "a",
            "body": {...}
        },
        {
            "id": "a",
            "body": {...}
        }
    ],
    "b": [
        {
            "id": "b",
            "body": {...}
        }
    ]
}

¿Cuál es la mejor opción para hacer esto? Intenté crear una función, pero la salida nunca se evalúa:

package test

inpt := [
    {"id": "a", "body":{"a":1}},
    {"id": "b", "body":{"a":1}},
    {"id": "a", "body":{"a":2}},
]

x := f(inpt)

f(input_list) = output_obj {
    output_obj := {}
    inner := input_list[_]
    inner_list = object.get(output_obj, inner.id, [])
    merged := array.concat(inner_list, [inner])
    output_obj[inner.id] = merged
}

La única opción que encontré es el bucle interno (O (n ^ 2)):

output_obj := {i.id : [j | j:= inpt[_]; j.id == i.id] | i := inpt[_]}
0
user2106655 20 ene. 2021 a las 11:01

1 respuesta

La mejor respuesta

indexación comprensiva debe garantizar la complejidad del tiempo de ejecución O (n) dada la regla cumple las condiciones para eso (lo que hace el tuyo):

package test

output_obj := {id: list |
    some i
    id := input[i].id
    list := [obj |
        some j
        input[j].id == id
        obj := input[j]
    ]
}
1
Devoops 20 ene. 2021 a las 10:04