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  }