2017-10-05 103 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

相關問題