github.com/matrixorigin/matrixone@v0.7.0/pkg/vectorize/sum/sum.go (about) 1 // Copyright 2021 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 sum 16 17 /* 18 #include "mo.h" 19 #cgo CFLAGS: -I../../../cgo 20 #cgo LDFLAGS: -L../../../cgo -lmo -lm 21 */ 22 import "C" 23 24 import ( 25 "unsafe" 26 27 "github.com/matrixorigin/matrixone/pkg/common/moerr" 28 "github.com/matrixorigin/matrixone/pkg/container/nulls" 29 "github.com/matrixorigin/matrixone/pkg/container/types" 30 "golang.org/x/exp/constraints" 31 ) 32 33 var ( 34 Int8Sum = signedSum[int8] 35 Int16Sum = signedSum[int16] 36 Int32Sum = signedSum[int32] 37 Int64Sum = signedSum[int64] 38 Int8SumSels = signedSumSels[int8] 39 Int16SumSels = signedSumSels[int16] 40 Int32SumSels = signedSumSels[int32] 41 Int64SumSels = signedSumSels[int64] 42 43 Uint8Sum = unsignedSum[uint8] 44 Uint16Sum = unsignedSum[uint16] 45 Uint32Sum = unsignedSum[uint32] 46 Uint64Sum = unsignedSum[uint64] 47 Uint8SumSels = unsignedSumSels[uint8] 48 Uint16SumSels = unsignedSumSels[uint16] 49 Uint32SumSels = unsignedSumSels[uint32] 50 Uint64SumSels = unsignedSumSels[uint64] 51 52 Float32Sum = floatSum[float32] 53 Float64Sum = floatSum[float64] 54 Float32SumSels = floatSumSels[float32] 55 Float64SumSels = floatSumSels[float64] 56 ) 57 58 func signedSum[T constraints.Signed](xs []T) int64 { 59 var res int64 60 61 for _, x := range xs { 62 res += int64(x) 63 } 64 return res 65 } 66 67 func signedSumSels[T constraints.Signed](xs []T, sels []int64) int64 { 68 var res int64 69 70 for _, sel := range sels { 71 res += int64(xs[sel]) 72 } 73 return res 74 } 75 76 func unsignedSum[T constraints.Unsigned](xs []T) uint64 { 77 var res uint64 78 79 for _, x := range xs { 80 res += uint64(x) 81 } 82 return res 83 } 84 85 func unsignedSumSels[T constraints.Unsigned](xs []T, sels []int64) uint64 { 86 var res uint64 87 88 for _, sel := range sels { 89 res += uint64(xs[sel]) 90 } 91 return res 92 } 93 94 func floatSum[T constraints.Float](xs []T) T { 95 var res T 96 97 for _, x := range xs { 98 res += x 99 } 100 return res 101 } 102 103 func floatSumSels[T constraints.Float](xs []T, sels []int64) T { 104 var res T 105 106 for _, sel := range sels { 107 res += xs[sel] 108 } 109 return res 110 } 111 112 func Decimal64Sum(rs, vs []types.Decimal64, start int64, count int64, vps []uint64, zs []int64, nsp *nulls.Nulls) error { 113 rc := C.Decimal64_VecSum((*C.int64_t)(unsafe.Pointer(&rs[0])), (*C.int64_t)(unsafe.Pointer(&vs[0])), 114 (C.int64_t)(start), (C.int64_t)(count), (*C.uint64_t)(&vps[0]), (*C.int64_t)(&zs[0]), (*C.uint64_t)(nulls.Ptr(nsp))) 115 if rc != 0 { 116 return moerr.NewOutOfRangeNoCtx("decimal64", "decimal SUM") 117 } 118 return nil 119 } 120 121 func Decimal64Sum128(rs []types.Decimal128, vs []types.Decimal64, start int64, count int64, vps []uint64, zs []int64, nsp *nulls.Nulls) error { 122 rc := C.Decimal64_VecSumToDecimal128((*C.int64_t)(unsafe.Pointer(&rs[0])), (*C.int64_t)(unsafe.Pointer(&vs[0])), 123 (C.int64_t)(start), (C.int64_t)(count), (*C.uint64_t)(&vps[0]), (*C.int64_t)(&zs[0]), (*C.uint64_t)(nulls.Ptr(nsp))) 124 if rc != 0 { 125 return moerr.NewOutOfRangeNoCtx("decimal128", "decimal SUM") 126 } 127 return nil 128 } 129 130 func Decimal128Sum(rs, vs []types.Decimal128, start int64, count int64, vps []uint64, zs []int64, nsp *nulls.Nulls) error { 131 rc := C.Decimal128_VecSum((*C.int64_t)(unsafe.Pointer(&rs[0])), (*C.int64_t)(unsafe.Pointer(&vs[0])), 132 (C.int64_t)(start), (C.int64_t)(count), (*C.uint64_t)(&vps[0]), (*C.int64_t)(&zs[0]), (*C.uint64_t)(nulls.Ptr(nsp))) 133 if rc != 0 { 134 return moerr.NewOutOfRangeNoCtx("decimal128", "decimal SUM") 135 } 136 return nil 137 } 138 139 /* 140 func VecSum(rs, vs []uint64, start int64, count int64, vps []uint64, zs []int64, nulls bitmap) { 141 for i := int64(0); i < count; i++ { 142 if vps[i] == 0 { 143 continue 144 } 145 if nulls.Contains(i + start) { 146 continue 147 } 148 rs[vps[i]-1] += vs[i+start] * zs[i+start] 149 } 150 } 151 152 func VecSumDecimal64(rs, vs []types.Decimal64, start int64, count int64, vps []uint64, zs []int64, nulls bitmap) 153 154 func VecSumDecimal64ToDecimal128(rs []types.Decimal128, vs []types.Decimal64, start int64, count int64, vps []uint64, zs []int64, nulls bitmap) 155 156 func VecSumDecimal128(rs, vs []types.Decimal128, start int64, count int64, vps []uint64, zs []int64, nulls bitmap) 157 */