我在可选列上有一个辅助索引:
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]
有没有一种方法可以使用phantom执行这样的查询?
我知道我可以去规范化,但这将涉及一些非常混乱的内务管理,并使我们(大量)的数据大小增加三倍。查询通常只返回少数结果,所以在这种情况下我愿意使用辅助索引。
简短回答:您不能使用可选字段来查询phantom中的内容。
详细答案:
但是,如果您真的想使用辅助可选列,则应该将实体字段声明为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