[t.net] natural sort voor pricewatch

Pagina: 1
Acties:

  • Juup
  • Registratie: Februari 2000
  • Niet online
Moderators: als dit niet mag, dan kill dit topic maar gewoon.

C(++) programmeurs,
Als je in de tweakers.net pricewatch kijkt, zie je dat alles alphabetisch gesorteerd is.

Dat levert vreemde lijsten op:
1024 MB Geheugen
128 MB Geheugen
256 MB Geheugen
32 MB Geheugen
4 MB Geheugen
...

MySQL sorteert deze arrays voor t.net. MySQL kent geen Natural Sort zoals bv. PHP die wel kent. Femme wil PHP de sorts niet laten uitvoeren omdat dat veel meer (dure processor-) tijd kost. Terecht.
Maar MySQL kent wel UDF oftewel User Defined Functions. En die schrijf je in c of c++.

Als iemand er zin in heeft om een natural sort algoritme te schrijven in c, en/of naar een UDF om te freubelen, dan bewijst hij/zij daar zoewl t.net als andere MySQL gebruikers een grote dienst mee. Ikzelf ben geen c programmeur, anders deed ik het zelf wel. Ik heb nog meer info hierover als er behoefte aan is.

devtrack link

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Toch maar weer open :)

Maar dan op een andere manier, niet het request voor de natural sort in C/C++.

Maar een discussie over de beste manier om natural sortering in de pricewatch te krijgen...


Jaaap: Zie ook mijn laatste reactie in dat devtrack draadje. Zo'n udf functie is leuk, maar niet voor ordering bruikbaar.

  • Juup
  • Registratie: Februari 2000
  • Niet online
Wow ACM je bent snel ;)

Ik begrijp niet helemaal waarom je met een UDF geen "ORDER BY tabelnaam achtige functies" kan doen.


[edit]
Moet er nu geen sterretje achter de topictitle?
[/edit]

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op maandag 25 februari 2002 21:57 schreef Jaaap het volgende:
Wow ACM je bent snel ;)

Ik begrijp niet helemaal waarom je met een UDF geen "ORDER BY tabelnaam achtige functies" kan doen.
Je kan er niet mee sorteren...

Je kan er niet de uiteindelijke volgorde van het resultaat mee bepalen. Tenminste, dat lees ik uit de beschrijving af :)

  • Juup
  • Registratie: Februari 2000
  • Niet online
When using aggregate UDF functions MySQL works the following way:

1. Call xxx_init() to let the aggregate function allocate the memory it will need to store results.
2. Sort the table according to the GROUP BY expression.
3. For the first row in a new group, call the xxx_reset() function.
4. For each new row that belongs in the same group, call the xxx_add() function.
5. When the group changes or after the last row has been processed, call xxx() to get the result for the aggregate.
6. Repeat 3-5 until all rows has been processed
7. Call xxx_deinit() to let the UDF free any memory it has allocated.
Als ik dit goed begrijp (ahum) dan ehh... zou het wel moeten kunnen?

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.


  • Juup
  • Registratie: Februari 2000
  • Niet online
Wat doet een natural sort algoritme?

De kern van het probleem (als je al een beetje weet over sorten) is het zoeken van numerieke karakters die op dezelfde positie beginnen.
neem twee strings:
code:
1
2
string1 = "Memory 32 MB bla";
string2 = "Memory 4 MB bla";

Een alphabetisch sort algoritme zou zeggen string1 < string2 (en dus -1 retourneren). Onze intuitie vindt echter 32 > 4 dus zou er 1 geretourneerd moeten worden.

Als we nu in string1 de positie van het eerste numerieke karakter opzoeken en beide strings in drieen splitten zodat
code:
1
2
string1a = "Memory "; string1b = "32"; string1c = " MB bla";
string2a = "Memory "; string2b = "4"; string2c = " MB bla";

En dan string1a alphabetisch comparen met string2a (die zijn gelijk) dan daarna string1b numeriek vergelijken met string2b (retourneert 1 want 32 > 4) dan retourneert onze functie dus 1.

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op maandag 25 februari 2002 22:04 schreef Jaaap het volgende:
Als ik dit goed begrijp (ahum) dan ehh... zou het wel moeten kunnen?
Dan snap ik niet hoe je dat aan moet roepen...

Als voorbeeld geven zij SUM().

  • Johannes
  • Registratie: Juni 2000
  • Laatst online: 27-08 21:32
Op maandag 25 februari 2002 22:21 schreef Jaaap een stuk over natsort:
Het probleem is niet de natsort(die kun je zo ergens van internet halen), maar het probleem is of MySQL het wel aankan. Ik dacht dat dit misschien een oplossing was:
code:
1
2
3
SELECT NATSORT(column) as temp 
FROM table
ORDER BY temp

NATSORT wordt nu per row één keer gecalled, maar hoe kan je sorteren als je maar één row elke keer hebt? Ook aggegrate functions werken niet, want die kunnen maar één waarde returnen. Ik denk dat je toch echt in de MySQL code moet gaan graven om dit op te lossen.

Uit volle borst op weg naar nergens / Zonder reden zonder doel
Met m'n zeden en m'n zonden / En mijn angstig voorgevoel
Laat mij mijn kont tegen de krib / Laat mij dit goddeloze lied
Hef jij je handen maar ten hemel / Maar red mij niet


  • Johannes
  • Registratie: Juni 2000
  • Laatst online: 27-08 21:32
Op maandag 25 februari 2002 22:04 schreef Jaaap het volgende:

[..]

Als ik dit goed begrijp (ahum) dan ehh... zou het wel moeten kunnen?
Niet dus, dit is dus echt bedoeld voor functies die alle rows samen nemen om één return value te geven(zoals SUM()) dus. Om te sorteren heb je niet genoeg aan één return value.

Uit volle borst op weg naar nergens / Zonder reden zonder doel
Met m'n zeden en m'n zonden / En mijn angstig voorgevoel
Laat mij mijn kont tegen de krib / Laat mij dit goddeloze lied
Hef jij je handen maar ten hemel / Maar red mij niet

Pagina: 1