{"id":23217353,"url":"https://github.com/narma/zio-cassandra","last_synced_at":"2025-10-19T14:20:51.041Z","repository":{"id":42615892,"uuid":"469855886","full_name":"narma/zio-cassandra","owner":"narma","description":"Asynchronous lightweight ZIO wrapper under datastax cassandra 4.x driver with doobie-like syntax ","archived":false,"fork":false,"pushed_at":"2023-07-11T10:20:35.000Z","size":214,"stargazers_count":7,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-08-15T16:50:43.375Z","etag":null,"topics":["cassandra","cql","zio"],"latest_commit_sha":null,"homepage":"","language":"Scala","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"jsfwa/zio-cassandra","license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/narma.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":"2022-03-14T18:21:19.000Z","updated_at":"2024-06-03T09:28:01.000Z","dependencies_parsed_at":"2023-01-14T11:00:40.990Z","dependency_job_id":null,"html_url":"https://github.com/narma/zio-cassandra","commit_stats":null,"previous_names":[],"tags_count":31,"template":false,"template_full_name":null,"purl":"pkg:github/narma/zio-cassandra","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/narma%2Fzio-cassandra","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/narma%2Fzio-cassandra/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/narma%2Fzio-cassandra/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/narma%2Fzio-cassandra/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/narma","download_url":"https://codeload.github.com/narma/zio-cassandra/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/narma%2Fzio-cassandra/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":271121758,"owners_count":24702870,"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","status":"online","status_checked_at":"2025-08-19T02:00:09.176Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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","cql","zio"],"created_at":"2024-12-18T20:47:55.553Z","updated_at":"2025-10-19T14:20:45.990Z","avatar_url":"https://github.com/narma.png","language":"Scala","funding_links":[],"categories":[],"sub_categories":[],"readme":"# zio-cassandra\n\n[![Release Artifacts][Badge-SonatypeReleases]][Link-SonatypeReleases] [![Snapshot Artifacts][Badge-SonatypeSnapshots]][Link-SonatypeSnapshots]\n\n![Scala 3, 2.13](https://img.shields.io/badge/Scala-3%2C%202.13-green)\n\n[Link-SonatypeReleases]: https://oss.sonatype.org/content/repositories/releases/st/alzo/zio-cassandra_3/ \"Sonatype Releases\"\n[Link-SonatypeSnapshots]: https://s01.oss.sonatype.org/content/repositories/snapshots/st/alzo/zio-cassandra_3/ \"Sonatype Snapshots\"\n[Badge-SonatypeReleases]: https://img.shields.io/nexus/r/https/s01.oss.sonatype.org/st.alzo/zio-cassandra_3.svg \"Sonatype Releases\"\n[Badge-SonatypeSnapshots]: https://img.shields.io/nexus/s/https/s01.oss.sonatype.org/st.alzo/zio-cassandra_3.svg \"Sonatype Snapshots\"\n\nThis is lightweight ZIO wrapper for latest datastax 4.x driver.\n\nInspired by [akka/alpakka-cassandra](https://doc.akka.io/docs/alpakka/current/cassandra.html)\nCQL ported from [ringcentral/cassandra4io](https://github.com/ringcentral/cassandra4io)\n\n\n## Usage\n\n#### Dependency:\n```scala\nlibraryDependencies += \"st.alzo\" %% \"zio-cassandra\" % zioCassandra\n```\n\n### Create a connection to Cassandra\n```scala\nimport zio.cassandra.session.Session\n\nimport com.datastax.oss.driver.api.core.CqlSession\n\nimport java.net.InetSocketAddress\n\nval builder = CqlSession\n      .builder()\n      .addContactPoint(InetSocketAddress.createUnresolved(\"localhost\", 9042))\n      .withLocalDatacenter(\"datacenter1\")\n      .withKeyspace(\"awesome\") \n\nval session = Session.make(builder)\n```\n\n## Work with CQL interpolator\n\nGently ported from [cassadnra4io](https://github.com/ringcentral/cassandra4io) cql\npackage `zio.cassandra.session.cql` introduces typed way to deal with cql queries:\n\n### Simple syntax\n\nThis syntax reuse implicit driver prepared statements cache\n\n```scala\nimport com.datastax.oss.driver.api.core.ConsistencyLevel\nimport zio.cassandra.session.Session\nimport zio.cassandra.session.cql._\nimport zio._\n\ncase class Model(id: Int, data: String)\n\ntrait Service {\n  def put(value: Model): Task[Unit]\n  def get(id: Int): Task[Option[Model]]\n}\n\nclass ServiceImpl(session: Session) extends Service {\n\n  private def insertQuery(value: Model) =\n    cql\"insert into table (id, data) values (${value.id}, ${value.data})\"\n      .config(_.setConsistencyLevel(ConsistencyLevel.ALL))\n\n  private def selectQuery(id: Int) =\n    cql\"select id, data from table where id = $id\".as[Model]\n\n  override def put(value: Model) = insertQuery(value).execute.unit.provide(ZLayer.succeed(session))\n  override def get(id: Int) = selectQuery(id).selectFirst.provideSome(ZLayer.succeed(session))\n\n  // alternatively, to avoid providing environment each time\n  def insert(value: Model) = session.execute(insertQuery(value)).unit\n  def select(id: Int) = session.selectFirst(selectQuery(id))\n\n}\n```\n\n## User Defined Type (UDT) support\n\nzio.cassandra.cql provides support for Cassandra's User Defined Type (UDT) values.\nFor example, given the following Cassandra schema:\n\n```cql\ncreate type basic_info(\n    weight double,\n    height text,\n    datapoints frozen\u003cset\u003cint\u003e\u003e\n);\n\ncreate table person_attributes(\n    person_id int,\n    info frozen\u003cbasic_info\u003e,\n    PRIMARY KEY (person_id)\n);\n```\n\n**Note:** `frozen` means immutable\n\nHere is how to insert and select data from the `person_attributes` table:\n\n```scala\nimport zio._\nimport zio.cassandra.session.Session\nimport zio.cassandra.session.cql._\nimport zio.stream._\n\n\nfinal case class BasicInfo(weight: Double, height: String, datapoints: Set[Int])\nfinal case class PersonAttribute(personId: Int, info: BasicInfo)\n\n\nclass UDTUsageExample {\n  val data = PersonAttribute(1, BasicInfo(180.0, \"tall\", Set(1, 2, 3, 4, 5)))\n  val insert: RIO[Session, Boolean] =\n    cql\"INSERT INTO cassandra4io.person_attributes (person_id, info) VALUES (${data.personId}, ${data.info})\"\n            .execute\n\n  val retrieve: ZStream[Session, Throwable, PersonAttribute] = \n    cql\"SELECT person_id, info FROM cassandra4io.person_attributes WHERE person_id = ${data.personId}\"\n            .as[PersonAttribute]\n            .select\n}\n```\n\n### More control over the transformation process of `UdtValue`s\n\nIf you wanted to have additional control into how you map data-types to and from Cassandra rather than using `UdtReads`\n\u0026 `UdtWrites`, we expose the Datastax Java driver API to you for full control. Here is an example using `BasicInfo`:\n\n```scala\nimport com.datastax.oss.driver.api.core.data.UdtValue\nimport zio.cassandra.session.cql.Binder\nimport zio.cassandra.session.cql.codec.{ UdtReads, UdtWrites }\n\nimport scala.jdk.CollectionConverters.{ SetHasAsJava, SetHasAsScala }\n\nfinal case class BasicInfo(weight: Double, height: String, datapoints: Set[Int])\n\nobject BasicInfo {\n\n  implicit val basicInfoUdtReads: UdtReads[BasicInfo] = UdtReads.instance { udtValue =\u003e\n    BasicInfo(\n      weight = udtValue.getDouble(\"weight\"),\n      height = udtValue.getString(\"height\"),\n      datapoints = udtValue\n        .getSet[java.lang.Integer](\"datapoints\", classOf[java.lang.Integer])\n        .asScala\n        .toSet\n        .map { int: java.lang.Integer =\u003e Int.unbox(int) }\n    )\n  }\n\n  implicit val basicInfoUdtWrites: UdtWrites[BasicInfo] = UdtWrites.instance { (info, constructor) =\u003e\n    constructor\n      .setDouble(\"weight\", info.weight)\n      .setString(\"height\", info.height)\n      .setSet(\"datapoints\", info.datapoints.map(Int.box).asJava, classOf[java.lang.Integer])\n  }\n\n  // just an example, will be derived automatically from UdtWrites[BasicInfo]\n  implicit val cqlBinder: Binder[BasicInfo] = Binder[UdtValue].contramapUDT { (info, constructor) =\u003e\n    constructor\n      .newValue()\n      .setDouble(\"weight\", info.weight)\n      .setString(\"height\", info.height)\n      .setSet(\"datapoints\", info.datapoints.map(Int.box).asJava, classOf[java.lang.Integer])\n  }\n\n}\n\nfinal case class CompactedInfo(weight: Double, height: String)\n\nobject CompactedInfo {\n\n  implicit val compactedInfoUdtReads: UdtReads[CompactedInfo] =\n    UdtReads[BasicInfo].map(basicInfo =\u003e CompactedInfo(basicInfo.weight, basicInfo.height))\n\n  implicit val compactedInfoUdtWrites: UdtWrites[CompactedInfo] =\n    UdtWrites[BasicInfo].contramap(compactedInfo =\u003e BasicInfo(compactedInfo.weight, compactedInfo.height, Set.empty))\n\n}\n```\n\n\n### Raw API without cql\n```scala\n  import zio._\n  import zio.cassandra.session.Session\n\n// Use:\n  val job = for {\n    session  \u003c- ZIO.service[Session]\n    _        \u003c- session.execute(\"insert ...\")\n    prepared \u003c- session.prepare(\"select ...\")\n    select   \u003c- ZIO.attempt(prepared.bind(1, 2))\n    row      \u003c- session.selectFirst(select)\n  } yield row\n\n  job.provideLayer(ZLayer.scoped(Session.live))\n\n```\n\n\n## References\n- [Datastax Java driver](https://docs.datastax.com/en/developer/java-driver/latest/manual/core/)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnarma%2Fzio-cassandra","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnarma%2Fzio-cassandra","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnarma%2Fzio-cassandra/lists"}