4D v17.4

Selección de entidades

Inicio

 
4D v17.4
Selección de entidades

Selección de entidades  


 

Una entity selection es un objeto que contiene una o más referencias a entidades que pertenecen a la misma dataclass. Una entity selection puede contener 0, 1 o entidades X de la dataclass, donde X puede representar la cantidad total de entidades contenidas en la dataclass. Las entity selections pueden ser "ordenadas" o "no ordenadas" (este punto se analiza a continuación).

Las entity selections generalmente se crean utilizando una búsqueda o se devuelven desde un atributo relación. Por ejemplo:

 brokers:=ds.Person.query("personType = broker")

Este código devuelve en brokers a todas las personas de tipo broker. Para acceder a una entidad de la selección, utilice una sintaxis similar para acceder a un elemento en una colección. Por ejemplo:

 theBroker:=brokers[0]  //Las entity selections están basadas en 0

El método entitySelection.orderBy( ) devuelve una nueva selección de entidad de acuerdo con los criterios de clasificación suministrados. Por ejemplo:

 brokers:=brokers.orderBy("name") //devuelve una selección ordenada

Este código devuelve en brokers la misma selección de entidad de las entidades Person, pero ordenadas por nombre.

Alternativamente, puede usar un atributo relación para devolver una selección de entidad. Por ejemplo:

 brokers:=ds.Person.query("personType = broker")
 brokerCompanies:=brokers.myCompany

Este código asigna a brokerCompanies todas las empresas relacionadas de las personas en la selección de entidad brokers, utilizando el atributo de relacióne myCompany. El uso de atributos de relación en las selecciones de entidades es una forma poderosa y fácil de navegar hacia arriba y hacia abajo de la cadena de entidades relacionadas.

Para realizar acciones repetidas a entidades en una selección de entidades, como recuperar y modificar valores de ciertos atributos, puede usar la estructura For each...End for each. Por ejemplo:

 C_OBJECT(emp)
 For each(emp;ds.Employees.all())
    If(emp.Country="UK")
       emp.salary:=emp.salary*1,03
       emp.save()
    End if
 End for each

Puede crear un objeto de tipo selección de entidades de la siguiente manera:

Puede crear y usar simultáneamente tantas entity selections diferentes como desee para una dataclass.

Tenga en cuenta que una entity selection solo contiene referencias a entidades. Las selecciones de entidades diferentes pueden contener referencias a las mismas entidades.

Nota: una selección de entidades solo se define en el proceso en el que se creó. No puede, por ejemplo, almacenar la referencia a una selección de entidades en una variable interproceso y utilizarla en otro proceso.

Todos los atributos de almacenamiento (texto, número, booleano, fecha) están disponibles como propiedades de las entity selections así como también de las entidades. Cuando se usa junto con una entity selection, un atributo escalar devuelve una colección de valores escalares. Por ejemplo:

 locals:=ds.Person.query("city = :1";"San Jose") //entity selection de people
 localEmails:=locals.emailAddress //colección de direcciones de correo electrónico (cadenas)

Este código devuelve en localEmails una colección de direcciones de correo electrónico como cadenas.

Además de la variedad de formas en que puede realizar consultas, también puede usar atributos relación como propiedades de entity selections  para devolver nuevas entity selections. Por ejemplo, considere la siguiente estructura:

 myParts:=ds.Part.query("ID < 100") //Devuelve partes con ID inferior a 100
 $myInvoices:=myParts.invoiceItems.invoice
  //Todas las facturas con al menos una línea de pedido relacionada con una parte en myParts

La última línea devolverá enn $myInvoices una entity selection de todas las facturas que tengan al menos un ítem de factura relacionado con una parte en la entity selection myParts. Cuando un atributo relación se usa como una propiedad de una entity selection, el resultado es siempre otra entity selection, incluso si solo se devuelve una entidad. Cuando un atributo relación se usa como una propiedad de una entity selection y no se devuelven entidades, el resultado es una selección de entidad vacía, no null.

Las entity selections locales se pueden ordenar o no ordenar. Básicamente, ambos objetos tienen una funcionalidad similar, pero existen algunas diferencias con respecto a su rendimiento y funciones disponibles. Puede decidir qué tipo de entity selection utilizar según sus necesidades específicas.

Nota: las Entity selections devueltas por 4D Server a un cliente remoto siempre se ordenan.

  • Las selecciones de entidades no ordenadas se construyen sobre los bit tablas en la memoria. Una selección de entidades no ordenada contiene un bit para cada entidad de la dataclass, independientemente de si la entidad está realmente en la selección. Cada bit es igual a 1 o 0, para indicar si la entidad está o no incluida en la selección. Es una representación muy compacta para cada entidad.
    Por consiguiente, las operaciones que utilizan selecciones de entidades no ordenadas son muy rápidas. Además, las selecciones de entidades no ordenadas son muy económicas en términos de espacio de memoria. El tamaño de una selección de entidades no ordenada, en bytes, siempre es igual al número total de entidades en la dataclass dividido entre 8. Por ejemplo, si crea una selección de entidades no ordenada para una dataclass  que contiene 10.000 entidades, ocupará 1.250 bytes, que es aproximadamente 1.2K en RAM.
    Por otro lado, las selecciones de entidades no ordenadas no pueden ordenarse. No puede confiar en la posición de las entidades dentro de la selección. Además, no puede tener más de una referencia a la misma entidad en la selección: cada entidad solo se puede agregar una vez.

 

  • Las selección de entidades ordenadas se crean sobre arrays enteros largos (que contienen referencias de entidad) en la memoria. Cada referencia a una entidad toma 4 bytes en la memoria. Procesar y mantener dichas selecciones lleva más tiempo y requiere más espacio de memoria que las selecciones sin ordenar.
    Por otro lado, se pueden ordenar o reordenar, y puede confiar en las posiciones de la entidad. Además, puede agregar más de una referencia a la misma entidad.

La siguiente tabla resume las principales funcionalidades de cada tipo de selección de entidades:

FuncionalidadSelección de entidades no ordenadaSelección de entidades ordenada
Velocidad de procesamiento
muy rápidomás lento
Tamaño en la memoria
muy pequeñomás grande
Puede contener varias referencias a una entidad
no

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:

  • resultado de un orderBy( ) en una selección (de cualquier tipo) o una orderBy( ) en una dataclass
  • resultado del método newSelection( ) con la opción dk keep ordered

Las entity selections desordenadas se crean en los siguientes casos:

  • resultado de una query( ) estándar en una selección (de cualquier tipo) o una query( ) en una dataclass,
  • resultado del método newSelection( ) sin opción,
  • resultado de cualquiera de los métodos de comparación, cualquiera que sea el tipo de selección de entrada: or( ), and( ), minus( ).

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

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"...)

 
PROPIEDADES 

Producto: 4D
Tema: ORDA

 
CONTENIDO DE LA PÁGINA 
 
HISTORIA 

New
Creado por: 4D v17

 
ARTICLE USAGE

Manual de Diseño ( 4D v17)
Manual de Diseño ( 4D v17.1)
Manual de Diseño ( 4D v17.2)
Manual de Diseño ( 4D v17.3)
Manual de Diseño ( 4D v17.4)