2016-01-27 21 views
6

Sto utilizzando RemoteAPI (Java) per passare attraverso un set di dati di grandi dimensioni, ~ 90 K entità ed eseguire alcuni migrazione dei dati.Interrogazione datastore con limite

int CHUNK_SIZE = 500; 
int LIMIT = 900; 

QueryResultList<Entity> result = ds.prepare(entityQuery) 
.asQueryResultList(
    FetchOptions.Builder 
    .withPrefetchSize(CHUNK_SIZE) 
    .limit(LIMIT) 
    .chunkSize(CHUNK_SIZE) 
).startCursor(cursor); 

Con la query LIMIT insieme al 900 il result.size() è l'intero set di dati, ~ 90K, invece di 900. Se provo a diminuire LIMIT, ad esempio 300, la dimensione del risultato è quella prevista (300).

Cosa mi manca qui? Dalla documentazione non sono riuscito a capire perché produce il comportamento che sto descrivendo qui.

+1

Sto forse dicendo qualcosa di stupido ma hai provato a cambiare l'ordine delle tue opzioni? FetchOptions.Builder.withLimit (LIMIT) .withPrefetchSize (CHUNK_SIZE) .chunkSize (CHUNK_SIZE) ) .startCursor (cursore); – yannicksoldati

+0

Correggetemi se ho torto ma non vedo il metodo '.limit' nel Riepilogo dei metodi per l'oggetto' FetchOptions.Builder' (vedi: https://cloud.google.com/appengine/docs /java/javadoc/com/google/appengine/api/datastore/FetchOptions.Builder). Dovrebbe essere '.withLimit' invece. –

risposta

0

Sulla base di questi esempi (http://www.programcreek.com/java-api-examples/index.php?api=com.google.appengine.api.datastore.QueryResultList)

Penso che si dovrebbe usare .withLimit(LIMIT) invece di .limit(LIMIT) entro i .asQueryResultList opzioni

Quindi mi sento di ristrutturare il codice come segue:

FetchOptions options = FetchOptions.Builder 
    .withLimit(LIMIT) 
    .withPrefetchSize(CHUNK_SIZE) 
    .chunkSize(CHUNK_SIZE); 

QueryResultList<Entity> result = ds.prepare(entityQuery) 
    .asQueryResultList(options); 

Poi ottenere il cursore

result.getCursor(); 
Problemi correlati