From 330f2c00ffeea7384fc7444df91d4f4c60817a60 Mon Sep 17 00:00:00 2001 From: Eugen Stan Date: Sat, 1 Apr 2023 06:22:22 +0300 Subject: [PATCH] [#109] This is exploratory work for providing map interface on top of datalevin --- examples/simple-deps/deps.edn | 5 +- examples/simple-deps/src/java_map.clj | 77 +++++++++++++++++++++++++++ examples/simple-deps/src/kv.clj | 3 +- 3 files changed, 82 insertions(+), 3 deletions(-) create mode 100644 examples/simple-deps/src/java_map.clj diff --git a/examples/simple-deps/deps.edn b/examples/simple-deps/deps.edn index ae748240..267c4d6d 100644 --- a/examples/simple-deps/deps.edn +++ b/examples/simple-deps/deps.edn @@ -1,7 +1,8 @@ {:paths ["src"] - :deps {io.github.juji-io/datalevin #_{:git/tag "0.6.21" + :deps {datalevin/datalevin #_{:git/tag "0.6.21" :git/sha "41d1915eb67b1606aab4807058ff24bb41fdb8e8"} - {:local/root "../.."} + #_{:local/root "../.."} + {:mvn/version "0.8.9"} com.cognitect/transit-clj {:mvn/version "1.0.329"}} :aliases {:dev {:jvm-opts ["--add-opens=java.base/java.nio=ALL-UNNAMED" "--add-opens=java.base/sun.nio.ch=ALL-UNNAMED"]}}} \ No newline at end of file diff --git a/examples/simple-deps/src/java_map.clj b/examples/simple-deps/src/java_map.clj new file mode 100644 index 00000000..e109da76 --- /dev/null +++ b/examples/simple-deps/src/java_map.clj @@ -0,0 +1,77 @@ +(ns java-map + (:require [datalevin.core :as d])) + + +(defn ->map + "Provide an implementation of java.util.Map interface backed by datalevin / LMDB." + [db table] + (d/open-dbi db table) + (reify java.util.Map + + (clear [_this] + (throw (ex-info "Unimplemented" {}))) + + (containsKey [_this key] + (let [kv (d/get-value db table key :data :data false)] + (some? kv))) + + (containsValue [_this value] + (throw (ex-info "Unimplemented" {}))) + + (entrySet [_this] + (throw (ex-info "Unimplemented" {}))) + + (get [_this key] + (d/get-value db table key)) + + (isEmpty [_this] + (throw (ex-info "Unimplemented" {}))) + + (keySet [_this] + (throw (ex-info "Unimplemented" {}))) + + (put [_this key value] + (d/transact-kv db [[:put table key value]])) + + (remove [_this key] + (let [kv (d/get-value db table key :data :data false)] + (when (some? kv) + (d/transact-kv db [[:del table key :data]]) + (nth kv 1)))) + + (size [_this] + (throw (ex-info "Unimplemented" {}))) + + (values [_this] + (throw (ex-info "Unimplemented" {}))))) + +(comment + + (def db (d/open-kv "/tmp/datalevin/map")) + + (d/open-dbi db "map-table") + + (d/transact-kv + db + [[:put "map-table" :datalevin "Hello, world!"] + [:put "map-table" 42 {:saying "So Long, and thanks for all the fish" + :source "The Hitchhiker's Guide to the Galaxy"}] + [:put "map-table" #inst "1991-12-25" "USSR broke apart" :instant] + [:put "map-table" #inst "1989-11-09" "The fall of the Berlin Wall" :instant]]) + + (d/get-value db "map-table" 1 :data :data false) + (d/get-value db "map-table" 36 :data :data false) + + (d/transact-kv db [[:del "map-table" 36 :data]]) + + (let [my-map (->map db "map-table")] + (println (.get my-map 42)) + (.put my-map 36 "Is the secret number") + (.get my-map 36) + (println (.remove my-map 36)) + (println (.containsKey my-map 36)) + (println (.containsKey my-map 3)) + (println (.containsKey my-map 42))) + + (d/close-kv db) + ) \ No newline at end of file diff --git a/examples/simple-deps/src/kv.clj b/examples/simple-deps/src/kv.clj index e24eb696..1514a162 100644 --- a/examples/simple-deps/src/kv.clj +++ b/examples/simple-deps/src/kv.clj @@ -1,4 +1,5 @@ -(ns kv) +(ns kv + (:require [datalevin.core :as d])) (require '[datalevin.core :as d]) (import '[java.util Date])