Working on a Versioned, Temporal NoSQL Document Store During Hacktoberfest 👩‍💻👨‍💻
Tags: hacktoberfest, contributorswanted, help
Published: 2019-10-01 11:39:12

# SirixDB - A versioned NoSQL data store for XML and JSON 🦁

## Feel free to contribute on **[GitHub](https://github.com/sirixdb/sirix)** 💚

Hi all,

**there's plenty of possibilties to work on a versioned document store, which preserves every revision of your data in a space-efficient manner. 🐬** 

[SirixDB](https://sirix.io) basically only stores changes between revisions, but any revison 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 just started 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 instance via a distributed log ([Apache BookKeeper?!](https://bookkeeper.apache.org/)) 😃

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

With the help of the community I just started a web frontend based on [Vue.js](https://vuejs.org), TypeScript and in the future [D3.js](https://d3js.org) a couple of days ago.

{% github sirixdb/sirix-web-frontend %}

There are a few issues I created, but basically we start completely from scratch, so we can use the best technologies which fit our needs:

[Issues for the frontend gathered in our Community Forum](https://sirix.discourse.group/t/working-on-issues-for-hacktoberfest/42/4)

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 %}

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

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

OAuth2 authorization code flow:

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

Try to create a native image with the GraalVM (however Java 11 or soon 13 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 %}

Maybe we can even convert the sirix-xquery bundle to Kotlin, as it provides a more high level API. That said, I'd love to change some things regarding the API:

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

## 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 plently of optimization potential here, as we currently don't take any storage inherent optimizations into account 👍

**This will increase the performance of certain 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 bit:array-values($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 horizontally scale SirixDB

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' a super diverse field. For sure beginners are invited to work on stuff as I'm myself a Frontend beginner for instance and I have not too 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 my first contributions after years of working alone, that's simply awesome. Thank you so much 😎**

**And if you like the project you might share it on twitter and so and and spread the word!? 🙈**

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

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