2011-10-16 04:17:41 +00:00
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include <DB/DataTypes/DataTypesNumberFixed.h>
|
|
|
|
|
#include <DB/DataTypes/DataTypeDate.h>
|
|
|
|
|
#include <DB/DataTypes/DataTypeDateTime.h>
|
2012-09-03 04:45:46 +00:00
|
|
|
|
#include <DB/DataTypes/DataTypeArray.h>
|
2015-06-30 14:02:47 +00:00
|
|
|
|
#include <DB/DataTypes/DataTypeString.h>
|
2012-09-03 04:45:46 +00:00
|
|
|
|
|
2011-10-16 04:17:41 +00:00
|
|
|
|
#include <DB/Columns/ColumnConst.h>
|
2012-09-03 04:45:46 +00:00
|
|
|
|
#include <DB/Columns/ColumnArray.h>
|
2015-07-02 13:35:28 +00:00
|
|
|
|
#include <DB/Columns/ColumnFixedString.h>
|
2012-09-03 04:45:46 +00:00
|
|
|
|
|
2011-10-16 04:17:41 +00:00
|
|
|
|
#include <DB/Functions/IFunction.h>
|
|
|
|
|
|
2015-06-30 15:03:22 +00:00
|
|
|
|
#include <type_traits>
|
2011-10-16 04:17:41 +00:00
|
|
|
|
|
|
|
|
|
namespace DB
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
/** Функции работы с датой и временем.
|
|
|
|
|
*
|
|
|
|
|
* toYear, toMonth, toDayOfMonth, toDayOfWeek, toHour, toMinute, toSecond,
|
2015-06-03 14:27:03 +00:00
|
|
|
|
* toMonday, toStartOfMonth, toStartOfYear, toStartOfMinute, toStartOfFiveMinute
|
|
|
|
|
* toStartOfHour, toTime,
|
2012-08-31 20:38:05 +00:00
|
|
|
|
* now
|
|
|
|
|
* TODO: makeDate, makeDateTime
|
2014-06-26 00:58:14 +00:00
|
|
|
|
*
|
2011-10-16 04:17:41 +00:00
|
|
|
|
* (toDate - расположена в файле FunctionsConversion.h)
|
|
|
|
|
*
|
|
|
|
|
* Возвращаемые типы:
|
|
|
|
|
* toYear -> UInt16
|
|
|
|
|
* toMonth, toDayOfMonth, toDayOfWeek, toHour, toMinute, toSecond -> UInt8
|
2012-08-31 20:38:05 +00:00
|
|
|
|
* toMonday, toStartOfMonth, toStartOfYear -> Date
|
|
|
|
|
* toStartOfMinute, toStartOfHour, toTime, now -> DateTime
|
2012-09-03 04:45:46 +00:00
|
|
|
|
*
|
|
|
|
|
* А также:
|
|
|
|
|
*
|
|
|
|
|
* timeSlot(EventTime)
|
|
|
|
|
* - округляет время до получаса.
|
2014-06-26 00:58:14 +00:00
|
|
|
|
*
|
2012-09-03 04:45:46 +00:00
|
|
|
|
* timeSlots(StartTime, Duration)
|
|
|
|
|
* - для интервала времени, начинающегося в StartTime и продолжающегося Duration секунд,
|
|
|
|
|
* возвращает массив моментов времени, состоящий из округлений вниз до получаса точек из этого интервала.
|
|
|
|
|
* Например, timeSlots(toDateTime('2012-01-01 12:20:00'), 600) = [toDateTime('2012-01-01 12:00:00'), toDateTime('2012-01-01 12:30:00')].
|
|
|
|
|
* Это нужно для поиска хитов, входящих в соответствующий визит.
|
2011-10-16 04:17:41 +00:00
|
|
|
|
*/
|
|
|
|
|
|
2012-09-03 04:45:46 +00:00
|
|
|
|
|
|
|
|
|
#define TIME_SLOT_SIZE 1800
|
|
|
|
|
|
2015-11-29 11:58:44 +00:00
|
|
|
|
/** Всевозможные преобразования.
|
|
|
|
|
* Представляют собой две функции - от даты-с-временем (UInt32) и от даты (UInt16).
|
|
|
|
|
*
|
|
|
|
|
* Также для преобразования T определяется "фактор-преобразование" F.
|
|
|
|
|
* Это такое преобразование F, что его значение идентифицирует область монотонности T
|
|
|
|
|
* (при фиксированном значении F, преобразование T является монотонным).
|
|
|
|
|
*
|
|
|
|
|
* Или, образно, если T аналогично взятию остатка от деления, то F аналогично делению.
|
|
|
|
|
*
|
|
|
|
|
* Пример: для преобразования T "получить номер дня в месяце" (2015-02-03 -> 3),
|
|
|
|
|
* фактор-преобразованием F является "округлить до месяца" (2015-02-03 -> 2015-02-01).
|
|
|
|
|
*/
|
2012-09-03 04:45:46 +00:00
|
|
|
|
|
2015-11-29 11:58:44 +00:00
|
|
|
|
/// Это фактор-преобразование будет говорить, что функция монотонна всюду.
|
|
|
|
|
struct ZeroTransform
|
2011-10-16 04:17:41 +00:00
|
|
|
|
{
|
2015-11-29 11:58:44 +00:00
|
|
|
|
static inline UInt16 execute(UInt32 t, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut) { return 0; }
|
|
|
|
|
static inline UInt16 execute(UInt16 d, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut) { return 0; }
|
2011-10-16 04:17:41 +00:00
|
|
|
|
};
|
|
|
|
|
|
2015-11-29 11:58:44 +00:00
|
|
|
|
struct ToDateImpl
|
2011-10-16 04:17:41 +00:00
|
|
|
|
{
|
2015-11-29 11:58:44 +00:00
|
|
|
|
static inline UInt8 execute(UInt32 t, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut)
|
2011-10-16 04:17:41 +00:00
|
|
|
|
{
|
2015-11-29 11:58:44 +00:00
|
|
|
|
return remote_date_lut.toDate(t);
|
2011-10-16 04:17:41 +00:00
|
|
|
|
}
|
2015-07-07 23:11:30 +00:00
|
|
|
|
static inline UInt8 execute(UInt16 d, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut)
|
2011-10-16 04:17:41 +00:00
|
|
|
|
{
|
2015-11-29 11:58:44 +00:00
|
|
|
|
return d;
|
2011-10-16 04:17:41 +00:00
|
|
|
|
}
|
2015-11-29 11:58:44 +00:00
|
|
|
|
|
|
|
|
|
using FactorTransform = ZeroTransform;
|
2011-10-16 04:17:41 +00:00
|
|
|
|
};
|
|
|
|
|
|
2015-11-29 11:58:44 +00:00
|
|
|
|
struct ToMondayImpl
|
2011-10-16 04:17:41 +00:00
|
|
|
|
{
|
2015-11-29 11:58:44 +00:00
|
|
|
|
static inline UInt16 execute(UInt32 t, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut)
|
2011-10-16 04:17:41 +00:00
|
|
|
|
{
|
2015-11-29 11:58:44 +00:00
|
|
|
|
return remote_date_lut.toFirstDayNumOfWeek(remote_date_lut.toDayNum(t));
|
|
|
|
|
}
|
|
|
|
|
static inline UInt16 execute(UInt16 d, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut)
|
|
|
|
|
{
|
|
|
|
|
return remote_date_lut.toFirstDayNumOfWeek(DayNum_t(d));
|
2011-10-16 04:17:41 +00:00
|
|
|
|
}
|
|
|
|
|
|
2015-11-29 11:58:44 +00:00
|
|
|
|
using FactorTransform = ZeroTransform;
|
2011-10-16 04:17:41 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct ToStartOfMonthImpl
|
|
|
|
|
{
|
2015-11-29 11:58:44 +00:00
|
|
|
|
static inline UInt16 execute(UInt32 t, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut)
|
|
|
|
|
{
|
|
|
|
|
return remote_date_lut.toFirstDayNumOfMonth(remote_date_lut.toDayNum(t));
|
|
|
|
|
}
|
|
|
|
|
static inline UInt16 execute(UInt16 d, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut)
|
|
|
|
|
{
|
|
|
|
|
return remote_date_lut.toFirstDayNumOfMonth(DayNum_t(d));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
using FactorTransform = ZeroTransform;
|
2011-10-16 04:17:41 +00:00
|
|
|
|
};
|
|
|
|
|
|
2013-12-20 14:12:20 +00:00
|
|
|
|
struct ToStartOfQuarterImpl
|
|
|
|
|
{
|
2015-11-29 11:58:44 +00:00
|
|
|
|
static inline UInt16 execute(UInt32 t, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut)
|
|
|
|
|
{
|
|
|
|
|
return remote_date_lut.toFirstDayNumOfQuarter(remote_date_lut.toDayNum(t));
|
|
|
|
|
}
|
|
|
|
|
static inline UInt16 execute(UInt16 d, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut)
|
|
|
|
|
{
|
|
|
|
|
return remote_date_lut.toFirstDayNumOfQuarter(DayNum_t(d));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
using FactorTransform = ZeroTransform;
|
2013-12-20 14:12:20 +00:00
|
|
|
|
};
|
|
|
|
|
|
2012-08-31 20:38:05 +00:00
|
|
|
|
struct ToStartOfYearImpl
|
|
|
|
|
{
|
2015-11-29 11:58:44 +00:00
|
|
|
|
static inline UInt16 execute(UInt32 t, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut)
|
|
|
|
|
{
|
|
|
|
|
return remote_date_lut.toFirstDayNumOfYear(remote_date_lut.toDayNum(t));
|
|
|
|
|
}
|
|
|
|
|
static inline UInt16 execute(UInt16 d, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut)
|
|
|
|
|
{
|
|
|
|
|
return remote_date_lut.toFirstDayNumOfYear(DayNum_t(d));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
using FactorTransform = ZeroTransform;
|
2012-08-31 20:38:05 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
2011-10-16 04:17:41 +00:00
|
|
|
|
struct ToTimeImpl
|
|
|
|
|
{
|
2011-10-16 07:11:36 +00:00
|
|
|
|
/// При переводе во время, дату будем приравнивать к 1970-01-02.
|
2015-07-07 23:11:30 +00:00
|
|
|
|
static inline UInt32 execute(UInt32 t, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut)
|
2015-07-01 14:35:02 +00:00
|
|
|
|
{
|
2015-07-08 17:30:42 +00:00
|
|
|
|
time_t remote_ts = remote_date_lut.toTimeInaccurate(t) + 86400;
|
2015-07-01 14:35:02 +00:00
|
|
|
|
|
|
|
|
|
if (&remote_date_lut == &local_date_lut)
|
2015-07-08 17:30:42 +00:00
|
|
|
|
return remote_ts;
|
2015-07-01 14:35:02 +00:00
|
|
|
|
else
|
|
|
|
|
{
|
2015-07-08 17:30:42 +00:00
|
|
|
|
const auto & values = remote_date_lut.getValues(remote_ts);
|
2015-07-01 14:35:02 +00:00
|
|
|
|
return local_date_lut.makeDateTime(values.year, values.month, values.day_of_month,
|
2015-07-08 17:30:42 +00:00
|
|
|
|
remote_date_lut.toHourInaccurate(remote_ts),
|
|
|
|
|
remote_date_lut.toMinuteInaccurate(remote_ts),
|
|
|
|
|
remote_date_lut.toSecondInaccurate(remote_ts));
|
2015-07-01 14:35:02 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2015-07-07 23:11:30 +00:00
|
|
|
|
static inline UInt32 execute(UInt16 d, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut)
|
2011-10-16 04:17:41 +00:00
|
|
|
|
{
|
|
|
|
|
throw Exception("Illegal type Date of argument for function toTime", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
|
|
|
|
|
}
|
2015-11-29 11:58:44 +00:00
|
|
|
|
|
|
|
|
|
using FactorTransform = ToDateImpl;
|
2011-10-16 04:17:41 +00:00
|
|
|
|
};
|
|
|
|
|
|
2012-08-31 20:38:05 +00:00
|
|
|
|
struct ToStartOfMinuteImpl
|
|
|
|
|
{
|
2015-11-29 11:58:44 +00:00
|
|
|
|
static inline UInt32 execute(UInt32 t, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut)
|
|
|
|
|
{
|
|
|
|
|
return remote_date_lut.toStartOfMinuteInaccurate(t);
|
|
|
|
|
}
|
2015-07-07 23:11:30 +00:00
|
|
|
|
static inline UInt32 execute(UInt16 d, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut)
|
2012-08-31 20:38:05 +00:00
|
|
|
|
{
|
|
|
|
|
throw Exception("Illegal type Date of argument for function toStartOfMinute", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
|
|
|
|
|
}
|
2015-11-29 11:58:44 +00:00
|
|
|
|
|
|
|
|
|
using FactorTransform = ZeroTransform;
|
2012-08-31 20:38:05 +00:00
|
|
|
|
};
|
|
|
|
|
|
2015-06-03 14:27:03 +00:00
|
|
|
|
struct ToStartOfFiveMinuteImpl
|
|
|
|
|
{
|
2015-11-29 11:58:44 +00:00
|
|
|
|
static inline UInt32 execute(UInt32 t, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut)
|
|
|
|
|
{
|
|
|
|
|
return remote_date_lut.toStartOfFiveMinuteInaccurate(t);
|
|
|
|
|
}
|
2015-07-07 23:11:30 +00:00
|
|
|
|
static inline UInt32 execute(UInt16 d, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut)
|
2015-06-03 14:27:03 +00:00
|
|
|
|
{
|
|
|
|
|
throw Exception("Illegal type Date of argument for function toStartOfFiveMinute", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
|
|
|
|
|
}
|
2015-11-29 11:58:44 +00:00
|
|
|
|
|
|
|
|
|
using FactorTransform = ZeroTransform;
|
2015-06-03 14:27:03 +00:00
|
|
|
|
};
|
|
|
|
|
|
2012-08-31 20:38:05 +00:00
|
|
|
|
struct ToStartOfHourImpl
|
|
|
|
|
{
|
2015-11-29 11:58:44 +00:00
|
|
|
|
static inline UInt32 execute(UInt32 t, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut)
|
|
|
|
|
{
|
|
|
|
|
return remote_date_lut.toStartOfHourInaccurate(t);
|
|
|
|
|
}
|
2015-07-07 23:11:30 +00:00
|
|
|
|
static inline UInt32 execute(UInt16 d, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut)
|
2012-08-31 20:38:05 +00:00
|
|
|
|
{
|
|
|
|
|
throw Exception("Illegal type Date of argument for function toStartOfHour", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
|
|
|
|
|
}
|
2015-11-29 11:58:44 +00:00
|
|
|
|
|
|
|
|
|
using FactorTransform = ZeroTransform;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct ToYearImpl
|
|
|
|
|
{
|
|
|
|
|
static inline UInt16 execute(UInt32 t, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut)
|
|
|
|
|
{
|
|
|
|
|
return remote_date_lut.toYear(t);
|
|
|
|
|
}
|
|
|
|
|
static inline UInt16 execute(UInt16 d, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut)
|
|
|
|
|
{
|
|
|
|
|
return remote_date_lut.toYear(DayNum_t(d));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
using FactorTransform = ZeroTransform;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct ToMonthImpl
|
|
|
|
|
{
|
|
|
|
|
static inline UInt8 execute(UInt32 t, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut)
|
|
|
|
|
{
|
|
|
|
|
return remote_date_lut.toMonth(t);
|
|
|
|
|
}
|
|
|
|
|
static inline UInt8 execute(UInt16 d, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut)
|
|
|
|
|
{
|
|
|
|
|
return remote_date_lut.toMonth(DayNum_t(d));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
using FactorTransform = ToStartOfYearImpl;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct ToDayOfMonthImpl
|
|
|
|
|
{
|
|
|
|
|
static inline UInt8 execute(UInt32 t, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut)
|
|
|
|
|
{
|
|
|
|
|
return remote_date_lut.toDayOfMonth(t);
|
|
|
|
|
}
|
|
|
|
|
static inline UInt8 execute(UInt16 d, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut)
|
|
|
|
|
{
|
|
|
|
|
return remote_date_lut.toDayOfMonth(DayNum_t(d));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
using FactorTransform = ToStartOfMonthImpl;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct ToDayOfWeekImpl
|
|
|
|
|
{
|
|
|
|
|
static inline UInt8 execute(UInt32 t, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut)
|
|
|
|
|
{
|
|
|
|
|
return remote_date_lut.toDayOfWeek(t);
|
|
|
|
|
}
|
|
|
|
|
static inline UInt8 execute(UInt16 d, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut)
|
|
|
|
|
{
|
|
|
|
|
return remote_date_lut.toDayOfWeek(DayNum_t(d));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
using FactorTransform = ToMondayImpl;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct ToHourImpl
|
|
|
|
|
{
|
|
|
|
|
static inline UInt8 execute(UInt32 t, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut)
|
|
|
|
|
{
|
|
|
|
|
return remote_date_lut.toHourInaccurate(t);
|
|
|
|
|
}
|
|
|
|
|
static inline UInt8 execute(UInt16 d, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut)
|
|
|
|
|
{
|
|
|
|
|
throw Exception("Illegal type Date of argument for function toHour", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
using FactorTransform = ToDateImpl;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct ToMinuteImpl
|
|
|
|
|
{
|
|
|
|
|
static inline UInt8 execute(UInt32 t, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut)
|
|
|
|
|
{
|
|
|
|
|
return remote_date_lut.toMinuteInaccurate(t);
|
|
|
|
|
}
|
|
|
|
|
static inline UInt8 execute(UInt16 d, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut)
|
|
|
|
|
{
|
|
|
|
|
throw Exception("Illegal type Date of argument for function toMinute", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
using FactorTransform = ToStartOfHourImpl;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct ToSecondImpl
|
|
|
|
|
{
|
|
|
|
|
static inline UInt8 execute(UInt32 t, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut)
|
|
|
|
|
{
|
|
|
|
|
return remote_date_lut.toSecondInaccurate(t);
|
|
|
|
|
}
|
|
|
|
|
static inline UInt8 execute(UInt16 d, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut)
|
|
|
|
|
{
|
|
|
|
|
throw Exception("Illegal type Date of argument for function toSecond", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
using FactorTransform = ToStartOfMinuteImpl;
|
2012-08-31 20:38:05 +00:00
|
|
|
|
};
|
|
|
|
|
|
2014-01-22 12:27:55 +00:00
|
|
|
|
struct ToRelativeYearNumImpl
|
|
|
|
|
{
|
2015-11-29 11:58:44 +00:00
|
|
|
|
static inline UInt16 execute(UInt32 t, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut)
|
|
|
|
|
{
|
|
|
|
|
return remote_date_lut.toYear(t);
|
|
|
|
|
}
|
|
|
|
|
static inline UInt16 execute(UInt16 d, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut)
|
|
|
|
|
{
|
|
|
|
|
return remote_date_lut.toYear(DayNum_t(d));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
using FactorTransform = ZeroTransform;
|
2014-01-22 12:27:55 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct ToRelativeMonthNumImpl
|
|
|
|
|
{
|
2015-11-29 11:58:44 +00:00
|
|
|
|
static inline UInt16 execute(UInt32 t, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut)
|
|
|
|
|
{
|
|
|
|
|
return remote_date_lut.toRelativeMonthNum(t);
|
|
|
|
|
}
|
|
|
|
|
static inline UInt16 execute(UInt16 d, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut)
|
|
|
|
|
{
|
|
|
|
|
return remote_date_lut.toRelativeMonthNum(DayNum_t(d));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
using FactorTransform = ZeroTransform;
|
2014-01-22 12:27:55 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct ToRelativeWeekNumImpl
|
|
|
|
|
{
|
2015-11-29 11:58:44 +00:00
|
|
|
|
static inline UInt16 execute(UInt32 t, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut)
|
|
|
|
|
{
|
|
|
|
|
return remote_date_lut.toRelativeWeekNum(t);
|
|
|
|
|
}
|
|
|
|
|
static inline UInt16 execute(UInt16 d, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut)
|
|
|
|
|
{
|
|
|
|
|
return remote_date_lut.toRelativeWeekNum(DayNum_t(d));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
using FactorTransform = ZeroTransform;
|
2014-01-22 12:27:55 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct ToRelativeDayNumImpl
|
|
|
|
|
{
|
2015-11-29 11:58:44 +00:00
|
|
|
|
static inline UInt16 execute(UInt32 t, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut)
|
|
|
|
|
{
|
|
|
|
|
return remote_date_lut.toDayNum(t);
|
|
|
|
|
}
|
|
|
|
|
static inline UInt16 execute(UInt16 d, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut)
|
|
|
|
|
{
|
|
|
|
|
return static_cast<DayNum_t>(d);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
using FactorTransform = ZeroTransform;
|
2014-01-22 12:27:55 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct ToRelativeHourNumImpl
|
|
|
|
|
{
|
2015-11-29 11:58:44 +00:00
|
|
|
|
static inline UInt32 execute(UInt32 t, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut)
|
|
|
|
|
{
|
|
|
|
|
return remote_date_lut.toRelativeHourNum(t);
|
|
|
|
|
}
|
2015-07-07 23:11:30 +00:00
|
|
|
|
static inline UInt32 execute(UInt16 d, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut)
|
2014-01-22 12:27:55 +00:00
|
|
|
|
{
|
2014-01-27 13:49:06 +00:00
|
|
|
|
throw Exception("Illegal type Date of argument for function toRelativeHourNum", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
|
2014-01-22 12:27:55 +00:00
|
|
|
|
}
|
2015-11-29 11:58:44 +00:00
|
|
|
|
|
|
|
|
|
using FactorTransform = ZeroTransform;
|
2014-01-22 12:27:55 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct ToRelativeMinuteNumImpl
|
|
|
|
|
{
|
2015-11-29 11:58:44 +00:00
|
|
|
|
static inline UInt32 execute(UInt32 t, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut)
|
|
|
|
|
{
|
|
|
|
|
return remote_date_lut.toRelativeMinuteNum(t);
|
|
|
|
|
}
|
2015-07-07 23:11:30 +00:00
|
|
|
|
static inline UInt32 execute(UInt16 d, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut)
|
2014-01-22 12:27:55 +00:00
|
|
|
|
{
|
2014-01-27 13:49:06 +00:00
|
|
|
|
throw Exception("Illegal type Date of argument for function toRelativeMinuteNum", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
|
2014-01-22 12:27:55 +00:00
|
|
|
|
}
|
2015-11-29 11:58:44 +00:00
|
|
|
|
|
|
|
|
|
using FactorTransform = ZeroTransform;
|
2014-01-22 12:27:55 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct ToRelativeSecondNumImpl
|
|
|
|
|
{
|
2015-11-29 11:58:44 +00:00
|
|
|
|
static inline UInt32 execute(UInt32 t, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut)
|
|
|
|
|
{
|
|
|
|
|
return t;
|
|
|
|
|
}
|
2015-07-07 23:11:30 +00:00
|
|
|
|
static inline UInt32 execute(UInt16 d, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut)
|
2014-01-22 12:27:55 +00:00
|
|
|
|
{
|
2014-01-27 13:49:06 +00:00
|
|
|
|
throw Exception("Illegal type Date of argument for function toRelativeSecondNum", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
|
2014-01-22 12:27:55 +00:00
|
|
|
|
}
|
2015-11-29 11:58:44 +00:00
|
|
|
|
|
|
|
|
|
using FactorTransform = ZeroTransform;
|
2014-01-22 12:27:55 +00:00
|
|
|
|
};
|
|
|
|
|
|
2015-11-29 11:58:44 +00:00
|
|
|
|
|
2015-07-01 14:35:02 +00:00
|
|
|
|
template<typename FromType, typename ToType, typename Transform>
|
2015-07-02 13:35:28 +00:00
|
|
|
|
struct Transformer
|
2015-06-30 15:03:22 +00:00
|
|
|
|
{
|
2016-04-15 00:33:21 +00:00
|
|
|
|
static void vector_vector(const PaddedPODArray<FromType> & vec_from, const ColumnString::Chars_t & data,
|
|
|
|
|
const ColumnString::Offsets_t & offsets, PaddedPODArray<ToType> & vec_to)
|
2015-07-02 13:35:28 +00:00
|
|
|
|
{
|
2015-07-07 23:11:30 +00:00
|
|
|
|
const auto & local_date_lut = DateLUT::instance();
|
2015-07-02 13:35:28 +00:00
|
|
|
|
ColumnString::Offset_t prev_offset = 0;
|
2015-06-30 14:02:47 +00:00
|
|
|
|
|
2015-07-02 13:35:28 +00:00
|
|
|
|
for (size_t i = 0; i < vec_from.size(); ++i)
|
2015-06-30 14:02:47 +00:00
|
|
|
|
{
|
2015-07-02 13:35:28 +00:00
|
|
|
|
ColumnString::Offset_t cur_offset = offsets[i];
|
|
|
|
|
const std::string time_zone(reinterpret_cast<const char *>(&data[prev_offset]), cur_offset - prev_offset - 1);
|
2015-07-07 23:11:30 +00:00
|
|
|
|
const auto & remote_date_lut = DateLUT::instance(time_zone);
|
2015-07-02 13:35:28 +00:00
|
|
|
|
vec_to[i] = Transform::execute(vec_from[i], remote_date_lut, local_date_lut);
|
|
|
|
|
prev_offset = cur_offset;
|
2015-06-30 14:02:47 +00:00
|
|
|
|
}
|
2015-07-02 13:35:28 +00:00
|
|
|
|
}
|
2015-06-30 14:02:47 +00:00
|
|
|
|
|
2016-04-15 00:33:21 +00:00
|
|
|
|
static void vector_constant(const PaddedPODArray<FromType> & vec_from, const std::string & data,
|
|
|
|
|
PaddedPODArray<ToType> & vec_to)
|
2015-07-02 13:35:28 +00:00
|
|
|
|
{
|
2015-07-07 23:11:30 +00:00
|
|
|
|
const auto & local_date_lut = DateLUT::instance();
|
|
|
|
|
const auto & remote_date_lut = DateLUT::instance(data);
|
2015-07-02 13:35:28 +00:00
|
|
|
|
for (size_t i = 0; i < vec_from.size(); ++i)
|
|
|
|
|
vec_to[i] = Transform::execute(vec_from[i], remote_date_lut, local_date_lut);
|
2015-06-30 15:03:22 +00:00
|
|
|
|
}
|
|
|
|
|
|
2016-04-15 00:33:21 +00:00
|
|
|
|
static void vector_constant(const PaddedPODArray<FromType> & vec_from, PaddedPODArray<ToType> & vec_to)
|
2015-07-08 17:30:42 +00:00
|
|
|
|
{
|
|
|
|
|
const auto & local_date_lut = DateLUT::instance();
|
|
|
|
|
for (size_t i = 0; i < vec_from.size(); ++i)
|
|
|
|
|
vec_to[i] = Transform::execute(vec_from[i], local_date_lut, local_date_lut);
|
|
|
|
|
}
|
|
|
|
|
|
2015-07-02 13:35:28 +00:00
|
|
|
|
static void constant_vector(const FromType & from, const ColumnString::Chars_t & data,
|
2016-04-15 00:33:21 +00:00
|
|
|
|
const ColumnString::Offsets_t & offsets, PaddedPODArray<ToType> & vec_to)
|
2015-07-02 13:35:28 +00:00
|
|
|
|
{
|
2015-07-07 23:11:30 +00:00
|
|
|
|
const auto & local_date_lut = DateLUT::instance();
|
2015-07-02 13:35:28 +00:00
|
|
|
|
ColumnString::Offset_t prev_offset = 0;
|
|
|
|
|
|
|
|
|
|
for (size_t i = 0; i < offsets.size(); ++i)
|
|
|
|
|
{
|
|
|
|
|
ColumnString::Offset_t cur_offset = offsets[i];
|
|
|
|
|
const std::string time_zone(reinterpret_cast<const char *>(&data[prev_offset]), cur_offset - prev_offset - 1);
|
2015-07-07 23:11:30 +00:00
|
|
|
|
const auto & remote_date_lut = DateLUT::instance(time_zone);
|
2015-07-02 13:35:28 +00:00
|
|
|
|
vec_to[i] = Transform::execute(from, remote_date_lut, local_date_lut);
|
|
|
|
|
prev_offset = cur_offset;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void constant_constant(const FromType & from, const std::string & data, ToType & to)
|
|
|
|
|
{
|
2015-07-07 23:11:30 +00:00
|
|
|
|
const auto & local_date_lut = DateLUT::instance();
|
|
|
|
|
const auto & remote_date_lut = DateLUT::instance(data);
|
2015-07-02 13:35:28 +00:00
|
|
|
|
to = Transform::execute(from, remote_date_lut, local_date_lut);
|
|
|
|
|
}
|
2015-07-08 17:30:42 +00:00
|
|
|
|
|
|
|
|
|
static void constant_constant(const FromType & from, ToType & to)
|
|
|
|
|
{
|
|
|
|
|
const auto & local_date_lut = DateLUT::instance();
|
|
|
|
|
to = Transform::execute(from, local_date_lut, local_date_lut);
|
|
|
|
|
}
|
2015-07-02 13:35:28 +00:00
|
|
|
|
};
|
2015-07-01 14:35:02 +00:00
|
|
|
|
|
2015-06-30 15:03:22 +00:00
|
|
|
|
template <typename FromType, typename ToType, typename Transform, typename Name>
|
|
|
|
|
struct DateTimeTransformImpl
|
|
|
|
|
{
|
|
|
|
|
static void execute(Block & block, const ColumnNumbers & arguments, size_t result)
|
|
|
|
|
{
|
2015-07-02 13:35:28 +00:00
|
|
|
|
using Op = Transformer<FromType, ToType, Transform>;
|
2011-10-16 04:17:41 +00:00
|
|
|
|
|
2015-07-02 13:35:28 +00:00
|
|
|
|
const ColumnPtr source_col = block.getByPosition(arguments[0]).column;
|
2015-07-03 11:55:51 +00:00
|
|
|
|
const auto * sources = typeid_cast<const ColumnVector<FromType> *>(&*source_col);
|
|
|
|
|
const auto * const_source = typeid_cast<const ColumnConst<FromType> *>(&*source_col);
|
2011-10-16 04:17:41 +00:00
|
|
|
|
|
2015-07-02 13:35:28 +00:00
|
|
|
|
if (arguments.size() == 1)
|
|
|
|
|
{
|
|
|
|
|
if (sources)
|
|
|
|
|
{
|
2016-05-28 05:31:36 +00:00
|
|
|
|
auto col_to = std::make_shared<ColumnVector<ToType>>();
|
2015-07-02 13:35:28 +00:00
|
|
|
|
block.getByPosition(result).column = col_to;
|
|
|
|
|
|
|
|
|
|
auto & vec_from = sources->getData();
|
|
|
|
|
auto & vec_to = col_to->getData();
|
|
|
|
|
size_t size = vec_from.size();
|
|
|
|
|
vec_to.resize(size);
|
|
|
|
|
|
2015-07-08 17:30:42 +00:00
|
|
|
|
Op::vector_constant(vec_from, vec_to);
|
2015-07-02 13:35:28 +00:00
|
|
|
|
}
|
|
|
|
|
else if (const_source)
|
|
|
|
|
{
|
|
|
|
|
ToType res;
|
2015-07-08 17:30:42 +00:00
|
|
|
|
Op::constant_constant(const_source->getData(), res);
|
2016-05-28 05:31:36 +00:00
|
|
|
|
block.getByPosition(result).column = std::make_shared<ColumnConst<ToType>>(const_source->size(), res);
|
2015-07-02 13:35:28 +00:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
throw Exception("Illegal column " + block.getByPosition(arguments[0]).column->getName()
|
|
|
|
|
+ " of first argument of function " + Name::name,
|
|
|
|
|
ErrorCodes::ILLEGAL_COLUMN);
|
|
|
|
|
}
|
2011-10-16 04:17:41 +00:00
|
|
|
|
}
|
2015-07-02 13:35:28 +00:00
|
|
|
|
else if (arguments.size() == 2)
|
2011-10-16 04:17:41 +00:00
|
|
|
|
{
|
2015-07-02 13:35:28 +00:00
|
|
|
|
const ColumnPtr time_zone_col = block.getByPosition(arguments[1]).column;
|
2015-07-03 11:55:51 +00:00
|
|
|
|
const auto * time_zones = typeid_cast<const ColumnString *>(&*time_zone_col);
|
|
|
|
|
const auto * const_time_zone = typeid_cast<const ColumnConstString *>(&*time_zone_col);
|
2015-07-02 13:35:28 +00:00
|
|
|
|
|
|
|
|
|
if (sources)
|
|
|
|
|
{
|
2016-05-28 05:31:36 +00:00
|
|
|
|
auto col_to = std::make_shared<ColumnVector<ToType>>();
|
2015-07-02 13:35:28 +00:00
|
|
|
|
block.getByPosition(result).column = col_to;
|
|
|
|
|
|
|
|
|
|
auto & vec_from = sources->getData();
|
|
|
|
|
auto & vec_to = col_to->getData();
|
|
|
|
|
vec_to.resize(vec_from.size());
|
|
|
|
|
|
|
|
|
|
if (time_zones)
|
|
|
|
|
Op::vector_vector(vec_from, time_zones->getChars(), time_zones->getOffsets(), vec_to);
|
|
|
|
|
else if (const_time_zone)
|
|
|
|
|
Op::vector_constant(vec_from, const_time_zone->getData(), vec_to);
|
|
|
|
|
else
|
|
|
|
|
throw Exception("Illegal column " + block.getByPosition(arguments[1]).column->getName()
|
|
|
|
|
+ " of second argument of function " + Name::name,
|
|
|
|
|
ErrorCodes::ILLEGAL_COLUMN);
|
|
|
|
|
}
|
|
|
|
|
else if (const_source)
|
|
|
|
|
{
|
|
|
|
|
if (time_zones)
|
|
|
|
|
{
|
2016-05-28 05:31:36 +00:00
|
|
|
|
auto col_to = std::make_shared<ColumnVector<ToType>>();
|
2015-07-02 13:35:28 +00:00
|
|
|
|
block.getByPosition(result).column = col_to;
|
|
|
|
|
|
|
|
|
|
auto & vec_to = col_to->getData();
|
|
|
|
|
vec_to.resize(time_zones->getOffsets().size());
|
|
|
|
|
|
|
|
|
|
Op::constant_vector(const_source->getData(), time_zones->getChars(), time_zones->getOffsets(), vec_to);
|
|
|
|
|
}
|
|
|
|
|
else if (const_time_zone)
|
|
|
|
|
{
|
|
|
|
|
ToType res;
|
|
|
|
|
Op::constant_constant(const_source->getData(), const_time_zone->getData(), res);
|
2016-05-28 05:31:36 +00:00
|
|
|
|
block.getByPosition(result).column = std::make_shared<ColumnConst<ToType>>(const_source->size(), res);
|
2015-07-02 13:35:28 +00:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
throw Exception("Illegal column " + block.getByPosition(arguments[1]).column->getName()
|
|
|
|
|
+ " of second argument of function " + Name::name,
|
|
|
|
|
ErrorCodes::ILLEGAL_COLUMN);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
throw Exception("Illegal column " + block.getByPosition(arguments[0]).column->getName()
|
|
|
|
|
+ " of first argument of function " + Name::name,
|
|
|
|
|
ErrorCodes::ILLEGAL_COLUMN);
|
2011-10-16 04:17:41 +00:00
|
|
|
|
}
|
2015-07-03 11:55:51 +00:00
|
|
|
|
else
|
|
|
|
|
throw Exception("Internal error.", ErrorCodes::LOGICAL_ERROR);
|
2011-10-16 04:17:41 +00:00
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
template <typename ToDataType, typename Transform, typename Name>
|
|
|
|
|
class FunctionDateOrDateTimeToSomething : public IFunction
|
|
|
|
|
{
|
|
|
|
|
public:
|
2014-11-12 17:23:26 +00:00
|
|
|
|
static constexpr auto name = Name::name;
|
2016-05-28 15:42:22 +00:00
|
|
|
|
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionDateOrDateTimeToSomething>(); };
|
2014-11-12 17:23:26 +00:00
|
|
|
|
|
2011-10-16 04:17:41 +00:00
|
|
|
|
/// Получить имя функции.
|
2015-10-11 23:36:45 +00:00
|
|
|
|
String getName() const override
|
2011-10-16 04:17:41 +00:00
|
|
|
|
{
|
2014-11-12 17:23:26 +00:00
|
|
|
|
return name;
|
2011-10-16 04:17:41 +00:00
|
|
|
|
}
|
|
|
|
|
|
2015-06-30 15:03:22 +00:00
|
|
|
|
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
2015-10-22 15:31:42 +00:00
|
|
|
|
DataTypePtr getReturnType(const DataTypes & arguments) const override
|
2015-06-30 15:03:22 +00:00
|
|
|
|
{
|
2015-12-15 09:56:14 +00:00
|
|
|
|
if (arguments.size() == 1)
|
2015-06-30 15:03:22 +00:00
|
|
|
|
{
|
2015-12-15 09:56:14 +00:00
|
|
|
|
if ((typeid_cast<const DataTypeDate *>(&*arguments[0]) == nullptr) &&
|
|
|
|
|
(typeid_cast<const DataTypeDateTime *>(&*arguments[0]) == nullptr))
|
|
|
|
|
throw Exception{
|
|
|
|
|
"Illegal type " + arguments[0]->getName() + " of argument of function " + getName() +
|
|
|
|
|
". Should be a date or a date with time", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT
|
|
|
|
|
};
|
2015-06-30 15:03:22 +00:00
|
|
|
|
}
|
2015-12-15 09:56:14 +00:00
|
|
|
|
else if (arguments.size() == 2)
|
2015-12-14 16:26:39 +00:00
|
|
|
|
{
|
2016-03-10 14:58:31 +00:00
|
|
|
|
if ((typeid_cast<const DataTypeDate *>(&*arguments[0]) != nullptr)
|
|
|
|
|
|| (typeid_cast<const DataTypeDateTime *>(&*arguments[0]) == nullptr)
|
|
|
|
|
|| (typeid_cast<const DataTypeString *>(&*arguments[1]) == nullptr))
|
2015-12-15 09:56:14 +00:00
|
|
|
|
throw Exception{
|
2016-03-10 14:58:31 +00:00
|
|
|
|
"Function " + getName() + " supports 1 or 2 arguments. The 1st argument "
|
|
|
|
|
"must be of type Date or DateTime. The 2nd argument (optional) must be "
|
|
|
|
|
"a constant string with timezone name. The timezone argument is allowed "
|
|
|
|
|
"only when the 1st argument has the type DateTime",
|
|
|
|
|
ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT
|
2015-12-15 09:56:14 +00:00
|
|
|
|
};
|
2015-06-30 15:03:22 +00:00
|
|
|
|
}
|
2015-12-15 09:56:14 +00:00
|
|
|
|
else
|
|
|
|
|
throw Exception("Number of arguments for function " + getName() + " doesn't match: passed "
|
|
|
|
|
+ toString(arguments.size()) + ", should be 1 or 2",
|
|
|
|
|
ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH);
|
2015-06-30 15:03:22 +00:00
|
|
|
|
|
2016-05-28 07:48:40 +00:00
|
|
|
|
return std::make_shared<ToDataType>();
|
2015-06-30 15:03:22 +00:00
|
|
|
|
}
|
2015-10-22 15:31:42 +00:00
|
|
|
|
|
|
|
|
|
/// Выполнить функцию над блоком.
|
|
|
|
|
void execute(Block & block, const ColumnNumbers & arguments, size_t result) override
|
|
|
|
|
{
|
|
|
|
|
IDataType * from_type = &*block.getByPosition(arguments[0]).type;
|
|
|
|
|
|
|
|
|
|
if (typeid_cast<const DataTypeDate *>(from_type))
|
|
|
|
|
DateTimeTransformImpl<DataTypeDate::FieldType, typename ToDataType::FieldType, Transform, Name>::execute(block, arguments, result);
|
|
|
|
|
else if (typeid_cast<const DataTypeDateTime * >(from_type))
|
|
|
|
|
DateTimeTransformImpl<DataTypeDateTime::FieldType, typename ToDataType::FieldType, Transform, Name>::execute(block, arguments, result);
|
|
|
|
|
else
|
|
|
|
|
throw Exception("Illegal type " + block.getByPosition(arguments[0]).type->getName() + " of argument of function " + getName(),
|
|
|
|
|
ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
|
|
|
|
|
}
|
2015-11-29 11:58:44 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool hasInformationAboutMonotonicity() const override
|
|
|
|
|
{
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Monotonicity getMonotonicityForRange(const IDataType & type, const Field & left, const Field & right) const override
|
|
|
|
|
{
|
|
|
|
|
IFunction::Monotonicity is_monotonic { true };
|
|
|
|
|
IFunction::Monotonicity is_not_monotonic;
|
|
|
|
|
|
|
|
|
|
if (std::is_same<typename Transform::FactorTransform, ZeroTransform>::value)
|
|
|
|
|
return is_monotonic;
|
|
|
|
|
|
|
|
|
|
/// Этот метод вызывается только если у функции один аргумент. Поэтому, нас пока не волнует не-локальная тайм-зона.
|
|
|
|
|
const DateLUTImpl & date_lut = DateLUT::instance();
|
|
|
|
|
|
|
|
|
|
if (left.isNull() || right.isNull())
|
|
|
|
|
return is_not_monotonic;
|
|
|
|
|
|
|
|
|
|
/// Функция монотонна на отрезке [left, right], если фактор-преобразование возвращает для них одинаковые значения.
|
|
|
|
|
|
|
|
|
|
if (typeid_cast<const DataTypeDate *>(&type))
|
|
|
|
|
{
|
|
|
|
|
return Transform::FactorTransform::execute(UInt16(left.get<UInt64>()), date_lut, date_lut)
|
|
|
|
|
== Transform::FactorTransform::execute(UInt16(right.get<UInt64>()), date_lut, date_lut)
|
|
|
|
|
? is_monotonic : is_not_monotonic;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return Transform::FactorTransform::execute(UInt32(left.get<UInt64>()), date_lut, date_lut)
|
|
|
|
|
== Transform::FactorTransform::execute(UInt32(right.get<UInt64>()), date_lut, date_lut)
|
|
|
|
|
? is_monotonic : is_not_monotonic;
|
|
|
|
|
}
|
|
|
|
|
}
|
2011-10-16 04:17:41 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
2012-08-31 20:38:05 +00:00
|
|
|
|
/// Получить текущее время. (Оно - константа, вычисляется один раз за весь запрос.)
|
|
|
|
|
class FunctionNow : public IFunction
|
|
|
|
|
{
|
|
|
|
|
public:
|
2014-11-12 17:23:26 +00:00
|
|
|
|
static constexpr auto name = "now";
|
2016-05-28 15:42:22 +00:00
|
|
|
|
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionNow>(); };
|
2014-11-12 17:23:26 +00:00
|
|
|
|
|
2012-08-31 20:38:05 +00:00
|
|
|
|
/// Получить имя функции.
|
2015-10-11 23:36:45 +00:00
|
|
|
|
String getName() const override
|
2012-08-31 20:38:05 +00:00
|
|
|
|
{
|
2014-11-12 17:23:26 +00:00
|
|
|
|
return name;
|
2012-08-31 20:38:05 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
2015-10-11 23:36:45 +00:00
|
|
|
|
DataTypePtr getReturnType(const DataTypes & arguments) const override
|
2012-08-31 20:38:05 +00:00
|
|
|
|
{
|
|
|
|
|
if (arguments.size() != 0)
|
|
|
|
|
throw Exception("Number of arguments for function " + getName() + " doesn't match: passed "
|
2013-06-21 20:34:19 +00:00
|
|
|
|
+ toString(arguments.size()) + ", should be 0.",
|
2012-08-31 20:38:05 +00:00
|
|
|
|
ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH);
|
|
|
|
|
|
2016-05-28 07:48:40 +00:00
|
|
|
|
return std::make_shared<DataTypeDateTime>();
|
2012-08-31 20:38:05 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Выполнить функцию над блоком.
|
2015-10-11 23:36:45 +00:00
|
|
|
|
void execute(Block & block, const ColumnNumbers & arguments, size_t result) override
|
2012-08-31 20:38:05 +00:00
|
|
|
|
{
|
2016-05-28 05:31:36 +00:00
|
|
|
|
block.getByPosition(result).column = std::make_shared<ColumnConstUInt32>(
|
2013-06-08 20:19:29 +00:00
|
|
|
|
block.rowsInFirstColumn(),
|
2012-08-31 20:38:05 +00:00
|
|
|
|
time(0));
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
2014-09-04 11:48:07 +00:00
|
|
|
|
class FunctionToday : public IFunction
|
|
|
|
|
{
|
|
|
|
|
public:
|
2014-11-12 17:23:26 +00:00
|
|
|
|
static constexpr auto name = "today";
|
2016-05-28 15:42:22 +00:00
|
|
|
|
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionToday>(); };
|
2014-11-12 17:23:26 +00:00
|
|
|
|
|
2014-09-04 11:48:07 +00:00
|
|
|
|
/// Получить имя функции.
|
2015-10-11 23:36:45 +00:00
|
|
|
|
String getName() const override
|
2014-09-04 11:48:07 +00:00
|
|
|
|
{
|
2014-11-12 17:23:26 +00:00
|
|
|
|
return name;
|
2014-09-04 11:48:07 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
2015-10-11 23:36:45 +00:00
|
|
|
|
DataTypePtr getReturnType(const DataTypes & arguments) const override
|
2014-09-04 11:48:07 +00:00
|
|
|
|
{
|
|
|
|
|
if (arguments.size() != 0)
|
|
|
|
|
throw Exception("Number of arguments for function " + getName() + " doesn't match: passed "
|
|
|
|
|
+ toString(arguments.size()) + ", should be 0.",
|
|
|
|
|
ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH);
|
|
|
|
|
|
2016-05-28 07:48:40 +00:00
|
|
|
|
return std::make_shared<DataTypeDate>();
|
2014-09-04 11:48:07 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Выполнить функцию над блоком.
|
2015-10-11 23:36:45 +00:00
|
|
|
|
void execute(Block & block, const ColumnNumbers & arguments, size_t result) override
|
2014-09-04 11:48:07 +00:00
|
|
|
|
{
|
2016-05-28 05:31:36 +00:00
|
|
|
|
block.getByPosition(result).column = std::make_shared<ColumnConstUInt16>(
|
2014-09-04 11:48:07 +00:00
|
|
|
|
block.rowsInFirstColumn(),
|
|
|
|
|
DateLUT::instance().toDayNum(time(0)));
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class FunctionYesterday : public IFunction
|
|
|
|
|
{
|
|
|
|
|
public:
|
2014-11-12 17:23:26 +00:00
|
|
|
|
static constexpr auto name = "yesterday";
|
2016-05-28 15:42:22 +00:00
|
|
|
|
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionYesterday>(); };
|
2014-11-12 17:23:26 +00:00
|
|
|
|
|
2014-09-04 11:48:07 +00:00
|
|
|
|
/// Получить имя функции.
|
2015-10-11 23:36:45 +00:00
|
|
|
|
String getName() const override
|
2014-09-04 11:48:07 +00:00
|
|
|
|
{
|
2014-11-12 17:23:26 +00:00
|
|
|
|
return name;
|
2014-09-04 11:48:07 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
2015-10-11 23:36:45 +00:00
|
|
|
|
DataTypePtr getReturnType(const DataTypes & arguments) const override
|
2014-09-04 11:48:07 +00:00
|
|
|
|
{
|
|
|
|
|
if (arguments.size() != 0)
|
|
|
|
|
throw Exception("Number of arguments for function " + getName() + " doesn't match: passed "
|
|
|
|
|
+ toString(arguments.size()) + ", should be 0.",
|
|
|
|
|
ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH);
|
|
|
|
|
|
2016-05-28 07:48:40 +00:00
|
|
|
|
return std::make_shared<DataTypeDate>();
|
2014-09-04 11:48:07 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Выполнить функцию над блоком.
|
2015-10-11 23:36:45 +00:00
|
|
|
|
void execute(Block & block, const ColumnNumbers & arguments, size_t result) override
|
2014-09-04 11:48:07 +00:00
|
|
|
|
{
|
2016-05-28 05:31:36 +00:00
|
|
|
|
block.getByPosition(result).column = std::make_shared<ColumnConstUInt16>(
|
2014-09-04 11:48:07 +00:00
|
|
|
|
block.rowsInFirstColumn(),
|
|
|
|
|
DateLUT::instance().toDayNum(time(0)) - 1);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
2012-09-03 04:45:46 +00:00
|
|
|
|
class FunctionTimeSlot : public IFunction
|
|
|
|
|
{
|
|
|
|
|
public:
|
2014-11-12 17:23:26 +00:00
|
|
|
|
static constexpr auto name = "timeSlot";
|
2016-05-28 15:42:22 +00:00
|
|
|
|
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionTimeSlot>(); };
|
2014-11-12 17:23:26 +00:00
|
|
|
|
|
2012-09-03 04:45:46 +00:00
|
|
|
|
/// Получить имя функции.
|
2015-10-11 23:36:45 +00:00
|
|
|
|
String getName() const override
|
2012-09-03 04:45:46 +00:00
|
|
|
|
{
|
2014-11-12 17:23:26 +00:00
|
|
|
|
return name;
|
2012-09-03 04:45:46 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
2015-10-11 23:36:45 +00:00
|
|
|
|
DataTypePtr getReturnType(const DataTypes & arguments) const override
|
2012-09-03 04:45:46 +00:00
|
|
|
|
{
|
|
|
|
|
if (arguments.size() != 1)
|
|
|
|
|
throw Exception("Number of arguments for function " + getName() + " doesn't match: passed "
|
2013-06-21 20:34:19 +00:00
|
|
|
|
+ toString(arguments.size()) + ", should be 1.",
|
2012-09-03 04:45:46 +00:00
|
|
|
|
ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH);
|
|
|
|
|
|
2014-06-26 00:58:14 +00:00
|
|
|
|
if (!typeid_cast<const DataTypeDateTime *>(&*arguments[0]))
|
2012-09-03 04:45:46 +00:00
|
|
|
|
throw Exception("Illegal type " + arguments[0]->getName() + " of first argument of function " + getName() + ". Must be DateTime.",
|
|
|
|
|
ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
|
|
|
|
|
|
2016-05-28 07:48:40 +00:00
|
|
|
|
return std::make_shared<DataTypeDateTime>();
|
2012-09-03 04:45:46 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Выполнить функцию над блоком.
|
2015-10-11 23:36:45 +00:00
|
|
|
|
void execute(Block & block, const ColumnNumbers & arguments, size_t result) override
|
2012-09-03 04:45:46 +00:00
|
|
|
|
{
|
2014-06-26 00:58:14 +00:00
|
|
|
|
if (const ColumnUInt32 * times = typeid_cast<const ColumnUInt32 *>(&*block.getByPosition(arguments[0]).column))
|
2012-09-03 04:45:46 +00:00
|
|
|
|
{
|
2016-05-28 05:31:36 +00:00
|
|
|
|
auto res = std::make_shared<ColumnUInt32>();
|
2015-03-05 05:42:42 +00:00
|
|
|
|
ColumnPtr res_holder = res;
|
2012-09-03 04:45:46 +00:00
|
|
|
|
ColumnUInt32::Container_t & res_vec = res->getData();
|
|
|
|
|
const ColumnUInt32::Container_t & vec = times->getData();
|
2014-06-26 00:58:14 +00:00
|
|
|
|
|
2012-09-03 04:45:46 +00:00
|
|
|
|
size_t size = vec.size();
|
|
|
|
|
res_vec.resize(size);
|
|
|
|
|
|
|
|
|
|
for (size_t i = 0; i < size; ++i)
|
|
|
|
|
res_vec[i] = vec[i] / TIME_SLOT_SIZE * TIME_SLOT_SIZE;
|
|
|
|
|
|
2015-03-05 05:42:42 +00:00
|
|
|
|
block.getByPosition(result).column = res_holder;
|
2012-09-03 04:45:46 +00:00
|
|
|
|
}
|
2014-06-26 00:58:14 +00:00
|
|
|
|
else if (const ColumnConstUInt32 * const_times = typeid_cast<const ColumnConstUInt32 *>(&*block.getByPosition(arguments[0]).column))
|
2012-09-03 04:45:46 +00:00
|
|
|
|
{
|
2016-05-28 05:31:36 +00:00
|
|
|
|
block.getByPosition(result).column = std::make_shared<ColumnConstUInt32>(block.rowsInFirstColumn(), const_times->getData() / TIME_SLOT_SIZE * TIME_SLOT_SIZE);
|
2012-09-03 04:45:46 +00:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
throw Exception("Illegal column " + block.getByPosition(arguments[0]).column->getName()
|
|
|
|
|
+ " of argument of function " + getName(),
|
|
|
|
|
ErrorCodes::ILLEGAL_COLUMN);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template <typename DurationType>
|
|
|
|
|
struct TimeSlotsImpl
|
|
|
|
|
{
|
|
|
|
|
static void vector_vector(
|
2016-04-15 00:33:21 +00:00
|
|
|
|
const PaddedPODArray<UInt32> & starts, const PaddedPODArray<DurationType> & durations,
|
|
|
|
|
PaddedPODArray<UInt32> & result_values, ColumnArray::Offsets_t & result_offsets)
|
2012-09-03 04:45:46 +00:00
|
|
|
|
{
|
|
|
|
|
size_t size = starts.size();
|
|
|
|
|
|
|
|
|
|
result_offsets.resize(size);
|
|
|
|
|
result_values.reserve(size);
|
2014-06-26 00:58:14 +00:00
|
|
|
|
|
2012-09-03 04:45:46 +00:00
|
|
|
|
ColumnArray::Offset_t current_offset = 0;
|
|
|
|
|
for (size_t i = 0; i < size; ++i)
|
|
|
|
|
{
|
|
|
|
|
for (UInt32 value = starts[i] / TIME_SLOT_SIZE; value <= (starts[i] + durations[i]) / TIME_SLOT_SIZE; ++value)
|
|
|
|
|
{
|
|
|
|
|
result_values.push_back(value * TIME_SLOT_SIZE);
|
|
|
|
|
++current_offset;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
result_offsets[i] = current_offset;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void vector_constant(
|
2016-04-15 00:33:21 +00:00
|
|
|
|
const PaddedPODArray<UInt32> & starts, DurationType duration,
|
|
|
|
|
PaddedPODArray<UInt32> & result_values, ColumnArray::Offsets_t & result_offsets)
|
2012-09-03 04:45:46 +00:00
|
|
|
|
{
|
|
|
|
|
size_t size = starts.size();
|
|
|
|
|
|
|
|
|
|
result_offsets.resize(size);
|
|
|
|
|
result_values.reserve(size);
|
|
|
|
|
|
|
|
|
|
ColumnArray::Offset_t current_offset = 0;
|
|
|
|
|
for (size_t i = 0; i < size; ++i)
|
|
|
|
|
{
|
|
|
|
|
for (UInt32 value = starts[i] / TIME_SLOT_SIZE; value <= (starts[i] + duration) / TIME_SLOT_SIZE; ++value)
|
|
|
|
|
{
|
|
|
|
|
result_values.push_back(value * TIME_SLOT_SIZE);
|
|
|
|
|
++current_offset;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
result_offsets[i] = current_offset;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void constant_vector(
|
2016-04-15 00:33:21 +00:00
|
|
|
|
UInt32 start, const PaddedPODArray<DurationType> & durations,
|
|
|
|
|
PaddedPODArray<UInt32> & result_values, ColumnArray::Offsets_t & result_offsets)
|
2012-09-03 04:45:46 +00:00
|
|
|
|
{
|
|
|
|
|
size_t size = durations.size();
|
|
|
|
|
|
|
|
|
|
result_offsets.resize(size);
|
|
|
|
|
result_values.reserve(size);
|
|
|
|
|
|
|
|
|
|
ColumnArray::Offset_t current_offset = 0;
|
|
|
|
|
for (size_t i = 0; i < size; ++i)
|
|
|
|
|
{
|
|
|
|
|
for (UInt32 value = start / TIME_SLOT_SIZE; value <= (start + durations[i]) / TIME_SLOT_SIZE; ++value)
|
|
|
|
|
{
|
|
|
|
|
result_values.push_back(value * TIME_SLOT_SIZE);
|
|
|
|
|
++current_offset;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
result_offsets[i] = current_offset;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void constant_constant(
|
|
|
|
|
UInt32 start, DurationType duration,
|
|
|
|
|
Array & result)
|
|
|
|
|
{
|
|
|
|
|
for (UInt32 value = start / TIME_SLOT_SIZE; value <= (start + duration) / TIME_SLOT_SIZE; ++value)
|
|
|
|
|
result.push_back(static_cast<UInt64>(value * TIME_SLOT_SIZE));
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class FunctionTimeSlots : public IFunction
|
|
|
|
|
{
|
|
|
|
|
public:
|
2014-11-12 17:23:26 +00:00
|
|
|
|
static constexpr auto name = "timeSlots";
|
2016-05-28 15:42:22 +00:00
|
|
|
|
static FunctionPtr create(const Context & context) { return std::make_shared<FunctionTimeSlots>(); };
|
2014-11-12 17:23:26 +00:00
|
|
|
|
|
2012-09-03 04:45:46 +00:00
|
|
|
|
/// Получить имя функции.
|
2015-10-11 23:36:45 +00:00
|
|
|
|
String getName() const override
|
2012-09-03 04:45:46 +00:00
|
|
|
|
{
|
2014-11-12 17:23:26 +00:00
|
|
|
|
return name;
|
2012-09-03 04:45:46 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
2015-10-11 23:36:45 +00:00
|
|
|
|
DataTypePtr getReturnType(const DataTypes & arguments) const override
|
2012-09-03 04:45:46 +00:00
|
|
|
|
{
|
|
|
|
|
if (arguments.size() != 2)
|
|
|
|
|
throw Exception("Number of arguments for function " + getName() + " doesn't match: passed "
|
2013-06-21 20:34:19 +00:00
|
|
|
|
+ toString(arguments.size()) + ", should be 2.",
|
2012-09-03 04:45:46 +00:00
|
|
|
|
ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH);
|
|
|
|
|
|
2014-06-26 00:58:14 +00:00
|
|
|
|
if (!typeid_cast<const DataTypeDateTime *>(&*arguments[0]))
|
2012-09-03 04:45:46 +00:00
|
|
|
|
throw Exception("Illegal type " + arguments[0]->getName() + " of first argument of function " + getName() + ". Must be DateTime.",
|
|
|
|
|
ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
|
|
|
|
|
|
2014-06-26 00:58:14 +00:00
|
|
|
|
if (!typeid_cast<const DataTypeUInt32 *>(&*arguments[1]))
|
2012-09-03 06:32:38 +00:00
|
|
|
|
throw Exception("Illegal type " + arguments[1]->getName() + " of second argument of function " + getName() + ". Must be UInt32.",
|
2012-09-03 04:45:46 +00:00
|
|
|
|
ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
|
|
|
|
|
|
2016-05-28 07:48:40 +00:00
|
|
|
|
return std::make_shared<DataTypeArray>(std::make_shared<DataTypeDateTime>());
|
2012-09-03 04:45:46 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Выполнить функцию над блоком.
|
2015-10-11 23:36:45 +00:00
|
|
|
|
void execute(Block & block, const ColumnNumbers & arguments, size_t result) override
|
2012-09-03 04:45:46 +00:00
|
|
|
|
{
|
2014-06-26 00:58:14 +00:00
|
|
|
|
const ColumnUInt32 * starts = typeid_cast<const ColumnUInt32 *>(&*block.getByPosition(arguments[0]).column);
|
|
|
|
|
const ColumnConstUInt32 * const_starts = typeid_cast<const ColumnConstUInt32 *>(&*block.getByPosition(arguments[0]).column);
|
2012-09-03 04:45:46 +00:00
|
|
|
|
|
2014-06-26 00:58:14 +00:00
|
|
|
|
const ColumnUInt32 * durations = typeid_cast<const ColumnUInt32 *>(&*block.getByPosition(arguments[1]).column);
|
|
|
|
|
const ColumnConstUInt32 * const_durations = typeid_cast<const ColumnConstUInt32 *>(&*block.getByPosition(arguments[1]).column);
|
2012-09-03 04:45:46 +00:00
|
|
|
|
|
2016-05-28 05:31:36 +00:00
|
|
|
|
auto res = std::make_shared<ColumnArray>(std::make_shared<ColumnUInt32>());
|
2015-03-05 05:42:42 +00:00
|
|
|
|
ColumnPtr res_holder = res;
|
2014-06-26 00:58:14 +00:00
|
|
|
|
ColumnUInt32::Container_t & res_values = typeid_cast<ColumnUInt32 &>(res->getData()).getData();
|
2012-09-03 04:45:46 +00:00
|
|
|
|
|
|
|
|
|
if (starts && durations)
|
|
|
|
|
{
|
2012-09-03 06:32:38 +00:00
|
|
|
|
TimeSlotsImpl<UInt32>::vector_vector(starts->getData(), durations->getData(), res_values, res->getOffsets());
|
2015-03-05 05:42:42 +00:00
|
|
|
|
block.getByPosition(result).column = res_holder;
|
2012-09-03 04:45:46 +00:00
|
|
|
|
}
|
|
|
|
|
else if (starts && const_durations)
|
|
|
|
|
{
|
2012-09-03 06:32:38 +00:00
|
|
|
|
TimeSlotsImpl<UInt32>::vector_constant(starts->getData(), const_durations->getData(), res_values, res->getOffsets());
|
2015-03-05 05:42:42 +00:00
|
|
|
|
block.getByPosition(result).column = res_holder;
|
2012-09-03 04:45:46 +00:00
|
|
|
|
}
|
|
|
|
|
else if (const_starts && durations)
|
|
|
|
|
{
|
2012-09-03 06:32:38 +00:00
|
|
|
|
TimeSlotsImpl<UInt32>::constant_vector(const_starts->getData(), durations->getData(), res_values, res->getOffsets());
|
2015-03-05 05:42:42 +00:00
|
|
|
|
block.getByPosition(result).column = res_holder;
|
2012-09-03 04:45:46 +00:00
|
|
|
|
}
|
|
|
|
|
else if (const_starts && const_durations)
|
|
|
|
|
{
|
|
|
|
|
Array const_res;
|
2012-09-03 06:32:38 +00:00
|
|
|
|
TimeSlotsImpl<UInt32>::constant_constant(const_starts->getData(), const_durations->getData(), const_res);
|
2016-05-28 07:48:40 +00:00
|
|
|
|
block.getByPosition(result).column = std::make_shared<ColumnConstArray>(block.rowsInFirstColumn(), const_res, std::make_shared<DataTypeArray>(std::make_shared<DataTypeDateTime>()));
|
2012-09-03 04:45:46 +00:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
throw Exception("Illegal columns " + block.getByPosition(arguments[0]).column->getName()
|
|
|
|
|
+ ", " + block.getByPosition(arguments[1]).column->getName()
|
|
|
|
|
+ " of arguments of function " + getName(),
|
|
|
|
|
ErrorCodes::ILLEGAL_COLUMN);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
2014-11-12 17:23:26 +00:00
|
|
|
|
struct NameToYear { static constexpr auto name = "toYear"; };
|
|
|
|
|
struct NameToMonth { static constexpr auto name = "toMonth"; };
|
|
|
|
|
struct NameToDayOfMonth { static constexpr auto name = "toDayOfMonth"; };
|
|
|
|
|
struct NameToDayOfWeek { static constexpr auto name = "toDayOfWeek"; };
|
|
|
|
|
struct NameToHour { static constexpr auto name = "toHour"; };
|
|
|
|
|
struct NameToMinute { static constexpr auto name = "toMinute"; };
|
|
|
|
|
struct NameToSecond { static constexpr auto name = "toSecond"; };
|
|
|
|
|
struct NameToMonday { static constexpr auto name = "toMonday"; };
|
|
|
|
|
struct NameToStartOfMonth { static constexpr auto name = "toStartOfMonth"; };
|
|
|
|
|
struct NameToStartOfQuarter { static constexpr auto name = "toStartOfQuarter"; };
|
|
|
|
|
struct NameToStartOfYear { static constexpr auto name = "toStartOfYear"; };
|
|
|
|
|
struct NameToStartOfMinute { static constexpr auto name = "toStartOfMinute"; };
|
2015-06-03 14:27:03 +00:00
|
|
|
|
struct NameToStartOfFiveMinute { static constexpr auto name = "toStartOfFiveMinute"; };
|
2014-11-12 17:23:26 +00:00
|
|
|
|
struct NameToStartOfHour { static constexpr auto name = "toStartOfHour"; };
|
|
|
|
|
struct NameToTime { static constexpr auto name = "toTime"; };
|
|
|
|
|
struct NameToRelativeYearNum { static constexpr auto name = "toRelativeYearNum"; };
|
|
|
|
|
struct NameToRelativeMonthNum { static constexpr auto name = "toRelativeMonthNum"; };
|
|
|
|
|
struct NameToRelativeWeekNum { static constexpr auto name = "toRelativeWeekNum"; };
|
|
|
|
|
struct NameToRelativeDayNum { static constexpr auto name = "toRelativeDayNum"; };
|
|
|
|
|
struct NameToRelativeHourNum { static constexpr auto name = "toRelativeHourNum"; };
|
|
|
|
|
struct NameToRelativeMinuteNum { static constexpr auto name = "toRelativeMinuteNum"; };
|
|
|
|
|
struct NameToRelativeSecondNum { static constexpr auto name = "toRelativeSecondNum"; };
|
2014-01-22 12:27:55 +00:00
|
|
|
|
|
2011-10-16 04:17:41 +00:00
|
|
|
|
|
2016-05-28 10:35:44 +00:00
|
|
|
|
using FunctionToYear = FunctionDateOrDateTimeToSomething<DataTypeUInt16, ToYearImpl, NameToYear> ;
|
|
|
|
|
using FunctionToMonth = FunctionDateOrDateTimeToSomething<DataTypeUInt8, ToMonthImpl, NameToMonth> ;
|
|
|
|
|
using FunctionToDayOfMonth = FunctionDateOrDateTimeToSomething<DataTypeUInt8, ToDayOfMonthImpl, NameToDayOfMonth> ;
|
|
|
|
|
using FunctionToDayOfWeek = FunctionDateOrDateTimeToSomething<DataTypeUInt8, ToDayOfWeekImpl, NameToDayOfWeek> ;
|
|
|
|
|
using FunctionToHour = FunctionDateOrDateTimeToSomething<DataTypeUInt8, ToHourImpl, NameToHour> ;
|
|
|
|
|
using FunctionToMinute = FunctionDateOrDateTimeToSomething<DataTypeUInt8, ToMinuteImpl, NameToMinute> ;
|
|
|
|
|
using FunctionToSecond = FunctionDateOrDateTimeToSomething<DataTypeUInt8, ToSecondImpl, NameToSecond> ;
|
|
|
|
|
using FunctionToMonday = FunctionDateOrDateTimeToSomething<DataTypeDate, ToMondayImpl, NameToMonday> ;
|
|
|
|
|
using FunctionToStartOfMonth = FunctionDateOrDateTimeToSomething<DataTypeDate, ToStartOfMonthImpl, NameToStartOfMonth>;
|
|
|
|
|
using FunctionToStartOfQuarter = FunctionDateOrDateTimeToSomething<DataTypeDate, ToStartOfQuarterImpl, NameToStartOfQuarter> ;
|
|
|
|
|
using FunctionToStartOfYear = FunctionDateOrDateTimeToSomething<DataTypeDate, ToStartOfYearImpl, NameToStartOfYear> ;
|
|
|
|
|
using FunctionToStartOfMinute = FunctionDateOrDateTimeToSomething<DataTypeDateTime, ToStartOfMinuteImpl, NameToStartOfMinute>;
|
|
|
|
|
using FunctionToStartOfFiveMinute = FunctionDateOrDateTimeToSomething<DataTypeDateTime, ToStartOfFiveMinuteImpl, NameToStartOfFiveMinute>;
|
|
|
|
|
using FunctionToStartOfHour = FunctionDateOrDateTimeToSomething<DataTypeDateTime, ToStartOfHourImpl, NameToStartOfHour> ;
|
|
|
|
|
using FunctionToTime = FunctionDateOrDateTimeToSomething<DataTypeDateTime, ToTimeImpl, NameToTime> ;
|
|
|
|
|
|
|
|
|
|
using FunctionToRelativeYearNum = FunctionDateOrDateTimeToSomething<DataTypeUInt16, ToRelativeYearNumImpl, NameToRelativeYearNum> ;
|
|
|
|
|
using FunctionToRelativeMonthNum = FunctionDateOrDateTimeToSomething<DataTypeUInt32, ToRelativeMonthNumImpl, NameToRelativeMonthNum> ;
|
|
|
|
|
using FunctionToRelativeWeekNum = FunctionDateOrDateTimeToSomething<DataTypeUInt32, ToRelativeWeekNumImpl, NameToRelativeWeekNum> ;
|
|
|
|
|
using FunctionToRelativeDayNum = FunctionDateOrDateTimeToSomething<DataTypeUInt32, ToRelativeDayNumImpl, NameToRelativeDayNum> ;
|
|
|
|
|
|
|
|
|
|
using FunctionToRelativeHourNum = FunctionDateOrDateTimeToSomething<DataTypeUInt32, ToRelativeHourNumImpl, NameToRelativeHourNum> ;
|
|
|
|
|
using FunctionToRelativeMinuteNum = FunctionDateOrDateTimeToSomething<DataTypeUInt32, ToRelativeMinuteNumImpl, NameToRelativeMinuteNum> ;
|
|
|
|
|
using FunctionToRelativeSecondNum = FunctionDateOrDateTimeToSomething<DataTypeUInt32, ToRelativeSecondNumImpl, NameToRelativeSecondNum> ;
|
2014-01-22 12:27:55 +00:00
|
|
|
|
|
|
|
|
|
|
2011-10-16 04:17:41 +00:00
|
|
|
|
}
|