github.com/matrixorigin/matrixone@v0.7.0/pkg/sql/plan/function/builtin/multi/timestampdiff_test.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 multi
    16  
    17  import (
    18  	"testing"
    19  
    20  	"github.com/matrixorigin/matrixone/pkg/common/mpool"
    21  	"github.com/matrixorigin/matrixone/pkg/container/types"
    22  	"github.com/matrixorigin/matrixone/pkg/container/vector"
    23  	"github.com/matrixorigin/matrixone/pkg/testutil"
    24  	"github.com/matrixorigin/matrixone/pkg/vm/process"
    25  	"github.com/stretchr/testify/require"
    26  )
    27  
    28  func TestDateDiff(t *testing.T) {
    29  	cases := []struct {
    30  		name string
    31  		vecs []*vector.Vector
    32  		proc *process.Process
    33  		want int64
    34  	}{
    35  		{
    36  			name: "TEST01",
    37  			vecs: makeTimeStampDiffVectors("2017-12-01 12:15:12", "2018-01-01 7:18:20", "microsecond", proc.Mp()),
    38  			proc: testutil.NewProc(),
    39  			want: 2660588000000,
    40  		},
    41  		{
    42  			name: "TEST02",
    43  			vecs: makeTimeStampDiffVectors("2017-12-01 12:15:12", "2018-01-01 7:18:20", "second", proc.Mp()),
    44  			proc: testutil.NewProc(),
    45  			want: 2660588,
    46  		},
    47  		{
    48  			name: "TEST03",
    49  			vecs: makeTimeStampDiffVectors("2017-12-01 12:15:12", "2018-01-01 7:18:20", "minute", proc.Mp()),
    50  			proc: testutil.NewProc(),
    51  			want: 44343,
    52  		},
    53  		{
    54  			name: "TEST04",
    55  			vecs: makeTimeStampDiffVectors("2017-12-01 12:15:12", "2018-01-01 7:18:20", "hour", proc.Mp()),
    56  			proc: testutil.NewProc(),
    57  			want: 739,
    58  		},
    59  		{
    60  			name: "TEST05",
    61  			vecs: makeTimeStampDiffVectors("2017-12-01 12:15:12", "2018-01-01 7:18:20", "day", proc.Mp()),
    62  			proc: testutil.NewProc(),
    63  			want: 30,
    64  		},
    65  		{
    66  			name: "TEST06",
    67  			vecs: makeTimeStampDiffVectors("2017-12-01 12:15:12", "2018-01-08 12:15:12", "week", proc.Mp()),
    68  			proc: testutil.NewProc(),
    69  			want: 5,
    70  		},
    71  		{
    72  			name: "TEST07",
    73  			vecs: makeTimeStampDiffVectors("2017-11-01 12:15:12", "2018-01-01 12:15:12", "month", proc.Mp()),
    74  			proc: testutil.NewProc(),
    75  			want: 2,
    76  		},
    77  		{
    78  			name: "TEST08",
    79  			vecs: makeTimeStampDiffVectors("2017-01-01 12:15:12", "2018-01-01 12:15:12", "quarter", proc.Mp()),
    80  			proc: testutil.NewProc(),
    81  			want: 4,
    82  		},
    83  		{
    84  			name: "TEST09",
    85  			vecs: makeTimeStampDiffVectors("2017-01-01 12:15:12", "2018-01-01 12:15:12", "year", proc.Mp()),
    86  			proc: testutil.NewProc(),
    87  			want: 1,
    88  		},
    89  		{
    90  			name: "TEST10",
    91  			vecs: makeTimeStampDiffReverseVectors("2017-12-01 12:15:12", "2018-01-01 7:18:20", "microsecond", proc.Mp()),
    92  			proc: testutil.NewProc(),
    93  			want: -2660588000000,
    94  		},
    95  		{
    96  			name: "TEST11",
    97  			vecs: makeTimeStampDiffReverseVectors("2017-12-01 12:15:12", "2018-01-01 7:18:20", "second", proc.Mp()),
    98  			proc: testutil.NewProc(),
    99  			want: -2660588,
   100  		},
   101  		{
   102  			name: "TEST12",
   103  			vecs: makeTimeStampDiffReverseVectors("2017-12-01 12:15:12", "2018-01-01 7:18:20", "minute", proc.Mp()),
   104  			proc: testutil.NewProc(),
   105  			want: -44343,
   106  		},
   107  		{
   108  			name: "TEST13",
   109  			vecs: makeTimeStampDiffReverseVectors("2017-12-01 12:15:12", "2018-01-01 7:18:20", "hour", proc.Mp()),
   110  			proc: testutil.NewProc(),
   111  			want: -739,
   112  		},
   113  		{
   114  			name: "TEST14",
   115  			vecs: makeTimeStampDiffReverseVectors("2017-12-01 12:15:12", "2018-01-01 7:18:20", "day", proc.Mp()),
   116  			proc: testutil.NewProc(),
   117  			want: -30,
   118  		},
   119  		{
   120  			name: "TEST15",
   121  			vecs: makeTimeStampDiffReverseVectors("2017-12-01 12:15:12", "2018-01-08 12:15:12", "week", proc.Mp()),
   122  			proc: testutil.NewProc(),
   123  			want: -5,
   124  		},
   125  		{
   126  			name: "TEST16",
   127  			vecs: makeTimeStampDiffReverseVectors("2017-11-01 12:15:12", "2018-01-01 12:15:12", "month", proc.Mp()),
   128  			proc: testutil.NewProc(),
   129  			want: -2,
   130  		},
   131  		{
   132  			name: "TEST17",
   133  			vecs: makeTimeStampDiffReverseVectors("2017-01-01 12:15:12", "2018-01-01 12:15:12", "quarter", proc.Mp()),
   134  			proc: testutil.NewProc(),
   135  			want: -4,
   136  		},
   137  		{
   138  			name: "TEST18",
   139  			vecs: makeTimeStampDiffReverseVectors("2017-01-01 12:15:12", "2018-01-01 12:15:12", "year", proc.Mp()),
   140  			proc: testutil.NewProc(),
   141  			want: -1,
   142  		},
   143  	}
   144  
   145  	for _, c := range cases {
   146  		t.Run(c.name, func(t *testing.T) {
   147  			date, err := TimeStampDiff(c.vecs, c.proc)
   148  			if err != nil {
   149  				t.Fatal(err)
   150  			}
   151  			require.Equal(t, c.want, date.Col.([]int64)[0])
   152  		})
   153  	}
   154  }
   155  
   156  func makeTimeStampDiffVectors(firstStr, secondStr, unit string, mp *mpool.MPool) []*vector.Vector {
   157  	vec := make([]*vector.Vector, 3)
   158  
   159  	firstDate, _ := types.ParseDatetime(firstStr, 0)
   160  	secondDate, _ := types.ParseDatetime(secondStr, 0)
   161  
   162  	vec[1] = vector.NewConstFixed(types.T_datetime.ToType(), 1, firstDate, mp)
   163  	vec[2] = vector.NewConstFixed(types.T_datetime.ToType(), 1, secondDate, mp)
   164  	vec[0] = vector.NewConstString(types.T_varchar.ToType(), 1, unit, mp)
   165  	return vec
   166  }
   167  
   168  func makeTimeStampDiffReverseVectors(firstStr, secondStr, unit string, mp *mpool.MPool) []*vector.Vector {
   169  	vec := make([]*vector.Vector, 3)
   170  
   171  	firstDate, _ := types.ParseDatetime(firstStr, 0)
   172  	secondDate, _ := types.ParseDatetime(secondStr, 0)
   173  
   174  	vec[1] = vector.NewConstFixed(types.T_datetime.ToType(), 1, secondDate, mp)
   175  	vec[2] = vector.NewConstFixed(types.T_datetime.ToType(), 1, firstDate, mp)
   176  	vec[0] = vector.NewConstString(types.T_varchar.ToType(), 1, unit, mp)
   177  	return vec
   178  }