<?xml version="1.0" encoding="UTF-8"?>
<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns="eml://ecoinformatics.org/dataquery"
    targetNamespace="eml://ecoinformatics.org/dataquery">
    
    <xs:element name="dataquery">
        <xs:complexType>
            <xs:sequence>
                <xs:choice>
                    <xs:element name="union" type="unionType"/>
                    <xs:element name="query" type="queryType"/>
                </xs:choice>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    
    <xs:complexType name="unionType">
        <xs:sequence>
            <xs:element name="query" type="queryType" maxOccurs="unbounded"/>
        </xs:sequence>
        <xs:attribute name="order" type="xs:boolean" use="optional" default="false"/>
    </xs:complexType>
    
    <xs:complexType name="queryType">
        <xs:sequence>
            <xs:element name="selection" type="selectionType" maxOccurs="unbounded"/>
            <xs:element name="where" type="whereType" minOccurs="0"/>
        </xs:sequence>
        <xs:attribute name="distinct" type="xs:boolean" use="optional" default="false"/>
    </xs:complexType>
    
    <xs:complexType name="selectionType">
        <xs:sequence>
			<xs:element name="datapackage" type="datapackageType" maxOccurs="unbounded"/>
			<xs:element name="staticItem" type="staticItemType" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
    
    <xs:complexType name="whereType">
        <xs:sequence>
            <xs:choice>
                <xs:sequence>
                    <xs:element name="condition" type="conditionType" minOccurs="0"/>
                    <xs:element name="or" type="logicalRelationType" minOccurs="0"/>
                    <xs:element name="and" type="logicalRelationType" minOccurs="0"/>
                </xs:sequence>
            </xs:choice>
        </xs:sequence>
    </xs:complexType>
    
     <xs:complexType name="logicalRelationType">
        <xs:sequence>
            <xs:choice>
                <xs:sequence>
                    <xs:element name="condition" type="conditionType" minOccurs="0" maxOccurs="unbounded"/>
                    <xs:element name="or" type="logicalRelationType" minOccurs="0"/>
                    <xs:element name="and" type="logicalRelationType" minOccurs="0"/>
                </xs:sequence>
            </xs:choice>
        </xs:sequence>
    </xs:complexType>
    
    <xs:complexType name="conditionType">
        <xs:sequence>
            <xs:element name="left" type="conditionMemberType"/>
            <xs:element name="operator" type="xs:string"/>            
            <xs:element name="right" type="conditionMemberType"/>
        </xs:sequence>
        <xs:attribute name="type" type="xs:string" use="required"/>
    </xs:complexType>
    
    <xs:complexType name="conditionMemberType">
        <xs:sequence>
            <xs:choice>
                <xs:element name="datapackage" type="datapackageType"/>
                <xs:element name="value" type="xs:string"/>
                <xs:element name="subquery" type="queryType"/>
            </xs:choice>
        </xs:sequence>
    </xs:complexType>
    
    <xs:complexType name="datapackageType">
        <xs:sequence>
            <xs:element name="entity" type="entityType" maxOccurs="unbounded"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:string"/>
    </xs:complexType>
    
    <xs:complexType name="entityType">
        <xs:sequence>
            <xs:element name="attribute" type="attributeType" maxOccurs="unbounded"/>
        </xs:sequence>
        <xs:attribute name="index" type="xs:int"/>
        <xs:attribute name="name" type="xs:string" use="optional"/>
        <xs:attribute name="id" type="xs:string" use="optional"/>
    </xs:complexType>
    
    <xs:complexType name="attributeType">
        <xs:sequence>
            <xs:element name="pathexpr" minOccurs="0">
            	<xs:complexType>
					<xs:simpleContent>
						<xs:extension base="xs:string">
							<xs:attribute name="label" type="xs:string" use="required"/>
						</xs:extension>
					</xs:simpleContent>           	
            	</xs:complexType>
            </xs:element>
        </xs:sequence>
		<xs:attribute name="index" type="xs:int" use="optional"></xs:attribute>
		<xs:attribute name="name" type="xs:string" use="optional"></xs:attribute>
    </xs:complexType>
    
    <xs:complexType name="staticItemType">
		<xs:attribute name="name" type="xs:string" use="required"/>
		<xs:attribute name="value" type="xs:string" use="optional" />
	</xs:complexType>	    
    
</xs:schema>