<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="urn:sodium:USQL"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:srv="urn:sodium:USQL:services"
  xmlns:tns="urn:sodium:USQL"
  xmlns="urn:sodium:USQL"
  elementFormDefault="qualified">
  
  <!--
    Unified Service Query Language (USQL) version 1.0
    Developed by NKUA, Copyright(c) 2004-2006 NKUA, All rights reserved.
    -->
  
  <xs:import namespace="urn:sodium:USQL:services" schemaLocation="USQL_services.xsd"/>
  
  <!-- A simple type for the priorityLevel attribute. -->
  <xs:simpleType name="tPriorityLevel">
    <xs:restriction base="xs:string">
      <xs:enumeration value="low"/>
      <xs:enumeration value="high"/>
    </xs:restriction>
  </xs:simpleType>

  <!-- Basic attributes inherited by all requirement elements. -->
  <xs:attributeGroup name="basicRequirementAttributes">
    <xs:attribute name="nullAccepted" type="xs:boolean" use="optional" default="false"/>
    <xs:attribute name="minDegreeOfMatch" type="tns:tPercentage" use="optional" default="0.0"/>
    <xs:attribute name="priorityLevel" type="tns:tPriorityLevel" use="optional" default="low"/>
  </xs:attributeGroup>
  
  <!-- Additional properties that may be contained in response services. -->
  <xs:group name="AdditionalServiceProperties">
    <xs:sequence>
      <xs:element ref="tns:ServiceProvider" minOccurs="0"/>
      <xs:element ref="tns:ServiceDescription" minOccurs="0"/>
      <xs:element ref="tns:Price" minOccurs="0"/>
      <xs:element ref="tns:Availability" minOccurs="0"/>
      <xs:element ref="tns:Reliability" minOccurs="0"/>
      <xs:element ref="tns:Security" minOccurs="0"/>
    </xs:sequence>
  </xs:group>
  
  <!-- Additional properties that may be contained in response service operations. -->
  <xs:group name="AdditionalOperationProperties">
    <xs:sequence>
      <xs:element ref="tns:Price" minOccurs="0"/>
      <xs:element ref="tns:Availability" minOccurs="0"/>
      <xs:element ref="tns:Reliability" minOccurs="0"/>
      <xs:element ref="tns:ProcessingTime" minOccurs="0"/>
      <xs:element ref="tns:Security" minOccurs="0"/>
    </xs:sequence>
  </xs:group>
  
  <!-- A simple type to represent percentages. -->
  <xs:simpleType name="tPercentage">
    <xs:restriction base="xs:float">
      <xs:minInclusive value="0"/>
      <xs:maxInclusive value="1"/>
    </xs:restriction>
  </xs:simpleType>
  
  <!-- A simple type to represent currencies. -->
  <xs:simpleType name="tCurrency">
    <xs:annotation>
      <xs:documentation>All currencies are declared with a 3-character code (e.g. EUR, USD)</xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string">
      <xs:length value="3"/>
    </xs:restriction>
  </xs:simpleType>
  
  <!-- Available price context values. -->
  <xs:simpleType name="tPriceContext">
    <xs:restriction base="xs:string">
      <xs:enumeration value="perCall"/>
      <xs:enumeration value="perDay"/>
      <xs:enumeration value="perWeek"/>
      <xs:enumeration value="perMonth"/>
      <xs:enumeration value="perYear"/>
    </xs:restriction>
  </xs:simpleType>
  
  <!-- Available processing time unit values. -->
  <xs:simpleType name="tProcessingTimeUnit">
    <xs:restriction base="xs:string">
      <xs:enumeration value="millis"/>
      <xs:enumeration value="seconds"/>
      <xs:enumeration value="minutes"/>
    </xs:restriction>
  </xs:simpleType>
  
  <!-- Available taxonomy scheme values. -->
  <xs:simpleType name="tTaxonomyScheme">
    <xs:restriction base="xs:string">
      <xs:enumeration value="ntis-gov:naics:1997"/>
      <xs:enumeration value="ntis-gov:naics:2002"/>
      <xs:enumeration value="unspsc-org:unspsc"/>
      <xs:enumeration value="unspsc-org:unspsc:v6.0501"/>
      <xs:enumeration value="unspsc-org:unspsc:3-1"/>
    </xs:restriction>
  </xs:simpleType>
  
  <!-- Supported syntactic operators. -->
  <xs:simpleType name="tSyntacticOperator">
    <xs:annotation>
      <xs:documentation>Enumerates all syntactic operators supported by USQL.</xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string">
      <xs:enumeration value="equal"/>
      <xs:enumeration value="contain"/>
      <xs:enumeration value="notEqual"/>
      <xs:enumeration value="notContain"/>
    </xs:restriction>
  </xs:simpleType>
  
  <!-- Supported semantic operators. -->
  <xs:simpleType name="tSemanticOperator">
    <xs:annotation>
      <xs:documentation>Enumerates all semantic operators supported by USQL.</xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string">
      <xs:enumeration value="exact"/>
      <xs:enumeration value="abstraction"/>
      <xs:enumeration value="extension"/>
      <xs:enumeration value="sibling"/>
    </xs:restriction>
  </xs:simpleType>
  
  <xs:simpleType name="tSemanticOperatorsList">
    <xs:list itemType="tns:tSemanticOperator"/>
  </xs:simpleType>
  
  <!-- Supported Quality-of-Service operators. -->
  <xs:simpleType name="tQoSOperator">
    <xs:annotation>
      <xs:documentation>Enumerates all QoS operators supported by USQL.</xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string">
      <xs:enumeration value="equal"/>
      <xs:enumeration value="notEqual"/>
      <xs:enumeration value="greater"/>
      <xs:enumeration value="less"/>
      <xs:enumeration value="equalOrGreater"/>
      <xs:enumeration value="equalOrLess"/>
    </xs:restriction>
  </xs:simpleType>
  
  <!-- Supported additional information for requested services. -->
  <xs:simpleType name="tSelectOption">
    <xs:restriction base="xs:string">
      <xs:enumeration value="ServiceProvider"/>
      <xs:enumeration value="ServiceDescription"/>
      <xs:enumeration value="Price"/>
      <xs:enumeration value="Availability"/>
      <xs:enumeration value="Reliability"/>
      <xs:enumeration value="ProcessingTime"/>
      <xs:enumeration value="Security"/>
    </xs:restriction>
  </xs:simpleType>
  
  <!-- Properties to be used for sorting the results. -->
  <xs:simpleType name="tOrderByOption">
    <xs:restriction base="xs:string">
      <xs:enumeration value="ServiceDegreeOfMatch"/>
      <xs:enumeration value="OperationDegreeOfMatch"/>
      <xs:enumeration value="ServiceName"/>
      <xs:enumeration value="ServiceProvider"/>
      <xs:enumeration value="Price"/>
      <xs:enumeration value="Availability"/>
      <xs:enumeration value="Reliability"/>
      <xs:enumeration value="ProcessingTime"/>
      <xs:enumeration value="Security"/>
    </xs:restriction>
  </xs:simpleType>
  
  <!-- Determines the direction of sorting. -->
  <xs:simpleType name="tOrderByDirection">
    <xs:restriction base="xs:string">
      <xs:enumeration value="ascending"/>
      <xs:enumeration value="descending"/>
    </xs:restriction>
  </xs:simpleType>
  
  <!-- Generic syntactic requirement type. -->
  <xs:complexType name="tSyntactic">
    <xs:annotation>
      <xs:documentation>Generic type for syntactic requirement elements.</xs:documentation>
    </xs:annotation>
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attributeGroup ref="tns:basicRequirementAttributes"/>
        <xs:attribute name="valueIs" type="tns:tSyntacticOperator" use="optional" default="equal"/>
        <xs:attribute name="caseSensitive" type="xs:boolean" use="optional" default="false"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  
  <!-- Generic semantic requirement type. -->
  <xs:complexType name="tSemantic">
    <xs:annotation>
      <xs:documentation>Generic type for semantic requirement elements.</xs:documentation>
    </xs:annotation>
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attributeGroup ref="tns:basicRequirementAttributes"/>
        <xs:attribute name="typeOfMatch" use="optional" default="exact">
          <xs:simpleType>
            <xs:restriction base="tns:tSemanticOperatorsList">
              <xs:minLength value="0"/>
              <xs:maxLength value="4"/>
            </xs:restriction>
          </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="ontologyURI" type="xs:anyURI" use="required"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  
  <!-- Generic QoS requirement type. -->
  <xs:complexType name="tQoS">
    <xs:annotation>
      <xs:documentation>Generic type for QoS requirement elements.</xs:documentation>
    </xs:annotation>
    <xs:simpleContent>
      <xs:extension base="xs:float">
        <xs:attributeGroup ref="tns:basicRequirementAttributes"/>
        <xs:attribute name="valueIs" type="tns:tQoSOperator" use="optional" default="equal"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  
  <!-- Operation parameter type. -->
  <xs:complexType name="tParameter">
    <xs:sequence>
      <xs:element name="name" type="tns:tSyntactic" minOccurs="0"/>
      <xs:element name="type" type="tns:tSyntactic" minOccurs="0"/>
      <xs:element name="semantics" type="tns:tSemantic" minOccurs="0"/>
    </xs:sequence>
    <xs:attributeGroup ref="tns:basicRequirementAttributes"/>
  </xs:complexType>
  
  <xs:element name="ServiceName" type="tns:tSyntactic"/>
  <xs:element name="ServiceDescription" type="tns:tSyntactic"/>
  
  <xs:element name="ServiceTaxonomy">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="code" minOccurs="1" maxOccurs="unbounded">
          <xs:complexType>
            <xs:simpleContent>
              <xs:extension base="xs:string">
                <xs:attribute name="scheme" type="tns:tTaxonomyScheme" use="required"/>
              </xs:extension>
            </xs:simpleContent>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  
  <xs:element name="ServiceProvider">
    <xs:complexType>
      <xs:choice>
        <xs:element name="name" type="tns:tSyntactic"/>
        <xs:element name="desc" type="tns:tSyntactic"/>
      </xs:choice>
    </xs:complexType>
  </xs:element>
  
  <xs:element name="ServiceDomain" type="tns:tSemantic"/>
  
  <xs:element name="Price">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="tns:tQoS">
          <xs:attribute name="currency" type="tns:tCurrency" use="optional" default="EUR"/>
          <xs:attribute name="context" type="tns:tPriceContext" use="optional" default="perCall"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
  
  <xs:element name="Availability">
    <xs:complexType>
      <xs:simpleContent>
        <xs:restriction base="tns:tQoS">
          <xs:minInclusive value="0"/>
          <xs:maxInclusive value="1"/>
        </xs:restriction>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
  
  <xs:element name="Reliability">
    <xs:complexType>
      <xs:simpleContent>
        <xs:restriction base="tns:tQoS">
          <xs:minInclusive value="0"/>
          <xs:maxInclusive value="1"/>
        </xs:restriction>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
  
  <xs:element name="ProcessingTime">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="tns:tQoS">
          <xs:attribute name="unit" type="tns:tProcessingTimeUnit" use="optional" default="millis"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
  
  <xs:element name="Security">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:anyURI">
          <xs:attributeGroup ref="tns:basicRequirementAttributes"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
  
  <!-- Supported set of QoS requirements. -->
  <xs:element name="QoS">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="tns:Price" minOccurs="0"/>
        <xs:element ref="tns:Availability" minOccurs="0"/>
        <xs:element ref="tns:Reliability" minOccurs="0"/>
        <xs:element ref="tns:ProcessingTime" minOccurs="0"/>
        <xs:element ref="tns:Security" minOccurs="0"/>
        <xs:any namespace="##other" minOccurs="0" processContents="skip" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  
  <xs:element name="Operation">
    <xs:complexType>
      <xs:sequence>
        <xs:any namespace="##other" processContents="skip" minOccurs="0" maxOccurs="unbounded"/>
        <xs:element name="Name" type="tSyntactic" minOccurs="0"/>
        <xs:element name="Capability" type="tSemantic" minOccurs="0"/>
        <xs:element name="Inputs" minOccurs="0">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="input" type="tns:tParameter" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
            <xs:attributeGroup ref="tns:basicRequirementAttributes"/>
          </xs:complexType>
        </xs:element>
        <xs:element name="Outputs" minOccurs="0">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="output" type="tns:tParameter" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
            <xs:attributeGroup ref="tns:basicRequirementAttributes"/>
          </xs:complexType>
        </xs:element>
        <xs:element ref="tns:QoS" minOccurs="0"/>
      </xs:sequence>
      <xs:attribute name="minDegreeOfMatch" type="tns:tPercentage" use="optional" default="0.0"/>
      <xs:attribute name="priorityLevel" type="tns:tPriorityLevel" use="optional" default="low"/>
    </xs:complexType>
  </xs:element>
  
  <!-- Generic request service structure. (Contains an extension point) -->
  <xs:element name="Service">
    <xs:annotation>
      <xs:documentation>Used for the description of the requested services.</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence>
        <xs:any namespace="##other" processContents="skip" minOccurs="0" maxOccurs="unbounded"/>
        <xs:element ref="tns:ServiceName" minOccurs="0"/>
        <xs:element ref="tns:ServiceDescription" minOccurs="0"/>
        <xs:element ref="tns:ServiceProvider" minOccurs="0"/>
        <xs:element ref="tns:ServiceTaxonomy" minOccurs="0"/>
        <xs:element ref="tns:ServiceDomain" minOccurs="0"/>
        <xs:element ref="tns:QoS" minOccurs="0"/>
        <xs:element ref="tns:Operation" minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>
      <xs:attribute name="minDegreeOfMatch" type="tns:tPercentage" use="optional" default="0.0"/>
      <xs:attributeGroup ref="srv:RequestServiceAttributes"/>
    </xs:complexType>
  </xs:element>

  <!-- USQL request message structure. -->
  <xs:element name="USQLRequest">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="ViewAdditionalProperties" minOccurs="0">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="property" type="tns:tSelectOption" maxOccurs="unbounded"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="From" minOccurs="0">
          <xs:complexType>
            <xs:sequence>
                <xs:element name="Registry" type="xs:string" maxOccurs="unbounded"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="Where">
          <xs:complexType>
            <xs:sequence>
              <xs:element ref="tns:Service" maxOccurs="unbounded"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="OrderBy" minOccurs="0">
          <xs:complexType>
            <xs:simpleContent>
              <xs:extension base="tns:tOrderByOption">
                <xs:attribute name="direction" type="tns:tOrderByDirection" use="optional" default="ascending"/>
              </xs:extension>
            </xs:simpleContent>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <!-- USQL response message structure. -->
  <xs:element name="USQLResponse">
    <xs:complexType>
      <xs:choice>
        <xs:element ref="srv:Services"/>
        <xs:element name="Error">
		  <xs:complexType>
		    <xs:sequence>
			  <xs:element name="code" type="xs:string"/>
			  <xs:element name="desc" type="xs:string"/>
		    </xs:sequence>
		  </xs:complexType>
		</xs:element>
      </xs:choice>
    </xs:complexType>
  </xs:element>

  <!-- The root element for any USQL document. -->
  <xs:element name="USQL">
    <xs:complexType>
      <xs:choice>
        <xs:element ref="tns:USQLRequest"/>
        <xs:element ref="tns:USQLResponse"/>
      </xs:choice>
      <xs:attribute name="version" type="xs:float" use="required" fixed="1.0"/>
    </xs:complexType>
  </xs:element>
</xs:schema>
