Как получить данные для необязательного списка пользовательских типов данных в Кассандре, используя Websudos Phanthom
У меня есть таблица, в которой один столбец имеет тип Список параметров пользовательского объекта. Как получить данные из Кассандры для этого столбца, используя фантом Websudos.
Схема таблицы:
Сервер {имя_хоста: строковый порт: фильтр Int: опция [список [фильтр]]}
Filter {filterKey: String, значение: List(String) }
Я создал класс case для таблицы "Сервер" и "Фильтр".
class Servers extends CassandraTable[Servers, Server] {
override lazy val tableName = "Servers"
object ipAddress extends StringColumn(this) with PartitionKey[String]
object port extends IntColumn(this)
object filter extends JsonListColumn[Servers, server, Filter](this) {
def fromJson(str:String): Filter{
}
def toJson(obj: Filter){
}
Это обеспечит List [фильтр], как в дальнейшем конвертировать в Option[List[Filter]]
1 ответ
Не знаю, зачем вам нужно что-то преобразовывать в Option[List[Filter]]
, но давайте предположим, что вам нужно строго различать отсутствие фильтров и наличие списка фильтров, где все записи были удалены, или что-то в этом роде.
Вы реализуете методы JSON для List[Filter]
, а затем в вашем fromRow
метод:
filters match {
case list@(head :: tail) => Server(host, Some(list))
case _ => Server(host, None)
}
На самом деле вам не нужно делать это, пустая коллекция Cassandra будет автоматически проанализирована List.empty
или Nil
,
Обновить
Если вы действительно должны использовать Option[List[Filter]]
по причинам вне моего понимания:
class Servers extends CassandraTable[Servers, Server] {
object ipAddress extends StringColumn(this) with PartitionKey[String]
object port extends IntColumn(this)
object filter extends JsonListColumn[Servers, Server, Filter](this) {
def fromJson(str: String): Filter = {
JsonParser.parse(str).extract[Filter] // replace appropriately
}
def toJson(obj: Filter): String = {
compactRender(Extraction.decompose(obj))
}
}
def fromRow(row: Row): Server = {
Server(
ipAddress(row),
port(row),
filters(row) match {
case list@(head :: tail) => Some(list)
case _ => None
}
)
}
}