1@cassandra-version-2.2
2Feature: User-defined Function (UDF) and Aggregate Metadata (UDA)
3
4  PHP Driver exposes the Cassandra Schema Metadata for UDFs and UDAs.
5
6  Background:
7    Given a running cassandra cluster
8    And the following schema:
9      """cql
10      CREATE KEYSPACE simplex WITH replication = {
11        'class': 'SimpleStrategy',
12        'replication_factor': 1
13      } AND DURABLE_WRITES = false;
14      USE simplex;
15      CREATE OR REPLACE FUNCTION fLog (input double) CALLED ON NULL INPUT RETURNS double LANGUAGE java AS 'return Double.valueOf(Math.log(input.doubleValue()));';
16      CREATE OR REPLACE FUNCTION avgState ( state tuple<int,bigint>, val int ) CALLED ON NULL INPUT RETURNS tuple<int,bigint> LANGUAGE java AS 'if (val !=null) { state.setInt(0, state.getInt(0)+1); state.setLong(1, state.getLong(1)+val.intValue()); } return state;';
17      CREATE OR REPLACE FUNCTION avgFinal ( state tuple<int,bigint> ) CALLED ON NULL INPUT RETURNS double LANGUAGE java AS 'double r = 0; if (state.getInt(0) == 0) return null; r = state.getLong(1); r/= state.getInt(0); return Double.valueOf(r);';
18      CREATE AGGREGATE IF NOT EXISTS average ( int ) SFUNC avgState STYPE tuple<int,bigint> FINALFUNC avgFinal INITCOND (0,0);
19      """
20
21  Scenario: Getting a function's metadata
22    Given the following example:
23      """php
24      <?php
25      $cluster = Cassandra::cluster()
26                        ->withContactPoints('127.0.0.1')
27                        ->build();
28      $session = $cluster->connect("simplex");
29      $schema = $session->schema();
30
31      $function = $schema->keyspace("simplex")->function("flog", Cassandra\Type::double());
32
33      echo "Name: " . $function->simpleName() . "\n";
34      echo "Signature: " . $function->signature() . "\n";
35      echo "Language: " . $function->language() . "\n";
36      echo "Body: " . $function->body() . "\n";
37      echo "Arguments: " . var_export($function->arguments(), true) . "\n";
38      echo "ReturnType: " . var_export($function->returnType(), true) . "\n";
39      echo "IsCalledOnNullInput: " . ($function->isCalledOnNullInput() ? "true" : "false") . "\n";
40      """
41    When it is executed
42    Then its output should contain:
43      """
44      Name: flog
45      Signature: flog(double)
46      Language: java
47      Body: return Double.valueOf(Math.log(input.doubleValue()));
48      Arguments: array (
49        'input' =>
50        Cassandra\Type\Scalar::__set_state(array(
51           'name' => 'double',
52        )),
53      )
54      ReturnType: Cassandra\Type\Scalar::__set_state(array(
55         'name' => 'double',
56      ))
57      IsCalledOnNullInput: true
58      """
59
60  @skip-ci
61  Scenario: Getting an aggregates's metadata
62    Given the following example:
63      """php
64      <?php
65      $cluster = Cassandra::cluster()
66                        ->withContactPoints('127.0.0.1')
67                        ->build();
68      $session = $cluster->connect("simplex");
69      $schema = $session->schema();
70
71      $aggregate = $schema->keyspace("simplex")->aggregate("average", Cassandra\Type::int());
72
73      echo "Name: " . $aggregate->simpleName() . "\n";
74      echo "Signature: " . $aggregate->signature() . "\n";
75      echo "ArgumentTypes: " . var_export($aggregate->argumentTypes(), true) . "\n";
76      echo "StateType: " . var_export($aggregate->stateType(), true) . "\n";
77      echo "ReturnType: " . var_export($aggregate->returnType(), true) . "\n";
78      echo "InitialCondition: " . var_export($aggregate->initialCondition(), true) . "\n";
79      echo "StateFunction: " .  $aggregate->stateFunction()->signature() . "\n";
80      echo "FinalFunction: " .  $aggregate->finalFunction()->signature() . "\n";
81      """
82    When it is executed
83    Then its output should contain:
84      """
85      Name: average
86      Signature: average(int)
87      ArgumentTypes: array (
88        0 =>
89        Cassandra\Type\Scalar::__set_state(array(
90           'name' => 'int',
91        )),
92      )
93      StateType: Cassandra\Type\Tuple::__set_state(array(
94         'types' =>
95        array (
96          0 =>
97          Cassandra\Type\Scalar::__set_state(array(
98             'name' => 'int',
99          )),
100          1 =>
101          Cassandra\Type\Scalar::__set_state(array(
102             'name' => 'bigint',
103          )),
104        ),
105      ))
106      ReturnType: Cassandra\Type\Scalar::__set_state(array(
107         'name' => 'double',
108      ))
109      InitialCondition: Cassandra\Tuple::__set_state(array(
110         'type' =>
111        Cassandra\Type\Tuple::__set_state(array(
112           'types' =>
113          array (
114            0 =>
115            Cassandra\Type\Scalar::__set_state(array(
116               'name' => 'int',
117            )),
118            1 =>
119            Cassandra\Type\Scalar::__set_state(array(
120               'name' => 'bigint',
121            )),
122          ),
123        )),
124         'values' =>
125        array (
126          0 => 0,
127          1 =>
128          Cassandra\Bigint::__set_state(array(
129             'type' =>
130            Cassandra\Type\Scalar::__set_state(array(
131               'name' => 'bigint',
132            )),
133             'value' => '0',
134          )),
135        ),
136      ))
137      StateFunction: avgstate(frozen<tuple<int,bigint>>,int)
138      FinalFunction: avgfinal(frozen<tuple<int,bigint>>)
139      """
140