diff --git a/campcaster/src/modules/storageServer/var/BasicStor.php b/campcaster/src/modules/storageServer/var/BasicStor.php
index 61bd6c15f..aa9e7d6d9 100644
--- a/campcaster/src/modules/storageServer/var/BasicStor.php
+++ b/campcaster/src/modules/storageServer/var/BasicStor.php
@@ -1023,10 +1023,14 @@ class BasicStor extends Alib {
* "conditions" field)
*
*
orderby : string - metadata category for sorting (optional)
- * default sorting by dc:title (+ primary sorting by filetype -
- * audioclips, playlists, webstreams ...)
+ * or array of strings for multicolumn orderby
+ * [default: dc:creator, dc:source, dc:title]
+ *
+ * desc : boolean - flag for descending order (optional)
+ * or array of boolean for multicolumn orderby
+ * (it corresponds to elements of orderby field)
+ * [default: all ascending]
*
- * desc : boolean - flag for descending order (optional)
* conditions - array of hashes with structure:
*
* - cat - string, metadata category name
diff --git a/campcaster/src/modules/storageServer/var/DataEngine.php b/campcaster/src/modules/storageServer/var/DataEngine.php
index d393ff522..9e482af1a 100644
--- a/campcaster/src/modules/storageServer/var/DataEngine.php
+++ b/campcaster/src/modules/storageServer/var/DataEngine.php
@@ -16,8 +16,15 @@ require_once "XML/Util.php";
* (may be empty or ommited only with less then 2 items in
* "conditions" field)
*
- * orderby : string - metadata category for sorting (optional)
- * desc : boolean - flag for descending order (optional)
+ * orderby : string - metadata category for sorting (optional)
+ * or array of strings for multicolumn orderby
+ * [default: dc:creator, dc:source, dc:title]
+ *
+ * desc : boolean - flag for descending order (optional)
+ * or array of boolean for multicolumn orderby
+ * (it corresponds to elements of orderby field)
+ * [default: all ascending]
+ *
* conditions - array of hashes with structure:
*
* - cat - string, metadata category name
@@ -346,14 +353,35 @@ class DataEngine {
$filetype = $this->filetypes[$filetype];
$operator = (isset($criteria['operator']) ? $criteria['operator'] : 'and');
$operator = strtolower($operator);
- $desc = (isset($criteria['desc']) ? $criteria['desc'] : NULL);
$conditions = (isset($criteria['conditions']) ? $criteria['conditions'] : array());
$whereArr = $this->_makeWhereArr($conditions);
- $orderbyQn = // default is dc:title
- (isset($criteria['orderby']) ? $criteria['orderby'] : 'dc:title' /*NULL*/);
- $obSplitQn = XML_Util::splitQualifiedName($orderbyQn);
- $obNs = $obSplitQn['namespace'];
- $orderby = $obSplitQn['localPart'];
+ $orderby = TRUE; // if there is any default
+ if ( (!isset($criteria['orderby'])) || (is_array($criteria['orderby']) && (count($criteria['orderby'])<1) ) ) {
+ $orderbyQns = array('dc:creator', 'dc:source', 'dc:title'); // default
+ } else {
+ $orderbyQns = $criteria['orderby'];
+ }
+ if (!is_array($orderbyQns)) {
+ $orderbyQns = array($orderbyQns);
+ }
+ $desc = (isset($criteria['desc']) ? $criteria['desc'] : NULL);
+ $orderJoinSql = array();
+ $orderBySql = array();
+ foreach($orderbyQns as $j=>$orderbyQn){
+ $i = $j+1;
+ $obSplitQn = XML_Util::splitQualifiedName($orderbyQn);
+ $obNs = $obSplitQn['namespace'];
+ $obLp = $obSplitQn['localPart'];
+ $desc = (isset($criteria['desc'][$i]) ? $criteria['desc'][$i] : NULL);
+ $retype = ($obLp == 'mtime' ? '::timestamp with time zone' : '' );
+ $orderJoinSql[] =
+ "LEFT JOIN {$this->mdataTable} m$i\n".
+ " ON m$i.gunid = sq2.gunid AND m$i.predicate='$obLp'".
+ " AND m$i.objns='_L' AND m$i.predxml='T'".
+ (!is_null($obNs)? " AND m$i.predns='$obNs'":'');
+ $orderBySql[] =
+ "m$i.object".$retype.($desc? ' DESC':'');
+ }
$browse = !is_null($brFld);
if (!$browse) {
if (!$orderby) {
@@ -376,15 +404,11 @@ class DataEngine {
$sql = $this->_makeOrSql($fldsPart, $whereArr, $fileCond, $browse, $brFldNs, $brFld);
}
if (!$browse && $orderby) {
- $retype = ($orderby == 'mtime' ? '::timestamp with time zone' : '' );
$sql =
- "SELECT to_hex(sq2.gunid)as gunid, m.object, sq2.ftype, sq2.id\n".
+ "SELECT to_hex(sq2.gunid)as gunid, m1.object, sq2.ftype, sq2.id\n".
"FROM (\n$sql\n)sq2\n".
- "LEFT JOIN {$this->mdataTable} m\n".
- " ON m.gunid = sq2.gunid AND m.predicate='$orderby'".
- " AND m.objns='_L' AND m.predxml='T'".
- (!is_null($obNs)? " AND m.predns='$obNs'":'')."\n".
- "ORDER BY sq2.ftype, m.object".$retype.($desc? ' DESC':'')."\n";
+ join("\n", $orderJoinSql).
+ "ORDER BY ".join(",", $orderBySql)."\n";
}
// echo "\n---\n$sql\n---\n";
$cnt = $this->_getNumRows($sql);
@@ -398,10 +422,8 @@ class DataEngine {
if (!is_array($res)) {
$res = array();
}
-# if (!$browse) {
-# $res = array_map(array("StoredFile", "_normalizeGunid"), $res);
-# }
$eres = array();
+ // echo "\n---\n"; var_dump($res); echo"\n---\n";
foreach ($res as $it) {
if (!$browse) {
$gunid = StoredFile::_normalizeGunid($it['gunid']);
diff --git a/campcaster/src/modules/storageServer/var/GreenBox.php b/campcaster/src/modules/storageServer/var/GreenBox.php
index e24368954..1b262fe26 100644
--- a/campcaster/src/modules/storageServer/var/GreenBox.php
+++ b/campcaster/src/modules/storageServer/var/GreenBox.php
@@ -442,10 +442,14 @@ class GreenBox extends BasicStor {
* - limit : int - limit for result arrays (0 means unlimited)
* - offset : int - starting point (0 means without offset)
* - orderby : string - metadata category for sorting (optional)
- * default sorting by dc:title (+ primary sorting by filetype -
- * audioclips, playlists, webstreams ...)
+ * or array of strings for multicolumn orderby
+ * [default: dc:creator, dc:source, dc:title]
+ *
+ * - desc : boolean - flag for descending order (optional)
+ * or array of boolean for multicolumn orderby
+ * (it corresponds to elements of orderby field)
+ * [default: all ascending]
*
- * - desc : boolean - flag for descending order (optional)
* - conditions - array of hashes with structure:
*
* - cat - string, metadata category name
diff --git a/campcaster/src/modules/storageServer/var/LocStor.php b/campcaster/src/modules/storageServer/var/LocStor.php
index b450e67b2..c80147f67 100644
--- a/campcaster/src/modules/storageServer/var/LocStor.php
+++ b/campcaster/src/modules/storageServer/var/LocStor.php
@@ -342,10 +342,14 @@ class LocStor extends BasicStor {
* - limit : int - limit for result arrays (0 means unlimited)
* - offset : int - starting point (0 means without offset)
* - orderby : string - metadata category for sorting (optional)
- * default sorting by dc:title (+ primary sorting by filetype -
- * audioclips, playlists, webstreams ...)
+ * or array of strings for multicolumn orderby
+ * [default: dc:creator, dc:source, dc:title]
+ *
+ * - desc : boolean - flag for descending order (optional)
+ * or array of boolean for multicolumn orderby
+ * (it corresponds to elements of orderby field)
+ * [default: all ascending]
*
- * - desc : boolean - flag for descending order (optional)
* - conditions - array of hashes with structure:
*
* - cat - string, metadata category name
diff --git a/campcaster/src/modules/storageServer/var/xmlrpc/XR_LocStor.php b/campcaster/src/modules/storageServer/var/xmlrpc/XR_LocStor.php
index d77fa21da..5bd666aa4 100644
--- a/campcaster/src/modules/storageServer/var/xmlrpc/XR_LocStor.php
+++ b/campcaster/src/modules/storageServer/var/xmlrpc/XR_LocStor.php
@@ -2230,10 +2230,14 @@ class XR_LocStor extends LocStor{
* - limit : int - limit for result arrays (0 means unlimited)
* - offset : int - starting point (0 means without offset)
* - orderby : string - metadata category for sorting (optional)
- * default sorting by dc:title (+ primary sorting by filetype -
- * audioclips, playlists, webstreams ...)
+ * or array of strings for multicolumn orderby
+ * [default: dc:creator, dc:source, dc:title]
+ *
+ * - desc : boolean - flag for descending order (optional)
+ * or array of boolean for multicolumn orderby
+ * (it corresponds to elements of orderby field)
+ * [default: all ascending]
*
- * - desc : boolean - flag for descending order (optional)
* - conditions : array of struct with fields:
*
* - cat : string - metadata category name
diff --git a/campcaster/src/modules/storageServer/var/xmlrpc/xr_cli_test.php b/campcaster/src/modules/storageServer/var/xmlrpc/xr_cli_test.php
index 497073727..6549af91b 100644
--- a/campcaster/src/modules/storageServer/var/xmlrpc/xr_cli_test.php
+++ b/campcaster/src/modules/storageServer/var/xmlrpc/xr_cli_test.php
@@ -16,6 +16,16 @@ if($pars[0] == '-s'){
"http://{$config['storageUrlHost']}:{$config['storageUrlPort']}".
"{$config['storageUrlPath']}/{$config['storageXMLRPC']}";
}
+$options = array();
+if($pars[0] == '-o'){
+ array_shift($pars);
+ $optStr = array_shift($pars);
+ $optArr = split(",", $optStr);
+ foreach($optArr as $opt){
+ list($k, $v) = split(':', $opt);
+ $options[$k] = $v;
+ }
+}
#$serverPath = "http://localhost:80/campcasterStorageServerCVS/xmlrpc/xrLocStor.php";
@@ -287,12 +297,13 @@ if(isset($infos[$method]['r'])){
case"getSearchResults":
$acCnt = 0; $acGunids = array();
$plCnt = 0; $plGunids = array();
+ $fld = (isset($options['category']) ? $options['category'] : 'gunid' );
foreach($resp['results'] as $k=>$v){
if($v['type']=='audioclip'){ $acCnt++;
- $acGunids[] = $v['gunid'];
+ $acGunids[] = $v[$fld];
}
if($v['type']=='playlist'){ $plCnt++;
- $plGunids[] = $v['gunid'];
+ $plGunids[] = $v[$fld];
}
}
echo