Al pasar a la página siguiente, puede simplificar el caso de uso permitiendo solo una "página siguiente" y no paginación arbitraria. Puede hacer esto en SimpleDB mediante el uso de la cláusula LIMIT:
SELECT title, summary, votecount FROM posts WHERE userid = '000022656' LIMIT 25
Usted ya sabe cómo manejar la nextToken, pero si se utiliza esta táctica, puede apoyar "página anterior" mediante el almacenamiento de la ruta de navegación de los siguientes fichas (por ejemplo, en la sesión web) y volver a emitir la consulta con un NextToken anterior en lugar de uno posterior.
Sin embargo, el caso general para manejar la paginación arbitraria en SimpleDB es el mismo para el anterior y el siguiente. En el caso general, el usuario puede hacer clic en un número de página arbitrario, como 5, sin haber visitado la página 4 o 6.
Puede manejar esto en SimpleDB utilizando el hecho de que NextToken solo requiere que la cláusula WHERE sea la lo mismo para trabajar correctamente. Entonces, en lugar de consultar cada página en secuencia, tirando de todos los elementos intermedios, generalmente puede hacerlo en dos pasos.
- Emita su consulta con un valor límite de donde debe comenzar la página deseada, y SELECCIONE la cuenta (*) en lugar de los atributos reales que desea.
- Usa el nextToken desde el paso uno a buscar a los datos de la página real utilizando los atributos deseados y el tamaño de página como el límite
Así que en pseudo código:
int targetPage, pageSize;
...
int jumpLimit = pageSize * (targetPage - 1);
String query = "SELECT %1 FROM posts WHERE userid = '000022656' LIMIT %2";
String output = "title, summary, votecount";
Result temp = sdb.select(query, "count(*)", jumpLimit);
Result data = sdb.select(query, output, pageSize, temp.getToken());
donde% 1 y% 2 son sustituciones de cadenas y "sdb.select()" es un método ficticio que incluye el código de sustitución de cadenas junto con la llamada SimpleDB.
Si puede o no lograr esto en dos llamadas a SimpleDB (como se muestra en el código) dependerá de la complejidad de su cláusula WHERE y del tamaño de su conjunto de datos. El código anterior se simplifica porque el resultado temporal puede haber devuelto un recuento parcial si la consulta tardó más de 5 segundos en ejecutarse. Realmente querrás poner esa línea en un bucle hasta que se llegue al recuento adecuado.Para que el código un poco más realista lo voy a poner dentro de los métodos y deshacerse de las sustituciones de Cuerda:
private Result fetchPage(String query, int targetPage)
{
int pageSize = extractLimitValue(query);
int skipLimit = pageSize * (targetPage - 1);
String token = skipAhead(query, skipLimit);
return sdb.select(query, token);
}
private String skipAhead(String query, int skipLimit)
{
String tempQuery = replaceClause(query, "SELECT", "count(*)");
int accumulatedCount = 0;
String token = "";
do {
int tempLimit = skipLimit - accumulatedCount;
tempQuery = replaceClause(tempQuery , "LIMIT", tempLimit + "");
Result tempResult = sdb.select(query, token);
token = tempResult.getToken();
accumulatedCount += tempResult.getCount();
} while (accumulatedCount < skipLimit);
return token;
}
private int extractLimitValue(String query) {...}
private String replaceClause(String query, String clause, String value){...}
Esta es la idea general y sin control de errores, y funciona para cualquier página cualquiera, con exclusión de la página 1.
¡Gracias por su minuciosa respuesta! – royco
Excelente respuesta, gracias – theosp
cuando ejecuto una declaración para contar hasta el límite, no obtengo un token al final de mis resultados (incluso cuando paso por tokens) ¿Me falta algo? –