2017-10-05 3 views
1

Ist es möglich, Standard-AQL-Funktionen innerhalb einer benutzerdefinierten Funktion zu verwenden?Wie verwende ich AQL-Funktionen in benutzerdefinierten Funktionen?

Ich versuchte IS_IN_POLYGON() innerhalb einer benutzerdefinierten Funktion aufrufen und bekam diesen Fehler bei der Ausführung:

Query: AQL: in function 'GEO::IS_IN_MULTIPOLYGON()': user function runtime error: ReferenceError: IS_IN_POLYGON is not defined at (…) 

Gibt es einen Präfix/require()/alles, die verwendet werden soll Standard AQL-Funktionen zugreifen?

ArangoDB Version: 3.2.4

Motor: RocksDB

Antwort

1

Ja, man kann AQL-Funktionen einschließlich anderer UDFs in UDF-Funktionen verwenden. Hier

ist ein komplettes Beispiel mit der AQL Funktion LENGTH():

aqlfunctions.register('TEST::test', function(collection) { 
    'use strict'; 
    const db = require('@arangodb').db; 
    const AQL_FUNCTION = db._query; 
    return (typeof collection == "string") 
     ? AQL_QUERY('RETURN LENGTH(' + collection + ')').toArray()[0] 
     : return typeof collection; 
}, false); 

Um eine UDF-Funktion zu verwenden, einfach schließt seinen Namensraum (z ARRAY::PRODUCT) in die Weise, die Sie in einer AQL-Abfrage verwenden würden.

Vorbehalt: UDFs müssen frei von Nebeneffekten sein. Sie sollen den Datenbankzustand in keiner Weise ändern.

In der ArangoDB-Dokumentation ist nicht ganz klar, welche Komplikationen auftreten können, wenn der Rückgabewert einer UDF in irgendeiner Weise vom Datenbankzustand abhängt (wie im obigen Beispiel).

0

hier meine eigene Frage zu beantworten. (Beispiel für fiktive SOME_AQL_FUNCTION() Zurückgeben eines boolean)

let result = AQL_QUERY("RETURN SOME_AQL_FUNCTION(…)").json[0]; 

gefunden, dass einige Testcode auf ArangoDB der GitHub zu lesen:

Man kann innerhalb einer benutzerdefinierten Funktion auf diese Weise AQL-Funktionen verwenden.

+0

Sie sind einfach [AQL-Funktion] (https://docs.arangodb.com/3.2/AQL/Functions/) Aufrufe in AQL-Abfragen. Es macht keinen Unterschied, ob es sich um eine benutzerdefinierte Funktion handelt oder nicht. Der Namespace der integrierten Funktionen ist '_aql', muss jedoch nicht angegeben werden, da es sich um den Standardnamespace handelt. Dokumentiert hier: https://docs.arangodb.com/3.2/AQL/Extending/Conventions.html – CoDEmanX

Verwandte Themen