Změna pořadí prvků modelu nested set

A. F.

Re:Změna pořadí prvků modelu nested set
« Odpověď #15 kdy: 23. 07. 2020, 18:06:30 »
Kód: [Vybrat]
name      lft rgt
 1          1   8 
 1.3        2   3
 1.2        4   5
 1.1        6   7

Prvek 1.3 budu chtit zobrazovat jako prvni. Je nutno ho dat za prvek 1.1. Prvky s vetsim intervalem maji vyssi hodnotu pri zobrazovani.
Prvek 1.3 chceš zobrazovat jako první, nebo za prvek 1.1? Nemůžeš chtít oboje. A nebo ti nerozumím. Jak by měl vypadat cílový stav?
« Poslední změna: 23. 07. 2020, 18:10:55 od A. F. »


Re:Změna pořadí prvků modelu nested set
« Odpověď #16 kdy: 23. 07. 2020, 18:24:34 »
Kód: [Vybrat]
name      lft rgt
 1          1   8
 1.3        2   3
 1.2        4   5
 1.1        6   7

se ve vysledku zobrazuje
1.
  1.1
  1.2
  1.3

1.3 potrebuji zobrazovat jako prvni

Kód: [Vybrat]
name      lft rgt
 1          1   8
 1.3        6   7
 1.2        2   3
 1.1        4   5


A. F.

Re:Změna pořadí prvků modelu nested set
« Odpověď #17 kdy: 23. 07. 2020, 18:33:58 »
Kód: [Vybrat]
name      lft rgt
 1          1   8
 1.3        2   3
 1.2        4   5
 1.1        6   7

se ve vysledku zobrazuje
1.
  1.1
  1.2
  1.3

1.3 potrebuji zobrazovat jako prvni

Kód: [Vybrat]
name      lft rgt
 1          1   8
 1.3        6   7
 1.2        2   3
 1.1        4   5

Jo ták. Tak to je proto, protože to máš blbě seřazené. Výpis bude vždycky ... ORDER BY lft. To znamená, že potřebuješ přeskládat ty lft a rgt.

Tedy:

Kód: [Vybrat]
name      lft rgt
 1          1   8
 1.3        2   3
 1.2        4   5
 1.1        6   7
je správně, a máš to definovaný jak to chceš aby se to zobrazovalo. Pokud nezobrazuje, tak máš špatně řazení. To bude ten problém.

Re:Změna pořadí prvků modelu nested set
« Odpověď #18 kdy: 23. 07. 2020, 18:41:45 »
omlouvam se spatne jsem to napsal 1.3 potrebuji zobrazovat jako prvni v seznamu pod 1 tzn.

1.
  1.3
  1.1
  1.2

proto potrebuju lft a rgt preskladat nasledovne
Kód: [Vybrat]
name      lft rgt
 1          1   8
 1.3        6   7
 1.2        2   3
 1.1        4   5

order je prave "BY RGT"
 

ale vubec nevim jakym postupem to spravne preskladat

A. F.

Re:Změna pořadí prvků modelu nested set
« Odpověď #19 kdy: 23. 07. 2020, 18:56:32 »
omlouvam se spatne jsem to napsal 1.3 potrebuji zobrazovat jako prvni v seznamu pod 1 tzn.

1.
  1.3
  1.1
  1.2

proto potrebuju lft a rgt preskladat nasledovne
Kód: [Vybrat]
name      lft rgt
 1          1   8
 1.3        6   7
 1.2        2   3
 1.1        4   5

order je prave "BY RGT"
 

ale vubec nevim jakym postupem to spravne preskladat
OK, v tom případě tedy:

Máš:
Kód: [Vybrat]
name      lft rgt
 1          1   8
 1.3        2   3
 1.1        4   5
 1.2        6   7
A chceš to mít takto:
Kód: [Vybrat]
name      lft rgt
 1          1   8
 1.3        2   3
 1.2        4   5
 1.1        6   7
To znamená posunout 1.2 nahoru. To znamená podle mého návodu:

1.krok - vytvoření díry
Kód: [Vybrat]
name      lft rgt
 1          1   8
 1.3        2   3
 1.1        6   8
 1.2        9   10

2.krok - přesun uzlu
Kód: [Vybrat]
name      lft rgt
 1          1   8
 1.3        2   3
 1.2        4   5
 1.1        6   8
A protože 1.2 byla poslední, není co uklízet.

order je prave "BY RGT"
Seřazení má být BY lft ASC, ale BY rgt ASC by asi mělo jít taky, i když je to takové řazení "zezadu".



Re:Změna pořadí prvků modelu nested set
« Odpověď #21 kdy: 23. 07. 2020, 20:25:51 »
Takhle to je komplikované protože při postupných úpravach se ti nové/už upravené left-right páry kříží s těmi ještě neupravenými a prase aby se v tom pak vyznalo.

