Сложный вопрос фильтра FQL - Пересечение больше и равно - PullRequest
0 голосов
/ 17 марта 2020
  1. Каков наилучший и наиболее эффективный способ сделать это в FaunaDB?
SELECT * FROM emp WHERE sal >= 2000 AND deptno = 10

2.Можно ли # 1 выполнить функцию intersection ()?

Если вы хотите получить запрос ниже, как он будет работать с FQL?
SELECT * FROM emp WHERE (sal >= 2000 OR sal < 500) AND deptno = 10
А как насчет этого запроса в FQL?
SELECT * FROM emp WHERE (sal >= 2000 OR sal < 500) AND deptno = 10 AND age > 21

1 Ответ

1 голос
/ 18 марта 2020
  1. Каков наилучший и наиболее эффективный способ сделать это в FaunaDB?

Этот запрос может быть выполнен с использованием функции Range при условии, что вы иметь следующий индекс:

> CreateIndex({
  name: "sal_by_deptno",
  source: Collection("emp"),
  terms: [ { field: ['data', 'deptno'] } ],
  values: [ { field: ['data', 'sal'] }, { field: 'ref' } ]
})

Вы можете сделать запрос следующим образом:

> Paginate(Range(Match(Index("sal_by_deptno"), 10), [2000], []))
{
  data: [
    [ 2000, Ref(Collection("emp"), "260259607265411603") ],
    [ 3000, Ref(Collection("emp"), "260259610695303699") ]
  ]
}
Можно ли сделать # 1 с помощью функции intersection ()?

Пересечение (и другие функции набора) работает только в том случае, если все операнды имеют одинаковый формат, поэтому я не думаю, что это будет полезно в этом контексте.

Если вы хотите получить запрос ниже, как бы он выполнялся с FQL?
Paginate(
  Union(
    Range(Match(Index("sal_by_deptno"), 10), [2000], []),
    Range(Match(Index("sal_by_deptno"), 10), [], [499.99])
  )
)

Или эквивалентен объединению, так что это функция Вы должны использовать в этом контексте. Имейте в виду, что функция Range является включающей, поэтому для симуляции <оператора мне пришлось использовать значение меньше 500 </p>

А как насчет этого запроса в FQL?

Для этого вам понадобится второй индекс, а затем используйте Join function

CreateIndex({
  name: "age_by_ref",
  source: Collection("emp"),
  terms: [{field: 'ref'}],
  values: [{field: ['data', 'age']}, {field: 'ref'}]
})

Затем задайте вопрос:

Paginate(
  Join(
    Union(
      Range(Match(Index("sal_by_deptno"), 10), [2000], []),
      Range(Match(Index("sal_by_deptno"), 10), [], [499.99])
    ),
    Lambda((sal, ref) => Range(Match(Index("age_by_ref"), ref), [22], []))
  )
)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...