Skip to content
Snippets Groups Projects
Commit 35b4f529 authored by Bruno Burke's avatar Bruno Burke :hamburger:
Browse files

better caching for querys, no delete after save-document

parent 018aedc5
No related branches found
No related tags found
No related merge requests found
Pipeline #3280 passed
(defproject document-storage "0.1.0"
(defproject document-storage "0.1.1"
:description "FIXME: write description"
:url "http://example.com/FIXME"
:license {:name "Eclipse Public License"
......
......@@ -4,6 +4,7 @@
[clojure.data :refer [diff]]
[clojure.java.io :as io]
[clojure.edn :refer [read-string]]
[document-storage.query :refer [query-fits? update-queries]]
[clojure.pprint :refer [pprint]]))
(defonce repo-dir (atom ""))
......@@ -78,18 +79,22 @@
doc)
(defn cache-query [repository query result]
(swap! cache update-in [repository :queries] assoc query result)
(swap! cache update-in [repository :queries] assoc query (keys result))
result)
(defn uncache-document [repository id]
(swap! cache update-in [repository] dissoc :queries)
(swap! cache update-in [repository :documents] dissoc id))
(defn update-cache-document [repository id document]
(swap! cache update-in [repository :queries] update-queries id document)
(swap! cache assoc-in [repository :documents id] document))
(defn save-document [id document & {:keys [repository] :or {repository default-repository}}]
(let [file-path (get-file-path id repository)
document (with-out-str (pprint document))]
(when-not (and (valid-id? id repository) (= (slurp file-path) document))
(uncache-document repository id)
(update-cache-document repository id document)
(spit file-path document)
(jp/git-add (get-repo repository) id)
(commit-document-change (str "saved new version of " id) repository))))
......@@ -124,19 +129,17 @@
)]
files))
(defn query-fits? [data query]
(reduce (fn [a b]
(and (true? a) (= a b)))
(map
(fn [[key [compare-fn val]]]
(compare-fn (key data) val))
query)))
(defn find-documents [query & {:keys [repository] :or {repository default-repository}}]
(let [docs (list-documents :repository repository)
cached-repository (cached-repository? repository)]
(or (when cached-repository
(get-in @cache [repository :queries query]))
(when-let [cached-query (get-in @cache [repository :queries query])]
(into {} (map (fn [fname]
(let [doc (load-document fname :repository repository)]
[fname doc]))
cached-query))))
(let [result (into {} (keep (fn [fname]
(let [doc (load-document fname :repository repository)]
(when (query-fits? doc query)
......
(ns document-storage.query)
(defn query-fits? [data query]
(reduce (fn [a b]
(and (true? a) (= a b)))
(map
(fn [[key [compare-fn val]]]
(compare-fn (key data) val))
query)))
(defn update-queries [queries id new-document]
(into {} (mapv
(fn [[query docs]]
(if (query-fits? new-document query)
[query (assoc docs id new-document)]
[query (dissoc docs id)]))
queries)))
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment