Datomic:不区分大小写的查询

Jef*_*vin 3 clojure datomic

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

例如:

[:find (pull ?u [:user/email])
     :where [?u :user/email "user1@example.net"]]
Run Code Online (Sandbox Code Playgroud)

返回:

{:user/email "user1@example.net"}
Run Code Online (Sandbox Code Playgroud)

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

[:find (pull ?u [:user/email])
     :where [?u :user/email "USER1@example.net"]]
Run Code Online (Sandbox Code Playgroud)

返回:

Nothing
Run Code Online (Sandbox Code Playgroud)

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

Jef*_*vin 5

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

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

现在返回:

   {:user/email "user1@example.net"}
Run Code Online (Sandbox Code Playgroud)


wor*_*wer 5

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

   (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)
           )
      )
Run Code Online (Sandbox Code Playgroud)

然后

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

将返回

"user1@example.net"
Run Code Online (Sandbox Code Playgroud)