Access Keys:
Skip to content (Access Key - 0)

Data Services


CQL 2


Contents

Overview


CQL 2 is the successor query language to CQL. It provides functionality most often requested by the caGrid user community that was not previously present in CQL and can be thought of as a superset of CQL.

Features


CQL 2 adds to the functionality provided by CQL, which many users of caGrid data services have expressed an interest in and numerous needs for. Major examples of such new features:

  • Aggregations
    • Min, Max, and Count have been added as aggregation operations when returning a distinct attribute value.
  • Strongly typed attribute values
    • Queries are unambiguous when using attribute value restrictions.
    • Data types prevent type mismatches (i.e. querying integer fields using strings).
  • Differentiation from Unary to Binary attribute restrictions
    • Reduces processing to determine the nature of an attribute.
    • Improves clarity of query language schema.
  • Retrieval of associated objects
    • Associations can be populated by the data service before returning object instances.
    • Retrieval based on role names or depth of association
    • Name-based retrieval is recursively defined, allowing population of specific associations of associations.
  • Extensions
    • CQL 2 adds several points at which the language may be extended with custom query components.
    • Support for extensions is advertised by data services which support CQL 2.

Examples


These examples reference the caCORE SDK 4.0 example domain model.

XML Examples

Like CQL before, CQL 2 queries can be composed by writing XML which conforms to the CQL 2 schema. These documents can in turn be deserialized as CQL 2 query objects and passed to the query API.

Retrieve All Instances of a Data Type

CQL 2 can be used to simply retrieve all instances of a target data type. This query appears very similar to its standard CQL counterpart:

<ns1:CQLQuery xmlns:ns1="http://CQL.caBIG/2/org.cagrid.cql2">
 <ns1:CQLTargetObject className="gov.nih.nci.cacoresdk.domain.inheritance.childwithassociation.Payment"/>
</ns1:CQLQuery>

Simple Associations

This query returns all instances of 'Computer' that's association to 'HardDrive' is populated (non-null):

<ns1:CQLQuery xmlns:ns1="http://CQL.caBIG/2/org.cagrid.cql2">
 <ns1:CQLTargetObject className="gov.nih.nci.cacoresdk.domain.onetomany.bidirectional.Computer">
  <ns1:CQLAssociatedObject className="gov.nih.nci.cacoresdk.domain.onetomany.bidirectional.HardDrive" endName="hardDriveCollection"/>
 </ns1:CQLTargetObject>
</ns1:CQLQuery>

Binary Attributes

This query uses a binary attribute to retrieve 'Payment' instances that's value is the Integer '1':

<ns1:CQLQuery xmlns:ns1="http://CQL.caBIG/2/org.cagrid.cql2">
 <ns1:CQLTargetObject className="gov.nih.nci.cacoresdk.domain.inheritance.childwithassociation.Payment">
  <ns1:CQLAttribute name="amount">
   <ns1:BinaryPredicate>EQUAL_TO</ns1:BinaryPredicate>
   <ns1:AttributeValue>
    <ns1:IntegerValue>1</ns1:IntegerValue>
   </ns1:AttributeValue>
  </ns1:CQLAttribute>
 </ns1:CQLTargetObject>
</ns1:CQLQuery>

This is a significant difference from the original CQL in that it makes the data type of the attribute value explicitly clear. It also differentiates between binary restrictions on attributes (i.e., comparison between the attribute value and another specified constant) and unary restrictions (i.e., "is null" and "is not null").

Aggregations

CQL 2 allows aggregations on distinct attributes. This query counts the number of 'Cash' instances:

<ns1:CQLQuery xmlns:ns1="http://CQL.caBIG/2/org.cagrid.cql2">
 <ns1:CQLTargetObject className="gov.nih.nci.cacoresdk.domain.inheritance.childwithassociation.Cash"/>
 <ns1:CQLQueryModifier>
  <ns1:CountOnly>true</ns1:CountOnly/>
 </ns1:CQLQueryModifier>
</ns1:CQLQuery>

Populating Associations

This query retrieves 'Child' instances and populates their association to 'father'. Named associations to be populated may be added recursively such that associations of associations (and so on) may be populated.

<ns1:CQLQuery xmlns:ns1="http://CQL.caBIG/2/org.cagrid.cql2">
 <ns1:CQLTargetObject className="gov.nih.nci.cacoresdk.domain.onetoone.multipleassociation.Child"/>
 <ns1:AssociationPopulationSpecification>
  <ns1:NamedAssociationList>
   <ns1:NamedAssociation endName="father"/>
  </ns1:NamedAssociationList>
 </ns1:AssociationPopulationSpecification>
