在我的Cassandra密钥空间中,我有一个主要的商品表和另外三个相同的表副本,面向不同的查询参数,如下所示:
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为所有四个表实现CRUD操作。
有什么方法可以使用Scala + Phantom来实现我的存储库,没有代码重复用于CRUD操作或一些好的实践,而且重复次数更少?
答案 0 :(得分:1)
如果没有重复,你现在无法逃脱。即将推出的幻像企业版具有自动代码生成和模式迁移功能,因此您可以使用自动编码直接从案例类定义生成所有Cassandra代码。
目前,重复是前进的方向,但您的工作非常有限,因为您可以通过最少的更改来复制粘贴。它并非100%理想,但它仍然比任何其他选项都有很大的改进。
答案 1 :(得分:1)
好吧,正如@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表。看看这里。