{
  "$schema": "../../../../node_modules/@bentley/presentation-common/Ruleset.schema.json",
  "id": "ui-framework/ModelsTree",
  "supportedSchemas": {
    "schemaNames": [
      "BisCore"
    ]
  },
  "rules": [
    {
      "ruleType": "RootNodes",
      "autoExpand": true,
      "specifications": [
        {
          "specType": "InstanceNodesOfSpecificClasses",
          "classes": [
            {
              "schemaName": "BisCore",
              "classNames": [
                "Subject"
              ]
            }
          ],
          "instanceFilter": "this.Parent = NULL",
          "arePolymorphic": false,
          "groupByClass": false,
          "groupByLabel": false
        }
      ],
      "customizationRules": [
        {
          "ruleType": "ExtendedData",
          "items": {
            "isSubject": "true"
          }
        }
      ]
    },
    {
      "ruleType": "ChildNodes",
      "condition": "ParentNode.IsOfClass(\"Subject\", \"BisCore\")",
      "specifications": [
        {
          "specType": "RelatedInstanceNodes",
          "relationshipPaths": [
            {
              "relationship": {
                "schemaName": "BisCore",
                "className": "SubjectOwnsSubjects"
              },
              "direction": "Forward",
              "targetClass": {
                "schemaName": "BisCore",
                "className": "Subject"
              }
            }
          ],
          "instanceFilter": "json_extract(this.JsonProperties, \"$.Subject.Job.Bridge\") <> NULL OR ifnull(json_extract(this.JsonProperties, \"$.Subject.Model.Type\"), \"\") = \"Hierarchy\"",
          "hideNodesInHierarchy": true,
          "groupByClass": false,
          "groupByLabel": false
        },
        {
          "specType": "RelatedInstanceNodes",
          "relationshipPaths": [
            {
              "relationship": {
                "schemaName": "BisCore",
                "className": "SubjectOwnsSubjects"
              },
              "direction": "Forward",
              "targetClass": {
                "schemaName": "BisCore",
                "className": "Subject"
              }
            }
          ],
          "instanceFilter": "json_extract(this.JsonProperties, \"$.Subject.Job.Bridge\") = NULL AND ifnull(json_extract(this.JsonProperties, \"$.Subject.Model.Type\"), \"\") <> \"Hierarchy\"",
          "hideIfNoChildren": true,
          "groupByClass": false,
          "groupByLabel": false
        }
      ],
      "customizationRules": [
        {
          "ruleType": "ExtendedData",
          "items": {
            "isSubject": "true"
          }
        }
      ]
    },
    {
      "ruleType": "ChildNodes",
      "condition": "ParentNode.IsOfClass(\"Subject\", \"BisCore\")",
      "specifications": [
        {
          "specType": "InstanceNodesOfSpecificClasses",
          "classes": {
            "schemaName": "BisCore",
            "classNames": [
              "GeometricModel3d"
            ]
          },
          "arePolymorphic": true,
          "relatedInstances": [
            {
              "relationshipPath": {
                "relationship": {
                  "schemaName": "BisCore",
                  "className": "ModelModelsElement"
                },
                "direction": "Forward",
                "targetClass": {
                  "schemaName": "BisCore",
                  "className": "InformationPartitionElement"
                }
              },
              "alias": "partition",
              "isRequired": true
            }
          ],
          "instanceFilter": "(parent.ECInstanceId = partition.Parent.Id OR json_extract(parent.JsonProperties, \"$.Subject.Model.TargetPartition\") = printf(\"0x%x\", partition.ECInstanceId)) AND NOT this.IsPrivate AND json_extract(partition.JsonProperties, \"$.PhysicalPartition.Model.Content\") = NULL AND json_extract(partition.JsonProperties, \"$.GraphicalPartition3d.Model.Content\") = NULL AND this.HasRelatedInstance(\"BisCore:ModelContainsElements\", \"Forward\", \"BisCore:GeometricElement3d\")",
          "hideIfNoChildren": true,
          "groupByClass": false,
          "groupByLabel": false
        },
        {
          "specType": "InstanceNodesOfSpecificClasses",
          "classes": {
            "schemaName": "BisCore",
            "classNames": [
              "GeometricModel3d"
            ]
          },
          "arePolymorphic": true,
          "relatedInstances": [
            {
              "relationshipPath": {
                "relationship": {
                  "schemaName": "BisCore",
                  "className": "ModelModelsElement"
                },
                "direction": "Forward",
                "targetClass": {
                  "schemaName": "BisCore",
                  "className": "InformationPartitionElement"
                }
              },
              "alias": "partition",
              "isRequired": true
            }
          ],
          "instanceFilter": "(parent.ECInstanceId = partition.Parent.Id OR json_extract(parent.JsonProperties, \"$.Subject.Model.TargetPartition\") = printf(\"0x%x\", partition.ECInstanceId)) AND NOT this.IsPrivate AND (json_extract(partition.JsonProperties, \"$.PhysicalPartition.Model.Content\") <> NULL OR json_extract(partition.JsonProperties, \"$.GraphicalPartition3d.Model.Content\") <> NULL) AND this.HasRelatedInstance(\"BisCore:ModelContainsElements\", \"Forward\", \"BisCore:GeometricElement3d\")",
          "hideNodesInHierarchy": true,
          "groupByClass": false,
          "groupByLabel": false
        }
      ],
      "customizationRules": [
        {
          "ruleType": "ExtendedData",
          "items": {
            "isModel": "true"
          }
        }
      ]
    },
    {
      "ruleType": "ChildNodes",
      "condition": "ParentNode.IsOfClass(\"ISubModeledElement\", \"BisCore\")",
      "specifications": [
        {
          "specType": "RelatedInstanceNodes",
          "relationshipPaths": [
            {
              "relationship": {
                "schemaName": "BisCore",
                "className": "ModelModelsElement"
              },
              "direction": "Backward"
            }
          ],
          "instanceFilter": "NOT this.IsPrivate AND this.HasRelatedInstance(\"BisCore:ModelContainsElements\", \"Forward\", \"BisCore:GeometricElement3d\")",
          "hideNodesInHierarchy": true,
          "groupByClass": false,
          "groupByLabel": false
        }
      ],
      "customizationRules": [
        {
          "ruleType": "ExtendedData",
          "items": {
            "isModel": "true"
          }
        }
      ]
    },
    {
      "ruleType": "ChildNodes",
      "condition": "ParentNode.IsOfClass(\"GeometricModel3d\", \"BisCore\")",
      "specifications": [
        {
          "specType": "RelatedInstanceNodes",
          "relationshipPaths": [
            [
              {
                "relationship": {
                  "schemaName": "BisCore",
                  "className": "ModelContainsElements"
                },
                "direction": "Forward",
                "targetClass": {
                  "schemaName": "BisCore",
                  "className": "GeometricElement3d"
                }
              },
              {
                "relationship": {
                  "schemaName": "BisCore",
                  "className": "GeometricElement3dIsInCategory"
                },
                "direction": "Forward",
                "targetClass": {
                  "schemaName": "BisCore",
                  "className": "SpatialCategory"
                }
              }
            ]
          ],
          "suppressSimilarAncestorsCheck": true,
          "hideIfNoChildren": true,
          "groupByClass": false,
          "groupByLabel": false
        }
      ],
      "customizationRules": [
        {
          "ruleType": "ExtendedData",
          "items": {
            "isCategory": "true",
            "modelId": "ParentNode.InstanceId"
          }
        }
      ]
    },
    {
      "ruleType": "ChildNodes",
      "condition": "ParentNode.IsOfClass(\"SpatialCategory\", \"BisCore\")",
      "specifications": [
        {
          "specType": "RelatedInstanceNodes",
          "relationshipPaths": [
            {
              "relationship": {
                "schemaName": "BisCore",
                "className": "GeometricElement3dIsInCategory"
              },
              "direction": "Backward",
              "targetClass": {
                "schemaName": "BisCore",
                "className": "GeometricElement3d"
              }
            }
          ],
          "instanceFilter": "this.Model.Id = parent.parent.ECInstanceId ANDALSO this.Parent = NULL ANDALSO (NOT HasVariable(\"filtered-element-ids\") OR GetVariableIntValues(\"filtered-element-ids\").AnyMatch(id => id = this.ECInstanceId))",
          "groupByClass": false,
          "groupByLabel": false
        }
      ],
      "customizationRules": [
        {
          "ruleType": "ExtendedData",
          "items": {
            "modelId": "this.Model.Id",
            "categoryId": "this.Category.Id"
          }
        }
      ]
    },
    {
      "ruleType": "ChildNodes",
      "condition": "ParentNode.IsOfClass(\"GeometricElement3d\", \"BisCore\")",
      "specifications": [
        {
          "specType": "RelatedInstanceNodes",
          "relationshipPaths": [
            {
              "relationship": {
                "schemaName": "BisCore",
                "className": "ElementOwnsChildElements"
              },
              "direction": "Forward",
              "targetClass": {
                "schemaName": "BisCore",
                "className": "GeometricElement3d"
              }
            }
          ],
          "instanceFilter": "NOT HasVariable(\"filtered-element-ids\") OR GetVariableIntValues(\"filtered-element-ids\").AnyMatch(id => id = this.ECInstanceId)",
          "groupByClass": false,
          "groupByLabel": false
        }
      ],
      "customizationRules": [
        {
          "ruleType": "ExtendedData",
          "items": {
            "modelId": "this.Model.Id",
            "categoryId": "this.Category.Id"
          }
        }
      ]
    },
    {
      "ruleType": "Grouping",
      "class": {
        "schemaName": "BisCore",
        "className": "Subject"
      },
      "groups": [
        {
          "specType": "SameLabelInstance",
          "applicationStage": "PostProcess"
        }
      ]
    },
    {
      "ruleType": "Grouping",
      "class": {
        "schemaName": "BisCore",
        "className": "SpatialCategory"
      },
      "groups": [
        {
          "specType": "SameLabelInstance",
          "applicationStage": "PostProcess"
        }
      ]
    },
    {
      "ruleType": "ImageIdOverride",
      "condition": "ThisNode.IsInstanceNode ANDALSO ThisNode.IsOfClass(\"Subject\", \"BisCore\")",
      "imageIdExpression": "IIF(this.Parent.Id = NULL, \"icon-imodel-hollow-2\", \"icon-folder\")"
    },
    {
      "ruleType": "ImageIdOverride",
      "condition": "ThisNode.IsInstanceNode ANDALSO ThisNode.IsOfClass(\"Model\", \"BisCore\")",
      "imageIdExpression": "\"icon-model\""
    },
    {
      "ruleType": "ImageIdOverride",
      "condition": "ThisNode.IsInstanceNode ANDALSO ThisNode.IsOfClass(\"Category\", \"BisCore\")",
      "imageIdExpression": "\"icon-layers\""
    },
    {
      "ruleType": "ImageIdOverride",
      "condition": "ThisNode.IsInstanceNode ANDALSO ThisNode.IsOfClass(\"Element\", \"BisCore\")",
      "imageIdExpression": "\"icon-item\""
    },
    {
      "ruleType": "Content",
      "condition": "ContentDisplayType = \"AssemblyElementsRequest\"",
      "specifications": [
        {
          "specType": "SelectedNodeInstances"
        },
        {
          "specType": "ContentRelatedInstances",
          "relationshipPaths": [
            {
              "relationship": {
                "schemaName": "BisCore",
                "className": "ElementOwnsChildElements"
              },
              "direction": "Forward",
              "count": "*"
            }
          ]
        }
      ]
    }
  ]
}
