Collections

PHP Driver supports all Cassandra collections

Background

Given
a running Cassandra cluster

Using Cassandra collections

Given
the following schema:
CREATE KEYSPACE simplex WITH replication = {
  'class': 'SimpleStrategy',
  'replication_factor': 1
};
USE simplex;
CREATE TABLE user (
  id int PRIMARY KEY,
  logins list<timestamp>,
  locations map<timestamp, double>,
  ip_addresses set<inet>
);
INSERT INTO user (id, logins, locations, ip_addresses)
VALUES (
  0,
  ['2014-09-11 10:09:08+0000', '2014-09-12 10:09:00+0000'],
  {'2014-09-11 10:09:08+0000': 37.397357},
  {'200.199.198.197', '192.168.1.15'}
)
And
the following example:
<?php
$cluster   = Cassandra::cluster()
               ->withContactPoints('127.0.0.1')
               ->build();
$session   = $cluster->connect("simplex");
$statement = new Cassandra\SimpleStatement("SELECT * FROM user");
$result    = $session->execute($statement);
$row       = $result->first();

echo "Logins: " . var_export($row['logins'], true) . "\n";
echo "Locations: " . var_export($row['locations'], true) . "\n";
echo "Ip Addresses: " . var_export($row['ip_addresses'], true) . "\n";
When
it is executed
Then
its output should contain:
Logins: Cassandra\Collection::__set_state(array(
   'type' =>
  Cassandra\Type\Collection::__set_state(array(
     'valueType' =>
    Cassandra\Type\Scalar::__set_state(array(
       'name' => 'timestamp',
    )),
  )),
   'values' =>
  array (
    0 =>
    Cassandra\Timestamp::__set_state(array(
       'type' =>
      Cassandra\Type\Scalar::__set_state(array(
         'name' => 'timestamp',
      )),
       'seconds' => 1410430148,
       'microseconds' => 0,
    )),
    1 =>
    Cassandra\Timestamp::__set_state(array(
       'type' =>
      Cassandra\Type\Scalar::__set_state(array(
         'name' => 'timestamp',
      )),
       'seconds' => 1410516540,
       'microseconds' => 0,
    )),
  ),
))
Locations: Cassandra\Map::__set_state(array(
   'type' =>
  Cassandra\Type\Map::__set_state(array(
     'keyType' =>
    Cassandra\Type\Scalar::__set_state(array(
       'name' => 'timestamp',
    )),
     'valueType' =>
    Cassandra\Type\Scalar::__set_state(array(
       'name' => 'double',
    )),
  )),
   'keys' =>
  array (
    0 =>
    Cassandra\Timestamp::__set_state(array(
       'type' =>
      Cassandra\Type\Scalar::__set_state(array(
         'name' => 'timestamp',
      )),
       'seconds' => 1410430148,
       'microseconds' => 0,
    )),
  ),
   'values' =>
  array (
    0 => 37.397357,
  ),
))
Ip Addresses: Cassandra\Set::__set_state(array(
   'type' =>
  Cassandra\Type\Set::__set_state(array(
     'valueType' =>
    Cassandra\Type\Scalar::__set_state(array(
       'name' => 'inet',
    )),
  )),
   'values' =>
  array (
    0 =>
    Cassandra\Inet::__set_state(array(
       'type' =>
      Cassandra\Type\Scalar::__set_state(array(
         'name' => 'inet',
      )),
       'address' => '192.168.1.15',
    )),
    1 =>
    Cassandra\Inet::__set_state(array(
       'type' =>
      Cassandra\Type\Scalar::__set_state(array(
         'name' => 'inet',
      )),
       'address' => '200.199.198.197',
    )),
  ),
))
since cassadra v2.1

Using Cassandra nested collections

Given
the following schema:
CREATE KEYSPACE simplex WITH replication = {
  'class': 'SimpleStrategy',
  'replication_factor': 1
};
USE simplex;
CREATE TABLE users (
  id uuid PRIMARY KEY,
  name text,
  addresses map<text, frozen<map<text, text>>>
);
And
the following example:
<?php
$cluster   = Cassandra::cluster()
               ->withContactPoints('127.0.0.1')
               ->build();
$session   = $cluster->connect("simplex");
$statement = new Cassandra\SimpleStatement(
                "INSERT INTO users (id, name, addresses) VALUES (?, ?, ?)");

$addressType = Cassandra\Type::map(Cassandra\Type::text(), Cassandra\Type::text());
$addressesType = Cassandra\Type::map(Cassandra\Type::text(), $addressType);

$users = array(
    array(
        new Cassandra\Uuid('56357d2b-4586-433c-ad24-afa9918bc415'),
        'Charles Wallace',
        $addressesType->create(
            'home', $addressType->create(
                'city', 'Phoenix',
                'street', '9042 Cassandra Lane',
                'zip', '85023'))
    ),
    array(
        new Cassandra\Uuid('ce359590-8528-4682-a9f3-add53fc9aa09'),
        'Kevin Malone',
        $addressesType->create(
            'home', $addressType->create(
                'city', 'New York',
                'street', '1000 Database Road',
                'zip', '10025')
        )
    ),
    array(
        new Cassandra\Uuid('7d64dca1-dd4d-4f3c-bec4-6a88fa082a13'),
        'Michael Scott',
        $addressesType->create(
            'work', $addressType->create(
                'city', 'Santa Clara',
                'street', '20000 Log Ave',
                'zip', '95054'))
    )
);

