2016-01-27 6 views
6

Я использую RemoteAPI (Java) для прохождения большого массива данных ~ 90K и выполнения некоторой миграции данных.Datastore query with limit

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); 

С набором запросов LIMIT к 900result.size() является весь набор данных, ~ 90К, а 900. Если я попробую более низкий LIMIT, скажем 300, размер результата является ожидаемым (300).

Что мне здесь не хватает? Из документации я не мог понять, почему она порождает поведение, которое я описываю здесь.

+1

Я, может быть, говорю что-то глупое, но вы пытались изменить порядок своих вариантов? FetchOptions.Builder.withLimit (LIMIT) .withPrefetchSize (CHUNK_SIZE) .chunkSize (CHUNK_SIZE) ) .startCursor (курсор); – yannicksoldati

+0

Исправьте меня, если я ошибаюсь, но я не вижу, чтобы метод '.limit' находился в сводке методов для объекта' FetchOptions.Builder' (см. Https://cloud.google.com/appengine/docs /java/javadoc/com/google/appengine/api/datastore/FetchOptions.Builder). Вместо этого должен быть '.withLimit'. –

ответ

0

На основе этих примеров (http://www.programcreek.com/java-api-examples/index.php?api=com.google.appengine.api.datastore.QueryResultList)

Я думаю, что вы должны использовать .withLimit(LIMIT) вместо .limit(LIMIT) в пределах .asQueryResultList вариантов

Так что я бы реструктурировать свой код следующим образом:

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

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

Тогда get cursor

result.getCursor();