Поле фильтра по количеству элементов, содержащее ВСЕ значения - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть модель учетной записи, которая имеет интересы, которая представляет собой массив строк (db.type = string и cardinality = many).Например:

{:id 42
 :name "Test"
 :interests ["cars" "games" "etc"]
 :age 50}

Затем из запроса поступает другой список интересов.Как я могу запросить учетные записи, которые имеют ВСЕ указанные интересы?

Например, для ["cars" "games"] я получу учетную запись № 42, поскольку она включает в себя переданный список.Но для ["cars" "games" "books"] я не буду, потому что "books" является дополнительным.

UPD

Что у меня есть:

;; model
{:db/ident       :account/interests
 :db/valueType   :db.type/string
 :db/cardinality :db.cardinality/many
 :db/index       true}

;; a query
[:find ?id
 :id $ [?interest ...]
 :where
 [?a :account/interests ?interest]
 [?a :account/id        ?id]]

Как мне построить Datomic-запрос?

Ответы [ 2 ]

0 голосов
/ 22 декабря 2018
(time (d/q

   '[:find ?id
     :in $
     :where

     [?a :account/interests "foo"]
     [?a :account/interests "bar"]
     [?a :account/id ?id]]

   (d/db conn)))

"Истекшее время: 3,771973 мсек"

(time (d/q

   '[:find ?id
     :in $ ?iii
     :where

     [(datomic.api/entity $ ?a) ?e]
     [(:account/interests ?e) ?interests]
     [(clojure.set/superset? ?interests ?iii)]
     [?a :account/id ?id]]

   (d/db conn)
   #{"50 Cent" "Целоваться"}))

"Истекшее время: 169,767354 мсек"

Первый вариант лучше.

0 голосов
/ 21 декабря 2018

Попробуйте использовать сущности в запросе

(d/q '[:find ?e
       :in $ ?interests
       :where
       [?e :interests _]
       [(datomic.api/entity $ ?e) ?ent]
       [(:interests ?ent) ?ent_interests]
       [(subset? ?interests ?ent_interests)]]
     (d/db conn)
     #{"cars" "games"})
...