【问题标题】:Types MapColumn, SetColumn, JsonColumn needs owner and record. What actually are these values?MapColumn、SetColumn、JsonColumn 类型需要所有者和记录。这些值实际上是什么?
【发布时间】:2016-09-03 20:34:59
【问题描述】:

例如,我有

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

KV 很明显,但是所有者和记录呢?我应该在那里输入什么?

【问题讨论】:

    标签: scala cassandra phantom-dsl


    【解决方案1】:

    phantom 的全部力量在于它能够围绕您的数据模型进行映射并为您返回类型安全的结果,或者我在编写它时就是这么想的。 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 消息交换,您只需要返回您的记录。

    因此需要RecordfromRow 方法结合使用,它们不仅在这些列中传递,而且在每一列中传递。唯一的区别是,使用StringColumn,编译器能够为您推断TR 的类型,因此您不必输入它。

    这是因为:

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

    所以实际上所有的专栏都需要这个。集合需要用户提供的额外参数(或两个在地图的情况下),因此编译器无法推断出 StringColumnBooleanColumn 的类型,因此您需要键入它们手工。

    在 phantom 1.26.0+ 中,这已被更改,额外的类型参数现在也不可见,因此您将能够键入以下内容,而无需指定 OwnerRecord

    object map extends MapColumn[String, String](this)
    

    【讨论】:

    • 感谢您提供如此详细的回答!有一个有趣的问题。 IntelliJ IDEA 用“不适用”消息突出显示(this)。但是代码编译没有任何问题。我也发现不支持嵌套地图吧?
    猜你喜欢
    • 2020-11-30
    • 2019-04-15
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-03
    • 1970-01-01
    相关资源
    最近更新 更多