123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- package nginx_log
- import (
- "slices"
- )
- // typeToInt converts log type string to a sortable integer
- // "access" = 0, "error" = 1
- func typeToInt(t string) int {
- if t == "access" {
- return 0
- }
- return 1
- }
- // sortCompare compares two log entries based on the specified key and order
- // Returns true if i should come after j in the sorted list
- func sortCompare(i, j *NginxLogCache, key string, order string) bool {
- flag := false
- switch key {
- case "type":
- flag = typeToInt(i.Type) > typeToInt(j.Type)
- default:
- fallthrough
- case "name":
- flag = i.Name > j.Name
- }
- if order == "asc" {
- flag = !flag
- }
- return flag
- }
- // Sort sorts a list of NginxLogCache entries by the specified key and order
- // Supported keys: "type", "name"
- // Supported orders: "asc", "desc"
- func Sort(key string, order string, configs []*NginxLogCache) []*NginxLogCache {
- slices.SortStableFunc(configs, func(i, j *NginxLogCache) int {
- if sortCompare(i, j, key, order) {
- return 1
- }
- return -1
- })
- return configs
- }
- // sortCompareWithIndex compares two log entries with index status based on the specified key and order
- // Returns true if i should come after j in the sorted list
- func sortCompareWithIndex(i, j *NginxLogWithIndex, key string, order string) bool {
- flag := false
- switch key {
- case "type":
- flag = typeToInt(i.Type) > typeToInt(j.Type)
- case "index_status":
- // Sort order: indexed > indexing > not_indexed
- statusOrder := map[string]int{
- IndexStatusIndexed: 3,
- IndexStatusIndexing: 2,
- IndexStatusNotIndexed: 1,
- }
- iOrder := statusOrder[i.IndexStatus]
- jOrder := statusOrder[j.IndexStatus]
- flag = iOrder < jOrder
- case "last_indexed":
- // Sort by last indexed time (more recent first)
- if i.LastIndexed != 0 && j.LastIndexed != 0 {
- flag = i.LastIndexed > j.LastIndexed
- } else if i.LastIndexed == 0 && j.LastIndexed != 0 {
- flag = true // 0 comes after non-zero
- } else if i.LastIndexed != 0 && j.LastIndexed == 0 {
- flag = false // non-zero comes before 0
- }
- case "last_size":
- // Sort by file size
- if i.LastSize != 0 && j.LastSize != 0 {
- flag = i.LastSize > j.LastSize
- } else if i.LastSize == 0 && j.LastSize != 0 {
- flag = true
- } else if i.LastSize != 0 && j.LastSize == 0 {
- flag = false
- }
- case "document_count":
- // Sort by document count
- if i.DocumentCount != 0 && j.DocumentCount != 0 {
- flag = i.DocumentCount > j.DocumentCount
- } else if i.DocumentCount == 0 && j.DocumentCount != 0 {
- flag = true
- } else if i.DocumentCount != 0 && j.DocumentCount == 0 {
- flag = false
- }
- default:
- fallthrough
- case "name":
- flag = i.Name > j.Name
- }
- if order == "asc" {
- flag = !flag
- }
- return flag
- }
- // SortWithIndex sorts a list of NginxLogWithIndex entries by the specified key and order
- // Supported keys: "type", "name", "is_indexed", "last_indexed", "last_size", "document_count"
- // Supported orders: "asc", "desc"
- func SortWithIndex(key string, order string, configs []*NginxLogWithIndex) []*NginxLogWithIndex {
- slices.SortStableFunc(configs, func(i, j *NginxLogWithIndex) int {
- if sortCompareWithIndex(i, j, key, order) {
- return 1
- }
- return -1
- })
- return configs
- }
|