OutSystemsのStructureは再起的なデータ構造にできない。
つまり、要素として自分自身を持つことができない。
この点について確認し、対策を検討する。
環境情報
ODC Studio(Version 1.4.7 on Mac)
Structureの要素として自分自身を持つとエラーになりPublishできない
ODC Studio上で試しに再帰的なStructureを作ってみたところ、エラーになりPublishできない。
(ChildというAttributeが、自分自身のStructure RecursiveStructureをData Typeとしている)
表示されるエラーメッセージは以下の通り「Attributeが入れ子となる再帰的StructureをData Typeとして設定している」というものなので、やはり再帰的なStructureは定義できない。
Structure名.Attribute名 defines a nested recursive Structure data type definition.
回避策1: ツリー構造を平らにする
本来はツリー構造として表現したいデータのセットを、平たいデータ構造に展開して保持する。
具体的には、Attributeとして親ノードへのポインタや自分のノードの深さを持つようにする。
例:Forgeにある、ツリービューを実現するGtreeはこの方式をとっている。Node Structureがツリービューの各ノードを表しているが、各Nodeが自分と親NodeのIdを持つ構造。
"nested recursive Structure data type definition"で紹介されている方法。
回避策2: (深さが有限の場合) レベル別にStructureを定義する
深さが有限の場合は、深さごとに別のStructureとして定義する方法もある。
三階層程度であればこの方法が楽そう。
例:最大三階層の場合。以下の様に、ルートレベルのStructure「RecursiveLevel1」のChildren Attributeに第二階層用のStructure「RecursiveLevel2」のListを持たせる。
更に第二階層StructureのChildren Attributeには第三階層用のStructure「RecursiveLevel3]
のListを持たせる。
回避策3: (JavaScriptだけに閉じる場合) Javascript要素で対応
階層データがJavaScript内に閉じるのであれば、JavaScriptのコードで作成してしまえば良い。また、サーバサイドで必要であったとしても、階層構造のJSONで十分なら、JavaScriptでJSON化し、結果のText型変数を引き渡せば良い。
関連する話題
Entityは再帰的な構造にできる。
自分自身のIdentifierをData TypeとするAttributeを持てるということ。