A Hacktoberfest Project for Java/Kotlin Backend and Svelte/Typescript Frontend developers 👩‍💻👨‍💻
Tags: hacktoberfest, webdev, contributorswanted, showdev
Published: 2020-09-28 17:03:43

# SirixDB - An evolutionary, accumulate only database system (currently storing XML and JSON data) 🦁

## Feel free to contribute on Github to the **[Core](https://github.com/sirixdb/sirix)** and the **[Svelte based Frontend](https://github.com/sirixdb/sirix-svelte-front-end)** 💚

Hi all,

**there's plenty of possibilities to work on a versioned database system, which preserves every revision of your data in a space-efficient manner through structural sharing and a novel sliding snapshot algorithm. 🐬** 

[SirixDB](https://sirix.io) only stores changes between revisions, but any revision is indexed and can be reconstructed in *O(n)*, whereas n is the number of nodes in the revision.

If you're eager to participate in *#Hacktoberfest*, there are plenty of opportunities. For instance, working on a frontend, the backend, a non-blocking REST API built with [Vert.x](https://vertx.io), [Kotlin](https://kotlinlang.org/) and Keykloak, or a query optimizer (for instance, to rewrite the AST based on cost-based rules). Or you might want to look into how to best horizontally scale SirixDB, for example, via a distributed log ([Apache Kafka?!](https://kafka.apache.org/)) 😃

Furthermore, the [sirix.io](https://sirix.io) website needs some love.

## 🐣 Frontend with *Svelte*, *TypeScript* and *D3.js*

![Screenshot Depicting Diffs](https://github.com/sirixdb/sirix/raw/master/Screenshot%20from%202020-09-28%2018-50-58.png)

*Moshe Uminer* currently, besides working on and maintaining a Python and a TypeScript based client for SirixDB, is working on a frontend built with Svelte.

On the one hand, the purpose of the front end is to interact with the database system through queries. On the other hand, to visualize the differences between revisions.

In general, I'd love to provide a similar space-filling approach (modified Sunburst-View) as the one I once developed for my master's thesis:

{% youtube l9CXXBkl5vI %}

## 🚀 Backend written in Java and a non-blocking REST-API built with Vert.x and Kotlin

If you're more into backend stuff, you can either work directly on issues regarding SirixDB or work on Kotlin based stuff with [Vert.x](https://vertx.io).

{% github sirixdb/sirix no-readme %}

For instance, Web Socket support in the non-blocking HTTP-Server:

{% github https://github.com/sirixdb/sirix/issues/98 %}

Try to create a native image with the GraalVM (however, Java 14 or 15 might not be supported, though :()

{% github https://github.com/sirixdb/sirix/issues/77 %}

A Kotlin-based DSL for SirixDB:

{% github https://github.com/sirixdb/sirix/issues/63 %}

Have a look into all the issues :-)

**Besides, a Kotlin-Client and a Rust-Client is needed in the long run.**

## Query optimizations

Or if you would like to work on query optimizations, you can look into how to rewrite the AST produced by Brackit:

{% github https://github.com/sebbae/brackit/issues/5 %}

We have plenty of optimization potential here, as we currently don't take any inherent storage optimizations into account. 👍

**This will increase the performance of specific queries considerably.**

A query looks like this:

```xquery
let $doc := jn:open('database','resource', xs:dateTime('2019-04-13T16:24:27Z'))
let $statuses := $doc=>statuses
let $foundStatus := for $status in $statuses
  let $dateTimeCreated := xs:dateTime($status=>created_at)
  where $dateTimeCreated > xs:dateTime("2018-02-01T00:00:00")
        and not(exists(jn:previous($status)))
  order by $dateTimeCreated
  return $status
return {"revision": sdb:revision($foundStatus), $foundStatus{text}}
```

**Have a look at Sebastian's thesis [Separating Key Concernsin Query Processing](http://wwwlgis.informatik.uni-kl.de/cms/fileadmin/publications/2013/Dissertation-Baechle.pdf)**

He worked under **supervision of Theo Härder, who invented ACID transactions 👌**

## 👾 Think about how to scale SirixDB horizontally

I've thought about it and would love to distribute the transaction log with **[Apache BookKeeper](https://bookkeeper.apache.org/)** or **[Apache Pulsar](https://pulsar.apache.org/)** (which uses Apache BookKeeper). It might have some advantages in comparison to Apache Kafka.

## ❤️ Happy coding
So, there's plenty of stuff to work on. It's a super diverse field. I deliberately want to invite beginners to work on things as I'm a frontend beginner, for instance, and I have not much knowledge about query optimizers. However, I'm more than eager to learn. 👋

**I hope the project is useful for some of you, and I even got a lot of contributions since the last Hacktoberfest after years of working alone; that's simply awesome. Thank you so much 😎**

**If you like the project, you might share it on twitter and spread the word!? 🙈**

**Contribute on [GitHub SirixDB](https://github.com/sirixdb/sirix) and [GitHub SirixDB Web Frontend](https://github.com/sirixdb/sirix-svelte-frontend)** 💚

Have a nice day and a great *#Hacktoberfest*
Johannes