Thx for the hints. I also think there is a need for such API, and I saw at least one another thread someone asked about this feature.
With your hints and some reading on the [UDF developer guide] (http://www.aerospike.com/docs/udf/udf_guide.html), I am able to develop a Lua UDF that meet my need. As an example for other people who may be interested, details are as follows:
- map_ext.lua
function putAll(rec, bin, val)
local m1 = rec[bin]
if m1==nil then m1 = map() end
local m2 = val
local m3 = map.merge( m1, m2, function(v1, v2)
return v2
end )
rec[bin] = m3
info("putAll() - m1: %s, m2: %s, m3: %s", tostring(m1), tostring(m2), tostring(m3))
if aerospike:exists(rec) then aerospike:update(rec) else aerospike:create(rec) end
end
- Register with AQL
register module 'map_ext.lua'
- Call in Java as
client.execute(
new WritePolicy(),
new Key("MyNameSpace", "MySet", "MyRecordKey"),
"map_ext", "putAll",
Value.get("MyBinName"),
Value.getAsMap(new HashMap() {{
put("A", 1);
put("B", 2);
}}));
- some hints:
- read the developer guide, esp the best practice section. it mentioned about disable lua cache, and the registered lua script will show up at “/opt/aerospike/usr/udf/lua” by default. Using splitted windows to edit and execute the code.
- for Java, there is a com.aerospike.examples.UserDefinedFunction example that show how to call UDF