2010-07-05 8 views
5

Normalerweise führt ein Benutzer eine Suche durch, ruft eine Trefferliste ab und kann sie dann durchsuchen. Die Trefferliste ist ein Zwischenergebnis, das während des Browsens konsistent bleibt und normalerweise im Sitzungszustand gespeichert wird. Z.B. Wenn neue Elemente gleichzeitig von anderen hinzugefügt werden, werden sie nur bei einer nachfolgenden Suche angezeigt.Seitenumbruch in einer REST-Webanwendung

In einer REST-Anwendung kann ich dieses Zwischenergebnis nicht leicht haben - weder gehört es zum Client noch zum Modell. Ich habe Pagination in a REST web app gelesen, bin aber mit der Antwort nicht ganz klar. Die Lösung scheint dort davon auszugehen, dass das Modell nicht aktualisiert wird, während der Benutzer die Ergebnisse durchsucht.

Wir können uns natürlich die Welt (das Modell) als eine Serie von unveränderlichen Schnappschüssen vorstellen. Durch Angabe eines Zeitstempels (oder einer globalen Versionsnummer) erhalten wir dann eine konsistente Ansicht des Modells zu dieser Zeit, die das Problem aus konzeptioneller Sicht löst. Es beinhaltet jedoch eine vollständige Versionierung des Modells. (Ich frage mich auch, ob es eine Verbindung gibt, um mit funktionaler Programmierung zu zeichnen)

Wie soll ich mit diesem Problem umgehen?

Hinweis: Ich frage, weil ich die play framework verwenden möchte, die keine Ahnung von HTTP-Status oder Sitzung überhaupt hat; Es ist pure Ruhe.

Antwort

0

Ich bin irgendwie verloren, was Ihr Kontext ist, aber wenn ich eine kurze Antwort geben muss, ist es, dass Suchergebnisse Teil des Modells sein sollten. Ich nehme an, Sie haben ein durchsuchbares Modell. Sie indexieren die Teile, die Sie suchen und speichern müssen, um die Indexinformationen zu speichern (so dass sie auch Teil des Modells sind). Wenn Sie eine Suche ausführen, fragen Sie den Index ab und zeigen Ergebnisse an. Wenn die Suche ein zweites Mal ausgeführt wird, enthält sie keine neu hinzugefügten Elemente, es sei denn, der Index wird neu generiert.

Dadurch entfällt die Notwendigkeit, einen Sitzungsstatus zu verwenden, und er bleibt ruhig, da die Indizierung nur eine weitere Operation ist, die für eine Ressource ausgeführt wird. Ist das was du brauchst?

+0

Das Domänenmodell besteht aus persistenten Einheiten. Schlägst du vor, dass ich das Suchergebnis auch persistieren sollte? – ewernli

5

Nachdem Sie bei der ersten Suche ein Abfrageergebnis erhalten haben, können Sie das Ergebnis in einem Cache speichern. Für einen Server kann es ehcache (unterstützt im Spiel) oder memcached (auch unterstützt von play) für eine Cluster-Umgebung sein. Sie können das Ergebnis mit einem statischen Namen und einer Sitzungs-ID speichern. Sie benötigen für jede Anfrage lediglich eine Sitzungs-ID, die im Cookie des Kunden gespeichert und in Ihrer Play-App verfügbar ist. Sie können zwischengespeicherte Daten zum Durchsuchen von Seiten verwenden. Ich empfehle auch ElasticSearch.

EDIT: Ein besserer Weg ist es, Sie Play-Suche http://github.com/jfp/play-search, Probe verwenden:

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

PS: Ihre Entscheidung mit Play ist perfekt. Ich bin ein professioneller .net Entwickler und ich kann sagen, dass das einzige (optimale) Web Framework in der Welt, das mit asp.net mvc 2 laufen kann, Play Framework ist. Grails ist fehlerhaft, Django/Python, Yii/PHP, Rails sind alle langsam, nicht typsicher und weit entfernt von jvm/clr-Frameworks. Wicket, Tapisserie, Struts, JSF, Federmvc alle sind ausführlich und nutzlos. Spring Roo ist nur ein Vorlagengenerator. Asp.net mvc übertraf asp.net und wurde # 1 Entwicklungsplattform für .net, aber Sonne arbeitete für einen alten asp.net Klon mit jsf für die nächste Generation, großer Fehler. Die einzige Hoffnung für Java ist meiner Meinung nach Spiel-Framework. Mit scala-Modul ist es perfekt ...

+0

Ich werde dann ein bisschen die Caching-Funktion untersuchen. Aber das Suchergebnis könnte jederzeit aus dem Cache entfernt werden, unabhängig davon, ob die Benutzersitzung abgelaufen ist oder nicht, nein? – ewernli

+1

play.Cache der Weg zu gehen ... Play-Suche sieht interessant aus, danke! – qeek

+0

Dokumentation über den Cache im Play-Framework: http://www.playframework.org/documentation/1.1/cache – ewernli