Индексирование рабочих часов с помощью Google App Engine - PullRequest
3 голосов
/ 09 марта 2012

Учитывая временной интервал в дне (рабочие часы), как вы можете создать индекс, который будет возвращать сущность с учетом текущего времени.

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 10 марта 2012

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

now = 1200
Select * FROM Business WHERE now in hours

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

СТАРЫЙ ОТВЕТ (Не читать) : я делаю что-то похожее, у меня нет действительно решения, кроме как "попробовать что-то другое".

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

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

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

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

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

0 голосов
/ 09 марта 2012

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

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

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

...