</ns1:CQLQuery>

Object API Examples

CQL 2 queries, like the original CQL, may be constructed by building them up with the Java object API. This API is simply a set of generated Java beans by Axis from the XML schema representation of CQL 2. These object representations may be serialized as XML text.

Binary Attributes

CQLQuery query = new CQLQuery();
CQLTargetObject target = new CQLTargetObject();
target.setClassName(Payment.class.getName());
CQLAttribute amountAttribute = new CQLAttribute();
amountAttribute.setName("amount");
amountAttribute.setPredicate(BinaryPredicate.EQUAL_TO);
AttributeValue amountValue = new AttributeValue();
amountValue.setIntegerValue(Integer.valueOf(1));
amountAttribute.setAttributeValue(amountValue);
target.setCQLAttribute(amountAttribute);
query.setCQLTargetObject(target);

Association Population

CQLQuery query = new CQLQuery();
CQLTargetObject target = new CQLTargetObject();
target.setClassName(Child.class.getName());
AssociationPopulationSpecification population = new AssociationPopulationSpecification();
NamedAssociation fatherAssociation = new NamedAssociation();
fatherAssociation.setEndName("father");
population.setNamedAssociationList(new NamedAssociationList(new NamedAssociation[] {fatherAssociation}));
query.setCQLTargetObject(target);
query.setAssociationPopulationSpecification(population);

Utility APIs


Several utility APIs exist to assist developers with serializing, deserializing, and creating CQL 2 queries, as well as handling CQL 2 query results. The classes mentioned below are in the org.cagrid.cql.utilities package within the CQL project.

Converters

Utilities for conversion between CQL 1 and CQL 2 are available to assist with interoperability between existing tools and services and those that support CQL 2.

Converting CQL 1 to 2

The CQL1toCQL2Converter class performs the task of converting a CQL 1 query into its CQL 2 counterpart. It has a single constructor that takes the domain model of the service for which the query is being converted, and it has a single public method (convertToCql2Query) that takes a CQL 1 query and returns a CQL 2 query.

The domain model is required at construction of the converter instance to facilitate the new strongly typed attribute queries.

Converting CQL 2 to 1

The CQL2toCQL1Converter class performs the task of converting a CQL 2 query into its CQL 1 counterpart. It has a single static method which takes CQL 2 and returns CQL 1:

  • convertToCql1Query(org.cagrid.cql2.CQLQuery cql2Query) -> CQLQuery

Since CQL 2 contains features that do not map into CQL 1, any appearance of these features in the input CQL 2 query will cause a QueryConversionException to be thrown.

Serialization Tools

Serialization tools are those which can serialize and deserialize CQL 2 queries. The CQL2SerializationUtil class contains several static methods that perform this functionality:

  • serializeCql2Query(CQLQuery, Writer)
    • Serializes a CQL 2 query into the specified Writer.
  • serializeCql2Query(CQLQuery) -> String
    • Serializes a CQL 2 query and returns its XML representation as a String.
  • deserializeCql2Query(String) -> CQLQuery
    • Deserializes an XML representation of a CQL 2 query in a String into its Java object representation.
  • deserializeCql2Query(Reader) -> CQLQuery
    • Deserializes an XML representation from a Reader (i.e., FileReader, StringReader) of a CQL 2 query into its Java object representation.
  • serializeCql2QueryResults(CQLQueryResults, Writer)
    • Serializes a CQL 2 query results instance into a Writer.
  • deserializeCql2QueryResults(Reader) -> CQLQueryResults
    • Deserializes an XML representation of CQL 2 query results into a CQL 2 query results Java object representation..
  • cloneQueryBean(CQLQuery) -> CQLQuery
    • Makes a copy of a CQL 2 query instance

Result Iterators

As was the case with CQL 1, CQL 2 provides means to iterate over result sets. The org.cagrid.cql.utilities.iterator.CQL2QueryResultsIterator has three public constructors which cause the iterator to behave slightly different in each case:

  • public CQL2QueryResultsIterator(CQLQueryResults results)
    • Create a new CQL2QueryResultsIterator which will return Object results deserialized with the default configured AXIS deserializers.
  • public CQL2QueryResultsIterator(CQLQueryResults results, boolean xmlOnly)
    • When returning objects, setting xmlOnly to true will bypass the AXIS deserializer and return straight XML strings. When set to false, the results are deserialized with the default AXIS configured deserializers.
  • public CQL2QueryResultsIterator(CQLQueryResults results, InputStream wsdd)
    • When returning objects, the supplied WSDD configuration file is used to configure the AXIS deserializers.

