Я хочу использовать в своей игре рекорды из интернета. И сообщать игрокам, какое у них место (не только топ100 или что-то в этом роде). В обычном SQL это выглядело бы так:
ВЫБРАТЬ СЧЕТЧИК (*) ОТ Очки ГДЕ очки>: newUsersPoints
и в GQL есть что-то похожее
db.GqlQuery ("ВЫБРАТЬ * ИЗ Score WHERE points>: 1", newUsersPoints) .count ()
но поскольку count () ограничен только 1000, в моем случае это не будет очень полезно. У вас есть идеи, как это реализовать?
У меня два
Первый:
Идея использования счетчиков сегментирования (http://code.google.com/intl/pl/appengine/articles/sharding_counters.html) Создайте новую «таблицу», в которой хранится, сколько баллов находится в некотором диапазоне (from_points, to_points)
Просуммируйте все счетчики из приведенной выше таблицы, где range.to_points ‹newUsersPoints
Найдите, на сколько баллов больше баллов в диапазоне, где новый балл - db.GqlQuery («ВЫБРАТЬ * ИЗ баллов ГДЕ баллов>: 1 И баллов> =: 2 И баллов‹: 3 », newUsersPoints, range.from_points, range. to_points) .count () + sumfrom2
Найдите диапазон, в котором находится новый счет, и увеличьте его счетчик
Разделите диапазоны, счетчик которых больше 1000 (или 999), чтобы 3. не достигала предела.
Добавить новый счет в таблицу результатов
Что довольно сложно и подвержено ошибкам. Мы могли бы увеличить некоторый диапазон и тайм-аут перед добавлением оценки. (не транзакционный)
Вторая идея:
Время от времени (один раз в день?) Сортируйте все результаты по баллам и присваивайте им новые позиции (сценарий может Тайм-аут, поэтому мы должны делать это по частям)
Чтобы узнать, в каком месте новый счет, мы просто делаем
db.GqlQuery ("SELECT * FROM Score WHERE points>: 1 LIMIT 1", newUsersPoints) .get (). precalculated_position + 1
Есть другие идеи?