Synchronizace několika kolekcí pomocí této nové funkce

Automaticky přeloženo z Deepl

4D nabízí výkonné funkce pro práci s kolekcemi objektů. Můžete například vytvořit kolekci měst s přidruženými zeměmi a kontinenty. Manipulace s těmito kolekcemi pomocí vestavěných funkcí, jako je třídění, řazení a filtrování, se stává hračkou.

4D v20 R3 zavádí novou funkci multiSort(), která tento proces zjednodušuje. Pomocí této funkce nyní můžete snadno třídit a synchronizovat více kolekcí.

Nová funkce

Tato nová funkce multiSort() umožňuje provádět víceúrovňové synchronizované třídění na sadě kolekcí.

Pokud je funkce volána bez parametrů, má stejný účinek jako funkce .sort(). Kolekce je standardně seřazena (pouze skalární hodnoty) vzestupně podle jejich typu.

Pokud chcete kolekce seřadit v jiném než vzestupném pořadí, musíte zadat vzorec.

$col.multiSort( [ $col2; $col3 ] )
$col .multiSort( $formula; [$col2; $col3] )

Je také možné definovat víceúrovňové synchronizované třídění. To je podobné příkazu SORT MULTIPLE ARRAY.

V tomto případě je třeba předat objekt obsahující atributy kolekce a pořadí.

$col.multiSort( [ {collection: $col2; order: ck ascending} ; $col3 ] )
$col .multiSort( [ $formula; {collection: $col2; order: ck ascending} ; $col3 ] )

O třídicím algoritmu se navíc říká, že je stabilní, tj. dva prvky se stejnou hodnotou se v setříděném výstupu vyskytují ve stejném pořadí jako ve vstupním souboru dat.

Příklad databáze

Příklady

Vraťme se k našemu příkladu města, země a kontinentu:

var $city : Collection
var $country : Collection
var $continent : Collection

$city :=["Paříž"; "Lyon"; "Rabat"; "Eching"; "San Diego"]
$country :=["Francie"; "Francie"; "Maroko"; "Německo"; "USA"]
$continent :=["Evropa"; "Evropa"; "Afrika"; "Evropa"; "Amerika"]

Příklad 1: Jednoduché třídění první kolekce ($continent) se synchronizací dalších kolekcí ($country a $city).

$continent.multiSort([$country; $city])

Výsledkem je:

"Afrika"; "Amerika"; "Evropa"; "Evropa"; "Evropa". 
"Maroko"; "USA"; "Francie"; "Francie"; "Německo". 
"Rabat"; "San Diego"; "Paris"; "Lyon"; "Eching"

Příklad 2: Vzestupné třídění první a třetí kolekce ($continent a $city) a synchronizace pro druhou kolekci ($country).

$continent.multiSort($country; {collection: $city; order: ck ascending})

Výsledek je následující:

"Afrika"; "Amerika"; "Evropa"; "Evropa"; "Evropa".
"Maroko"; "USA"; "Německo"; "Francie"; "Francie".
"Rabat"; "San Diego"; "Eching"; "Lyon"; "Paris"

Příklad 3: Třídění vzorce první kolekce ($continent) a synchronizace pro další kolekce ($country a $city).

Vzorec v příkladu je přímočarý a umožňuje třídění sestupně. Pravděpodobně však máte spoustu nápadů na složitější vzorce, které vyhovují vašim potřebám.

$continent.multiSort(Formula($1.value>$1.value2); [$country; $city])

Výsledkem je:

"Evropa"; "Evropa"; "Evropa"; "Amerika"; "Afrika".
"Francie"; "Francie"; "Německo"; "USA"; "Maroko".
"Paris"; "Lyon"; "Eching"; "San Diego"; "Rabat"

Příklad 4: Se složitými kolekcemi

Můžete jej také použít k synchronizaci kolekcí objektů.


var $name : : :=[] . ({ : "John"; : "Smith"}) . ({ : "Alain"; : "Martin"}) . ({ : "Jane"; : "Doe"}) . ({ : "John"; : "Doe"}) :=[] .({ : "Paříž"; : "Francie"}) . ({ : "Lyon"; : "Francie"}) . ({ : "Eching"; : "Německo"}) . ({ : "Berlín"; : "Německo"}) . ( ( . . < . . ); [ ) Collection
var $address Collection
$name
$namepushfirstname lastname
$namepushfirstname lastname
$namepushfirstname lastname
$namepushfirstname lastname
$address
$addresspushcity country
$addresspushcity country
$addresspushcity country
$addresspushcity country

$namemultiSortFormula$1valuefirstname$1value2firstname$address]

Výsledek je následující:

"Alain Martin"; "Jane Doe"; "John Smith"; "John Doe".
"Lyon Francie"; "Eching Německo"; "Paříž Francie"; "Berlín Německo". 

Další…

Další informace naleznete v dokumentaci. O své připomínky a případy použití se můžete podělit na fóru.

Vanessa Talbot
• Product Owner • Vanessa Talbot se připojila k programovému týmu 4D v červnu 2014. Jako Product Owner má na starosti psaní uživatelských příběhů a jejich převod do funkčních specifikací. Její úlohou je také zajistit, aby implementovaná funkce odpovídala potřebám zákazníka. Od svého příchodu pracovala na definování klíčových prvků ve 4D. Pracovala na většině nových funkcí preemptivního multi-threadingu a také na velmi složitém tématu: nové architektuře pro enginované aplikace. Vanessa má titul z Telecom Saint-Etienne. Svou kariéru začala ve Výzkumném ústavu kriminalistickém jako vývojářka pro audiovizuální oddělení. Působila také v mediální a lékařské oblasti jako expertka na technickou podporu, produkci i dokumentaci novinek.