Хранилище данных App Engine получает количество детей от нескольких родителей - PullRequest
1 голос
/ 26 октября 2010

Я использую хранилище данных Google App Engine (DataNucleus). У меня есть два класса, один чат и один рейтинг. Чат может быть оценен больше, чем один, поэтому я создал отношение один-много, добавив список в класс Chat.

Теперь я хочу узнать количество чатов без рейтинга, поэтому я сделал следующее:

int numberOfChatsInStock = 0;
for(Chat chat : chats){
  if(chat.getRatings().size() == 0){
    numberOfChatsInStock++;
  }
}

Он просто перебирает все чаты и проверяет, равно ли количество оценок 0.

Это решение хорошо работает, когда есть 10 чатов, но когда у меня 500+ чатов, скорость ужасна (15 секунд +).

Я подумал, что метод size () работает быстрее. Поэтому я попытался Query.setFilter ("ratings.size () == 0"), но это дает мне следующую ошибку: Неподдерживаемый метод при разборе выражения: InvokeExpression {[PrimaryExpression {рейтинги}]. Size ()}

Есть ли способ увеличить скорость?

EDIT РЕАКЦИЯ ОТ DATANUCLEUS EXPERT:

Это плагин Google, и они несут за него ответственность (и тот факт, что они не реализовали этот метод, является их проблемой ... Я уверен, что их хранилище данных предлагает способ получения размера коллекции). Их плагин использует только DataNucleus 1.1, и в настоящее время мы разрабатываем 2.2, поэтому, как вы можете догадаться, у нас не так много времени для среды GAE / J.

Почему Google использует версию 1.1?

1 Ответ

0 голосов
/ 26 октября 2010

Вы должны вести подсчет рейтинга по модели чата. Затем вы можете выполнить запрос, чтобы выбрать все чаты с 0 оценками.

...