{
  "docVersion": 1,
  "id": "blog-federated-query-0001",
  "name": "Federated query engines — one SQL, many stores",
  "purpose": "A coordinator plans one SQL query across heterogeneous sources; connectors push filters down and the join happens in the engine — no ETL.",
  "nodes": {
    "analyst": {
      "type": "user",
      "label": "Analyst",
      "x": 20,
      "y": 260,
      "runtime": "one SQL query"
    },
    "coord": {
      "type": "search",
      "label": "Query Engine",
      "x": 280,
      "y": 260,
      "w": 180,
      "runtime": "coordinator · planner",
      "color": "purple"
    },
    "pg": {
      "type": "database",
      "label": "Postgres",
      "x": 640,
      "y": 20,
      "runtime": "orders"
    },
    "my": {
      "type": "database",
      "label": "MySQL",
      "x": 640,
      "y": 180,
      "runtime": "customers"
    },
    "lake": {
      "type": "datalake",
      "label": "Data Lake",
      "x": 640,
      "y": 340,
      "runtime": "S3 · parquet events"
    },
    "api": {
      "type": "partnerapi",
      "label": "SaaS API",
      "x": 640,
      "y": 500,
      "runtime": "billing provider"
    }
  },
  "edges": {
    "e1": {
      "from": "analyst",
      "to": "coord",
      "fromSide": "right",
      "toSide": "left",
      "label": "SELECT … JOIN across all four"
    },
    "e2": {
      "from": "coord",
      "to": "pg",
      "fromSide": "right",
      "toSide": "left",
      "label": "pushdown: filter + projection"
    },
    "e3": {
      "from": "coord",
      "to": "my",
      "fromSide": "right",
      "toSide": "left",
      "label": "pushdown"
    },
    "e4": {
      "from": "coord",
      "to": "lake",
      "fromSide": "right",
      "toSide": "left",
      "label": "partition-pruned scan"
    },
    "e5": {
      "from": "coord",
      "to": "api",
      "fromSide": "right",
      "toSide": "left",
      "label": "connector · rate-limited",
      "patterns": [
        "rate-limit",
        "retry"
      ]
    }
  },
  "boxes": {
    "b1": {
      "x": 600,
      "y": -30,
      "w": 300,
      "h": 680,
      "label": "data stays where it lives",
      "color": "blue",
      "opacity": 0.04
    }
  },
  "texts": {
    "t1": {
      "x": 240,
      "y": 460,
      "text": "the join executes inside the engine's\nworkers — sources only ship the rows\nthat survive the pushed-down filters.\n\nfederation trades latency for freshness:\nno pipelines, no copies, always current.",
      "color": "purple",
      "size": 12
    }
  },
  "meta": {
    "createdAt": "2026-07-12T09:00:00.000Z",
    "modifiedAt": "2026-07-12T09:00:00.000Z"
  }
}