Scala + Cassandra + Phantom。为同一实体建模多个表
Scala + Cassandra + Phantom. Modeling Multiple Tables for Same Entity
在我的 Cassandra 键空间中,我有一个主要报价 table 和三个相同的副本 table,面向不同的查询参数,如下所示:
offer (primary key offer_id) (... some attributes)
offer_by_product (primary key product_id, offer_id) (... some attributes)
offer_by_seller (primary key seller_id, offer_id) (... some attributes)
offer_by_sku (primary key sku_id, offer_id) (... some attributes)
所有列完全相同,仅更改分区键和集群键,但我需要复制大量代码来使用 Scala+Phantom 为所有四个 table 实现 CRUD 操作。
有什么方法可以使用 Scala+Phantom 来实现我的存储库,而无需 CRUD 操作的代码重复或一些减少重复的良好实践?
如果不复制,您目前无法逃脱。即将推出的企业版 phantom 具有自动代码生成和架构迁移功能,因此您将能够使用自动表直接从案例 class 定义生成所有 Cassandra 代码。
现在,重复是前进的方向,但你的工作非常有限,因为你可以在大多数情况下复制粘贴并进行最少的更改。它不是 100% 理想的,但它仍然比任何其他选项都有很大的改进。
好吧,正如@flavian 已经说过的,你不能那样做,尽管如此我至少可以将对象提取到这样的特征中。
trait MyCommonModel[O <: CassandraTable[O, R], R] {
var cassandra: O = _
object commonField extends StringColumn(cassandra)
...
}
然后你可以在你的模型中这样使用:
sealed class MyModel extends CassandraTable[MyModel, Model] with MyCommonModel[MyModel, Model]
因此您将从 CommonModel 继承所有对象。
更新
我创建了一个 github 项目来展示如何按照文档使用 phantom-dsl 在 scala 中为 cassandra 表建模。在这里查看。
在我的 Cassandra 键空间中,我有一个主要报价 table 和三个相同的副本 table,面向不同的查询参数,如下所示:
offer (primary key offer_id) (... some attributes)
offer_by_product (primary key product_id, offer_id) (... some attributes)
offer_by_seller (primary key seller_id, offer_id) (... some attributes)
offer_by_sku (primary key sku_id, offer_id) (... some attributes)
所有列完全相同,仅更改分区键和集群键,但我需要复制大量代码来使用 Scala+Phantom 为所有四个 table 实现 CRUD 操作。
有什么方法可以使用 Scala+Phantom 来实现我的存储库,而无需 CRUD 操作的代码重复或一些减少重复的良好实践?
如果不复制,您目前无法逃脱。即将推出的企业版 phantom 具有自动代码生成和架构迁移功能,因此您将能够使用自动表直接从案例 class 定义生成所有 Cassandra 代码。
现在,重复是前进的方向,但你的工作非常有限,因为你可以在大多数情况下复制粘贴并进行最少的更改。它不是 100% 理想的,但它仍然比任何其他选项都有很大的改进。
好吧,正如@flavian 已经说过的,你不能那样做,尽管如此我至少可以将对象提取到这样的特征中。
trait MyCommonModel[O <: CassandraTable[O, R], R] {
var cassandra: O = _
object commonField extends StringColumn(cassandra)
...
}
然后你可以在你的模型中这样使用:
sealed class MyModel extends CassandraTable[MyModel, Model] with MyCommonModel[MyModel, Model]
因此您将从 CommonModel 继承所有对象。
更新
我创建了一个 github 项目来展示如何按照文档使用 phantom-dsl 在 scala 中为 cassandra 表建模。在这里查看。