Правила DataScript / datahike ничего не возвращают - PullRequest
0 голосов
/ 29 мая 2018

Я пытаюсь найти строку в более чем одном поле базы данных в datahike .Пока безуспешно.Вот мой самый лучший подход: пока

(ns my.ns
  (:require [clojure.string :as st]
            [datahike.api :as dh]))

(def card-db [[1 :card/name "CardA"]
              [1 :card/text "Text of CardA mentioning CardB"]
              [2 :card/name "CardB"]
              [2 :card/text "A mystery"]])

(def rules '[
             [
              (matches-name ?ent ?fn ?str)
              [?ent :card/name ?name]
              (?fn ?name ?str)]
             [(matches-text ?ent ?fn ?str)
              [?ent :card/text ?text]
              (?fn ?text ?str)
              ]
             ])

(defn my-search [db search-strs]
  (dh/q '[:find ?e
          :in $ % ?fn [?str ...]
          :where
          [?e :card/name ?name]

          #_[(?fn ?name ?str)] ;; this finds CardB

          (or
           (matches-name ?e ?fn ?str)
           (matches-text ?e ?fn ?str)
           ) ;; this finds nothing
          ]
        db rules st/includes? search-strs))
#_(count (my-search card-db ["CardB"]))

Ожидаемый результат: 2

Фактический результат: 0

Решение не требует использования правил, насколько яЯ обеспокоен.Он должен просто вернуть совпадение, если строка найдена хотя бы в одном из нескольких полей.

Я использую [io.replikativ/datahike "0.1.1"]

1 Ответ

0 голосов
/ 19 октября 2018

DataScript пока не поддерживает or.Я думаю, что Datahike не делает ни того, ни другого.Но вы можете подражать этому, используя правила.Попробуйте:

(def rules '[[(matches ?ent ?fn ?str)
              [?ent :card/name ?name]
              (?fn ?name ?str)]
             [(matches ?ent ?fn ?str)
              [?ent :card/text ?text]
              (?fn ?text ?str)]])

(defn my-search [db search-strs]
  (dh/q '[:find ?e
          :in $ % ?fn [?str ...]
          :where [?e :card/name ?name]
                 (matches ?e ?fn ?str)]
        db rules st/includes? search-strs))
...