1

在我的 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 操作重复代码,或者有一些好的做法可以减少重复?

4

2 回答 2

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 表进行建模。看看这里。

https://github.com/iamthiago/cassandra-phantom

于 2015-07-21T12:26:11.123 回答
1

如果没有重复,您目前无法逃脱。即将推出的 phantom 企业版具有自动代码生成和模式迁移功能,因此您将能够使用自动表直接从案例类定义生成所有 Cassandra 代码。

目前,重复是前进的方向,但你的工作非常有限,因为你可以在大部分时间里复制粘贴而只做很少的改动。它不是 100% 理想的,但它仍然比任何其他选项都有很大的改进。

于 2015-07-13T23:21:58.403 回答