{"id":15056886,"url":"https://github.com/lmangani/gun-cassandra","last_synced_at":"2025-07-04T03:32:40.284Z","repository":{"id":57259719,"uuid":"116714363","full_name":"lmangani/gun-cassandra","owner":"lmangani","description":"Cassandra / Elassandra persistence layer for Gun DB :gun:","archived":false,"fork":false,"pushed_at":"2018-06-28T19:13:15.000Z","size":27,"stargazers_count":13,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-04-10T05:03:21.389Z","etag":null,"topics":["cassandra","cassandra-persistence-layer","cql","elassandra","elasticsearch","graph","gun","gun-cassandra","gundb","storage-engine"],"latest_commit_sha":null,"homepage":"http://qxip.net","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lmangani.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}},"created_at":"2018-01-08T18:45:03.000Z","updated_at":"2025-01-23T14:19:06.000Z","dependencies_parsed_at":"2022-08-24T23:01:56.855Z","dependency_job_id":null,"html_url":"https://github.com/lmangani/gun-cassandra","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/lmangani/gun-cassandra","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lmangani%2Fgun-cassandra","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lmangani%2Fgun-cassandra/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lmangani%2Fgun-cassandra/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lmangani%2Fgun-cassandra/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lmangani","download_url":"https://codeload.github.com/lmangani/gun-cassandra/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lmangani%2Fgun-cassandra/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":263440445,"owners_count":23466931,"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":["cassandra","cassandra-persistence-layer","cql","elassandra","elasticsearch","graph","gun","gun-cassandra","gundb","storage-engine"],"created_at":"2024-09-24T21:57:43.196Z","updated_at":"2025-07-04T03:32:40.239Z","avatar_url":"https://github.com/lmangani.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp\u003e\n    \u003ca href=\"http://gun.js.org/\"\u003e\u003cimg width=\"25%\" src=\"https://cldup.com/TEy9yGh45l.svg\"/\u003e\u003c/a\u003e\n\u003c/p\u003e \n\n# Gun-Cassandra\nCQL/Cassandra native persistence layer for [gun](https://github.com/amark/gun)\n\n[GUN](https://github.com/amark/gun) is a realtime, distributed, offline-first, graph database engine.\n\n### THIS IS EXPERIMENTAL WORK IN PROGRESS! USE AT YOUR OWN RISK!\n#### Comments and PR/Contributions are super welcome!\n\n-------------\n\n### Installation\n\n`npm install gun-cassandra`\n\n### Usage\n\n```javascript\nvar Gun = require('gun');\nrequire('gun-cassandra');\n\nvar gun = Gun({\n  file: false // turn off pesky file.js data.json default\n  , db: {\n\tcontactPoints: ['127.0.0.1'], \n\tkeyspace: 'gun'\n  }\n});\n```\n\n### Fluffy's Test\nThe following script runs Fluffy's test successfully. Speed is ridicolously low when initializing keyspace and table.\u003cbr\u003e\n\n#### GUN -\u003e CQL \u003c- GUN\n```javascript\nvar cat = {name: \"Fluffy\", species: \"kitty\"};\nvar mark = {boss: cat};\ncat.slave = mark;\ngun.get('mark').put(mark);\n```\n```\ncqlsh\u003e SELECT * FROM gun_db.gun_data;\n\n soul                 | field   | relation             | state         | value\n----------------------+---------+----------------------+---------------+--------\n jccj3klhbH4laGweIBiP |    name |                      | 1515798170328 | Fluffy\n                 mark |    boss | jccj3klhbH4laGweIBiP | 1515798170328 |       \n jccj3klhbH4laGweIBiP |   slave |                 mark | 1515798170328 |       \n jccj3klhbH4laGweIBiP | species |                      | 1515798170328 |  kitty\n\n```\n```javascript\ngun.get('mark').get('boss').get('name').val(function(data, key){\n  // `val` grabs the data once, no subscriptions.\n  console.log(\"Mark's boss is\", data);\n});\n```\n##### Output:\n```\nMark's boss is Fluffy\n```\n\n#### CQL \u003c- GUN\n```\ncqlsh\u003e INSERT INTO gun_db.gun_data JSON '{ \"soul\": \"jcdkfchqWeSXR7dzFJdU\", \"field\": \"gender\", \"state\": 1515860865492, \"relation\": \"\", \"value\": \"male\"}';\n```\n```javascript\ngun.get('mark').get('boss').get('gender').val(function(data, key){\n   console.log(\"Mark's boss gender is\", data);\n   process.exit(0);\n});\n```\n##### Output:\n```\nMark's boss gender is male\n```\n\n##### Test Script\n```\n# nodejs test/simple.js \nHello wonderful person! :) Thanks for using GUN, feel free to ask for help on https://gitter.im/amark/gun and ask StackOverflow questions tagged with 'gun'!\n\u003e Cassandra Cluster connected!\n\u003e Gun-Cassandra Tables Ready!\n\u003e waiting 10 seconds...\nMark's boss is Fluffy\n\n## nodejs test/simple-read.js \nHello wonderful person! :) Thanks for using GUN, feel free to ask for help on https://gitter.im/amark/gun and ask StackOverflow questions tagged with 'gun'!\nreading from CQL...\nCassandra Cluster connected!\nGun-Cassandra Tables Ready!\nMark's boss is Fluffy\nBoss is a kitty\n```\n##### Cassandra Schema (SimpleStrategy)\n```\ncqlsh\u003e DESC KEYSPACE gun_db ;\n\nCREATE KEYSPACE gun_db WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'}  AND durable_writes = true;\n\nCREATE TABLE gun_db.gun_data (\n    soul text,\n    field text,\n    relation text,\n    state bigint,\n    value text,\n    PRIMARY KEY ((soul, field))\n) WITH bloom_filter_fp_chance = 0.01\n    AND caching = {'keys': 'ALL', 'rows_per_partition': 'NONE'}\n    AND comment = ''\n    AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4'}\n    AND compression = {'chunk_length_in_kb': '64', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'}\n    AND crc_check_chance = 1.0\n    AND dclocal_read_repair_chance = 0.1\n    AND default_time_to_live = 0\n    AND gc_grace_seconds = 864000\n    AND max_index_interval = 2048\n    AND memtable_flush_period_in_ms = 0\n    AND min_index_interval = 128\n    AND read_repair_chance = 0.0\n    AND speculative_retry = '99PERCENTILE';\n\n\n```\n##### Elassandra Schema (NetworkTopologyStrategy)\n```\ncqlsh\u003e ALTER KEYSPACE gun_db WITH REPLICATION = { 'class' : 'NetworkTopologyStrategy', 'DC1' : 1 } AND DURABLE_WRITES = true;\ncqlsh\u003e DESC KEYSPACE gun_db ;\n\nCREATE KEYSPACE gun_db WITH replication = {'class': 'NetworkTopologyStrategy', 'DC1': '1'}  AND durable_writes = true;\n\nCREATE TABLE gun_db.gun_data (\n    soul text,\n    field text,\n    relation text,\n    state bigint,\n    value text,\n    PRIMARY KEY ((soul, field))\n) WITH bloom_filter_fp_chance = 0.01\n    AND caching = {'keys': 'ALL', 'rows_per_partition': 'NONE'}\n    AND comment = ''\n    AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4'}\n    AND compression = {'chunk_length_in_kb': '64', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'}\n    AND crc_check_chance = 1.0\n    AND dclocal_read_repair_chance = 0.1\n    AND default_time_to_live = 0\n    AND gc_grace_seconds = 864000\n    AND max_index_interval = 2048\n    AND memtable_flush_period_in_ms = 0\n    AND min_index_interval = 128\n    AND read_repair_chance = 0.0\n    AND speculative_retry = '99PERCENTILE';\nCREATE CUSTOM INDEX elastic_gun_data_idx ON gun_db.gun_data () USING 'org.elassandra.index.ExtendedElasticSecondaryIndex';\n```\n--------------\n     \n### Changelog\n- 1.0.1 first version for gun 0.9.x based on node-db\n\n### TODO\n* [ ] Cleanup Gun\u003eCassandra insert logic\n* [ ] Docker Test Builders _(Cassandra 3.11, Elassandra 5.5.0.9)_\n* [ ] Modularize CQL queries _(named query in CassanKnex)_\n* [ ] Stress-Performance Test\n\n### Acknowledgement\n\nGun is open-sourced and copyrighted by Mark Nadal\n\nApache Cassandra, Apache Lucene, Apache, Lucene, Solr, TinkerPop, and Cassandra are trademarks of the Apache Software Foundation or its subsidiaries in Canada, the United States and/or other countries.\n\nBased on [vfs-gun-db](https://github.com/d3x0r/gun-db) by d3x0r\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flmangani%2Fgun-cassandra","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flmangani%2Fgun-cassandra","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flmangani%2Fgun-cassandra/lists"}