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  }