<?xml version="1.0" encoding="UTF-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <!--Validations are not supported for manual data sources START-->
  <xs:element name="Datasource" type="DatasourceType"/>
  <xs:complexType name="DatasourceType">
    <xs:sequence>
    <xs:any maxOccurs="unbounded" minOccurs="0" processContents="skip"/>
    </xs:sequence>
    <xs:anyAttribute processContents="skip"/>
  </xs:complexType>
  <!--Validations are not supported for manual data sources END-->

  <xs:element name="DataSource" type="DataSourceType"/>
  <xs:complexType name="EntityType" mixed="true">
    <xs:sequence>
      <xs:element type="JoinType" name="Join" minOccurs="0"/>
    </xs:sequence>
    <xs:attribute type="xs:string" name="name" use="optional"/>
    <xs:attribute type="xs:string" name="alias" use="optional"/>
    <xs:attribute type="xs:string" name="idAttribute" use="optional"/>
  </xs:complexType>
  <xs:complexType name="EntitiesType">
    <xs:sequence>
      <xs:element type="EntityType" name="Entity" maxOccurs="unbounded" minOccurs="0"/>
    </xs:sequence>
    <xs:attribute type="applicableToType" name="applicableTo" use="optional"/>
  </xs:complexType>
  <xs:complexType name="DerivedAttributeType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute type="xs:string" name="name" use="optional"/>
        <xs:attribute type="xs:string" name="value" use="optional"/>
        <xs:attribute type="xs:string" name="type" use="optional"/>
        <xs:attribute type="xs:string" name="table" use="optional"/>
        <xs:attribute type="xs:string" name="column" use="optional"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <xs:complexType name="AttributeType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute type="xs:string" name="name" use="optional"/>
        <xs:attribute type="xs:string" name="table" use="optional"/>
        <xs:attribute type="xs:string" name="column" use="optional"/>
        <xs:attribute type="xs:string" name="value" use="optional"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <xs:complexType name="SimpleJoinType">
    <xs:sequence>
      <xs:element type="ConditionType" name="Condition" maxOccurs="unbounded" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="DataSourceType">
    <xs:choice maxOccurs="unbounded" minOccurs="0">
      <xs:element type="DatabaseType" name="Database"/>
      <xs:element type="AttributesType" name="Attributes"/>
      <xs:element type="EntitiesType" name="Entities"/>
      <xs:element type="QueryConditionType" name="QueryCondition"/>
      <xs:element type="OrderCriteriaType" name="OrderCriteria"/>
      <xs:element type="GroupByType" name="GroupBy"/>
      <xs:element type="ParametersType" name="Parameters"/>
      <xs:element type="ConditionalParametersType" name="ConditionalParameters"/>
      <xs:element type="QuickSearchParametersType" name="QuickSearchParameters"/>
    </xs:choice>
    <xs:attribute type="xs:string" name="name"/>
    <xs:attribute type="xs:string" name="objectClass"/>
    <xs:attribute type="xs:string" name="backendSystem"/>
    <xs:attribute type="xs:string" name="businessObjectClass"/>
    <xs:attribute type="xs:string" name="distinct"/>
    <xs:attribute type="xs:string" name="external"/>
    <xs:attribute type="xs:string" name="editableEntity"/>
    <xs:attribute type="xs:string" name="readOnly"/>
    <xs:attribute type="xs:string" name="readonly"/>
    <xs:attribute type="xs:string" name="schemaVersion"/>
    <xs:attribute type="xs:string" name="linkedEntityAttributeName"/>
  </xs:complexType>
  <xs:complexType name="GroupByType">
    <xs:sequence>
      <xs:element type="GroupByCriterionType" name="GroupByCriterion" maxOccurs="unbounded" minOccurs="0"/>
    </xs:sequence>
    <xs:attribute type="applicableToType" name="applicableTo" use="optional"/>
  </xs:complexType>
  <xs:complexType name="GroupByCriterionType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute type="xs:string" name="entity" use="optional"/>
        <xs:attribute type="xs:string" name="attribute" use="optional"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <xs:complexType name="DatabaseType">
  <xs:sequence>
    <xs:element type="xs:string" name="Load" minOccurs="0"/>
    <xs:element type="xs:string" name="Update" minOccurs="0"/>
    <xs:element type="xs:string" name="Insert" minOccurs="0"/>
    <xs:element type="xs:string" name="Delete" minOccurs="0"/>
    <xs:element type="xs:string" name="Custom" minOccurs="0"/>
  </xs:sequence>
  <xs:attribute type="xs:string" name="platform"/>
</xs:complexType>
<xs:complexType name="OrderCriteriaType">
  <xs:choice maxOccurs="unbounded" minOccurs="0">
    <xs:element type="OrderCriterionType" name="OrderCriterion"/>
  </xs:choice>
  <xs:attribute type="applicableToType" name="applicableTo" use="optional"/>
</xs:complexType>
<xs:complexType name="OrderCriterionType">
  <xs:simpleContent>
    <xs:extension base="xs:string">
      <xs:attribute type="xs:string" name="entity"/>
      <xs:attribute type="xs:string" name="attribute"/>
      <xs:attribute type="xs:string" name="direction"/>
    </xs:extension>
  </xs:simpleContent>
