Skip to content
Snippets Groups Projects
cache.clj 1.82 KiB
Newer Older
(ns document-storage.postgres.cache
  (:require [document-storage.postgres.encoding :as encoding]
            [editscript.core :as escript]
            [clj-helper.vector :as vhelper]
            [document-storage.query :as dsquery]))

(defn get-cached-document [storage repository document-id version]
  (.run-query storage :get-cached-document
              {:repository repository
               :document-id document-id
               :version version}))

(defn cache-document [storage repository id doc]
  (swap! (.get-cache storage) update-in [repository :documents] assoc id doc)
  doc)

(defn cache-query [storage repository query result]
  (swap! (.get-cache storage) update-in [repository :queries] assoc query (into #{} (keys result)))
  result)


(defn get-cached-query [storage repository query]
  (get-in (.get-cache storage) [repository :queries query]))

(defn uncache-document [storage repository id]
  (swap! (.get-cache storage) update-in [repository :queries] dsquery/update-queries-remove-document id)
  (swap! (.get-cache storage) update-in [repository :documents] dissoc id))

(defn update-query-cache-document [storage repository document-id document]
  (swap! (.get-cache storage) update-in [repository :queries] dsquery/update-queries document-id document))


(defn load-cached-document [storage repository document-id version load-doc-fn]
  (if-let [document (get-cached-document storage repository document-id version)]
    (encoding/decode-document (:data document))
    (let [restored-document (load-doc-fn)]
      (.run-query storage :create-document-cache!
                  {:repository repository
                   :document-id document-id
                   :version version
                   :data (encoding/encode-document restored-document)})
      (load-cached-document storage repository document-id version load-doc-fn))))