ノードコールバック ¶
パーティショナー系ノード用のメインのコールバックメソッドはonPartitionです。
このメソッドは、入力として上流ワークアイテムのリストとパーティション構築用のファクトリーオブジェクトを受け取ります。
このコールバック関数では、パーティションオペレーションのステータスを示した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関数の実装例です:
def onPartition(self, partition_holder, work_items): 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 return pdg.result.Success
また、オプションのonPostPartition(self, partition, partition_items)メソッドを実装することで、パーティショニング工程が終わった後の各パーティションに対して独自のロジックを実行することができます。
以下のサンプルは、パーティション内のワークアイテムIDのリストを含んだ配列アトリビュートを各パーティション上に作成する実装です:
def onPostPartition(self, partition, partition_items): item_ids = [item.id for item in partition_items] partition.setIntAttrib("contents", item_ids) return pdg.result.Success