Как получить данные для необязательного списка пользовательских типов данных в Кассандре, используя 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
      }
    )
  }

}

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