SortOrder class: Difference between revisions
m (→Overview) |
|||
(4 intermediate revisions by 4 users not shown) | |||
Line 20: | Line 20: | ||
where <var>[[Ascending and Descending (SortOrder functions)|Ascending]]</var> is a <var>SortOrder</var> constructor with parameter <code>price</code>, a method defined | where <var>[[Ascending and Descending (SortOrder functions)|Ascending]]</var> is a <var>SortOrder</var> constructor with parameter <code>price</code>, a method defined | ||
to operate on the items in %orders. | to operate on the items in <code>%orders</code>. | ||
The <code>price</code> method above is applied to each of the items in <code>%orders</code>, and the resulting | The <code>price</code> method above is applied to each of the items in <code>%orders</code>, and the resulting | ||
Line 26: | Line 26: | ||
the <code>price</code> return value type. | the <code>price</code> return value type. | ||
<code>price</code> must return an [[Intrinsic classes|intrinsic]] (number, string, unicode) value. | <code>price</code> must return an [[Intrinsic classes|intrinsic]] (number, string, unicode) value. | ||
For more about the method in a <var>SortOrder</var>, see [[#Specifying a SortOrder's sort key method|"Specifying a | For more about the method in a <var>SortOrder</var>, see [[#Specifying a SortOrder's sort key method|"Specifying a SortOrder's sort key method"]] below. | ||
If <code>%sord</code> is a <var>SortOrder</var> instance returned by the <var>Ascending</var> constructor | If <code>%sord</code> is a <var>SortOrder</var> instance returned by the <var>Ascending</var> constructor | ||
Line 53: | Line 53: | ||
==Declaring a SortOrder object variable== | ==Declaring a SortOrder object variable== | ||
The syntax for declaring a <var>SortOrder</var> object variable is: | The syntax for declaring a <var>SortOrder</var> object variable is: | ||
<p class="syntax">< | <p class="syntax"><span class="term">objvar</span> <span class="literal">Is Object SortOrder For</span> <span class="term">itemtype</span></p> | ||
Where: | Where: | ||
<table class="syntaxTable"> | <table class="syntaxTable"> | ||
<tr><th>objvar</th> | <tr><th>objvar</th> | ||
<td>The name of the SortOrder object variable. </td></tr> | <td>The name of the <var>SortOrder</var> object variable. </td></tr> | ||
<tr><th>itemtype</th> | <tr><th>itemtype</th> | ||
<td>The datatype of the items in the collection to be sorted. </td></tr> | <td>The datatype of the items in the collection to be sorted. </td></tr> | ||
Line 64: | Line 65: | ||
==Assigning a SortOrder object variable== | ==Assigning a SortOrder object variable== | ||
<var> | <var>SortOrder</var>s are immutable objects. | ||
You can assign a sort order to a <var>SortOrder</var> object: | You can assign a sort order to a <var>SortOrder</var> object: | ||
<p class="code">%myOrder is object sortOrder for longstring | <p class="code">%myOrder is object sortOrder for longstring | ||
Line 77: | Line 78: | ||
%myorder = descending(reverse) | %myorder = descending(reverse) | ||
</p> | </p> | ||
==Specifying a SortOrder's sort key method== | ==Specifying a SortOrder's sort key method== | ||
The following examples show different method types, actually "method values," | The following examples show different method types, actually "method values," | ||
Line 83: | Line 84: | ||
A method value is a value assigned to a [[Method variables|method variable]]. | A method value is a value assigned to a [[Method variables|method variable]]. | ||
And for a <var>SortOrder</var>, the method variable's implicit declaration is: | And for a <var>SortOrder</var>, the method variable's implicit declaration is: | ||
<p class="syntax">Is Function (< | <p class="syntax"><span class="literal">Is Function</span> (<span class="term">itemtype</span>):<span class="term">methname</span> <span class="literal">Is</span> <span class="term">intrinType</span> | ||
</p> | </p> | ||
Where: | Where: | ||
Line 110: | Line 111: | ||
end class | end class | ||
... | ... | ||
%order is object sortOrder for info | %order is object sortOrder for object info | ||
... | ... | ||
%order = ascending(name) | %order = ascending(name) | ||
</p> | </p> | ||
<li>The following example outlines the use of a method variable | <li>The following example outlines the use of a method variable | ||
as a <var>SortOrder</var> sort key. | as a <var>SortOrder</var> sort key. | ||
Line 130: | Line 132: | ||
%orders = %orders:sortnew(descending(%sortMethod)) | %orders = %orders:sortnew(descending(%sortMethod)) | ||
</p> | </p> | ||
<li><div id="xmplocal"></div>In this example, a [[local method]] is used to accommodate a <var>SortOrder</var> function that requires a parameter. | |||
<li><div id="xmplocal"></div>In this example, a [[Local and Common entities#Defining and invoking a local method|local method]] is used to accommodate a <var>SortOrder</var> function that requires a parameter. | |||
The <var>SortOrder</var> syntax does not provide for specifying a parameter for the | The <var>SortOrder</var> syntax does not provide for specifying a parameter for the | ||
method parameter. | method parameter. | ||
Line 141: | Line 144: | ||
<p class="code">%clientRating is float | <p class="code">%clientRating is float | ||
local function tprice is float expose | local function (order):tprice is float expose | ||
return %this:totalprice(%clientRating) | return %this:totalprice(%clientRating) | ||
end function | end function | ||
Line 150: | Line 153: | ||
If <code>ClientRating</code> was already a member of the Order class, you would specify: | If <code>ClientRating</code> was already a member of the Order class, you would specify: | ||
<p class="code"> | <p class="code"> | ||
local function tprice is float | local function (order):tprice is float | ||
return %this:totalprice(%this:clientRating) | return %this:totalprice(%this:clientRating) | ||
end function | end function | ||
Line 159: | Line 162: | ||
If <code>tprice</code> was used in many places, you could move it | If <code>tprice</code> was used in many places, you could move it | ||
into the Order class without changing the <var>Sort</var> calls. | into the Order class without changing the <var>Sort</var> calls. | ||
<li>The <var>SortOrder</var> in the following fragment uses the special method | <li>The <var>SortOrder</var> in the following fragment uses the special method | ||
value <var>This</var> as the sort key. | value <var>This</var> as the sort key. |
Latest revision as of 15:35, 14 January 2016
Objects in the SortOrder class are used primarily as input to the collection class sorting methods (SortNew in the Arraylist and NamedArraylist classes and Sort in the Arraylist class). The SortNew and Sort methods take a SortOrder object as a parameter which provides sorting criteria for the sort.
The SortOrder class is new as of Sirius Mods version 7.3.
Overview
A SortOrder object consists of two kinds of information:
- A sort ordering direction (Ascending or Descending)
- A sort key (function on the items in the list being sorted)
For a sort in ascending order by price for the items in a %orders
Arraylist, you might specify:
%orders = %orders:SortNew(ascending(price))
where Ascending is a SortOrder constructor with parameter price
, a method defined
to operate on the items in %orders
.
The price
method above is applied to each of the items in %orders
, and the resulting
values are sorted in ascending order, alphabetically or numerically according to
the price
return value type.
price
must return an intrinsic (number, string, unicode) value.
For more about the method in a SortOrder, see "Specifying a SortOrder's sort key method" below.
If %sord
is a SortOrder instance returned by the Ascending constructor
with the price
method as argument:
%sord = Ascending(price)
Then the SortNew statement above is equivalent to the following:
%orders = %orders:SortNew(%sord)
To provide multiple sort criteria for a sort, a SortOrder object may be a collection of multiple SortOrders. However, to construct such a SortOrder collection, you must use the SortOrder class List constructor. List takes SortOrders as inputs and returns a SortOrder object that contains them.
For example, to sort in ascending order by quantity and price for %orders
:
%sord = List(ascending(quantity), descending(price)) %orders = %orders:SortNew(%sord)
The SortOrder object in the preceding example contains two sort criteria; you may specify as many as seven.
Declaring a SortOrder object variable
The syntax for declaring a SortOrder object variable is:
objvar Is Object SortOrder For itemtype
Where:
objvar | The name of the SortOrder object variable. |
---|---|
itemtype | The datatype of the items in the collection to be sorted. |
Assigning a SortOrder object variable
SortOrders are immutable objects. You can assign a sort order to a SortOrder object:
%myOrder is object sortOrder for longstring ... %myorder = ascending(length)
But thereafter you cannot modify the object — although, you may assign a different value to a SortOrder object variable:
%myorder = ascending(length) ... %myorder = descending(reverse)
Specifying a SortOrder's sort key method
The following examples show different method types, actually "method values," as the sort key in a SortOrder. A method value is a value assigned to a method variable. And for a SortOrder, the method variable's implicit declaration is:
Is Function (itemtype):methname Is intrinType
Where:
itemtype | The class of the items in the collection to be sorted. |
---|---|
methname | A method name, but merely a placeholder in an actual declaration. Any method (system or user), class Variable or Property, local method, or method variable that fits the declaration can be used in the SortOrder. |
intrinType | A User Language intrinsic class type returned by the function. |
In the examples below, the method values are respectively a class variable, a method variable, a local method, and the special method value This, all of which satisfy the Function template described above.
- The SortOrder in the following example specifies a class variable
as the sort key:
class info public variable name is string len 32 variable rank is float variable serialnumber is string len 8 end public end class ... %order is object sortOrder for object info ... %order = ascending(name)
- The following example outlines the use of a method variable
as a SortOrder sort key.
Hypothetical user class
Order
has two Variables to sort its data by, and they are conditionally assigned to method variable%sortMethod
.... %sortMethod is function (order):number is float ... If .. %sortMethod = totalprice End if If .. %sortMethod = totalProductionCost End if ... %orders = %orders:sortnew(descending(%sortMethod))
- In this example, a local method is used to accommodate a SortOrder function that requires a parameter.
The SortOrder syntax does not provide for specifying a parameter for the method parameter.
Say the
totalPrice
method is a function that accepts a parameter ("clientRating") which is used in its calculation of the total price. You can define a local method (tprice
) to be used in the SortOrder instead oftotalPrice
:%clientRating is float local function (order):tprice is float expose return %this:totalprice(%clientRating) end function %orders = %orders:sortnew(descending(tprice))
If
ClientRating
was already a member of the Order class, you would specify:local function (order):tprice is float return %this:totalprice(%this:clientRating) end function %orders = %orders:sortnew(descending(tprice))
If
tprice
was used in many places, you could move it into the Order class without changing the Sort calls. - The SortOrder in the following fragment uses the special method
value This as the sort key.
Valid only when applied to User Language intrinsic method objects, This simply returns the value of the method object.
... %foo is arraylist of longstring %foosrt is arraylist of longstring ... %foosrt = %foo:sortNew(ascending(this)) ... %foo:sort(descending(this)) ...
This is the default method value as of Sirius Mods version 7.6.
List of SortOrder methods
The "List of SortOrder methods" shows all the class methods.