2

開始と終了の予約があります(例をより明確にするために、リソースへの参照は削除されています):

class Reservation(db.Model):
  fromHour = db.DateTimeProperty()
  toHour = db.DateTimeProperty()
  fromToRange = db.ComputedProperty(lambda x: [x.fromHour, x.toHour])

そして、前の予約と重複していないかどうかを確認して別の予約を追加したい-GoogleAppEngineでそのようなクエリを表現する方法。

最初にlistプロパティを使用してこのクエリを試しましたが、二重不等式フィルターが機能しません。from1<to2とfrom1>=from2の2つの一致と、1つの結果を実行する必要があります。データが増えるとコストがかかる可能性があります。

fromHour = datetime.datetime(2012, 04, 18, 0, 0, 0)
toHour = datetime.datetime(2012, 04, 18, 2, 0, 0)

reservation = Reservation(fromHour = fromHour, toHour = toHour, colors = ['white', 'black'])
reservation.put()

self.response.out.write('<p>Both %s</p>' % fromHour)    
self.response.out.write('<ol>')    
for reservation in Reservation.all()\
  .filter('fromToRange >', fromHour)\
  .filter('fromToRange <=', fromHour):
  self.response.out.write('<li>%s</li>' % (reservation.fromToRange))
self.response.out.write('</ol>')

日を含む追加のプロパティを使用できる別の解決策を見つけました(これは予約ごとの範囲内の日数のリストになります)。データのスキャンを絞り込み、新しい予約と重複していない場合はすべてのレコードをチェックする必要があります。

重複する予約を検出するために最適なクエリを実行する方法を支援し、回答を提供してください-Google App Engineでの時間範囲クエリの迅速な第3の解決策があるか、サポートされていない可能性があります。

4

1 に答える 1

3

はい、クエリに対する複数の不等式フィルターの制限により、いくつかのことが非常に困難/最適ではなくなります。たとえば、地理検索。

あなたが提案した解決策を使用します: プロパティ値を量子化し、量子化されたすべての値をリスト プロパティに保存します。たとえば、期間が包括的に及ぶすべての日をリスト プロパティに保存します。難しいのは、適切なクオンタイズ レベル (日、時間など) を選択することです。

個人的には、ユニバーサル タイム スケールである Unix 時間 (エポック) から始めて、それを秒に丸め、10 進数で量子化します。たとえば、そこから 3 つのゼロを切り取り (1000 秒の量子化器、スパン ~ 16 分)、開始時刻から終了時刻までのすべての量子化された値をリストに保存します。

量子化器が細かすぎる場合は、より大きなものを使用してください: 10000 秒。

次に、等式フィルターを使用してリスト プロパティをクエリし、メモリ内の結果をさらにフィルター処理して、正確な期間の開始時刻と終了時刻を考慮することができます。

于 2012-04-18T11:31:52.773 に答える