/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2011, Open Source Geospatial Foundation (OSGeo)
* (C) 2003-2005, Open Geospatial Consortium Inc.
*
* All Rights Reserved. http://www.opengis.org/legal/
*/
package org.opengis.filter.sort;
import org.opengis.filter.expression.PropertyName;
/**
* Defines the sort order, based on a property and ascending/descending.
* <p>
* Having SortBy at the Filter level is an interesting undertaking of Filter 1.1
* support. Why you ask? It is at the Same level as Filter, it is not *used* by
* Filter itself. The services that make use of Filter, such as WFS are starting
* to make use of SortBy in the same breath.
* </p>
* <p>
* Where is SortBy used:
* <ul>
* <li>WFS 1.1 Query
* <li>CSW 2.0.1 AbstractQuery
* </ul>
* There may be more ...
* </p>
* <p>
* What this means is that the GeoTools Query will make use of this
* construct. As for sorting the result of an expression (where an
* expression matches more then one element), we will splice it in to
* AttributeExpression as an optional parameter. Note function is defined
* to return a single value (so we don't need to worry there).
* </p>
* @see <a href="http://schemas.opengis.net/filter/1.1.0/sort.xsd">
* @see <a href="http://schemas.opengis.net/wfs/1.1.0/wfs.xsd">
*
* @since GeoAPI 2.1
* @author Jody Garnett (Refractions Research)
*
* @source $URL: http://svn.osgeo.org/geotools/trunk/modules/library/opengis/src/main/java/org/opengis/filter/sort/SortBy.java $
*/
public interface SortBy {
/**
* Used to indicate lack of a sorting order.
* <p>
* This is the default value for used when setting up a Query.
* </p>
*/
SortBy[] UNSORTED = new SortBy[0];
/**
* Used to indicate "natural" sorting order, usually according
* FID (hopefully based on Key attribtues).
* <p>
* This is the order that is most likely to be available in optimzied
* form, if an Attribute is marked as "key" an optimized ordering should
* be considered avaialble.
* </p>
* <p>
* Non optimized orderings are will at the very least require as pass
* through the data to bring it into memory, you can assume somekind
* of TreeSet would be used. Where the nodes in the tree would indicate
* a list of FeatureIds assoicated with the node, in the order encountered.
* </p>
* <p>
* This is a "NullObject".
* </p>
*/
SortBy NATURAL_ORDER = new NullSortBy(SortOrder.ASCENDING);
/**
* Indicate the reverse order, usually assoicated with "Fid".
* <p>
* This is a "NullObject".
* </p>
*/
SortBy REVERSE_ORDER = new NullSortBy(SortOrder.DESCENDING);
/**
* Indicate property to sort by, specification is limited to PropertyName.
* <p>
* Not sure if this is allowed to be a xPath expression?
* <ul>
* <li>It would be consist with our use in GeoTools</li>
* <li>It would not seem to agree with the short hand notation
* used by WFS1.1 (ie. "year A, month A, day A" )</li>
* </ul>
* </p>
* @todo Use QName
* @return Name of property to sort by.
*/
PropertyName getPropertyName();
/**
* The the sort order - one of {@link SortOrder#ASCENDING ASCENDING}
* or {@link SortOrder#DESCENDING DESCENDING}.
*/
SortOrder getSortOrder();
}