<?xml version="1.0" encoding="UTF-8" ?>

<!--
 Licensed to the Apache Software Foundation (ASF) under one
 or more contributor license agreements.  See the NOTICE file
 distributed with this work for additional information
 regarding copyright ownership.  The ASF licenses this file
 to you under the Apache License, Version 2.0 (the
 "License"); you may not use this file except in compliance
 with the License.  You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing,
 software distributed under the License is distributed on an
 "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 KIND, either express or implied.  See the License for the
 specific language governing permissions and limitations
 under the License.
-->
<!--
    Torque XML database schema DTD
    $Id: database-4-0.xsd 1629463 2015-00-05 02:11:26Z tfischer $
-->

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="http://db.apache.org/torque/5.1/templates/database"
           xmlns="http://db.apache.org/torque/5.1/templates/database"
           elementFormDefault="qualified"
           version="1.0">
           
  <xs:annotation>
    <xs:documentation xml:lang="en">
The XML schema used by version 5.0 and greater of the Apache Software
Foundation Torque project(
<a href="http://db.apache.org/torque">http://db.apache.org/torque</a> )
to model SQL database information. This model is used by various Torque
utilities for managing the SQL Server info and to build the Java objects
to access this data.

The basic structure of a model is built using the database element
as the root.  This will contain references to options, external (include)
models, new SQL Domain definitions, and tables.  See the Torque project
home page for more details.

    </xs:documentation>
  </xs:annotation>
  
<!-- =====================================
     database element definition
     ===================================== -->
  <xs:element name="database" type="databaseType">
    <xs:annotation>
      <xs:documentation xml:lang="en">
The root element for defining a Torque database schema.
      </xs:documentation>
    </xs:annotation>
  </xs:element>

  <xs:complexType name="databaseType">
    <xs:annotation>
      <xs:documentation xml:lang="en">
The root type definition for a Torque database schema.
      </xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="option" type="optionType" minOccurs="0"
                  maxOccurs="unbounded" >
        <xs:annotation>
          <xs:documentation xml:lang="en">
A set of key/value options to be passed to custom generator templates.
          </xs:documentation>
        </xs:annotation>
      </xs:element>                  
                  
      <xs:element name="include-schema" type="includeSchemaType"
                  minOccurs="0" maxOccurs="unbounded" >
        <xs:annotation>
          <xs:documentation xml:lang="en">
Include another schema file in this schema (as if it were a part of this
schema file).
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="external-schema" type="externalSchemaType"
                  minOccurs="0" maxOccurs="unbounded" >
        <xs:annotation>
          <xs:documentation xml:lang="en">
Reference another schema file from this schema (outbound connections only).
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="domain" type="domainType" minOccurs="0"
                  maxOccurs="unbounded" >
        <xs:annotation>
          <xs:documentation xml:lang="en">
Domains are used to define common attribute sets for columns.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="table" type="tableType" minOccurs="0"
                  maxOccurs="unbounded" >
        <xs:annotation>
          <xs:documentation xml:lang="en">
Defines a database table.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="view" type="viewType" minOccurs="0"
                  maxOccurs="unbounded" >
        <xs:annotation>
          <xs:documentation xml:lang="en">
Defines a database view.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="name" type="javaNameType" use="required">
      <xs:annotation>
        <xs:documentation xml:lang="en" >
The name used to identify this schema in the generated
Java objects and as the default JDBC connection pool to use.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="defaultJavaType" use="optional"
                  type="javaReturnType" default="primitive" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
Defines if the record object property getter / setters will 
use objects (e.g. Integer) or primitives (e.g. int), defaults
to primitive.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="defaultIdMethod" use="optional" type="idMethodType"
                  default="none" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
Defines the defaultIdMethod to use with tables which do not have an idMethod
attribute defined. This attribute has 3 possible values, they are:

- idbroker
    Torque's software based id broker system
- native
    The SQL Server's native autoincrement/identifier process
- none
    Don't try to auto assign id numbers
- null
    Use the value previously set or the default value.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:complexType>

<!-- =====================================
     option element definition
     ===================================== -->
  <xs:complexType name="optionType">
    <xs:annotation>
      <xs:documentation xml:lang="en">
These tags allows a set of key/value options to be passed to custom generator
templates.
      </xs:documentation>
    </xs:annotation>
      <xs:attribute name="key" type="xs:string" use="required" />
      <xs:attribute name="value" type="xs:string" use="required" />
  </xs:complexType>
  
<!-- =====================================
     include-schema element definition
     ===================================== -->
  <xs:complexType name="includeSchemaType" >
    <xs:annotation>
      <xs:documentation xml:lang="en">
Include another schema file in this schema (as if it were a part of this
schema file).
      </xs:documentation>
    </xs:annotation>
    <xs:attribute name="filename" type="xs:string" use="required" />
  </xs:complexType>

<!-- =====================================
     external-schema element definition
     ===================================== -->
  <xs:complexType name="externalSchemaType" >
    <xs:annotation>
      <xs:documentation xml:lang="en">
Includes another schema file.
      </xs:documentation>
    </xs:annotation>
    <xs:attribute name="filename" type="xs:string" use="required" />
  </xs:complexType>
  
<!-- =====================================
     domain element definition
     ===================================== -->
  <xs:complexType name="domainType" >
    <xs:annotation>
      <xs:documentation xml:lang="en">
Domains are used to define attributes for columns.
      </xs:documentation>
    </xs:annotation>
    <xs:attribute name="name" type="xs:string" use="required" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
The name used to reference this set of column attributes.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="type" use="optional" type="sqlDataType"
                  default="VARCHAR" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
The SQL Standard data type for the column
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="size" type="xs:decimal" use="optional" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
The size of the field. E.g. Varchar(size) or Numeric(Size). Note that 
while this still supports the original torque use of using a
decimal number (5.2) to indicate the precision
and scale in one attribute. Use of the scale attribute is preferred.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="scale" type="xs:integer" use="optional" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
The scale of the field.  E.g.decimal(size, scale)
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="default" type="xs:string" use="optional" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
The default column value
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="description" type="xs:string" use="optional" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
The description of this domain for documentation purposes.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:complexType>
  
<!-- =====================================
     table element definition
     ===================================== -->
  <xs:complexType name="tableType">
    <xs:annotation>
      <xs:documentation xml:lang="en">
The table element and its relevant attributes.
      </xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="option" type="optionType" minOccurs="0"
                  maxOccurs="unbounded" />
      <xs:element name="column" type="columnType" maxOccurs="unbounded" >
        <xs:annotation>
          <xs:documentation xml:lang="en">
The column element and its relevant attributes
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:choice minOccurs="0" maxOccurs="unbounded" >
        <xs:element name="foreign-key" type="foreignKeyType">
          <xs:annotation>
            <xs:documentation xml:lang="en">
Define a foreign key constraint for this table.
            </xs:documentation>
          </xs:annotation>
        </xs:element>
        <xs:element name="index" type="indexType" >
          <xs:annotation>
            <xs:documentation xml:lang="en">
Defines an index for this table.
            </xs:documentation>
          </xs:annotation>
        </xs:element>
        <xs:element name="unique" type="uniqueType">
          <xs:annotation>
            <xs:documentation xml:lang="en">
Define a unique value constraint
            </xs:documentation>
          </xs:annotation>
        </xs:element>
        <xs:element name="id-method-parameter" type="idMethodParameterType">
        </xs:element>
      </xs:choice>
    </xs:sequence>
    <xs:attribute name="name" type="sqlQualifiedNameType" use="required" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
The table name of the SQL table.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="interface" type="javaQualifiedNameType"
                  use="optional" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
The interface attribute specifies an interface that should be referenced in
the implements section of the generated extension class. If this is a fully
qualified class name (i. e. the string contains dots), the interface will
simply be implemented by the extension object. If the interface is a simple
class name (without dots), an empty interface file will be generated in the
extension object package. When this attribute is used, all methods that
normally would return the extension object type will now return the interface
type. This feature allows to use Torque generated classes in the context of
other applications or APIs.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
        <xs:attribute name="peerInterface" type="javaQualifiedNameType"
                  use="optional" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
The interface attribute specifies an interface that should be referenced in
the implements section of the generated peer class. If this is a fully
qualified class name (i. e. the string contains dots), the interface will
simply be implemented by the peer object. If the interface is a simple
class name (without dots), an empty interface file will be generated in the
peer package. This feature allows to use Torque generated peer classes
in the context of other applications or APIs.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="baseClass" type="javaQualifiedNameType" use="optional">
      <xs:annotation>
        <xs:documentation xml:lang="en">
The fully qualified class that the generated Java table
record objects will extend. This class does not have to extend 
org.apache.torque.om.BaseObject.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="basePeer" type="javaQualifiedNameType" use="optional" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
The fully qualified class that the generated Java Peer objects will extend.
Unlike baseClass, basePeer should extend BasePeer at some point in the chain,
i.e. it needs to be the superclass.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="idMethod" use="optional" type="idMethodType">
      <xs:annotation>
        <xs:documentation xml:lang="en">
Defines the id method to automatically generate ids for this table.
This attribute has 3 possible values, they are:

- idbroker
    Torque's software based id broker system
- native
    The SQL Server's native autoincrement / identifier process
- none
    Don't try to auto assign id numbers
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="abstract" use="optional" type="xs:boolean"
                  default="false" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
Whether or not to generate the class as Abstract or not
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="javaName" type="javaNameType" use="optional" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
This is the Java class name to use when generating the table. If
this is missing the Java name is generated from the name attribute.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="skipSql" use="optional" type="xs:boolean"
                  default="false" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
Whether or not to skip SQL generation for this reference.  Useful for using
Views or creating a "subset" of columns in an existing table.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="description" type="xs:string" use="optional" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
A description of this table.  Used for documentation and will be included in
the table generation SQL if the server type supports this.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:complexType>
  
<!-- =====================================
     column element definition
     ===================================== -->
  <xs:complexType name="columnType">
    <xs:annotation>
      <xs:documentation xml:lang="en">
The column element and its relevant attributes
      </xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="option" type="optionType" minOccurs="0"
                  maxOccurs="unbounded" />
      <xs:element name="enum-value" type="enumValueType" minOccurs="0"
                  maxOccurs="unbounded" />
      <xs:element name="inheritance" type="inheritanceType" minOccurs="0"
                  maxOccurs="unbounded" >
        <xs:annotation>
          <xs:documentation xml:lang="en">
Define an inheritance mapping of records to class by a key column.  See the
inheritance How To document.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
                  
    </xs:sequence>
    <xs:attribute name="name" type="sqlNameType" use="required" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
The column name
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="type" use="optional" type="sqlDataType">
      <xs:annotation>
        <xs:documentation xml:lang="en">
The SQL data type for the column. Is required unless a domain is used.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="size" type="xs:decimal" use="optional" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
The size of the field. E.g. Varchar(size) or Numeric(Size). Note that 
while this still supports the original torque use of using a
decimal number (5.2) to indicate the precision
and scale in one attribute. Use of the scale attribute is preferred.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="scale" type="xs:integer" use="optional" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
The scale of the field.  E.g.decimal(size, scale)
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="default" type="xs:string" use="optional" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
The default column value
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="useDatabaseDefaultValue" type="xs:boolean" use="optional" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
Whether to use the database default value if a new object is saved
and the attribute value is equal to the java default value. Default is false.
Has no effect on primitive boolean columns.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="primaryKey" use="optional"
                  type="xs:boolean" default="false" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
Whether this column is part of the table's primary key.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="autoIncrement" use="optional"
                  type="xs:boolean" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
Whether or not to auto-increment this field (true or false, defaults to false)
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="required" use="optional" type="xs:boolean"
                  default="false" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
Whether a value is required in this column (NULL ALLOWED) (true or false,
defaults to false)
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="javaName" type="javaNameType"
                  use="optional" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
The Java property name to use for this column in the record objects.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="javaType" use="optional"
                  type="javaReturnType" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
Defines if the record object property getter / setters will
use objects (e.g. Integer) or primitives (e.g. int), defaults 
to database attribute or primitive
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="domain" type="xs:string" use="optional" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
The domain reference name to set common settings.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="inheritance" type="inheritanceAttrType" use="optional"
                  default="false" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
The inheritance method used (see inheritance documentation)
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="protected" use="optional"
                  type="xs:boolean" default="false" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
If true, the setters and getters for this property will be protected rather
than public.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="version" use="optional"
                  type="xs:boolean" default="false" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
If true, this column is used as a version number for optimistic locking.
I.e. for updates, Torque will check that the version number in the database
is equal to the version number of the supplied object
and it will automatically increase the version number of the updated row.
Setting version to true will only work for numeric columns and will produce
code that does not compile if applied to other column types.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="enumType" use="optional" type="xs:string">
      <xs:annotation>
        <xs:documentation xml:lang="en">
If this attribute has a value, the java type for the column is an enum.
The name of the enum type is contained in this attribute. It can be either
fully qualified or unqualified.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="description" type="xs:string" use="optional" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
The description of this column for documentation purposes.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:complexType>
  
<!-- =====================================
     inheritance element definition
     ===================================== -->
  <xs:complexType name="inheritanceType">
    <xs:annotation>
      <xs:documentation xml:lang="en">
Define an inheritance mapping of records to class by a key column.  See the
inheritance How To document.
      </xs:documentation>
    </xs:annotation>
    <xs:attribute name="key" type="xs:string" use="required" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
A value found in the column marked as the inheritance key column
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="class" type="javaNameType" use="required" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
The class name for the object that will inherit the record values
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
   <xs:attribute name="package" type="javaQualifiedNameType" use="optional" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
        The optional package, if starting with a dot ()".") this is a sub package of table package   
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="extends" type="javaQualifiedNameType" use="optional" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
The class that the inheritor class will extend
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:complexType>
  
