github.com/matrixorigin/matrixone@v0.7.0/pkg/vectorize/extract/extract.go (about) 1 // Copyright 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 extract 16 17 import ( 18 "fmt" 19 20 "github.com/matrixorigin/matrixone/pkg/common/moerr" 21 "github.com/matrixorigin/matrixone/pkg/container/types" 22 ) 23 24 //func extractFromDate() 25 26 var validDateUnit = map[string]struct{}{ 27 "year": {}, 28 "month": {}, 29 "day": {}, 30 "year_month": {}, 31 "quarter": {}, 32 } 33 34 var validDatetimeUnit = map[string]struct{}{ 35 "microsecond": {}, 36 "second": {}, 37 "minute": {}, 38 "hour": {}, 39 "day": {}, 40 "week": {}, 41 "month": {}, 42 "quarter": {}, 43 "year": {}, 44 "second_microsecond": {}, 45 "minute_microsecond": {}, 46 "minute_second": {}, 47 "hour_microsecond": {}, 48 "hour_second": {}, 49 "hour_minute": {}, 50 "day_microsecond": {}, 51 "day_second": {}, 52 "day_minute": {}, 53 "day_hour": {}, 54 "year_month": {}, 55 } 56 57 var validTimeUnit = map[string]struct{}{ 58 "microsecond": {}, 59 "second": {}, 60 "minute": {}, 61 "hour": {}, 62 } 63 64 func ExtractFromOneDate(unit string, date types.Date) uint32 { 65 switch unit { 66 case "day": 67 return uint32(date.Day()) 68 case "week": 69 return uint32(date.WeekOfYear2()) 70 case "month": 71 return uint32(date.Month()) 72 case "quarter": 73 return date.Quarter() 74 case "year": 75 return uint32(date.Year()) 76 case "year_month": 77 return date.YearMonth() 78 default: 79 return 0 80 } 81 } 82 83 func ExtractFromDate(unit string, dates []types.Date, results []uint32) ([]uint32, error) { 84 if _, ok := validDateUnit[unit]; !ok { 85 return []uint32{}, moerr.NewInternalErrorNoCtx("invalid unit") 86 } 87 switch unit { 88 case "day": 89 for i, d := range dates { 90 results[i] = uint32(d.Day()) 91 } 92 case "week": 93 for i, d := range dates { 94 results[i] = uint32(d.WeekOfYear2()) 95 } 96 case "month": 97 for i, d := range dates { 98 results[i] = uint32(d.Month()) 99 } 100 case "quarter": 101 for i, d := range dates { 102 results[i] = d.Quarter() 103 } 104 case "year_month": 105 for i, d := range dates { 106 results[i] = d.YearMonth() 107 } 108 case "year": 109 for i, d := range dates { 110 results[i] = uint32(d.Year()) 111 } 112 } 113 return results, nil 114 } 115 116 func ExtractFromDatetime(unit string, datetimes []types.Datetime, results []string) ([]string, error) { 117 if _, ok := validDatetimeUnit[unit]; !ok { 118 return nil, moerr.NewInternalErrorNoCtx("invalid unit") 119 } 120 switch unit { 121 case "microsecond": 122 for i, d := range datetimes { 123 value := fmt.Sprintf("%d", int(d.MicroSec())) 124 results[i] = value 125 } 126 case "second": 127 for i, d := range datetimes { 128 value := fmt.Sprintf("%02d", int(d.Sec())) 129 results[i] = value 130 } 131 case "minute": 132 for i, d := range datetimes { 133 value := fmt.Sprintf("%02d", int(d.Minute())) 134 results[i] = value 135 } 136 case "hour": 137 for i, d := range datetimes { 138 value := fmt.Sprintf("%02d", int(d.Hour())) 139 results[i] = value 140 } 141 case "day": 142 for i, d := range datetimes { 143 value := fmt.Sprintf("%02d", int(d.ToDate().Day())) 144 results[i] = value 145 } 146 case "week": 147 for i, d := range datetimes { 148 value := fmt.Sprintf("%02d", int(d.ToDate().WeekOfYear2())) 149 results[i] = value 150 } 151 case "month": 152 for i, d := range datetimes { 153 value := fmt.Sprintf("%02d", int(d.ToDate().Month())) 154 results[i] = value 155 } 156 case "quarter": 157 for i, d := range datetimes { 158 value := fmt.Sprintf("%d", int(d.ToDate().Quarter())) 159 results[i] = value 160 } 161 case "year": 162 for i, dt := range datetimes { 163 value := fmt.Sprintf("%04d", int(dt.ToDate().Year())) 164 results[i] = value 165 } 166 case "second_microsecond": 167 for i, dt := range datetimes { 168 value := dt.SecondMicrosecondStr() 169 results[i] = value 170 } 171 case "minute_microsecond": 172 for i, dt := range datetimes { 173 value := dt.MinuteMicrosecondStr() 174 results[i] = value 175 } 176 case "minute_second": 177 for i, dt := range datetimes { 178 value := dt.MinuteSecondStr() 179 results[i] = value 180 } 181 case "hour_microsecond": 182 for i, dt := range datetimes { 183 value := dt.HourMicrosecondStr() 184 results[i] = value 185 } 186 case "hour_second": 187 for i, dt := range datetimes { 188 value := dt.HourSecondStr() 189 results[i] = value 190 } 191 case "hour_minute": 192 for i, dt := range datetimes { 193 value := dt.HourMinuteStr() 194 results[i] = value 195 } 196 case "day_microsecond": 197 for i, dt := range datetimes { 198 value := dt.DayMicrosecondStr() 199 results[i] = value 200 } 201 case "day_second": 202 for i, dt := range datetimes { 203 value := dt.DaySecondStr() 204 results[i] = value 205 } 206 case "day_minute": 207 for i, dt := range datetimes { 208 value := dt.DayMinuteStr() 209 results[i] = value 210 } 211 case "day_hour": 212 for i, dt := range datetimes { 213 value := dt.DayHourStr() 214 results[i] = value 215 } 216 case "year_month": 217 for i, d := range datetimes { 218 value := d.ToDate().YearMonthStr() 219 results[i] = value 220 } 221 } 222 return results, nil 223 } 224 225 func ExtractFromTime(unit string, times []types.Time, results []string) ([]string, error) { 226 if _, ok := validTimeUnit[unit]; !ok { 227 return []string{}, moerr.NewInternalErrorNoCtx("invalid unit") 228 } 229 switch unit { 230 case "microsecond": 231 for i, t := range times { 232 value := fmt.Sprintf("%d", int(t)) 233 results[i] = value 234 } 235 case "second": 236 for i, t := range times { 237 value := fmt.Sprintf("%02d", int(t.Sec())) 238 results[i] = value 239 } 240 case "minute": 241 for i, t := range times { 242 value := fmt.Sprintf("%02d", int(t.Minute())) 243 results[i] = value 244 } 245 case "hour": 246 for i, t := range times { 247 value := fmt.Sprintf("%02d", int(t.Hour())) 248 results[i] = value 249 } 250 } 251 return results, nil 252 }