Datomic:不区分大小写的查询

时间:2015-06-16 19:27:12

标签: clojure datomic

我是Datomic的新手,我试图了解如何进行不区分大小写的查询。

例如:

[:find (pull ?u [:user/email])
     :where [?u :user/email "user1@example.net"]]

返回:

{:user/email "user1@example.net"}

我希望此查询为指定为" USER1@example.net"的电子邮件返回相同的值;但Datomic正在对电子邮件进行区分大小写的比较,如此处所示。

[:find (pull ?u [:user/email])
     :where [?u :user/email "USER1@example.net"]]

返回:

Nothing

有关形成查询的最佳方式的任何建议,以便进行区分大小写的比较吗?

2 个答案:

答案 0 :(得分:4)

要执行不区分大小写的查询,我使用Clojure re-find函数形成了查询,以对传递的电子邮件执行不区分大小写的正则表达式匹配,如下所示:

  [:find (pull ?u [:user/email])
  :where
  [?u :user/email ?email]
  [(re-find #"(?i)USER1@example.net" ?email)]
  ] db)

现在返回:

   {:user/email "user1@example.net"}

答案 1 :(得分:3)

只需将查询字符串和数据库项转换为小写。

   (defn case-insensitive-get-email
      [email]
      (d/q '[:find ?lowercaseEmail .
             :in $ ?email
             :where
             [?e :user/email ?originalEmail]
             [(.toLowerCase ^String ?originalEmail) ?lowercaseEmail]
             [(= ?lowercaseEmail ?email)]]
      db (.toLowerCase email)
           )
      )

然后

(case-insensitive-get-email "USER1@example.net")

意愿 返回

"user1@example.net"