Technology Preview


Main Article: CQL 2 Technology Preview

A technology preview of CQL 2 was created to allow early adopters and other interested parties a chance to try out the new features and syntax of CQL 2 and to investigate its suitability for their needs. Information gained through this process was used to finalize the CQL 2 specification and implementation in caGrid.

Use Cases


Main Article: CQL 2 Use Cases

Schemas


The CQL 2 language is divided into multiple XML schema documents to keep related data types together and allow modular enhancement and extension of the language. All of these documents utilize the same target namespace, and are included by the top-level CQLQueryComponents.xsd document.

CQL Query Components

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:cql2="http://CQL.caBIG/2/org.cagrid.cql2" targetNamespace="http://CQL.caBIG/2/org.cagrid.cql2" elementFormDefault="qualified" attributeFormDefault="unqualified">
	<xsd:include schemaLocation="CQLAttribute.xsd"/>
	<xsd:include schemaLocation="CQLQueryModifier.xsd"/>
	<xsd:include schemaLocation="AssociationPopulationSpec.xsd"/>
	
	<xsd:complexType name="CQLObject" abstract="true">
		<xsd:choice>
			<xsd:element name="CQLAssociatedObject" type="cql2:CQLAssociatedObject" minOccurs="0"/>
			<xsd:element name="CQLGroup" type="cql2:CQLGroup" minOccurs="0"/>
			<xsd:element name="CQLAttribute" type="cql2:CQLAttribute" minOccurs="0"/>
			<xsd:element name="CQLExtension" type="cql2:CQLExtension" minOccurs="0"/>
		</xsd:choice>
		<xsd:attribute name="className" type="xsd:string" use="required"/>
		<xsd:attribute name="instanceof" type="xsd:string" use="optional"/>
	</xsd:complexType>
	
	<xsd:complexType name="CQLTargetObject">
		<xsd:complexContent>
			<xsd:extension base="cql2:CQLObject"/>
		</xsd:complexContent>
	</xsd:complexType>
	
	<xsd:complexType name="CQLAssociatedObject">
		<xsd:complexContent>
			<xsd:extension base="cql2:CQLObject">
				<xsd:attribute name="endName" type="xsd:string" use="optional"/>
			</xsd:extension>
		</xsd:complexContent>
	</xsd:complexType>
	
	<xsd:complexType name="CQLGroup">
		<!-- the two choice blocks and a sequence enforce 
		groups having two or more query components -->
		<xsd:choice minOccurs="2" maxOccurs="unbounded">
			<xsd:element name="CQLAssociatedObject" type="cql2:CQLAssociatedObject" minOccurs="1" maxOccurs="unbounded"/>
			<xsd:element name="CQLGroup" type="cql2:CQLGroup" minOccurs="1" maxOccurs="unbounded"/>
			<xsd:element name="CQLAttribute" type="cql2:CQLAttribute" minOccurs="1" maxOccurs="unbounded"/>
			<xsd:element name="CQLExtension" type="cql2:CQLExtension" minOccurs="1" maxOccurs="unbounded"/>
		</xsd:choice>
		<xsd:attribute name="logicalOperation" type="cql2:GroupLogicalOperator" use="required"/>
	</xsd:complexType>
	
	<xsd:simpleType name="GroupLogicalOperator">
		<xsd:restriction base="xsd:string">
			<xsd:enumeration value="AND" id="and"/>
			<xsd:enumeration value="OR" id="or"/>
		</xsd:restriction>
	</xsd:simpleType>
	
	<xsd:element name="CQLQuery" type="cql2:CQLQuery"/>
	<xsd:complexType name="CQLQuery">
		<xsd:sequence>
			<xsd:element name="CQLTargetObject" type="cql2:CQLTargetObject"/>
			<xsd:choice>
				<xsd:element name="CQLQueryModifier" type="cql2:CQLQueryModifier" minOccurs="0"/>
				<xsd:element name="AssociationPopulationSpecification" type="cql2:AssociationPopulationSpecification" minOccurs="0"/>
			</xsd:choice>
		</xsd:sequence>
	</xsd:complexType>
</xsd:schema>

