Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Replace sort package with slices, now in package query too. |
---|---|
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
825d28eb2200dedb2379c507401dfa8b |
User & Date: | stern 2024-06-20 14:03:09 |
Context
2024-06-23
| ||
15:00 | Update goldmark dependency ... (check-in: 7d1c721311 user: stern tags: trunk) | |
2024-06-20
| ||
14:04 | Update to latest trunk changes ... (check-in: 493d0eab86 user: stern tags: nospace) | |
14:03 | Replace sort package with slices, now in package query too. ... (check-in: 825d28eb22 user: stern tags: trunk) | |
12:49 | Replace sort package in draw with slices ... (check-in: bb0f2dd6a3 user: stern tags: trunk) | |
Changes
Changes to parser/draw/object.go.
︙ | ︙ | |||
18 19 20 21 22 23 24 | // // SPDX-License-Identifier: EUPL-1.2 // SPDX-FileCopyrightText: 2022-present Detlef Stern //----------------------------------------------------------------------------- package draw | | > > > | 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | // // SPDX-License-Identifier: EUPL-1.2 // SPDX-FileCopyrightText: 2022-present Detlef Stern //----------------------------------------------------------------------------- package draw import ( "cmp" "fmt" ) // object represents one of an open path, a closed path, or text. type object struct { // points always starts with the top most, then left most point, proceeding to the right. points []point text []rune corners []point |
︙ | ︙ | |||
111 112 113 114 115 116 117 | rt := r.isJustText() if lt != rt { return 1 } lp := l.Points()[0] rp := r.Points()[0] if lp.y != rp.y { | | | | 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 | rt := r.isJustText() if lt != rt { return 1 } lp := l.Points()[0] rp := r.Points()[0] if lp.y != rp.y { return cmp.Compare(lp.y, rp.y) } return cmp.Compare(lp.x, rp.x) } const ( dirNone = iota // No directionality dirH // Horizontal dirV // Vertical dirSE // South-East |
︙ | ︙ |
Changes to query/compiled.go.
︙ | ︙ | |||
11 12 13 14 15 16 17 | // SPDX-FileCopyrightText: 2023-present Detlef Stern //----------------------------------------------------------------------------- package query import ( "math/rand/v2" | | > > | 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | // SPDX-FileCopyrightText: 2023-present Detlef Stern //----------------------------------------------------------------------------- package query import ( "math/rand/v2" "slices" "zettelstore.de/z/zettel/id" "zettelstore.de/z/zettel/meta" ) // Compiled is a compiled query, to be used in a Box type Compiled struct { hasQuery bool seed int pick int order []sortOrder offset int // <= 0: no offset limit int // <= 0: no limit startMeta []*meta.Meta PreMatch MetaMatchFunc // Precondition for Match and Retrieve Terms []CompiledTerm sortFunc sortFunc } // MetaMatchFunc is a function determine whethe some metadata should be selected or not. type MetaMatchFunc func(*meta.Meta) bool func matchAlways(*meta.Meta) bool { return true } func matchNever(*meta.Meta) bool { return false } |
︙ | ︙ | |||
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | if term.Match(m) && term.Retrieve(m.Zid) { result = append(result, m) break } } } result = c.pickElements(result) result = c.sortElements(result) result = c.offsetElements(result) return limitElements(result, c.limit) } // AfterSearch applies all terms to the metadata list that was searched. // // This includes sorting, offset, limit, and picking. func (c *Compiled) AfterSearch(metaList []*meta.Meta) []*meta.Meta { if len(metaList) == 0 { return metaList } if !c.hasQuery { | > > > > > > > > | | > | > | | 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 | if term.Match(m) && term.Retrieve(m.Zid) { result = append(result, m) break } } } result = c.pickElements(result) c.ensureSortFunc() result = c.sortElements(result) result = c.offsetElements(result) return limitElements(result, c.limit) } func (c *Compiled) ensureSortFunc() { if c.sortFunc == nil { c.sortFunc = buildSortFunc(c.order) } } // AfterSearch applies all terms to the metadata list that was searched. // // This includes sorting, offset, limit, and picking. func (c *Compiled) AfterSearch(metaList []*meta.Meta) []*meta.Meta { if len(metaList) == 0 { return metaList } if !c.hasQuery { slices.SortFunc(metaList, defaultMetaSort) return metaList } if c.isDeterministic() { // We need to sort to make it deterministic if len(c.order) == 0 || c.order[0].isRandom() { slices.SortFunc(metaList, defaultMetaSort) } else { c.ensureSortFunc() slices.SortFunc(metaList, c.sortFunc) } } metaList = c.pickElements(metaList) if c.isDeterministic() { if len(c.order) > 0 && c.order[0].isRandom() { metaList = c.sortRandomly(metaList) } } else { metaList = c.sortElements(metaList) } metaList = c.offsetElements(metaList) return limitElements(metaList, c.limit) } func (c *Compiled) sortElements(metaList []*meta.Meta) []*meta.Meta { if len(c.order) > 0 { if c.order[0].isRandom() { metaList = c.sortRandomly(metaList) } else { c.ensureSortFunc() slices.SortFunc(metaList, c.sortFunc) } } return metaList } func (c *Compiled) offsetElements(metaList []*meta.Meta) []*meta.Meta { if c.offset == 0 { |
︙ | ︙ | |||
150 151 152 153 154 155 156 | for i := range count { last := len(order) - i n := rnd.IntN(last) picked[i] = order[n] order[n] = order[last-1] } order = nil | | | 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 | for i := range count { last := len(order) - i n := rnd.IntN(last) picked[i] = order[n] order[n] = order[last-1] } order = nil slices.Sort(picked) result := make([]*meta.Meta, count) for i, p := range picked { result[i] = metaList[p] } return result } |
︙ | ︙ | |||
181 182 183 184 185 186 187 | func limitElements(metaList []*meta.Meta, limit int) []*meta.Meta { if limit > 0 && limit < len(metaList) { return metaList[:limit] } return metaList } | < < < < < | 193 194 195 196 197 198 199 | func limitElements(metaList []*meta.Meta, limit int) []*meta.Meta { if limit > 0 && limit < len(metaList) { return metaList[:limit] } return metaList } |
Changes to query/sorter.go.
︙ | ︙ | |||
10 11 12 13 14 15 16 17 18 19 20 21 22 | // SPDX-License-Identifier: EUPL-1.2 // SPDX-FileCopyrightText: 2020-present Detlef Stern //----------------------------------------------------------------------------- package query import ( "strconv" "t73f.de/r/zsc/api" "zettelstore.de/z/zettel/meta" ) | > | | | | < | | | < < | < | < | > > | | | | | | > > | | | | > > > | | | | > > > | | | | | > | | > | > | | | > | > > | | | | > | | > | > | | | > > > > > > > > > > | | > > > > > > | 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 | // SPDX-License-Identifier: EUPL-1.2 // SPDX-FileCopyrightText: 2020-present Detlef Stern //----------------------------------------------------------------------------- package query import ( "cmp" "strconv" "t73f.de/r/zsc/api" "zettelstore.de/z/zettel/meta" ) type sortFunc func(i, j *meta.Meta) int func buildSortFunc(order []sortOrder) sortFunc { hasID := false sortFuncs := make([]sortFunc, 0, len(order)+1) for _, o := range order { sortFuncs = append(sortFuncs, o.buildSortfunc()) if o.key == api.KeyID { hasID = true break } } if !hasID { sortFuncs = append(sortFuncs, defaultMetaSort) } if len(sortFuncs) == 1 { return sortFuncs[0] } return func(i, j *meta.Meta) int { for _, sf := range sortFuncs { if result := sf(i, j); result != 0 { return result } } return 0 } } func (so *sortOrder) buildSortfunc() sortFunc { key := so.key keyType := meta.Type(key) if key == api.KeyID || keyType == meta.TypeCredential { if so.descending { return defaultMetaSort } return func(i, j *meta.Meta) int { return cmp.Compare(i.Zid, j.Zid) } } if keyType == meta.TypeTimestamp { return createSortTimestampFunc(key, so.descending) } if keyType == meta.TypeNumber { return createSortNumberFunc(key, so.descending) } return createSortStringFunc(key, so.descending) } func defaultMetaSort(i, j *meta.Meta) int { return cmp.Compare(j.Zid, i.Zid) } func createSortTimestampFunc(key string, descending bool) sortFunc { if descending { return func(i, j *meta.Meta) int { iVal, iOk := i.Get(key) jVal, jOk := j.Get(key) if result := compareFound(jOk, iOk); result != 0 { return result } return cmp.Compare(meta.ExpandTimestamp(jVal), meta.ExpandTimestamp(iVal)) } } return func(i, j *meta.Meta) int { iVal, iOk := i.Get(key) jVal, jOk := j.Get(key) if result := compareFound(iOk, jOk); result != 0 { return result } return cmp.Compare(meta.ExpandTimestamp(iVal), meta.ExpandTimestamp(jVal)) } } func createSortNumberFunc(key string, descending bool) sortFunc { if descending { return func(i, j *meta.Meta) int { iVal, iOk := getNum(i, key) jVal, jOk := getNum(j, key) if result := compareFound(jOk, iOk); result != 0 { return result } return cmp.Compare(jVal, iVal) } } return func(i, j *meta.Meta) int { iVal, iOk := getNum(i, key) jVal, jOk := getNum(j, key) if result := compareFound(iOk, jOk); result != 0 { return result } return cmp.Compare(iVal, jVal) } } func getNum(m *meta.Meta, key string) (int64, bool) { if s, ok := m.Get(key); ok { if i, err := strconv.ParseInt(s, 10, 64); err == nil { return i, true } } return 0, false } func createSortStringFunc(key string, descending bool) sortFunc { if descending { return func(i, j *meta.Meta) int { iVal, iOk := i.Get(key) jVal, jOk := j.Get(key) if result := compareFound(jOk, iOk); result != 0 { return result } return cmp.Compare(jVal, iVal) } } return func(i, j *meta.Meta) int { iVal, iOk := i.Get(key) jVal, jOk := j.Get(key) if result := compareFound(iOk, jOk); result != 0 { return result } return cmp.Compare(iVal, jVal) } } func compareFound(iOk, jOk bool) int { if iOk { if jOk { return 0 } return 1 } if jOk { return -1 } return 0 } |