You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
wanijo/src/wanijo/infra/neo4j.clj

89 lines
2.3 KiB

(ns wanijo.infra.neo4j
(:require [neo4j-clj.core :as db]
[neo4j-clj.in-memory :as db-inm]
[clj-time.format :as time-format]
[clj-time.local :as time-local]
[clojure.spec.alpha :as spec]
[clojure.string :as cljs])
(:import (java.util UUID)
(java.net URI)))
(spec/def ::date-str
#(re-matches #"\d{4}\d{2}\d{2}T\d{2}\d{2}\d{2}\.\d{3}Z" %))
(spec/def ::uuid
#(re-matches
#"[0-9a-f]+-[0-9a-f]+-[0-9a-f]+-[0-9a-f]+-[0-9a-f]+" %))
(def standard-port "7687")
(def standard-host "localhost")
(def standard-user "neo4j")
(def standard-pass "b")
(defn create-conn!
([]
(let [env #(or (System/getenv %1) %2)
port (env "NEO4J_PORT" standard-port)
host (env "NEO4J_HOST" standard-host)
user (env "NEO4J_USER" standard-user)
pass (env "NEO4J_PASS" standard-pass)]
(create-conn! port host user pass)))
([port host user pass]
(db/connect
(URI. (str "bolt://" host ":" port))
user
pass)))
(def conn
(atom nil))
(defn reset-conn!
([]
(reset! conn (create-conn!)))
([port host user pass]
(reset! conn (create-conn! port host user pass))))
(defn in-memory-conn! []
(reset! conn (db-inm/create-in-memory-connection)))
(defmacro defquery [& args] `(db/defquery ~@args))
(defn uuid []
(str (UUID/randomUUID)))
(defn butiful-query [qry]
(->> qry
str
cljs/trim-newline
cljs/split-lines
(map cljs/trim)
(filter #(pos? (count %)))
(cljs/join \newline)))
(defn exec-query! [qry params]
(let [live-conn (or @conn (reset-conn!))]
(with-open [session (db/get-session live-conn)]
;; neo4j-clj returns lazy lists, but when we leave with-open,
;; the ResultSet (?) is already closed, so the list cannot
;; be processed
;; doall to the rescue to force the list to be evaluated
;; eagerly
(doall (qry session params)))))
(spec/def ::tuple-query-list
(spec/coll-of
(spec/tuple fn? map?)))
(defn exec-queries! [& tuples]
{:pre [(spec/assert ::tuple-query-list tuples)]}
(db/with-transaction @conn tx
(doseq [tuple tuples]
(let [qry (first tuple)
params (second tuple)]
(spec/assert map? params)
(qry tx params)))))
(defn now-str []
(time-format/unparse
(time-format/formatters :basic-date-time)
(time-local/local-now)))