</xs:complexType>
  <xs:complexType name="AttributesType">
    <xs:choice maxOccurs="unbounded" minOccurs="0">
      <xs:element type="AttributeType" name="Attribute" maxOccurs="unbounded" minOccurs="0"/>
      <xs:element type="DerivedAttributeType" name="DerivedAttribute" maxOccurs="unbounded" minOccurs="0"/>
      <xs:element type="DateTimeAttributeType" name="DateTimeAttribute" maxOccurs="unbounded" minOccurs="0"/>
      <xs:element type="PivotItemsType" name="PivotItems"/>
    </xs:choice>
    <xs:attribute type="applicableToType" name="applicableTo" use="optional"/>
  </xs:complexType>
  <xs:complexType name="DateTimeAttributeType">
  <xs:simpleContent>
    <xs:extension base="xs:string">
      <xs:attribute type="xs:string" name="dateName" use="optional"/>
      <xs:attribute type="xs:string" name="timeName" use="optional"/>
      <xs:attribute type="xs:string" name="table" use="optional"/>
      <xs:attribute type="xs:string" name="column" use="optional"/>
      <xs:attribute type="xs:string" name="name" use="optional"/>
    </xs:extension>
  </xs:simpleContent>
</xs:complexType>
  <xs:complexType name="JoinType">
    <xs:choice maxOccurs="unbounded" minOccurs="0">
      <xs:element type="SimpleJoinType" name="SimpleJoin"/>
      <xs:element type="xs:string" name="ComplexJoin"/>
    </xs:choice>
    <xs:attribute type="xs:string" name="Type"/>
  </xs:complexType>
  <xs:complexType name="ConditionType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute type="xs:string" name="leftSideValue"/>
        <xs:attribute type="xs:string" name="comparator"/>
        <xs:attribute type="xs:string" name="rightSideType"/>
        <xs:attribute type="xs:string" name="rightSideValue"/>
        <xs:attribute type="xs:string" name="leftSideType"/>
        <xs:attribute type="xs:string" name="comparatorType"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <xs:complexType name="ParametersType"  mixed="true">
    <xs:sequence>
      <xs:element type="ParameterType" name="Parameter" maxOccurs="unbounded" minOccurs="0"/>
    </xs:sequence>
    <xs:attribute type="applicableToType" name="applicableTo" use="optional"/>
  </xs:complexType>
  <xs:complexType name="ParameterType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute type="xs:string" name="name"/>
        <xs:attribute type="xs:string" name="baseType"/>
        <xs:attribute type="xs:string" name="type"/>
        <xs:attribute type="xs:string" name="treatAs"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

  <xs:complexType name="ConditionalParametersType">
    <xs:sequence>
      <xs:element type="ConditionalParameterType" name="ConditionalParameter" maxOccurs="unbounded" minOccurs="0"/>
    </xs:sequence>
    <xs:attribute type="applicableToType" name="applicableTo" use="optional"/>
  </xs:complexType>
    <xs:complexType name="ConditionalParameterType">
    <xs:sequence>
      <xs:element type="SimpleConditionsType" name="SimpleConditions"/>
    </xs:sequence>
    <xs:attribute type="xs:string" name="name" use="optional"/>
  </xs:complexType>
    <xs:complexType name="SimpleConditionsType">
    <xs:sequence>
      <xs:element type="ConditionType" name="Condition"/>
    </xs:sequence>
  </xs:complexType>

    <xs:complexType name="PivotItemsType">
    <xs:sequence>
      <xs:element type="PivotItemType" name="PivotItem" maxOccurs="unbounded" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="PivotItemType">
    <xs:choice maxOccurs="unbounded" minOccurs="0">
      <xs:element type="AttributeType" name="Attribute" maxOccurs="unbounded" minOccurs="0"/>
      <xs:element type="PivotConstantType" name="PivotConstant" maxOccurs="unbounded" minOccurs="0"/>
      <xs:element type="PivotDerivedAttributeType" name="PivotDerivedAttribute"/>
    </xs:choice>
    <xs:attribute type="xs:string" name="id" use="optional"/>
  </xs:complexType>

    <xs:complexType name="PivotConstantType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute type="xs:string" name="name" use="optional"/>
        <xs:attribute type="xs:string" name="value" use="optional"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

    <xs:complexType name="PivotDerivedAttributeType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute type="xs:string" name="name" use="optional"/>
        <xs:attribute type="xs:string" name="pivotName" use="optional"/>
        <xs:attribute type="xs:string" name="value" use="optional"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

  <xs:complexType name="QuickSearchParametersType">
    <xs:sequence>
      <xs:element type="QuickSearchParameterType" name="QuickSearchParameter" maxOccurs="unbounded" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="QuickSearchParameterType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute type="xs:string" name="name"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

  <xs:complexType name="QueryConditionType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute type="applicableToType" name="applicableTo" use="optional"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

  <xs:simpleType name="applicableToType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="classic"/>
      <xs:enumeration value="multichannel"/>
    </xs:restriction>
  </xs:simpleType>

</xs:schema>
