4D v18Selección de entidades |
||||||||||||||
|
4D v18
Selección de entidades
|
Funcionalidad | Selección de entidades no ordenada | Selección de entidades ordenada |
Velocidad de procesamiento | muy rápido | más lento |
Tamaño en la memoria | muy pequeño | más grande |
Puede contener varias referencias a una entidad | no | sí |
Por razones de optimización, por defecto, ORDA generalmente crea las selecciones de entidades no ordenadas, excepto cuando utiliza el método orderBy( ) o si utiliza las opciones apropiadas (ver a continuación). En esta documentación, a menos que se especifique "selección de entidades" generalmente se refiere a una "selección de entidades no ordenada".
Como se mencionó anteriormente, ORDA por defecto crea y maneja entity selections no ordenadas como resultado de operaciones tales como consultas o comparaciones como and( ). Las entity selections ordenadas se crean solo cuando es necesario o cuando se solicitan específicamente mediante el uso de opciones.
Las entity selections ordenadas se crean en los siguientes casos:
Las entity selections desordenadas se crean en los siguientes casos:
Tenga en cuenta que cuando una entity selection ordenada se convierte en una entity selection desordenada, cualquier referencia de entidad repetida se elimina.
Si desea transformar una entity selection ordenada en una no ordenada, puede simplemente aplicarle una operación and( ), por ejemplo:
//mySel es una entity selection ordenada
mySel:=mySel.and(mySel)
//mySel ahora es una entity selection desordenada
4D ofrece una optimización automática para las peticiones ORDA que utilizan selecciones de entidades o cargan entidades en las configuraciones cliente/servidor. Esta optimización acelera la ejecución de su aplicación 4D al reducir drásticamente el volumen de información transmitida a través de la red.
Se implementan los siguientes mecanismos de optimización:
Los siguientes métodos asocian automáticamente el contexto de optimización de la selección de entidades de origen a la selección de entidades devuelta:
Ejemplo
Dado el siguiente código:
$sel:=$ds.Employee.query("firstname = ab@")
For each($e;$sel)
$s:=$e.firstname+" "+$e.lastname+" works for "+$e.employer.name // $e.employer se refiere a la tabla Company
End for each
Gracias a la optimización, esta solicitud solo obtendrá datos de los atributos utilizados (nombre, apellido, empleador, empleador.nombre) en $sel después de una fase de aprendizaje.
Utilizando la propiedad de contexto
Puede aumentar los beneficios de la optimización utilizando la propiedad contexto. Esta propiedad hace referencia a un contexto de optimización "aprendido" para una selección de entidades. Se puede pasar como parámetro a los métodos ORDA que devuelven nuevas selecciones de entidades, de modo que las selecciones de entidades soliciten directamente los atributos utilizados al servidor y omitan la fase de aprendizaje.
Una misma propiedad de contexto de optimización se puede pasar a un número ilimitado de selecciones de entidades en la misma clase de datos. Todos los métodos ORDA que manejan las selecciones de entidades admiten la propiedad contexto (por ejemplo, el método dataClass.query( ) o dataClass.all( )). Sin embargo, tenga en cuenta que un contexto se actualiza automáticamente cuando se usan nuevos atributos en otras partes del código. Reutilizar el mismo contexto en diferentes códigos podría resultar en una sobrecarga del contexto y luego reducir su eficiencia.
Nota: se implementa un mecanismo similar para las entidades que se cargan, de modo que solo se solicitan los atributos utilizados (ver el método dataClass.get( )).
Ejemplo con el método dataClass.query( ):
C_OBJECT($sel1;$sel2;$sel3;$sel4;$querysettings;$querysettings2)
C_COLLECTION($data)
$querysettings:=New object("context";"shortList")
$querysettings2:=New object("context";"longList")
$sel1:=ds.Employee.query("lastname = S@";$querysettings)
$data:=extractData($sel1) // En el método extractData, una optimización se activa y se asocia al contexto "shortList"
$sel2:=ds.Employee.query("lastname = Sm@";$querysettings)
$data:=extractData($sel2) // En el método extractData, se aplica la optimización asociada al contexto "shortList"
$sel3:=ds.Employee.query("lastname = Smith";$querysettings2)
$data:=extractDetailedData($sel3) // En el método extractDetailedData se desencadena una optimización y se asocia al contexto "longList"
$sel4:=ds.Employee.query("lastname = Brown";$querysettings2)</p><p>$data:=extractDetailedData($sel4) //En el método extractDetailedData, se aplica la optimización asociada al contexto "longList"
List box basado en la selección de entidades
La optimización de la selección de entidades se aplica automáticamente a los list boxes basados en selección de entidades en las configuraciones cliente/servidor, al mostrar y desplazar el contenido de un list box: solo los atributos mostrados en el list box se solicitan desde el servidor.
También se ofrece un contexto específico de "modo de página" al cargar la entidad actual a través de la expresión de propiedad del elemento actual del list box (consulte List boxes de tipo Colección o entity selection). Esta funcionalidad le permite no sobrecargar el contexto inicial del list box en este caso, especialmente si la "página" solicita atributos adicionales. Tenga en cuenta que solo el uso de la expresión del elemento actual creará/utilizará el contexto de la página (el acceso a través de entitySelection[index] alterará el contexto de selección de la entidad).
Las peticiones subsiguientes al servidor enviadas por los métodos de navegación de entidades también apoyarán esta optimización. Los siguientes métodos asocian automáticamente el contexto de optimización de la entidad de origen a la entidad devuelta:
Por ejemplo, el siguiente código carga la entidad seleccionada y permite navegar en la selección de entidades. Las entidades se cargan en un contexto separado y el contexto inicial del list box se deja sin tocar:
$myEntity:=Form.currentElement //expresión del elemento actual
//... hacer algo
$myEntity:=$myEntity.next() //carga la entidad siguiente utilizando el mismo contexto
El objeto entity selection en sí mismo no se puede copiar como un objeto:
$myentitysel:=OB Copy(ds.Employee.all()) //returns null
Sin embargo, las propiedades entity selection son enumerables:
ARRAY TEXT($prop;0)
OB GET PROPERTY NAMES(ds.Employee.all();$prop)
//$prop contiene los nombres de las propiedades de entity selection
//("length", 00", "01"...)
Producto: 4D
Tema: ORDA
Creado por: 4D v17
Manual de Diseño ( 4D v18)