2

たとえば、私は

type MapColumn[Owner <: com.websudos.phantom.dsl.CassandraTable[Owner, Record], Record, K, V] = 
    com.websudos.phantom.column.MapColumn[Owner, Record, K, V]

KVは明らかですが、所有者と記録は?そこには何を入力すればよいですか?

4

1 に答える 1

1

ファントムの全体的な力は、データ モデルをマッピングして、タイプ セーフな結果を返す能力です。それを書いたとき、私はそのことを念頭に置いていました。type パラメーターは、ユーザーが作成したテーブルのOwnerタイプであり、必要なため、次のようなことができます。

select.where(_.id eqs id)

非常に単純に見えますが、秘訣は、テーブル内で任意に定義した列をコンパイラが「記憶」できる洗練された型パラメーターがなければ、DSL コードでユーザーがどの列を書き込むかを決して「知る」ことができないということです。 .

したがって、DSL は、拡張して作成するテーブルの最終的な型を認識している必要がありますCassandraTable

case class MyRecord(id: UUID, name: String)
class MyTable extends CassandraTable[MyTable, MyRecord] {
  object id extends UUIDColumn(this) with PartitionKey[UUID]
  // MyTable is Owner and MyRecord is Record.
  object mapColumn extends MapColumn[MyTable, MyRecord, String, String](this)
}

そのため、すべてのクエリ ビルダーは、あるものから他のtable: Ownerものへの関数です。上記でさえ、次の単純な略記です。

select.where(table => table.id eqs id)

Record型は、Cassandra の結果の型を安全にするものです。どのケース クラスをラップするかをテーブルに伝えることで、phantom は暗黙的な API アプローチを使用してすべての結果をこのケース クラスにマップすることができるため、次のような処理を行う必要はありません。

res.getString("mystring")

そのようなことは、フードの下で処理されて見えず、返された Cassandra 行から生じるファントムは、 内のどのフィールドに属しているかを「認識」しますcase class。ドライバーが Netty バッファーの内部解析とクライアントとデータベース間の CQL メッセージ交換をどのように処理するかを本当に気にしたくないので、非常に冗長で効率的です。レコードを元に戻したいだけです。

したがって、メソッドRecordとの組み合わせfromRowが必要であり、それらはそれらの列だけでなく、すべての列で渡されます。唯一の違いは、コンパイラはとStringColumnの型を推測できるため、型を入力する必要がないことです。TR

これは次の理由によるものです。

type StringColumn[
  Owner <: CassandraTable[Owner, Record],
  Record
] = com.websudos.phantom.column.PrimitiveColumn[Owner, Record, String]

したがって、実際にはすべての列にこれが必要です。コレクションには、ユーザーが提供する追加のパラメーター (マップの場合は 2 つ) が必要です。そのため、コンパイラーはStringColumnorBooleanColumnのように型を推測できないため、手動で入力する必要があります。

Ownerファントム 1.26.0+ ではこれが変更され、追加の型パラメーターも非表示になったため、 と を指定せずに次のように入力できるようになりますRecord

object map extends MapColumn[String, String](this)
于 2016-05-09T14:28:24.403 に答える