| 1 | { |
| 2 | "about": "Dataset queries both validators must agree on: datasetQueryError/parseDatasetQuery (datasets.ts) and DatasetQuery::validate (crates/contracts/src/datasets.rs). error null is valid; \"*\" is any error (a malformed query, which each side words its own way).", |
| 3 | "cases": [ |
| 4 | { "query": { "dataset": "pull_requests", "measure": { "op": "count" }, "interval": "week", "group_by": "repo", "time": "merged_at", "range": "90d" }, "error": null }, |
| 5 | { "query": { "dataset": "workflow_runs", "measure": { "op": "rate", "field": "succeeded" }, "filters": [{ "field": "workflow", "op": "in", "value": ["CI", "Deploy"] }] }, "error": null }, |
| 6 | { "query": { "dataset": "issues", "measure": { "op": "p95", "field": "time_to_close_hours" }, "range": { "from": "2026-01-01", "to": "2026-04-01T00:00:00Z" }, "limit": 100 }, "error": null }, |
| 7 | { "query": { "dataset": "deployments", "measure": { "op": "avg", "field": "duration_seconds" }, "filters": [{ "field": "duration_seconds", "op": "gte", "value": 30 }, { "field": "environment", "op": "eq", "value": "production" }] }, "error": null }, |
| 8 | { "query": { "dataset": "spend", "measure": { "op": "sum", "field": "amount_micros" }, "group_by": "product", "interval": "month" }, "error": null }, |
| 9 | { "query": { "dataset": "agent_sessions", "measure": { "op": "count" }, "group_by": "agent", "range": { "from": "2024-02-29", "to": "2024-03-01" } }, "error": null }, |
| 10 | |
| 11 | { "query": { "dataset": "issues", "measure": { "op": "count", "field": "comments" } }, "error": "count takes no field." }, |
| 12 | { "query": { "dataset": "issues", "measure": { "op": "rate" } }, "error": "rate needs a field." }, |
| 13 | { "query": { "dataset": "issues", "measure": { "op": "rate", "field": "comments" } }, "error": "issues has no yes-or-no field comments to take the rate of." }, |
| 14 | { "query": { "dataset": "issues", "measure": { "op": "sum" } }, "error": "sum needs a field." }, |
| 15 | { "query": { "dataset": "pull_requests", "measure": { "op": "avg", "field": "merged" } }, "error": "pull_requests has no number field merged." }, |
| 16 | { "query": { "dataset": "pull_requests", "measure": { "op": "count" }, "group_by": "author" }, "error": "pull_requests can't be grouped by author." }, |
| 17 | { "query": { "dataset": "pull_requests", "measure": { "op": "count" }, "time": "deployed_at" }, "error": "pull_requests has no time field deployed_at." }, |
| 18 | { "query": { "dataset": "workflow_runs", "measure": { "op": "count" }, "filters": [{ "field": "workflow", "op": "in", "value": [] }] }, "error": "in on workflow takes a list of 1 to 50 values." }, |
| 19 | { "query": { "dataset": "workflow_runs", "measure": { "op": "count" }, "filters": [{ "field": "workflow", "op": "eq", "value": 3 }] }, "error": "eq on workflow takes text." }, |
| 20 | { "query": { "dataset": "workflow_runs", "measure": { "op": "count" }, "filters": [{ "field": "branch", "op": "gte", "value": "main" }] }, "error": "branch is text: filter it with eq, neq or in." }, |
| 21 | { "query": { "dataset": "workflow_runs", "measure": { "op": "count" }, "filters": [{ "field": "duration_seconds", "op": "in", "value": ["1"] }] }, "error": "duration_seconds is a number: filter it with eq, neq, gte or lte." }, |
| 22 | { "query": { "dataset": "workflow_runs", "measure": { "op": "count" }, "filters": [{ "field": "duration_seconds", "op": "lte", "value": "60" }] }, "error": "lte on duration_seconds takes a number." }, |
| 23 | { "query": { "dataset": "workflow_runs", "measure": { "op": "count" }, "filters": [{ "field": "secret", "op": "eq", "value": "x" }] }, "error": "workflow_runs can't be filtered by secret." }, |
| 24 | { "query": { "dataset": "issues", "measure": { "op": "count" }, "range": { "from": "2026-02-30", "to": "2026-03-10" } }, "error": "A range's from and to are dates or RFC 3339 UTC times." }, |
| 25 | { "query": { "dataset": "issues", "measure": { "op": "count" }, "range": { "from": "2026-03-10", "to": "2026-03-10" } }, "error": "A range's from comes before its to." }, |
| 26 | { "query": { "dataset": "issues", "measure": { "op": "count" }, "range": { "from": "2025-01-01", "to": "2026-01-03" } }, "error": "A range is at most 366 days." }, |
| 27 | { "query": { "dataset": "issues", "measure": { "op": "count" }, "range": { "from": "yesterday", "to": "today" } }, "error": "A range's from and to are dates or RFC 3339 UTC times." }, |
| 28 | { "query": { "dataset": "issues", "measure": { "op": "count" }, "limit": 101 }, "error": "limit is between 1 and 100." }, |
| 29 | { "query": { "dataset": "issues", "measure": { "op": "count" }, "limit": 0 }, "error": "limit is between 1 and 100." }, |
| 30 | { "query": { "dataset": "issues", "measure": { "op": "count" }, "filters": [ |
| 31 | { "field": "repo", "op": "eq", "value": "a" }, { "field": "repo", "op": "eq", "value": "b" }, { "field": "repo", "op": "eq", "value": "c" }, |
| 32 | { "field": "repo", "op": "eq", "value": "d" }, { "field": "repo", "op": "eq", "value": "e" }, { "field": "repo", "op": "eq", "value": "f" }, |
| 33 | { "field": "repo", "op": "eq", "value": "g" }, { "field": "repo", "op": "eq", "value": "h" }, { "field": "repo", "op": "eq", "value": "i" }, |
| 34 | { "field": "repo", "op": "eq", "value": "j" }, { "field": "repo", "op": "eq", "value": "k" } |
| 35 | ] }, "error": "A query takes at most 10 filters." }, |
| 36 | |
| 37 | { "query": { "dataset": "secrets", "measure": { "op": "count" } }, "error": "*" }, |
| 38 | { "query": { "dataset": "issues", "measure": { "op": "median" } }, "error": "*" }, |
| 39 | { "query": { "dataset": "issues" }, "error": "*" }, |
| 40 | { "query": { "dataset": "issues", "measure": { "op": "count" }, "range": "1y" }, "error": "*" }, |
| 41 | { "query": { "dataset": "issues", "measure": { "op": "count" }, "interval": "hour" }, "error": "*" }, |
| 42 | { "query": "SELECT * FROM issues", "error": "*" } |
| 43 | ] |
| 44 | } |