如何使用幻像查询带有二级索引的可选列?

时间:2015-12-21 14:09:57

标签: phantom-dsl

我在可选列上有一个二级索引:

class Sessions extends CassandraTable[ConcreteSessions, Session] {
  object matchId extends LongColumn(this) with PartitionKey[Long]
  object userId extends OptionalLongColumn(this) with Index[Option[Long]]
  ...
}

但是,indexedToQueryColumn隐式转换不适用于可选列,因此无法编译:

def getByUserId(userId: Long): Future[Seq[Session]] = {
  select.where(_.userId eqs userId).fetch()
}

这两个都没有:

select.where(_.userId eqs Some(userId)).fetch()

或更改索引的类型:

object userId extends OptionalLongColumn(this) with Index[Long]

有没有办法使用幻像执行此类查询?

我知道我可以反规范化,但它会涉及一些非常混乱的内务处理和三倍的(大量)数据大小。查询通常只返回少量结果,所以在这种情况下我愿意使用二级索引。

1 个答案:

答案 0 :(得分:1)

简短回答:您无法使用可选字段来查询幻像中的内容。

详细答案:

但是,如果你真的想使用辅助可选列,你应该将你的实体字段声明为Option,但你的幻像表示不应该是一个选项来进行查询。

object userId extends LongColumn(this) with Index[Long]

在fromRow(r:Row)中,您可以像这样创建对象:

Sessions(matchId(r), Some(userId(r)))

然后在服务部分中,您可以执行以下操作:

.value(_.userId, t.userId.getOrElse(0))

你也有更好的方法。你可以复制表,进行一种新的查询,比如sessions_by_user_id,在这个表中你的user_id是主键,match_id是聚类键。

由于user_id是可选的,因此您将以仅包含有效用户ID的表结束,这样可以轻松快速地查找。

Cassandra依赖于查询,因此请使用它。

查看我的github项目,该项目可帮助您在同一个表格中查看多个查询。

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