<!-- =====================================
     enumValue element definition
     ===================================== -->
  <xs:complexType name="enumValueType">
    <xs:annotation>
      <xs:documentation xml:lang="en">
Defines a possible value for an enum. If any of these elements occurs 
for a column, Torque will generate an enum for this column.
      </xs:documentation>
    </xs:annotation>
    <xs:attribute name="value" type="xs:string" use="required">
      <xs:annotation>
        <xs:documentation xml:lang="en">
The value for the enum. Must be unique.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="javaName" type="xs:string" use="optional">
      <xs:annotation>
        <xs:documentation xml:lang="en">
The java name for the enum. Must be unique and must not clash 
with automatically determined javaNames for the same enum.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="description" type="xs:string" use="optional">
      <xs:annotation>
        <xs:documentation xml:lang="en">
A description for the enum value.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:complexType>
  
<!-- =====================================
     foreign-key element definition
     ===================================== -->
  <xs:complexType name="foreignKeyType" >
    <xs:annotation>
      <xs:documentation xml:lang="en">
Define a foreign key constraint for this table.
      </xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="option" type="optionType" minOccurs="0"
                  maxOccurs="unbounded" />
      <xs:element name="reference" type="referenceType" maxOccurs="unbounded" >
        <xs:annotation>
          <xs:documentation xml:lang="en">
