Commit dc82a85e authored by Laura Schlimmer's avatar Laura Schlimmer
Browse files

clean up and fix util functions

parent cf27a1d2
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -24,7 +24,6 @@ build:
	      fnordmetric-webui-embedpopup.js \
	      fnordmetric-webui-autocomplete.js \
	      fnordmetric-webui-datepicker.js \
	      fnordmetric-webui-unittests.js \
	      codemirror.js \
	      codemirror-sql.js \
	) > fnordmetric-webui.js
+0 −1
Original line number Diff line number Diff line
@@ -86,7 +86,6 @@ FnordMetric.WebUI = function() {
  };

  function openUrl(raw_url, push_state) {
    FnordMetric.UnitTests();
    var url = FnordMetric.util.parseQueryString(raw_url);
    var query_params = url["query_params"];

+19 −13
Original line number Diff line number Diff line
@@ -56,12 +56,16 @@ FnordMetric.util.MetricPreviewWidget = function(viewport, query_params) {

  /* checks if required url params are misssing and adds those if so */
  function addRequiredURLParamsForView(value) {
    if (value == "count" || value == "sum" || value == "mean") {
    if (value == "count" || 
        value == "sum" || 
        value == "mean" ||
        value == "min" ||
        value == "max") {

      var time_step = query_params.t_step;
      if (time_step == undefined) {
        time_step = defaults.t_step;
        updateURLParams("t_step", time_step);
      var time_window = query_params.t_window;
      if (time_window == undefined) {
        time_window = defaults.t_window;
        updateURLParams("t_window", time_window);
      }
    }
    var group_by = query_params.by;
@@ -456,10 +460,10 @@ FnordMetric.util.MetricPreviewWidget = function(viewport, query_params) {

    prev_timespan.addEventListener('click', function(e) {
      e.preventDefault();
      var end = end_time;
      end_time = start_time;
      var diff = end - start_time;
      start_time = start_time - diff;
      var end = query_params.end_time;
      end_time = query_params.start_time;
      var diff = end - query_params.start_time;
      start_time = query_params.start_time - diff;
      updateURLParams("end_time", end_time);
      updateURLParams("start_time", start_time);
      updateDateTimeElems(
@@ -469,11 +473,13 @@ FnordMetric.util.MetricPreviewWidget = function(viewport, query_params) {

    next_timespan.addEventListener('click', function(e) {
      e.preventDefault();
      var start = start_time;
      var end =  parseInt(end_time ,10) + (end_time - start);
      var start = query_params.start_time;
      var end =
        parseInt(query_params.end_time ,10) + 
        (query_params.end_time - start);

      if (end <= now) {
        start_time = end_time;
        start_time = query_params.end_time;
        end_time = end;
        updateURLParams("start_time", start_time);
        updateURLParams("end_time", end_time);
+66 −1
Original line number Diff line number Diff line
@@ -151,6 +151,71 @@ FnordMetric.UnitTests = function() {

  }();

  console.log(results.total + " tests, "+  results.bad + " failed.");
  var testGenerateSQLQueryFromParams = function() {
    function test(params, expected) {
      var result = FnordMetric.util.generateSQLQueryFromParams(params);
      result = result.replace(/(\n\r|\n|\r|\s)/gm, "");
      if (result != expected) {
        results.bad++;
        console.log("Testing generateSQLQueryFromParams expected "
          + expected + ", but was " + result);
      }
    }
    // test XDOMAIN and WHERE clause
    test(
      {innerView : "metric",
      innerViewValue : "status_codes",
      view : "value",
      by : "host",
      columns : "host",
      end_time : "1416263880000",
      start_time : "1416260280000"},
      "DRAWLINECHARTXDOMAINFROM_TIMESTAMP(1416260280),FROM_TIMESTAMP(1416263880)" +
      "AXISBOTTOMAXISLEFTLEGENDTOPRIGHTINSIDE;SELECTtimeASx,valueASy,hostASseriesFROM`status_codes`" +
      "WHEREtime>FROM_TIMESTAMP(1416260280)ANDtime<FROM_TIMESTAMP(1416263880);");

    // test rollup without columns
    test(
      {innerViewValue : "status_codes",
      view : "rollup_mean"}, 
      "DRAWBARCHARTAXISBOTTOMAXISLEFTLEGENDTOPRIGHTINSIDE;SELECT'total'ASX,mean(value)ASYFROM`status_codes`;");

    // test rollup with one column
    test(
      {innerViewValue : "status_codes",
      view : "rollup_count",
      columns : "host"}, 
      "DRAWBARCHARTAXISBOTTOMAXISLEFTLEGENDTOPRIGHTINSIDE;SELECT`host`ASX,count(value)ASYFROM`status_codes`;");

    // test rollup with multiple columns
    test(
      {innerViewValue : "status_codes",
      view : "rollup_sum",
      columns : "host,server"}, 
      "DRAWBARCHARTAXISBOTTOMAXISLEFTLEGENDTOPRIGHTINSIDE;SELECT`host`ASX,sum(value)ASYFROM`status_codes`;");

    // test GROUP OVER timewindow with window and step
    test(
      {innerViewValue : "status_codes",
      view : "max",
      by : "host",
      t_step : "20000",
      t_window : "5000"}, 
      "DRAWLINECHARTAXISBOTTOMAXISLEFTLEGENDTOPRIGHTINSIDE;SELECTtimeASx,max(value)ASY,hostASseriesFROM`status_codes`GROUPOVERTIMEWINDOW(time,5,20)BYhost;");

    // test GROUP OVER TIMEWINDO with window only and without BY stm
    test(
      {innerViewValue : "status_codes",
      view : "min",
      t_window : "5000"}, 
      "DRAWLINECHARTAXISBOTTOMAXISLEFTLEGENDTOPRIGHTINSIDE;SELECTtimeASx,min(value)ASYFROM`status_codes`GROUPOVERTIMEWINDOW(time,5,5);");


  }();
  if (results.bad == 0) {
    console.log("Yeah, all " + results.total + " tests passed :-) ");
  } else {
    console.log(results.bad + " tests of " + results.totak + " failed.");
  }

}
+40 −18
Original line number Diff line number Diff line
@@ -251,6 +251,10 @@ FnordMetric.util.parseMilliTS = function(ts) {
}

FnordMetric.util.humanCountRows = function(tables) {
  if (tables == undefined) {
    return "0 rows";
  }

  var num = 0;
  tables.map(function(table) {
    num += table.rows.length;
@@ -366,7 +370,7 @@ FnordMetric.util.htmlEscape = function(str) {
}


/* returns all words that includes filter */
/* returns all words that include filter */
FnordMetric.util.filterStringArray = function(strings, filter, limit) {
  //FIXME ?
  var data = [];
@@ -402,13 +406,16 @@ FnordMetric.util.milliSecondsToTimeString = function(seconds) {
}


/* in singleMetricView */
/**
  * builds a ChartSQL query from url params
  * @param params format as returned in parseQueryString
  */
FnordMetric.util.generateSQLQueryFromParams = function(params) {
  //FIX html escape 
  var table_ref = params.innerViewValue
  var view = params.view;
  /* column for rollups */
  var columns = params.columns.split(",");
  var columns = params.columns;
  var start_time = Math.round(params.start_time / 1000);
  var end_time = Math.round(params.end_time / 1000);
  var t_step = params.t_step;
@@ -417,26 +424,36 @@ FnordMetric.util.generateSQLQueryFromParams = function(params) {

  var query;
  var draw_stm = 
    "DRAW LINECHART\n  XDOMAIN\n    FROM_TIMESTAMP(" + 
    start_time + "),\n    FROM_TIMESTAMP(" + end_time + ")"
    + "\n  AXIS BOTTOM\n  AXIS LEFT;\n\n";
    "DRAW LINECHART\n  ";
  var select_expr = "SELECT\n    time AS x,\n    ";
  var from_expr = "\n  FROM\n";
  var where_expr = "";
  var group_expr = "";
  var hasAggregation = false;

  /* complement draw_stm */
  if (!isNaN(start_time) && !isNaN(end_time)) {
    draw_stm +=
      "XDOMAIN\n    FROM_TIMESTAMP(" + start_time +
      "),\n    FROM_TIMESTAMP(" + end_time + ")";
  }

  /* complete select_expr */
  if (view == "value") {
    select_expr += "value as y ";
    select_expr += "value AS y ";
  } else if (view == "rollup_sum" || view == "rollup_count" || view == "rollup_mean") {
    draw_stm = "DRAW BARCHART\n  AXIS BOTTOM\n  AXIS LEFT;";
    /* adapt draw stm */
    draw_stm = "DRAW BARCHART\n  ";
    var func = (view.split("_"))[1];

    /* if the metric hasn't any labels total is selected */
    var column = (columns[0].length > 0)? 
      ("`" + columns[0] + "`") : "'total'";
    var column;
    if (columns != undefined && (columns.split(","))[0].length > 0) {
      columns = columns.split(",")
      column = "`" + columns[0] + "`";
    } else {
      /* fallback if the metric hasn't any labels */
      column = "'total'";
    }

    select_expr = 
      " SELECT " + column + " AS X, " + func + "(value) AS Y";
@@ -452,11 +469,17 @@ FnordMetric.util.generateSQLQueryFromParams = function(params) {
    select_expr += ", " + series + " AS series";
  }

  /* complete draw stm */
  draw_stm +=
    "\n  AXIS BOTTOM\n  AXIS LEFT\n" +
    "  LEGEND TOP RIGHT INSIDE;\n\n";


  /* complete from_expr */
  from_expr += "    `" + table_ref + "`\n";

  /*complete where_expr */
  if (start_time != undefined && end_time != undefined) {
  if (!isNaN(start_time) && !isNaN(end_time)) {
    where_expr =
      "  WHERE\n    time > FROM_TIMESTAMP(" + start_time + ")\n" +
      "    AND time < FROM_TIMESTAMP(" + end_time + ")";
@@ -468,14 +491,14 @@ FnordMetric.util.generateSQLQueryFromParams = function(params) {
    group_expr = " GROUP ";
    var hasGroupStm = false;

    if (t_step != undefined) {
    if (t_window != undefined) {
      hasGroupStm = true;

      group_expr += 
        "OVER TIMEWINDOW(time, " + Math.round(t_step / 1000) + ",";
        "OVER TIMEWINDOW(time, " + Math.round(t_window / 1000) + ",";

      group_expr += (t_window != undefined)?
        Math.round(t_window / 1000) : Math.round(t_step / 1000);
      group_expr += (t_step != undefined)?
        Math.round(t_step / 1000) : Math.round(t_window / 1000);

      group_expr+= ")";

@@ -553,7 +576,6 @@ FnordMetric.util.validatedTimeInput = function (time_input, type) {
            e.preventDefault();
          }
        } else if (input.length == 1) {
          console.log(input);
          if (input < 2 || (input == 2 && n < 4)) {
            input = input * 10 + n;
            time_input.value += n;