(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))))