2010-07-05 14 views
5

Di solito, un utente effettua una ricerca, ottiene una lista hit e può quindi sfogliarla. La hitlist è un risultato intermedio che rimane coerente durante la navigazione e viene in genere memorizzato nello stato della sessione. Per esempio. se nuovi elementi vengono aggiunti contemporaneamente da altri, verranno visualizzati solo in una ricerca successiva.Paginazione in un'app Web REST

In un'applicazione REST, non riesco a ottenere facilmente questo risultato intermedio, né appartiene al client né al modello. Ho letto Pagination in a REST web app, ma non sono completamente chiaro con la risposta. La soluzione sembra presumere che il modello non sia aggiornato mentre l'utente sfoglia i risultati.

Possiamo ovviamente immaginare il mondo (il modello) come una serie di istantanee immutabili. Fornendo un timestamp (o un numero di versione globale), otteniamo una visione coerente del modello in quel momento, che risolve il problema da un punto di vista concettuale. Tuttavia implica il controllo delle versioni completo del modello. (Mi chiedo anche se ci sia una connessione da disegnare con la programmazione funzionale)

Come devo affrontare questo problema?

Nota: Mi sto chiedendo perché ho intenzione di usare il play framework, che non ha nozione di stato HTTP o sessione a tutti; è puramente riposante.

risposta

0

Sono un po 'perso su quale sia il tuo contesto, ma se devo fornire una risposta breve, è che i risultati di ricerca dovrebbero essere parte del modello. Presumo che tu abbia un modello ricercabile. Quello che fai è indicizzare le parti che devi cercare e memorizzare le informazioni dell'indice (facendolo anche parte del modello). Quando si esegue una ricerca, si interroga l'indice e si visualizzano i risultati. Eseguire la ricerca una seconda volta non conterrà nuovi elementi aggiunti, a meno che l'indice non venga rigenerato.

Ciò elimina la necessità di utilizzare qualsiasi stato di sessione e lo mantiene riposante, poiché l'indicizzazione è solo un'altra operazione eseguita su una risorsa. è di questo che hai bisogno?

+0

Il modello di dominio è composto da entità permanenti. Suggerite che dovrei anche persistere il risultato della ricerca stessa? – ewernli

5

Dopo aver ottenuto il risultato della query sulla prima ricerca, è possibile salvare il risultato in una cache. Per un server può essere ehcache (supportato in riproduzione) o memcached (supportato anche da riproduzione) per un ambiente cluster. È possibile salvare il risultato con un nome statico + ID di sessione. Quindi hai solo bisogno di un ID di sessione per ogni richiesta, è salvato nel cookie del cliente e disponibile nella tua app di gioco. È possibile utilizzare i dati memorizzati nella cache per sfogliare le pagine. Raccomando anche ElasticSearch.

EDIT: Un modo migliore è possibile utilizzare play-ricerca http://github.com/jfp/play-search, Campione:

Query q = Search.search("object:dogs", Folder.class); 
q.orderBy("object") 
    .page(2,5) 
    .reverse(); 

PS: La vostra decisione con Play è perfetto. Sono uno sviluppatore professionista .net e posso dire che l'unico framework web (ottimale) al mondo in grado di competere con asp.net mvc 2 è Play framework. Grails è bacato, Django/Python, Yii/Php, Rails sono tutti lenti, non sicuri e lontani dai framework jvm/clr. wicket, arazzi, montanti, jsf, mvc primaverili sono tutti prolissi e inutili. spring roo è solo un generatore di template. Asp.net mvc ha superato asp.net ed è diventata la # 1 piattaforma di sviluppo per .net, ma Sun ha lavorato per un vecchio clone di asp.net con jsf per il prossimo gen, grosso errore. L'unica speranza per Java è la struttura di gioco secondo me. Con il modulo scala, è perfetto ...

+0

Quindi esaminerò un po 'la funzionalità di caching. Ma il risultato della ricerca potrebbe essere sfrattato dalla cache in qualsiasi momento, indipendentemente dal fatto che la sessione utente sia scaduta o meno, no? – ewernli

+1

play.Cache la strada da percorrere ... la ricerca di giochi sembra interessante, grazie! – qeek

+0

Documentazione sulla cache nel framework di gioco: http://www.playframework.org/documentation/1.1/cache – ewernli