Polidoro - Scala sugar on top of the Astyanax java client for Cassandra in the style of Cascal.
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.



Polidoro was the son of Astyanax.

As far as this repo goes Polidoro is a Cassandra client written in Scala. It is a light sugar over Astyanax in the style of Cascal.


  • Simple data model with support for Composite columns
  • Direct access to Astyanax for complex tasks

API Docs

Overview of Use

To use Polidoro you create a class or classes that model your family groups (those column families in the same keyspace). Family groups are contained in a CassConnector which holds the Astyanax context. From there you create your data columns as needed for insert or delete. You can use a TestableCassConnector to set up your connection for spawning a daemonized Cassandra instance for testing with specs2.

The tests set up in the repo demonstrate a connector (SpotAsty) with a family group (DemonstrationFG) along with the setup needed for testing (csh.testing.DemoClusterLoader, csh.testing.keyspaces.Demonstration)

Data Model

(Use import com.spotright.polidoro.model._ to enable code below.)

Polidoro uses the data model put forward by Cascal. A column path is created using the '' operator.

val col = cfPeople \ "Lanny Ripple" \ ("state", "TX")

Composite constructs are supported at the key and columnname level

import CompositeFactory.CF
val col = scfUsers \ "Ripple" \ (CF("Lanny", "state"), "TX")

Once you have enough of a column path to operate on you can call various methods to get, list, or mutate. Getting a value (returning an Option[cna.model.Column[N]]) and listing (returning a cna.model.ColumnList[N]) are straightforward

val maybeCol = (cfPeople \ "Lanny Ripple" \ "state").get


import com.spotright.polidoro.serialization._
val cols = (scfUsers \ "Ripple") listWith CompStr2.serdes

As an aside Astyanax cares about the key, column name, and value types. These have consistently been named K, N, and V respectively in the Polidoro code.

For mutation the simplest way is to use csh.model case classes that descend from Operation and then batch the results.

val ops = List(
  Insert(cfPeople \ "Dave Angulo" \ ("state", "CO"),
  Delete(cfPeople \ "Dave Angulo" \ "status"),
  IncrCounter(cfCounters \ "typos" \ ("colnames", 1L)),
  IncrCounter(cfCounters \ "typos" \ ("keys", 1L))


Mutation is supported directly on columns (see csh.model.ColumnPath) but in practice we find it simpler to batch().