Executing queries asynchronously

Session objects support asynchronous statement execution using Cassandra::Session#execute_async method. This method returns a Cassandra::Future<Cassandra::Result>.

Background

Given
a running cassandra cluster with schema:
CREATE KEYSPACE simplex WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 3};
USE simplex;
CREATE TABLE songs (
  id uuid PRIMARY KEY,
  title text,
  album text,
  artist text,
  tags set<text>,
  data blob
);
INSERT INTO songs (id, title, album, artist, tags)
VALUES (
   756716f7-2e54-4715-9f00-91dcbea6cf50,
   'La Petite Tonkinoise',
   'Bye Bye Blackbird',
   'Joséphine Baker',
   {'jazz', '2013'})
;
INSERT INTO songs (id, title, album, artist, tags)
VALUES (
   f6071e72-48ec-4fcb-bf3e-379c8a696488,
   'Die Mösch',
   'In Gold',
   'Willi Ostermann',
   {'kölsch', '1996', 'birds'}
);
INSERT INTO songs (id, title, album, artist, tags)
VALUES (
   fbdf82ed-0063-4796-9c7c-a3d4f47b4b25,
   'Memo From Turner',
   'Performance',
   'Mick Jager',
   {'soundtrack', '1991'}
);

Listening for future

Given
the following example:
require 'cassandra'

cluster = Cassandra.cluster
session = cluster.connect("simplex")
future  = session.execute_async("SELECT * FROM songs")

future.on_success do |rows|
  rows.each do |row|
    puts "#{row["artist"]}: #{row["title"]} / #{row["album"]}"
  end
end

puts "driver is fetching rows from cassandra"
future.join # block until the future has been resolved
When
it is executed
Then
its output should contain:
driver is fetching rows from cassandra
Joséphine Baker: La Petite Tonkinoise / Bye Bye Blackbird
Willi Ostermann: Die Mösch / In Gold
Mick Jager: Memo From Turner / Performance

Running queries in parallel

Given
the following example:
require 'cassandra'

cluster = Cassandra.cluster
session = cluster.connect("simplex")
count   = 10

puts "running #{count} queries in parallel"
futures = count.times.map { session.execute_async("SELECT * FROM songs") }

puts "resolving futures"

futures.each do |future|
  rows = future.get
  puts "fetched #{rows.size} rows"
end
When
it is executed
Then
its output should contain:
running 10 queries in parallel
resolving futures
fetched 3 rows
fetched 3 rows
fetched 3 rows
fetched 3 rows
fetched 3 rows
fetched 3 rows
fetched 3 rows
fetched 3 rows
fetched 3 rows
fetched 3 rows