Skip to content

Instantly share code, notes, and snippets.

@schatteleyn
Created October 10, 2013 18:45
Show Gist options
  • Save schatteleyn/6923380 to your computer and use it in GitHub Desktop.
Save schatteleyn/6923380 to your computer and use it in GitHub Desktop.
find sur plusieurs paramètres
Salut Mathieu. j'ai trouvé ton code dans dans les exemples pour un find by username.
Si je veux l'adapter pour créer une méthode de login, est-ce que quelque chose de genre marcherait ?
Je suis pas sûr de bien comprendre la l.9
def login(name: String, password: String): Future[Option[People]] = {
val query = new Query().setIncludeDocs(true).setLimit(1)
.setRangeStart(ComplexKey.of(name), ComplexKey.of(password))
.setRangeEnd(ComplexKey.of(s"$name\uefff"), ComplexKey.of(s"password\uefff"))
bucket.find[People]("people", "by_name", "by_password")(query).map(_.headOption)
}
@mathieuancelin
Copy link

Salut,

alors je suis pas certain qu'une requête telle que tu l'écris fonctionne. La méthode find ne prend en paramètre qu'une seule vue (par exemple la vue by_name du desgindoc people). Les vues sont des fonctions de map-reduce appliquées à l'insertion de documents dans le serveur couchbase permettant d'effectuer des recherches, d'extraire certaines données, de filtrer des données, d'indexer des documents, etc ... Tu trouveras tout ce qu'il y a à savoir ici : http://docs.couchbase.com/couchbase-manual-2.2/#views-and-indexes

En fait, j'ai plusieures idées pour parvenir à ce résultat mais j'avoue que je ne suis pas certain de laquelle est la plus couchbase-ish.

Mon avis serait plutôt de recherche le user associé au name (grâce à une vue qui map le 'name' d'un document json de type people) puis de vérifier si le password correspond.

du coup ca devrait donner quelquechose comme ca au niveau de la vue :

function (doc, meta) { 
  if (doc.name) { 
    emit(doc.name, null); 
  } 
}

et niveau scala :

case class People(name: String, password: String)

def findByNameAndPassword(name: String, password: String): Future[Option[People]] = {
  val query = new Query().setIncludeDocs(true).setLimit(1)
        .setRangeStart(ComplexKey.of(name))
        .setRangeEnd(ComplexKey.of(s"$name\uefff").setStale(Stale.FALSE))
  bucket.find[People]("people", "by_name")(query).map(_.headOption.filter(_.password == password))
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment