0

1 つの列がカスタム オブジェクトのオプション リスト タイプであるテーブルがあります。Websudos ファントムを使用して、この列の cassandra からデータをフェッチする方法。

テーブル スキーマ:

Server{ hostName : String port: Int filter : Option[List[Filter]] }

Filter{ filterKey : String, value : List(String) }

テーブル「サーバー」と「フィルター」の両方のケース クラスを作成しました。

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 に答える