plywood-proxy
Version:
A Plywood proxy
106 lines (105 loc) • 4.17 kB
JavaScript
;
var path = require('path');
var fs = require('fs-promise');
var Q = require('q');
var plywood_1 = require('plywood');
var index_1 = require('../../../common/models/index');
var parser_1 = require('../../../common/utils/parser/parser');
/**
* Look for all instances of countDistinct($blah) and return the blahs
* @param ex
* @returns {string[]}
*/
function getCountDistinctReferences(ex) {
var references = [];
ex.forEach(function (ex) {
if (ex instanceof plywood_1.ChainExpression) {
var actions = ex.actions;
for (var _i = 0; _i < actions.length; _i++) {
var action = actions[_i];
if (action.action === 'countDistinct') {
var refExpression = action.expression;
if (refExpression instanceof plywood_1.RefExpression)
references.push(refExpression.name);
}
}
}
});
return references;
}
function getFileData(filePath) {
return fs.readFile(filePath, 'utf-8').then(function (fileData) {
try {
return parser_1.parseData(fileData, path.extname(filePath));
}
catch (e) {
throw new Error("could not parse '" + filePath + "': " + e.message);
}
}).then(function (fileJSON) {
fileJSON.forEach(function (d, i) {
d['time'] = new Date(d['time']);
});
return fileJSON;
});
}
exports.getFileData = getFileData;
function externalFactory(dataSource, druidRequester, timeout, useSegmentMetadata) {
var filter = null;
if (dataSource.subsetFilter) {
filter = dataSource.subsetFilter.toJS();
}
var context = {
timeout: timeout
};
if (dataSource.introspection === 'none') {
}
else {
return plywood_1.External.fromJS({
engine: 'druid',
dataSource: dataSource.source,
timeAttribute: dataSource.timeAttribute.name,
attributeOverrides: dataSource.options['attributeOverrides'],
customAggregations: dataSource.options['customAggregations'],
useSegmentMetadata: useSegmentMetadata,
filter: filter,
context: context,
requester: druidRequester
}).introspect();
}
}
exports.externalFactory = externalFactory;
function dataSourceFillerFactory(druidRequester, fileDirectory, timeout, useSegmentMetadata) {
return function (dataSource) {
switch (dataSource.engine) {
case 'native':
// Do not do anything if the file was already loaded
if (dataSource.executor)
return Q(dataSource);
if (!fileDirectory) {
throw new Error('Must have a file directory');
}
var filePath = path.join(fileDirectory, dataSource.source);
return getFileData(filePath).then(function (rawData) {
var dataset = plywood_1.Dataset.fromJS(rawData).hide();
dataset.introspect();
if (dataSource.subsetFilter) {
dataset = dataset.filter(dataSource.subsetFilter.getFn(), {});
}
var executor = plywood_1.basicExecutorFactory({
datasets: { main: dataset }
});
return dataSource.addAttributes(dataset.attributes).attachExecutor(executor);
});
case 'druid':
return externalFactory(dataSource, druidRequester, timeout, useSegmentMetadata).then(function (external) {
var executor = plywood_1.basicExecutorFactory({
datasets: { main: external }
});
return dataSource.addAttributes(external.attributes).attachExecutor(executor);
}).then(index_1.DataSource.updateMaxTime);
default:
throw new Error("Invalid engine: '" + dataSource.engine + "' in '" + dataSource.name + "'");
}
};
}
exports.dataSourceFillerFactory = dataSourceFillerFactory;