Skip to main content

Apply a UDF


Jump to the Code block for a combined complete example.

UDFs that execute on a single record are Record UDFs. The record may or may not exist in the database, and the UDF may create, read, and/or update a record.

Setup

The following examples will use the setup below to illustrate applying a record UDF.

const Aerospike = require('aerospike');
const batchType = Aerospike.batchType;
const exp = Aerospike.exp;

// Define host configuration
let config = {hosts: '127.0.0.1:3000'};

The record structure:

Occurred: Integer  
Reported: Integer
Posted: Integer
Report: Map
{
shape: List,
summary: String,
city: String,
state: String,
duration: String
}
Location: GeoJSON

Single record commands

Single argument

This example uses the setRecent function in the module example.lua. See Manage UDFs for example.lua code and information on registering the UDF.

This compares the posted bin to a supplied value and writes true/false to a recent bin based on the result.

// Creates a key with the namespace "sandbox", set "ufodata", and user key 5000
let key = new Aerospike.Key('sandbox', 'ufodata', 5000);

;(async () => {
// Establishes a connection to the server
let client = await Aerospike.connect(config);

// Execute the UDF
await client.apply(key,
{
module: 'example',
funcname: 'setRecent',
args: [20210101]
}
);

// View the updated record
record = await client.get(key);
console.info('Record: %o', record.bins);

// Close the connection to the server
client.close();
})();

Multiple argument

This example uses the getDaysBetween function in the module example.lua. See Manage UDFs for example.lua code and information on registering the UDF.

This compares two dates, provived by passing the bin names with the date values, and returns the days between. The following example will return the days between the sighting occurence and posting to the site.

// Creates a key with the namespace "sandbox", set "ufodata", and user key 5000
let key = new Aerospike.Key('sandbox', 'ufodata', 5000);

;(async () => {
// Establishes a connection to the server
let client = await Aerospike.connect(config);

// Execute the UDF
result = await client.apply(key,
{
module: 'example',
funcname: 'getDaysBetween',
args: ['occurred', 'posted']
}
);

// Do something
console.info("%o days between occurrence and post", result);

// Close the connection to the server
client.close();
})();

Batch operation with a UDF

note

Server version 6.0 and above is required for batch UDF operations

This example will use the multi-argument example from above, and apply it to a batch of records.

// Create batch of keys
let keys = [];
for(i = 0; i < 10; i++){
keys.push(new Aerospike.Key('sandbox', 'ufodata', i + 1));
}

;(async () => {
// Establishes a connection to the server
let client = await Aerospike.connect(config);

// Execute the UDF
let batchResult = await client.batchApply(keys,
{
module: 'example',
funcname: 'getDaysBetween',
args: ['occurred', 'posted']
}
);

// Access the records
batchResult.forEach(result => {
// Do something
console.info("%o days between occurrence and post", result.record.bins.SUCCESS);
});

// Close the connection to the server
client.close();
})();

Background query with a UDF

This example will use the single argument example from above, and apply it to all records that match a Filter Expression through a background query.

// Create new write policy
let writePolicy = new Aerospike.WritePolicy({
filterExpression: exp.binExists('posted')
});

;(async () => {
// Establishes a connection to the server
let client = await Aerospike.connect(config);

// Create query
let query = client.query('sandbox', 'ufodata');

// Execute the query
let job = await query.background('example', 'setRecent', [20210101], writePolicy);

// Return the query status
let jobInfo = await job.info();

switch (jobInfo.status){
case 0: console.info('Query not found');
break;
case 1: console.info('Query in progress,' + jobInfo.progressPct + '% complete');
break;
case 2: console.info('Query complete,' + jobInfo.recordsRead + ' records read');
break;
}

// Close the connection to the server
client.close();
})();

Code block

Expand this section for a single code block to apply a record UDF
const Aerospike = require('aerospike');
const batchType = Aerospike.batchType;
const exp = Aerospike.exp;

// Define host configuration
let config = {hosts: '127.0.0.1:3000'};

// Creates a key with the namespace "sandbox", set "ufodata", and user key 5000
let key = new Aerospike.Key('sandbox', 'ufodata', 5000);

;(async () => {
// Establishes a connection to the server
let client = await Aerospike.connect(config);

// Execute the UDF
result = await client.apply(key,
{
module: 'example',
funcname: 'getDaysBetween',
args: ['occurred', 'posted']
}
);

// Do something
console.info("%o days between occurrence and post", result);

// Close the connection to the server
client.close();
})();