Define a mapping between a local column containing a foreign key value and
the foreign table column.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="name" type="sqlNameType" use="optional" >
        <xs:annotation>
        <xs:documentation xml:lang="en">
The name used to create the foreign key constraint.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="foreignTable" type="sqlQualifiedNameType" use="required" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
The name of the table that contains the foreign key
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="onDelete" use="optional" type="cascadeType">
      <xs:annotation>
        <xs:documentation xml:lang="en">
The action to take when the referenced value in foreignTable is deleted.
Note this is handled by the database server and not Torque code.  Will not
work if the DB server does not support this.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="onUpdate" use="optional" type="cascadeType">
      <xs:annotation>
        <xs:documentation xml:lang="en">
The action to take when the referenced value in foreignTable is updated.
Note this is handled by the database server and not Torque code.  Will not
work if the DB server does not support this.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:complexType>
  
<!-- =====================================
     reference element definition
     ===================================== -->
  <xs:complexType name="referenceType" >
    <xs:annotation>
      <xs:documentation xml:lang="en">
Define a mapping between a local column containing a foreign key value and
the foreign table column.
      </xs:documentation>
    </xs:annotation>
    <xs:attribute name="foreign" type="sqlNameType" use="required" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
The column in the foreign table that contains the key.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="local" type="sqlNameType" use="required" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
The column in this table that contains the foreign key.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:complexType>
  
