ノードコールバック ¶
パーティショナー系ノードには、上流ワークアイテムのリストを入力として受け取るコールバック関数の1つしかありません。 このコールバック関数では、パーティションオペレーションのステータスを示したpdg.result値を返す必要があります。
onPartition(self, partition_holder, work_items)
→ pdg.result
このコールバックは、PDGグラフのクック中にパーティショナー毎に1回評価、または、( Split by Attribute が 有効 な場合)固有のアトリビュート値毎に1回評価されます。
パーティショナーが静的だった場合、このコールバックは静的プリパス時に実行されます。
動的だった場合、すべての入力ワークアイテムが生成された後にクック時に評価されます。
この関数のwork_items
引数には、パーティションの対象となる上流ワークアイテムのリストを渡します。
partition_holder
引数には、パーティションの作成で使用されるpdg.PartitionHolderクラスのインスタンスを渡します。
各パーティションは、onPartition
関数から提供された固有の数値を使って定義されます。
ワークアイテムは、addItemToPartition
関数にそのワークアイテム自身とパーティション番号を引数に渡すことでパーティションに追加されます:
# 各ワークアイテムを固有のパーティションに追加します。 partition_holder.addItemToPartition(work_items[0], 0) partition_holder.addItemToPartition(work_items[1], 1) # 両方のワークアイテムを3番目の共通パーティションに追加します。 partition_holder.addItemToPartition(work_items[0], 2) partition_holder.addItemToPartition(work_items[1], 2)
ワークアイテムを複数のパーティションに追加したり、どのパーティションにも追加しないようにすることもできます。 場合によっては、作成されるパーティションの数がわかる前に、ワークアイテムをすべてのパーティションに追加したい事があります。 addItemToAllPartitionsメソッドは、そのワークアイテムがすべてのパーティション(そのコールの後で追加されたパーティションも含む)に属することをマークします。
他にも、ワークアイテムをそのパーティションで requirement(必須) としてマークすることもできます。
必須としてマークされたワークアイテムが削除されると、パーティション内にまだ他のワークアイテムが存在していても、そのパーティションもまるごと削除されます。
例えば、上流ワークアイテムのペアからパーティションを作成するPartition by Combinationがこの挙動に該当します。
ペアのどちらかのワークアイテムが削除されると、もはやペアではなくなるので、そのパーティションが無効になります。
以下のコードは、入力ワークアイテムの固有のペア毎にパーティションを形成するonPartition
関数の実装例です:
partition_index=0 # ワークアイテムの外側ループ for index1, item1 in enumerate(work_items): # ワークアイテムの内側ループ for index2, item2 in enumerate(work_items): # 順番はどうであれ、ワークアイテムのペア毎に1つだけパーティションを作成したいとします。 # 以下のチェックがなかった場合、(a,b)と(b,a)の両方に対してパーティションが作成されてしまいます。 if index2 <= index1: continue # 次で利用可能なパーティションに両方のワークアイテムを追加し、それらのワークアイテムをrequired(必須)としてフラグを立てます。 partition_holder.addItemToPartition(item1, partition_index, True) partition_holder.addItemToPartition(item2, partition_index, True) partition_index += 1