github.com/matrixorigin/matrixone@v0.7.0/pkg/compare/compare.go (about) 1 // Copyright 2021 - 2022 Matrix Origin 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package compare 16 17 import ( 18 "bytes" 19 20 "github.com/matrixorigin/matrixone/pkg/container/nulls" 21 "github.com/matrixorigin/matrixone/pkg/container/types" 22 "github.com/matrixorigin/matrixone/pkg/container/vector" 23 "github.com/matrixorigin/matrixone/pkg/vm/process" 24 ) 25 26 func New(typ types.Type, desc, nullsLast bool) Compare { 27 switch typ.Oid { 28 case types.T_bool: 29 if desc { 30 return newCompare(boolDescCompare, boolCopy[bool], nullsLast) 31 } 32 return newCompare(boolAscCompare, boolCopy[bool], nullsLast) 33 case types.T_int8: 34 if desc { 35 return newCompare(genericDescCompare[int8], genericCopy[int8], nullsLast) 36 } 37 return newCompare(genericAscCompare[int8], genericCopy[int8], nullsLast) 38 case types.T_int16: 39 if desc { 40 return newCompare(genericDescCompare[int16], genericCopy[int16], nullsLast) 41 } 42 return newCompare(genericAscCompare[int16], genericCopy[int16], nullsLast) 43 case types.T_int32: 44 if desc { 45 return newCompare(genericDescCompare[int32], genericCopy[int32], nullsLast) 46 } 47 return newCompare(genericAscCompare[int32], genericCopy[int32], nullsLast) 48 case types.T_int64: 49 if desc { 50 return newCompare(genericDescCompare[int64], genericCopy[int64], nullsLast) 51 } 52 return newCompare(genericAscCompare[int64], genericCopy[int64], nullsLast) 53 case types.T_uint8: 54 if desc { 55 return newCompare(genericDescCompare[uint8], genericCopy[uint8], nullsLast) 56 } 57 return newCompare(genericAscCompare[uint8], genericCopy[uint8], nullsLast) 58 case types.T_uint16: 59 if desc { 60 return newCompare(genericDescCompare[uint16], genericCopy[uint16], nullsLast) 61 } 62 return newCompare(genericAscCompare[uint16], genericCopy[uint16], nullsLast) 63 case types.T_uint32: 64 if desc { 65 return newCompare(genericDescCompare[uint32], genericCopy[uint32], nullsLast) 66 } 67 return newCompare(genericAscCompare[uint32], genericCopy[uint32], nullsLast) 68 case types.T_uint64: 69 if desc { 70 return newCompare(genericDescCompare[uint64], genericCopy[uint64], nullsLast) 71 } 72 return newCompare(genericAscCompare[uint64], genericCopy[uint64], nullsLast) 73 case types.T_float32: 74 if desc { 75 return newCompare(genericDescCompare[float32], genericCopy[float32], nullsLast) 76 } 77 return newCompare(genericAscCompare[float32], genericCopy[float32], nullsLast) 78 case types.T_float64: 79 if desc { 80 return newCompare(genericDescCompare[float64], genericCopy[float64], nullsLast) 81 } 82 return newCompare(genericAscCompare[float64], genericCopy[float64], nullsLast) 83 case types.T_date: 84 if desc { 85 return newCompare(genericDescCompare[types.Date], genericCopy[types.Date], nullsLast) 86 } 87 return newCompare(genericAscCompare[types.Date], genericCopy[types.Date], nullsLast) 88 case types.T_datetime: 89 if desc { 90 return newCompare(genericDescCompare[types.Datetime], genericCopy[types.Datetime], nullsLast) 91 } 92 return newCompare(genericAscCompare[types.Datetime], genericCopy[types.Datetime], nullsLast) 93 case types.T_time: 94 if desc { 95 return newCompare(genericDescCompare[types.Time], genericCopy[types.Time], nullsLast) 96 } 97 return newCompare(genericAscCompare[types.Time], genericCopy[types.Time], nullsLast) 98 case types.T_timestamp: 99 if desc { 100 return newCompare(genericDescCompare[types.Timestamp], genericCopy[types.Timestamp], nullsLast) 101 } 102 return newCompare(genericAscCompare[types.Timestamp], genericCopy[types.Timestamp], nullsLast) 103 case types.T_decimal64: 104 if desc { 105 return newCompare(decimal64DescCompare, decimal64Copy, nullsLast) 106 } 107 return newCompare(decimal64AscCompare, decimal64Copy, nullsLast) 108 case types.T_decimal128: 109 if desc { 110 return newCompare(decimal128DescCompare, decimal128Copy, nullsLast) 111 } 112 return newCompare(decimal128AscCompare, decimal128Copy, nullsLast) 113 case types.T_TS: 114 if desc { 115 return newCompare(txntsDescCompare, txntsCopy, nullsLast) 116 } 117 return newCompare(txntsAscCompare, txntsCopy, nullsLast) 118 case types.T_Rowid: 119 if desc { 120 return newCompare(rowidDescCompare, rowidCopy, nullsLast) 121 } 122 return newCompare(rowidAscCompare, rowidCopy, nullsLast) 123 case types.T_uuid: 124 if desc { 125 return newCompare(uuidDescCompare, uuidCopy, nullsLast) 126 } 127 return newCompare(uuidAscCompare, uuidCopy, nullsLast) 128 case types.T_char, types.T_varchar, types.T_blob, types.T_json, types.T_text: 129 return &strCompare{ 130 desc: desc, 131 nullsLast: nullsLast, 132 vs: make([]*vector.Vector, 2), 133 } 134 } 135 return nil 136 } 137 138 func boolAscCompare(x, y bool) int { 139 if x == y { 140 return 0 141 } 142 if !x && y { 143 return -1 144 } 145 return 1 146 } 147 148 func decimal64AscCompare(x, y types.Decimal64) int { 149 return x.Compare(y) 150 } 151 func decimal128AscCompare(x, y types.Decimal128) int { 152 return x.Compare(y) 153 } 154 155 func uuidAscCompare(x, y types.Uuid) int { 156 return x.Compare(y) 157 } 158 159 func txntsAscCompare(x, y types.TS) int { 160 return bytes.Compare(x[:], y[:]) 161 } 162 func rowidAscCompare(x, y types.Rowid) int { 163 return bytes.Compare(x[:], x[:]) 164 } 165 166 func genericAscCompare[T types.OrderedT](x, y T) int { 167 if x == y { 168 return 0 169 } 170 if x < y { 171 return -1 172 } 173 return 1 174 } 175 176 func boolDescCompare(x, y bool) int { 177 if x == y { 178 return 0 179 } 180 if !x && y { 181 return 1 182 } 183 return -1 184 } 185 186 func decimal64DescCompare(x, y types.Decimal64) int { 187 return -x.Compare(y) 188 } 189 func decimal128DescCompare(x, y types.Decimal128) int { 190 return -x.Compare(y) 191 } 192 193 func uuidDescCompare(x, y types.Uuid) int { 194 return -x.Compare(y) 195 } 196 197 func txntsDescCompare(x, y types.TS) int { 198 return bytes.Compare(y[:], x[:]) 199 } 200 func rowidDescCompare(x, y types.Rowid) int { 201 return bytes.Compare(y[:], x[:]) 202 } 203 204 func genericDescCompare[T types.OrderedT](x, y T) int { 205 if x == y { 206 return 0 207 } 208 if x < y { 209 return 1 210 } 211 return -1 212 } 213 214 func boolCopy[T bool](vecDst, vecSrc []T, dst, src int64) { 215 vecDst[dst] = vecSrc[src] 216 } 217 218 func decimal64Copy(vecDst, vecSrc []types.Decimal64, dst, src int64) { 219 vecDst[dst] = vecSrc[src] 220 } 221 222 func decimal128Copy(vecDst, vecSrc []types.Decimal128, dst, src int64) { 223 vecDst[dst] = vecSrc[src] 224 } 225 226 func uuidCopy(vecDst, vecSrc []types.Uuid, dst, src int64) { 227 vecDst[dst] = vecSrc[src] 228 } 229 230 func txntsCopy(vecDst, vecSrc []types.TS, dst, src int64) { 231 vecDst[dst] = vecSrc[src] 232 } 233 func rowidCopy(vecDst, vecSrc []types.Rowid, dst, src int64) { 234 vecDst[dst] = vecSrc[src] 235 } 236 237 func genericCopy[T types.OrderedT](vecDst, vecSrc []T, dst, src int64) { 238 vecDst[dst] = vecSrc[src] 239 } 240 241 func newCompare[T any](cmp func(T, T) int, cpy func([]T, []T, int64, int64), nullsLast bool) *compare[T] { 242 return &compare[T]{ 243 cmp: cmp, 244 cpy: cpy, 245 xs: make([][]T, 2), 246 ns: make([]*nulls.Nulls, 2), 247 vs: make([]*vector.Vector, 2), 248 nullsLast: nullsLast, 249 } 250 } 251 252 func (c *compare[T]) Vector() *vector.Vector { 253 return c.vs[0] 254 } 255 256 func (c *compare[T]) Set(idx int, vec *vector.Vector) { 257 c.vs[idx] = vec 258 c.ns[idx] = vec.Nsp 259 c.xs[idx] = vec.Col.([]T) 260 } 261 262 func (c *compare[T]) Compare(veci, vecj int, vi, vj int64) int { 263 cmp := nullsCompare(c.ns[veci], c.ns[vecj], vi, vj, c.nullsLast) 264 if cmp != 0 { 265 return cmp 266 } 267 if nulls.Contains(c.vs[veci].Nsp, uint64(vi)) && nulls.Contains(c.vs[veci].Nsp, uint64(vj)) { 268 return 0 269 } 270 return c.cmp(c.xs[veci][vi], c.xs[vecj][vj]) 271 } 272 273 func (c *compare[T]) Copy(vecSrc, vecDst int, src, dst int64, _ *process.Process) error { 274 if nulls.Contains(c.ns[vecSrc], uint64(src)) { 275 nulls.Add(c.ns[vecDst], uint64(dst)) 276 } else { 277 nulls.Del(c.ns[vecDst], uint64(dst)) 278 c.cpy(c.xs[vecDst], c.xs[vecSrc], dst, src) 279 } 280 return nil 281 }