2017-10-05 68 views
1

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

席力图召IS_IN_POLYGON()自定义函数中,得到了在执行时出现此错误:

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

有任何前缀/需要()/任何东西,应该被用来访问标准AQL的功能呢?

ArangoDB版本:3.2.4

引擎:RocksDB

回答

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)。

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

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

0

这里回答我的问题。

人们可以使用AQL功能的用户定义的函数内这种方式: (例如用于虚拟SOME_AQL_FUNCTION()返回一个布尔值)

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

研究发现,阅读ArangoDB的GitHub的一些测试代码。

+0

它们只是在AQL查询中调用[AQL函数](https://docs.arangodb.com/3.2/AQL/Functions/)。它是否在用户定义函数中没有任何区别。内置函数的名称空间是'_aql',但不需要指定,因为它是默认的名称空间。记录在这里:https://docs.arangodb.com/3.2/AQL/Extending/Conventions.html – CoDEmanX

相关问题