2016-02-28 46 views
5

Utworzyłem łączną funkcję, która działa w aerospike który pracuje w AQL:Aerospike NodeJS UDF Agregacja Błąd

AGGREGATE filter2.check_teamId('123', 0, 1456499994597) ON analytics.tracking 
WHERE teamId = '123' 

ta zwraca wyniki. ja potem próbuje użyć tego samego UDF w NodeJS:

var statement = { 
    aggregationUDF: {module: 'filter2', funcname: 'check_teamId', 
    arg:['123', 0, 1456499994597]} 
}; 

var query = client.query('analytics', 'tracking', statement); 
var stream = query.execute(); 

Rezultatem jest pozornie uninformative błąd:

{ code: 100, 
    message: 'UDF: Execution Error 1', 
    func: 'as_query_aggregate', 
    file: 'src/main/aerospike/aerospike_query.c', 
    line: 903 } 

Stan logi serwera:

Feb 28 2016 22:33:58 GMT: INFO (scan): (scan.c::933) starting aggregation scan job 1201452721893048027 {analytics:tracking} priority 2

Feb 28 2016 22:33:58 GMT: INFO (scan): (scan.c::1026) finished aggregation scan job 1201452721893048027 (0)

Czy ktoś masz jakieś wskazówki dotyczące uzyskania UDF do pracy z NodeJS? Albo jakieś pomysły, jak zdiagnozować błąd?

Ustawiłem lokalizację użytkownika UDF w konfiguracji, która nie ma wpływu na wynik.

UPDATE: Oto kod lua:

local function map_profile(record) 
    return map {interaction=record.interaction, 
       teamId=record.teamId, datetime=record.datetime, 
       timestamp=record.timestamp, version=record.version, 
       interactions=record.interactions} 
end 
function check_teamId(stream, teamId, startDate, endDate) 
    local function filter_teamId(record) 
    return record.teamId == teamId and 
      record.timestamp >= startDate and record.timestamp <= endDate 
    end 
    return stream : filter(filter_teamId) : map(map_profile) 
end 
+0

Jaki jest kod dla UDF 'check_teamId'? –

+0

Ponadto, masz klauzulę "WHERE" w instrukcji AQL, ale nie ma sekcji "filters" w twoim obiekcie instrukcji w wersji Node.JS. –

+0

Dzięki @AdamB. Zaktualizowany kodem lua powyżej. Klauzula WHERE nie jest faktycznie wymagana, a zapytanie działa bez niej. – TStu

Odpowiedz

3

Najbardziej prawdopodobną przyczyną, że są coraz błąd wykonania UDF (kod: 100), że system i/lub ścieżka użytkownika dla podsystemu LUA nie są poprawnie skonfigurowane. Jeśli włączyć rejestrowanie debugowania dla klienta można zobaczyć jedną lub obie z tych komunikatów o błędach:

Apr 04 2016 08:15:19 UTC: DEBUG(45951) [conversions.cc:248] [config_from_jsobject] - Could not find a valid LUA system path ./aerospike-client-c/package/usr/local/aerospike/client/sys/udf/lua/ 
Apr 04 2016 08:15:19 UTC: DEBUG(45951) [conversions.cc:273] [config_from_jsobject] - Could not find valid LUA user path ./aerospike-client-c/package/usr/local/aerospike/client/usr/udf/lua 

Jeśli klient nie jest w stanie określić poprawną ścieżkę automatycznie, a następnie trzeba przejść ścieżkę użytkownika/systemu w konfiguracji . (Patrz poniżej.)

Ale jest inny problem z wywołaniem UDF w kliencie Node.js. Argumenty dla UDF powinny zostać przekazane w obiekcie args obiektu aggregationUDF, a nie w arg.

Powyżej znajduje się pełna przykładów, które działa dla mnie:

const Aerospike = require('aerospike') 

const config = { 
    hosts: '192.168.33.10:3000', 
    log: { level: 5 }, 
    modlua: { 
    userPath: './', 
    systemPath: './node_modules/aerospike/aerospike-client-c/lua/' 
    } 
} 

Aerospike.connect(config, (error, client) => { 
    if (error) throw error 

    var statement = { 
    aggregationUDF: { 
     module: 'agg', 
     funcname: 'check_teamId', 
     args: ['123', 0, 1456499994597] 
    } 
    } 
    var query = client.query('test', 'tracking', statement) 
    var stream = query.execute() 

    var count = 0 
    stream.on('error', (error) => console.error('error:', error)) 
    stream.on('data', (result) => { 
    count++ 
    console.log('result:', result) 
    }) 
    stream.on('end',() => { 
    console.log('found %d records', count) 
    client.close() 
    }) 
}) 

Zauważ, że ten przykład używa wersji [email protected] klienta, który był po prostu released. Ale konfiguracja i wykonanie zapytania UDF jest identyczne z klientem v1.x.

Przesłałem również ten przykład do Github here. Ten Gist zawiera również skrypt setup.js, aby utworzyć przykładowe rekordy na podstawie oczekiwanej przez użytkownika funkcji map_profile.

Zapraszam do śledzenia tego w naszym user forum. Chciałbym usłyszeć, jeśli masz to do swojej aplikacji. (Lub wszelkie inne opinie na temat klienta Aerodike Node.js!)

+0

Dzięki, @ jan-hecking spróbuje – TStu