たとえば、私は
type MapColumn[Owner <: com.websudos.phantom.dsl.CassandraTable[Owner, Record], Record, K, V] =
com.websudos.phantom.column.MapColumn[Owner, Record, K, V]
K
とV
は明らかですが、所有者と記録は?そこには何を入力すればよいですか?
たとえば、私は
type MapColumn[Owner <: com.websudos.phantom.dsl.CassandraTable[Owner, Record], Record, K, V] =
com.websudos.phantom.column.MapColumn[Owner, Record, K, V]
K
とV
は明らかですが、所有者と記録は?そこには何を入力すればよいですか?
ファントムの全体的な力は、データ モデルをマッピングして、タイプ セーフな結果を返す能力です。それを書いたとき、私はそのことを念頭に置いていました。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
の型を推測できるため、型を入力する必要がないことです。T
R
これは次の理由によるものです。
type StringColumn[
Owner <: CassandraTable[Owner, Record],
Record
] = com.websudos.phantom.column.PrimitiveColumn[Owner, Record, String]
したがって、実際にはすべての列にこれが必要です。コレクションには、ユーザーが提供する追加のパラメーター (マップの場合は 2 つ) が必要です。そのため、コンパイラーはStringColumn
orBooleanColumn
のように型を推測できないため、手動で入力する必要があります。
Owner
ファントム 1.26.0+ ではこれが変更され、追加の型パラメーターも非表示になったため、 と を指定せずに次のように入力できるようになりますRecord
。
object map extends MapColumn[String, String](this)