Как мне сопоставить java.time.Duration со столбцом Cassandra DB с типом time - PullRequest
0 голосов
/ 04 июня 2018

Цель:

Отобразить java.time.Duration от JDK8 + до столбца Cassandra DB с типом time.

Ситуация:

Я не смог найти ни одно стандартное отображение, ни какой-либо кодек (даже в зависимости от maven с дополнительными кодеками), который смог это сделать.Это проект Java 8 Maven с драйвером datastax для Cassandra DB.

Вопрос:

Кто-нибудь знает жизнеспособное решение для этого или любого кодека?Если нет, то это лучший способ сделать обход через java.sql.time или это вообще возможно?

В случае, если я забыл некоторые важные детали, пожалуйста, прокомментируйте ниже.

1 Ответ

0 голосов
/ 04 июня 2018

tl; dr

Используйте тип Cassandra duration вместо time.

Передача или анализ стандартных строк ISO 8601 с использованием класса java.time.Duration.

Duration.parse( "PT1H30M" )  // Parse ISO 8601 string into a `Duration` object.
        .toString()          // Generate a ISO 8601 string from the `Duration` object.

Duration не время

Класс java.time.Duration представляет промежуток времени, не привязанный к временной шкале. не представляет время суток.

Тип Cassandra time определяется как:

Значение кодируется как 64-разрядное целое число со знаком, представляющее количество наносекунд с полуночи.Значения могут быть представлены в виде строк, например 13: 30: 54.234.

Поэтому вам не следует хранить значение Duration с использованием типа Cassandra time.

Youесть другие варианты.

Один из вариантов - хранить стандартное ISO 8601 текстовое представление длительности : PnYnMnDTnHnMnS.Пример: полтора часа - PT1H30M.Эта опция более правдива, но значения нельзя сравнивать или сортировать в Кассандре, поскольку они будут просто текстом без алфавитного порядка в хронологическом порядке.Также см. Раздел «Продолжительность Кассандры» ниже в этом ответе.

Другой вариант заключается в извлечении двух чисел, используемых внутри, в Duration:

  • 64-разрядное целое число, подсчет целых секунд.
  • A32-разрядное целое число, число наносекунд в доли секунды.

Если вы настаиваете, вы можете использовать эти числа, чтобы сгенерировать значение для хранения в качестве Cassandra time, но вы бынарушая семантику.

long fakeNanosSinceMidnight = TimeUnit.SECONDS.toNanos( duration.getSeconds ) + duration.getNano() ;  // NOT recommended, but if you insist on abusing Cassandra semantics, here you go. 

Cassandra Duration

Cassandra В документации сказано, что a duration тип встроен.Я не пользователь Кассандры, поэтому я не могу ручаться за это.

В документе указано, что он принимает стандартную строку продолжительности ISO 8601 в качестве входных данных.Метод Duration::toString в Java генерирует такие строки, в то время как Duration::parse анализирует то же самое.

String inputDurationForCassandra = duration.toString() ;

И разбор.

Duration duration = Duration.parse( myCassandraDurationString ) ;

Имейте в виду, что Java использует класс Duration для дней (общие 24-часовые чанки, а не календарные дни), часов, минут и секунд.Класс Period представляет годы, месяцы, дни.Обычно нет смысла соединять эти два понятия.Но если вы настаиваете, вы можете использовать класс PeriodDuration, найденный в библиотеке проекта ThreeTen-Extra .

...