It is quite strange to be calling the data layer directly like that, but ignoring that for now:
try this:
def upsert(resource, changeset, keys, identity \\ nil) do
changeset = %{changeset | tenant: changeset.to_tenant}
data_layer = Ash.DataLayer.data_layer(resource)
Code.ensure_loaded!(data_layer)
if function_exported?(data_layer, :upsert, 4) do
data_layer.upsert(resource, changeset, keys, identity)
else
IO.inspect("UPSERT/4 FOR #{data_layer} NOT IMPLEMENTED")
data_layer.upsert(resource, changeset, keys)
end
end