github.com/matrixorigin/matrixone@v0.7.0/pkg/sql/plan/function/builtin/binary/timediff_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 binary
    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 TestTimeDiffInTime(t *testing.T) {
    29  	procs := testutil.NewProc()
    30  	cases := []struct {
    31  		name string
    32  		vecs []*vector.Vector
    33  		proc *process.Process
    34  		want *vector.Vector
    35  	}{
    36  		{
    37  			name: "TEST01",
    38  			vecs: makeTimeVectors("22:22:22", "11:11:11", procs.Mp()),
    39  			proc: testutil.NewProc(),
    40  			want: makeResultVector("11:11:11", procs),
    41  		},
    42  		{
    43  			name: "TEST02",
    44  			vecs: makeTimeVectors("22:22:22", "-11:11:11", procs.Mp()),
    45  			proc: testutil.NewProc(),
    46  			want: makeResultVector("33:33:33", procs),
    47  		},
    48  		{
    49  			name: "TEST03",
    50  			vecs: makeTimeVectors("-22:22:22", "11:11:11", procs.Mp()),
    51  			proc: testutil.NewProc(),
    52  			want: makeResultVector("-33:33:33", procs),
    53  		},
    54  		{
    55  			name: "TEST04",
    56  			vecs: makeTimeVectors("-22:22:22", "-11:11:11", procs.Mp()),
    57  			proc: testutil.NewProc(),
    58  			want: makeResultVector("-11:11:11", procs),
    59  		},
    60  		{
    61  			name: "TEST05",
    62  			vecs: makeTimeVectors("11:11:11", "22:22:22", procs.Mp()),
    63  			proc: testutil.NewProc(),
    64  			want: makeResultVector("-11:11:11", procs),
    65  		},
    66  		{
    67  			name: "TEST06",
    68  			vecs: makeTimeVectors("11:11:11", "-22:22:22", procs.Mp()),
    69  			proc: testutil.NewProc(),
    70  			want: makeResultVector("33:33:33", procs),
    71  		},
    72  		{
    73  			name: "TEST07",
    74  			vecs: makeTimeVectors("-11:11:11", "22:22:22", procs.Mp()),
    75  			proc: testutil.NewProc(),
    76  			want: makeResultVector("-33:33:33", procs),
    77  		},
    78  		{
    79  			name: "TEST08",
    80  			vecs: makeTimeVectors("-11:11:11", "-22:22:22", procs.Mp()),
    81  			proc: testutil.NewProc(),
    82  			want: makeResultVector("11:11:11", procs),
    83  		},
    84  		{
    85  			name: "TEST09",
    86  			vecs: makeTimeVectors("-2562047787:59:59", "-2562047787:59:59", procs.Mp()),
    87  			proc: testutil.NewProc(),
    88  			want: makeResultVector("00:00:00", procs),
    89  		},
    90  		{
    91  			name: "TEST10",
    92  			vecs: makeTimeVectors("2562047787:59:59", "2562047787:59:59", procs.Mp()),
    93  			proc: testutil.NewProc(),
    94  			want: makeResultVector("00:00:00", procs),
    95  		},
    96  	}
    97  
    98  	for _, c := range cases {
    99  		t.Run(c.name, func(t *testing.T) {
   100  			diff, err := TimeDiff[types.Time](c.vecs, c.proc)
   101  			if err != nil {
   102  				t.Fatal(err)
   103  			}
   104  			require.Equal(t, c.want.Col, diff.Col)
   105  		})
   106  	}
   107  }
   108  
   109  func TestTimeDiffInDateTime(t *testing.T) {
   110  	procs := testutil.NewProc()
   111  	cases := []struct {
   112  		name string
   113  		vecs []*vector.Vector
   114  		proc *process.Process
   115  		want *vector.Vector
   116  	}{
   117  		{
   118  			name: "TEST01",
   119  			vecs: makeDateTimeVectors("2012-12-12 22:22:22", "2012-12-12 11:11:11", procs.Mp()),
   120  			proc: testutil.NewProc(),
   121  			want: makeResultVector("11:11:11", procs),
   122  		},
   123  		{
   124  			name: "TEST02",
   125  			vecs: makeDateTimeVectors("2012-12-12 11:11:11", "2012-12-12 22:22:22", procs.Mp()),
   126  			proc: testutil.NewProc(),
   127  			want: makeResultVector("-11:11:11", procs),
   128  		},
   129  		{
   130  			name: "TEST03",
   131  			vecs: makeDateTimeVectors("2012-12-12 22:22:22", "2000-12-12 11:11:11", procs.Mp()),
   132  			proc: testutil.NewProc(),
   133  			want: makeResultVector("105203:11:11", procs),
   134  		},
   135  		{
   136  			name: "TEST04",
   137  			vecs: makeDateTimeVectors("2000-12-12 11:11:11", "2012-12-12 22:22:22", procs.Mp()),
   138  			proc: testutil.NewProc(),
   139  			want: makeResultVector("-105203:11:11", procs),
   140  		},
   141  		{
   142  			name: "TEST05",
   143  			vecs: makeDateTimeVectors("2012-12-12 22:22:22", "2012-10-10 11:11:11", procs.Mp()),
   144  			proc: testutil.NewProc(),
   145  			want: makeResultVector("1523:11:11", procs),
   146  		},
   147  		{
   148  			name: "TEST06",
   149  			vecs: makeDateTimeVectors("2012-10-10 11:11:11", "2012-12-12 22:22:22", procs.Mp()),
   150  			proc: testutil.NewProc(),
   151  			want: makeResultVector("-1523:11:11", procs),
   152  		},
   153  		{
   154  			name: "TEST07",
   155  			vecs: makeDateTimeVectors("2012-12-12 22:22:22", "2012-12-10 11:11:11", procs.Mp()),
   156  			proc: testutil.NewProc(),
   157  			want: makeResultVector("59:11:11", procs),
   158  		},
   159  		{
   160  			name: "TEST08",
   161  			vecs: makeDateTimeVectors("2012-12-10 11:11:11", "2012-12-12 22:22:22", procs.Mp()),
   162  			proc: testutil.NewProc(),
   163  			want: makeResultVector("-59:11:11", procs),
   164  		},
   165  		{
   166  			name: "TEST09",
   167  			vecs: makeDateTimeVectors("2012-12-10 11:11:11", "2012-12-10 11:11:11", procs.Mp()),
   168  			proc: testutil.NewProc(),
   169  			want: makeResultVector("00:00:00", procs),
   170  		},
   171  	}
   172  
   173  	for _, c := range cases {
   174  		t.Run(c.name, func(t *testing.T) {
   175  			diff, err := TimeDiff[types.Datetime](c.vecs, c.proc)
   176  			if err != nil {
   177  				t.Fatal(err)
   178  			}
   179  			require.Equal(t, c.want.Col, diff.Col)
   180  		})
   181  	}
   182  }
   183  
   184  func makeDateTimeVectors(firstStr, secondStr string, mp *mpool.MPool) []*vector.Vector {
   185  	vec := make([]*vector.Vector, 2)
   186  
   187  	firstDate, _ := types.ParseDatetime(firstStr, 0)
   188  	secondDate, _ := types.ParseDatetime(secondStr, 0)
   189  
   190  	vec[0] = vector.NewConstFixed(types.T_datetime.ToType(), 1, firstDate, mp)
   191  	vec[1] = vector.NewConstFixed(types.T_datetime.ToType(), 1, secondDate, mp)
   192  	return vec
   193  }
   194  
   195  func makeTimeVectors(firstStr, secondStr string, mp *mpool.MPool) []*vector.Vector {
   196  	vec := make([]*vector.Vector, 2)
   197  
   198  	firstDate, _ := types.ParseTime(firstStr, 0)
   199  	secondDate, _ := types.ParseTime(secondStr, 0)
   200  
   201  	vec[0] = vector.NewConstFixed(types.T_time.ToType(), 1, firstDate, mp)
   202  	vec[1] = vector.NewConstFixed(types.T_time.ToType(), 1, secondDate, mp)
   203  	return vec
   204  }
   205  
   206  func makeResultVector(res string, proc *process.Process) *vector.Vector {
   207  
   208  	resData, _ := types.ParseTime(res, 0)
   209  	return vector.NewConstFixed(types.T_time.ToType(), 1, resData, proc.Mp())
   210  }