リスト機能参照
概要と主要な概念
リスト(グローバルリストと呼ばれることもあります)は、3Dオブジェクトと処理フロー間のより複雑なフローを作成するために使用できるツールです。
値とプラー
このドキュメントや他のドキュメントでは、値または値オブジェクトとプラーまたはプラーオブジェクトという用語が頻繁に使用されます。これらの用語は、リストに関する特別な意味を持っています。何かをリストにプッシュすると、そのリストにプッシュされた値であるプライマリ値を含むエントリがリストに作成されます。たとえば、フローアイテムをアイテムリストにプッシュします。リストにプッシュされた各アイテムには、それぞれ独自のエントリがあります。そのため、各エントリのプライマリ「値」は、そのエントリに関連付けられているアイテムになります。値は文字列または数値である可能性がありますが、多くはフローアイテムのようなオブジェクトです。したがって、値オブジェクトと呼ぶ場合、エントリのプライマリ値は、実際にはフローアイテムのようなオブジェクト参照であると見なされます。
同様に、各バックオーダーにも、関連付けられているプライマリ「値」がありますが、混乱を避けるために、これを「プラー」と呼びます。リストエントリ値と同様に、バックオーダープラーは数値または文字列のどちらでもかまいませんが、通常はオブジェクト参照です。そのため、プラーがオブジェクトであると見なされる場合は、プラーオブジェクトという用語を使用します。アイテムリストの例では、通常は固定リソースがアイテムリストからプルしている「プラーオブジェクト」になり、次に受け取るアイテムを見つけようとします。
プルする
リストからプルすると、エントリについてリストがクエリされます。最も基本的なプルは、エントリの値に関係なく、プルするエントリの数のみを定義します。リストから特定の値を(場合によっては特定の順序で)プルする場合は、SQLクエリをプルに追加できます。クエリの記述方法の詳細については、以下の「クエリ構文」セクションを参照してください。
リストから特定のオブジェクトやノードをプルする必要がある場合は、2つの方法を使用できます。最初の方法は、WHERE句を使用します。例:
WHERE value = Model.find("MyObject")
List("List1").pull("WHERE value = Model.find(\"MyObject\")")
2番目の方法は、SQLをスキップして直接オブジェクトに参照を渡します。
List("List1").pull(Model.find("MyObject"))
このプル方法は、モデル内を移動するフローアイテムや他のオブジェクトをプルする場合に特に役立ちます。バックオーダーが作成された場合は、オブジェクトやノードへのパスがクエリ列の下に表示されます。
クエリ構文
プルリクエストにSQLクエリを含めると、リストからプルする対象をフィルタリングしたり、優先度を付けたりすることができます。クエリには、通常、WHERE句やORDER BY句が含まれます。特別な場合には、SELECT句を使用できます。これには、このトピックの後半で説明する特別な意味があります。
WHERE queueSize < 5 ORDER BY age ASC
この参照では、FlexSimのSQL実装に固有の情報のみを記載しています。各言語の一般的な情報については、公開されているドキュメントを参照してください。
リストフィールドを使用する
デフォルトでは、WHERE句またはORDER BY句のフィールドを参照すると、リストのいずれかの定義済みフィールドが参照されます。
ORDER BY pushTime
ここで、ORDER BY句は、リストのpushTimeフィールドで昇順で優先度を付けます(SQLの場合、デフォルトは昇順です)。pushTimeフィールドはリストの定義済みフィールドであると見なされます。
ラベルにアクセスする
SQLクエリで定義したフィールドがリストの定義済みフィールドではない場合、クエリはエントリの値オブジェクトの同じ名前のラベル値を取得します。
WHERE SKU = "05692AQD"
この例では、SKUがリスト上のフィールドとして定義されておらず、アイテムリストである場合、クエリは、リストに追加されたアイテムの「SKU」という名前のラベルを取得し、「05692AQD」と比較します。
プラーと値のテーブル指定子
プラーオブジェクトのラベルには、キーワードの「Puller」テーブル指定子(後にドットを付けます)を使用してアクセスすることもできます。
WHERE step = Puller.step
ここでは、ステップフィールド(定義済みのリストフィールドまたは値オブジェクトのラベル)がプラーオブジェクトのステップラベルと比較されます。ここでは、データベーステーブルにアクセスするためのSQL構文を参照する「テーブル指定子」を使用します。リストは「Value」という名前のデータベーステーブルとして概念化されます。これは、プラーオブジェクトのラベルがプラーテーブルのフィールドに似ている、プラーと呼ばれる1行を含む1つのテーブルと内部結合するようなものです。
デフォルトでは、テーブル指定子を残しておくと、リストの定義済みフィールドまたは値オブジェクトのラベルと見なされますが、よりわかりやすいように、キーワードの「Value」テーブル指定子を明示的に使用できます。
WHERE Value.step = Puller.step
ここでは、「Value」と「Puller」には、好みに応じて小文字または大文字を使用できます。FlexSimでは、通常、テーブルには大文字、フィールドにはローワーキャメルケースを使用します。
SQLクエリでFlexScriptコマンドを使用する
SQLクエリでFlexScriptコマンドを使用することもできます。
ORDER BY round(distance / 100) ASC, age DESC
このORDER BY句は、距離フィールドを取得し、それを100単位の距離範囲に分類するため、距離130は距離95と結合されますが(round(130 / 100) == round(95 / 100)
、距離200よりも優先度が高くなります(round(130 / 100) < round(200 / 100))
。結合は2番目の優先度の句を使用し、経過時間の大きい順に優先度を付けます。
SELECT句を使用する
SELECT句は、クエリを使用してリストからプルする場合に特別な意味を持ちます。リスト上の離散エントリの代わりに、液量のようなリクエスト数量を使ってリストから対象をプルできます。たとえば、次のlistpull()コマンドの使用例を見てみましょう。
listpull("DoughBins", "SELECT kg", 4.5, 4.5)
DoughBinsリストのエントリは、プルしたときに次のように表示されるとします。
ここで、listpull()コマンドは、リストから多くの離散エントリをプルしようとする代わりに、必要な離散エントリ数に関係なく、合計4.5 kg単位をリストからプルしようとします。この場合、プルオペレーションはBin1672から3.7 kgをプルします。次に、残りの0.8 kgをBin3105からプルします。listpull()コマンドは、その後、Bin1672とBin3105の両方からなる配列を返します。
オーバーフロー管理
この例は、リストが残りの量(すなわちBin3105の残りの5.4 kg)をどのように管理するかという問題に当然つながります。リストでは、リストからのエントリの削除はどのように行われるでしょうか?Bin1672はすべてのkg量がプルされたため、リストから削除する必要があることは明らかです。しかし、Bin3105についてはどうしたらよいでしょうか。これには、論理的にリストからプルされていない「オーバーフロー」が含まれています。Bin3105はリストから削除する、またはそのまま残しておく必要がありますか?その答えは、SELECT句で照会しているフィールドの性質によって異なります。
追跡可能なオーバーフロー
SELECT句で定義されたフィールドが次のいずれかの要件を満たしている場合、リストはオーバーフロー量を追跡します。
- 句が動的ラベルフィールドを参照している。
- 句がリストのフィールドとして明示的に定義されていないラベルを参照している。
- 句が非動的フィールドを参照している。
いずれかの要件を満たす場合、リストはそのフィールドの値を追跡し、値を0に減らします。その時点で、そのエントリはリストから削除されます。ラベルが使用される場合(オプション1または2)、プルオペレーションは、プルする有効なエントリを見つけると、プルされた量だけラベルの値を減らします。したがって、この例では、Bin1672のkgラベルは0に減らされ、Bin1672はリストから削除されます。次に、Bin3105のkgラベルが5.4に減らされますが、0より大きいためリストに残ります。後続のプルオペレーションは、Bin3105のkg量が正しく減らされたリストからプルします。
非動的フィールドが使用される場合(オプション3)、リストにはそのフィールドのキャッシュされた値が格納されるため、プルオペレーションは、リストから数量がプルされるたびにそのキャッシュされた値を減らします。この値はリストにある間に変化するため、「非動的」という呼び方は明らかに間違っています。この場合、このフィールドは、「キャッシュされた」フィールドまたは「再評価されていない」フィールドと考えることができます。
追跡不可能なオーバーフロー
次の場合は、リストがオーバーフロー量を管理しないSELECT句です。
- 句が動的非ラベルフィールドを参照している。
- 句が1つのフィールドに減らないSQL式(
SELECT length * width
)である。
追跡不可能なオーバーフローを伴うSELECT句が使用されると、オーバーフロー量を含むエントリは、返されるときにリストから削除されます。つまり、上の例では、Bin3105は論理的に5.4 kg残っている場合でもリストから削除されます。
SELECT句の制約
リストのプルオペレーションでは、SELECT句は1つの「列」のみを参照します。つまり、通常のSQLクエリのようなカンマ区切り列のリストにすることはできません。追加の列は無視されます。
query()コマンドでリストを使用する
query()コマンドでグローバルリストをSQLクエリに統合することもできます。このリストをFROM句に指定されたテーブルとして含めると、通常そのフィールドにアクセスできます。ここでは、プラー依存フィールドは使用しないでください。パーティション分割されたリストの場合は、テーブル名をListName.$1としてエンコードし、パーティションIDを最初の追加パラメータとしてquery()に渡す必要があります。または、パーティションIDが文字列の場合は、その文字列を直接テーブル名にエンコードできます。たとえば、テーブル名がListName.Partition1の場合は、「ListName」という名前のグローバルリストと「Partition1」というパーティションIDを使用します。
イベント
OnPushイベントとOnPullイベントを使用して、リストからプッシュおよびプルされた値をリッスンできます。
On Push
On Pushは、値がリストにプッシュされるたびに発生します。
次のパラメータがあります。
イベントパラメータ | タイプ | 説明 |
---|---|---|
値 | バリアント | リストにプッシュされた値 |
パーティションID | バリアント | 値がプッシュされたパーティション |
結果 | バリアント | 値がすぐにプルされなかった場合のリストエントリエンティティ |
On Pull
On Pullは、オブジェクトがリストから値をプルしようとするたびに発生します。
次のパラメータがあります。
イベントパラメータ | タイプ | 説明 |
---|---|---|
クエリ | 文字列 | listpullコマンドに渡されたクエリ |
リクエスト数 | 倍精度浮動小数点数 | listpullコマンドに渡されるリクエスト数 |
必要数 | 倍精度浮動小数点数 | listpullコマンドに渡される必要数 |
プラー | バリアント | listpullコマンドに渡されるオブジェクト |
パーティションID | バリアント | listpullコマンドに渡されるパーティション |
フラグ | 整数 | listpullコマンドに渡されるプルフラグ |
結果 | バリアント | バックオーダーがすぐに処理されなかった場合のリストバックオーダー |
On Value Pulled
On Value Pulledは、リスト上の値がリクエストを満たした場合に発生します。
次のパラメータがあります。
イベントパラメータ | タイプ | 説明 |
---|---|---|
値 | バリアント | リストからプルされた値。 |
プルされる数量 | 倍精度浮動小数点数 | SELECTステートメントを使用して値をプルする場合は、これがこのエントリ上のラベルからプルされる数量になります。そうでない場合は、この値が1になります。 |
パーティションID | バリアント | エントリのパーディションID。 |
プラー | バリアント | listpullコマンドに渡されるオブジェクト |
エントリ | ツリーノード | プルリクエストと一致したList.Entry。 |
削除するかどうか | 整数 | プルの結果としてエントリがリストから削除されるかどうかを指定します。 |
統計
リストは次の統計を保持します。
統計 | 説明 | 更新後 |
---|---|---|
入力 | リストにプッシュされた値の合計数 | プッシュ |
出力 | リストからプルされた値の合計数 | プル |
コンテンツ | 現在リストにある値の合計数 | プッシュ/プル |
滞在時間 | リストで各値が費やした合計時間 | プル |
バックオーダー入力 | このリストで作成されたバックオーダーの合計数 | プル(値をすぐにプルできない場合) |
バックオーダー出力 | 処理されたバックオーダーの合計数 | プッシュ(プッシュがバックオーダーを処理する場合) |
バックオーダーコンテンツ | 処理されていない現在のバックオーダー数 | プッシュ/プル(バックオーダーが作成または処理された場合) |
バックオーダー滞在時間 | バックオーダーが処理されるのを待つ時間 | プッシュ(プッシュがバックオーダーを処理する場合) |
さらに、リストは各パーティションごとに上の8つの統計を保持します。統計の名前は、先頭に「パーティション」という単語が追加されるだけです(パーティション入力、パーティション滞在時間、パーティションバックオーダー出力など)。