如何在用户定义的函数中使用AQL函数?

时间:2017-10-05 10:10:07

标签: arangodb

是否可以在用户定义的函数中使用标准AQL函数?

我试图在自定义函数中调用IS_IN_POLYGON()并在执行时遇到此错误:

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

是否有任何前缀/ require()/ what,应该用于访问标准AQL函数?

ArangoDB版本:3.2.4

引擎:RocksDB

2 个答案:

答案 0 :(得分:1)

是的,可以在UDF函数中使用AQL函数,包括其他UDF。

以下是一个完整的示例,使用AQL函数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);

要使用UDF函数,只需在AQL查询中使用它的方式包含其命名空间(例如ARRAY::PRODUCT)。

警告:UDF必须是无副作用的。它们不应该以任何方式改变数据库状态。

如果UDF的返回值以任何方式依赖于数据库状态(如上例所示),ArangoDB文档并不完全清楚可能出现的复杂情况。

答案 1 :(得分:0)

在这里回答我自己的问题。

可以通过这种方式在用户定义的函数中使用AQL函数: (虚构SOME_AQL_FUNCTION()返回布尔值的示例)

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

发现在ArangoDB的GitHub上读取一些测试代码。