{
  "license": "CC BY 4.0",
  "licenseUrl": "https://creativecommons.org/licenses/by/4.0/",
  "recipe": {
    "slug": "schema-version-adoption",
    "title": "Track Event Schema-Version Adoption",
    "testedWith": "Apache DataFusion 45.2.0",
    "lastReviewed": "2026-07-28"
  },
  "contract": {
    "tableName": "product_events",
    "schema": [
      {
        "name": "timestamp_utc",
        "type": "Timestamp",
        "description": "Event receive time."
      },
      {
        "name": "event_name",
        "type": "Utf8",
        "description": "Stable logical event name."
      },
      {
        "name": "schema_version",
        "type": "Utf8",
        "description": "Explicit contract version such as v2."
      },
      {
        "name": "producer_version",
        "type": "Utf8",
        "description": "Application build or worker release."
      }
    ]
  },
  "query": "WITH version_counts AS (\n  SELECT\n    event_name,\n    producer_version,\n    schema_version,\n    COUNT(*) AS events\n  FROM product_events\n  WHERE timestamp_utc >= now() - INTERVAL '24 hours'\n  GROUP BY event_name, producer_version, schema_version\n),\nproducer_totals AS (\n  SELECT\n    event_name,\n    producer_version,\n    SUM(events) AS producer_events\n  FROM version_counts\n  GROUP BY event_name, producer_version\n)\nSELECT\n  counts.event_name,\n  counts.producer_version,\n  counts.schema_version,\n  counts.events,\n  100.0 * counts.events / NULLIF(totals.producer_events, 0)\n    AS version_share_pct\nFROM version_counts AS counts\nJOIN producer_totals AS totals\n  ON totals.event_name = counts.event_name\n  AND totals.producer_version = counts.producer_version\nORDER BY counts.event_name, counts.producer_version, counts.events DESC;",
  "fixtureKind": "schema-example",
  "inputRows": [
    {
      "timestamp_utc": "2026-07-28T10:00:00Z",
      "event_name": "workflow_completed",
      "schema_version": "schema_version_example_1",
      "producer_version": "producer_version_example_1"
    },
    {
      "timestamp_utc": "2026-07-28T11:00:00Z",
      "event_name": "workflow_completed",
      "schema_version": "schema_version_example_2",
      "producer_version": "producer_version_example_2"
    },
    {
      "timestamp_utc": "2026-07-28T12:00:00Z",
      "event_name": "workflow_completed",
      "schema_version": "schema_version_example_3",
      "producer_version": "producer_version_example_3"
    }
  ],
  "illustrativeInputRows": [
    {
      "timestamp_utc": "2026-07-28T10:00:00Z",
      "event_name": "workflow_completed",
      "schema_version": "schema_version_example_1",
      "producer_version": "producer_version_example_1"
    },
    {
      "timestamp_utc": "2026-07-28T11:00:00Z",
      "event_name": "workflow_completed",
      "schema_version": "schema_version_example_2",
      "producer_version": "producer_version_example_2"
    },
    {
      "timestamp_utc": "2026-07-28T12:00:00Z",
      "event_name": "workflow_completed",
      "schema_version": "schema_version_example_3",
      "producer_version": "producer_version_example_3"
    }
  ],
  "expectedOutput": {
    "columns": [
      "event_name",
      "producer_version",
      "schema_version",
      "events",
      "version_share_pct"
    ],
    "rows": [
      {
        "event_name": "checkout_completed",
        "producer_version": "web-1848",
        "schema_version": "v2",
        "events": 9840,
        "version_share_pct": 99.72
      },
      {
        "event_name": "checkout_completed",
        "producer_version": "worker-411",
        "schema_version": "v1",
        "events": 742,
        "version_share_pct": 38.11
      }
    ]
  },
  "notes": [
    "The compact input rows demonstrate field names and JSON types; they are not claimed to generate the displayed aggregate by themselves.",
    "The expected output is deterministic synthetic review data for the documented output shape.",
    "Adapt time windows, thresholds, identities, and business definitions before operational use."
  ]
}