[FEATURE] Implement historical chart data collection and query string parsing in WebServer
- Dominant language
- C++
- Stars
- 14
- Forks
- 12
- Avg merge
- 1h 27m
- Merged PRs (30d)
- 3
Description
### Note to self to serve as reminder
## Description
The WebServer visualization system has two incomplete stub implementations which I need to properly implement for full functionality. I had made a stub implementation, to return to this later:
1. **`PerformanceCollector::getChartData()`** - Currently returns an empty vector
2. **`RestAPIServer::parseQueryString()`** - Marked as "not implemented for brevity"
## Current Behavior
### getChartData() (line 64-71)
```cpp
std::vector
PerformanceCollector::getChartData(const std::string& strategyId,
const std::string& metric,
uint64_t timeRange) const {
std::vector result;
// Return empty for now - can be implemented later
return result;
}
```
- Always returns empty chart data
- Client requests for historical data visualization receive no data
- Used by WebSocket handleGetHistory() and REST API handleGetChartData()
parseQueryString() (line 1000-1006)
```cpp
std::unordered_map
RestAPIServer::parseQueryString(const std::string& query) {
std::unordered_map params;
// Simple query string parsing (not implemented for brevity)
boost::ignore_unused(query);
return params;
}
```
- Returns empty parameters map
- REST API endpoints cannot parse URL query parameters
- Limits filtering/pagination capabilities
Expected Behavior
getChartData()
- Maintain historical time-series data for each metric (PnL, position, Sharpe ratio, etc.)
- Return data points within the specified time range
- Support configurable history size (already has m_maxHistorySize)
- Thread-safe access to historical data
parseQueryString()
- Parse URL query strings (e.g., ?start=123&end=456&limit=100)
- Return key-value map of parameters
- Handle URL decoding for special characters
- Support common query parameters: time ranges, pagination, filtering
Implementation Considerations
For getChartData():
- I can add std::deque storage per strategy/metric combination
- Implement rolling buffer with max size enforcement
- Collect data during startCollection() broadcasts
- Filter by timestamp for time range queries
For parseQueryString():
- I will use Boost string algorithms or manual parsing
- Handle URL encoding/decoding
- Support & delimiter and = key-value separator
- Return empty map for malformed queries (graceful degradation)
Affected Components
- WebSocket real-time updates (handleGetHistory())
- REST API endpoints (handleGetChartData())
- Performance visualization dashboard
- Historical data analysis features
Priority
Medium - These features are needed for complete visualization functionality but I have a graceful fallbacks (empty data/params)
Files to Modify
- visualization/WebServer.cpp
- visualization/WebServer.h ( I may need to add data structures for historical storage)
Contributor guide
Research direction
Start in visualization/WebServer.cpp and visualization/WebServer.h, then trace PerformanceCollector::getChartData(), RestAPIServer::parseQueryString(), handleGetHistory(), and handleGetChartData(). Define how historical storage, time-range filtering, URL decoding, and thread-safe access should work before implementing; done means chart requests return retained data and REST query parameters are parsed as expected.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- cpp
- Domain
- api, backend, data-visualization
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100