Uma entity selection é um objeto que contém uma ou mais referências a entidades que pertecem à mesma dataclass. Uma entity selection pode conter 0, 1 ou entidades X da dataclass, onde X pode representar a quantidade total de entidades contidas na dataclass. As entity selections podem ser "ordenadas" ou "não ordenadas" (este ponto se analisa abaixo).
As entity selections geralmente são criadas utilizando uma pesquisa ou são retornadas desde um atributo relação. Por exemplo:
brokers:=ds.Person.query("personType = broker")
Este código retorna em brokers todas as pessoas de tipo broker. Para acessar a uma entidade da seleção, utilize uma sintaxe similar para acessar a um elemento em uma coleção. Por exemplo:
theBroker:=brokers[0]
O método
entitySelection.orderBy( ) retorna uma nova seleção de entidade de acordo com os critérios de classificação fornecidos. Por exemplo:
brokers:=brokers.orderBy("name")
Este código retorna em brokers a mesma seleção de entidade das entidades Person, mas ordenadas por nome.
Alternativamente, pode usar um atributo relação para devolver uma seleção de entidade. Por exemplo:
brokers:=ds.Person.query("personType = broker")
brokerCompanies:=brokers.myCompany
Este código atribui a brokerCompanies todas as empresas relacionadas das pessoas na seleção de entidade brokers, utilizando o atributo de relação myCompany. O uso de atributos de relação nas seleções de entidades é uma forma poderosa e fácil de navegar para cima e para baixo a série de entidades relacionadas.
Para realizar ações repetidas a entidades em uma seleção de entidades, como recuperar e modificar valores de certos atributos, pode usar a estrutura For each...End for each. Por exemplo:
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
É possível criar um objeto de tipo entity selection da seguinte maneira:
Pode criar e usar simultaneamente tantas entity selections diferentes quantas queira para uma dataclass. Lembre que uma entity selection só contém referências a entidades. As diferentes entity selections podem conter referências às mesmas entidades.
Nota: Uma seleção de entidade é definida apenas no processo onde foi criada. Não é possível, por exemplo, armazenar uma referência a uma seleção de entidade em uma variável interprocesso e usá-la em outro processo.
Todos os atributos de armazenamento (texto, número, booleano, data) estão disponíveis como propriedades das entity selections assim como das entidades. Quando for usado junto com uma entity selection, um atributo escalar retorna uma coleção de valores escalares. Por exemplo:
locals:=ds.Person.query("city = :1";"San Jose")
localEmails:=locals.emailAddress
Este código retorna em localEmails uma coleção de endereços de correio eletrônico como strings.
Além da variedade de formas em que pode realizar consultas, também pode usar atributos relação como propriedades de entity selections para devolver novas entity selections. Por exemplo, considere a estrutura abaixo:

myParts:=ds.Part.query("ID < 100")
$myInvoices:=myParts.invoiceItems.invoice
A última linha devolverá em $myInvoices uma entity selection de todas as faturas que tenham pelo menos um item de fatura relacionado com uma parte na entity selection myParts. Quando um atributo relação for usado como uma propriedade de una entity selection, o resultado é sempre outra entity selection, mesmo se apenas for devolvida uma entidade. Quando um atributo relação for usado como uma propriedade de uma entity selection e não forem retornadas entidades, o resultado é uma seleção de entidade vazia, não null.
As entity selections locais podem ser ordenadas ou não ordenadas. Basicamente, ambos objetos têm uma funcionalidade similar, mas existem algumas diferenças com respeito a seu rendimento e funções disponíveis. Pode decidir que tipo de entity selection usar segundo suas necessidades específicas.
Nota: as Entity selections em uma devolvidas por 4D Server a um cliente remoto sempre são ordenadas.
- As entity selections desordenadas são construídas sobre tabelas de bits na memória. Uma entity selection desordenada contém um bit para cada entidade na dataclass, independentemente de se a entidade estiver realmente na seleção. Cada bit é igual a 1 ou 0, para indicar se a entidade estiver ou não incluída na seleção. É uma representação muito compacta para cada entidade.
Como consequência, as operações que utilizam entity selections não ordenadas são muito rápidas. Além disso, as entity selections desordenadas são econômicas em termos de espaço de memória. O tamanho de uma entity selection desordenada, em bytes, sempre é igual ao número total de entidades na dataclass dividido entre 8. Por exemplo, se criar uma entity selection desordenada para uma dataclass que contenha 10.000 entidades, ocupará 1.250 bytes, que é aproximadamente 1.2K em RAM.
Por outro lado, as entity selections não ordenadas não podem ser ordenadas. Não pode confiar na posição das entidades dentro da seleção. Além disso, não pode ter mais de uma referência à mesma entidade na seleção: cada entidade só pode ser agregado uma vez.
- As entity selections ordenadas são criadas sobre arrays inteiros longos (que contenham referências de entidade) na memória. Cada referência a uma entidade toma 4 bytes na memória. Processar e manter essas seleções leva mais tiempo e exige mais espaço de memória que as seleções sem ordenar.
Por outro lado, podem ser ordenadas ou reordenar, e pode confiar nas posições da entidade. Além disso, pode agregar mais de uma referência à mesma entidade.
A tabela abaixo resume as principais funcionalidades de cada tipo de entity selection:
Funcionalidade | Entity selection desordenada | Entity selection ordenada Velocidade de processamento | muito rápido | mais lento Tamanho na memória | muito pequeno | maior Pode conter várias referências a uma entidade | não | sim |
Por razões de otimização, como padrão normal, 4D ORDA geralmente cria entity selections não ordenadas, exceto quando utilizar o método orderBy( ) ou usar as opções apropriadas (ver a continuação). Nesta documentação, a menos que se especifique "entity selection" geralmente se refere a uma "entity selection desordenada".
Como se mencionou anteriormente, ORDA por padrão cria e maneja entity selections não ordenadas como resultado de operações tais como consultas ou comparações como and( ). As entity selections ordenadas são criadas só quando for necessário ou quando são solicitadas especificamente mediante o uso de opções.
As entity selections ordenadas são criadas nos casos abaixo:
- resultado de um orderBy( ) em uma seleção (de qualquer tipo) ou uma orderBy( ) em uma dataclass
- resultado do método newSelection( ) com a opção dk keep ordered
As entity selections desordenadas são criadas nos casos abaixo:
- resultado de uma query( ) padrão em uma seleção (de qualquer tipo) ou uma query( ) em uma dataclass,
- resultado do método newSelection( ) sem opção,
- resultado de qualquer um dos métodos de comparação, qualquer que seja o tipo de seleção de entrada: or( ), and( ), minus( ).
Lembre que quando uma entity selection ordenada são convertida em uma entity selection desordenada, qualquer referência de entidade repetida é eliminada.
Se quiser transformar uma entity selection ordenada em uma não ordenada, pode simplesmente aplicar uma operação and( ), por exemplo:
mySel:=mySel.and(mySel)
O objeto entity selection em si mesmo não pode ser copiado como um objeto:
$myentitysel:=OB Copy(ds.Employee.all())
Entretanto, as propriedades entity selection são numeráveis:
ARRAY TEXT($prop;0)
OB GET PROPERTY NAMES(ds.Employee.all();$prop)