An open API service indexing awesome lists of open source software.

https://github.com/sultanov-team/xtdb-tarantool

XTDB module allows you to use Tarantool (in-memory computing platform)
https://github.com/sultanov-team/xtdb-tarantool

clojure datalog tarantool xtdb xtdb-module

Last synced: about 2 months ago
JSON representation

XTDB module allows you to use Tarantool (in-memory computing platform)

Awesome Lists containing this project

README

          

image:https://img.shields.io/github/license/sultanov-team/xtdb-tarantool[license,link=license]
image:https://codecov.io/gh/sultanov-team/xtdb-tarantool/branch/master/graph/badge.svg?token=3VpsOfOpH5)[codecov,link=https://codecov.io/gh/sultanov-team/xtdb-tarantool]
image:https://github.com/sultanov-team/xtdb-tarantool/workflows/build/badge.svg[build]

image:https://img.shields.io/clojars/v/team.sultanov/xtdb-tarantool.svg[clojars,link=https://clojars.org/team.sultanov/xtdb-tarantool]

== XTDB Tarantool

https://www.xtdb.com[XTDB] module allows you to use https://www.tarantool.io/[Tarantool] (in-memory computing platform).

**Status: ** Alpha.
The design and prototyping stage.

=== Installation

Add the following dependency in your project:

[source,clojure]
----
;; project.clj or build.boot
[team.sultanov/xtdb-tarantool "0.1.61"]

;; deps.edn
team.sultanov/xtdb-tarantool {:mvn/version "0.1.61"}
----

=== Usage

*Requirements*

First you need to configure the Tarantool:

- link:docker-compose.yaml[Docker compose]
- link:src/main/tarantool/xtdb.lua[Tarantool configuration]

[source,clojure]
----
;; src/develop/clojure/xtdb/tarantool/example.clj

(ns xtdb.tarantool.example
(:require
[clojure.tools.namespace.repl :as tools.repl]
[integrant.core :as ig]
[integrant.repl :as ig.repl]
[integrant.repl.state :as ig.repl.state]
[xtdb.api :as xt]
[xtdb.tarantool :as tnt])
(:import
(java.io
Closeable)
(java.time
Duration)))

(tools.repl/set-refresh-dirs "src/dev/clojure")

(defn config
[]
{::xtdb-tnt {::tnt-client {:xtdb/module 'xtdb.tarantool/->tnt-client
:username "root"
:password "root"}
:xtdb/tx-log {:xtdb/module 'xtdb.tarantool/->tx-log
:tnt-client ::tnt-client
:poll-wait-duration (Duration/ofSeconds 5)}
:xtdb.http-server/server {:read-only? true
:server-label "[xtdb-tarantool] Console Demo"}}})

(defn prep
[]
(ig.repl/set-prep! config))

(defn go
[]
(prep)
(ig.repl/go))

(def halt ig.repl/halt)
(def reset-all ig.repl/reset-all)

(defn system
[]
ig.repl.state/system)

(defmethod ig/init-key ::xtdb-tnt [_ config]
(xt/start-node config))

(defmethod ig/halt-key! ::xtdb-tnt [_ ^Closeable node]
(tnt/close node))

(comment

(reset-all)
(halt)
(go)
;; open http://localhost:3000/

(def node
(::xtdb-tnt (system)))

(xt/submit-tx node [[::xt/put {:xt/id "xtdb-tarantool", :user/email "ilshat@sultanov.team"}]])
;; => #:xtdb.api{:tx-id 1, :tx-time #inst"2021-12-04T01:27:15.641-00:00"}

(xt/q (xt/db node) '{:find [e]
:where [[e :user/email "ilshat@sultanov.team"]]})
;; => #{["xtdb-tarantool"]}

(xt/q (xt/db node)
'{:find [(pull ?e [*])]
:where [[?e :xt/id "xtdb-tarantool"]]})
;; => #{[{:user/email "ilshat@sultanov.team", :xt/id "xtdb-tarantool"}]}

(def history (xt/entity-history (xt/db node) "xtdb-tarantool" :desc {:with-docs? true}))
;; => [#:xtdb.api{:tx-time #inst"2021-12-04T01:31:14.080-00:00",
;; :tx-id 2,
;; :valid-time #inst"2021-12-04T01:31:14.080-00:00",
;; :content-hash #xtdb/id"d0eb040d39fbdaa8699d867bc9fb9aa244b8e154",
;; :doc {:user/email "ilshat@sultanov.team", :xt/id "xtdb-tarantool"}}]

(->> (map ::xt/doc history)
(filterv (comp (partial = "ilshat@sultanov.team") :user/email)))
;; => [{:user/email "ilshat@sultanov.team", :xt/id "xtdb-tarantool"}]
)
----

=== Roadmap

- [x] Add tx-log
- [ ] Add kv-store
- [ ] Add document-store
- [ ] Add logging
- [ ] Improve tests
- [ ] Add automatic tarantool configuration (in-memory / vinyl)
- [ ] Add an example of using a tarantool cartridge
- [ ] Add an example of using a tarantool kubernetes operator (single node / cluster / with sharding)
- [ ] Add rockspec and publish tarantool configuration to https://luarocks.org[luarocks]?

=== Workflow

==== Development

[source,bash]
----
# run tarantool
$ bb up

# stop tarantool
$ bb down

# run repl
$ bb repl

# check for outdated dependencies
$ bb outdated

# upgrade outdated dependencies
$ bb outdated:upgrade
----

==== Testing

[source,bash]
----
# run linters
$ bb lint

# run linters and fix issues
$ bb lint:fix

# run only unit tests
$ bb test:unit

# run only integration tests (requires a running tarantool)
$ bb test:integration

# run all tests
$ bb test
----

==== Build & deploy

[source,bash]
----
# build jar
$ bb jar

# install locally
$ bb install

# deploy to clojars
$ bb deploy
----

==== Other tasks

[source,bash]
----
$ bb tasks
----

=== License

Copyright © 2021 sultanov.team