Phantom DSL 和 Cassandra 自定义列类型

Phantom DSL and Cassandra custom column type

我定义了一个自定义 Cassandra 类型和一个 table,例如:

CREATE TYPE my.usertype (
  id text,
  firstname text,
  lastname text
);


CREATE TABLE mytable (
  user frozen <usertype>,
  ...,
  PRIMARY KEY(user)
);

如何在 Scala 的 Cassandra table 定义中定义此用户类型?

class MyTable extends CassandraTable[X, Y] {
  object user extends UserColumn(this) with PartitionKey[User]
                      ^^^^^???                           ^^^???

如何为 UserType 实现自定义 UserColumn?我检查了列实现的 Phantom 代码,但任何示例 and/or 解释都很好。

所以根据库的作者,phantom 的开源版本不支持用户定义的类型:https://github.com/outworkers/phantom/issues/496

但是,您可以通过扩展 MapColumn 来部分解决这个问题,如下所述:。当然,这并不完美,例如您将无法为模式创建生成 CQL,您将不得不进行一些手动管道操作。

所以或多或少会像这样:

class MyTable extends CassandraTable[MyTable , Y] {
    object user extends MapColumn[MyTable , Y, String, String](this) with PartitionKey[MapColumn...]

仅限 Phantom Pro。

@Udt case class User(
  id: String,
  firstname: String,
  lastname: String
)

然后你使用UDTColumn:

class MyTable extends Table[MyTable , Y] {
    object user extends Col[User] with PartitionKey
}

这将为您提供自动架构生成和其他任何功能,包括自动初始化您的 UDT。