Nel primo episodio di questa trilogia, abbiamo mostrato le basi di ORDA utilizzando caselle di riepilogo, entità e selezioni di entità. Oggi andremo un po’ più a fondo, eseguendo alcune query che sfrutteranno le relazioni ricorsive. Daremo anche una rapida occhiata a come visualizzare le caselle di riepilogo in modo gradevole, utilizzando la proprietà “meta info expression”.
Scarica Genealogia – Episodio due
scenario d’uso
Ho selezionato una persona in un elenco molto ampio e ora voglio trovare i suoi genitori e i suoi nonni. Voglio anche i suoi fratelli e sorelle… e i suoi figli, se ne ha! Perché non gli zii… e i cugini?
Ci vorrà un’eternità per tutto questo? Scopriamolo.
cominciamo dall’inizio!
La selezione dell’entità people conterrà le persone nate dopo il 1° gennaio 1960 e sarà salvata all’interno dell’oggetto Form:
Form.people:=ds.PEOPLE.query("Birthday >= :1";!1960-01-01!).orderBy("Birthday asc, Lastname asc, Firstname asc")
Si noti questo formato di query altamente raccomandato, che utilizza segnaposto (:1) e parametri (!1960-01-01!).
IMPOSTARE LA CASELLA DI RIEPILOGO
Come abbiamo visto nel post precedente, la selezione dell’entità(Form.people) è impostata all’inizio come proprietà di selezione dell’entità.
La casella di riepilogo, basata su una selezione di entità, ha un paio di nuove proprietà. Ne descriveremo tre: Elemento corrente, Elementi selezionati e Espressione meta info.
L’elemento corrente e gli elementi selezionati saranno aggiornati automaticamente quando l’utente cambierà la selezione della casella di riepilogo:
L’elemento corrente conterrà l’entità selezionata (O l’ultima aggiunta, nel caso di selezioni multiple). Se non c’è nessun elemento selezionato nell’elenco, questa entità sarà nulla.
L’elemento Selezionato è una selezione di entità. Conterrà tutti gli elementi selezionati nell’elenco, indipendentemente dal modo in cui sono stati selezionati (shift+click, control+click, ecc.). Questa selezione di entità esisterà sempre, ma può essere vuota.
L’espressione Meta info è descritta di seguito, alla fine di questo post.
MEMBRI DELLA FAMIGLIA
Durante l’evento di cambio di selezione della casella di riepilogo principale, dobbiamo trovare i genitori, i figli e i fratelli delle persone selezionate:
Form.parents:=GetParents (Form.persons)
Form .children:=GetChildren (Form.persons)
Form .siblings:=GetSiblings (Form.persons)
Una volta create queste selezioni di entità, trovare nonni, zii e zie, nonché cugini, è davvero facile. I nonni sono i genitori dei genitori, gli zii e le zie sono i fratelli dei genitori e i cugini sono i figli degli zii e delle zie!
Form.grandParents:=GetParents (Form.parents)
Form .auntsAndUncles:=GetSiblings (Form.parents)
Form .cousins:=GetChildren (Form.auntsAndUncles)
Query
Trovare i membri correlati è molto semplice quando si usa ORDA. Ogni metodo “Get” riceve una selezione di entità come parametro e restituisce un’altra selezione di entità (basata sul contenuto o su quella ricevuta).
Genitori
Il metodo GetParents riceve Form.parents come parametro $1. Chiamiamolo $_persone.
(Il trattino basso è qui solo per aiutare visivamente a distinguere facilmente tra “entità” e “selezione di entità”).
Come promemoria, Madre e Padre sono le entità definite nelle definizioni delle relazioni. Sono i nomi delle relazioni “N a 1”.
La magia di ORDA è che può restituire una singola entità ($person.Mother, $person.Father, $person.Partner) se usata con una singola entità ($person) OPPURE una selezione di entità se usata con un’altra selezione di entità ($_persons).
$_persone:=$1
$_genitori:=$_persone.Madre.or($_persone.Padre)
$0:=$_genitori
figli
Lo stesso vale per le selezioni di entità definite per le relazioni “1 a n”.
// Note: the text below fits on a single line
$_figli:=$_persone.FigliComePadre (...)
.or($_persone.FigliComeMadre) (...)
.orderBy("Birthday asc")
Fratelli
Per i fratelli, dobbiamo usare più relazioni. Prima per trovare il padre, poi per trovare i figli del padre, seguito da un“o” logico applicato alle madri, poi da un“meno” logico per rimuovere le persone dall’elenco dei fratelli(i genitori di Paul hanno due figli, Paul e John, ma Paul ha solo un fratello, John…)
// Note: the text below fits on a single line
$fratelli:=$_persone.Padre.FigliComePadre (...)
.or($_persone.Madre.FigliComeMadre) (...)
.minus($_persone)
Risultato finale
Ora che abbiamo trovato i membri della famiglia per categoria, li visualizzeremo in altri riquadri (con lo stesso tipo di informazioni del riquadro principale). A questo punto, basterà duplicare le caselle di riepilogo e cambiare i nomi delle proprietà di selezione delle entità in Form.grandParents, Form.parents, Form.siblings, Form.children, ecc.
Espressione Meta info
L’espressione Meta info è un metodo 4D che (di solito) riceve This come primo parametro e restituisce un oggetto. Nelle immagini precedenti, questo metodo viene utilizzato per disegnare gli sfondi delle righe blu e rosa.
L’oggetto restituito ha un paio di proprietà che sono definite qui. In questo caso, l’unica proprietà utilizzata è fill.
$person:=$1
$meta :=New object()
$even :=(($person.indexOf()%2)=0) // is it an even or and odd row ?
If ($person.Gender=True) // women
If ($even)
$meta .fill:="#FFF0F0" // women light
Else
$meta .fill:="#FFE8E8" // women a bit darker
End if
Else // man
If ($even)
$meta .fill:="#E8F8FF" // men light
Else
$meta .fill:="#E0F0FF"// men a bit darker
End if
End if
$0:=$meta
Conclusione
Questo database contiene fondamentalmente SETTE righe di codice!
La prima query per riempire Form.people, poi una riga di codice all’interno dei sei metodi “Get…”. Semplice e potente.
Allora perché ho la sensazione di aver dimenticato qualcosa? Oh sì… è veloce? Il tempo medio per trovare le sei categorie di parenti per una singola persona all’interno di un gruppo di molte migliaia di altre persone è di circa 1 ms (testato su un iMac 4,2Ghz Core i7 16Gb).
Se la selezione di persone è molto più ampia(diciamo 7284), il tempo medio è di 6 ms.
Provate voi stessi. Scaricate la demo e godetevi ORDA!