From ccdbb782d55c76ee90c6b22171a14c15bc12910e Mon Sep 17 00:00:00 2001 From: Benjamin Lamothe Date: Tue, 20 Aug 2024 09:28:30 -0400 Subject: [PATCH 01/10] consolidate nameservice core and protocol namespaces --- src/clj/fluree/db/api.cljc | 2 +- src/clj/fluree/db/api/transact.cljc | 2 +- src/clj/fluree/db/json_ld/api.cljc | 2 +- src/clj/fluree/db/json_ld/migrate/sid.cljc | 2 +- src/clj/fluree/db/ledger/json_ld.cljc | 5 +-- .../core.cljc => nameservice.cljc} | 35 ++++++++++++------ src/clj/fluree/db/nameservice/filesystem.cljc | 6 +-- src/clj/fluree/db/nameservice/ipns.cljc | 6 +-- src/clj/fluree/db/nameservice/memory.cljc | 6 +-- src/clj/fluree/db/nameservice/proto.cljc | 17 --------- src/clj/fluree/db/nameservice/remote.cljc | 8 ++-- src/clj/fluree/db/nameservice/s3.clj | 6 +-- src/clj/fluree/db/nameservice/stored.cljc | 37 +++++++++++++++++++ src/clj/fluree/db/query/api.cljc | 4 +- 14 files changed, 85 insertions(+), 53 deletions(-) rename src/clj/fluree/db/{nameservice/core.cljc => nameservice.cljc} (75%) delete mode 100644 src/clj/fluree/db/nameservice/proto.cljc create mode 100644 src/clj/fluree/db/nameservice/stored.cljc diff --git a/src/clj/fluree/db/api.cljc b/src/clj/fluree/db/api.cljc index aa7399118..45ac76467 100644 --- a/src/clj/fluree/db/api.cljc +++ b/src/clj/fluree/db/api.cljc @@ -17,7 +17,7 @@ [fluree.db.ledger :as ledger] [fluree.db.util.log :as log] [fluree.db.query.range :as query-range] - [fluree.db.nameservice.core :as nameservice] + [fluree.db.nameservice :as nameservice] [fluree.db.connection :refer [notify-ledger]] [fluree.db.json-ld.credential :as cred] [fluree.db.reasoner :as reasoner] diff --git a/src/clj/fluree/db/api/transact.cljc b/src/clj/fluree/db/api/transact.cljc index 90d6b7fca..af83d9f8a 100644 --- a/src/clj/fluree/db/api/transact.cljc +++ b/src/clj/fluree/db/api/transact.cljc @@ -5,7 +5,7 @@ [fluree.db.query.fql.parse :as q-parse] [fluree.db.transact :as tx] [fluree.db.ledger.json-ld :as jld-ledger] - [fluree.db.nameservice.core :as nameservice] + [fluree.db.nameservice :as nameservice] [fluree.db.util.async :refer [> (connection/-nameservices conn) - (some #(ns-proto/-alias % db-alias))))) + (some #(nameservice/-alias % db-alias))))) ;; TODO - once we have a different delimiter than `/` for branch/t-value this can simplified (defn address->alias diff --git a/src/clj/fluree/db/nameservice/core.cljc b/src/clj/fluree/db/nameservice.cljc similarity index 75% rename from src/clj/fluree/db/nameservice/core.cljc rename to src/clj/fluree/db/nameservice.cljc index 1edcf12e3..20d85de46 100644 --- a/src/clj/fluree/db/nameservice/core.cljc +++ b/src/clj/fluree/db/nameservice.cljc @@ -1,13 +1,26 @@ -(ns fluree.db.nameservice.core - (:refer-clojure :exclude [exists?]) +(ns fluree.db.nameservice + (:refer-clojure :exclude [-lookup exists?]) (:require [clojure.string :as str] [fluree.db.connection :as connection] - [fluree.db.nameservice.proto :as ns-proto] [fluree.db.util.async :refer [UTF8 record)] + (storage/write-bytes store ns-address record-bytes))) + + nameservice/iNameService + (-lookup [_ ledger-alias] + (let [ns-address (full-address address-prefix ledger-alias)] + (storage/read store ns-address))) + ) diff --git a/src/clj/fluree/db/query/api.cljc b/src/clj/fluree/db/query/api.cljc index 5b8a6f5d6..f0d01031b 100644 --- a/src/clj/fluree/db/query/api.cljc +++ b/src/clj/fluree/db/query/api.cljc @@ -19,7 +19,7 @@ [fluree.db.util.context :as ctx-util] [fluree.db.json-ld.policy :as perm] [fluree.db.json-ld.credential :as cred] - [fluree.db.nameservice.core :as nameservice] + [fluree.db.nameservice :as nameservice] [fluree.db.reasoner :as reasoner] [fluree.db.validation :as v])) @@ -236,7 +236,7 @@ (let [{:keys [t opts] :as sanitized-query} (-> query syntax/coerce-query (update :opts sanitize-query-options did)) - + default-aliases (some-> sanitized-query :from util/sequential) named-aliases (some-> sanitized-query :from-named util/sequential)] (if (or (seq default-aliases) From df37226ac4e0eb8ae24fa27e0807516ababe5c3f Mon Sep 17 00:00:00 2001 From: Benjamin Lamothe Date: Tue, 20 Aug 2024 12:17:19 -0400 Subject: [PATCH 02/10] add read-bytes method to ByteStore; ByteStore implementation for S3 --- src/clj/fluree/db/storage.cljc | 3 ++- src/clj/fluree/db/storage/file.cljc | 6 +++++- src/clj/fluree/db/storage/memory.cljc | 11 ++++++++++- src/clj/fluree/db/storage/s3.clj | 13 ++++++++++++- 4 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/clj/fluree/db/storage.cljc b/src/clj/fluree/db/storage.cljc index 83f59c9d5..5b39b7f08 100644 --- a/src/clj/fluree/db/storage.cljc +++ b/src/clj/fluree/db/storage.cljc @@ -47,4 +47,5 @@ (defprotocol ByteStore "ByteStore is used by consensus to replicate files across servers" - (write-bytes [store address bytes] "Async writes bytes to store based on address.")) + (write-bytes [store address bytes] "Async writes bytes to store based on address.") + (read-bytes [store address] "Async read bytes from store based on address.")) diff --git a/src/clj/fluree/db/storage/file.cljc b/src/clj/fluree/db/storage/file.cljc index 71c5c6ad0..a55c8acc2 100644 --- a/src/clj/fluree/db/storage/file.cljc +++ b/src/clj/fluree/db/storage/file.cljc @@ -61,7 +61,11 @@ storage/ByteStore (write-bytes [_ address bytes] (let [path (storage-path root address)] - (fs/write-file path bytes)))) + (fs/write-file path bytes))) + + (read-bytes [_ address] + (let [path (storage-path root address)] + (fs/read-file path)))) (defn open [root-path] diff --git a/src/clj/fluree/db/storage/memory.cljc b/src/clj/fluree/db/storage/memory.cljc index 4a70ff913..16f1f7cf7 100644 --- a/src/clj/fluree/db/storage/memory.cljc +++ b/src/clj/fluree/db/storage/memory.cljc @@ -42,7 +42,16 @@ (exists? [_ address] (go (let [path (:local (storage/parse-address address))] - (contains? @contents path))))) + (contains? @contents path)))) + + storage/ByteStore + (write-bytes [_ address bytes] + (let [k (-> address storage/parse-address :local)] + (swap! contents assoc k bytes))) + + (read-bytes [_ address] + (let [k (-> address storage/parse-address :local)] + (get @contents k)))) (defn create [] diff --git a/src/clj/fluree/db/storage/s3.clj b/src/clj/fluree/db/storage/s3.clj index 99e321a3b..a16340115 100644 --- a/src/clj/fluree/db/storage/s3.clj +++ b/src/clj/fluree/db/storage/s3.clj @@ -36,11 +36,22 @@ (exists? [_ address] (s3/s3-key-exists? client bucket prefix address)) + ;; TODO: Implement `list` and `delete` methods. We should never throw + ;; exceptions for protocol implementations (list [_ prefix] (throw (ex-info "Unsupported operation S3Store method: list." {:prefix prefix}))) (delete [_ address] - (throw (ex-info "Unsupported operation S3Store method: delete." {:prefix prefix})))) + (throw (ex-info "Unsupported operation S3Store method: delete." {:prefix prefix}))) + + storage/ByteStore + (write-bytes [_ address bytes] + (let [path (-> address storage/parse-address :local)] + (s3/write-s3-data client bucket prefix path bytes))) + + (read-bytes [_ address] + (let [path (-> address storage/parse-address :local)] + (s3/read-s3-data client bucket prefix path)))) (defn open ([bucket prefix] From 2817725298b9315add6e2abea215b16e10303a25 Mon Sep 17 00:00:00 2001 From: Benjamin Lamothe Date: Tue, 20 Aug 2024 13:23:49 -0400 Subject: [PATCH 03/10] add storage-backed nameservice record --- src/clj/fluree/db/nameservice.cljc | 31 +++++++++++++++++++++ src/clj/fluree/db/nameservice/stored.cljc | 34 ++++++++--------------- 2 files changed, 42 insertions(+), 23 deletions(-) diff --git a/src/clj/fluree/db/nameservice.cljc b/src/clj/fluree/db/nameservice.cljc index 20d85de46..bc2685c1d 100644 --- a/src/clj/fluree/db/nameservice.cljc +++ b/src/clj/fluree/db/nameservice.cljc @@ -21,6 +21,37 @@ (-subscribe [nameservice ledger-alias callback] "Creates a subscription to nameservice(s) for ledger events. Will call callback with event data as received.") (-unsubscribe [nameservice ledger-alias] "Unsubscribes to nameservice(s) for ledger events")) +(defn full-address + [prefix ledger-alias] + (str prefix ledger-alias)) + +(defn ns-record + "Generates nameservice metadata map for JSON storage. For now, since we only + have a single branch possible, always sets default-branch. Eventually will + need to merge changes from different branches into existing metadata map" + [ns-address {address "address", alias "alias", branch "branch", :as commit-jsonld}] + (let [branch-iri (str ns-address "(" branch ")")] + {"@context" "https://ns.flur.ee/ledger/v1" + "@id" ns-address + "defaultBranch" branch-iri + "ledgerAlias" alias + "branches" [{"@id" branch-iri + "address" address + "commit" commit-jsonld}]})) + +(defn address-path + [address] + (let [[_ _ path] (str/split address #":")] + (subs path 2))) + +(defn address->alias + [ledger-address] + (-> ledger-address + address-path + (str/split #"/") + (->> (drop-last 2) ; branch-name, head + (str/join #"/")))) + (defn nameservices [conn] (connection/-nameservices conn)) diff --git a/src/clj/fluree/db/nameservice/stored.cljc b/src/clj/fluree/db/nameservice/stored.cljc index 935f026bb..9b5135257 100644 --- a/src/clj/fluree/db/nameservice/stored.cljc +++ b/src/clj/fluree/db/nameservice/stored.cljc @@ -1,37 +1,25 @@ (ns fluree.db.nameservice.stored - (:require [fluree.db.storage :as storage] + (:require [clojure.core.async :refer [go]] + [fluree.db.storage :as storage] [fluree.db.nameservice :as nameservice] [fluree.db.util.bytes :as bytes])) -(defn full-address - [prefix ledger-alias] - (str prefix ledger-alias)) - -(defn ns-record - "Generates nameservice metadata map for JSON storage. For now, since we only - have a single branch possible, always sets default-branch. Eventually will - need to merge changes from different branches into existing metadata map" - [ns-address {address "address", alias "alias", branch "branch", :as commit-jsonld}] - (let [branch-iri (str ns-address "(" branch ")")] - {"@context" "https://ns.flur.ee/ledger/v1" - "@id" ns-address - "defaultBranch" branch-iri - "ledgerAlias" alias - "branches" [{"@id" branch-iri - "address" address - "commit" commit-jsonld}]})) - (defrecord StorageBackedNameService [store address-prefix] nameservice/Publisher (-push [_ commit-jsonld] (let [ledger-alias (get commit-jsonld "alias") - ns-address (full-address address-prefix ledger-alias) - record (ns-record ns-address commit-jsonld) + ns-address (nameservice/full-address address-prefix ledger-alias) + record (nameservice/ns-record ns-address commit-jsonld) record-bytes (bytes/string->UTF8 record)] (storage/write-bytes store ns-address record-bytes))) nameservice/iNameService (-lookup [_ ledger-alias] - (let [ns-address (full-address address-prefix ledger-alias)] + (let [ns-address (nameservice/full-address address-prefix ledger-alias)] (storage/read store ns-address))) - ) + + (-address [_ ledger-alias] + (go (str address-prefix ledger-alias))) + + (-close [_] + true)) From 8a28340cfc031cc05acd81f1513b174ee0bc7341 Mon Sep 17 00:00:00 2001 From: Benjamin Lamothe Date: Tue, 20 Aug 2024 15:07:59 -0400 Subject: [PATCH 04/10] supply branch directly to address method --- src/clj/fluree/db/nameservice.cljc | 2 +- src/clj/fluree/db/nameservice/filesystem.cljc | 6 +++--- src/clj/fluree/db/nameservice/s3.clj | 2 +- src/clj/fluree/db/nameservice/stored.cljc | 6 ++++-- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/clj/fluree/db/nameservice.cljc b/src/clj/fluree/db/nameservice.cljc index bc2685c1d..21a150983 100644 --- a/src/clj/fluree/db/nameservice.cljc +++ b/src/clj/fluree/db/nameservice.cljc @@ -12,7 +12,7 @@ (-sync? [nameservice] "Indicates if nameservice updates should be performed synchronously, before commit is finalized. Failure will cause commit to fail") (-close [nameservice] "Closes all resources for this nameservice") (-alias [nameservice ledger-address] "Given a ledger address, returns ledger's default alias name else nil, if not avail") - (-address [nameservice ledger-alias key] "Returns full nameservice address/iri which will get published in commit. If 'private', return nil.")) + (-address [nameservice ledger-alias branch] "Returns full nameservice address/iri which will get published in commit. If 'private', return nil.")) (defprotocol Publisher (-push [nameservice commit-data] "Pushes new commit to nameservice.")) diff --git a/src/clj/fluree/db/nameservice/filesystem.cljc b/src/clj/fluree/db/nameservice/filesystem.cljc index b7b139010..5280c833e 100644 --- a/src/clj/fluree/db/nameservice/filesystem.cljc +++ b/src/clj/fluree/db/nameservice/filesystem.cljc @@ -48,7 +48,7 @@ changes from different branches into existing metadata map" fs/read-file)) (defn address - [base-address ledger-alias _opts] + [base-address ledger-alias branch] (when base-address (str base-address ledger-alias))) @@ -211,8 +211,8 @@ changes from different branches into existing metadata map" (-lookup [_ ledger-alias] (lookup ledger-alias local-path base-address nil)) (-lookup [_ ledger-alias opts] (lookup ledger-alias local-path base-address opts)) (-sync? [_] sync?) - (-address [_ ledger-alias opts] - (go (address base-address ledger-alias opts))) + (-address [_ ledger-alias branch] + (go (address base-address ledger-alias branch))) (-alias [_ ledger-address] ;; TODO: need to validate that the branch doesn't have a slash? (-> (address-path ledger-address) diff --git a/src/clj/fluree/db/nameservice/s3.clj b/src/clj/fluree/db/nameservice/s3.clj index b8e4261ae..a5cbd6f2b 100644 --- a/src/clj/fluree/db/nameservice/s3.clj +++ b/src/clj/fluree/db/nameservice/s3.clj @@ -31,7 +31,7 @@ (-lookup [_ ledger-alias] (lookup-alias s3-client s3-bucket s3-prefix ledger-alias)) (-lookup [_ ledger-alias _opts] (lookup-alias s3-client s3-bucket s3-prefix ledger-alias)) (-sync? [_] sync?) - (-address [_ ledger-alias {:keys [branch] :as _opts}] + (-address [_ ledger-alias branch] (let [branch (if branch (name branch) "main")] (go (s3/s3-address s3-bucket s3-prefix (str ledger-alias "/" branch "/head"))))) (-alias [_ ledger-address] diff --git a/src/clj/fluree/db/nameservice/stored.cljc b/src/clj/fluree/db/nameservice/stored.cljc index 9b5135257..09b63ecd8 100644 --- a/src/clj/fluree/db/nameservice/stored.cljc +++ b/src/clj/fluree/db/nameservice/stored.cljc @@ -18,8 +18,10 @@ (let [ns-address (nameservice/full-address address-prefix ledger-alias)] (storage/read store ns-address))) - (-address [_ ledger-alias] - (go (str address-prefix ledger-alias))) + (-address [_ ledger-alias branch] + (go + (let [branch (if branch (name branch) "main")] + (str address-prefix ledger-alias "/" branch)))) (-close [_] true)) From cabc02c4a5111644bb8f3cab6e28ad2641756ba7 Mon Sep 17 00:00:00 2001 From: Benjamin Lamothe Date: Tue, 20 Aug 2024 15:23:09 -0400 Subject: [PATCH 05/10] fluree.db.nameservice.stored -> fluree.db.nameservice.storage-backed --- .../db/nameservice/{stored.cljc => storage_backed.cljc} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename src/clj/fluree/db/nameservice/{stored.cljc => storage_backed.cljc} (91%) diff --git a/src/clj/fluree/db/nameservice/stored.cljc b/src/clj/fluree/db/nameservice/storage_backed.cljc similarity index 91% rename from src/clj/fluree/db/nameservice/stored.cljc rename to src/clj/fluree/db/nameservice/storage_backed.cljc index 09b63ecd8..77ceda90a 100644 --- a/src/clj/fluree/db/nameservice/stored.cljc +++ b/src/clj/fluree/db/nameservice/storage_backed.cljc @@ -1,4 +1,4 @@ -(ns fluree.db.nameservice.stored +(ns fluree.db.nameservice.storage-backed (:require [clojure.core.async :refer [go]] [fluree.db.storage :as storage] [fluree.db.nameservice :as nameservice] @@ -16,7 +16,7 @@ nameservice/iNameService (-lookup [_ ledger-alias] (let [ns-address (nameservice/full-address address-prefix ledger-alias)] - (storage/read store ns-address))) + (storage/read-bytes store ns-address))) (-address [_ ledger-alias branch] (go From 32ee2303c1f29e007fc2404c9c3f026eef9991f8 Mon Sep 17 00:00:00 2001 From: Benjamin Lamothe Date: Wed, 21 Aug 2024 15:34:47 -0400 Subject: [PATCH 06/10] include exception in error message --- src/clj/fluree/db/util/filesystem.cljc | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/clj/fluree/db/util/filesystem.cljc b/src/clj/fluree/db/util/filesystem.cljc index c8e31a06b..7efd5297c 100644 --- a/src/clj/fluree/db/util/filesystem.cljc +++ b/src/clj/fluree/db/util/filesystem.cljc @@ -23,8 +23,7 @@ (with-open [out (io/output-stream (io/file path))] (.write out val)) (catch Exception e - (log/error (str "Unable to create storage directory: " path - " with error: " (.getMessage e) ".")) + (log/error e "Unable to create storage directory:" path ".") (log/error (str "Fatal Error, shutting down!")) (System/exit 1)))) (catch Exception e (throw e)))) @@ -39,8 +38,7 @@ (try (fs/writeFileSync path val) (catch :default e - (log/error (str "Unable to write file to path " path - " with error: " ^String (.-message e) ".")) + (log/error e "Unable to write file to path" path ".") (log/error (str "Fatal Error, shutting down! " {"errno" ^String (.-errno e) "syscall" ^String (.-syscall e) @@ -48,8 +46,7 @@ "path" (.-path e)})) (js/process.exit 1))) (catch :default e - (log/error (str "Unable to create storage directory: " path - " with error: " ^String (.-message e) ".")) + (log/error e "Unable to create storage directory:" path ".") (log/error (str "Fatal Error, shutting down!")) (js/process.exit 1))) (throw (ex-info "Error writing file." From f783a243b490e0813be51c27dd56cdb7e983cf62 Mon Sep 17 00:00:00 2001 From: Benjamin Lamothe Date: Fri, 23 Aug 2024 14:04:45 -0400 Subject: [PATCH 07/10] make ByteStore protocol work directly on paths instead of addresses --- src/clj/fluree/db/storage.cljc | 4 ++-- src/clj/fluree/db/storage/file.cljc | 14 ++++++++------ src/clj/fluree/db/storage/memory.cljc | 10 ++++------ src/clj/fluree/db/storage/s3.clj | 10 ++++------ 4 files changed, 18 insertions(+), 20 deletions(-) diff --git a/src/clj/fluree/db/storage.cljc b/src/clj/fluree/db/storage.cljc index 5b39b7f08..b2d5a719a 100644 --- a/src/clj/fluree/db/storage.cljc +++ b/src/clj/fluree/db/storage.cljc @@ -47,5 +47,5 @@ (defprotocol ByteStore "ByteStore is used by consensus to replicate files across servers" - (write-bytes [store address bytes] "Async writes bytes to store based on address.") - (read-bytes [store address] "Async read bytes from store based on address.")) + (write-bytes [store path bytes] "Async writes bytes to path in store.") + (read-bytes [store path] "Async read bytes from path in store.")) diff --git a/src/clj/fluree/db/storage/file.cljc b/src/clj/fluree/db/storage/file.cljc index a55c8acc2..4265bb5fa 100644 --- a/src/clj/fluree/db/storage/file.cljc +++ b/src/clj/fluree/db/storage/file.cljc @@ -59,13 +59,15 @@ (fs/exists? path))) storage/ByteStore - (write-bytes [_ address bytes] - (let [path (storage-path root address)] - (fs/write-file path bytes))) + (write-bytes [_ path bytes] + (-> root + (full-path path) + (fs/write-file bytes))) - (read-bytes [_ address] - (let [path (storage-path root address)] - (fs/read-file path)))) + (read-bytes [_ path] + (-> root + (full-path path) + fs/read-file))) (defn open [root-path] diff --git a/src/clj/fluree/db/storage/memory.cljc b/src/clj/fluree/db/storage/memory.cljc index 16f1f7cf7..2d1387399 100644 --- a/src/clj/fluree/db/storage/memory.cljc +++ b/src/clj/fluree/db/storage/memory.cljc @@ -45,13 +45,11 @@ (contains? @contents path)))) storage/ByteStore - (write-bytes [_ address bytes] - (let [k (-> address storage/parse-address :local)] - (swap! contents assoc k bytes))) + (write-bytes [_ path bytes] + (swap! contents assoc path bytes)) - (read-bytes [_ address] - (let [k (-> address storage/parse-address :local)] - (get @contents k)))) + (read-bytes [_ path] + (get @contents path))) (defn create [] diff --git a/src/clj/fluree/db/storage/s3.clj b/src/clj/fluree/db/storage/s3.clj index a16340115..bc2430645 100644 --- a/src/clj/fluree/db/storage/s3.clj +++ b/src/clj/fluree/db/storage/s3.clj @@ -45,13 +45,11 @@ (throw (ex-info "Unsupported operation S3Store method: delete." {:prefix prefix}))) storage/ByteStore - (write-bytes [_ address bytes] - (let [path (-> address storage/parse-address :local)] - (s3/write-s3-data client bucket prefix path bytes))) + (write-bytes [_ path bytes] + (s3/write-s3-data client bucket prefix path bytes)) - (read-bytes [_ address] - (let [path (-> address storage/parse-address :local)] - (s3/read-s3-data client bucket prefix path)))) + (read-bytes [_ path] + (s3/read-s3-data client bucket prefix path))) (defn open ([bucket prefix] From 0ef572cb6885eb2fa5696e1d4d808939202b6ecf Mon Sep 17 00:00:00 2001 From: Benjamin Lamothe Date: Fri, 23 Aug 2024 14:42:36 -0400 Subject: [PATCH 08/10] pass branch directly instead of in options for memory store --- src/clj/fluree/db/nameservice/memory.cljc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/clj/fluree/db/nameservice/memory.cljc b/src/clj/fluree/db/nameservice/memory.cljc index d7bd7d57e..4646c1b4f 100644 --- a/src/clj/fluree/db/nameservice/memory.cljc +++ b/src/clj/fluree/db/nameservice/memory.cljc @@ -67,7 +67,7 @@ (go (-> @state-atom keys))) (defn address - [ledger-alias {:keys [branch] :as _opts}] + [ledger-alias branch] (go (memory-address (str ledger-alias "/" (name branch) "/head")))) (defrecord MemoryNameService @@ -79,8 +79,8 @@ (-lookup [_ ledger-alias] (lookup state-atom ledger-alias)) (-lookup [_ ledger-alias opts] (lookup state-atom ledger-alias)) ;; TODO - doesn't support branches yet (-sync? [_] sync?) - (-address [_ ledger-alias opts] - (address ledger-alias opts)) + (-address [_ ledger-alias branch] + (address ledger-alias branch)) (-alias [_ ledger-address] (-> (address-path ledger-address) (str/split #"/") From 12c676b4dadb1924e8d0b99c13047c1d9c8cc6a4 Mon Sep 17 00:00:00 2001 From: Benjamin Lamothe Date: Fri, 23 Aug 2024 14:47:15 -0400 Subject: [PATCH 09/10] extract record filename from address and write to it directly --- src/clj/fluree/db/nameservice.cljc | 42 +++++++++++++++++- .../fluree/db/nameservice/storage_backed.cljc | 44 +++++++++++++------ 2 files changed, 72 insertions(+), 14 deletions(-) diff --git a/src/clj/fluree/db/nameservice.cljc b/src/clj/fluree/db/nameservice.cljc index 21a150983..8d6f534d2 100644 --- a/src/clj/fluree/db/nameservice.cljc +++ b/src/clj/fluree/db/nameservice.cljc @@ -39,6 +39,15 @@ "address" address "commit" commit-jsonld}]})) +(defn commit-address-from-record + [record branch] + (let [branch-iri (if branch + (str (get record "@id") "(" branch ")") + (get record "defaultBranch"))] + (->> (get record "branches") + (some #(when (= (get % "@id") branch-iri) + (get % "address")))))) + (defn address-path [address] (let [[_ _ path] (str/split address #":")] @@ -52,6 +61,37 @@ (->> (drop-last 2) ; branch-name, head (str/join #"/")))) +(defn extract-branch + "Splits a given namespace address into its nameservice and branch parts. + Returns two-tuple of [nameservice branch]. + If no branch is found, returns nil as branch value and original ns-address as the nameservice." + [ns-address] + (if (str/ends-with? ns-address ")") + (let [[_ ns branch] (re-matches #"(.*)\((.*)\)" ns-address)] + [ns branch]) + [ns-address nil])) + +(defn resolve-address + "Resolves a provided namespace address, which might be relative or absolute, + into three parts returned as a map: + - :alias - ledger alias + - :branch - branch (or nil if default) + - :address - absolute namespace address (including branch if provided) + If 'branch' parameter is provided will always use it as the branch regardless + of if a branch is specificed in the ns-address." + [base-address ns-address branch] + (let [[ns-address* extracted-branch] (extract-branch ns-address) + branch* (or branch extracted-branch) + absolute? (str/starts-with? ns-address base-address) + [ns-address** alias] (if absolute? + [ns-address* (subs ns-address* (count base-address))] + [(str base-address ns-address*) ns-address*])] + {:alias alias + :branch branch* + :address (if branch* + (str ns-address** "(" branch* ")") + ns-address*)})) + (defn nameservices [conn] (connection/-nameservices conn)) @@ -63,7 +103,7 @@ (defn ns-address "Returns async channel" [nameservice ledger-alias branch] - (-address nameservice ledger-alias {:branch branch})) + (-address nameservice ledger-alias branch)) (defn addresses "Retrieve address for each nameservices based on a relative ledger-alias. diff --git a/src/clj/fluree/db/nameservice/storage_backed.cljc b/src/clj/fluree/db/nameservice/storage_backed.cljc index 77ceda90a..6dc852e15 100644 --- a/src/clj/fluree/db/nameservice/storage_backed.cljc +++ b/src/clj/fluree/db/nameservice/storage_backed.cljc @@ -2,26 +2,44 @@ (:require [clojure.core.async :refer [go]] [fluree.db.storage :as storage] [fluree.db.nameservice :as nameservice] - [fluree.db.util.bytes :as bytes])) + [fluree.db.util.async :refer [UTF8 record)] - (storage/write-bytes store ns-address record-bytes))) + (go-try + (let [ledger-alias (get commit-jsonld "alias") + ns-address (nameservice/full-address address-prefix ledger-alias) + record (nameservice/ns-record ns-address commit-jsonld) + record-bytes (json/stringify-UTF8 record) + filename (local-filename ledger-alias)] + (StorageBackedNameService address-prefix store sync?)) From 542df90d6b0c5c1b6adff2818ff55e519be7f962 Mon Sep 17 00:00:00 2001 From: Benjamin Lamothe Date: Fri, 23 Aug 2024 15:50:19 -0400 Subject: [PATCH 10/10] remove file, s3, and memory nameservices in favor of storage-backed --- src/clj/fluree/db/conn/file.cljc | 14 +- src/clj/fluree/db/conn/ipfs.cljc | 7 +- src/clj/fluree/db/conn/memory.cljc | 19 +- src/clj/fluree/db/conn/s3.clj | 21 +- src/clj/fluree/db/nameservice/filesystem.cljc | 253 ------------------ src/clj/fluree/db/nameservice/memory.cljc | 95 ------- src/clj/fluree/db/nameservice/s3.clj | 48 ---- src/clj/fluree/db/storage/memory.cljc | 6 +- test/fluree/db/query/misc_queries_test.clj | 94 +++---- test/fluree/db/query/stable_hashes_test.clj | 4 +- 10 files changed, 68 insertions(+), 493 deletions(-) delete mode 100644 src/clj/fluree/db/nameservice/filesystem.cljc delete mode 100644 src/clj/fluree/db/nameservice/memory.cljc delete mode 100644 src/clj/fluree/db/nameservice/s3.clj diff --git a/src/clj/fluree/db/conn/file.cljc b/src/clj/fluree/db/conn/file.cljc index 4da97a7f7..2f22c4430 100644 --- a/src/clj/fluree/db/conn/file.cljc +++ b/src/clj/fluree/db/conn/file.cljc @@ -12,7 +12,7 @@ [fluree.db.serde.json :refer [json-serde]] [fluree.db.util.bytes :as bytes] [fluree.db.util.json :as json] - [fluree.db.nameservice.filesystem :as ns-filesystem] + [fluree.db.nameservice.storage-backed :as storage-ns] [fluree.db.storage :as storage] [fluree.db.storage.file :as file-storage]) #?(:clj (:import (java.io Writer)))) @@ -97,11 +97,6 @@ (binding [*out* w] (pr (connection/printer-map conn))))) -(defn default-file-nameservice - "Returns file nameservice or will throw if storage-path generates an exception." - [path] - (ns-filesystem/initialize path)) - (defn default-lru-cache [cache-max-mb] (let [cache-size (conn-cache/memory->cache-size cache-max-mb)] @@ -116,12 +111,13 @@ (go (let [conn-id (str (random-uuid)) state (connection/blank-state) - nameservices* (util/sequential - (or nameservices (default-file-nameservice storage-path))) lru-cache-atom* (or lru-cache-atom (default-lru-cache cache-max-mb)) store* (or store - (file-storage/open storage-path))] + (file-storage/open storage-path)) + nameservices* (-> nameservices + (or (storage-ns/start "fluree:file://" store* true)) + util/sequential)] ;; TODO - need to set up monitor loops for async chans (map->FileConnection {:id conn-id :store store* diff --git a/src/clj/fluree/db/conn/ipfs.cljc b/src/clj/fluree/db/conn/ipfs.cljc index e4d2b736d..869b5a640 100644 --- a/src/clj/fluree/db/conn/ipfs.cljc +++ b/src/clj/fluree/db/conn/ipfs.cljc @@ -10,7 +10,8 @@ [clojure.core.async :as async :refer [chan]] [fluree.db.serde.json :refer [json-serde]] [fluree.db.nameservice.ipns :as ns-ipns] - [fluree.db.nameservice.filesystem :as ns-filesystem] + [fluree.db.nameservice.storage-backed :as storage-ns] + [fluree.db.storage.file :as file-storage] [fluree.db.conn.cache :as conn-cache] [fluree.db.storage :as storage]) #?(:clj (:import (java.io Writer)))) @@ -95,8 +96,8 @@ (defn default-file-nameservice [{:keys [path base-address sync?]}] - (ns-filesystem/initialize path {:base-address base-address - :sync? sync?})) + (let [ns-store (file-storage/open path)] + (storage-ns/start base-address ns-store sync?))) (defn connect "Creates a new IPFS connection. diff --git a/src/clj/fluree/db/conn/memory.cljc b/src/clj/fluree/db/conn/memory.cljc index 6b2eda302..ec3438a06 100644 --- a/src/clj/fluree/db/conn/memory.cljc +++ b/src/clj/fluree/db/conn/memory.cljc @@ -2,13 +2,12 @@ (:require [clojure.core.async :as async :refer [go]] [fluree.db.indexer.storage :as index-storage] [fluree.db.index :as index] - [fluree.db.nameservice.memory :as ns-memory] + [fluree.db.nameservice.storage-backed :as storage-ns] [fluree.db.util.core :as util] [fluree.db.util.log :as log :include-macros true] [fluree.db.connection :as connection] [fluree.db.util.async :refer [cache-size cache-max-mb) lru-cache-atom (or lru-cache-atom (atom (conn-cache/create-lru-cache cache-size)))] diff --git a/src/clj/fluree/db/conn/s3.clj b/src/clj/fluree/db/conn/s3.clj index 80aa7c39d..6d245385e 100644 --- a/src/clj/fluree/db/conn/s3.clj +++ b/src/clj/fluree/db/conn/s3.clj @@ -1,7 +1,7 @@ (ns fluree.db.conn.s3 (:require [cognitect.aws.client.api :as aws] [clojure.string :as str] - [fluree.db.nameservice.s3 :as ns-s3] + [fluree.db.nameservice.storage-backed :as storage-ns] [clojure.core.async :as async :refer [go]] [fluree.db.conn.cache :as conn-cache] [fluree.db.connection :as connection] @@ -91,28 +91,21 @@ (binding [*out* w] (pr (connection/printer-map conn)))) -(defn default-S3-nameservice - "Returns S3 nameservice or will throw if storage-path generates an exception." - [s3-client s3-bucket s3-prefix] - (ns-s3/initialize s3-client s3-bucket s3-prefix)) - (defn connect "Create a new S3 connection." [{:keys [defaults parallelism s3-endpoint s3-bucket s3-prefix lru-cache-atom cache-max-mb serializer nameservices] :or {serializer (json-serde)} :as _opts}] (go - (let [aws-opts (cond-> {:api :s3} - s3-endpoint (assoc :endpoint-override s3-endpoint)) - client (aws/client aws-opts) - conn-id (str (random-uuid)) + (let [conn-id (str (random-uuid)) state (connection/blank-state) - nameservices* (util/sequential - (or nameservices (default-S3-nameservice client s3-bucket s3-prefix))) + s3-store (s3-storage/open s3-bucket s3-prefix s3-endpoint) + nameservices* (-> nameservices + (or (storage-ns/start "fluree:s3://" s3-store true)) + util/sequential) cache-size (conn-cache/memory->cache-size cache-max-mb) lru-cache-atom (or lru-cache-atom - (atom (conn-cache/create-lru-cache cache-size))) - s3-store (s3-storage/open s3-bucket s3-prefix s3-endpoint)] + (atom (conn-cache/create-lru-cache cache-size)))] (map->S3Connection {:id conn-id :store s3-store :state state diff --git a/src/clj/fluree/db/nameservice/filesystem.cljc b/src/clj/fluree/db/nameservice/filesystem.cljc deleted file mode 100644 index 5280c833e..000000000 --- a/src/clj/fluree/db/nameservice/filesystem.cljc +++ /dev/null @@ -1,253 +0,0 @@ -(ns fluree.db.nameservice.filesystem - (:require [fluree.db.nameservice :as nameservice] - [fluree.db.util.core :as util :refer [try* catch*]] - [fluree.db.util.filesystem :as fs] - [fluree.db.util.bytes :as bytes] - [clojure.core.async :as async :refer [go]] - [fluree.db.util.async :refer [> ledger-alias - (file-path local-path) - fs/read-file)) - -(defn address - [base-address ledger-alias branch] - (when base-address - (str base-address ledger-alias))) - -(defn write-ns-record - [ns-record local-path alias] - (let [p-chan (async/promise-chan) ;; return value - write-path (file-path local-path alias) - record-bs (try* (json/stringify-UTF8 ns-record) - (catch* e - (log/error "Error json-encoding nameservice record for ledger: " alias - "with exception: " (ex-message e) - "Original record where error occurred: " ns-record) - ;; return exception, don't throw.. will check for it below - (ex-info (str "Exception encoding file nameservice file for ledger: " alias) - {:status 500 :error :db/invalid-commit})))] - (if (util/exception? record-bs) - (async/put! p-chan record-bs) - #?(:clj (async/thread - (try - (fs/write-file write-path record-bs) - (async/put! p-chan write-path) - (catch Exception e - (log/error (str "Exception writing file nameservice file for ledger: " alias - "with exception: " (ex-message e)) - e) - (async/put! p-chan (ex-info (str "Exception writing file nameservice file for ledger: " alias - " with exception: " (ex-message e)) - {:status 500 :error :db/invalid-commit} - e))))) - :cljs (try* - (fs/write-file write-path record-bs) - (async/put! p-chan write-path) - (catch* e (async/put! p-chan e))))) - p-chan)) - -(defn push! - "Pushes updated commit to internal format stored on file system" - [local-path base-address {alias "alias" - :as commit-json-ld}] - (let [ns-address (address base-address alias nil) - record (ns-record ns-address commit-json-ld)] - ;; write-ns-record returns a promise chan, with path of file if successful or exception - (write-ns-record record local-path alias))) - - -(defn extract-branch - "Splits a given namespace address into its nameservice and branch parts. - Returns two-tuple of [nameservice branch]. - If no branch is found, returns nil as branch value and original ns-address as the nameservice." - [ns-address] - (if (str/ends-with? ns-address ")") - (let [[_ ns branch] (re-matches #"(.*)\((.*)\)" ns-address)] - [ns branch]) - [ns-address nil])) - -(defn resolve-address - "Resolves a provided namespace address, which might be relative or absolute, - into three parts returned as a map: - - :alias - ledger alias - - :branch - branch (or nil if default) - - :address - absolute namespace address (including branch if provided) - If 'branch' parameter is provided will always use it as the branch regardless - of if a branch is specificed in the ns-address." - [base-address ns-address branch] - (let [[ns-address* extracted-branch] (extract-branch ns-address) - branch* (or branch extracted-branch) - absolute? (str/starts-with? ns-address base-address) - [ns-address** alias] (if absolute? - [ns-address* (subs ns-address* (count base-address))] - [(str base-address ns-address*) ns-address*])] - {:alias alias - :branch branch* - :address (if branch* - (str ns-address** "(" branch* ")") - ns-address*)})) - -(defn retrieve-ns-record - "Loads nameservice record from disk given a local path and ledger alias" - [local-path ledger-alias] - (go-try - (let [ns-record (> (get ns-record "branches") - (some #(when (= (get % "@id") branch-iri) - (get % "address")))))) - -(defn convert-legacy-ns-record - [alias commit-address local-path legacy-path] - (async/go - (let [ns-address (str "fluree:file://" alias) - ns-record (ns-record ns-address {"address" commit-address "alias" alias, "branch" "main"})] - (let [successful? (async/ (address-path ledger-address) - (str/split #"/") - (->> (drop-last 2) ; branch-name, head - (str/join #"/")))) - (-close [_] true)) - - -(defn initialize - "Initializes nameservice that will manage commit data via a - local file system in the directory provided by `path` parameter. - This ns can publish any ns address in newly generated commits by - supplying an `address-base` parameter which will be appended with - the ledger alias. The default value for 'address-base' is - `fluree:file://`. - If you wanted the nameservice to show up in the commit metadata - as https://data.mydomain.com/ and to be stored - in the file system at path /opt/fluree/ns/, - then you would set: - - path = /opt/fluree/ns (directory, so trailing slash doesn't matter) - - address-base = https://data.mydomain.com/ (trailing slash important) - address-base can be anything, but when appended with the ledger alias - should be a URI/IRI. Ledger names are relative, e.g. 'my/ledger/name', - so the address-base should include a trailing '/' if a URL, or a - trailing ':' if in the form of a URN. - address-base can be 'nil' if you don't want the address - published as part of the commit metadata's nameservices." - ([path] (initialize path nil)) - ([path {:keys [sync? base-address] - :or {base-address "fluree:file://"}}] - (let [local-path (fs/local-path path) - sync? (if (some? sync?) - sync? - true)] - (map->FileNameService {:local-path local-path - :sync? sync? - :base-address base-address})))) diff --git a/src/clj/fluree/db/nameservice/memory.cljc b/src/clj/fluree/db/nameservice/memory.cljc deleted file mode 100644 index 4646c1b4f..000000000 --- a/src/clj/fluree/db/nameservice/memory.cljc +++ /dev/null @@ -1,95 +0,0 @@ -(ns fluree.db.nameservice.memory - (:require [fluree.db.nameservice :as nameservice] - [clojure.core.async :as async :refer [go]] - [clojure.string :as str] - [fluree.db.platform :as platform] - [fluree.db.util.log :as log])) - -#?(:clj (set! *warn-on-reflection* true)) - -(defn memory-address - "Turn a path into a fluree memory address." - [path] - (str "fluree:memory://" path)) - -(defn- address-path - "Returns the path portion of a Fluree memory address." - [address] - (if-let [[_ path] (re-find #"^fluree:memory://(.+)$" address)] - path - (throw (ex-info (str "Incorrectly formatted Fluree memory db address: " address) - {:status 500 :error :db/invalid-db})))) - -(defn- read-address - [data-atom address] - (let [addr-path (address-path address)] - #?(:clj (get @data-atom addr-path) - :cljs (or (get @data-atom addr-path) - (and platform/BROWSER (.getItem js/localStorage addr-path)))))) - -(defn push! - [data-atom {commit-address "address" - nameservice-iris "ns" - :as commit-data}] - (go - (let [my-ns-iri (->> (map #(get % "id") nameservice-iris) - (some #(when (re-matches #"^fluree:memory:.+" %) %))) - commit-path (address-path commit-address) - head-path (address-path my-ns-iri)] - (swap! data-atom - (fn [state] - (let [commit (get state commit-path)] - (when-not commit - (throw (ex-info (str "Unable to locate commit in memory, cannot push!: " commit-address) - {:status 500 :error :db/invalid-db}))) - (log/debug "pushing:" my-ns-iri "referencing commit:" commit-address) - (let [commit (assoc commit "address" commit-address)] - (assoc state head-path commit))))) - #?(:cljs (and platform/BROWSER (.setItem js/localStorage address-path commit-path))) - commit-data))) - -(defn lookup - [data-atom ledger-alias] - (go #?(:clj - (when-let [head-commit (read-address data-atom ledger-alias)] - (-> head-commit (get "address"))) - - :cljs - (if platform/BROWSER - (when-let [head-commit (read-address data-atom ledger-alias)] - (memory-address head-commit)) - (throw (ex-info (str "Cannot lookup ledger address with memory connection: " - ledger-alias) - {:status 500 :error :db/invalid-ledger})))))) - -(defn ledger-list - [state-atom opts] - (go (-> @state-atom keys))) - -(defn address - [ledger-alias branch] - (go (memory-address (str ledger-alias "/" (name branch) "/head")))) - -(defrecord MemoryNameService - [state-atom sync?] - nameservice/Publisher - (-push [_ commit-data] (push! state-atom commit-data)) - - nameservice/iNameService - (-lookup [_ ledger-alias] (lookup state-atom ledger-alias)) - (-lookup [_ ledger-alias opts] (lookup state-atom ledger-alias)) ;; TODO - doesn't support branches yet - (-sync? [_] sync?) - (-address [_ ledger-alias branch] - (address ledger-alias branch)) - (-alias [_ ledger-address] - (-> (address-path ledger-address) - (str/split #"/") - (->> (drop 2) - (str/join "/")))) - (-close [nameservice] (reset! state-atom {}))) - - -(defn initialize - [state-atom] - (map->MemoryNameService {:state-atom state-atom - :sync? true})) diff --git a/src/clj/fluree/db/nameservice/s3.clj b/src/clj/fluree/db/nameservice/s3.clj deleted file mode 100644 index a5cbd6f2b..000000000 --- a/src/clj/fluree/db/nameservice/s3.clj +++ /dev/null @@ -1,48 +0,0 @@ -(ns fluree.db.nameservice.s3 - (:require [fluree.db.nameservice :as nameservice] - [clojure.core.async :as async :refer [go > (map #(get % "id") nameservices) - (some #(when (re-matches #"^fluree:s3:.+" %) %))) - commit-path (s3/address-path s3-bucket s3-prefix commit-address false) - head-path (s3/address-path s3-bucket s3-prefix my-ns-iri)] - (->> (.getBytes ^String commit-path) - (s3/write-s3-data s3-client s3-bucket s3-prefix head-path) - :address)))) - -(defn lookup-alias - [s3-client s3-bucket s3-prefix ledger-alias] - (go (s3/s3-address s3-bucket s3-prefix ( ledger-address (->> (s3/address-path s3-bucket s3-prefix)) (str/split #"/") - (->> (drop-last 2) (str/join #"/")))) - (-close [_] true)) - - -(defn initialize - [s3-client s3-bucket s3-prefix] - (map->S3NameService {:s3-client s3-client - :s3-bucket s3-bucket - :s3-prefix s3-prefix - :sync? true})) diff --git a/src/clj/fluree/db/storage/memory.cljc b/src/clj/fluree/db/storage/memory.cljc index 2d1387399..23b09a13c 100644 --- a/src/clj/fluree/db/storage/memory.cljc +++ b/src/clj/fluree/db/storage/memory.cljc @@ -46,10 +46,12 @@ storage/ByteStore (write-bytes [_ path bytes] - (swap! contents assoc path bytes)) + (go + (swap! contents assoc path bytes))) (read-bytes [_ path] - (get @contents path))) + (go + (get @contents path)))) (defn create [] diff --git a/test/fluree/db/query/misc_queries_test.clj b/test/fluree/db/query/misc_queries_test.clj index c7689fbab..c61568ead 100644 --- a/test/fluree/db/query/misc_queries_test.clj +++ b/test/fluree/db/query/misc_queries_test.clj @@ -173,56 +173,50 @@ {:ex "http://example.org/ns/"}] :select ['?s '?p '?o] :where {:id '?s, '?p '?o}})] - (is (= [["fluree:db:sha256:bb7yu65w6lgl7xpoic663lnws6lxeu36wyubphbyszpye5iirko7z" - :f/address - "fluree:memory://04be3eee73fc4a553f3b481bfb8867e337a8b2d76a2aea347a3b9c10c8582c6f"] - ["fluree:db:sha256:bb7yu65w6lgl7xpoic663lnws6lxeu36wyubphbyszpye5iirko7z" - :f/flakes - 11] - ["fluree:db:sha256:bb7yu65w6lgl7xpoic663lnws6lxeu36wyubphbyszpye5iirko7z" - :f/previous - "fluree:db:sha256:beuoec4c6zqxfjglld3evwjdtavsdktncoh6bbxiz677cc4zz3qr"] - ["fluree:db:sha256:bb7yu65w6lgl7xpoic663lnws6lxeu36wyubphbyszpye5iirko7z" - :f/size - 1058] - ["fluree:db:sha256:bb7yu65w6lgl7xpoic663lnws6lxeu36wyubphbyszpye5iirko7z" - :f/t - 1] - ["fluree:commit:sha256:bbfcquyjx3cthdcroffguybklk6p5zua3cifwkhm3p25zt4xfjwjs" - "https://www.w3.org/2018/credentials#issuer" - "did:fluree:TfCzWTrXqF16hvKGjcYiLxRoYJ1B8a6UMH6"] - ["fluree:commit:sha256:bbfcquyjx3cthdcroffguybklk6p5zua3cifwkhm3p25zt4xfjwjs" - :f/address - "fluree:memory://4dce4a82096f49ce3f39ba416cb89aefe5e0d9daa50278631b91672b55324595"] - ["fluree:commit:sha256:bbfcquyjx3cthdcroffguybklk6p5zua3cifwkhm3p25zt4xfjwjs" - :f/alias - "query/everything"] - ["fluree:commit:sha256:bbfcquyjx3cthdcroffguybklk6p5zua3cifwkhm3p25zt4xfjwjs" - :f/branch - "main"] - ["fluree:commit:sha256:bbfcquyjx3cthdcroffguybklk6p5zua3cifwkhm3p25zt4xfjwjs" - :f/data - "fluree:db:sha256:bb7yu65w6lgl7xpoic663lnws6lxeu36wyubphbyszpye5iirko7z"] - ["fluree:commit:sha256:bbfcquyjx3cthdcroffguybklk6p5zua3cifwkhm3p25zt4xfjwjs" - :f/previous - "fluree:commit:sha256:bvvou3uvnd6ffhehsrw23mw4w3fux5jbpacko2ecosb2nzxkfu5v"] - ["fluree:commit:sha256:bbfcquyjx3cthdcroffguybklk6p5zua3cifwkhm3p25zt4xfjwjs" - :f/time - 720000] - ["fluree:commit:sha256:bbfcquyjx3cthdcroffguybklk6p5zua3cifwkhm3p25zt4xfjwjs" - :f/v - 1] - [:ex/alice :type :ex/User] - [:ex/alice :schema/age 42] - [:ex/alice :schema/email "alice@flur.ee"] - [:ex/alice :schema/name "Alice"] - [:ex/bob :type :ex/User] - [:ex/bob :schema/age 22] - [:ex/bob :schema/name "Bob"] - [:ex/jane :type :ex/User] - [:ex/jane :schema/age 30] - [:ex/jane :schema/email "jane@flur.ee"] - [:ex/jane :schema/name "Jane"]] + (is (=[["fluree:db:sha256:bb7yu65w6lgl7xpoic663lnws6lxeu36wyubphbyszpye5iirko7z" + :f/address + "fluree:memory://04be3eee73fc4a553f3b481bfb8867e337a8b2d76a2aea347a3b9c10c8582c6f"] + ["fluree:db:sha256:bb7yu65w6lgl7xpoic663lnws6lxeu36wyubphbyszpye5iirko7z" :f/flakes 11] + ["fluree:db:sha256:bb7yu65w6lgl7xpoic663lnws6lxeu36wyubphbyszpye5iirko7z" + :f/previous + "fluree:db:sha256:beuoec4c6zqxfjglld3evwjdtavsdktncoh6bbxiz677cc4zz3qr"] + ["fluree:db:sha256:bb7yu65w6lgl7xpoic663lnws6lxeu36wyubphbyszpye5iirko7z" :f/size 1058] + ["fluree:db:sha256:bb7yu65w6lgl7xpoic663lnws6lxeu36wyubphbyszpye5iirko7z" :f/t 1] + ["fluree:commit:sha256:bbdy62cnpfbczayrn7wgs57slhnspv5vnihqvmojqklvmjr7fg2ec" + "https://www.w3.org/2018/credentials#issuer" + "did:fluree:TfCzWTrXqF16hvKGjcYiLxRoYJ1B8a6UMH6"] + ["fluree:commit:sha256:bbdy62cnpfbczayrn7wgs57slhnspv5vnihqvmojqklvmjr7fg2ec" + :f/address + "fluree:memory://e516fec96302257a915e23f71c09350c570e2bdbe8c75012f47ebaca67cc56cb"] + ["fluree:commit:sha256:bbdy62cnpfbczayrn7wgs57slhnspv5vnihqvmojqklvmjr7fg2ec" + :f/alias + "query/everything"] + ["fluree:commit:sha256:bbdy62cnpfbczayrn7wgs57slhnspv5vnihqvmojqklvmjr7fg2ec" + :f/branch + "main"] + ["fluree:commit:sha256:bbdy62cnpfbczayrn7wgs57slhnspv5vnihqvmojqklvmjr7fg2ec" + :f/data + "fluree:db:sha256:bb7yu65w6lgl7xpoic663lnws6lxeu36wyubphbyszpye5iirko7z"] + ["fluree:commit:sha256:bbdy62cnpfbczayrn7wgs57slhnspv5vnihqvmojqklvmjr7fg2ec" + :f/previous + "fluree:commit:sha256:bbyuz7tgv5akbruljy4czxu47izkeanawa5fqyt7kwezhckp3g5ew"] + ["fluree:commit:sha256:bbdy62cnpfbczayrn7wgs57slhnspv5vnihqvmojqklvmjr7fg2ec" + :f/time + 720000] + ["fluree:commit:sha256:bbdy62cnpfbczayrn7wgs57slhnspv5vnihqvmojqklvmjr7fg2ec" + :f/v + 1] + [:ex/alice :type :ex/User] + [:ex/alice :schema/age 42] + [:ex/alice :schema/email "alice@flur.ee"] + [:ex/alice :schema/name "Alice"] + [:ex/bob :type :ex/User] + [:ex/bob :schema/age 22] + [:ex/bob :schema/name "Bob"] + [:ex/jane :type :ex/User] + [:ex/jane :schema/age 30] + [:ex/jane :schema/email "jane@flur.ee"] + [:ex/jane :schema/name "Jane"]] result) (str "query result was: " (pr-str result)))))))) diff --git a/test/fluree/db/query/stable_hashes_test.clj b/test/fluree/db/query/stable_hashes_test.clj index 862dec0ec..190c3963a 100644 --- a/test/fluree/db/query/stable_hashes_test.clj +++ b/test/fluree/db/query/stable_hashes_test.clj @@ -28,10 +28,10 @@ :schema/age 30}]}) db1 @(fluree/commit! ledger db0)] (testing "stable commit id" - (is (= "fluree:commit:sha256:bbnabt4dx7g2cetpxnpmj7yw3dwwztdo6r4pusndprm2cedpvjixm" + (is (= "fluree:commit:sha256:blsm452njcnvya2yr2t54y3stj6rgi3rmwgnkeut3njqkumjcj4a" (get-in db1 [:commit :id])))) (testing "stable commit address" - (is (= "fluree:memory://4be8331e870ec61478ca8c4f0fb834f392bcd8cc341be5c081ba9bf7c70ef11c" + (is (= "fluree:memory://098da2e8b5dd5ae8176a403f6739f269b24ad9b7103543a14946827f134cad15" (get-in db1 [:commit :address])))) (testing "stable db id" (is (= "fluree:db:sha256:bb7yu65w6lgl7xpoic663lnws6lxeu36wyubphbyszpye5iirko7z"