2012-03-09 2 views
3

Учитывая временной диапазон за день (рабочее время работы), как вы могли бы создать индекс, который вернет объект с учетом текущего времени.Индексирование рабочих часов с помощью Google App Engine

Я допустил ошибку, предполагая, что свойство списка, содержащее только открытые и закрытые часы, может работать на движке приложения. Следующий терпит неудачу, потому что два неравенство фильтры должны соответствовать одинаковым значениям в списке:

Select * FROM Business WHERE hours < now AND hours > now 

Сейчас я несколько инвестирован и без решения помимо использования длинного списка раза, нарезанной каждые 30 минут, что кажется очень неэффективна:

[900, 930, 1000, 1030, 1100, 1130, 1200, 1230, 1300, 1330, 1400, 1430, ... ] 

Любой знаю умный способ хеширования открывать и закрывать раз или иным образом решить эту проблему?

ответ

0

Одним из таких действий было бы установить opentime и ближайшее время для каждого бизнеса и посмотреть, находится ли час дня между ними.

Однако с большим столом вам может потребоваться выполнить два отдельных запроса из-за индексации. Один запрос, чтобы узнать, больше ли времени, чем opentime, а другое, чтобы увидеть, меньше ли это времени. Это будет два индекса.

Не идеальное решение, но оно может быть более эффективным, чем то, что вы пытаетесь сделать.

+0

Да, большой стол также имеет ограничение только на допущение неравенства по одному свойству, хотя моя попытка использовать список. Если у меня есть, возможно, 9000 записей, которые мне нужно запросить, в вашем двух решениях запроса у меня появятся два довольно больших запроса, которые у меня есть, и после факта. Это фактически умножается, потому что у бизнеса действительно может быть несколько открытых и закрытых пар за день. – scottzer0

2

NEW ANSWER: Я немного подумал об этом, я думаю, что на самом деле у вас есть решение в вашей оригинальной идее. Для каждого бизнеса есть список ListProperty в магазине, который хранит только время, когда бизнес открыт, как и в настоящее время. Затем рассчитать текущее время, и вокруг него до ближайшего получаса, поэтому 12:50 -> 1200, а затем сделать запрос

now = 1200 
Select * FROM Business WHERE now in hours 

Я не уверен, о правильном синтаксисе запроса GQL, но определенно «в» фильтре.

OLD ОТВЕТ (Не читать): я делаю что-то подобное, я на самом деле не имеет решения, для «попробовать что-то другое», за исключением.

Во-первых, вам нужно хранить как открытые, так и закрытые времена. Либо как два отдельных поля, либо закодировать их в одно поле, например «09001700» для 9-5, или даже «M09001700». Или хэш два в ряд, я не думаю, что это имеет огромное значение, независимо от того, как вы это делаете.

Тогда плохие новости. Я не особенно хорош в теории чисел, но то, что мы пытаемся сделать здесь, это кодировать два линейных набора чисел (время открытия и закрытия) таким образом, чтобы вы могли сравнить линейное или < на третьем номере который представляет «сейчас». Я не думаю, что это возможно, вы можете получить только успешное> или < сравнение по одному из двух чисел - открытию или закрытию. Поэтому, учитывая, что мы можем выполнять только одно неравенство по одному свойству, я не думаю, что один единственный изолированный запрос может изолировать только открытые хранилища.

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

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

Решение, с которым я в конечном итоге отправился, может работать для вас, заключается в том, чтобы не запрашивать часы магазина вообще, а запрашивать то, что вернет более ограниченный набор данных, а затем отфильтровать возвращенные результаты на основе часов хранилища , Например, если ваши пользователи ищут по местоположению, запрашивают ваши предприятия на основе местоположения и фильтруют полученный бизнес по времени магазина, тогда отображаются только открытые для пользователя.

+0

Я фактически пошел по пути использования модели Expando и создавал динамические логические свойства, представляющие каждый день недели, и соответствующие открытые времена округлялись до ближайших 15 минут (да, лоты) логических свойств для каждой модели). Это работало в течение одного дня недели, но превысило 200 индексных квот на все дни. Проблема с методом списка: вы ограничены 30 элементами в списке, потому что значения в основном OR'd вместе являются отдельными запросами на задней панели. Я сейчас на самом деле тупик и хотел бы обсудить решения более подробно. – scottzer0

+0

Где вы получаете ограничение на 30 элементов? Предел составляет 5000 индексированных свойств для каждого объекта, и каждый элемент в списке будет считаться одним. У вас могут быть сложности, если вы ищете диапазон ([900,930,1000] IN часов), но поиск 1 раз в списке должен быть хорошим (930 часов). – dragonx

+0

Ах, я принял документы относительно фильтров IN в списках, которые ограничены 30, к этой ситуации, которая на самом деле наоборот. [link] (http://code.google.com/appengine/docs/python/datastore/datamodeling.html#Lists) – scottzer0

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