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 »
Citace od: korabro kdy 23. 07. 2020, 17:53:39

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?


Re:Změna pořadí prvků modelu nested set
« Odpověď #16 kdy: 23. 07. 2020, 18:24:34 »

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


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 »
Citace od: korabro kdy 23. 07. 2020, 18:24:34

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


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:


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

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 »
Citace od: korabro 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

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áš:

name      lft rgt
1          1   8
1.3        2   3
1.1        4   5
1.2        6   7

A chceš to mít takto:

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

name      lft rgt
1          1   8
1.3        2   3
1.1        6   8
1.2        9   10


2.krok - přesun uzlu

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.

Citace od: korabro kdy 23. 07. 2020, 18:41:45
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".



czmiho

  • ***
  • 137
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 »
Citace od: czmiho kdy 23. 07. 2020, 20:25:51
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:

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

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


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


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


BoneFlute

  • *****
  • 2 155
Re:Změna pořadí prvků modelu nested set
« Odpověď #24 kdy: 27. 07. 2020, 17:20:17 »
Citace od: korabro kdy 23. 07. 2020, 23:35:30
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 »
Citace od: BoneFlute kdy 27. 07. 2020, 17:20:17
Citace od: korabro kdy 23. 07. 2020, 23:35:30
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