Aggregation Operations

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
	xmlns:cql2="http://CQL.caBIG/2/org.cagrid.cql2" 
	targetNamespace="http://CQL.caBIG/2/org.cagrid.cql2" 
	elementFormDefault="qualified" attributeFormDefault="unqualified">
	
	<xsd:simpleType name="Aggregation">
		<xsd:annotation>
			<xsd:documentation>Aggregation operations for modifying a query attribute</xsd:documentation>
		</xsd:annotation>
		<xsd:restriction base="xsd:string">
			<xsd:enumeration value="COUNT" id="count"/>
			<xsd:enumeration value="MIN" id="min"/>
			<xsd:enumeration value="MAX" id="max"/>
		</xsd:restriction>
	</xsd:simpleType>
</xsd:schema>

Association Population

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
	xmlns:cql2="http://CQL.caBIG/2/org.cagrid.cql2"
	targetNamespace="http://CQL.caBIG/2/org.cagrid.cql2" 
	elementFormDefault="qualified" attributeFormDefault="unqualified">

	<xsd:element name="AssociationPopulationSpecification" type="cql2:AssociationPopulationSpecification"/>
	<xsd:complexType name="AssociationPopulationSpecification">
		<xsd:choice>
			<xsd:element name="PopulationDepth" type="cql2:PopulationDepth"/>
			<xsd:element name="NamedAssociationList" type="cql2:NamedAssociationList"/>
		</xsd:choice>
	</xsd:complexType>
	
	<xsd:complexType name="PopulationDepth">
		<xsd:attribute name="depth" type="xsd:int" use="required"/>
	</xsd:complexType>
	
	<xsd:complexType name="NamedAssociation">
		<xsd:choice>
			<xsd:element name="NamedAssociationList" type="cql2:NamedAssociationList" minOccurs="0" maxOccurs="1"/>
			<xsd:element name="PopulationDepth" type="cql2:PopulationDepth" minOccurs="0" maxOccurs="1"/>
		</xsd:choice>
		<xsd:attribute name="endName" type="xsd:string" use="required"/>
		<xsd:attribute name="instanceof" type="xsd:string" use="optional"/>
	</xsd:complexType>
	
	<xsd:complexType name="NamedAssociationList">
		<xsd:sequence>
			<xsd:element name="NamedAssociation" type="cql2:NamedAssociation" minOccurs="0" maxOccurs="unbounded"/>
		</xsd:sequence>
	</xsd:complexType>
</xsd:schema>

Attributes

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
	xmlns:cql2="http://CQL.caBIG/2/org.cagrid.cql2" 
	targetNamespace="http://CQL.caBIG/2/org.cagrid.cql2" 
	elementFormDefault="qualified" attributeFormDefault="unqualified">
	<xsd:include schemaLocation="Predicates.xsd"/>
	<xsd:include schemaLocation="CQLExtension.xsd"/>
	
	<xsd:complexType name="CQLAttribute">
		<xsd:choice>
			<xsd:sequence>
				<xsd:element name="BinaryPredicate" type="cql2:BinaryPredicate"/>
				<xsd:element name="AttributeValue" type="cql2:AttributeValue"/>
			</xsd:sequence>
			<xsd:sequence>
				<xsd:element name="UnaryPredicate" type="cql2:UnaryPredicate"/>
			</xsd:sequence>
			<xsd:sequence>
				<xsd:element name="AttributeExtension" type="cql2:CQLExtension"/>
			</xsd:sequence>
		</xsd:choice>
		<xsd:attribute name="name" type="xsd:string" use="required"/>
	</xsd:complexType>
	
	<xsd:complexType name="AttributeValue">
		<xsd:choice>
			<xsd:element name="StringValue" type="xsd:string"/>
			<xsd:element name="DateValue" type="xsd:date"/>
			<xsd:element name="TimeValue" type="xsd:time"/>
			<xsd:element name="LongValue" type="xsd:long"/>
			<xsd:element name="IntegerValue" type="xsd:int"/>
			<xsd:element name="BooleanValue" type="xsd:boolean"/>
			<xsd:element name="DoubleValue" type="xsd:double"/>
			<xsd:element name="FloatValue" type="xsd:float"/>
		</xsd:choice>
	</xsd:complexType>
</xsd:schema>

Extensions

