From: Leandro Lucarella Date: Wed, 8 Oct 2003 21:31:42 +0000 (+0000) Subject: Se agregan 2 tipos de orden predefinidos para los servicios: X-Git-Tag: svn_import~13 X-Git-Url: https://git.llucax.com/mecon/ai.git/commitdiff_plain/493cf2effdb418f10f2ae77cec0786c5cef0bbcc Se agregan 2 tipos de orden predefinidos para los servicios: AI_SERVICIO_ORDEN_LONG_HIJOS y AI_SERVICIO_ORDEN_LONG_NOMBRE. El primero está pensado para ordenar las tablas de servicios realizando un balance de carga, ya que ordena haciendo un calculo que predice la cantidad de renglones que ocupará cada hijo. El segundo está pensado para ordenar los contenidos de una tabla, para que aparezcan los nombres mas largos abajo. --- diff --git a/doc/uml.xmi b/doc/uml.xmi index 45fd219..77312b5 100644 --- a/doc/uml.xmi +++ b/doc/uml.xmi @@ -10,7 +10,7 @@ - + @@ -20,6 +20,11 @@ + + + + + @@ -136,69 +141,84 @@ Sólo se obtienen las secciones que todavía no pertenecen a ningún grupo. Si s - - - - - - + - - - - - - - + + + + + + + - - - - + + + + + + + + - - - - + + + + + + + + - - - - + + + + + + + + - - - - + + + + + + + + - - - - + + + + + + + + @@ -215,7 +235,7 @@ x2c:get" name="hijos" static="0" scope="202" /> - + @@ -225,7 +245,7 @@ x2c:get" name="hijos" static="0" scope="202" /> - + @@ -240,7 +260,7 @@ x2c:get" name="hijos" static="0" scope="202" /> - + @@ -251,9 +271,10 @@ x2c:get" name="hijos" static="0" scope="202" /> + - + @@ -276,9 +297,9 @@ x2c:get" name="hijos" static="0" scope="202" /> - + diff --git a/lib/AI/DBTreeObject.php b/lib/AI/DBTreeObject.php index 7877b99..994f8f5 100644 --- a/lib/AI/DBTreeObject.php +++ b/lib/AI/DBTreeObject.php @@ -85,7 +85,7 @@ class AI_DBTreeObject extends AI_DBObject { * @access public */ function cargarHijos($db, $soloHabilitados = true, $orden = 'nombre') // ~X2C - { + { $id_field = $this->conf['id']; $id_padre = $this->conf['padre']; $tabla = $this->conf['base'].'.'.$this->conf['tabla']; diff --git a/lib/AI/Error.php b/lib/AI/Error.php index 1dc3915..3af3bef 100644 --- a/lib/AI/Error.php +++ b/lib/AI/Error.php @@ -48,6 +48,12 @@ define('AI_ERROR_NO_RESULTADOS', 1); */ define('AI_ERROR_TIENE_HIJOS', 2); +/** + * Error que indica que el tipo de orden usado no es válido. + * Es un error no esperado. + */ +define('AI_ERROR_ORDEN_INVALIDO', 3); + // +X2C Class 469 :AI_Error /** * @package AI diff --git a/lib/AI/Servicio.php b/lib/AI/Servicio.php index 85ac3a2..9fb5e8c 100644 --- a/lib/AI/Servicio.php +++ b/lib/AI/Servicio.php @@ -38,6 +38,18 @@ require_once 'AI/Error.php'; */ define('AI_SERVICIO_CONFFILE', dirname(__FILE__).'/Servicio.ini'); +/** + * Trae los servicios en un orden según la longitud de los hijos. + * La longitud de los hijos se calcula prediciendo la cantidad de + * renglones que va a ocupar cada hijo y sumándolos para un mismo padre. + */ +define('AI_SERVICIO_ORDEN_LONG_HIJOS', 1); + +/** + * Trae los servicios en un orden según la longitud del nombre. + */ +define('AI_SERVICIO_ORDEN_LONG_NOMBRE', 2); + // +X2C Class 413 :AI_Servicio /** * Servicio. @@ -158,7 +170,58 @@ class AI_Servicio extends AI_DBTreeObject { } // -X2C - + // +X2C Operation 539 + /** + * Carga hijos de un servicio. Si hubo error devuelve un PEAR_Error, si no hubo error, devuleve un array de objetos (los hijos). + * + * @param mixed $db Base de datos o resultado a usar. + * @param bool $soloHabilitados Si es true, sólo trae los servicios habilitados. + * @param mixed $orden Indica el orden en que se deben traer los hijos. Puede ser AI_SERVICIO_ORDEN_CANT_HIJOS, AI_SERVICIO_ORDEN_LONG_NOMBRE o un campo arbitrario. + * + * @return mixed + * @access public + */ + function cargarHijos($db, $soloHabilitados = true, $orden = false) // ~X2C + { + if (!is_a($db, 'db_result')) { + if (is_int($orden)) { + $id_field = $this->conf['id']; + $id_padre = $this->conf['padre']; + $id = intval($this->$id_field); + if ($orden === AI_SERVICIO_ORDEN_LONG_HIJOS) { + $query = " + SELECT A.*, SUM(CEIL(LENGTH(B.nombre) / 22)) as RENGLONES + FROM {$this->conf['base']}.{$this->conf['tabla']} AS A, + {$this->conf['base']}.{$this->conf['tabla']} AS B + WHERE A.$id_field = B.$id_padre + AND A.$id_padre = $id"; + if ($soloHabilitados) { + $query .= " AND A.{$this->conf['habilitado']} = 1"; + } + $query .= " GROUP BY A.$id_field ORDER BY RENGLONES DESC"; + } elseif ($orden === AI_SERVICIO_ORDEN_LONG_NOMBRE) { + $query = " + SELECT * + FROM {$this->conf['base']}.{$this->conf['tabla']} + WHERE $id_padre = $id"; + if ($soloHabilitados) { + $query .= ' AND ' . $this->conf['habilitado'] . ' = 1'; + } + $query .= ' ORDER BY LENGTH(nombre)'; + } else { + return new AI_Error(AI_ERROR_ORDEN_INVALIDO, + "Tipo de órden incorrecto [orden=$orden]"); + } + $result = $db->query($query); + if (DB::isError($result)) { + return $result; + } + return parent::cargarHijos($result, $soloHabilitados, $orden); + } + } + return parent::cargarHijos($db, $soloHabilitados, $orden); + } + // -X2C } // -X2C Class :AI_Servicio