A Persistence Framework for Scala and NoSQL

View project on GitHub


An index in longevity is a requirement that certain forms of queries on our persistent objects should perform with low latency. For instance, if there is an expectation that queries on lastName / firstName should perform quickly, then we need to define an index. To do this, we declare our index in a singleton object indexes inside our PType:

import longevity.model.annotations.component
import longevity.model.annotations.keyVal
import longevity.model.annotations.persistent

@keyVal[DomainModel, User]
case class Username(username: String)

case class FullName(last: String, first: String)

case class User(
  username: Username,
  fullName: FullName)

object User {
  implicit val usernameKey = key(props.username)
  override val indexSet = Set(
    index(props.fullName.last, props.fullName.first))

The index above will assure fast performance for queries that filter on lastName, as well as for queries where lastName is fixed and firstName is filtered. It will not assure performance for a search on firstName alone.

Note that indexSet is defined in PType to be the empty set, so if you want to add indexes, you have to override indexSet. While we expect nearly every persistent type to contain keys, we expect many users will have no need for indexes. In NoSQL, indexes are vaguely frowned upon. A preferred approach would be to maintain a secondary view table that will bypass the need for an index.

Indexes are used by Repo.retrieveByQuery, which is described in a later section.

prev: primary keys
up: the persistent type
next: subtype polymorphism