<?xml version="1.0" encoding="utf-8"?>
<!--
   ice.NET Platform

   Copyright (c) PDTec AG. All rights reserved.
-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">

    <xs:complexType name="JoinQuery">
        <xs:sequence>
            <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="AnchorType" type="AnchorType" default="Object"/>
					<xs:attribute name="AnchorObjectParameterName" type="xs:string" />
                </xs:complexType>
            </xs:element>
            <xs:element name="SqlConstraint" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                    <xs:attribute name="SqlExpression" type="xs:string" />
                </xs:complexType>
            </xs:element>
        </xs:sequence>
        <xs:attribute name="Name" type="xs:string" use="required"/>
        <xs:attribute name="CheckAuthorization" type="xs:boolean" default="false"/>
        <xs:attribute name="AuthorizationTarget" type="AuthorizationTarget" default="Object"/>
        <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="ResultClass" type="xs:string" />
    </xs:complexType>

    <xs:complexType name="ExpandQuery">
        <xs:sequence>
            <xs:element name="Step" type="Step" 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:sequence>
        <xs:attribute name="Name" type="xs:string" use="required"/>
        <xs:attribute name="CheckAuthorization" type="xs:boolean" default="false"/>
		<xs:attribute name="AnchorType" type="AnchorType" default="Object"/>
		<xs:attribute name="AuthorizationTarget" type="AuthorizationTarget" default="Object"/>
		<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="ResultClass" type="xs:string" />
    </xs:complexType>

    <xs:complexType name="FindQuery">
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="Constraint" type="FindConstraint" 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="IsExactType" type="xs:boolean" default="false"/>
        <xs:attribute name="Range" type="Range"/>
        <xs:attribute name="CheckAuthorization" type="xs:boolean" default="false"/>
        <xs:attribute name="AuthorizationTarget" type="AuthorizationTarget" default="Object"/>
        <xs:attribute name="IsPaged" type="xs:boolean" default="false"/>
        <xs:attribute name="IsDistinct" type="xs:boolean" default="false"/>
		<xs:attribute name="ResultClass" type="xs:string" />
    </xs:complexType>

    <xs:complexType name="BaseConstraint" abstract="true">
        <xs:choice minOccurs="0" maxOccurs="1" >
            <xs:element name="JoinQuery" type="JoinQuery" />
            <xs:element name="ExpandQuery" type="ExpandQuery" />
            <xs:element name="FindQuery" type="FindQuery" />
            <xs:element name="AddSteps">
                <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:choice>
        <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="Constraint">
        <xs:complexContent>
            <xs:extension base="BaseConstraint">
                <xs:attribute name="ConstraintType" type="ConstraintType" />
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    
    <xs:complexType name="FindConstraint">
        <xs:complexContent>
            <xs:extension base="BaseConstraint">
                <xs:attribute name="ConstraintType" type="FindConstraintType" />
            </xs:extension>
        </xs:complexContent>
    </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" />
        <xs:attribute name="FieldType" type="FieldType" />
        <xs:attribute name="AttrDefDeclTypeName" type="xs:string" />
        <xs:attribute name="AttrDefName" type="xs:string" />
		<xs:attribute name="SortOrder" type="SortOrder" />
		<xs:attribute name="SortPriority" type="xs:int" />
		<xs:attribute name="Aggregation" type="Aggregation" />
		<xs:attribute name="GroupPriority" type="xs:int" />
		<xs:attribute name="AddStepRelTypeName" type="xs:string" />
        <xs:attribute name="AddStepRelDirection" type="RelDirection" />
        <xs:attribute name="AssignmentIndicator" type="xs:boolean">
            <xs:annotation>
                <xs:documentation>Indicates attribute values that are not assigned.</xs:documentation>
            </xs:annotation>
        </xs:attribute>
    </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>

    <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="Key"/>
			<xs:enumeration value="Attribute"/>
			<xs:enumeration value="Object"/>
		</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="Aggregation">
		<xs:restriction base="xs:string">
			<xs:enumeration value="Count"/>
			<xs:enumeration value="Sum"/>
			<xs:enumeration value="Average"/>
			<xs:enumeration value="Min"/>
			<xs:enumeration value="Max"/>
		</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="In"/>
            <xs:enumeration value="NotIn"/>
			<xs:enumeration value="InSet"/>
			<xs:enumeration value="TypeOf"/>
        </xs:restriction>
    </xs:simpleType>
    
    <xs:simpleType name="FindConstraintTypeExtension">
        <xs:restriction base="xs:string">
            <!-- Historically, TypeOf was only allowed for Find queries. -->
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="FindConstraintType">
        <xs:union memberTypes="ConstraintType FindConstraintTypeExtension" />
    </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">
		<xs:restriction base="xs:string">
			<xs:enumeration value="Object"/>
			<xs:enumeration value="ObjectSet"/>
		</xs:restriction>
	</xs:simpleType>	
	
    <xs:simpleType name="AuthorizationTarget">
        <xs:restriction base="xs:string">
            <xs:enumeration value="Object"/>
            <xs:enumeration value="Folder"/>
        </xs:restriction>
    </xs:simpleType>
	
</xs:schema>