Skip to content

Commit 79d7bfd

Browse files
committed
feat: Generic readOnly external rollup implementation. MongoDB support.
Fixes #239
1 parent 7c7304a commit 79d7bfd

File tree

2 files changed

+31
-2
lines changed

2 files changed

+31
-2
lines changed

packages/cubejs-mongobi-driver/driver/MongoBIDriver.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,10 @@ class MongoBIDriver extends BaseDriver {
148148
quoteIdentifier(identifier) {
149149
return `\`${identifier}\``;
150150
}
151+
152+
readOnly() {
153+
return true;
154+
}
151155
}
152156

153157
module.exports = MongoBIDriver;

packages/cubejs-query-orchestrator/driver/BaseDriver.js

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,17 @@ const DbTypeToGenericType = {
2626
'double precision': 'decimal'
2727
};
2828

29+
// Order of keys is important here: from more specific to less specific
30+
const DbTypeValueMatcher = {
31+
timestamp: (v) => v instanceof Date || v.toString().match(/^\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\d/),
32+
date: (v) => v instanceof Date || v.toString().match(/^\d\d\d\d-\d\d-\d\d$/),
33+
int: (v) => Number.isInteger(v) || v.toString().match(/^\d+$/),
34+
decimal: (v) => v instanceof Number || v.toString().match(/^\d+(\.\d+)?$/),
35+
boolean: (v) => v === false || v === true || v.toLowerCase() === 'true' || v.toLowerCase === 'false',
36+
string: (v) => v.length < 256,
37+
text: () => true
38+
};
39+
2940
class BaseDriver {
3041
informationSchemaQuery() {
3142
return `
@@ -46,8 +57,22 @@ class BaseDriver {
4657
throw new Error('Not implemented');
4758
}
4859

49-
downloadQueryResults() {
50-
throw new Error('Not implemented');
60+
async downloadQueryResults(query, values) {
61+
const rows = await this.query(query, values);
62+
const fields = Object.keys(rows[0]);
63+
64+
const types = fields.map(field => ({
65+
name: field,
66+
type: Object.keys(DbTypeValueMatcher).find(
67+
type => !rows.filter(row => !!row[field]).find(row => !DbTypeValueMatcher[type](row[field])) &&
68+
rows.find(row => !!row[field])
69+
) || 'text'
70+
}));
71+
72+
return {
73+
rows,
74+
types,
75+
};
5176
}
5277

5378
readOnly() {

0 commit comments

Comments
 (0)