非分数の時間範囲をモデル化する場合、次のいずれかになると想像してください。
"1 hour" (all/any 1 hour period)
"1 hour, starting 1pm") (all/any 1 hour periods that start at 1pm)
"1 hour, starting 1pm, on Wednesdays" (all/any 1 hour periods that start at 1pm on wednesdays)
"1 hour, starting 1pm, on 3rd Wednesday in November"
"1 week, starting the first week in November"
あなたはアイデアを得る。追加の目標は、これらの範囲のオーバーラップとサブセットを簡単かつ効率的に計算することです。例: 「水曜日の午後 1 時からの 1 時間」は「午後 1 時からの 1 時間」と重複します。
追加情報: これはベースライン システムの期間用です。ベースライン セグメントの期間を複数の粒度で設定したいと考えています。午後 1 時の任意の 1 時間のベースライン、または 11 月の第 3 水曜日の午後 1 時からの 1 時間のベースラインと同様です。
追加の考慮事項は、これらのベースライン期間が非 SQL ストアに格納されることであり、ストアに存在する最小の粒度で期間を効率的に微調整するとよいでしょう。(特定の日 - 週 - 時間の期間は存在しますか? いいえ、週 - 時間はどうですか?、いいえ、日 - 時間の期間はどうですか?) - それが理にかなっている場合。ある種の木のような階層かもしれません。
編集: 保存とクエリの部分は、おそらく最も重要な要件です。何十億もの期間が保存されるため、可能な限り高速に検索する必要があります (存在する最も細かい粒度を見つけます)。ルックアップの速度のために、喜んで完全性を犠牲にします。
編集:それについてもっと考えて、データストアにどのように保存する必要があるかを考えると、ツリーのような構造は効率的なルックアップに適しているかもしれません. ツリーをたどって、存在する最高の粒度を得ることができます。
1hr
/
1hr@1pm
/
1hr@1pm@wednesday
/
1hr@1pm@wednesday@November
これは私が思いついたものですが、かなり弱いと感じています。私はそれをいじってここで更新し続けるつもりですが、誰かがこれをモデル化するよりスマートな方法を持っているかどうか知りたいです.
public class DateRange {
Integer fTimeSpan;
TimeUnit fTimeUnit;
Integer fStartHour;
Integer fStartDay;
Integer fStartWeek;
Integer fStartMonth;
boolean intersects(DateRange other) { ... }
}
enum TimeUnit {
HOURS,
DAYS,
WEEKS,
MONTHS;
}
編集: ツリーベースの構造 (上記の私の編集のように) は、はるかに単純になります。大粒スパンの未使用フィールドはありません。粒度は、データ構造ではなくツリーになります...
public class RangeTreeNode {
TimeUnit fTimeUnit;
int fStartTime;
int fSpanTime;
List<RangeTreeNode> fChildren;
}