Hands-On with OPA — 2 : Merging Objects

Pushpalanka Jayawardhana
1 min readMar 23, 2023

Try it out here at https://play.openpolicyagent.org/p/6ZsiOVpApv

# Merge two objects without overriding values
# ----------------------------------------
#
# This example defines how to merge two objects


package app.merge

import future.keywords.in

example {
x = {"a":[true], "b":["foo"], "c":[4]}
y = {"b":["bar"], "d":["du"], "c":[100]}

merge_arrays(x,y) == {"a": [true],"b": ["bar","foo"],"c": [100,4],"d": ["du"]}
}

has_key(x, k) { _ = x[k] }

merge_values(k, a, b) = a[k]{
not has_key(b, k)
}

merge_values(k, a, b) = b[k]{
not has_key(a, k)
}

merge_values(k, a, b) = c{
has_key(a, k)
has_key(b, k)
c := array.concat(a[k],b[k])
}

merge_arrays(a, b) = c {
ks := {k | some k; _ = a[k]} | {k | some k; _ = b[k]}
c := {k: v | some k; ks[k]; v := merge_values(k, b, a)}
}

This is a modified version of code at https://www.openpolicyagent.org/docs/v0.17.3/policy-cheatsheet/#patterns, getting rid of overriding values. Look forward for availability of more such patterns.

--

--