UNPKG

plywood-proxy

Version:
106 lines (105 loc) 4.17 kB
'use strict'; 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;