Example #1
0
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)

}
Example #3
0
File: query.js Project: aatmp/joola
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);
  });
};