<!-- =====================================
     index element definition
     ===================================== -->
  <xs:complexType name="indexType" >
    <xs:annotation>
      <xs:documentation xml:lang="en">
Defines an index for this table.
      </xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="option" type="optionType" minOccurs="0"
                  maxOccurs="unbounded" />
      <xs:element name="index-column" type="indexColumnType"
                  maxOccurs="unbounded" >
        <xs:annotation>
          <xs:documentation xml:lang="en">
Define a column to use in a table index.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="name" type="sqlNameType" use="optional" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
The name used in creating this index in the database.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:complexType>
  
<!-- =====================================
     reference element definition
     ===================================== -->
  <xs:complexType name="indexColumnType" >
    <xs:annotation>
      <xs:documentation xml:lang="en">
Define a column to use in a table index.
      </xs:documentation>
    </xs:annotation>
    <xs:attribute name="name" type="sqlNameType" use="required" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
A column name to use in this index.  Must exist in the table.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:complexType>
  
<!-- =====================================
     unique element definition
     ===================================== -->
  <xs:complexType name="uniqueType">
    <xs:annotation>
      <xs:documentation xml:lang="en">
Define a unique value constraint
      </xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="option" type="optionType" minOccurs="0"
                  maxOccurs="unbounded" />
      <xs:element name="unique-column" type="uniqueColumnType"
                  maxOccurs="unbounded" >
        <xs:annotation>
          <xs:documentation xml:lang="en">
