0

我有一个表,其中一列是自定义对象的选项列表类型。如何使用 Websudos phantom 从 cassandra 获取本专栏的数据。

表架构:

服务器{主机名:字符串端口:整数过滤器:选项[列表[过滤器]]}

过滤器{过滤器键:字符串,值:列表(字符串)}

我为表“服务器”和“过滤器”创建了一个案例类。

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[filter],如何进一步转换成Option[List[Filter]]

4

1 回答 1

2

不知道为什么您需要将某些内容转换为Option[List[Filter]],但假设您需要在没有过滤器和过滤器列表之间有一个强烈的区别,其中所有记录都被删除或类似的东西。

您实现 JSON 方法List[Filter],然后在您的fromRow方法中:

filters match {
   case list@(head :: tail) => Server(host, Some(list))
   case _ => Server(host, None)
}

您实际上不需要这样做,一个空集合 Cassandra 将自动解析为 aList.empty或 a 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
      }
    )
  }

}

于 2015-08-17T21:07:30.513 回答