Scala + Cassandra + Phantom。为同一实体建模多个表

时间:2015-06-23 03:32:38

标签: scala cassandra phantom-dsl

在我的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操作或一些好的实践,而且重复次数更少?

2 个答案:

答案 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表。看看这里。

this