Как выбрать один из многих свойств - PullRequest
1 голос
/ 21 сентября 2011

У меня есть приложение appengine, которое работает уже около года, до сих пор я в основном использовал запросы JDO, но я пытаюсь собирать статистику, а запросы занимают слишком много времени. У меня есть следующий объект (устройство)

public class Device implements Serializable{
    ...
    @Persistent
    private Set<Key> feeds;// Key for the Feed entity
    ...
}

Итак, я хочу узнать, сколько устройств имеют определенный канал. Я делал это в JDOQL раньше как таковой (использует javax.jdo.Query):

Query query = pm.newQuery("select from Device where feeds.contains(:feedKey)");
Map<String, Object> paramsf = new HashMap<String, Object>();
paramsf.put("feedKey",feed.getId());
List<Device> results = (List<Device>) query.executeWithMap(paramsf);

Хотя этот код истекает сейчас. Я пытался использовать API хранилища данных, чтобы я мог установить размер чанка и т. Д., Чтобы посмотреть, смогу ли я ускорить запрос или использовать курсор, но я не уверен, как искать в поле Set. Я пытался это (использует com.google.appengine.api.datastore.Query)

Query query = new Query("Device");
query.addFilter("feeds", FilterOperator.IN, feed.getId());
query.setKeysOnly();
final FetchOptions fetchOptions = FetchOptions.Builder.withPrefetchSize(100).chunkSize(100);
QueryResultList<Entity> results = dss.prepare(query).asQueryResultList(fetchOptions);

По сути, я не уверен, как искать в одном (многих) полях (фидах) один ключ. Можно ли как-то его проиндексировать?

надеюсь, что это имеет смысл ....

1 Ответ

1 голос
/ 21 сентября 2011

Списки (и другие вещи, которые реализованы в виде списков, например, наборов) индексируются индивидуально. В результате вы можете просто использовать фильтр равенства в своем запросе так же, как если бы вы фильтровали одно значение, а не список. Запись будет возвращена, если какие-либо элементы в списке совпадают.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...