atais / scassandra   0.1.0

GitHub

Cassandra Datastax Driver - Scala Integration

Cassandra Datastax Driver - Scala Integration

The project is based on numerous articles touching upon the topic of integration Cassandra Datastax driver with Scala. I was fed up copy-pasting those extra classes into all my projects. This is an open-source solution to that problem.

The integration is divided into two parts.

Requirements

Minimal supported cassandra-driver-core version is 3.2.0.
Previous versions were based on guava 16.0.1 which was really difficult to use.

Cassandra Scala Integration

Project cassandra-scala allows for easier cassandra operations providing with CQL.

Add import com.github.atais.cassandra.ScalaIntegration._ to use it.

Example usage:

implicit protected val session: com.datastax.driver.core.Session
implicit protected val executor: java.util.concurrent.Executor

val selectCQL: ListenableFuture[PreparedStatement] = cql"SELECT * FROM $table WHERE key = ?"
val result: ListenableFuture[ResultSet] = execute(selectCQL, "my-key")

result.map(rs => rs.one())
      .map(...)

Available methods description:

cql

Asynchronously create PreparedStatement for later reuse.

cql"SELECT * FROM $table WHERE key = ?"

execute

Asynchronously execute PreparedStatement passing parameters.

ScalaIntegration.execute(cql"SELECT * FROM $table WHERE key = ?", "testValue")

ListenableFuture Scala Integration

Project listenable-future-scala allows for Scala-like handling of ListenableFuture.

Add import com.github.atais.listenablefuture.ListenableFutureScala._ to use it.

Available methods description:

map

Futures.immediateFuture("abc")
       .map(text => text.length)
       .map(i    => i + 1)

flatMap

Futures.immediateFuture("abc")
       .flatMap(text => Futures.immediateFuture(text.length))
       .flatMap(i    => Futures.immediateCancelledFuture())

for-comprehension support

for {
  text   <- Futures.immediateFuture("abc")
  number <- Futures.immediateFuture(123)
} yield {
  text + number
}

recover

scala.concurrent.Future uses PartialFunction to handle recover cases, however it is not possible with Guava. Instead one has to pass the Throwable class as function parameter matching with handling function.

Futures.immediateFuture("abc")
       .map(_ => throw new UnsupportedOperationException)
       .recover[UnsupportedOperationException] {
         _: UnsupportedOperationException => "it's fine"
       }

recoverWith

Has to be used similarly to recover, however function T => ListenableFuture[A] has to be provided.

Futures.immediateFuture("abc")
       .map(_ => throw new UnsupportedOperationException)
       .recoverWith[UnsupportedOperationException] {
         _: UnsupportedOperationException => Futures.immediateFuture("it's fine")
       }

future

Converts to scala.concurrent.Future

Futures.immediateFuture("abc")
       .future

License

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.