foreach ($users as $user) {
  $options = new Cassandra\ExecutionOptions(array('arguments' => $user));
  $session->execute($statement, $options);
}

$statement = new Cassandra\SimpleStatement("SELECT * FROM users");
$result    = $session->execute($statement);

foreach ($result as $row) {
    print 'ID: ' . $row['id'] . "\n";
    print 'Name: ' . $row['name'] . "\n";
    print 'Addresses: ' . var_export($row['addresses'], true). "\n";
}
When
it is executed
Then
its output should contain:
ID: 56357d2b-4586-433c-ad24-afa9918bc415
Name: Charles Wallace
Addresses: Cassandra\Map::__set_state(array(
   'type' =>
  Cassandra\Type\Map::__set_state(array(
     'keyType' =>
    Cassandra\Type\Scalar::__set_state(array(
       'name' => 'varchar',
    )),
     'valueType' =>
    Cassandra\Type\Map::__set_state(array(
       'keyType' =>
      Cassandra\Type\Scalar::__set_state(array(
         'name' => 'varchar',
      )),
       'valueType' =>
      Cassandra\Type\Scalar::__set_state(array(
         'name' => 'varchar',
      )),
    )),
  )),
   'keys' =>
  array (
    0 => 'home',
  ),
   'values' =>
  array (
    0 =>
    Cassandra\Map::__set_state(array(
       'type' =>
      Cassandra\Type\Map::__set_state(array(
         'keyType' =>
        Cassandra\Type\Scalar::__set_state(array(
           'name' => 'varchar',
        )),
         'valueType' =>
        Cassandra\Type\Scalar::__set_state(array(
           'name' => 'varchar',
        )),
      )),
       'keys' =>
      array (
        0 => 'city',
        1 => 'street',
        2 => 'zip',
      ),
       'values' =>
      array (
        0 => '85023',
        1 => '9042 Cassandra Lane',
        2 => 'Phoenix',
      ),
    )),
  ),
))
ID: ce359590-8528-4682-a9f3-add53fc9aa09
Name: Kevin Malone
Addresses: Cassandra\Map::__set_state(array(
   'type' =>
  Cassandra\Type\Map::__set_state(array(
     'keyType' =>
    Cassandra\Type\Scalar::__set_state(array(
       'name' => 'varchar',
    )),
     'valueType' =>
    Cassandra\Type\Map::__set_state(array(
       'keyType' =>
      Cassandra\Type\Scalar::__set_state(array(
         'name' => 'varchar',
      )),
       'valueType' =>
      Cassandra\Type\Scalar::__set_state(array(
         'name' => 'varchar',
      )),
    )),
  )),
   'keys' =>
  array (
    0 => 'home',
  ),
   'values' =>
  array (
    0 =>
    Cassandra\Map::__set_state(array(
       'type' =>
      Cassandra\Type\Map::__set_state(array(
         'keyType' =>
        Cassandra\Type\Scalar::__set_state(array(
           'name' => 'varchar',
        )),
         'valueType' =>
        Cassandra\Type\Scalar::__set_state(array(
           'name' => 'varchar',
        )),
      )),
       'keys' =>
      array (
        0 => 'city',
        1 => 'street',
        2 => 'zip',
      ),
       'values' =>
      array (
        0 => '1000 Database Road',
        1 => '10025',
        2 => 'New York',
      ),
    )),
  ),
))
ID: 7d64dca1-dd4d-4f3c-bec4-6a88fa082a13
Name: Michael Scott
Addresses: Cassandra\Map::__set_state(array(
   'type' =>
  Cassandra\Type\Map::__set_state(array(
     'keyType' =>
    Cassandra\Type\Scalar::__set_state(array(
       'name' => 'varchar',
    )),
     'valueType' =>
    Cassandra\Type\Map::__set_state(array(
       'keyType' =>
      Cassandra\Type\Scalar::__set_state(array(
         'name' => 'varchar',
      )),
       'valueType' =>
      Cassandra\Type\Scalar::__set_state(array(
         'name' => 'varchar',
      )),
    )),
  )),
   'keys' =>
  array (
    0 => 'work',
  ),
   'values' =>
  array (
    0 =>
    Cassandra\Map::__set_state(array(
       'type' =>
      Cassandra\Type\Map::__set_state(array(
         'keyType' =>
        Cassandra\Type\Scalar::__set_state(array(
           'name' => 'varchar',
        )),
         'valueType' =>
        Cassandra\Type\Scalar::__set_state(array(
           'name' => 'varchar',
        )),
      )),
       'keys' =>
      array (
        0 => 'city',
        1 => 'street',
        2 => 'zip',
      ),
       'values' =>
      array (
        0 => '20000 Log Ave',
        1 => '95054',
        2 => 'Santa Clara',
      ),
    )),
  ),
))