{"id":16380121,"url":"https://github.com/cavallium/cavalliumdbengine","last_synced_at":"2025-10-25T20:11:02.225Z","repository":{"id":38031643,"uuid":"319446524","full_name":"cavallium/CavalliumDBEngine","owner":"cavallium","description":"Reactive Database engine for Java with RocksDB and Lucene Core","archived":false,"fork":false,"pushed_at":"2025-02-24T18:44:30.000Z","size":3153,"stargazers_count":14,"open_issues_count":0,"forks_count":4,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-02-24T19:35:27.819Z","etag":null,"topics":["database","java","lucene","nosql","reactive","reactive-programming","reactive-streams","reactor","reactor-core","rocksdb","rocksdb-java","search","search-engine"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cavallium.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-12-07T21:16:46.000Z","updated_at":"2025-02-24T18:44:34.000Z","dependencies_parsed_at":"2024-05-28T00:16:10.234Z","dependency_job_id":"f8725975-6403-4681-8b0d-7a855d1d465a","html_url":"https://github.com/cavallium/CavalliumDBEngine","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cavallium%2FCavalliumDBEngine","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cavallium%2FCavalliumDBEngine/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cavallium%2FCavalliumDBEngine/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cavallium%2FCavalliumDBEngine/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cavallium","download_url":"https://codeload.github.com/cavallium/CavalliumDBEngine/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244099972,"owners_count":20398058,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["database","java","lucene","nosql","reactive","reactive-programming","reactive-streams","reactor","reactor-core","rocksdb","rocksdb-java","search","search-engine"],"created_at":"2024-10-11T03:50:29.828Z","updated_at":"2025-10-25T20:11:02.112Z","avatar_url":"https://github.com/cavallium.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# CavalliumDB Engine\n\n![Maven Package](https://github.com/Cavallium/CavalliumDBEngine/workflows/Maven%20Package/badge.svg)\n\n[Reactive](https://www.reactive-streams.org/) database engine written in Java (17+) using [Project Reactor](https://github.com/reactor/reactor-core).\n\n## DO NOT USE THIS PROJECT: THIS IS A PERSONAL PROJECT, THE API IS NOT STABLE, THE CODE IS NOT TESTED.\n\nThis library provides a basic reactive abstraction and implementation of a **key-value store** and a **search engine**.\n\nFour implementations exists out-of-the-box, two for the key-value store, two for the search engine, but it's possible to add more implementations.\n\n## Key-value store implementations \n\n1. [RocksDB](https://github.com/facebook/rocksdb): A persistent key-value store for flash storage\n3. [ConcurrentSkipListMap](https://docs.oracle.com/en/java/javase/16/docs/api/java.base/java/util/concurrent/ConcurrentSkipListMap.html): A concurrent in-memory key-value store\n\n## Search engine implementations\n\n1. Persistent [Lucene Core](https://github.com/apache/lucene) with custom sharding: Featureful and fast text search engine library\n2. In-memory temporary [Lucene Core](https://github.com/apache/lucene) instance: Useful for building and analyzing temporary indices\n\n## Extra features\n\n### Serializable search engine queries\n\nQueries can be serialized and deserialized using an efficient custom serialization format\n\n### Direct byte buffer\n\nThe database abstraction can avoid copying the data multiple times by using RocksDB JNI and Netty 5 buffers\n\n### Declarative data records generator and versioned codecs\n\nA data generator that generates [Java 16 records](https://www.baeldung.com/java-record-keyword) is available:\nit allows you to generate custom records by defining the fields using a .yaml file.\n\nThe generator also generates at compile time the source of specialized serializers,\ndeserializers, and upgraders, for each custom record.\n\nThe key-value store abstraction allows you to deserialize old versions of your data transparently, by using\nthe custom upgraders and the custom deserializers automatically.\n\nThe data generator can be found in the [Data generator](https://github.com/Cavallium/data-generator) repository.\n\n# Features\n- **RocksDB key-value store**\n  - Snapshots\n  - Multi-column database\n  - Write-ahead log and corruption recovery\n  - Multiple data types:\n    - Single value (Singleton)\n    - Map (Dictionary)\n    - Composable nested map (Deep dictionary)\n  - Customizable data serializers\n  - Values codecs\n  - Update-on-write value versioning using versioned codecs\n  \n- **Apache Lucene Core indexing library**\n  - Snapshots\n  - Documents structure\n  - Sorting\n    - Ascending and descending\n    - Numeric or non-numeric\n  - Searching\n    - Nested search terms\n    - Combined search terms\n    - Fuzzy text search\n    - Coordinates, integers, longs, strings, text\n  - Indicization and analysis\n    - N-gram\n    - Edge N-gram\n    - English words\n    - Stemming\n    - Stopwords removal\n  - Results filtering\n\n# F.A.Q.\n- **Why is it so difficult to use?**\n  \n  This is not a DBMS.\n  \n  This is an engine on which a DBMS can be built upon; for this reason it's very difficult to use directly without building another abstraction layer on top.\n  \n- **Can I use objects instead of byte arrays?**\n  \n  Yes, you must serialize/deserialize them using a library of your choice.\n  \n  CodecSerializer allows you to implement versioned data using a codec for each data version.\n  Note that it uses 1 to 4 bytes more for each value to store the version.\n  \n- **Why there is a snapshot function for each database part?**\n  \n  Since RocksDB and lucene indices are different libraries, you can't take a snapshot of every database atomically.\n  \n  An universal snapshot must be implemented as a collection of each database snapshot.\n  \n- **Is CavalliumDB Engine suitable for your project?**\n  \n  No.\n  \n  This engine is largely undocumented, and it doesn't provide extensive tests.\n\n# Examples\n\nIn `src/example/java` you can find some *(ugly)* examples.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcavallium%2Fcavalliumdbengine","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcavallium%2Fcavalliumdbengine","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcavallium%2Fcavalliumdbengine/lists"}