【问题标题】:How to use AQL functions inside user defined functions?如何在用户定义的函数中使用 AQL 函数?
【发布时间】:2017-12-18 03:54:50
【问题描述】:

是否可以在用户定义的函数中使用标准 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() / 任何东西,应该用于访问标准 AQL 函数?

ArangoDB 版本:3.2.4

引擎:RocksDB

【问题讨论】:

    标签: arangodb


    【解决方案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 文档并不完全清楚会出现什么复杂情况。

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-09-23
      • 2010-11-06
      • 2011-06-15
      • 2018-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多