<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://www.bridje.org/schemas/orm/model" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.bridje.org/schemas/orm/model" version="1.0">

  <xs:element name="ormModel" type="tns:modelInf"/>

  <xs:complexType name="aiField">
    <xs:annotation>
      <xs:documentation><![CDATA[Represents the information for an autoincrement field.]]></xs:documentation>
    </xs:annotation>
    <xs:sequence/>
    <xs:attribute name="name" type="xs:string"/>
    <xs:attribute name="column" type="xs:string"/>
    <xs:attribute name="required" type="xs:boolean"/>
    <xs:attribute name="description" type="xs:string"/>
    <xs:attribute name="type" type="xs:string"/>
  </xs:complexType>

  <xs:complexType name="andNotStmt">
    <xs:annotation>
      <xs:documentation><![CDATA[Information about a negated condition with an "and" operator.]]></xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:choice maxOccurs="unbounded" minOccurs="0">
        <xs:element name="or" type="tns:orStmt"/>
        <xs:element name="orNot" type="tns:orNotStmt"/>
        <xs:element name="and" type="tns:andStmt"/>
        <xs:element name="andNot" type="tns:andNotStmt"/>
      </xs:choice>
    </xs:sequence>
    <xs:attribute name="condition" type="xs:string"/>
  </xs:complexType>

  <xs:complexType name="orStmt">
    <xs:sequence>
      <xs:choice maxOccurs="unbounded" minOccurs="0">
        <xs:element name="or" type="tns:orStmt"/>
        <xs:element name="orNot" type="tns:orNotStmt"/>
        <xs:element name="and" type="tns:andStmt"/>
        <xs:element name="andNot" type="tns:andNotStmt"/>
      </xs:choice>
    </xs:sequence>
    <xs:attribute name="condition" type="xs:string"/>
  </xs:complexType>

  <xs:complexType name="orNotStmt">
    <xs:sequence>
      <xs:choice maxOccurs="unbounded" minOccurs="0">
        <xs:element name="or" type="tns:orStmt"/>
        <xs:element name="orNot" type="tns:orNotStmt"/>
        <xs:element name="and" type="tns:andStmt"/>
        <xs:element name="andNot" type="tns:andNotStmt"/>
      </xs:choice>
    </xs:sequence>
    <xs:attribute name="condition" type="xs:string"/>
  </xs:complexType>

  <xs:complexType name="andStmt">
    <xs:annotation>
      <xs:documentation><![CDATA[Information about a condition with an "and" operator.]]></xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:choice maxOccurs="unbounded" minOccurs="0">
        <xs:element name="or" type="tns:orStmt"/>
        <xs:element name="orNot" type="tns:orNotStmt"/>
        <xs:element name="and" type="tns:andStmt"/>
        <xs:element name="andNot" type="tns:andNotStmt"/>
      </xs:choice>
    </xs:sequence>
    <xs:attribute name="condition" type="xs:string"/>
  </xs:complexType>

  <xs:complexType name="booleanField">
    <xs:annotation>
      <xs:documentation><![CDATA[Information about a boolean field.]]></xs:documentation>
    </xs:annotation>
    <xs:sequence/>
    <xs:attribute name="name" type="xs:string"/>
    <xs:attribute name="column" type="xs:string"/>
    <xs:attribute name="required" type="xs:boolean"/>
    <xs:attribute name="description" type="xs:string"/>
    <xs:attribute name="type" type="xs:string"/>
  </xs:complexType>

  <xs:complexType name="countQueryInf">
    <xs:annotation>
      <xs:documentation><![CDATA[Information for a count query, for an entity.]]></xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element minOccurs="0" name="where" type="tns:whereStmt"/>
    </xs:sequence>
    <xs:attribute name="name" type="xs:string"/>
  </xs:complexType>

  <xs:complexType name="whereStmt">
    <xs:sequence>
      <xs:choice maxOccurs="unbounded" minOccurs="0">
        <xs:element name="or" type="tns:orStmt"/>
        <xs:element name="orNot" type="tns:orNotStmt"/>
        <xs:element name="and" type="tns:andStmt"/>
        <xs:element name="andNot" type="tns:andNotStmt"/>
      </xs:choice>
    </xs:sequence>
    <xs:attribute name="condition" type="xs:string"/>
    <xs:attribute name="not" type="xs:boolean" use="required"/>
  </xs:complexType>

  <xs:complexType name="dateField">
    <xs:annotation>
      <xs:documentation><![CDATA[Information for a date field.]]></xs:documentation>
    </xs:annotation>
    <xs:sequence/>
    <xs:attribute name="name" type="xs:string"/>
    <xs:attribute name="column" type="xs:string"/>
    <xs:attribute name="required" type="xs:boolean"/>
    <xs:attribute name="description" type="xs:string"/>
    <xs:attribute name="type" type="xs:string"/>
  </xs:complexType>

  <xs:complexType name="deleteQueryInf">
    <xs:annotation>
      <xs:documentation><![CDATA[Information for a delete query.]]></xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element minOccurs="0" name="where" type="tns:whereStmt"/>
    </xs:sequence>
    <xs:attribute name="name" type="xs:string"/>
  </xs:complexType>

  <xs:complexType name="entityIndexInf">
    <xs:annotation>
      <xs:documentation><![CDATA[The information for an index.]]></xs:documentation>
    </xs:annotation>
    <xs:sequence/>
    <xs:attribute name="name" type="xs:string"/>
    <xs:attribute name="fields" type="xs:string"/>
  </xs:complexType>

  <xs:complexType name="entityInf">
    <xs:annotation>
      <xs:documentation><![CDATA[Information for an entity of the model.]]></xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element minOccurs="0" name="key" type="tns:entityInfKey"/>
      <xs:element minOccurs="0" name="fields">
        <xs:complexType>
          <xs:sequence>
            <xs:choice maxOccurs="unbounded" minOccurs="0">
              <xs:element name="relation" type="tns:relationField"/>
              <xs:element name="boolean" type="tns:booleanField"/>
              <xs:element name="number" type="tns:numberField"/>
              <xs:element name="string" type="tns:stringField"/>
              <xs:element name="date" type="tns:dateField"/>
            </xs:choice>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element minOccurs="0" name="indexes">
        <xs:complexType>
          <xs:sequence>
            <xs:choice maxOccurs="unbounded" minOccurs="0">
              <xs:element name="index" type="tns:entityIndexInf"/>
              <xs:element name="unique" type="tns:entityUniqueIndexInf"/>
            </xs:choice>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element minOccurs="0" name="queries">
        <xs:complexType>
          <xs:sequence>
            <xs:choice maxOccurs="unbounded" minOccurs="0">
              <xs:element name="select" type="tns:selectQueryInf"/>
              <xs:element name="count" type="tns:countQueryInf"/>
              <xs:element name="selectOne" type="tns:selectOneQueryInf"/>
              <xs:element name="update" type="tns:updateQueryInf"/>
              <xs:element name="delete" type="tns:deleteQueryInf"/>
            </xs:choice>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="name" type="xs:string"/>
    <xs:attribute name="table" type="xs:string"/>
    <xs:attribute name="description" type="xs:string"/>
  </xs:complexType>

  <xs:complexType name="entityInfKey">
    <xs:sequence>
      <xs:choice minOccurs="0">
        <xs:element name="ai" type="tns:aiField"/>
        <xs:element name="boolean" type="tns:booleanField"/>
        <xs:element name="number" type="tns:numberField"/>
        <xs:element name="string" type="tns:stringField"/>
      </xs:choice>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="numberField">
    <xs:sequence/>
    <xs:attribute name="name" type="xs:string"/>
    <xs:attribute name="column" type="xs:string"/>
    <xs:attribute name="required" type="xs:boolean"/>
    <xs:attribute name="description" type="xs:string"/>
    <xs:attribute name="type" type="xs:string"/>
  </xs:complexType>

  <xs:complexType name="stringField">
    <xs:sequence/>
    <xs:attribute name="name" type="xs:string"/>
    <xs:attribute name="column" type="xs:string"/>
    <xs:attribute name="required" type="xs:boolean"/>
    <xs:attribute name="description" type="xs:string"/>
    <xs:attribute name="type" type="xs:string"/>
  </xs:complexType>

  <xs:complexType name="relationField">
    <xs:sequence/>
    <xs:attribute name="name" type="xs:string"/>
    <xs:attribute name="column" type="xs:string"/>
    <xs:attribute name="required" type="xs:boolean"/>
    <xs:attribute name="description" type="xs:string"/>
    <xs:attribute name="with" type="xs:string"/>
    <xs:attribute name="onUpdate" type="tns:relationStrategy"/>
    <xs:attribute name="onDelete" type="tns:relationStrategy"/>
    <xs:attribute name="fkOnModel" type="xs:boolean"/>
  </xs:complexType>

  <xs:complexType name="entityUniqueIndexInf">
    <xs:complexContent>
      <xs:extension base="tns:entityIndexInf">
        <xs:sequence/>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="selectQueryInf">
    <xs:sequence>
      <xs:element minOccurs="0" name="where" type="tns:whereStmt"/>
    </xs:sequence>
    <xs:attribute name="name" type="xs:string"/>
    <xs:attribute name="withPaging" type="xs:boolean" use="required"/>
    <xs:attribute name="fetch" type="xs:string"/>
  </xs:complexType>

  <xs:complexType name="selectOneQueryInf">
    <xs:sequence>
      <xs:element minOccurs="0" name="where" type="tns:whereStmt"/>
    </xs:sequence>
    <xs:attribute name="name" type="xs:string"/>
    <xs:attribute name="fetch" type="xs:string"/>
  </xs:complexType>

  <xs:complexType name="updateQueryInf">
    <xs:sequence>
      <xs:element minOccurs="0" name="where" type="tns:whereStmt"/>
      <xs:element maxOccurs="unbounded" minOccurs="0" name="set" type="tns:setFieldStmt"/>
    </xs:sequence>
    <xs:attribute name="name" type="xs:string"/>
  </xs:complexType>

  <xs:complexType name="setFieldStmt">
    <xs:sequence/>
    <xs:attribute name="field" type="xs:string"/>
    <xs:attribute name="value" type="xs:string"/>
  </xs:complexType>

  <xs:complexType abstract="true" name="enumBaseInf">
    <xs:annotation>
      <xs:documentation><![CDATA[This class is the base class for the enumerators information classes.]]></xs:documentation>
    </xs:annotation>
    <xs:sequence/>
    <xs:attribute name="name" type="xs:ID"/>
  </xs:complexType>

  <xs:complexType name="enumConstantInf">
    <xs:annotation>
      <xs:documentation><![CDATA[This class represents an enumerator constant.]]></xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element maxOccurs="unbounded" minOccurs="0" name="property" type="tns:enumConstantProperty"/>
    </xs:sequence>
    <xs:attribute name="name" type="xs:ID"/>
    <xs:attribute name="description" type="xs:string"/>
  </xs:complexType>

  <xs:complexType name="enumConstantProperty">
    <xs:annotation>
      <xs:documentation><![CDATA[This class represents a property value for an enumerator constant.]]></xs:documentation>
    </xs:annotation>
    <xs:sequence/>
    <xs:attribute name="name" type="xs:string"/>
    <xs:attribute name="value" type="xs:string"/>
  </xs:complexType>

  <xs:complexType name="enumInf">
    <xs:annotation>
      <xs:documentation><![CDATA[This class defines an enumerator, the source code generator will generate an
enumerator class base on the information provided by each instance of this
object.]]></xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="tns:enumBaseInf">
        <xs:sequence>
          <xs:element maxOccurs="unbounded" minOccurs="0" name="constant" type="tns:enumConstantInf"/>
          <xs:element minOccurs="0" name="properties">
            <xs:complexType>
              <xs:sequence>
                <xs:element maxOccurs="unbounded" minOccurs="0" name="property" type="tns:enumPropertyInf"/>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:sequence>
        <xs:attribute name="description" type="xs:string"/>
        <xs:attribute name="descriptionAsProperty" type="xs:boolean"/>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="enumPropertyInf">
    <xs:annotation>
      <xs:documentation><![CDATA[This class defines the information for a property of an enumerator.]]></xs:documentation>
    </xs:annotation>
    <xs:sequence/>
    <xs:attribute name="name" type="xs:ID"/>
    <xs:attribute name="type" type="tns:enumPropertyType"/>
  </xs:complexType>

  <xs:complexType name="externalEnumInf">
    <xs:annotation>
      <xs:documentation><![CDATA[This class defines an external enumerator, the source code generator will not
generate an enumerator class for this information, this will serve only to
link external enumerators into the model.]]></xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:extension base="tns:enumBaseInf">
        <xs:sequence/>
        <xs:attribute name="package" type="xs:string"/>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="modelInf">
    <xs:sequence>
      <xs:element minOccurs="0" name="includes">
        <xs:complexType>
          <xs:sequence>
            <xs:element maxOccurs="unbounded" minOccurs="0" name="include" type="xs:string"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element minOccurs="0" name="types">
        <xs:complexType>
          <xs:sequence>
            <xs:element maxOccurs="unbounded" minOccurs="0" name="type" type="tns:sqlTypeInf"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element minOccurs="0" name="entities">
        <xs:complexType>
          <xs:sequence>
            <xs:element maxOccurs="unbounded" minOccurs="0" name="entity" type="tns:entityInf"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element minOccurs="0" name="enums">
        <xs:complexType>
          <xs:sequence>
            <xs:choice maxOccurs="unbounded" minOccurs="0">
              <xs:element name="enum" type="tns:enumInf"/>
              <xs:element name="external" type="tns:externalEnumInf"/>
            </xs:choice>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="schema" type="xs:string"/>
    <xs:attribute name="name" type="xs:string"/>
    <xs:attribute name="package" type="xs:string"/>
    <xs:attribute name="description" type="xs:string"/>
  </xs:complexType>

  <xs:complexType name="sqlTypeInf">
    <xs:sequence/>
    <xs:attribute name="name" type="xs:string"/>
    <xs:attribute name="javaType" type="xs:string"/>
    <xs:attribute name="readType" type="xs:string"/>
    <xs:attribute name="jdbcType" type="xs:string"/>
    <xs:attribute name="length" type="xs:int"/>
    <xs:attribute name="precision" type="xs:int"/>
    <xs:attribute name="parser" type="xs:string"/>
    <xs:attribute name="writer" type="xs:string"/>
  </xs:complexType>

  <xs:simpleType name="relationStrategy">
    <xs:restriction base="xs:string">
      <xs:enumeration value="NO_ACTION"/>
      <xs:enumeration value="SET_DEFAULT"/>
      <xs:enumeration value="SET_NULL"/>
      <xs:enumeration value="CASCADE"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="enumPropertyType">
    <xs:annotation>
      <xs:documentation><![CDATA[This class represents the types that the properties of the enumerators may
have.]]></xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string">
      <xs:enumeration value="DOUBLE"/>
      <xs:enumeration value="LONG"/>
      <xs:enumeration value="STRING"/>
      <xs:enumeration value="INTEGER"/>
    </xs:restriction>
  </xs:simpleType>
</xs:schema>
