Ограничения таблицы system.local — AstraDB Serverless (Cassandra)

Я пытаюсь выполнить «toUnixTimestamp(now())» для таблицы system.local (AstraDB Serverless).

Он отлично работает, когда я выполняю его в консоли AstraDB CQL: SELECT toUnixTimestamp(now()) FROM system.local;

Проблема в том, что я не могу успешно выполнить ее с помощью Astra CLI или Java-драйвера:
команда: SELECT toUnixTimestamp(now()) FROM system.local;
вывод ошибки:

com.datastax.oss.driver.api.core.servererrors.InvalidQueryException: unexpected argument type for function call 'toUnixTimestamp(...)' in select statementat com.datastax.oss.driver.api.core.servererrors.InvalidQueryException.copy(InvalidQueryException.java:48) at com.datastax.oss.driver.internal.core.util.concurrent.CompletableFutures.getUninterruptibly(CompletableFutures.java:149)

Я могу выполнить его, используя специальную таблицу (Astra CLI/Java-драйвер): SELECT toUnixTimestamp(now()) FROM demo.example;

Но в моем случае мне нужно выполнить его для system.local.
Сценарий тот же для следующих функций: toUnixTimestamp(), toTimestamp() и dateOf().
Функция only now() работает со всеми подходами: консолью AstraDB CQL, Astra CLI и Java-драйвером (SELECT now() FROM system.local;).

Существуют ли какие-либо ограничения на то, к чему можно получить доступ внутри system.local с помощью консоли AstraDB CQL, но нельзя получить доступ с помощью Astra CLI или Java-драйвера?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
74
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это действительно странно. Мне было бы любопытно узнать, как вы создаете свои операторы CQL в коде, потому что это должно работать.

У меня это работает с Java 21 и версией драйвера Java 4.17.0:

try (CqlSession session = CqlSession.builder()
    .withCloudSecureConnectBundle(Paths.get(secureConnectBundlePath))
    .withAuthCredentials(username,password)
    .withKeyspace("system")
    .build()) {

        ResultSet rs = session.execute("select release_version from system.local");
        Row row = rs.one();
        System.out.println(row.getString(0));

        ResultSet rs2 = session.execute("select now() from system.local");
        Row row2 = rs2.one();
        System.out.println(row2.getUuid(0));

        ResultSet rs3 = session.execute("SELECT toUnixTimestamp(now()) FROM system.local;");
        Row row3 = rs3.one();
        System.out.println(row3.getLong(0));

    }

Я также создал асинхронный пример, просто чтобы убедиться, что ничего не пропустил:

CompletionStage<CqlSession> sessionStage = CqlSession.builder()
        .withCloudSecureConnectBundle(Paths.get(secureConnectBundlePath))
        .withAuthCredentials(username,password)
        .withKeyspace("system")
        .buildAsync();

CompletionStage<AsyncResultSet> result = sessionStage.thenCompose(
        session -> session.executeAsync("SELECT toUnixTimestamp(now()) FROM system.local;"));

CompletionStage<Long> unixTimeResult = result.thenApply(resultSet -> resultSet.one().getLong(0));

unixTimeResult.whenComplete(
        (unixtime, error) -> {
            if (error != null) {
                System.out.println(error);
            } else {
                System.out.println(unixtime);
            }
        });

Результаты:

4.0.11-09ec37c912ed
556541c0-5980-11ef-b3cf-fdfdcd27eb44
1723559319596
1723559324300

Если у вас есть дополнительные вопросы, я поместил этот код в репозиторий Git, чтобы его было легко найти: https://github.com/aar0np/TestAstra/blob/main/src/main/java/testastra/TestAstra. Ява

Редактировать 20240815

Обсуждал этот вопрос с ребятами из Astra Engineering. Оказывается, в будущем Astra будет использовать другую маршрутизацию/обработку запросов к system.local и system.peers. Функция now() может продолжать работать, но вложение now() внутри другой функции (например: toUnixTimestamp()) не будет. Мы также находимся в процессе внедрения этого изменения маршрутизации, поэтому оно по-прежнему работает в GCP, но больше не будет работать в AWS.

Официальная рекомендация — использовать для этого однострочную фиктивную таблицу, а не прямые запросы по system.local.

Привет @Aaron, я использовал твой проект с GitHub и получил то же исключение, что я описал выше. Вывод: 4.0.0.6816 42153458-5a15-11ef-a032-062a1e7aa9d3 Exception in thread "main" com.datastax.oss.driver.api.core.servererrors.InvalidQueryEx‌​ception: unexpected argument type for function call 'toUnixTimestamp(...)' in select statement at com.datastax.oss.driver.api.core.servererrors.InvalidQueryEx‌​ception.copy(Invalid‌​QueryException.java:‌​48) --- Проблема, должно быть, в том, как создается база данных. Я использую AWS в качестве провайдера и бессерверную (не векторную) систему. Токен - Администратор организации.

Aleksandar Hardi 14.08.2024 10:48

Я проверил это еще раз, но теперь с Google Cloud в качестве провайдера. Все работает так, как ожидалось. Возможно ли, что два провайдера ведут себя по-разному?

Aleksandar Hardi 14.08.2024 11:23

Это действительно странно. Я бы не думал, что у нас будут такие разногласия между провайдерами. Я заметил, что ваша версия (4.0.0.6816) старше моей (4.0.11-09ec37c912ed). Различаются ли release_versions у разных поставщиков? Может быть, это все.

Aaron 14.08.2024 15:08

Release_versions одинаковы у обоих поставщиков (4.0.0.6816).

Aleksandar Hardi 14.08.2024 16:10

@AleksandarHardi внес правку.

Aaron 15.08.2024 19:23

Другие вопросы по теме