javascript - Kako se vratiti na prethodnu stranicu koristeći ručno paginiranje u Cassandri
Koristim Nodejs Cassandra driver i želim moći dohvatiti prethodnu i sljedeću stranicu. Do sada dokumentacija pokazuje dohvaćanje sljedeće stranice, što uključuje spremanje pageState s prethodne stranice i njegovo prosljeđivanje kao parametar. Nažalost, nema informacija o tome kako navigirati na prethodnu stranicu.
Kako ja to vidim, postoje dvije opcije:
Spremite svaki
pageStatei stranicu kao par ključ-vrijednost i koristitepageStateza stranicu na koju želite navigirati.Spremite dohvaćene podatke u niz i koristite niz za navigaciju na prethodnu stranicu. (Ne mislim da je ovo dobro rješenje jer ću morati pohraniti velike dijelove podataka u memoriju.)
Obje metode mi se ne čine elegantnim rješenjem, ali ako moram birati, koristit ću prvu.
Postoji li neki način da se ovo napravi odmah koristeći Nodejs Cassandra driver?
Još jedna stvar je da se u dokumentaciji ručno paginiranje koristi pozivanjem funkcije eachRow. Ako sam to ispravno razumio, ona ti daje svaki red čim je pročitan iz baze podataka. Problem je u tome što je to implementirano u mom API-ju i vraćam podatke za trenutnu stranicu u HTTP odgovoru. Dakle, da bih to mogao napraviti, morat ću svaki red dodati u prilagođeni niz, a zatim vratiti taj niz kada se podaci za trenutnu stranicu dohvaćeni. Postoji li način da se koristi execute s ručnim paginiranjem jer se gore navedeno čini suvišnim?
Hvala
UREDI:
Ovo je moj podatkovni model:
CREATE TABLE store_customer_report (
store_id uuid,
segment_id uuid,
report_time timestamp,
sharder int,
customer_email text,
count int static,
first_name text,
last_name text,
PRIMARY KEY ((store_id, segment_id, report_time, sharder), customer_email)
) WITH CLUSTERING ORDER BY (customer_email ASC)
Prikazujem podatke u mreži, tako da korisnik može kroz njih navigirati. Dok ovo pišem, sjetio sam se načina kako to učiniti bez potrebe za prethodnom funkcionalnošću, ali unatoč tome mislim da je ovo valjano slučaj i bilo bi sjajno ako postoji elegantno rješenje za to.
Odgovor #1
Nažalost, nema informacija o tome kako se vratiti na prethodnu stranicu.
Točno, kada napravite upit i postoji više redaka, Cassandra vraća stanje stranice kako bi dohvatila sljedeći set redaka, ali ne i prethodne. Iako je ono što stanje stranice predstavlja apstrahirano, općenito je pokazivač na mjesto gdje nastaviti s čitanjem sljedećeg seta podataka, zaista ne postoji koncept čitanja prethodnog seta podataka (jer ste ga upravo pročitali).
Spremite svako stanje stranice i stranicu kao par ključ-vrijednost i koristite stanje stranice za stranicu na koju želite navigirati.
Ovo je strategija koju bih i ja preporučio, naravno, da biste dobili stanje paginacije, zapravo morate izvršiti upite.
Postoji li neki način da se ovo napravi odmah koristeći Nodejs Cassandra driver?
Ne da znam, nažalost, ako želite vratiti se na prethodne stranice, morat ćete pratiti stanje.
Postoji li način za korištenje izvršavanja s ručnim stranicama jer gore navedeno izgleda suvišno?
Da, možete također dostaviti pageState u parametru opcija uz execute i to će biti uzeto u obzir, tj.:
client.execute('SELECT * FROM table', [], {pageState: pageState}, function (err, result) {
...
});
Odgovor #2
Postoji opcija da budete „više“ ručni, što je bilo uobičajeno prije funkcija paginacije. Možete pohraniti posljednje ključeve particije/klastera trenutne stranice koju vraćate u odgovoru (moguće šifrirane ovisno o tome što je, najvjerojatnije generirajte ključ particije i pošaljite/primit samo ključeve klastera kako biste izbjegli sigurnosne probleme). Zatim, kada radite svoj odgovor za „sljedeću stranicu“, samo trebate započeti svoj CQL upit od tamo. Za povratak na prethodnu stranicu, promijenite ORDER BY klauzulu ključa klastera i idite unatrag. Ako date svoj shemu, bilo bi lakše dati primjere. Ionako to je sve što pageState zapravo radi.
