Phantom DSL和Cassandra自定义列类型

时间:2016-10-10 21:33:35

标签: scala cassandra phantom-dsl

我已经定义了一个自定义的Cassandra类型和一个表,例如:

var domain = httpContextAccessor.HttpContext.User.Identity.Name.Split('\\').First();
var accountName = httpContextAccessor.HttpContext.User.Identity.Name.Split('\\').Last();

using (var entry = new DirectoryEntry($"LDAP://{domain}"))
{
    using (var searcher = new DirectorySearcher(entry))
    {
        searcher.Filter = $"(sAMAccountName={name})";
        searcher.PropertiesToLoad.Add("displayName");
        var searchResult = searcher.FindOne();

        if (searchResult != null && searchResult.Properties.Contains("displayName"))
        {
            var displayName = searchResult.Properties["displayName"][0];
        }
        else
        {
            // user not found
        }
    }
}

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

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


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

如何为class MyTable extends CassandraTable[X, Y] { object user extends UserColumn(this) with PartitionKey[User] ^^^^^??? ^^^??? 实施自定义UserColumn?我检查了Phantom代码的列实现,但任何示例和/或解释都会很棒。

2 个答案:

答案 0 :(得分:1)

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

但是,您可以通过扩展MapColumn来部分克服这一点,如下所述:Phantom-DSL cassandra with frozen type。当然,这并不完美,例如您将无法为模式创建生成CQL,您将不得不进行一些手动管道。

或多或少可能像这样:

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

答案 1 :(得分:1)

仅限幻影专业版,可在2周内订阅:

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

然后你使用UDTColumn

class MyTable extends CassandraTable[MyTable , Y] {
    object user extends UDTColumn[MyTable, Y, User](this) with PartitionKey[User]
}

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