https://github.com/replikativ/sendandi
Protocol above datalog databases for common functions
https://github.com/replikativ/sendandi
Last synced: 11 months ago
JSON representation
Protocol above datalog databases for common functions
- Host: GitHub
- URL: https://github.com/replikativ/sendandi
- Owner: replikativ
- License: other
- Created: 2020-09-04T12:41:26.000Z (over 5 years ago)
- Default Branch: main
- Last Pushed: 2022-02-14T17:52:23.000Z (almost 4 years ago)
- Last Synced: 2025-01-13T09:36:40.949Z (12 months ago)
- Language: Clojure
- Size: 19.5 KB
- Stars: 1
- Watchers: 4
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
# sendandi
From icelandic "sendandi" which means "dispatcher".
Dispatches on current database configuration and calls the corresponding database functions. Supports functions like `create-database`, `connect`, `transact`,
`q`, etc.
Currently only Datomic and Datahike is supported.
## Usage
For an example with datahike include latest version in your dependencies and fire up a REPL:
```clojure
(require '[sendandi.api :as s])
;; => nil
;; define configuration
(def cfg {:store {:backend :mem
:id "sendandi"}
:keep-history? true
:schema-flexibility :write
:name "Sendandi"
:initial-tx [{:db/ident :name
:db/valueType :db.type/string
:db/cardinality :db.cardinality/one}]})
;; => #'sendandi.api/cfg
;; create a client
(def client (s/datahike-client cfg))
;; => #'sendandi.api/client
;; create a new database
(s/create-database client {})
;; => nil
;; connect to the database
(def conn (s/connect client {}))
;; => #'sendandi.api/conn
;; add new data
(s/transact conn [{:name "Otto"} {:name "Eva"}])
;; =>
;; {:db-before #sendandi.api.DatahikeDb{:state #datahike/DB{:schema {:db/ident #:db{:unique :db.unique/identity},
;; :name #:db{:ident :name,
;; :valueType :db.type/string,
;; :cardinality :db.cardinality/one},
;; 1 :name}}},
;; :db-after #sendandi.api.DatahikeDb{:state #datahike/DB{:schema {:db/ident #:db{:unique :db.unique/identity},
;; :name #:db{:ident :name,
;; :valueType :db.type/string,
;; :cardinality :db.cardinality/one},
;; 1 :name}}},
;; :tx-data [#datahike/Datom[536870914 :db/txInstant #inst"2020-09-07T09:24:58.534-00:00" 536870914 true]
;; #datahike/Datom[2 :name "Otto" 536870914 true]
;; #datahike/Datom[3 :name "Eva" 536870914 true]],
;; :tempids #:db{:current-tx 536870914}}
;; query the data
(s/q '[:find ?e ?n
:where
[?e :name ?n]]
(s/db conn))
;; => #{[3 "Eva"] [2 "Otto"]}
;; pull an entity
(s/pull (s/db conn) '[*] 3)
;; => {:db/id 3, :name "Eva"}
;; get all datoms from the EAVT index
(s/datoms (s/db conn) {:index :eavt
:components nil})
;; =>
;; (#datahike/Datom[1 :db/cardinality :db.cardinality/one 536870913 true]
;; #datahike/Datom[1 :db/ident :name 536870913 true]
;; #datahike/Datom[1 :db/valueType :db.type/string 536870913 true]
;; #datahike/Datom[2 :name "Otto" 536870914 true]
;; #datahike/Datom[3 :name "Eva" 536870914 true]
;; #datahike/Datom[536870913 :db/txInstant #inst"2020-09-07T09:24:51.655-00:00" 536870913 true]
;; #datahike/Datom[536870914 :db/txInstant #inst"2020-09-07T09:24:58.534-00:00" 536870914 true])
(def date (java.util.Date.))
;; => #'sendandi.api/date
;; retract some data
(s/transact conn [[:db/retract 2 :name "Otto"]])
;; =>
;; {:db-before #sendandi.api.DatahikeDb{:state #datahike/DB{:schema {:db/ident #:db{:unique :db.unique/identity},
;; :name #:db{:ident :name,
;; :valueType :db.type/string,
;; :cardinality :db.cardinality/one},
;; 1 :name}}},
;; :db-after #sendandi.api.DatahikeDb{:state #datahike/DB{:schema {:db/ident #:db{:unique :db.unique/identity},
;; :name #:db{:ident :name,
;; :valueType :db.type/string,
;; :cardinality :db.cardinality/one},
;; 1 :name}}},
;; :tx-data [#datahike/Datom[536870915 :db/txInstant #inst"2020-09-07T09:25:09.784-00:00" 536870915 true]
;; #datahike/Datom[2 :name "Otto" 536870915 false]],
;; :tempids #:db{:current-tx 536870915}}
;; check whether it still exists
(s/q '[:find ?e ?n
:where
[?e :name ?n]]
(s/db conn))
;; => #{[3 "Eva"]}
;; check former database for the data
(s/q '[:find ?e ?n
:where
[?e :name ?n]]
(s/as-of (s/db conn) date))
;; => #{[3 "Eva"] [2 "Otto"]}
;; query history for changes in the entity
(s/q '[:find ?e ?n ?tx ?added
:where
[?e :name ?n ?tx ?added]]
(s/history (s/db conn)))
;; => #{[2 "Otto" 536870915 false] [2 "Otto" 536870914 true] [3 "Eva" 536870914 true]}
;; remove database again
(s/delete-database client {})
;; => {}
```
## License
Copyright © 2022 Konrad Kühne
This program and the accompanying materials are made available under the
terms of the Eclipse Public License 2.0 which is available at
http://www.eclipse.org/legal/epl-2.0.
This Source Code may also be made available under the following Secondary
Licenses when the conditions for such availability set forth in the Eclipse
Public License, v. 2.0 are satisfied: GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or (at your
option) any later version, with the GNU Classpath Exception which is available
at https://www.gnu.org/software/classpath/license.html.