Specify a column to use in the unique constraint.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="name" type="sqlNameType" use="optional" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
The name to use in defining this constraint.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:complexType>
  
<!-- =====================================
     unique-column element definition
     ===================================== -->
  <xs:complexType name="uniqueColumnType" >
    <xs:annotation>
      <xs:documentation xml:lang="en">
Specify a column to use in the unique constraint.
      </xs:documentation>
    </xs:annotation>
    <xs:attribute name="name" type="sqlNameType" use="required" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
The name to use in defining this constraint.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="size" type="xs:decimal" use="optional" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
The size of the field. E.g. columnname(size). Mainly to customize restrictions in bytes/character restrictions without global changes.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:complexType>
  
<!-- =====================================
     id-method-parameter element definition
     ===================================== -->
  <xs:complexType name="idMethodParameterType">
    <xs:attribute name="name" type="xs:string" use="optional"
                  default="default" />
    <xs:attribute name="value" type="xs:string"
                  use="required" />
  </xs:complexType>

<!-- =====================================
     view element definition
     ===================================== -->
  <xs:complexType name="viewType">
    <xs:annotation>
      <xs:documentation xml:lang="en">
The view element and its relevant attributes.
      </xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="option" type="optionType" minOccurs="0"
                  maxOccurs="unbounded" />
      <xs:element name="column" type="viewColumnType" maxOccurs="unbounded" >
        <xs:annotation>
          <xs:documentation xml:lang="en">