Zjednoduš si to - rozděl si prvky v parentu přesouvaného objektu na disjunktní podmnožiny, označkuj si je a pak na nich proveď potřebné operace podle značek. V případě přesunu nahoru:

Prvky před cilovým umístěním - nechat být
Prvky mezi cílovým místem a zdrojovým místem - přečíslovat left i right - zvětšit o velikost přesouvaného objektu (neboli děláme díru)
Prvky objektu - přečíslovat left i right - zmenšit o vzdálenost původního a nového umístění (přesouváme do díry)
Prvy za zdrojovým ojbektem - nechat být

A nezapomeň na zámky jinak se ti to v multiuser prostředí rozese... rozpadne.

A. F.

Re:Změna pořadí prvků modelu nested set
« Odpověď #22 kdy: 23. 07. 2020, 21:15:03 »
Prvy za zdrojovým ojbektem - nechat být

Tak to je pak další optimalizace: Můžeš si vytáhnout idečka přesouvaného uzlu, a při přepočítávání lft a rgt k nim přihlížet. Pak by se by oko vystačilo se dvěma UPDATY, a navíc se nebudou ničit indexy u řádek, které nás nezajímají. Drobná nevýhoda je, že nemůžu postavit unikátní index nad lft a rgt.
A nebo je přesouvat na konec a až pak teprve do díry... no, prostor pro optimalizaci tu je.

Re:Změna pořadí prvků modelu nested set
« Odpověď #23 kdy: 23. 07. 2020, 23:35:30 »
Dalo by se to tedy resit nejak takto (nemel jsem to cas jeste otestovat a mozna nevidim chybu):



Existujici list:

Kód: [Vybrat]
1       |  1  12
1.3     |  2  7
1.3.2   |  3  4
1.3.1   |  5  6
1.2     |  8  9
1.1     | 10  11


Se bude zobrazovat jako pri "order right"
///////////
1
 1.1
 1.2
 1.3
  1.3.1
  1.3.2
//////////

Pozadavek: celou mnozinu 1.3 chci zobrazovat na zacatku seznamu v rodici 1. Presun nesmi negativne ovlivnit jine, nez mnoziny rodicovskeho intervalu.

1) Presouvane prvky oznacit pro tranzit odectenim od nuly

Kód: [Vybrat]
1       |  1  12
1.3     |  -2  -7
1.3.2   |  -3  -4
1.3.1   |  -5  -6
1.2     |  8  9
1.1     | 10  11


2) V rodici odecist misto = poctu odebranych prvku +1

lft > 7 and lft < 12  lft= lft - 6
rgt > 7 and rgt < 12  rgt= rgt - 6
Kód: [Vybrat]

1       |  1  12
1.3     |  -2  -7
1.3.2   |  -3  -4
1.3.1   |  -5  -6
1.2     |  2   3
1.1     |  4   5
3) A na zaver vratit prvky z tranzitu odectenim od nuly a pricist rgt posledniho prvku v rodici tj. 5

x<0 lft=0 - (lft)+5-1
x<0 rgt=0 -(rgt)+5-1

Kód: [Vybrat]
1       |  1  12
1.3     |  6  11
1.3.2   |  7  8
1.3.1   |  9  10
1.2     |  2   3
1.1     |  4   5

Se bude zobrazovat jako pri "order right"
///////////
1
 1.3
  1.3.1
  1.3.2
 1.1
 1.2
//////////




- Kontroly:
  ;na konci zmeny je treba potvrdit ze prvek s lft=1 a rgt=12 stale existuje
  ;zadne prvky nemaji lft<0 and rgt<0
  ;zadne cislo lft ani rgt se nevyskytuje > 1

« Poslední změna: 23. 07. 2020, 23:37:53 od korabro »

BoneFlute

  • *****
  • 1 470
    • Zobrazit profil
Re:Změna pořadí prvků modelu nested set
« Odpověď #24 kdy: 27. 07. 2020, 17:20:17 »
1) Presouvane prvky oznacit pro tranzit odectenim od nuly

Ono používání záporného čísla nemusí být tak dobrý nápad, jak by se mohlo na první pohled zdát. Nemůžeš pak použít UNSIGNED, a díky tomu vlastně máš poloviční rozsah těch čísel (-2147483648..2147483647 na místo 0..4294967295). Třeba ti to nevadí, neříkám nic. Ale je dobré o tom vědět.

A. F.

Re:Změna pořadí prvků modelu nested set
« Odpověď #25 kdy: 28. 07. 2020, 16:23:54 »
1) Presouvane prvky oznacit pro tranzit odectenim od nuly

Ono používání záporného čísla nemusí být tak dobrý nápad, jak by se mohlo na první pohled zdát. Nemůžeš pak použít UNSIGNED, a díky tomu vlastně máš poloviční rozsah těch čísel (-2147483648..2147483647 na místo 0..4294967295). Třeba ti to nevadí, neříkám nic. Ale je dobré o tom vědět.
+1