From 34c5d4c2201984cb225b0f1ed8f6d26fece9b904 Mon Sep 17 00:00:00 2001 From: Pavel Tiunov Date: Wed, 4 Dec 2019 18:30:39 -0800 Subject: [PATCH] feat: Minute and second granularities support --- packages/cubejs-api-gateway/index.js | 2 +- .../adapter/BaseMeasure.js | 2 +- .../adapter/BaseQuery.js | 51 +++- .../adapter/BaseTimeDimension.js | 10 +- .../adapter/BigqueryQuery.js | 4 +- .../adapter/ClickHouseQuery.js | 4 +- .../adapter/HiveQuery.js | 4 +- .../adapter/MssqlQuery.js | 4 +- .../adapter/MysqlQuery.js | 4 +- .../adapter/OracleQuery.js | 4 +- .../adapter/PostgresQuery.js | 4 +- .../adapter/PreAggregations.js | 24 +- .../adapter/PrestodbQuery.js | 4 +- .../adapter/SnowflakeQuery.js | 4 +- .../adapter/SqliteQuery.js | 4 +- .../adapter/VerticaQuery.js | 4 +- .../compiler/CubeValidator.js | 10 +- .../test/ClickHouseDataSchemaCompilerTest.js | 10 +- .../test/ClickHouseGraphBuilderTest.js | 156 +++++------ .../test/DataSchemaCompilerTest.js | 10 +- .../test/ExtensionsTest.js | 2 +- .../test/MSSqlPreAggregationsTest.js | 24 +- .../test/MongoBiQueryTest.js | 2 +- .../test/PreAggregationsTest.js | 34 +-- .../test/SQLGenerationTest.js | 248 +++++++++++------- 25 files changed, 369 insertions(+), 260 deletions(-) diff --git a/packages/cubejs-api-gateway/index.js b/packages/cubejs-api-gateway/index.js index 64bb3badcfffb..0864e7a8fde00 100644 --- a/packages/cubejs-api-gateway/index.js +++ b/packages/cubejs-api-gateway/index.js @@ -99,7 +99,7 @@ const querySchema = Joi.object().keys({ }).xor('dimension', 'member')), timeDimensions: Joi.array().items(Joi.object().keys({ dimension: id.required(), - granularity: Joi.valid('day', 'month', 'year', 'week', 'hour', null), + granularity: Joi.valid('day', 'month', 'year', 'week', 'hour', 'minute', 'second', null), dateRange: [ Joi.array().items(Joi.string()).min(1).max(2), Joi.string() diff --git a/packages/cubejs-schema-compiler/adapter/BaseMeasure.js b/packages/cubejs-schema-compiler/adapter/BaseMeasure.js index 053bd319155b8..359f4c902e61a 100644 --- a/packages/cubejs-schema-compiler/adapter/BaseMeasure.js +++ b/packages/cubejs-schema-compiler/adapter/BaseMeasure.js @@ -118,7 +118,7 @@ class BaseMeasure { return undefined; } if (interval.match(/day/)) { - return 'date'; + return 'day'; } else if (interval.match(/month/)) { return 'month'; } else if (interval.match(/year/)) { diff --git a/packages/cubejs-schema-compiler/adapter/BaseQuery.js b/packages/cubejs-schema-compiler/adapter/BaseQuery.js index d18297215e710..40cb94ac74d62 100644 --- a/packages/cubejs-schema-compiler/adapter/BaseQuery.js +++ b/packages/cubejs-schema-compiler/adapter/BaseQuery.js @@ -14,6 +14,15 @@ const PreAggregations = require('./PreAggregations'); const DEFAULT_PREAGGREGATIONS_SCHEMA = `stb_pre_aggregations`; +const standardGranularitiesParents = { + year: 'month', + week: 'day', + month: 'day', + day: 'hour', + hour: 'minute', + minute: 'second' +}; + class BaseQuery { constructor(compilers, options) { this.compilers = compilers; @@ -25,6 +34,8 @@ class BaseQuery { this.defaultOrder = this.defaultOrder.bind(this); this.initFromOptions(); + + this.granularityParentHierarchyCache = {}; } initFromOptions() { @@ -406,6 +417,23 @@ class BaseQuery { return this.convertTz(dateParam); } + granularityHierarchies() { + return R.fromPairs(Object.keys(standardGranularitiesParents).map(k => [k, this.granularityParentHierarchy(k)])); + } + + granularityParent(granularity) { + return standardGranularitiesParents[granularity]; + } + + granularityParentHierarchy(granularity) { + if (!this.granularityParentHierarchyCache[granularity]) { + this.granularityParentHierarchyCache[granularity] = [granularity].concat( + this.granularityParent(granularity) ? this.granularityParentHierarchy(this.granularityParent(granularity)) : [] + ); + } + return this.granularityParentHierarchyCache[granularity]; + } + minGranularity(granularityA, granularityB) { if (!granularityA) { return granularityB; @@ -413,18 +441,19 @@ class BaseQuery { if (!granularityB) { return granularityA; } - if (granularityA === 'hour' || granularityB === 'hour') { - return 'hour'; - } else if (granularityA === 'date' || granularityB === 'date') { - return 'date'; - } else if (granularityA === 'month' && granularityB === 'month') { - return 'month'; - } else if (granularityA === 'year' && granularityB === 'year') { - return 'year'; - } else if (granularityA === 'week' && granularityB === 'week') { - return 'week'; + const aHierarchy = R.reverse(this.granularityParentHierarchy(granularityA)); + const bHierarchy = R.reverse(this.granularityParentHierarchy(granularityB)); + let lastIndex = Math.max( + aHierarchy.findIndex((g, i) => g !== bHierarchy[i]), + bHierarchy.findIndex((g, i) => g !== aHierarchy[i]) + ); + if (lastIndex === -1 && aHierarchy.length === bHierarchy.length) { + lastIndex = aHierarchy.length - 1; + } + if (lastIndex <= 0) { + throw new Error(`Can't find common parent for '${granularityA}' and '${granularityB}'`); } - return 'date'; + return aHierarchy[lastIndex - 1]; } overTimeSeriesQuery(baseQueryFn, cumulativeMeasure) { diff --git a/packages/cubejs-schema-compiler/adapter/BaseTimeDimension.js b/packages/cubejs-schema-compiler/adapter/BaseTimeDimension.js index b1c170fa680b8..44f1275656c9f 100644 --- a/packages/cubejs-schema-compiler/adapter/BaseTimeDimension.js +++ b/packages/cubejs-schema-compiler/adapter/BaseTimeDimension.js @@ -5,7 +5,7 @@ const BaseFilter = require('./BaseFilter'); const UserError = require('../compiler/UserError'); const TIME_SERIES = { - date: (range) => + day: (range) => Array.from(range.by('day')) .map(d => [d.format('YYYY-MM-DDT00:00:00.000'), d.format('YYYY-MM-DDT23:59:59.999')]), month: (range) => @@ -17,6 +17,12 @@ const TIME_SERIES = { hour: (range) => Array.from(range.by('hour')) .map(d => [d.format('YYYY-MM-DDTHH:00:00.000'), d.format('YYYY-MM-DDTHH:59:59.999')]), + minute: (range) => + Array.from(range.by('minute')) + .map(d => [d.format('YYYY-MM-DDTHH:MM:00.000'), d.format('YYYY-MM-DDTHH:MM:59.999')]), + second: (range) => + Array.from(range.by('second')) + .map(d => [d.format('YYYY-MM-DDTHH:MM:SS.000'), d.format('YYYY-MM-DDTHH:MM:SS.999')]), week: (range) => Array.from(range.snapTo('isoweek').by('week')) .map(d => [d.startOf('isoweek').format('YYYY-MM-DDT00:00:00.000'), d.endOf('isoweek').format('YYYY-MM-DDT23:59:59.999')]) @@ -49,7 +55,7 @@ class BaseTimeDimension extends BaseFilter { } unescapedAliasName(granularity) { - const actualGranularity = granularity || this.granularity || 'date'; + const actualGranularity = granularity || this.granularity || 'day'; return `${this.query.aliasName(this.dimension)}_${actualGranularity}`; // TODO date here for rollups } diff --git a/packages/cubejs-schema-compiler/adapter/BigqueryQuery.js b/packages/cubejs-schema-compiler/adapter/BigqueryQuery.js index 5b88e98e99e8d..7b63609bc7f82 100644 --- a/packages/cubejs-schema-compiler/adapter/BigqueryQuery.js +++ b/packages/cubejs-schema-compiler/adapter/BigqueryQuery.js @@ -2,9 +2,11 @@ const BaseQuery = require('./BaseQuery'); const BaseFilter = require('./BaseFilter'); const GRANULARITY_TO_INTERVAL = { - date: 'DAY', + day: 'DAY', week: 'WEEK(MONDAY)', hour: 'HOUR', + minute: 'MINUTE', + second: 'SECOND', month: 'MONTH', year: 'YEAR' }; diff --git a/packages/cubejs-schema-compiler/adapter/ClickHouseQuery.js b/packages/cubejs-schema-compiler/adapter/ClickHouseQuery.js index e6540e191ce3b..ba862f5f2945b 100644 --- a/packages/cubejs-schema-compiler/adapter/ClickHouseQuery.js +++ b/packages/cubejs-schema-compiler/adapter/ClickHouseQuery.js @@ -5,8 +5,10 @@ const BaseQuery = require('./BaseQuery'); const BaseFilter = require('./BaseFilter'); const GRANULARITY_TO_INTERVAL = { - date: 'Day', + day: 'Day', hour: 'Hour', + minute: 'Minute', + second: 'Second', month: 'Month', quarter: 'Quarter', year: 'Year', diff --git a/packages/cubejs-schema-compiler/adapter/HiveQuery.js b/packages/cubejs-schema-compiler/adapter/HiveQuery.js index b3fd527d1b82b..fa561fcab9d83 100644 --- a/packages/cubejs-schema-compiler/adapter/HiveQuery.js +++ b/packages/cubejs-schema-compiler/adapter/HiveQuery.js @@ -4,9 +4,11 @@ const BaseQuery = require('./BaseQuery'); const BaseFilter = require('./BaseFilter'); const GRANULARITY_TO_INTERVAL = { - date: (date) => `DATE_FORMAT(${date}, 'yyyy-MM-dd 00:00:00.000')`, + day: (date) => `DATE_FORMAT(${date}, 'yyyy-MM-dd 00:00:00.000')`, week: (date) => `DATE_FORMAT(from_unixtime(unix_timestamp('1900-01-01 00:00:00') + floor((unix_timestamp(${date}) - unix_timestamp('1900-01-01 00:00:00')) / (60 * 60 * 24 * 7)) * (60 * 60 * 24 * 7)), 'yyyy-MM-dd 00:00:00.000')`, hour: (date) => `DATE_FORMAT(${date}, 'yyyy-MM-dd HH:00:00.000')`, + minute: (date) => `DATE_FORMAT(${date}, 'yyyy-MM-dd HH:mm:00.000')`, + second: (date) => `DATE_FORMAT(${date}, 'yyyy-MM-dd HH:mm:ss.000')`, month: (date) => `DATE_FORMAT(${date}, 'yyyy-MM-01 00:00:00.000')`, year: (date) => `DATE_FORMAT(${date}, 'yyyy-01-01 00:00:00.000')` }; diff --git a/packages/cubejs-schema-compiler/adapter/MssqlQuery.js b/packages/cubejs-schema-compiler/adapter/MssqlQuery.js index 20bbc34354a5b..d4f595e2d7899 100644 --- a/packages/cubejs-schema-compiler/adapter/MssqlQuery.js +++ b/packages/cubejs-schema-compiler/adapter/MssqlQuery.js @@ -29,9 +29,11 @@ class MssqlParamAllocator extends ParamAllocator { } const GRANULARITY_TO_INTERVAL = { - date: (date) => `FORMAT(${date}, 'yyyy-MM-ddT00:00:00.000')`, + day: (date) => `FORMAT(${date}, 'yyyy-MM-ddT00:00:00.000')`, week: (date) => `FORMAT(dateadd(week, DATEDIFF(week, '1900-01-01', ${date}), '1900-01-01'), 'yyyy-MM-ddT00:00:00.000')`, hour: (date) => `FORMAT(${date}, 'yyyy-MM-ddTHH:00:00.000')`, + minute: (date) => `FORMAT(${date}, 'yyyy-MM-ddTHH:mm:00.000')`, + second: (date) => `FORMAT(${date}, 'yyyy-MM-ddTHH:mm:ss.000')`, month: (date) => `FORMAT(${date}, 'yyyy-MM-01T00:00:00.000')`, year: (date) => `FORMAT(${date}, 'yyyy-01-01T00:00:00.000')` }; diff --git a/packages/cubejs-schema-compiler/adapter/MysqlQuery.js b/packages/cubejs-schema-compiler/adapter/MysqlQuery.js index 8a1a83fcd5223..091a6d59229bc 100644 --- a/packages/cubejs-schema-compiler/adapter/MysqlQuery.js +++ b/packages/cubejs-schema-compiler/adapter/MysqlQuery.js @@ -4,9 +4,11 @@ const BaseQuery = require('./BaseQuery'); const BaseFilter = require('./BaseFilter'); const GRANULARITY_TO_INTERVAL = { - date: (date) => `DATE_FORMAT(${date}, '%Y-%m-%dT00:00:00.000')`, + day: (date) => `DATE_FORMAT(${date}, '%Y-%m-%dT00:00:00.000')`, week: (date) => `DATE_FORMAT(date_add('1900-01-01', interval TIMESTAMPDIFF(WEEK, '1900-01-01', ${date}) WEEK), '%Y-%m-%dT00:00:00.000')`, hour: (date) => `DATE_FORMAT(${date}, '%Y-%m-%dT%H:00:00.000')`, + minute: (date) => `DATE_FORMAT(${date}, '%Y-%m-%dT%H:%M:00.000')`, + second: (date) => `DATE_FORMAT(${date}, '%Y-%m-%dT%H:%M:%S.000')`, month: (date) => `DATE_FORMAT(${date}, '%Y-%m-01T00:00:00.000')`, year: (date) => `DATE_FORMAT(${date}, '%Y-01-01T00:00:00.000')` }; diff --git a/packages/cubejs-schema-compiler/adapter/OracleQuery.js b/packages/cubejs-schema-compiler/adapter/OracleQuery.js index 9ffe757491c1e..064821bacf8a5 100644 --- a/packages/cubejs-schema-compiler/adapter/OracleQuery.js +++ b/packages/cubejs-schema-compiler/adapter/OracleQuery.js @@ -2,9 +2,11 @@ const BaseQuery = require('./BaseQuery'); const BaseFilter = require('./BaseFilter'); const GRANULARITY_VALUE = { - date: 'DD', + day: 'DD', week: 'IW', hour: 'HH24', + minute: 'mm', + second: 'ss', month: 'MM', year: 'YYYY' }; diff --git a/packages/cubejs-schema-compiler/adapter/PostgresQuery.js b/packages/cubejs-schema-compiler/adapter/PostgresQuery.js index 6eb26e984296d..3efae2bfde4b8 100644 --- a/packages/cubejs-schema-compiler/adapter/PostgresQuery.js +++ b/packages/cubejs-schema-compiler/adapter/PostgresQuery.js @@ -2,9 +2,11 @@ const BaseQuery = require('./BaseQuery'); const ParamAllocator = require('./ParamAllocator'); const GRANULARITY_TO_INTERVAL = { - date: 'day', + day: 'day', week: 'week', hour: 'hour', + minute: 'minute', + second: 'second', month: 'month', year: 'year' }; diff --git a/packages/cubejs-schema-compiler/adapter/PreAggregations.js b/packages/cubejs-schema-compiler/adapter/PreAggregations.js index ccd6e544d84ec..51ceaaa23f983 100644 --- a/packages/cubejs-schema-compiler/adapter/PreAggregations.js +++ b/packages/cubejs-schema-compiler/adapter/PreAggregations.js @@ -131,7 +131,7 @@ class PreAggregations { function sortTimeDimensions(timeDimensions) { return timeDimensions && R.sortBy( R.prop(0), - timeDimensions.map(d => [d.dimension, d.granularity || 'date']) + timeDimensions.map(d => [d.dimension, d.granularity || 'day']) ) || []; } @@ -145,6 +145,7 @@ class PreAggregations { const isAdditive = R.all(m => m.isAdditive(), query.measures); const leafMeasureAdditive = R.all(path => query.newMeasure(path).isAdditive(), leafMeasurePaths); + const granularityHierarchies = query.granularityHierarchies(); return { sortedDimensions, @@ -154,7 +155,8 @@ class PreAggregations { leafMeasures: leafMeasurePaths, hasNoTimeDimensionsWithoutGranularity, allFiltersWithinSelectedDimensions, - isAdditive + isAdditive, + granularityHierarchies }; } @@ -198,7 +200,7 @@ class PreAggregations { function sortTimeDimensions(timeDimensions) { return timeDimensions && R.sortBy( d => d.join('.'), - timeDimensions.map(d => [d.dimension, d.granularity || 'date']) + timeDimensions.map(d => [d.dimension, d.granularity || 'day']) ) || []; } // TimeDimension :: [Dimension, Granularity] @@ -206,15 +208,7 @@ class PreAggregations { function expandTimeDimension(timeDimension) { const [dimension, granularity] = timeDimension; const makeTimeDimension = newGranularity => [dimension, newGranularity]; - - const tds = [timeDimension]; - const updateTds = (...granularitys) => tds.push(...granularitys.map(makeTimeDimension)) - - if (granularity === 'year') updateTds('hour', 'date', 'month'); - if (['month', 'week'].includes(granularity)) updateTds('hour', 'date'); - if (granularity === 'date') updateTds('hour'); - - return tds; + return (transformedQuery.granularityHierarchies[granularity] || [granularity]).map(makeTimeDimension); } // [[TimeDimension]] const queryTimeDimensionsList = transformedQuery.sortedTimeDimensions.map(expandTimeDimension); @@ -371,10 +365,6 @@ class PreAggregations { } castGranularity(granularity) { - // TODO replace date granularity with day - if (granularity === 'day') { - return 'date'; - } return granularity; } @@ -486,7 +476,7 @@ class PreAggregations { this.evaluateAllReferences(preAggregationForQuery.cube, preAggregationForQuery.preAggregation).measures ); - const rollupGranularity = this.castGranularity(preAggregationForQuery.preAggregation.granularity) || 'date'; + const rollupGranularity = this.castGranularity(preAggregationForQuery.preAggregation.granularity) || 'day'; return this.query.evaluateSymbolSqlWithContext( () => `SELECT ${this.query.baseSelect()} FROM ${table} ${this.query.baseWhere(filters)}` + diff --git a/packages/cubejs-schema-compiler/adapter/PrestodbQuery.js b/packages/cubejs-schema-compiler/adapter/PrestodbQuery.js index 438f14813656a..92356fe3223ae 100644 --- a/packages/cubejs-schema-compiler/adapter/PrestodbQuery.js +++ b/packages/cubejs-schema-compiler/adapter/PrestodbQuery.js @@ -2,9 +2,11 @@ const BaseQuery = require('./BaseQuery'); const BaseFilter = require('./BaseFilter'); const GRANULARITY_TO_INTERVAL = { - date: 'day', + day: 'day', week: 'week', hour: 'hour', + minute: 'minute', + second: 'second', month: 'month', year: 'year' }; diff --git a/packages/cubejs-schema-compiler/adapter/SnowflakeQuery.js b/packages/cubejs-schema-compiler/adapter/SnowflakeQuery.js index bd174f9b94a48..fec737c2d6672 100644 --- a/packages/cubejs-schema-compiler/adapter/SnowflakeQuery.js +++ b/packages/cubejs-schema-compiler/adapter/SnowflakeQuery.js @@ -1,9 +1,11 @@ const BaseQuery = require('./BaseQuery'); const GRANULARITY_TO_INTERVAL = { - date: 'DAY', + day: 'DAY', week: 'WEEK', hour: 'HOUR', + minute: 'MINUTE', + second: 'SECOND', month: 'MONTH', year: 'YEAR' }; diff --git a/packages/cubejs-schema-compiler/adapter/SqliteQuery.js b/packages/cubejs-schema-compiler/adapter/SqliteQuery.js index 7eb33fd9a6b1b..87cd87429e96b 100644 --- a/packages/cubejs-schema-compiler/adapter/SqliteQuery.js +++ b/packages/cubejs-schema-compiler/adapter/SqliteQuery.js @@ -4,9 +4,11 @@ const BaseQuery = require('./BaseQuery'); const BaseFilter = require('./BaseFilter'); const GRANULARITY_TO_INTERVAL = { - date: (date) => `strftime('%Y-%m-%dT00:00:00.000', ${date})`, + day: (date) => `strftime('%Y-%m-%dT00:00:00.000', ${date})`, week: (date) => `strftime('%Y-%m-%dT00:00:00.000', CASE WHEN date(${date}, 'weekday 1') = date(${date}) THEN date(${date}, 'weekday 1') ELSE date(${date}, 'weekday 1', '-7 days') END)`, hour: (date) => `strftime('%Y-%m-%dT%H:00:00.000', ${date})`, + minute: (date) => `strftime('%Y-%m-%dT%H:%M:00.000', ${date})`, + second: (date) => `strftime('%Y-%m-%dT%H:%M:%S.000', ${date})`, month: (date) => `strftime('%Y-%m-01T00:00:00.000', ${date})`, year: (date) => `strftime('%Y-01-01T00:00:00.000', ${date})` }; diff --git a/packages/cubejs-schema-compiler/adapter/VerticaQuery.js b/packages/cubejs-schema-compiler/adapter/VerticaQuery.js index 22718c29357cb..039be771b5368 100644 --- a/packages/cubejs-schema-compiler/adapter/VerticaQuery.js +++ b/packages/cubejs-schema-compiler/adapter/VerticaQuery.js @@ -1,9 +1,11 @@ const BaseQuery = require('./BaseQuery'); const GRANULARITY_TO_INTERVAL = { - date: 'DD', + day: 'DD', week: 'W', hour: 'HH24', + minute: 'mm', + second: 'ss', month: 'MM', year: 'YY' }; diff --git a/packages/cubejs-schema-compiler/compiler/CubeValidator.js b/packages/cubejs-schema-compiler/compiler/CubeValidator.js index a0550203a9a12..b494a4cad56b2 100644 --- a/packages/cubejs-schema-compiler/compiler/CubeValidator.js +++ b/packages/cubejs-schema-compiler/compiler/CubeValidator.js @@ -115,7 +115,7 @@ const cubeSchema = Joi.object().keys({ ]) })), else: Joi.object().keys({ - label: Joi.alternatives([ + label: Joi.alternatives([ Joi.string(), Joi.object().keys({ sql: Joi.func().required() @@ -167,7 +167,9 @@ const cubeSchema = Joi.object().keys({ dimensionReferences: Joi.func(), segmentReferences: Joi.func(), timeDimensionReference: Joi.func().required(), - granularity: Joi.any().valid('hour', 'day', 'week', 'month', 'year').required() + granularity: Joi.any().valid( + 'second', 'minute', 'hour', 'day', 'week', 'month', 'year' + ).required() })) )) }); @@ -179,8 +181,8 @@ class CubeValidator { } compile(cubes, errorReporter) { - return this.cubeSymbols.cubeList.map((v) => - this.validate(this.cubeSymbols.getCubeDefinition(v.name), errorReporter.inContext(`${v.name} cube`)) + return this.cubeSymbols.cubeList.map( + (v) => this.validate(this.cubeSymbols.getCubeDefinition(v.name), errorReporter.inContext(`${v.name} cube`)) ); } diff --git a/packages/cubejs-schema-compiler/test/ClickHouseDataSchemaCompilerTest.js b/packages/cubejs-schema-compiler/test/ClickHouseDataSchemaCompilerTest.js index 45171d78a3186..b0ab9f72a0f9d 100644 --- a/packages/cubejs-schema-compiler/test/ClickHouseDataSchemaCompilerTest.js +++ b/packages/cubejs-schema-compiler/test/ClickHouseDataSchemaCompilerTest.js @@ -150,7 +150,7 @@ describe('ClickHouse DataSchemaCompiler', function test() { measures: ['visitors.visitor_count'], timeDimensions: [{ dimension: 'visitors.created_at', - granularity: 'date', + granularity: 'day', dateRange: ['2017-01-01', '2017-01-30'] }], filters: [{ @@ -169,10 +169,10 @@ describe('ClickHouse DataSchemaCompiler', function test() { return dbRunner.testQuery(query.buildSqlAndParams()).then(res => { res.should.be.deepEqual( [ - { "visitors__created_at_date": "2017-01-02T00:00:00.000", "visitors__visitor_count": "1" }, - { "visitors__created_at_date": "2017-01-04T00:00:00.000", "visitors__visitor_count": "1" }, - { "visitors__created_at_date": "2017-01-05T00:00:00.000", "visitors__visitor_count": "1" }, - { "visitors__created_at_date": "2017-01-06T00:00:00.000", "visitors__visitor_count": "2" } + { "visitors__created_at_day": "2017-01-02T00:00:00.000", "visitors__visitor_count": "1" }, + { "visitors__created_at_day": "2017-01-04T00:00:00.000", "visitors__visitor_count": "1" }, + { "visitors__created_at_day": "2017-01-05T00:00:00.000", "visitors__visitor_count": "1" }, + { "visitors__created_at_day": "2017-01-06T00:00:00.000", "visitors__visitor_count": "2" } ] ); }); diff --git a/packages/cubejs-schema-compiler/test/ClickHouseGraphBuilderTest.js b/packages/cubejs-schema-compiler/test/ClickHouseGraphBuilderTest.js index 5b9c7f705a23f..6a9c5e4e38939 100644 --- a/packages/cubejs-schema-compiler/test/ClickHouseGraphBuilderTest.js +++ b/packages/cubejs-schema-compiler/test/ClickHouseGraphBuilderTest.js @@ -302,7 +302,7 @@ describe('ClickHouse JoinGraph', function test() { ], timeDimensions: [{ dimension: 'visitors.created_at', - granularity: 'date', + granularity: 'day', dateRange: ['2017-01-01', '2017-01-30'] }], timezone: 'America/Los_Angeles', @@ -317,28 +317,28 @@ describe('ClickHouse JoinGraph', function test() { res.should.be.deepEqual( [ { - "visitors__created_at_date": "2017-01-02T00:00:00.000Z", + "visitors__created_at_day": "2017-01-02T00:00:00.000Z", "visitors__visitor_revenue": "100", "visitors__visitor_count": "1", "visitor_checkins__visitor_checkins_count": "3", "visitors__per_visitor_revenue": "100" }, { - "visitors__created_at_date": "2017-01-04T00:00:00.000Z", + "visitors__created_at_day": "2017-01-04T00:00:00.000Z", "visitors__visitor_revenue": "200", "visitors__visitor_count": "1", "visitor_checkins__visitor_checkins_count": "2", "visitors__per_visitor_revenue": "200" }, { - "visitors__created_at_date": "2017-01-05T00:00:00.000Z", + "visitors__created_at_day": "2017-01-05T00:00:00.000Z", "visitors__visitor_revenue": null, "visitors__visitor_count": "1", "visitor_checkins__visitor_checkins_count": "1", "visitors__per_visitor_revenue": null }, { - "visitors__created_at_date": "2017-01-06T00:00:00.000Z", + "visitors__created_at_day": "2017-01-06T00:00:00.000Z", "visitors__visitor_revenue": null, "visitors__visitor_count": "2", "visitor_checkins__visitor_checkins_count": "0", @@ -383,7 +383,7 @@ describe('ClickHouse JoinGraph', function test() { ], timeDimensions: [{ dimension: 'visitors.created_at', - granularity: 'date', + granularity: 'day', dateRange: ['2017-01-01', '2017-01-10'] }], order: [{ @@ -399,34 +399,34 @@ describe('ClickHouse JoinGraph', function test() { debugLog(JSON.stringify(res)); res.should.be.deepEqual( [{ - "visitors__created_at_date": "2017-01-01T00:00:00.000Z", + "visitors__created_at_day": "2017-01-01T00:00:00.000Z", "visitors__revenue_running": null }, { - "visitors__created_at_date": "2017-01-02T00:00:00.000Z", + "visitors__created_at_day": "2017-01-02T00:00:00.000Z", "visitors__revenue_running": "100" }, { - "visitors__created_at_date": "2017-01-03T00:00:00.000Z", + "visitors__created_at_day": "2017-01-03T00:00:00.000Z", "visitors__revenue_running": "100" }, { - "visitors__created_at_date": "2017-01-04T00:00:00.000Z", + "visitors__created_at_day": "2017-01-04T00:00:00.000Z", "visitors__revenue_running": "300" }, { - "visitors__created_at_date": "2017-01-05T00:00:00.000Z", + "visitors__created_at_day": "2017-01-05T00:00:00.000Z", "visitors__revenue_running": "600" }, { - "visitors__created_at_date": "2017-01-06T00:00:00.000Z", + "visitors__created_at_day": "2017-01-06T00:00:00.000Z", "visitors__revenue_running": "1500" }, { - "visitors__created_at_date": "2017-01-07T00:00:00.000Z", + "visitors__created_at_day": "2017-01-07T00:00:00.000Z", "visitors__revenue_running": "1500" }, { - "visitors__created_at_date": "2017-01-08T00:00:00.000Z", + "visitors__created_at_day": "2017-01-08T00:00:00.000Z", "visitors__revenue_running": "1500" }, { - "visitors__created_at_date": "2017-01-09T00:00:00.000Z", + "visitors__created_at_day": "2017-01-09T00:00:00.000Z", "visitors__revenue_running": "1500" }, { - "visitors__created_at_date": "2017-01-10T00:00:00.000Z", + "visitors__created_at_day": "2017-01-10T00:00:00.000Z", "visitors__revenue_running": "1500" }] ); @@ -444,7 +444,7 @@ describe('ClickHouse JoinGraph', function test() { ], timeDimensions: [{ dimension: 'visitors.created_at', - granularity: 'date', + granularity: 'day', dateRange: ['2017-01-01', '2017-01-10'] }], order: [{ @@ -452,16 +452,16 @@ describe('ClickHouse JoinGraph', function test() { }], timezone: 'America/Los_Angeles' }, [ - { "visitors__created_at_date": "2017-01-01T00:00:00.000Z", "visitors__revenue_rolling": null }, - { "visitors__created_at_date": "2017-01-02T00:00:00.000Z", "visitors__revenue_rolling": null }, - { "visitors__created_at_date": "2017-01-03T00:00:00.000Z", "visitors__revenue_rolling": "100" }, - { "visitors__created_at_date": "2017-01-04T00:00:00.000Z", "visitors__revenue_rolling": "100" }, - { "visitors__created_at_date": "2017-01-05T00:00:00.000Z", "visitors__revenue_rolling": "200" }, - { "visitors__created_at_date": "2017-01-06T00:00:00.000Z", "visitors__revenue_rolling": "500" }, - { "visitors__created_at_date": "2017-01-07T00:00:00.000Z", "visitors__revenue_rolling": "1200" }, - { "visitors__created_at_date": "2017-01-08T00:00:00.000Z", "visitors__revenue_rolling": "900" }, - { "visitors__created_at_date": "2017-01-09T00:00:00.000Z", "visitors__revenue_rolling": null }, - { "visitors__created_at_date": "2017-01-10T00:00:00.000Z", "visitors__revenue_rolling": null } + { "visitors__created_at_day": "2017-01-01T00:00:00.000Z", "visitors__revenue_rolling": null }, + { "visitors__created_at_day": "2017-01-02T00:00:00.000Z", "visitors__revenue_rolling": null }, + { "visitors__created_at_day": "2017-01-03T00:00:00.000Z", "visitors__revenue_rolling": "100" }, + { "visitors__created_at_day": "2017-01-04T00:00:00.000Z", "visitors__revenue_rolling": "100" }, + { "visitors__created_at_day": "2017-01-05T00:00:00.000Z", "visitors__revenue_rolling": "200" }, + { "visitors__created_at_day": "2017-01-06T00:00:00.000Z", "visitors__revenue_rolling": "500" }, + { "visitors__created_at_day": "2017-01-07T00:00:00.000Z", "visitors__revenue_rolling": "1200" }, + { "visitors__created_at_day": "2017-01-08T00:00:00.000Z", "visitors__revenue_rolling": "900" }, + { "visitors__created_at_day": "2017-01-09T00:00:00.000Z", "visitors__revenue_rolling": null }, + { "visitors__created_at_day": "2017-01-10T00:00:00.000Z", "visitors__revenue_rolling": null } ]) ); @@ -474,7 +474,7 @@ describe('ClickHouse JoinGraph', function test() { ], timeDimensions: [{ dimension: 'visitors.created_at', - granularity: 'date', + granularity: 'day', dateRange: ['2017-01-01', '2017-01-10'] }], order: [{ @@ -483,19 +483,19 @@ describe('ClickHouse JoinGraph', function test() { timezone: 'America/Los_Angeles' }, [ { - "visitors__created_at_date": "2017-01-02T00:00:00.000Z", "visitors__revenue_rolling": null, + "visitors__created_at_day": "2017-01-02T00:00:00.000Z", "visitors__revenue_rolling": null, "visitor_checkins__visitor_checkins_count": "3" }, { - "visitors__created_at_date": "2017-01-04T00:00:00.000Z", "visitors__revenue_rolling": "100", + "visitors__created_at_day": "2017-01-04T00:00:00.000Z", "visitors__revenue_rolling": "100", 'visitor_checkins.visitor_checkins_count': '2' }, { - "visitors__created_at_date": "2017-01-05T00:00:00.000Z", "visitors__revenue_rolling": "200", + "visitors__created_at_day": "2017-01-05T00:00:00.000Z", "visitors__revenue_rolling": "200", 'visitor_checkins.visitor_checkins_count': '1' }, { - "visitors__created_at_date": "2017-01-06T00:00:00.000Z", "visitors__revenue_rolling": "500", + "visitors__created_at_day": "2017-01-06T00:00:00.000Z", "visitors__revenue_rolling": "500", 'visitor_checkins.visitor_checkins_count': '0' } ]) @@ -529,7 +529,7 @@ describe('ClickHouse JoinGraph', function test() { ], timeDimensions: [{ dimension: 'visitors.created_at', - granularity: 'date', + granularity: 'day', dateRange: ['2017-01-01', '2017-01-10'] }], order: [{ @@ -537,16 +537,16 @@ describe('ClickHouse JoinGraph', function test() { }], timezone: 'America/Los_Angeles' }, [ - { "visitors__created_at_date": "2017-01-01T00:00:00.000Z", "visitors__count_rolling": null }, - { "visitors__created_at_date": "2017-01-02T00:00:00.000Z", "visitors__count_rolling": null }, - { "visitors__created_at_date": "2017-01-03T00:00:00.000Z", "visitors__count_rolling": "1" }, - { "visitors__created_at_date": "2017-01-04T00:00:00.000Z", "visitors__count_rolling": "1" }, - { "visitors__created_at_date": "2017-01-05T00:00:00.000Z", "visitors__count_rolling": "1" }, - { "visitors__created_at_date": "2017-01-06T00:00:00.000Z", "visitors__count_rolling": "2" }, - { "visitors__created_at_date": "2017-01-07T00:00:00.000Z", "visitors__count_rolling": "3" }, - { "visitors__created_at_date": "2017-01-08T00:00:00.000Z", "visitors__count_rolling": "2" }, - { "visitors__created_at_date": "2017-01-09T00:00:00.000Z", "visitors__count_rolling": null }, - { "visitors__created_at_date": "2017-01-10T00:00:00.000Z", "visitors__count_rolling": null } + { "visitors__created_at_day": "2017-01-01T00:00:00.000Z", "visitors__count_rolling": null }, + { "visitors__created_at_day": "2017-01-02T00:00:00.000Z", "visitors__count_rolling": null }, + { "visitors__created_at_day": "2017-01-03T00:00:00.000Z", "visitors__count_rolling": "1" }, + { "visitors__created_at_day": "2017-01-04T00:00:00.000Z", "visitors__count_rolling": "1" }, + { "visitors__created_at_day": "2017-01-05T00:00:00.000Z", "visitors__count_rolling": "1" }, + { "visitors__created_at_day": "2017-01-06T00:00:00.000Z", "visitors__count_rolling": "2" }, + { "visitors__created_at_day": "2017-01-07T00:00:00.000Z", "visitors__count_rolling": "3" }, + { "visitors__created_at_day": "2017-01-08T00:00:00.000Z", "visitors__count_rolling": "2" }, + { "visitors__created_at_day": "2017-01-09T00:00:00.000Z", "visitors__count_rolling": null }, + { "visitors__created_at_day": "2017-01-10T00:00:00.000Z", "visitors__count_rolling": null } ]) ); @@ -557,7 +557,7 @@ describe('ClickHouse JoinGraph', function test() { ], timeDimensions: [{ dimension: 'visitors.createdAtSqlUtils', - granularity: 'date', + granularity: 'day', dateRange: ['2017-01-01', '2017-01-10'] }], order: [{ @@ -565,10 +565,10 @@ describe('ClickHouse JoinGraph', function test() { }], timezone: 'America/Los_Angeles' }, [ - {"visitors__created_at_sql_utils_date":"2017-01-02T00:00:00.000","visitors__visitor_count":"1"}, - {"visitors__created_at_sql_utils_date":"2017-01-04T00:00:00.000","visitors__visitor_count":"1"}, - {"visitors__created_at_sql_utils_date":"2017-01-05T00:00:00.000","visitors__visitor_count":"1"}, - {"visitors__created_at_sql_utils_date":"2017-01-06T00:00:00.000","visitors__visitor_count":"2"} + {"visitors__created_at_sql_utils_day":"2017-01-02T00:00:00.000","visitors__visitor_count":"1"}, + {"visitors__created_at_sql_utils_day":"2017-01-04T00:00:00.000","visitors__visitor_count":"1"}, + {"visitors__created_at_sql_utils_day":"2017-01-05T00:00:00.000","visitors__visitor_count":"1"}, + {"visitors__created_at_sql_utils_day":"2017-01-06T00:00:00.000","visitors__visitor_count":"2"} ]) ); @@ -600,7 +600,7 @@ describe('ClickHouse JoinGraph', function test() { ], timeDimensions: [{ dimension: 'visitors.created_at', - granularity: 'date', + granularity: 'day', dateRange: ['2017-01-01', '2017-01-10'] }], order: [{ @@ -608,16 +608,16 @@ describe('ClickHouse JoinGraph', function test() { }], timezone: 'America/Los_Angeles' }, [ - { "visitors__created_at_date": "2017-01-01T00:00:00.000Z", "visitors__running_revenue_per_count": null }, - { "visitors__created_at_date": "2017-01-02T00:00:00.000Z", "visitors__running_revenue_per_count": "100" }, - { "visitors__created_at_date": "2017-01-03T00:00:00.000Z", "visitors__running_revenue_per_count": "100" }, - { "visitors__created_at_date": "2017-01-04T00:00:00.000Z", "visitors__running_revenue_per_count": "150" }, - { "visitors__created_at_date": "2017-01-05T00:00:00.000Z", "visitors__running_revenue_per_count": "200" }, - { "visitors__created_at_date": "2017-01-06T00:00:00.000Z", "visitors__running_revenue_per_count": "300" }, - { "visitors__created_at_date": "2017-01-07T00:00:00.000Z", "visitors__running_revenue_per_count": "300" }, - { "visitors__created_at_date": "2017-01-08T00:00:00.000Z", "visitors__running_revenue_per_count": "300" }, - { "visitors__created_at_date": "2017-01-09T00:00:00.000Z", "visitors__running_revenue_per_count": "300" }, - { "visitors__created_at_date": "2017-01-10T00:00:00.000Z", "visitors__running_revenue_per_count": "300" } + { "visitors__created_at_day": "2017-01-01T00:00:00.000Z", "visitors__running_revenue_per_count": null }, + { "visitors__created_at_day": "2017-01-02T00:00:00.000Z", "visitors__running_revenue_per_count": "100" }, + { "visitors__created_at_day": "2017-01-03T00:00:00.000Z", "visitors__running_revenue_per_count": "100" }, + { "visitors__created_at_day": "2017-01-04T00:00:00.000Z", "visitors__running_revenue_per_count": "150" }, + { "visitors__created_at_day": "2017-01-05T00:00:00.000Z", "visitors__running_revenue_per_count": "200" }, + { "visitors__created_at_day": "2017-01-06T00:00:00.000Z", "visitors__running_revenue_per_count": "300" }, + { "visitors__created_at_day": "2017-01-07T00:00:00.000Z", "visitors__running_revenue_per_count": "300" }, + { "visitors__created_at_day": "2017-01-08T00:00:00.000Z", "visitors__running_revenue_per_count": "300" }, + { "visitors__created_at_day": "2017-01-09T00:00:00.000Z", "visitors__running_revenue_per_count": "300" }, + { "visitors__created_at_day": "2017-01-10T00:00:00.000Z", "visitors__running_revenue_per_count": "300" } ]) ); @@ -630,7 +630,7 @@ describe('ClickHouse JoinGraph', function test() { ], timeDimensions: [{ dimension: 'visitors.created_at', - granularity: 'date', + granularity: 'day', dateRange: ['2017-01-01', '2017-01-10'] }], order: [{ @@ -875,7 +875,7 @@ describe('ClickHouse JoinGraph', function test() { ], timeDimensions: [{ dimension: 'visitors.created_at', - granularity: 'date', + granularity: 'day', dateRange: ['2017-01-01', '2017-01-30'] }], timezone: 'America/Los_Angeles', @@ -892,19 +892,19 @@ describe('ClickHouse JoinGraph', function test() { res.should.be.deepEqual( [{ "visitors__checkins": "0", - "visitors__created_at_date": "2017-01-06T00:00:00.000", + "visitors__created_at_day": "2017-01-06T00:00:00.000", "visitors__visitor_count": "2" }, { "visitors__checkins": "1", - "visitors__created_at_date": "2017-01-05T00:00:00.000", + "visitors__created_at_day": "2017-01-05T00:00:00.000", "visitors__visitor_count": "1" }, { "visitors__checkins": "2", - "visitors__created_at_date": "2017-01-04T00:00:00.000", + "visitors__created_at_day": "2017-01-04T00:00:00.000", "visitors__visitor_count": "1" }, { "visitors__checkins": "3", - "visitors__created_at_date": "2017-01-02T00:00:00.000", + "visitors__created_at_day": "2017-01-02T00:00:00.000", "visitors__visitor_count": "1" }] ); @@ -925,7 +925,7 @@ describe('ClickHouse JoinGraph', function test() { ], timeDimensions: [{ dimension: 'visitors.created_at', - granularity: 'date', + granularity: 'day', dateRange: ['2017-01-01', '2017-01-30'] }], timezone: 'America/Los_Angeles', @@ -944,7 +944,7 @@ describe('ClickHouse JoinGraph', function test() { return dbRunner.testQuery(query.buildSqlAndParams()).then(res => { debugLog(JSON.stringify(res)); res.should.be.deepEqual( - [{ "visitors__created_at_date": "2017-01-02T00:00:00.000Z", "visitors__average_checkins": "6__0000000000000000" }] + [{ "visitors__created_at_day": "2017-01-02T00:00:00.000Z", "visitors__average_checkins": "6__0000000000000000" }] ); }); }); @@ -974,7 +974,7 @@ describe('ClickHouse JoinGraph', function test() { ], timeDimensions: [{ dimension: 'visitors.created_at', - granularity: 'date', + granularity: 'day', dateRange: ['2017-01-01', '2017-01-30'] }], timezone: 'America/Los_Angeles', @@ -983,15 +983,15 @@ describe('ClickHouse JoinGraph', function test() { }] }, [ { - "visitors__min_visitor_checkin_date_date": "2017-01-02T00:00:00.000Z", + "visitors__min_visitor_checkin_date_day": "2017-01-02T00:00:00.000Z", "visitors__visitor_count": "1" }, { - "visitors__min_visitor_checkin_date_date": "2017-01-04T00:00:00.000Z", + "visitors__min_visitor_checkin_date_day": "2017-01-04T00:00:00.000Z", "visitors__visitor_count": "1" }, { - "visitors__min_visitor_checkin_date_date": "2017-01-05T00:00:00.000Z", + "visitors__min_visitor_checkin_date_day": "2017-01-05T00:00:00.000Z", "visitors__visitor_count": "1" } ]).then(() => { @@ -1008,7 +1008,7 @@ describe('ClickHouse JoinGraph', function test() { ], timeDimensions: [{ dimension: 'visitors.minVisitorCheckinDate', - granularity: 'date', + granularity: 'day', dateRange: ['2017-01-01', '2017-01-30'] }], timezone: 'America/Los_Angeles', @@ -1017,15 +1017,15 @@ describe('ClickHouse JoinGraph', function test() { }] }, [ { - "visitors__min_visitor_checkin_date_date": "2017-01-02T00:00:00.000", + "visitors__min_visitor_checkin_date_day": "2017-01-02T00:00:00.000", "visitors__visitor_count": "1" }, { - "visitors__min_visitor_checkin_date_date": "2017-01-04T00:00:00.000", + "visitors__min_visitor_checkin_date_day": "2017-01-04T00:00:00.000", "visitors__visitor_count": "1" }, { - "visitors__min_visitor_checkin_date_date": "2017-01-05T00:00:00.000", + "visitors__min_visitor_checkin_date_day": "2017-01-05T00:00:00.000", "visitors__visitor_count": "1" } ]) @@ -1038,7 +1038,7 @@ describe('ClickHouse JoinGraph', function test() { ], timeDimensions: [{ dimension: 'visitors.minVisitorCheckinDate1', - granularity: 'date', + granularity: 'day', dateRange: ['2017-01-01', '2017-01-30'] }], timezone: 'America/Los_Angeles', @@ -1086,7 +1086,7 @@ describe('ClickHouse JoinGraph', function test() { dimensions: ['visitor_checkins.source'], timeDimensions: [{ dimension: 'visitors.created_at', - granularity: 'date', + granularity: 'day', dateRange: ['2017-01-01', '2017-01-30'] }], timezone: 'America/Los_Angeles', @@ -1119,7 +1119,7 @@ describe('ClickHouse JoinGraph', function test() { [ { "visitor_checkins__source": "google", - "visitors__created_at_date": "2017-01-02T00:00:00.000Z", + "visitors__created_at_day": "2017-01-02T00:00:00.000Z", "visitors__per_visitor_revenue": "100" } ] diff --git a/packages/cubejs-schema-compiler/test/DataSchemaCompilerTest.js b/packages/cubejs-schema-compiler/test/DataSchemaCompilerTest.js index d0235f2dc206e..5930d41723f1a 100644 --- a/packages/cubejs-schema-compiler/test/DataSchemaCompilerTest.js +++ b/packages/cubejs-schema-compiler/test/DataSchemaCompilerTest.js @@ -144,7 +144,7 @@ describe('DataSchemaCompiler', function test() { measures: ['visitors.visitor_count'], timeDimensions: [{ dimension: 'visitors.created_at', - granularity: 'date', + granularity: 'day', dateRange: ['2017-01-01', '2017-01-30'] }], filters: [{ @@ -162,10 +162,10 @@ describe('DataSchemaCompiler', function test() { return dbRunner.testQuery(query.buildSqlAndParams()).then(res => { res.should.be.deepEqual( [ - { "visitors__created_at_date": "2017-01-02T00:00:00.000Z", "visitors__visitor_count": "1" }, - { "visitors__created_at_date": "2017-01-04T00:00:00.000Z", "visitors__visitor_count": "1" }, - { "visitors__created_at_date": "2017-01-05T00:00:00.000Z", "visitors__visitor_count": "1" }, - { "visitors__created_at_date": "2017-01-06T00:00:00.000Z", "visitors__visitor_count": "2" } + { "visitors__created_at_day": "2017-01-02T00:00:00.000Z", "visitors__visitor_count": "1" }, + { "visitors__created_at_day": "2017-01-04T00:00:00.000Z", "visitors__visitor_count": "1" }, + { "visitors__created_at_day": "2017-01-05T00:00:00.000Z", "visitors__visitor_count": "1" }, + { "visitors__created_at_day": "2017-01-06T00:00:00.000Z", "visitors__visitor_count": "2" } ] ); }); diff --git a/packages/cubejs-schema-compiler/test/ExtensionsTest.js b/packages/cubejs-schema-compiler/test/ExtensionsTest.js index 6d17a1069c11a..e713cf1d29e02 100644 --- a/packages/cubejs-schema-compiler/test/ExtensionsTest.js +++ b/packages/cubejs-schema-compiler/test/ExtensionsTest.js @@ -61,7 +61,7 @@ describe('Extensions', () => { ], timeDimensions: [{ dimension: 'VisitorsFunnel.time', - granularity: 'date', + granularity: 'day', dateRange: { from: '2017-01-01', to: '2017-01-30' } }], timezone: 'America/Los_Angeles' diff --git a/packages/cubejs-schema-compiler/test/MSSqlPreAggregationsTest.js b/packages/cubejs-schema-compiler/test/MSSqlPreAggregationsTest.js index b1eff85ecf66a..a9f15f1a6f776 100644 --- a/packages/cubejs-schema-compiler/test/MSSqlPreAggregationsTest.js +++ b/packages/cubejs-schema-compiler/test/MSSqlPreAggregationsTest.js @@ -197,7 +197,7 @@ describe('MSSqlPreAggregations', function test() { ], timeDimensions: [{ dimension: 'visitors.createdAt', - granularity: 'date', + granularity: 'day', dateRange: ['2017-01-01', '2017-01-30'] }], timezone: 'UTC', @@ -218,19 +218,19 @@ describe('MSSqlPreAggregations', function test() { res.should.be.deepEqual( [ { - "visitors__created_at_date": "2017-01-03T00:00:00.000", + "visitors__created_at_day": "2017-01-03T00:00:00.000", "visitors__count": 1 }, { - "visitors__created_at_date": "2017-01-05T00:00:00.000", + "visitors__created_at_day": "2017-01-05T00:00:00.000", "visitors__count": 1 }, { - "visitors__created_at_date": "2017-01-06T00:00:00.000", + "visitors__created_at_day": "2017-01-06T00:00:00.000", "visitors__count": 1 }, { - "visitors__created_at_date": "2017-01-07T00:00:00.000", + "visitors__created_at_day": "2017-01-07T00:00:00.000", "visitors__count": 2 } ] @@ -245,7 +245,7 @@ describe('MSSqlPreAggregations', function test() { ], timeDimensions: [{ dimension: 'visitors.createdAt', - granularity: 'date', + granularity: 'day', dateRange: ['2017-01-01', '2017-01-30'] }], timezone: 'UTC', @@ -267,19 +267,19 @@ describe('MSSqlPreAggregations', function test() { res.should.be.deepEqual( [ { - "visitors__created_at_date": "2017-01-03T00:00:00.000", + "visitors__created_at_day": "2017-01-03T00:00:00.000", "visitors__ratio": 0.333333333333 }, { - "visitors__created_at_date": "2017-01-05T00:00:00.000", + "visitors__created_at_day": "2017-01-05T00:00:00.000", "visitors__ratio": 0.5 }, { - "visitors__created_at_date": "2017-01-06T00:00:00.000", + "visitors__created_at_day": "2017-01-06T00:00:00.000", "visitors__ratio": 1 }, { - "visitors__created_at_date": "2017-01-07T00:00:00.000", + "visitors__created_at_day": "2017-01-07T00:00:00.000", "visitors__ratio": null } ] @@ -298,7 +298,7 @@ describe('MSSqlPreAggregations', function test() { preAggregationsSchema: '', timeDimensions: [{ dimension: 'visitors.createdAt', - granularity: 'date', + granularity: 'day', dateRange: ['2016-12-30', '2017-01-06'] }], order: [{ @@ -322,7 +322,7 @@ describe('MSSqlPreAggregations', function test() { res.should.be.deepEqual( [ { - "visitors__created_at_date": "2017-01-06T00:00:00.000", + "visitors__created_at_day": "2017-01-06T00:00:00.000", "visitors__checkins_total": 1 } ] diff --git a/packages/cubejs-schema-compiler/test/MongoBiQueryTest.js b/packages/cubejs-schema-compiler/test/MongoBiQueryTest.js index a9c31d841cd75..661ed7972582e 100644 --- a/packages/cubejs-schema-compiler/test/MongoBiQueryTest.js +++ b/packages/cubejs-schema-compiler/test/MongoBiQueryTest.js @@ -34,7 +34,7 @@ describe('MongoBiQuery', () => { ], timeDimensions: [{ dimension: 'visitors.createdAt', - granularity: 'date', + granularity: 'day', dateRange: ['2017-01-01', '2017-01-30'] }], timezone: 'America/Los_Angeles', diff --git a/packages/cubejs-schema-compiler/test/PreAggregationsTest.js b/packages/cubejs-schema-compiler/test/PreAggregationsTest.js index aa94ea5a40a6b..206a96a4552ef 100644 --- a/packages/cubejs-schema-compiler/test/PreAggregationsTest.js +++ b/packages/cubejs-schema-compiler/test/PreAggregationsTest.js @@ -207,7 +207,7 @@ describe('PreAggregations', function test() { ], timeDimensions: [{ dimension: 'visitors.createdAt', - granularity: 'date', + granularity: 'day', dateRange: ['2017-01-01', '2017-01-30'] }], timezone: 'America/Los_Angeles', @@ -228,19 +228,19 @@ describe('PreAggregations', function test() { res.should.be.deepEqual( [ { - "visitors__created_at_date": "2017-01-02T00:00:00.000Z", + "visitors__created_at_day": "2017-01-02T00:00:00.000Z", "visitors__count": "1" }, { - "visitors__created_at_date": "2017-01-04T00:00:00.000Z", + "visitors__created_at_day": "2017-01-04T00:00:00.000Z", "visitors__count": "1" }, { - "visitors__created_at_date": "2017-01-05T00:00:00.000Z", + "visitors__created_at_day": "2017-01-05T00:00:00.000Z", "visitors__count": "1" }, { - "visitors__created_at_date": "2017-01-06T00:00:00.000Z", + "visitors__created_at_day": "2017-01-06T00:00:00.000Z", "visitors__count": "2" } ] @@ -257,7 +257,7 @@ describe('PreAggregations', function test() { ], timeDimensions: [{ dimension: 'visitors.createdAt', - granularity: 'date', + granularity: 'day', dateRange: ['2017-01-01', '2017-01-30'] }], timezone: 'America/Los_Angeles', @@ -279,19 +279,19 @@ describe('PreAggregations', function test() { res.should.be.deepEqual( [ { - "visitors__created_at_date": "2017-01-02T00:00:00.000Z", + "visitors__created_at_day": "2017-01-02T00:00:00.000Z", "visitors__ratio": '0.33333333333333333333' }, { - "visitors__created_at_date": "2017-01-04T00:00:00.000Z", + "visitors__created_at_day": "2017-01-04T00:00:00.000Z", "visitors__ratio": '0.50000000000000000000' }, { - "visitors__created_at_date": "2017-01-05T00:00:00.000Z", + "visitors__created_at_day": "2017-01-05T00:00:00.000Z", "visitors__ratio": '1.00000000000000000000' }, { - "visitors__created_at_date": "2017-01-06T00:00:00.000Z", + "visitors__created_at_day": "2017-01-06T00:00:00.000Z", "visitors__ratio": null } ] @@ -308,7 +308,7 @@ describe('PreAggregations', function test() { ], timeDimensions: [{ dimension: 'GoogleVisitors.createdAt', - granularity: 'date', + granularity: 'day', dateRange: ['2017-01-01', '2017-01-30'] }], timezone: 'America/Los_Angeles', @@ -329,7 +329,7 @@ describe('PreAggregations', function test() { res.should.be.deepEqual( [ { - "google_visitors__created_at_date": "2017-01-05T00:00:00.000Z", + "google_visitors__created_at_day": "2017-01-05T00:00:00.000Z", "google_visitors__count": "1" } ] @@ -346,7 +346,7 @@ describe('PreAggregations', function test() { ], timeDimensions: [{ dimension: 'visitors.createdAt', - granularity: 'date', + granularity: 'day', dateRange: ['2017-01-01', '2017-01-30'] }], timezone: 'America/Los_Angeles', @@ -462,7 +462,7 @@ describe('PreAggregations', function test() { preAggregationsSchema: '', timeDimensions: [{ dimension: 'visitors.createdAt', - granularity: 'date', + granularity: 'day', dateRange: ['2016-12-30', '2017-01-05'] }], order: [{ @@ -487,17 +487,17 @@ describe('PreAggregations', function test() { [ { "visitors__source": "some", - "visitors__created_at_date": "2017-01-02T00:00:00.000Z", + "visitors__created_at_day": "2017-01-02T00:00:00.000Z", "visitors__checkins_total": "3" }, { "visitors__source": "some", - "visitors__created_at_date": "2017-01-04T00:00:00.000Z", + "visitors__created_at_day": "2017-01-04T00:00:00.000Z", "visitors__checkins_total": "2" }, { "visitors__source": "google", - "visitors__created_at_date": "2017-01-05T00:00:00.000Z", + "visitors__created_at_day": "2017-01-05T00:00:00.000Z", "visitors__checkins_total": "1" } ] diff --git a/packages/cubejs-schema-compiler/test/SQLGenerationTest.js b/packages/cubejs-schema-compiler/test/SQLGenerationTest.js index df84f7e0463a8..ed6345763a0ec 100644 --- a/packages/cubejs-schema-compiler/test/SQLGenerationTest.js +++ b/packages/cubejs-schema-compiler/test/SQLGenerationTest.js @@ -318,7 +318,7 @@ describe('SQL Generation', function test() { ], timeDimensions: [{ dimension: 'visitors.created_at', - granularity: 'date', + granularity: 'day', dateRange: ['2017-01-01', '2017-01-30'] }], timezone: 'America/Los_Angeles', @@ -334,28 +334,28 @@ describe('SQL Generation', function test() { res.should.be.deepEqual( [ { - "visitors__created_at_date": "2017-01-02T00:00:00.000Z", + "visitors__created_at_day": "2017-01-02T00:00:00.000Z", "visitors__visitor_revenue": "100", "visitors__visitor_count": "1", "visitor_checkins__visitor_checkins_count": "3", "visitors__per_visitor_revenue": "100" }, { - "visitors__created_at_date": "2017-01-04T00:00:00.000Z", + "visitors__created_at_day": "2017-01-04T00:00:00.000Z", "visitors__visitor_revenue": "200", "visitors__visitor_count": "1", "visitor_checkins__visitor_checkins_count": "2", "visitors__per_visitor_revenue": "200" }, { - "visitors__created_at_date": "2017-01-05T00:00:00.000Z", + "visitors__created_at_day": "2017-01-05T00:00:00.000Z", "visitors__visitor_revenue": null, "visitors__visitor_count": "1", "visitor_checkins__visitor_checkins_count": "1", "visitors__per_visitor_revenue": null }, { - "visitors__created_at_date": "2017-01-06T00:00:00.000Z", + "visitors__created_at_day": "2017-01-06T00:00:00.000Z", "visitors__visitor_revenue": null, "visitors__visitor_count": "2", "visitor_checkins__visitor_checkins_count": "0", @@ -399,7 +399,7 @@ describe('SQL Generation', function test() { ], timeDimensions: [{ dimension: 'visitors.created_at', - granularity: 'date', + granularity: 'day', dateRange: ['2017-01-01', '2017-01-10'] }], order: [{ @@ -415,34 +415,34 @@ describe('SQL Generation', function test() { console.log(JSON.stringify(res)); res.should.be.deepEqual( [{ - "visitors__created_at_date": "2017-01-01T00:00:00.000Z", + "visitors__created_at_day": "2017-01-01T00:00:00.000Z", "visitors__revenue_running": null }, { - "visitors__created_at_date": "2017-01-02T00:00:00.000Z", + "visitors__created_at_day": "2017-01-02T00:00:00.000Z", "visitors__revenue_running": "100" }, { - "visitors__created_at_date": "2017-01-03T00:00:00.000Z", + "visitors__created_at_day": "2017-01-03T00:00:00.000Z", "visitors__revenue_running": "100" }, { - "visitors__created_at_date": "2017-01-04T00:00:00.000Z", + "visitors__created_at_day": "2017-01-04T00:00:00.000Z", "visitors__revenue_running": "300" }, { - "visitors__created_at_date": "2017-01-05T00:00:00.000Z", + "visitors__created_at_day": "2017-01-05T00:00:00.000Z", "visitors__revenue_running": "600" }, { - "visitors__created_at_date": "2017-01-06T00:00:00.000Z", + "visitors__created_at_day": "2017-01-06T00:00:00.000Z", "visitors__revenue_running": "1500" }, { - "visitors__created_at_date": "2017-01-07T00:00:00.000Z", + "visitors__created_at_day": "2017-01-07T00:00:00.000Z", "visitors__revenue_running": "1500" }, { - "visitors__created_at_date": "2017-01-08T00:00:00.000Z", + "visitors__created_at_day": "2017-01-08T00:00:00.000Z", "visitors__revenue_running": "1500" }, { - "visitors__created_at_date": "2017-01-09T00:00:00.000Z", + "visitors__created_at_day": "2017-01-09T00:00:00.000Z", "visitors__revenue_running": "1500" }, { - "visitors__created_at_date": "2017-01-10T00:00:00.000Z", + "visitors__created_at_day": "2017-01-10T00:00:00.000Z", "visitors__revenue_running": "1500" }] ); @@ -459,7 +459,7 @@ describe('SQL Generation', function test() { ], timeDimensions: [{ dimension: 'visitors.created_at', - granularity: 'date', + granularity: 'day', dateRange: ['2017-01-01', '2017-01-10'] }], order: [{ @@ -467,16 +467,16 @@ describe('SQL Generation', function test() { }], timezone: 'America/Los_Angeles' }, [ - { "visitors__created_at_date": "2017-01-01T00:00:00.000Z", "visitors__revenue_rolling": null }, - { "visitors__created_at_date": "2017-01-02T00:00:00.000Z", "visitors__revenue_rolling": null }, - { "visitors__created_at_date": "2017-01-03T00:00:00.000Z", "visitors__revenue_rolling": "100" }, - { "visitors__created_at_date": "2017-01-04T00:00:00.000Z", "visitors__revenue_rolling": "100" }, - { "visitors__created_at_date": "2017-01-05T00:00:00.000Z", "visitors__revenue_rolling": "200" }, - { "visitors__created_at_date": "2017-01-06T00:00:00.000Z", "visitors__revenue_rolling": "500" }, - { "visitors__created_at_date": "2017-01-07T00:00:00.000Z", "visitors__revenue_rolling": "1200" }, - { "visitors__created_at_date": "2017-01-08T00:00:00.000Z", "visitors__revenue_rolling": "900" }, - { "visitors__created_at_date": "2017-01-09T00:00:00.000Z", "visitors__revenue_rolling": null }, - { "visitors__created_at_date": "2017-01-10T00:00:00.000Z", "visitors__revenue_rolling": null } + { "visitors__created_at_day": "2017-01-01T00:00:00.000Z", "visitors__revenue_rolling": null }, + { "visitors__created_at_day": "2017-01-02T00:00:00.000Z", "visitors__revenue_rolling": null }, + { "visitors__created_at_day": "2017-01-03T00:00:00.000Z", "visitors__revenue_rolling": "100" }, + { "visitors__created_at_day": "2017-01-04T00:00:00.000Z", "visitors__revenue_rolling": "100" }, + { "visitors__created_at_day": "2017-01-05T00:00:00.000Z", "visitors__revenue_rolling": "200" }, + { "visitors__created_at_day": "2017-01-06T00:00:00.000Z", "visitors__revenue_rolling": "500" }, + { "visitors__created_at_day": "2017-01-07T00:00:00.000Z", "visitors__revenue_rolling": "1200" }, + { "visitors__created_at_day": "2017-01-08T00:00:00.000Z", "visitors__revenue_rolling": "900" }, + { "visitors__created_at_day": "2017-01-09T00:00:00.000Z", "visitors__revenue_rolling": null }, + { "visitors__created_at_day": "2017-01-10T00:00:00.000Z", "visitors__revenue_rolling": null } ]) ); @@ -488,7 +488,7 @@ describe('SQL Generation', function test() { ], timeDimensions: [{ dimension: 'visitors.created_at', - granularity: 'date', + granularity: 'day', dateRange: ['2017-01-01', '2017-01-10'] }], order: [{ @@ -497,19 +497,19 @@ describe('SQL Generation', function test() { timezone: 'America/Los_Angeles' }, [ { - "visitors__created_at_date": "2017-01-02T00:00:00.000Z", "visitors__revenue_rolling": null, + "visitors__created_at_day": "2017-01-02T00:00:00.000Z", "visitors__revenue_rolling": null, "visitor_checkins__visitor_checkins_count": "3" }, { - "visitors__created_at_date": "2017-01-04T00:00:00.000Z", "visitors__revenue_rolling": "100", + "visitors__created_at_day": "2017-01-04T00:00:00.000Z", "visitors__revenue_rolling": "100", "visitor_checkins__visitor_checkins_count": '2' }, { - "visitors__created_at_date": "2017-01-05T00:00:00.000Z", "visitors__revenue_rolling": "200", + "visitors__created_at_day": "2017-01-05T00:00:00.000Z", "visitors__revenue_rolling": "200", "visitor_checkins__visitor_checkins_count": '1' }, { - "visitors__created_at_date": "2017-01-06T00:00:00.000Z", "visitors__revenue_rolling": "500", + "visitors__created_at_day": "2017-01-06T00:00:00.000Z", "visitors__revenue_rolling": "500", "visitor_checkins__visitor_checkins_count": '0' } ]) @@ -541,7 +541,7 @@ describe('SQL Generation', function test() { ], timeDimensions: [{ dimension: 'visitors.created_at', - granularity: 'date', + granularity: 'day', dateRange: ['2017-01-01', '2017-01-10'] }], order: [{ @@ -549,16 +549,16 @@ describe('SQL Generation', function test() { }], timezone: 'America/Los_Angeles' }, [ - { "visitors__created_at_date": "2017-01-01T00:00:00.000Z", "visitors__count_rolling": null }, - { "visitors__created_at_date": "2017-01-02T00:00:00.000Z", "visitors__count_rolling": null }, - { "visitors__created_at_date": "2017-01-03T00:00:00.000Z", "visitors__count_rolling": "1" }, - { "visitors__created_at_date": "2017-01-04T00:00:00.000Z", "visitors__count_rolling": "1" }, - { "visitors__created_at_date": "2017-01-05T00:00:00.000Z", "visitors__count_rolling": "1" }, - { "visitors__created_at_date": "2017-01-06T00:00:00.000Z", "visitors__count_rolling": "2" }, - { "visitors__created_at_date": "2017-01-07T00:00:00.000Z", "visitors__count_rolling": "3" }, - { "visitors__created_at_date": "2017-01-08T00:00:00.000Z", "visitors__count_rolling": "2" }, - { "visitors__created_at_date": "2017-01-09T00:00:00.000Z", "visitors__count_rolling": null }, - { "visitors__created_at_date": "2017-01-10T00:00:00.000Z", "visitors__count_rolling": null } + { "visitors__created_at_day": "2017-01-01T00:00:00.000Z", "visitors__count_rolling": null }, + { "visitors__created_at_day": "2017-01-02T00:00:00.000Z", "visitors__count_rolling": null }, + { "visitors__created_at_day": "2017-01-03T00:00:00.000Z", "visitors__count_rolling": "1" }, + { "visitors__created_at_day": "2017-01-04T00:00:00.000Z", "visitors__count_rolling": "1" }, + { "visitors__created_at_day": "2017-01-05T00:00:00.000Z", "visitors__count_rolling": "1" }, + { "visitors__created_at_day": "2017-01-06T00:00:00.000Z", "visitors__count_rolling": "2" }, + { "visitors__created_at_day": "2017-01-07T00:00:00.000Z", "visitors__count_rolling": "3" }, + { "visitors__created_at_day": "2017-01-08T00:00:00.000Z", "visitors__count_rolling": "2" }, + { "visitors__created_at_day": "2017-01-09T00:00:00.000Z", "visitors__count_rolling": null }, + { "visitors__created_at_day": "2017-01-10T00:00:00.000Z", "visitors__count_rolling": null } ]) ); @@ -569,7 +569,7 @@ describe('SQL Generation', function test() { ], timeDimensions: [{ dimension: 'visitors.createdAtSqlUtils', - granularity: 'date', + granularity: 'day', dateRange: ['2017-01-01', '2017-01-10'] }], order: [{ @@ -577,10 +577,10 @@ describe('SQL Generation', function test() { }], timezone: 'America/Los_Angeles' }, [ - {"visitors__created_at_sql_utils_date":"2017-01-02T00:00:00.000Z","visitors__visitor_count":"1"}, - {"visitors__created_at_sql_utils_date":"2017-01-04T00:00:00.000Z","visitors__visitor_count":"1"}, - {"visitors__created_at_sql_utils_date":"2017-01-05T00:00:00.000Z","visitors__visitor_count":"1"}, - {"visitors__created_at_sql_utils_date":"2017-01-06T00:00:00.000Z","visitors__visitor_count":"2"} + {"visitors__created_at_sql_utils_day":"2017-01-02T00:00:00.000Z","visitors__visitor_count":"1"}, + {"visitors__created_at_sql_utils_day":"2017-01-04T00:00:00.000Z","visitors__visitor_count":"1"}, + {"visitors__created_at_sql_utils_day":"2017-01-05T00:00:00.000Z","visitors__visitor_count":"1"}, + {"visitors__created_at_sql_utils_day":"2017-01-06T00:00:00.000Z","visitors__visitor_count":"2"} ]) ); @@ -611,7 +611,7 @@ describe('SQL Generation', function test() { ], timeDimensions: [{ dimension: 'visitors.created_at', - granularity: 'date', + granularity: 'day', dateRange: ['2017-01-01', '2017-01-10'] }], order: [{ @@ -619,16 +619,16 @@ describe('SQL Generation', function test() { }], timezone: 'America/Los_Angeles' }, [ - { "visitors__created_at_date": "2017-01-01T00:00:00.000Z", "visitors__running_revenue_per_count": null }, - { "visitors__created_at_date": "2017-01-02T00:00:00.000Z", "visitors__running_revenue_per_count": "100" }, - { "visitors__created_at_date": "2017-01-03T00:00:00.000Z", "visitors__running_revenue_per_count": "100" }, - { "visitors__created_at_date": "2017-01-04T00:00:00.000Z", "visitors__running_revenue_per_count": "150" }, - { "visitors__created_at_date": "2017-01-05T00:00:00.000Z", "visitors__running_revenue_per_count": "200" }, - { "visitors__created_at_date": "2017-01-06T00:00:00.000Z", "visitors__running_revenue_per_count": "300" }, - { "visitors__created_at_date": "2017-01-07T00:00:00.000Z", "visitors__running_revenue_per_count": "300" }, - { "visitors__created_at_date": "2017-01-08T00:00:00.000Z", "visitors__running_revenue_per_count": "300" }, - { "visitors__created_at_date": "2017-01-09T00:00:00.000Z", "visitors__running_revenue_per_count": "300" }, - { "visitors__created_at_date": "2017-01-10T00:00:00.000Z", "visitors__running_revenue_per_count": "300" } + { "visitors__created_at_day": "2017-01-01T00:00:00.000Z", "visitors__running_revenue_per_count": null }, + { "visitors__created_at_day": "2017-01-02T00:00:00.000Z", "visitors__running_revenue_per_count": "100" }, + { "visitors__created_at_day": "2017-01-03T00:00:00.000Z", "visitors__running_revenue_per_count": "100" }, + { "visitors__created_at_day": "2017-01-04T00:00:00.000Z", "visitors__running_revenue_per_count": "150" }, + { "visitors__created_at_day": "2017-01-05T00:00:00.000Z", "visitors__running_revenue_per_count": "200" }, + { "visitors__created_at_day": "2017-01-06T00:00:00.000Z", "visitors__running_revenue_per_count": "300" }, + { "visitors__created_at_day": "2017-01-07T00:00:00.000Z", "visitors__running_revenue_per_count": "300" }, + { "visitors__created_at_day": "2017-01-08T00:00:00.000Z", "visitors__running_revenue_per_count": "300" }, + { "visitors__created_at_day": "2017-01-09T00:00:00.000Z", "visitors__running_revenue_per_count": "300" }, + { "visitors__created_at_day": "2017-01-10T00:00:00.000Z", "visitors__running_revenue_per_count": "300" } ]) ); @@ -640,7 +640,7 @@ describe('SQL Generation', function test() { ], timeDimensions: [{ dimension: 'visitors.created_at', - granularity: 'date', + granularity: 'day', dateRange: ['2017-01-01', '2017-01-10'] }], order: [{ @@ -881,7 +881,7 @@ describe('SQL Generation', function test() { ], timeDimensions: [{ dimension: 'visitors.created_at', - granularity: 'date', + granularity: 'day', dateRange: ['2017-01-01', '2017-01-30'] }], timezone: 'America/Los_Angeles', @@ -898,19 +898,19 @@ describe('SQL Generation', function test() { res.should.be.deepEqual( [{ "visitors__checkins": "0", - "visitors__created_at_date": "2017-01-06T00:00:00.000Z", + "visitors__created_at_day": "2017-01-06T00:00:00.000Z", "visitors__visitor_count": "2" }, { "visitors__checkins": "1", - "visitors__created_at_date": "2017-01-05T00:00:00.000Z", + "visitors__created_at_day": "2017-01-05T00:00:00.000Z", "visitors__visitor_count": "1" }, { "visitors__checkins": "2", - "visitors__created_at_date": "2017-01-04T00:00:00.000Z", + "visitors__created_at_day": "2017-01-04T00:00:00.000Z", "visitors__visitor_count": "1" }, { "visitors__checkins": "3", - "visitors__created_at_date": "2017-01-02T00:00:00.000Z", + "visitors__created_at_day": "2017-01-02T00:00:00.000Z", "visitors__visitor_count": "1" }] ); @@ -928,7 +928,7 @@ describe('SQL Generation', function test() { ], timeDimensions: [{ dimension: 'visitors.created_at', - granularity: 'date', + granularity: 'day', dateRange: ['2017-01-01', '2017-01-30'] }], timezone: 'America/Los_Angeles', @@ -947,7 +947,7 @@ describe('SQL Generation', function test() { return dbRunner.testQuery(query.buildSqlAndParams()).then(res => { console.log(JSON.stringify(res)); res.should.be.deepEqual( - [{ "visitors__created_at_date": "2017-01-02T00:00:00.000Z", "visitors__average_checkins": "6.0000000000000000" }] + [{ "visitors__created_at_day": "2017-01-02T00:00:00.000Z", "visitors__average_checkins": "6.0000000000000000" }] ); }); }); @@ -977,7 +977,7 @@ describe('SQL Generation', function test() { ], timeDimensions: [{ dimension: 'visitors.created_at', - granularity: 'date', + granularity: 'day', dateRange: ['2017-01-01', '2017-01-30'] }], timezone: 'America/Los_Angeles', @@ -986,15 +986,15 @@ describe('SQL Generation', function test() { }] }, [ { - "visitors__min_visitor_checkin_date_date": "2017-01-02T00:00:00.000Z", + "visitors__min_visitor_checkin_date_day": "2017-01-02T00:00:00.000Z", "visitors__visitor_count": "1" }, { - "visitors__min_visitor_checkin_date_date": "2017-01-04T00:00:00.000Z", + "visitors__min_visitor_checkin_date_day": "2017-01-04T00:00:00.000Z", "visitors__visitor_count": "1" }, { - "visitors__min_visitor_checkin_date_date": "2017-01-05T00:00:00.000Z", + "visitors__min_visitor_checkin_date_day": "2017-01-05T00:00:00.000Z", "visitors__visitor_count": "1" } ]).then(() => { @@ -1011,7 +1011,7 @@ describe('SQL Generation', function test() { ], timeDimensions: [{ dimension: 'visitors.minVisitorCheckinDate', - granularity: 'date', + granularity: 'day', dateRange: ['2017-01-01', '2017-01-30'] }], timezone: 'America/Los_Angeles', @@ -1020,15 +1020,15 @@ describe('SQL Generation', function test() { }] }, [ { - "visitors__min_visitor_checkin_date_date": "2017-01-02T00:00:00.000Z", + "visitors__min_visitor_checkin_date_day": "2017-01-02T00:00:00.000Z", "visitors__visitor_count": "1" }, { - "visitors__min_visitor_checkin_date_date": "2017-01-04T00:00:00.000Z", + "visitors__min_visitor_checkin_date_day": "2017-01-04T00:00:00.000Z", "visitors__visitor_count": "1" }, { - "visitors__min_visitor_checkin_date_date": "2017-01-05T00:00:00.000Z", + "visitors__min_visitor_checkin_date_day": "2017-01-05T00:00:00.000Z", "visitors__visitor_count": "1" } ]) @@ -1041,7 +1041,7 @@ describe('SQL Generation', function test() { ], timeDimensions: [{ dimension: 'visitors.minVisitorCheckinDate1', - granularity: 'date', + granularity: 'day', dateRange: ['2017-01-01', '2017-01-30'] }], timezone: 'America/Los_Angeles', @@ -1088,7 +1088,7 @@ describe('SQL Generation', function test() { dimensions: ['visitor_checkins.source'], timeDimensions: [{ dimension: 'visitors.created_at', - granularity: 'date', + granularity: 'day', dateRange: ['2017-01-01', '2017-01-30'] }], timezone: 'America/Los_Angeles', @@ -1121,7 +1121,7 @@ describe('SQL Generation', function test() { [ { "visitor_checkins__source": "google", - "visitors__created_at_date": "2017-01-02T00:00:00.000Z", + "visitors__created_at_day": "2017-01-02T00:00:00.000Z", "visitors__per_visitor_revenue": "100" } ] @@ -1331,6 +1331,66 @@ describe('SQL Generation', function test() { ]) ); + it('minute granularity', () => runQueryTest({ + measures: [ + 'visitors.visitor_count' + ], + timeDimensions: [{ + dimension: 'visitors.created_at', + granularity: 'minute', + dateRange: ['2016-01-09', '2017-01-10'] + }], + order: [{ + id: 'visitors.created_at' + }], + timezone: 'America/Los_Angeles' + }, [{ + "visitors__created_at_minute": "2016-09-06T17:00:00.000Z", + "visitors__visitor_count": "1" + }, { + "visitors__created_at_minute": "2017-01-02T16:00:00.000Z", + "visitors__visitor_count": "1" + }, { + "visitors__created_at_minute": "2017-01-04T16:00:00.000Z", + "visitors__visitor_count": "1" + }, { + "visitors__created_at_minute": "2017-01-05T16:00:00.000Z", + "visitors__visitor_count": "1" + }, { + "visitors__created_at_minute": "2017-01-06T16:00:00.000Z", + "visitors__visitor_count": "2" + }])); + + it('second granularity', () => runQueryTest({ + measures: [ + 'visitors.visitor_count' + ], + timeDimensions: [{ + dimension: 'visitors.created_at', + granularity: 'second', + dateRange: ['2016-01-09', '2017-01-10'] + }], + order: [{ + id: 'visitors.created_at' + }], + timezone: 'America/Los_Angeles' + }, [{ + "visitors__created_at_second": "2016-09-06T17:00:00.000Z", + "visitors__visitor_count": "1" + }, { + "visitors__created_at_second": "2017-01-02T16:00:00.000Z", + "visitors__visitor_count": "1" + }, { + "visitors__created_at_second": "2017-01-04T16:00:00.000Z", + "visitors__visitor_count": "1" + }, { + "visitors__created_at_second": "2017-01-05T16:00:00.000Z", + "visitors__visitor_count": "1" + }, { + "visitors__created_at_second": "2017-01-06T16:00:00.000Z", + "visitors__visitor_count": "2" + }])); + it('time date ranges', () => runQueryTest({ measures: [ @@ -1338,7 +1398,7 @@ describe('SQL Generation', function test() { ], timeDimensions: [{ dimension: 'visitors.created_at', - granularity: 'date', + granularity: 'day', dateRange: ['2017-01-02T15:00:00', '2017-01-02T17:00:00'] }], order: [{ @@ -1347,7 +1407,7 @@ describe('SQL Generation', function test() { timezone: 'America/Los_Angeles' }, [ { - "visitors__created_at_date": "2017-01-02T00:00:00.000Z", + "visitors__created_at_day": "2017-01-02T00:00:00.000Z", "visitors__visitor_count": "1" } ]) @@ -1360,7 +1420,7 @@ describe('SQL Generation', function test() { ], timeDimensions: [{ dimension: 'visitors.created_at', - granularity: 'date', + granularity: 'day', dateRange: ['2016-01-09', '2017-01-10'] }], order: [{ @@ -1370,22 +1430,22 @@ describe('SQL Generation', function test() { ungrouped: true }, [{ "visitors__id": 6, - "visitors__created_at_date": "2016-09-06T00:00:00.000Z" + "visitors__created_at_day": "2016-09-06T00:00:00.000Z" }, { "visitors__id": 1, - "visitors__created_at_date": "2017-01-02T00:00:00.000Z" + "visitors__created_at_day": "2017-01-02T00:00:00.000Z" }, { "visitors__id": 2, - "visitors__created_at_date": "2017-01-04T00:00:00.000Z" + "visitors__created_at_day": "2017-01-04T00:00:00.000Z" }, { "visitors__id": 3, - "visitors__created_at_date": "2017-01-05T00:00:00.000Z" + "visitors__created_at_day": "2017-01-05T00:00:00.000Z" }, { "visitors__id": 4, - "visitors__created_at_date": "2017-01-06T00:00:00.000Z" + "visitors__created_at_day": "2017-01-06T00:00:00.000Z" }, { "visitors__id": 5, - "visitors__created_at_date": "2017-01-06T00:00:00.000Z" + "visitors__created_at_day": "2017-01-06T00:00:00.000Z" }])); it('ungrouped without id', () => runQueryTest({ @@ -1393,7 +1453,7 @@ describe('SQL Generation', function test() { dimensions: [], timeDimensions: [{ dimension: 'visitors.created_at', - granularity: 'date', + granularity: 'day', dateRange: ['2016-01-09', '2017-01-10'] }], order: [{ @@ -1403,17 +1463,17 @@ describe('SQL Generation', function test() { ungrouped: true, allowUngroupedWithoutPrimaryKey: true }, [{ - "visitors__created_at_date": "2016-09-06T00:00:00.000Z" + "visitors__created_at_day": "2016-09-06T00:00:00.000Z" }, { - "visitors__created_at_date": "2017-01-02T00:00:00.000Z" + "visitors__created_at_day": "2017-01-02T00:00:00.000Z" }, { - "visitors__created_at_date": "2017-01-04T00:00:00.000Z" + "visitors__created_at_day": "2017-01-04T00:00:00.000Z" }, { - "visitors__created_at_date": "2017-01-05T00:00:00.000Z" + "visitors__created_at_day": "2017-01-05T00:00:00.000Z" }, { - "visitors__created_at_date": "2017-01-06T00:00:00.000Z" + "visitors__created_at_day": "2017-01-06T00:00:00.000Z" }, { - "visitors__created_at_date": "2017-01-06T00:00:00.000Z" + "visitors__created_at_day": "2017-01-06T00:00:00.000Z" }])); it(