The column element and its relevant attributes
          </xs:documentation>
        </xs:annotation>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="name" type="sqlNameType" use="required" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
The name of the SQL view.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="baseClass" type="javaQualifiedNameType" use="optional">
      <xs:annotation>
        <xs:documentation xml:lang="en">
The fully qualified class that the generated Java view
record objects will extend. This class does not have to extend 
org.apache.torque.om.BaseObject.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="basePeer" type="javaQualifiedNameType" use="optional" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
The fully qualified class that the generated Java Peer objects will extend.
Unlike baseClass, basePeer should extend BasePeer at some point in the chain,
i.e. it needs to be the superclass.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="abstract" use="optional" type="xs:boolean"
                  default="false" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
Whether or not to generate the class as Abstract or not
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="javaName" type="javaNameType" use="optional" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
This is the Java class name to use when generating the view. If
this is missing the Java name is generated from the name attribute.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="sqlSuffix" type="xs:string" use="optional" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
The remainder of the sql for the view after column definitions.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="createSql" type="xs:string" use="optional" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
The complete SQL for creating the view. Overrides all other means
of generating the SQL for view creation.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="skipSql" use="optional" type="xs:boolean"
                  default="false" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
Whether or not to skip SQL generation for this reference.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="description" type="xs:string" use="optional" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
A description of this view.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:complexType>
  
<!-- =====================================
     view column element definition
     ===================================== -->
  <xs:complexType name="viewColumnType">
    <xs:annotation>
      <xs:documentation xml:lang="en">
The column element and its relevant attributes
      </xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="option" type="optionType" minOccurs="0"
                  maxOccurs="unbounded" />
      <xs:element name="inheritance" type="inheritanceType" minOccurs="0"
                  maxOccurs="unbounded" >
        <xs:annotation>
          <xs:documentation xml:lang="en">
Define an inheritance mapping of records to class by a key column.  See the
inheritance How To document.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
                  
    </xs:sequence>
    <xs:attribute name="name" type="sqlNameType" use="required" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
The column name
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="type" use="required" type="sqlDataType">
      <xs:annotation>
        <xs:documentation xml:lang="en">
The SQL Standard data type for the column
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="size" type="xs:decimal" use="optional" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
The size of the field. E.g. Varchar(size) or Numeric(Size). Note that 
while this still supports the original torque use of using a
decimal number (5.2) to indicate the precision
and scale in one attribute. Use of the scale attribute is preferred.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="scale" type="xs:integer" use="optional" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
The scale of the field.  E.g.decimal(size, scale)
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="javaName" type="javaNameType"
                  use="optional" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
The Java property name to use for this column in the record objects.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="javaType" use="optional"
                  type="javaReturnType" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
Defines if the record object property getter / setters will
use objects (e.g. Integer) or primitives (e.g. int), defaults 
to database attribute or primitive
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="domain" type="xs:string" use="optional" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
The domain reference name to set common settings.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="select" type="sqlQualifiedNameType" use="required" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
The sql snippet which contains the value to select.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="protected" use="optional"
                  type="xs:boolean" default="false" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
If true, the setters and getters for this property will be protected rather
than public.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="description" type="xs:string" use="optional" >
      <xs:annotation>
        <xs:documentation xml:lang="en">
The description of this column for documentation purposes.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="enumType" use="optional" type="xs:string">
      <xs:annotation>
        <xs:documentation xml:lang="en">
If this attribute has a value, the java type for the column is an enum.
The name of the enum type is contained in this attribute. It can be either
fully qualified or unqualified.
        </xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:complexType>
