AQL: привязать параметр к оператору - PullRequest
1 голос
/ 27 мая 2020

Есть ли способ иметь параметр привязки для оператора ("<", "<=" et c ...)? Я работаю над сервисом Foxx. </p>

Пример:

const operator = '<'
const res = query`
  FOR v IN myCollection
  FILTER v.value ${operator} ${maxValue}
`

Я могу сделать это с помощью db._query:

const operator = '<'
const res = db._query('
  FOR v IN myCollection
  FILTER v.value ${operator} @maxValue'
{ maxValue: 100 })

1 Ответ

1 голос
/ 27 мая 2020

Обычные параметры привязки (с одним @) могут использоваться только для значений null, true, false, чисел, строк, массивов и объектов. Параметры привязки коллекции (с двумя @@) могут использоваться там, где указаны имена коллекций.

Передача оператора через параметры привязки невозможна в AQL, так как это может изменить смысл запроса или отобразить он полностью недопустим.

Рассмотрим следующий пример:

FOR v IN myCollection
FILTER v.value @operator @maxValue

Этот запрос даже не выполняет синтаксический анализ, независимо от того, какие значения передаются в параметрах привязки. И это хорошо, потому что в противном случае можно передать что-то вроде @operator: "abc", @maxValue: ">=", что будет означать, что запрос может быть хорошо проанализирован без параметров привязки, но приведет к ошибке синтаксического анализа с введенными параметрами привязки.

Таким образом, самым простым решением здесь является введение оператора сравнения в запрос с помощью подстановки строки шаблона, хотя, конечно, вам необходимо убедиться, что запрошенный оператор сравнения находится в белом списке разрешенных операторов. Но вам нужно будет сделать это даже с параметрами привязки, иначе люди могли бы просто отправить @operator: "!=" или @operator: "NOT IN" или другие операторы, которых вы либо не ожидаете, либо которые могут сделать ваш запрос более дорогим.

...