2013-07-09 3 views
2

Я новичок. Я пишу приложение для места лазерной метки, где у нас есть дети многих возрастов, которые собираются стрелять лучами друг на друга. Мы делаем экран с высоким рейтингом, который отображает лучшие результаты дня, недели и месяца. Идея состоит в том, что люди будут гордиться тем, что будут в списке, а также будут призовые места раз в месяц.Запрос на сегодня, в течение недели, и в течение месяца

Я застрял на всей фильтрации по дате.

Я в основном модифицировал классический пример гостевой книги до того места, где я могу добавить оценки и информацию о клиентах, и отсортировать их по количеству баллов.

Key guestbookKey = KeyFactory.createKey("Guestbook", guestbookName); 
    String fornavn = req.getParameter("fornavn"); 
    Integer score = Integer.parseInt(req.getParameter("score")); 
    String email = req.getParameter("email"); 
    String tlf = req.getParameter("tlf"); 
    Date date = new Date(); 
    Entity highscore = new Entity("Greeting", guestbookKey); 
    highscore.setProperty("date", date); 
    highscore.setProperty("fornavn", fornavn); 
    highscore.setProperty("score", score); 
    highscore.setProperty("email", email); 
    highscore.setProperty("tlf", tlf); 

    DatastoreService datastore = DatastoreServiceFactory.getDatastoreService(); 
    datastore.put(highscore); 

А в JSP есть запрос, который захватывает общую наверх 5.

Query query = new Query("Highscore", highscoreKey).addSort("score", Query.SortDirection.DESCENDING); 
List<Entity> greetings = datastore.prepare(query).asList(FetchOptions.Builder.withLimit(5)); 

И есть форма, которая отправляет данные, введенные пользователем на .java. Какие-нибудь советы, как мне настроить даты? Сохранять неделю # и месяц # и запрос на основе этого? Кажется громоздким.

+0

+1 для лазертага. Потрясающие! – iamnotmaynard

ответ

1

От всего, что я могу сказать, ваш вид «HighScore» на самом деле является «Score», который отслеживает все оценки.

Вместо того, чтобы запрашивать высокий балл за неделю/месяц, вам, вероятно, лучше иметь один объект HighScore (который отделен от обычных объектов «Оценка»), которые вы обновляете всякий раз, когда вводите счет. Каждый раз, когда вводится новый счет, проверьте, нужно ли обновлять высокий балл.

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

Или вы можете захотеть отдельного объекта высокой оценки за каждый месяц/неделю и т. Д., Чтобы вы могли отслеживать историю. В этом случае вы можете запрограммировать неделю или месяц на ключ сущности, чтобы вы могли легко получить текущую неделю/месяц HighScore.

1

Есть 2 возможных подходы для требования, как ваши, где вы хотите, чтобы показать рекорды на день, неделю, месяц и т.д.:

1, первый вариант использовать текущую модель, в которой вы дату хранения и Гол. Поскольку движок приложения позволяет фильтровать неравенство только по свойству 1, вам нужно применить фильтр неравенства на дату, а затем найти n наибольшее количество баллов. Но так как результат сначала будет отсортирован для свойства с фильтром неравенства, а затем для любого дополнительного свойства, вы не сможете сделать выборку только для первых n записей, чтобы найти верхний n, потому что верхние оценки не обязательно должны быть в непрерывном порядке. См. this post, чтобы понять это лучше. Таким образом, вам нужно будет получить все оценки для диапазона дат, а затем выполнить дальнейшую сортировку результата запроса на вашем клиенте, чтобы найти верхний n. Этот подход подходит, если общее количество баллов за неделю или месяц не будет слишком высоким по сравнению с значением n. Если нет, это не масштабируемый вариант.

2, Второй подход заключается в том, чтобы переделать вашу модель таким образом, чтобы сортировка происходила на основе так, чтобы для получения лучших результатов за определенный период вам нужно было выбрать только первые n записей. Это означает, что подход подходит, даже если количество баллов очень велико. Для этого необходимо преобразовать дату, подходящую для фильтрации равенства, как для каждой записи, хранящей номер месяца, номер недели и календарный год. Затем, например, если вы хотите найти верхние n баллов за 3-й месяц, вы можете запросить month=3, sort by scores descending и получить первые n совпадающих записей. Аналогичным образом вы можете запросить определенную неделю с использованием номера недели.

0

Это очень похоже на другой вопрос с высоким рейтингом. Я скопировал/наклеил свой ответ ниже.Приближение этого решения с использованием запроса базы данных может привести к тому, что вы присоединитесь к рядам людей, которые жалуются на GAE. Вы будете использовать пользовательский индекс. Вероятно, ваш запрос будет в среднем на 10x миллисекунд медленнее, чем требуется для каждого запроса. Вам нужно будет индексировать тысячи, возможно, миллионы записей. Это стоит вам денег - возможно, из-за высокой латентности, что может быть высокой функцией обработчика, возможно, это как повторное хранилище данных (индексы), так и экземпляры. Поразмыслите, пожалуйста. Моя копия/вставка не так специфична для вашей установки, но ее легко можно легко расширить. Я надеюсь, что это может побудить вас подумать о более низком ресурсе, более дешевой альтернативе. Как всегда ... HTH. -stevep

Предыдущий ответ на высокий балл: Возможно, вы захотите рассмотреть альтернативный подход. Это много накладных расходов на индекс, что приведет к тому, что ваши затраты будут выше, время отклика для обработчика, выполняющего эту функцию, будет работать на порядок медленнее, и у вас появятся моменты, когда возможная согласованность обновлений индекса повлияет на поддержание этих данных , Если у вас занятый сайт, вы наверняка не будете довольны латентностью и расходами, связанными с этим подходом.

Существует несколько альтернативных подходов. Ваши ожидаемые транзакции на сайте в секунду повлияют на то, что вы выберете. Вот очень простая альтернатива. Создайте объект ndb с помощью TextProperty. Сериализуйте записи верхнего уровня с помощью строки, такой как score_userid. Сохраните их в текстовом поле, присоединив их к уникальному символу. Когда приходит новый счет, используйте get_by_id для извлечения этой записи (ndb автоматически обрабатывает memcaching для вас). Разделите его на массив. Разделите последний элемент массива и проверьте новый балл. Если это меньше, чем оценка, отбросьте его и добавьте новую строку score_userid в массив. Сортируйте массив, присоедините его и поместите() новый TextProperty. Если вы хотите, вы можете настроить конец дня cron, чтобы отсканировать свои оценки за день, чтобы проверить, не повлиял ли ваш процесс на очень малую вероятность того, что два счета достигли почти того же времени, заставив их перезаписать другой. НТН. -stevep

Предыдущей ссылка SO высокого балла ответа:

GAE datastore query with filter and sort using objectify

Смежные вопросы