过滤数据时的StackOverflow

时间:2014-07-15 00:54:11

标签: clojure datomic

我正在尝试根据关键字模式匹配来过滤数据库。

为此,我写了 - >

(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执行的查询只返回几个实体。

这里发生了什么?

1 个答案:

答案 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)))
         []))

查询引擎可能比原始序列操作更好地处理中间结果的大小。