Skip to content

Commit

Permalink
fix(mongobi-driver): implement convert_tz as a simple hour shift
Browse files Browse the repository at this point in the history
Fixes issue #50
  • Loading branch information
paveltiunov committed Mar 15, 2019
1 parent 1f109dc commit c97e451
Show file tree
Hide file tree
Showing 4 changed files with 81 additions and 2 deletions.
3 changes: 2 additions & 1 deletion packages/cubejs-api-gateway/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,8 @@ const prepareAliasToMemberNameMap = (metaConfig, sqlQuery, query) => {

const transformValue = (value, type) => {
if (value && type === 'time') {
return moment(value).format(moment.HTML5_FMT.DATETIME_LOCAL_MS);
// TODO value of type time should be always local. Consider fixing adapter time formats.
return moment(value.replace('Z', '')).format(moment.HTML5_FMT.DATETIME_LOCAL_MS);
}
return value && value.value ? value.value : value; // TODO move to sql adapter
};
Expand Down
26 changes: 26 additions & 0 deletions packages/cubejs-schema-compiler/adapter/MongoBiQuery.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
const moment = require('moment-timezone');

const MysqlQuery = require('./MysqlQuery');

class MongoBiQuery extends MysqlQuery {
convertTz(field) {
const tz = moment().tz(this.timezone);
// TODO respect day light saving
const [hour, minute] = tz.format('Z').split(':');
const [hourInt, minuteInt] = [parseInt(hour, 10), parseInt(minute, 10) * Math.sign(parseInt(hour, 10))];
let result = field;
if (hourInt !== 0) {
result = `TIMESTAMPADD(HOUR, ${hourInt}, ${result})`;
}
if (minuteInt !== 0) {
result = `TIMESTAMPADD(HOUR, ${minuteInt}, ${result})`;
}
return result;
}

timeStampCast(value) {
return `TIMESTAMP(${value})`;
}
}

module.exports = MongoBiQuery;
3 changes: 2 additions & 1 deletion packages/cubejs-schema-compiler/adapter/QueryBuilder.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
const postgres = require('./PostgresQuery');
const mysql = require('./MysqlQuery');
const mongobi = require('./MongoBiQuery');
const mssql = require('./MssqlQuery');
const bigquery = require('./BigqueryQuery');
const redshift = require('./RedshiftQuery');
Expand All @@ -11,7 +12,7 @@ const ADAPTERS = {
postgres,
redshift,
mysql,
mongobi: mysql,
mongobi,
mssql,
bigquery,
prestodb,
Expand Down
51 changes: 51 additions & 0 deletions packages/cubejs-schema-compiler/test/MongoBiQueryTest.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
const MongoBiQuery = require('../adapter/MongoBiQuery');
const PrepareCompiler = require('./PrepareCompiler');
require('should');

const { prepareCompiler } = PrepareCompiler;

describe('MongoBiQuery', () => {
const { compiler, joinGraph, cubeEvaluator } = prepareCompiler(`
cube(\`visitors\`, {
sql: \`
select * from visitors
\`,
measures: {
count: {
type: 'count'
}
},
dimensions: {
createdAt: {
type: 'time',
sql: 'created_at'
}
}
});
`);

it('convert_tz implementation', () => {
return compiler.compile().then(() => {
const query = new MongoBiQuery({ joinGraph, cubeEvaluator, compiler }, {
measures: [
'visitors.count'
],
timeDimensions: [{
dimension: 'visitors.createdAt',
granularity: 'date',
dateRange: ['2017-01-01', '2017-01-30']
}],
timezone: 'America/Los_Angeles',
order: [{
id: 'visitors.createdAt'
}]
});

const queryAndParams = query.buildSqlAndParams();
console.log(queryAndParams);
queryAndParams[0].should.match(/TIMESTAMPADD\(HOUR, -7, visitors\.created_at\)/);
});
});
});

0 comments on commit c97e451

Please sign in to comment.