mirror of
https://github.com/Theodor-Springmann-Stiftung/musenalm.git
synced 2026-02-04 10:35:30 +00:00
116 lines
3.2 KiB
Go
116 lines
3.2 KiB
Go
package dbmodels
|
|
|
|
import (
|
|
"slices"
|
|
|
|
"github.com/Theodor-Springmann-Stiftung/musenalm/helpers/datatypes"
|
|
"golang.org/x/text/collate"
|
|
"golang.org/x/text/language"
|
|
)
|
|
|
|
// INFO: Functions that implement sorting of which sqlite is not capable of.
|
|
|
|
func Sort_Series_Title(series []*Series) {
|
|
collator := collate.New(language.German)
|
|
slices.SortFunc(series, func(i, j *Series) int {
|
|
return collator.CompareString(i.Title(), j.Title())
|
|
})
|
|
}
|
|
|
|
func Sort_Agents_Name(agents []*Agent) {
|
|
collator := collate.New(language.German)
|
|
slices.SortFunc(agents, func(i, j *Agent) int {
|
|
return collator.CompareString(i.Name(), j.Name())
|
|
})
|
|
}
|
|
|
|
func Sort_Entries_Title_Year(entries []*Entry) {
|
|
collator := collate.New(language.German)
|
|
slices.SortFunc(entries, func(i, j *Entry) int {
|
|
if i.PreferredTitle() == j.PreferredTitle() {
|
|
return i.Year() - j.Year()
|
|
}
|
|
return collator.CompareString(i.PreferredTitle(), j.PreferredTitle())
|
|
})
|
|
}
|
|
|
|
func Sort_Entries_Year_Title(entries []*Entry) {
|
|
collator := collate.New(language.German)
|
|
slices.SortFunc(entries, func(i, j *Entry) int {
|
|
if i.Year() == j.Year() {
|
|
return collator.CompareString(i.PreferredTitle(), j.PreferredTitle())
|
|
}
|
|
return i.Year() - j.Year()
|
|
})
|
|
}
|
|
|
|
func Sort_REntriesSeries_Year(entries []*REntriesSeries, entriesMap map[string]*Entry) {
|
|
slices.SortFunc(entries, func(i, j *REntriesSeries) int {
|
|
ientry := entriesMap[i.Entry()]
|
|
jentry := entriesMap[j.Entry()]
|
|
return ientry.Year() - jentry.Year()
|
|
})
|
|
}
|
|
|
|
func Sort_Contents_Numbering(contents []*Content) {
|
|
slices.SortFunc(contents, func(i, j *Content) int {
|
|
return datatypes.CompareFloat(i.Numbering(), j.Numbering())
|
|
})
|
|
}
|
|
|
|
func Sort_Places_Name(places []*Place) {
|
|
collator := collate.New(language.German)
|
|
slices.SortFunc(places, func(i, j *Place) int {
|
|
return collator.CompareString(i.Name(), j.Name())
|
|
})
|
|
}
|
|
|
|
// Sort_Entries_MusenalmID sorts entries by MusenalmID (Alm number) in ascending order
|
|
func Sort_Entries_MusenalmID(entries []*Entry) {
|
|
slices.SortFunc(entries, func(i, j *Entry) int {
|
|
return i.MusenalmID() - j.MusenalmID()
|
|
})
|
|
}
|
|
|
|
// Sort_Entries_Signatur sorts entries by their lowest signature (identifier) alphabetically
|
|
// Entries with no items sort last, entries with items but empty identifiers also sort last
|
|
func Sort_Entries_Signatur(entries []*Entry, itemsMap map[string][]*Item) {
|
|
collator := collate.New(language.German)
|
|
slices.SortFunc(entries, func(i, j *Entry) int {
|
|
iItems := itemsMap[i.Id]
|
|
jItems := itemsMap[j.Id]
|
|
|
|
// Find lowest signature for entry i
|
|
var iLowestSig string
|
|
for _, item := range iItems {
|
|
sig := item.Identifier()
|
|
if sig != "" && (iLowestSig == "" || collator.CompareString(sig, iLowestSig) < 0) {
|
|
iLowestSig = sig
|
|
}
|
|
}
|
|
|
|
// Find lowest signature for entry j
|
|
var jLowestSig string
|
|
for _, item := range jItems {
|
|
sig := item.Identifier()
|
|
if sig != "" && (jLowestSig == "" || collator.CompareString(sig, jLowestSig) < 0) {
|
|
jLowestSig = sig
|
|
}
|
|
}
|
|
|
|
// Entries without signatures sort last
|
|
if iLowestSig == "" && jLowestSig == "" {
|
|
return 0
|
|
}
|
|
if iLowestSig == "" {
|
|
return 1 // i goes after j
|
|
}
|
|
if jLowestSig == "" {
|
|
return -1 // i goes before j
|
|
}
|
|
|
|
// Compare using German collation for natural sorting
|
|
return collator.CompareString(iLowestSig, jLowestSig)
|
|
})
|
|
}
|