<xsd:schema xmlns:cql2="http://CQL.caBIG/2/org.cagrid.cql2" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://CQL.caBIG/2/org.cagrid.cql2" elementFormDefault="qualified" attributeFormDefault="unqualified">
	<xsd:complexType name="CQLExtension">
		<xsd:annotation>
			<xsd:documentation>Wraps a custom extension to the CQL 2 query language</xsd:documentation>
		</xsd:annotation>
		<xsd:sequence>
			<xsd:any namespace="##any" processContents="lax" minOccurs="1" maxOccurs="1"/>
		</xsd:sequence>
		<xsd:attribute name="mustUnderstand" type="xsd:boolean" use="optional" default="0"/>
	</xsd:complexType>
</xsd:schema>

Query Modifiers

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
	xmlns:cql2="http://CQL.caBIG/2/org.cagrid.cql2" 
	targetNamespace="http://CQL.caBIG/2/org.cagrid.cql2" 
	elementFormDefault="qualified" attributeFormDefault="unqualified">
	<xsd:include schemaLocation="Aggregations.xsd"/>
	<xsd:include schemaLocation="CQLExtension.xsd"/>
	
	<xsd:complexType name="CQLQueryModifier">
		<xsd:choice>
			<xsd:element name="NamedAttribute" type="cql2:NamedAttribute" minOccurs="1" maxOccurs="unbounded"/>
			<xsd:element name="DistinctAttribute" type="cql2:DistinctAttribute" minOccurs="1" maxOccurs="1"/>
			<xsd:element name="CountOnly" type="xsd:boolean" minOccurs="1" maxOccurs="1"/>
			<xsd:element name="ModifierExtension" type="cql2:CQLExtension" minOccurs="1" maxOccurs="1"/>
		</xsd:choice>
	</xsd:complexType>
	
	<xsd:complexType name="NamedAttribute">
		<xsd:attribute name="attributeName" type="xsd:string" use="required"/>
	</xsd:complexType>
	
	<xsd:complexType name="DistinctAttribute">
		<xsd:complexContent>
			<xsd:extension base="cql2:NamedAttribute">
				<xsd:attribute name="aggregation" type="cql2:Aggregation" use="optional"/>
			</xsd:extension>
		</xsd:complexContent>
	</xsd:complexType>
</xsd:schema>

Query Results

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
	xmlns:res="http://CQL.caBIG/2/org.cagrid.cql2.results" 
	xmlns:cql2="http://CQL.caBIG/2/org.cagrid.cql2" 
	targetNamespace="http://CQL.caBIG/2/org.cagrid.cql2.results" 
	elementFormDefault="qualified" attributeFormDefault="unqualified">
	<xsd:import namespace="http://CQL.caBIG/2/org.cagrid.cql2" schemaLocation="Aggregations.xsd"/>
	
	<xsd:element name="CQLQueryResults" type="res:CQLQueryResults"/>
	<xsd:complexType name="CQLQueryResults">
		<xsd:annotation>
			<xsd:documentation>Results from a CQL query executed against a caGrid data service</xsd:documentation>
		</xsd:annotation>
		<xsd:choice>
			<xsd:sequence>
				<xsd:element name="ObjectResult" type="res:CQLObjectResult" minOccurs="0" maxOccurs="unbounded"/>
			</xsd:sequence>
			<xsd:sequence>
				<xsd:element name="AttributeResult" type="res:CQLAttributeResult" minOccurs="0" maxOccurs="unbounded"/>
			</xsd:sequence>
			<xsd:sequence>
				<xsd:element name="AggregationResult" type="res:CQLAggregateResult" minOccurs="0" maxOccurs="1"/>
			</xsd:sequence>
			<xsd:sequence>
				<xsd:element name="ExtendedResult" type="res:ExtendedCQLResult" minOccurs="0" maxOccurs="1"/>
			</xsd:sequence>
		</xsd:choice>
		<xsd:attribute name="targetClassname" type="xsd:string" use="required"/>
	</xsd:complexType>
	
	<xsd:complexType name="CQLResult" abstract="true">
		<xsd:annotation>
			<xsd:documentation>Single result from a CQL query</xsd:documentation>
		</xsd:annotation>
	</xsd:complexType>
	
	<xsd:complexType name="CQLObjectResult">
		<xsd:annotation>
			<xsd:documentation>Result object</xsd:documentation>
		</xsd:annotation>
		<xsd:complexContent>
			<xsd:extension base="res:CQLResult">
				<xsd:sequence>
					<xsd:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="1"/>
				</xsd:sequence>
			</xsd:extension>
		</xsd:complexContent>
	</xsd:complexType>
	
	<xsd:complexType name="CQLAttributeResult">
		<xsd:annotation>
			<xsd:documentation>Result attribute</xsd:documentation>
		</xsd:annotation>
		<xsd:complexContent>
			<xsd:extension base="res:CQLResult">
				<xsd:sequence>
					<xsd:element name="Attribute" type="res:TargetAttribute" minOccurs="1" maxOccurs="unbounded"/>
				</xsd:sequence>
			</xsd:extension>
		</xsd:complexContent>
	</xsd:complexType>
	
	<xsd:complexType name="CQLAggregateResult">
		<xsd:annotation>
			<xsd:documentation>An aggregation result (count, min, max, etc)</xsd:documentation>
		</xsd:annotation>
		<xsd:complexContent>
			<xsd:extension base="res:CQLResult">
				<xsd:attribute name="attributeName" type="xsd:string" use="required"/>
				<xsd:attribute name="value" type="xsd:anySimpleType" use="required"/>
				<xsd:attribute name="aggregation" type="cql2:Aggregation" use="required"/>
			</xsd:extension>
		</xsd:complexContent>
	</xsd:complexType>	
	
	<xsd:complexType name="TargetAttribute">
		<xsd:annotation>
			<xsd:documentation>An attribute (name and value pair) of a target data object instance</xsd:documentation>
		</xsd:annotation>
		<xsd:attribute name="name" type="xsd:string" use="required"/>
		<xsd:attribute name="value" type="xsd:anySimpleType" use="optional"/>
	</xsd:complexType>
	
	<xsd:complexType name="ExtendedCQLResult">
		<xsd:annotation>
			<xsd:documentation>Result type for extensibility</xsd:documentation>
		</xsd:annotation>
		<xsd:complexContent>
			<xsd:extension base="res:CQLResult">
				<xsd:sequence>
					<xsd:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="1"/>
				</xsd:sequence>
			</xsd:extension>
		</xsd:complexContent>
	</xsd:complexType>
