function getRange(start, end, frequency, format) { var itr = moment.twix(new Date(start), new Date(end)).iterate(frequency); var range = []; while (itr.hasNext()) { range.push(moment(itr.next().toDate()).format(format)); } return range; }
var getDatesRangeArray = function (startDate, endDate) { //console.log(startDate, endDate) (moment(endDate).format("MM-DD-YYYY")) var itr = moment.twix(startDate, endDate).iterate(13, 'weeks'); var range=[]; while(itr.hasNext()){ range.push(itr.next().format("MM-DD-YYYY")) } var graphDTemp = getGraphData(range); addD3AreaChart(graphDTemp) }
manager.formatResults = function (results, callback) { var query = results.queryplan.query; results.documents = results.documents || []; results.dimensions = results.dimensions || query.dimensions; results.metrics = results.metrics || query.metrics; //allow engines to return a fake metric to be removed before processing results.metrics = _.filter(results.metrics, function (metric) { return metric.key !== 'fake'; }); var timestampDimension = _.find(results.dimensions, function (d) { return d.datatype === 'date'; }); var templateItem = {values: {}, fvalues: {}}; var interval, itr, _documents, _templateItem, _d, exists; var checkExists = function (timestampDimension, documents, date, fix) { return _.find(documents, function (document) { if (fix) { return document.values[timestampDimension.key].getTime() === fixOffset(date).getTime(); } else return document.values[timestampDimension.key].getTime() === date.getTime(); }); }; if (results.documents && results.documents.length > 0) { results.documents.forEach(function (document, dindex) { document.values = {}; document.fvalues = {}; delete document.key; results.dimensions.forEach(function (dimension) { document.values[dimension.key] = document[dimension.key]; if (dimension.datatype == 'date') { document.fvalues[dimension.key] = document.values[dimension.key]; } else if (dimension.datatype === 'ip' && document[dimension.key] && document[dimension.key] !== '(not set)') { var ip = document[dimension.key]; document.fvalues[dimension.key] = joola.common.extend({ip: ip}, joola.common.geoip.lookup(ip)) || '(not set)'; } else if (dimension.datatype === 'geo') { } else { document.fvalues[dimension.key] = document.values[dimension.key]; } if (dimension.transform) { try { var transformFn = localeval('(' + dimension.transform + ')'); document.fvalues[dimension.key] = transformFn.apply(dimension, [document.values[dimension.key]]); } catch (ex) { document.fvalues[dimension.key] = null; } } //document.fvalues[dimension.id] = document.values[dimension.id]; }); results.metrics.forEach(function (metric) { document.values[metric.key] = document[metric.key]; document.fvalues[metric.key] = document.values[metric.key]; if (metric.formula) { var calc; try { calc = localeval('(' + metric.formula.run + ')'); } catch (ex) { console.log(ex); calc = null; } var args = []; metric.formula.dependsOn.forEach(function (dep) { if (typeof dep === 'object') args.push(document[dep.key]); else args.push(document[dep]); }); try { document.values[metric.key] = calc.apply(document, args); document.fvalues[metric.key] = document.values[metric.key].toString(); } catch (ex) { document.values[metric.key] = null; document.fvalues[metric.key] = null; } } if (metric.transform) { try { var transformFn = localeval('(' + metric.transform + ')'); document.fvalues[metric.key] = transformFn.apply(metric, [document.values[metric.key]]); } catch (ex) { console.log(ex); document.fvalues[metric.key] = null; } } if (metric.hasOwnProperty('decimals')) { if (document.values[metric.key]) document.fvalues[metric.key] = document.values[metric.key].toFixed(metric.decimals); } else { try { document.values[metric.key] = Math.round(document.values[metric.key] * 100) / 100; } catch (ex) { } } if (document.values[metric.key]) { if (metric.prefix) document.fvalues[metric.key] = metric.prefix + document.fvalues[metric.key].toString(); if (metric.suffix) document.fvalues[metric.key] = document.fvalues[metric.key].toString() + metric.suffix; } else { document.fvalues[metric.key] = null; } }); Object.keys(document).forEach(function (key) { if (['values', 'fvalues'].indexOf(key) == -1) { delete document[key]; } }); results.metrics.forEach(function (metric) { if (metric.dependent) { delete document.values[metric.key]; delete document.fvalues[metric.key]; } }); results.documents[dindex] = document; }); if (timestampDimension && !(query.timeframe && query.timeframe.last_n_items)) { interval = query.interval.replace('timebucket.', ''); interval = interval === 'ddate' ? 'day' : interval; if (!query.timeframe) { query.timeframe = {}; query.timeframe.start = results.documents[results.documents.length - 1].values.timestamp; query.timeframe.end = results.documents[0].values.timestamp; } itr = moment.twix(query.timeframe.start, query.timeframe.end).iterate(interval); _documents = []; if (results.documents.length > 0) { Object.keys(results.documents[0].values).forEach(function (key) { templateItem.values[key] = null; }); Object.keys(results.documents[0].fvalues).forEach(function (key) { templateItem.fvalues[key] = null; }); } else { results.dimensions.forEach(function (d) { templateItem.values[d.key] = null; templateItem.fvalues[d.key] = null; }); results.metrics.forEach(function (m) { templateItem.values[m.key] = null; templateItem.fvalues[m.key] = null; }); } while (itr.hasNext()) { _d = new Date(itr.next()._d.getTime()); if (['day', 'month', 'year'].indexOf(interval) > -1) exists = checkExists(timestampDimension, results.documents, _d, true); else exists = checkExists(timestampDimension, results.documents, _d); /*exists = _.find(results.documents, function (document) { return document.values[timestampDimension.key].getTime() === _d.getTime(); });*/ if (exists) _documents.push(exists); else { _templateItem = joola.common.extend({}, templateItem); _templateItem.values[timestampDimension.key] = new Date(_d); _templateItem.fvalues[timestampDimension.key] = new Date(_d.getTime()); _documents.push(ce.clone(_templateItem)); } } results.documents = _documents; } else if (!timestampDimension && query.timeframe.hasOwnProperty('last_n_items')) { _documents = results.documents; if (!itr && query.timeframe && query.timeframe.hasOwnProperty('last_n_items')) { //we need to fill a simple integer range. /* for (var i = results.documents.length; i < query.timeframe.last_n_items; i++) { _templateItem = joola.common.extend({}, templateItem); if (query.dimensions && query.dimensions.length > 0) { _templateItem.values[query.dimensions[0].key] = null; _templateItem.fvalues[query.dimensions[0].key] = null; } _documents.unshift(ce.clone(_templateItem)); }*/ } } } else if (results.documents.length === 0 && timestampDimension) { interval = query.interval.replace('timebucket.', ''); if (interval === 'ddate') interval = 'day'; if (!query.timeframe) { query.timeframe = {}; if (results.documents.length > 0) { query.timeframe.start = results.documents[results.documents.length - 1].values.timestamp; query.timeframe.end = results.documents[0].values.timestamp; } } _documents = []; if (results.documents.length > 0) { Object.keys(results.documents[0].values).forEach(function (key) { templateItem.values[key] = null; }); Object.keys(results.documents[0].fvalues).forEach(function (key) { templateItem.fvalues[key] = null; }); } else { results.dimensions.forEach(function (d) { templateItem.values[d.key] = null; templateItem.fvalues[d.key] = null; }); results.metrics.forEach(function (m) { templateItem.values[m.key] = null; templateItem.fvalues[m.key] = null; }); } if (query.timeframe && query.timeframe.start && query.timeframe.end) { itr = moment.twix(query.timeframe.start, query.timeframe.end).iterate(interval); while (itr.hasNext()) { _d = new Date(itr.next()._d.getTime()); if (interval === 'day') exists = checkExists(timestampDimension, results.documents, _d, true); else exists = checkExists(timestampDimension, results.documents, _d); /* exists = _.find(results.documents, function (document) { return document.values[timestampDimension.key].getTime() === _d.getTime(); });*/ if (exists) _documents.push(exists); else { _templateItem = joola.common.extend({}, templateItem); _templateItem.values[timestampDimension.key] = new Date(_d); _templateItem.fvalues[timestampDimension.key] = new Date(_d.getTime()); _documents.push(ce.clone(_templateItem)); } } } results.documents = _documents; } else { /* _templateItem = joola.common.extend({}, templateItem); results.dimensions.forEach(function (d) { _templateItem.values[d.key || d] = null; _templateItem.fvalues[d.key || d] = null; }); results.metrics.forEach(function (m) { _templateItem.values[m.key || m] = null; _templateItem.fvalues[m.key || m] = null; }); results.documents.push(ce.clone(_templateItem));*/ } //sort results.documents = _.sortBy(results.documents, function (document) { return document.values[Object.keys(document.values)[0]]; }); query.ts.end = new Date(); query.ts.duration = query.ts.end.getTime() - query.ts.start.getTime(); var _metrics = []; results.metrics.forEach(function (metric, i) { if (!metric.dependent) _metrics.push(metric); }); results.metrics = _metrics; results.uid = results.queryplan.query.uid; results.cost = results.queryplan.query.cost; results.resultCount = results.documents.length; if (results.queryplan.query.timeframe && results.queryplan.query.timeframe.start && results.queryplan.query.timeframe.end) { results.queryplan.query.timeframe.start = new Date(results.queryplan.query.timeframe.start).toISOString(); results.queryplan.query.timeframe.end = new Date(results.queryplan.query.timeframe.end).toISOString(); } results.queryplan.dimensions.forEach(function (d) { delete d.collection; }); results.queryplan.metrics.forEach(function (m) { delete m.collection; }); results.query = query; delete results.queryplan; return setImmediate(function () { return callback(null, results); }); };