2015-08-17 2 views
0

У меня есть таблица, в которой один столбец имеет тип Option List из настраиваемого объекта. Как получить данные из cassandra для этого столбца с помощью фантома Websudos.Как получить данные для необязательного списка пользовательских типов данных в cassandra с помощью Websudos Phanthom

Таблица схемы:

Сервер { HostName: Строка порт: Int Фильтр: Опция [Список [Фильтр]] }

фильтр { filterKey: Строка, значение: Список (строка) }

Я создал класс 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){ 
} 

Это обеспечит список [фильтр], как в дальнейшем преобразовать в опции [Список [Фильтр]]

ответ

2

Не знаю, почему вы когда-нибудь понадобится, чтобы превратить что-то к Option[List[Filter]], но давайте предположим, что вам нужно сильное различие между отсутствием фильтров и списком фильтров, где все записи удалены или что-то в этом роде.

Вы реализуете методы JSON для List[Filter], а затем в методе fromRow:

filters match { 
    case [email protected](head :: tail) => Server(host, Some(list)) 
    case _ => Server(host, None) 
} 

, Вам не нужно делать это, пустая коллекция Cassandra автоматически будет анализироваться на List.empty или Nil ,

Update

Если вы действительно должны использовать 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 [email protected](head :: tail) => Some(list) 
     case _ => None 
     } 
    ) 
    } 

}

+0

Мой случай серверный класс выглядит следующим образом: сервера ( хоста: String , порт: String, фильтры: опция [Список [Фильтр]] ) Так что я хочу, чтобы опция [Список [фильтр]] появилась на сервере после реализации JSON, а не как Some или None. JSON был бы чем-то вроде опции возврата [List], но JSONListCoulmn используется для List [T] вы как-то знаете, как это сделать – kin

+0

@kin Нет, и я думаю, вы выбираете неправильный подход, имея 2 монады обычно является запахом, если первый уровень не является «Будущим». Я не думаю, что полезно иметь 2 типа. – flavian