| 306 | } |
| 307 | |
| 308 | string AnalyticEvalNode::DebugStateString(bool detailed = false) const { |
| 309 | stringstream ss; |
| 310 | ss << "num_returned=" << input_stream_->rows_returned() |
| 311 | << " num_rows=" << input_stream_->num_rows() |
| 312 | << " curr_partition_idx_=" << curr_partition_idx_ |
| 313 | << " last_result_idx=" << last_result_idx_; |
| 314 | if (detailed) { |
| 315 | ss << " result_tuples idx: ["; |
| 316 | for (const pair<int64_t, Tuple*>& result_tuple : result_tuples_) { |
| 317 | ss << result_tuple.first; |
| 318 | if (&result_tuple != &result_tuples_.back()) ss << ", "; |
| 319 | } |
| 320 | ss << "]"; |
| 321 | if (fn_scope_ == ROWS && window_.__isset.window_start) { |
| 322 | ss << " window_tuples idx: ["; |
| 323 | for (const pair<int64_t, Tuple*>& window_tuple : window_tuples_) { |
| 324 | ss << window_tuple.first; |
| 325 | if (&window_tuple != &window_tuples_.back()) ss << ", "; |
| 326 | } |
| 327 | ss << "]"; |
| 328 | } |
| 329 | } else { |
| 330 | if (fn_scope_ == ROWS && window_.__isset.window_start) { |
| 331 | if (window_tuples_.empty()) { |
| 332 | ss << " window_tuples empty"; |
| 333 | } else { |
| 334 | ss << " window_tuples idx range: (" << window_tuples_.front().first << "," |
| 335 | << window_tuples_.back().first << ")"; |
| 336 | } |
| 337 | } |
| 338 | if (result_tuples_.empty()) { |
| 339 | ss << " result_tuples empty"; |
| 340 | } else { |
| 341 | ss << " result_tuples idx range: (" << result_tuples_.front().first << "," |
| 342 | << result_tuples_.back().first << ")"; |
| 343 | } |
| 344 | } |
| 345 | return ss.str(); |
| 346 | } |
| 347 | |
| 348 | inline Status AnalyticEvalNode::AddRow(int64_t stream_idx, TupleRow* row) { |
| 349 | if (fn_scope_ != ROWS || !window_.__isset.window_start || |
nothing calls this directly
no test coverage detected