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.
89 lines
2.3 KiB
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)))
|