Add `user_username` filter to CodeSuggestions Aggregation Engine to support username-to-ID conversion from GLQL
<!--IssueSummary start-->
<details>
<summary>
Everyone can contribute. [Help move this issue forward](https://handbook.gitlab.com/handbook/marketing/developer-relations/contributor-success/community-contributors-workflows/#contributor-links) while earning points, leveling up and collecting rewards.
</summary>
- [Work on this issue](https://contributors.gitlab.com/manage-issue?action=work&projectId=278964&issueIid=599750)
</details>
<!--IssueSummary end-->
## Problem
GLQL passes usernames (e.g. `pshutsin`) when filtering by user, but the CodeSuggestions Aggregation Engine (AE) expects user GIDs or IDs. The `user_id` filter does not accept usernames, and accepting usernames directly is not supported out of the box because it would require a join to the `siphon_users` table.
This mismatch means GLQL-driven queries that filter by user currently cannot work correctly with the CS AE.
## Proposed Solution
Add a new `user_username` filter to the CodeSuggestions AE (`ee/app/models/analytics/aggregation_engines/code_suggestions.rb`) that:
1. Accepts one or more usernames as strings (e.g. `username: ["pshutsin"]`)
2. Performs a PostgreSQL lookup (`User.by_username(usernames).map(&:id)`) to convert usernames to IDs
3. Applies the resulting IDs as an `IN` clause on the `user_id` column — equivalent to the existing `user_id` filter
This keeps the username → ID conversion in a single location (the AE builder) rather than requiring changes to both the GLQL API and the frontend `parser.js`.
### Filter Behaviour
Both filters can be used independently or together, and they compose as `AND` conditions:
```
user_id: [1, 2, 3], user_username: ["pshutsin"]
# => user_id IN (1, 2, 3) AND user_id IN (<pshutsin's id>)
```
### Validation
- `user_id` filter: strict integer/GID validation (existing behaviour, unchanged)
- `user_username` filter: open string validation, with the PG lookup acting as the implicit guard (unknown usernames simply return no results)
## Implementation Notes
- The username → ID lookup should use PostgreSQL (not ClickHouse), as it is faster and `siphon_users` may not be GA yet.
- If a username does not resolve to a known user, the filter should return no results (consistent with filtering by a non-existent GID).
- This is a pilot for username-based filtering. Once proven, similar `user_username` filters can be added to other AEs that have user dimensions.
## References
- Related MR: !235220 (GLQL Typed transform path — where the username/ID mismatch was discovered)
- Discussion context: username vs GID handling in GLQL ↔ AE integration
issue