<!-- =====================================
    Type definitions for attributes
     ===================================== -->

  <xs:simpleType name="sqlDataType">
    <xs:annotation>
      <xs:documentation xml:lang="en">
Standard SQL column data types.
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:NMTOKEN">
      <xs:enumeration value="BIT" />
      <xs:enumeration value="TINYINT" />
      <xs:enumeration value="SMALLINT" />
      <xs:enumeration value="INTEGER" />
      <xs:enumeration value="BIGINT" />
      <xs:enumeration value="FLOAT" />
      <xs:enumeration value="REAL" />
      <xs:enumeration value="NUMERIC" />
      <xs:enumeration value="DECIMAL" />
      <xs:enumeration value="CHAR" />
      <xs:enumeration value="VARCHAR" />
      <xs:enumeration value="LONGVARCHAR" />
      <xs:enumeration value="DATE" />
      <xs:enumeration value="TIME" />
      <xs:enumeration value="TIMESTAMP" />
      <xs:enumeration value="BINARY" />
      <xs:enumeration value="VARBINARY" />
      <xs:enumeration value="LONGVARBINARY" />
      <xs:enumeration value="NULL" />
      <xs:enumeration value="OTHER" />
      <xs:enumeration value="JAVA_OBJECT" />
      <xs:enumeration value="DISTINCT" />
      <xs:enumeration value="STRUCT" />
      <xs:enumeration value="ARRAY" />
      <xs:enumeration value="BLOB" />
      <xs:enumeration value="CLOB" />
      <xs:enumeration value="REF" />
      <xs:enumeration value="BOOLEANINT" />
      <xs:enumeration value="BOOLEANCHAR" />
      <xs:enumeration value="DOUBLE" />
    </xs:restriction>
  </xs:simpleType>
  
  <xs:simpleType name="idMethodType">
    <xs:annotation>
      <xs:documentation xml:lang="en">
A schema type for methods to create ids automatically.

idbroker = Torque's software based id broker system
native   = The SQL Server's native method, depends on database used
           (e.g. autoincrement for MySQL, sequence for postgresql...)
none     = Don't try to auto assign id numbers
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:NMTOKEN">
      <xs:enumeration value="idbroker" />
      <xs:enumeration value="native" />
      <xs:enumeration value="none" />
    </xs:restriction>
  </xs:simpleType>
  
  <xs:simpleType name="javaReturnType">
    <xs:restriction base="xs:NMTOKEN">
      <xs:enumeration value="object" />
      <xs:enumeration value="primitive" />
    </xs:restriction>
  </xs:simpleType>
  
  <xs:simpleType name="cascadeType" >
    <xs:restriction base="xs:NMTOKEN">
      <xs:enumeration value="cascade" />
      <xs:enumeration value="setnull" />
      <xs:enumeration value="restrict" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="inheritanceAttrType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="single" />
      <xs:enumeration value="false" />
    </xs:restriction>
  </xs:simpleType>
  
  <xs:simpleType name="javaNameType">
    <xs:annotation>
      <xs:documentation xml:lang="en">
Java identifiers, e.g. [A-Za-z_$]A-Za-z_$0-9]*
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string"/>
  </xs:simpleType>

  <xs:simpleType name="javaQualifiedNameType">
    <xs:annotation>
      <xs:documentation xml:lang="en">
Java fully qualified names (e.g. x.y.x)
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string"/>
  </xs:simpleType>

  <xs:simpleType name="sqlNameType">
    <xs:annotation>
      <xs:documentation xml:lang="en">
SQL Standard non-delimited identifiers.
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string" />
  </xs:simpleType>

  <xs:simpleType name="sqlQualifiedNameType">
    <xs:annotation>
      <xs:documentation xml:lang="en">
SQL Standard non-delimited identifiers.
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string" />
  </xs:simpleType>

</xs:schema>