-
Notifications
You must be signed in to change notification settings - Fork 1
/
triplestore.clj
72 lines (56 loc) · 2.57 KB
/
triplestore.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
(ns grafter.db.triplestore
(:require [clojure.java.io :as io]
[taoensso.timbre :as log]
[grafter-2.rdf4j.io :as rio]
[grafter-2.rdf.protocols :as pr]
[grafter-2.rdf4j.repository :as repo]
[integrant.core :as ig]
[clojure.spec.alpha :as s]
[grafter.db.triplestore.impl :as impl]))
(derive :grafter.db/triplestore :duct/database)
(defn init
([query-cache repo]
(init query-cache repo :eager))
([query-cache repo evaluation-method]
(log/report ::starting-triplestore {:query-endpoint (str repo)})
(impl/build-triple-store query-cache repo evaluation-method)))
(defn- add-data! [update-endpoint load-files]
(when (and update-endpoint (seq load-files))
(with-open [conn (repo/->connection (repo/sparql-repo "" update-endpoint))]
(doseq [f load-files]
(log/debug ::loading-file f)
(pr/add conn (rio/statements (io/resource f))))
(repo/shutdown conn))))
(defmethod ig/init-key :grafter.db/triplestore
[_ {:keys [query-cache query-endpoint load-files update-endpoint] :as _opts}]
(let [repo (if update-endpoint
(repo/sparql-repo query-endpoint update-endpoint)
(repo/sparql-repo query-endpoint))
triplestore (init query-cache repo)]
(add-data! update-endpoint load-files)
triplestore))
;; Update only endpoint
(defmethod ig/init-key :grafter.db/update-endpoint [_ {:keys [update-endpoint]}]
(repo/sparql-repo nil update-endpoint))
(defmethod ig/halt-key! :grafter.db/update-endpoint [_ repo]
(repo/shutdown repo))
(s/def ::valid-fixture-config (fn [config]
(if (:load-files config)
(:update-endpoint config)
true)))
(s/def ::load-files (s/+ string?))
(s/def ::update-endpoint string?)
(s/def ::query-endpoint string?)
(s/def ::query-repo (s/keys :req-un [::query-endpoint]))
(s/def ::update-repo (s/keys :req-un [::query-endpoint ::update-endpoint]))
(s/def ::fixture-repo (s/keys :req-un [::load-files ::update-endpoint]))
(s/def :grafter.db/triplestore (s/or :fixture-repo ::fixture-repo
:update-repo ::update-repo
:query-repo ::query-repo
:connectable #(satisfies? repo/ToConnection %)))
(defmethod ig/pre-init-spec :grafter.db/triplestore [_]
:grafter.db/triplestore)
(defmethod ig/halt-key! :grafter.db/triplestore [_ {:keys [repo _logger]}]
(log/report ::stopping-triplestore)
(when repo
(repo/shutdown repo)))