コレクションとオブジェクトの並び替え
一連のデータをソートするために、4D はデータの型に応じて定義された比較条件を適用することで、それぞれの値を他の値と比較します(並べ替えルール を参照してください)。 このプロセスは全ての要素に渡って総合的な並べ替えを確立するためのソートアルゴリズムに依存しています。 全てのデータが同じ データ型 に所属している場合、比較ルールは単純で正確に定義されています。
しかしながら、コレクション および entity selections も含めた オブジェクト は異種の型の要素や属性を格納することが可能です: これにはスカラー型(テキスト、数値、ブール、日付、) あるいは複雑型(オブジェクト、Blob、コレクション) が含まれます。 異なる種類の値を格納しているコレクションやオブジェクトの並べ替えをする場合、4D は戦略的な並べ替えスキームを適用します。まず最初に要素を型ごとに並べ替えし、その次に各型ごとの中で比較ルールを適用します。
並べ替え機能
4D ランゲージには、コレクション要素、オブジェクト属性をソートしたり、あるいは順序づけされた結果のためのソートを作成することに依存する複数の機構を提供します:
- コレクションの並べ替え用関数:
collection.multiSort()(明示的なキーと並べ替え指定を使用した複数条件並べ替え)、collection.orderBy()(各要素に対して式を評価することによる並べ替え)、collection.sort()(自然な並べかリレーションによるインプレースなソート) - エンティティセレクションの並べ替え用関数:
entitySelection.orderBy()、コレクションと同じ並べ替えルールを適用します。 - 並べ替え付きのクエリ関数:
entitySelection.query()、dataClass.query()に対してorder by attributePathキーワードを使用すると決定的な順序で結果を返します。 - 順序依存の統計関数:
collection.max()、collection.min()、entitySelection.max()、entitySelection.min()、 これらは極値を識別するために順序関係に依存します。 ORDER BY ATTRIBUTEコマンドを使用すると、オブジェクトフィールドに基づいてデータベースのテーブルを並べ替えることができます。
並べ替えルール
異なる型の要素を格納しているコレクションやエンティティセレクションをソートする場合、以下のアルゴリズムに従って、型ベースの階層化 が適用されます:
- 分割フェーズ: 要素はそれらのベースの型に基づいて同じクラスへとグループ分けされます。 このフェーズは要素の集合全体の型ごとの分割を確立します。
- クラス内の並べ替えフェーズ: 各クラスの中で、それぞれの要素は型特有の比較ルールに基づいてソートされます。 デフォルトの順序は昇順です。
型は以下の順序に従って並び、それぞれの比較関係は昇順になります:
| ランク | 型 | 以下のものも含まれます | 比較ルール |
|---|---|---|---|
| 1 | null | ポインター (ヌルポインターはコレクションのみ) | 適用できる比較条件はありません |
| 2 | boolean | 論理順: false がtrue の前になります | |
| 3 | string | 辞書式順序 (例: "a" の次に "ab"、 その次に "b") | |
| 4 | number | 時間 (Time inside objects データベース設定に応じて、ミリ秒または秒に変換されます) | 標準的な代数的順序 (数値比較) |
| 5 | オブジェクト | Blob、ピクチャー、ヌルでないポインター(コレクション) | 内部的な順序(コレクション関数と同じ、以下参照) |
| 6 | collection | 内部的な順序(コレクション関数と同じ、以下参照) | |
| 7 | 日付 | 時系列順(古い日付が新しい日付の 前 になります。例: !1990-01-01! の次に !2000-01-01!) |
特殊な数値
コレクションおよびオブジェクト内の特殊な浮動小数点値 +INF (正の無限大)、 -INF (負の無限大)、および NaN (Not-a-Number、数値ではない) は、以下の自然な順番 に従って並べ替えされます: NaN < -INF < 有限の値 < +INF 。
コレクション内での一貫した並び順
コレクションのソート関数(上記の並べ替え機能 の章を参照してください)はオブジェクトやコレクションなどの複雑な型のための 一貫したソート を実装しています。 ここでいう "一貫した" とは、同じコレクションに対して同じソート関数(例: collection.orderBy()) への連続した呼び出しをした場合、これらは複雑な型の値に対して同一の並べ替えの結果を生成するということです。 正式には、二つの要素に対してソート式が同じ比較結果をもたらす場合、それらの要素の相対的な順序は保持されるということです。
他の4D のソート操作で複雑な型の比較をした場合には、こういった同一性の保証はしないということです。