Я не могу увеличить счетчик Cassandra через библиотеку Datastax-PHP

У меня есть следующее семейство встречных столбцов:

CREATE TABLE subscription_counter (
subscription_id timeuuid,
amount counter,
PRIMARY KEY(subscription_id)
);

Когда в cqlsh и выполняется следующий запрос, он работает как задумано, и сумма увеличивается на 1.

UPDATE subscription_counter SET amount = amount + 1 WHERE subscription_id = 840e5f80-2fc7-11e5-9597-a1ae67be6e20

Однако из библиотеки Datastax-PHP (http://datastax.github.io/php-driver/) следующий запрос вызывает исключение.

$statement = $session->prepare("UPDATE subscription_counter SET amount = amount + ? WHERE subscription_id = ?");
$result = $session->execute($statement, new Cassandra\ExecutionOptions(array(
'arguments' => array(1, $subscription_id)
)));

Исключение:

PHP Fatal error:  Uncaught exception 'Cassandra\Exception\InvalidQueryException' with message 'Expected 8 or 0 byte long (4)' in /var/www/vhosts/cassandra_test/v4import.php:193
Stack trace:
#0 /var/www/vhosts/cassandra_test/v4import.php(193): Cassandra\DefaultSession->execute(Object(Cassandra\PreparedStatement), Object(Cassandra\ExecutionOptions))
#1 /var/www/vhosts/cassandra_test/v4import.php(116): processUser(Object(Cassandra\DefaultSession), 'stuart.armstron...', 'stu', 'armstrong', Array)
#2 {main}
thrown in /var/www/vhosts/cassandra_test/v4import.php on line 193

php -v

PHP 5.6.11 (cli) (built: Jul 12 2015 20:21:03)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies

Java-версия

OpenJDK Runtime Environment (rhel-2.4.4.1.el6_5-x86_64 u51-b02)
OpenJDK 64-Bit Server VM (build 24.45-b08, mixed mode)

Я пытался разыграть 1 как число с плавающей точкой, но это не работает так, как задумано, и приводит к огромным числам, которые не имеют смысла. Я пробовал Google, но могу только найти этот StackOverflow вопрос о том, как распаковать 8-байтовый int, но я не вижу, как его создать из этого.

Кто-нибудь использовал счетчики из этой библиотеки раньше? Может ли это быть проблемой конфигурации php?

Насколько я знаю, я правильно использую библиотеку, так как все остальные запросы работают нормально.

Пожалуйста, дайте мне знать, если я могу предоставить более полезную информацию.

2

Решение

Я понял, что Кассандра предоставляет объект Bigint, и при его использовании он работает.

$int = new Cassandra\Bigint('1');
$statement = $session->prepare("UPDATE subscription_counter SET amount = amount + ? WHERE subscription_id = ?");
$result = $session->execute($statement, new Cassandra\ExecutionOptions(array(
'arguments' => array($int, $subscription_id)
)));
2

Другие решения

Для Java-клиента вы должны использовать длинный примитивный тип для сопоставления с типом счетчика CQL. Например, вот запрос доступа (Java-клиент Datastax), который обновляет счетчик:

@Accessor
public interface MyCountersAccessor {

@Query("UPDATE my_counters SET count = count + :increment WHERE key = :key")
ResultSet incrementCount(@Param("key") String key, @Param("increment") long increment);
}
0

По вопросам рекламы [email protected]