﻿<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    
    <xs:element name="BoBuild">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Options" minOccurs="0" maxOccurs="1">
                    <xs:complexType>
                        <xs:attribute name="StrictCardinalities" type="xs:boolean"/>
                    </xs:complexType>
                </xs:element>
                <xs:element name="Packages" minOccurs="0" maxOccurs="1">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="Package" minOccurs="0" maxOccurs="unbounded">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="ObjType" minOccurs="0" maxOccurs="unbounded">
                                            <xs:complexType>
                                                <xs:sequence>
                                                    <xs:element name="RelProperty" minOccurs="0" maxOccurs="unbounded">
                                                        <xs:complexType>
                                                            <xs:attribute name="RelTypeName" type="xs:string" use="required" />
                                                            <xs:attribute name="Direction" type="xs:string" use="required" />
                                                            <xs:attribute name="PropertyName" type="xs:string" use="required" />
                                                        </xs:complexType>
                                                    </xs:element>
                                                </xs:sequence>
                                                <xs:attribute name="Name" type="xs:string" />
                                                <xs:attribute name="ItfNamespace" type="xs:string" />
                                                <xs:attribute name="ItfName" type="xs:string" />
                                                <xs:attribute name="IsManaged" type="xs:boolean" />
                                            </xs:complexType>
                                        </xs:element>
                                    </xs:sequence>
                                    <xs:attribute name="Name" type="xs:string" />
                                    <xs:attribute name="ConstantsName" type="xs:string" />
                                    <xs:attribute name="Implement" type="xs:boolean" />
                                    <xs:attribute name="ItfNamespace" type="xs:string" />
                                    <xs:attribute name="ImplNamespace" type="xs:string" />
                                    <xs:attribute name="ItfTargetDir" type="xs:string" />
                                    <xs:attribute name="ImplTargetDir" type="xs:string" />
                                    <xs:attribute name="ModelFile" type="xs:string" />
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                        <xs:attribute name="Dir" type="xs:string" />
                    </xs:complexType>
                </xs:element>
                <xs:element name="Constants" minOccurs="0" maxOccurs="1">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="Folders" minOccurs="0" maxOccurs="1">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="Folder" minOccurs="0" maxOccurs="unbounded">
                                            <xs:complexType>
                                                <xs:attribute name="Name" type="xs:string" use="required" />
                                                <xs:attribute name="Key" type="xs:string" use="required"/>
                                            </xs:complexType>
                                        </xs:element>
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                            <xs:element name="Objects" minOccurs="0" maxOccurs="1">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="Object" minOccurs="0" maxOccurs="unbounded">
                                            <xs:complexType>
                                                <xs:attribute name="Name" type="xs:string" use="required" />
                                                <xs:attribute name="Key" type="xs:string" use="required" />
                                            </xs:complexType>
                                        </xs:element>
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                            <xs:element name="SysAuths" minOccurs="0" maxOccurs="1">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="SysAuth" minOccurs="0" maxOccurs="unbounded">
                                            <xs:complexType>
                                                <xs:attribute name="Name" type="xs:string" use="required"/>
                                                <xs:attribute name="Value" type="xs:string" use="required"/>
                                            </xs:complexType>
                                        </xs:element>
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                        <xs:attribute name="Namespace" type="xs:string" />
                        <xs:attribute name="TargetDir" type="xs:string" />
                        <xs:attribute name="ClassName" type="xs:string" />
                    </xs:complexType>
                </xs:element>
                <xs:element name="Queries" minOccurs="0" maxOccurs="1">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="Query" minOccurs="0" maxOccurs="unbounded">
                                <xs:complexType>
                                    <xs:choice minOccurs="0" maxOccurs="unbounded">
                                        <!-- paths only for join -->
                                        <xs:element name="Path" minOccurs="0" maxOccurs="unbounded" >
                                            <xs:complexType>
                                                <xs:sequence>
                                                    <xs:element name="Step" type="Step" minOccurs="0" maxOccurs="unbounded"/>
                                                </xs:sequence>
                                                <xs:attribute name="AnchorObjectParameterName" type="xs:string" />
                                            </xs:complexType>
                                        </xs:element>
                                        <!-- steps only for expand -->
                                        <xs:element name="Step" type="Step" minOccurs="0" maxOccurs="unbounded" />
                                        <xs:element name="Constraint" type="Constraint" minOccurs="0" maxOccurs="unbounded" />
                                        <xs:element name="Field" type="Field" minOccurs="0" maxOccurs="unbounded" />
                                        <xs:element name="SqlConstraint" minOccurs="0" maxOccurs="unbounded">
                                            <xs:complexType>
                                                <xs:attribute name="SqlExpression" type="xs:string" />
                                            </xs:complexType>
                                        </xs:element>
                                    </xs:choice>
                                    <xs:attribute name="Name" type="xs:string" use="required"/>
                                    <xs:attribute name="ObjTypeName" type="xs:string"/>
                                    <xs:attribute name="Type" type="QueryType" use="required"/>
                                    <xs:attribute name="IsExactType" type="xs:boolean" default="false"/>
                                    <xs:attribute name="Range" type="Range"/>
                                    <xs:attribute name="CheckAuthorization" type="xs:boolean" default="false"/>
                                    <xs:attribute name="IsCount" type="xs:boolean" default="false"/>
                                    <xs:attribute name="IsPaged" type="xs:boolean" default="false"/>
                                    <xs:attribute name="IsDistinct" type="xs:boolean" default="false"/>
                                    <xs:attribute name="AnchorObjectId" type="xs:string" use="optional"/>
                                    <xs:attribute name="AnchorType" type="AnchorType" use="optional"/>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                        <xs:attribute name="Namespace" type="xs:string" />
                        <xs:attribute name="TargetDir" type="xs:string" />
                        <xs:attribute name="SrcFileName" type="xs:string" />
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
            <xs:attribute name="TargetDir" type="xs:string" />
        </xs:complexType>
    </xs:element>

    <xs:complexType name="Constraint">
        <xs:sequence>
            <xs:element name="AddSteps" minOccurs="0" maxOccurs="1">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="AddStep" minOccurs="0" maxOccurs="unbounded">
                            <xs:complexType>
                                <xs:attribute name="RelTypeName" type="xs:string" />
                                <xs:attribute name="RelDirection" type="RelDirection" />
                            </xs:complexType>
                        </xs:element>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
        <xs:attribute name="Name" type="xs:string" />
        <xs:attribute name="Parameter0Name" type="xs:string" />
        <xs:attribute name="Parameter1Name" type="xs:string" />
        <xs:attribute name="ItemType" type="ItemType" />
        <xs:attribute name="AddStepRelTypeName" type="xs:string" />
        <xs:attribute name="AddStepRelDirection" type="RelDirection" />
        <xs:attribute name="FieldType" type="FieldType" />
        <xs:attribute name="AttrDefName" type="xs:string" />
        <xs:attribute name="AttrDefDeclTypeName" type="xs:string" />
        <xs:attribute name="ConstraintType" type="ConstraintType" />
    </xs:complexType>
    
    <xs:complexType name="Field">
        <xs:sequence>
            <xs:element name="AddSteps" minOccurs="0" maxOccurs="1">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="AddStep" minOccurs="0" maxOccurs="unbounded">
                            <xs:complexType>
                                <xs:attribute name="RelTypeName" type="xs:string" />
                                <xs:attribute name="RelDirection" type="RelDirection" />
                            </xs:complexType>
                        </xs:element>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:sequence>

        <xs:attribute name="Name" type="xs:string" />
        <xs:attribute name="ItemType" type="ItemType" use="required"/>
        <xs:attribute name="FieldType" type="FieldType"/>
        <!--Object/Relationship attributes for attributes-->
        <xs:attribute name="AttrDefName" type="xs:string" />
        <xs:attribute name="AttrDefDeclTypeName" type="xs:string" />
        <!--Object/Relationship-->
        <xs:attribute name="AddStepRelTypeName" type="xs:string" />
        <xs:attribute name="AddStepRelDirection" type="RelDirection" />
        <xs:attribute name="SortOrder" type="SortOrder" />
        <xs:attribute name="SortPriority" type="xs:nonNegativeInteger" />
    </xs:complexType>

    <xs:complexType name="Step">
        <xs:choice minOccurs="0" maxOccurs="unbounded" >
            <xs:element name="Constraint" type="Constraint" minOccurs="0" maxOccurs="unbounded" />
            <xs:element name="Field" type="Field" minOccurs="0" maxOccurs="unbounded" />
        </xs:choice>
        <xs:attribute name="RelTypeName" type="xs:string" />
        <xs:attribute name="RelDirection" type="RelDirection" />
        <xs:attribute name="IsObjTypeRelevant" type="xs:boolean" default="false" />
        <xs:attribute name="ObjTypeName" type="xs:string" />
        <xs:attribute name="SortByPosition" type="xs:boolean" default="false" />
    </xs:complexType>

    <!-- ======================== -->
    <!-- simple types definitions -->
    <!-- ======================== -->

    <xs:simpleType name="QueryType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="Expand"/>
            <xs:enumeration value="Find"/>
            <xs:enumeration value="Join"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="ItemType">
        <!-- expand-, find-, join- item types are covered here -->
        <xs:restriction base="xs:string">
            <xs:enumeration value="Object"/>
            <xs:enumeration value="Relationship"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="RelDirection">
        <xs:restriction base="xs:string">
            <xs:enumeration value="Forward"/>
            <xs:enumeration value="Reverse"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="FieldType">
        <!-- expand-, find-, join- item types are covered here -->
        <xs:restriction base="xs:string">
            <xs:enumeration value="Id"/>
            <xs:enumeration value="Name"/>
            <xs:enumeration value="Description"/>
            <xs:enumeration value="TypeId"/>
            <xs:enumeration value="TypeName"/>
            <xs:enumeration value="TypeDisplayName"/>
            <xs:enumeration value="CreatedBy"/>
            <xs:enumeration value="CreatedOn"/>
            <xs:enumeration value="ChangedBy"/>
            <xs:enumeration value="ChangedOn"/>
            <xs:enumeration value="LockedBy"/>
            <xs:enumeration value="LockedOn"/>
            <xs:enumeration value="FolderId"/>
            <xs:enumeration value="FolderName"/>
            <xs:enumeration value="Attribute"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="SortOrder">
        <xs:restriction base="xs:string">
            <xs:enumeration value="Ascending"/>
            <xs:enumeration value="Descending"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType  name="ConstraintType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="Symbol"/>
            <xs:enumeration value="Equal"/>
            <xs:enumeration value="NotEqual"/>
            <xs:enumeration value="Like"/>
            <xs:enumeration value="Between"/>
            <xs:enumeration value="Less"/>
            <xs:enumeration value="LessEqual"/>
            <xs:enumeration value="Greater"/>
            <xs:enumeration value="GreaterEqual"/>
            <xs:enumeration value="TypeOf"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="Range">
        <xs:restriction base="xs:string">
            <xs:enumeration value="Folder"/>
            <xs:enumeration value="DirectChildFolders"/>
            <xs:enumeration value="FolderTree"/>
            <xs:enumeration value="Global"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="AnchorType">
        <!-- for: join and expand -->
        <xs:restriction base="xs:string">
            <xs:enumeration value="Object"/>
            <xs:enumeration value="ObjectSet"/>
        </xs:restriction>
    </xs:simpleType>

</xs:schema>