</xsd:schema>

Predicates

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
	xmlns:cql2="http://CQL.caBIG/2/org.cagrid.cql2" 
	targetNamespace="http://CQL.caBIG/2/org.cagrid.cql2" 
	elementFormDefault="qualified" attributeFormDefault="unqualified">
	<xsd:simpleType name="BinaryPredicate">
		<xsd:restriction base="xsd:string">
			<xsd:enumeration value="EQUAL_TO" id="equal_to"/>
			<xsd:enumeration value="NOT_EQUAL_TO" id="not_equal_to"/>
			<xsd:enumeration value="LIKE" id="like"/>
			<xsd:enumeration value="LESS_THAN" id="less_than"/>
			<xsd:enumeration value="LESS_THAN_EQUAL_TO" id="less_than_equal_to"/>
			<xsd:enumeration value="GREATER_THAN" id="greater_than"/>
			<xsd:enumeration value="GREATER_THAN_EQUAL_TO" id="greater_than_equal_to"/>
		</xsd:restriction>
	</xsd:simpleType>
	
	<xsd:simpleType name="UnaryPredicate">
		<xsd:restriction base="xsd:string">
			<xsd:enumeration value="IS_NULL" id="is_null"/>
			<xsd:enumeration value="IS_NOT_NULL" id="is_not_null"/>
		</xsd:restriction>
	</xsd:simpleType>
</xsd:schema>

Supported Extensions

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
	xmlns:exts="http://CQL.caBIG/2/org.cagrid.cql2.extensionsupport"
	targetNamespace="http://CQL.caBIG/2/org.cagrid.cql2.extensionsupport" 
	elementFormDefault="qualified" attributeFormDefault="unqualified">
	
	<xsd:complexType name="SupportedExtensions">
		<xsd:sequence>
			<xsd:element name="ModifierExtension" type="xsd:QName" minOccurs="0" maxOccurs="unbounded"/>
			<xsd:element name="AttributeExtension" type="xsd:QName" minOccurs="0" maxOccurs="unbounded"/>
			<xsd:element name="ObjectExtension" type="xsd:QName" minOccurs="0" maxOccurs="unbounded"/>
			<xsd:element name="ResultExtension" type="xsd:QName" minOccurs="0" maxOccurs="unbounded"/>
		</xsd:sequence>
	</xsd:complexType>
</xsd:schema>
Last edited by
Saba Bokhari (353 days ago) , ...
Adaptavist Theme Builder Powered by Atlassian Confluence