Commit 478c30d8 authored by Paul Asmuth's avatar Paul Asmuth
Browse files

output window time in GROUP OVER TIMEWINDOW clause

parent 4b443663
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -48,6 +48,9 @@ void sumExpr(void* scratchpad, int argc, SValue* argv, SValue* out) {
  }

  switch(val->getType()) {
    case SValue::T_NULL:
      return;

    case SValue::T_INTEGER:
      data->t_integer += val->getInteger();
      *out = SValue((int64_t) data->t_integer);
+23 −3
Original line number Diff line number Diff line
@@ -19,6 +19,8 @@ GroupOverTimewindow::GroupOverTimewindow(
    CompiledExpression* time_expr,
    fnordmetric::IntegerType window,
    fnordmetric::IntegerType step,
    size_t input_row_size,
    size_t input_row_time_index,
    CompiledExpression* select_expr,
    CompiledExpression* group_expr,
    size_t scratchpad_size,
@@ -26,6 +28,8 @@ GroupOverTimewindow::GroupOverTimewindow(
    time_expr_(time_expr),
    window_(window),
    step_(step),
    input_row_size_(input_row_size),
    input_row_time_index_(input_row_time_index),
    columns_(std::move(columns)),
    select_expr_(select_expr),
    group_expr_(group_expr),
@@ -157,15 +161,31 @@ void GroupOverTimewindow::emitWindow(

  memset(scratchpad_.get(), 0, scratchpad_size_);

  if (window_begin == window_end) {
    std::vector<SValue> row(input_row_size_, SValue());
    row[input_row_time_index_] = SValue(fnord::util::DateTime(window_time));

    executeExpression(
        select_expr_,
        scratchpad_.get(),
        row.size(),
        row.data(),
        &out_len,
        out);
  } else {
    for (; window_begin != window_end; window_begin++) {
      auto& row = window_begin->second;
      row[input_row_time_index_] = SValue(fnord::util::DateTime(window_time));

      executeExpression(
          select_expr_,
          scratchpad_.get(),
        window_begin->second.size(),
        window_begin->second.data(),
          row.size(),
          row.data(),
          &out_len,
          out);
    }
  }

  emitRow(out, out_len);
}
+4 −0
Original line number Diff line number Diff line
@@ -31,6 +31,8 @@ public:
      CompiledExpression* time_expr,
      fnordmetric::IntegerType window,
      fnordmetric::IntegerType step,
      size_t input_row_size,
      size_t input_row_time_index,
      CompiledExpression* select_expr,
      CompiledExpression* group_expr,
      size_t scratchpad_size,
@@ -61,6 +63,8 @@ protected:
  CompiledExpression* time_expr_;
  fnordmetric::IntegerType window_;
  fnordmetric::IntegerType step_;
  size_t input_row_size_;
  size_t input_row_time_index_;
  CompiledExpression* select_expr_;
  CompiledExpression* group_expr_;
  size_t scratchpad_size_;
+12 −0
Original line number Diff line number Diff line
@@ -460,6 +460,16 @@ QueryPlanNode* QueryPlanBuilder::buildGroupOverTimewindow(
        "illegal use of aggregate functions in the GROUP OVER clause");
  }

  /* find time expression input column */
  if (time_expr_ast->getType() != ASTNode::T_RESOLVED_COLUMN) {
    RAISE(
        kRuntimeError,
        "first argument to TIMEWINDOW() must be a column reference");
  }

  auto input_row_size = child_sl->getChildren().size();
  auto input_row_time_index = time_expr_ast->getID();

  /* compile window and step */
  auto window_svalue = executeSimpleConstExpression(compiler_, window_expr_ast);
  auto window = window_svalue.getInteger();
@@ -483,6 +493,8 @@ QueryPlanNode* QueryPlanBuilder::buildGroupOverTimewindow(
      time_expr,
      window,
      step,
      input_row_size,
      input_row_time_index,
      select_expr,
      group_expr,
      select_scratchpad_len,
+1 −1
Original line number Diff line number Diff line
@@ -1241,7 +1241,7 @@ TEST_CASE(SQLTest, TestSimpleGroupOverTimeWindow, [] () {
  auto result = executeTestQuery(
      "  SELECT time, sum(value) "
      "      FROM timeseries"
      "      GROUP OVER TIMEWINDOW(time, 60);");
      "      GROUP OVER TIMEWINDOW(time, 60, 20);");

  result->debugPrint();
  EXPECT_EQ(result->getNumRows(), 1);