我正在尝试根据关键字模式匹配来过滤数据库。
为此,我写了 - >
(defn find-users
[db keyword]
(if (>= (count keyword) 3)
(let [login-pattern (login-pattern keyword)]
(->> (d/datoms db :aevt :user/name)
(filter #(re-matches login-pattern (:v %)))
(map #(d/entity db (:e %)))))
[]))
但是,我收到了StackOverflow错误。
我认为这是因为(map #(d/entity db (:e %)))
当我明确地(map :e)
时,该功能起作用。
我有点困惑为什么Stackoverflow会发生,我用map:v执行的查询只返回几个实体。
这里发生了什么?
答案 0 :(得分:0)
我有点好奇为什么不只是使用查询?您可以将谓词表达式子句用于与上面构建过滤器/映射方案相同的目的。请参阅:http://docs.datomic.com/query.html
中的“表达式条款”(defn find-users
[db keyword]
(if (>= (count keyword) 3)
(map #(d/entity db (first %))
(d/q '[:find ?e
:in $ ?login-pattern
:where
[?e :user/name ?name]
[(re-matches ?login-pattern ?name)]]
db
(login-pattern keyword)))
[]))
查询引擎可能比原始序列操作更好地处理中间结果的大小。