Hi Experts,
I have created a record UDF, using two dimensional array as input parameter.
I am able to successfully test the UDF using AQL + JSON combination.
However, when I am testing it using ‘C’ code, the UDF misbehaves. Tried with couple of approaches:
- Took 3 list of integer elements, ‘append’ it to the final list (having 3 elements) – works well
- When we try to make it generic using a list with N element (instead of fixed number of element, i.e. 3), it only stores the first appended value. Simply ignoring all subsequent list append requests.
Following code snippet describes the same.
My expected output is : [[2, 3, 4], [3, 4, 5], [4, 5, 6]]
Appreciate your expertise to pass two (and multi) dimensional array to a ‘LUA’ function using ‘C’
//======== LUA function
function mul_bin_update(rec, arr_values)
local arr_val = {}
arr_val = arr_values
local listContent,result
info("mylog %s", tostring(rec))
info("mylog %s", tostring(arr_val))
end
//======== C Code for Approach - 1
as_arraylist args1;
as_arraylist args2;
as_arraylist args3;
as_arraylist args_c;
as_arraylist args;
as_arraylist_inita(&args1,3);
as_arraylist_inita(&args2,3);
as_arraylist_inita(&args3,3);
as_arraylist_inita(&args_c,3);
as_arraylist_inita(&args,1);
as_arraylist_append_int64(&args1,2);
as_arraylist_append_int64(&args1,3);
as_arraylist_append_int64(&args1,4);
as_arraylist_append_int64(&args2,3);
as_arraylist_append_int64(&args2,4);
as_arraylist_append_int64(&args2,5);
as_arraylist_append_int64(&args3,4);
as_arraylist_append_int64(&args3,5);
as_arraylist_append_int64(&args3,6);
as_arraylist_append_list(&args_c,&args1);
as_arraylist_append_list(&args_c,&args2);
as_arraylist_append_list(&args_c,&args3);
as_arraylist_append_list(&args,&args_c);
as_val * p_return_val = NULL;
if (aerospike_key_apply(&as, &err, NULL, &key, "common_lua_functions", "mul_bin_update",(as_list*)&args, &p_return_val) != AEROSPIKE_OK)
{
LOG("aerospike_key_apply() returned %d - %s", err.code, err.message);
}
//======== C Code for Approach - 2
int size=3;
as_arraylist args1;
as_arraylist args_c;
as_arraylist args;
as_arraylist_inita(&args1,size);
as_arraylist_inita(&args_c,size);
as_arraylist_inita(&args,1);
for (i = 1 ; i <= size ; i++)
{
as_arraylist_append_int64(&args1,1+i);
as_arraylist_append_int64(&args1,2+i);
as_arraylist_append_int64(&args1,3+i);
as_arraylist_append_list(&args_c,&args1);
}
as_arraylist_append_list(&args,&args_c);
as_val * p_return_val = NULL;
if (aerospike_key_apply(&as, &err, NULL, &key, "common_lua_functions", "mul_bin_update",(as_list*)&args, &p_return_val) != AEROSPIKE_OK)
{
LOG("aerospike_key_apply() returned %d - %s", err.code, err.message);
}