Как создать неограниченный рекурсивный запрос на извлечение, используя api извлечения в xtdb?

#database #clojure

Вопрос:

Учитывая следующую настройку и следуя руководству по EQL: https://edn-query-language.org/eql/1.0.0/specification.html#_recursive_queries

Я получаю ошибку, если пытаюсь использовать ... неограниченную опцию при использовании API pull query за пределами API.

 (ns sample.xtdb-testing
  (:require [xtdb.api :as xt]))

(def sample [{:xt/id 1
              :item/name "Salt"}
             {:xt/id 2
              :item/name "Pepper"}

             {:xt/id 3
              :item/name "Spicy Sauce"
              :composite/contains [100 101 1000]}

             {:xt/id 4
              :item/name "Master Sauce"
              :composite/contains [102]}

             {:xt/id 5
              :item/name "Chorizo Wrap"
              :composite/contains [103]}

             {:xt/id 6
              :item/name "Chorizo Family Pack"
              :composite/contains [104]}

             {:xt/id 100
              :recipe-line-item/quantity 20
              :composite/contains 1}

             {:xt/id 101
              :recipe-line-item/quantity 21
              :composite/contains 2}

             {:xt/id 102
              :recipe-line-item/quantity 22
              :composite/contains 3}

             {:xt/id 103
              :recipe-line-item/quantity 23
              :composite/contains 4}

             {:xt/id 104
              :recipe-line-item/quantity 24
              :composite/contains 5}])

(def node (xt/start-node {}))

(xt/submit-tx node (for [doc sample]
                     [:xtdb.api/put doc]))

(xt/sync node)

;; This doesn't work
(xt/pull (xt/db node) [* {:composite/contains ...]}] 6)

;; This works
(xt/q (xt/db node)
      '{:find [(pull ?eid [* {:composite/contains ...}])]
        :where [[?eid :item/name "Chorizo Family Pack"]]})
 

Ответ №1:

Это просто нужно было процитировать, да. Действует очаровательно.

 (xt/pull (xt/db node) '[* {:composite/contains ...]}] 6)
 

Комментарии:

1. Примечание: вы размещаете вопрос о xtdb и ссылку на EQL. EQL-это спецификация, не каждая реализация EQL поддерживает все спецификации. Например, у pathom есть некоторые ограничения в отношении рекурсивных запросов.