.nornir/assets/warehouse_sql.svg
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1180 470" font-family="'DejaVu Sans', 'Segoe UI', sans-serif">
<defs>
<linearGradient id="board" x1="0" y1="0" x2="0" y2="1">
<stop offset="0" stop-color="#0b1c2e"/><stop offset="1" stop-color="#06111d"/>
</linearGradient>
<linearGradient id="chip" x1="0" y1="0" x2="0" y2="1">
<stop offset="0" stop-color="#14384f"/><stop offset="1" stop-color="#0e2a3e"/>
</linearGradient>
<linearGradient id="slot" x1="0" y1="0" x2="0" y2="1">
<stop offset="0" stop-color="#123448"/><stop offset="1" stop-color="#0a2032"/>
</linearGradient>
<marker id="arr" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
<path d="M0 0 L10 5 L0 10 z" fill="#6fd3f5"/>
</marker>
</defs>
<rect x="0" y="0" width="1180" height="470" fill="url(#board)"/>
<text x="40" y="46" fill="#dff3ff" font-size="24" font-weight="700">nornir warehouse query "SELECT …"</text>
<text x="40" y="70" fill="#7fb0cc" font-size="14">DataFusion over Iceberg — read-only, lock-tolerant, projection + filter pushdown to Parquet</text>
<!-- entry chip -->
<rect x="40" y="110" width="200" height="86" rx="10" fill="url(#chip)" stroke="#7fc8ea" stroke-width="2.5"/>
<text x="140" y="146" fill="#dff3ff" font-size="15" font-weight="700" text-anchor="middle">SQL string</text>
<text x="140" y="170" fill="#9fc7dd" font-size="12" text-anchor="middle">CLI / MCP warehouse_query</text>
<!-- open_read_only -->
<rect x="300" y="110" width="220" height="86" rx="10" fill="url(#chip)" stroke="#5aa6cf" stroke-width="2"/>
<text x="410" y="140" fill="#dff3ff" font-size="14" font-weight="700" text-anchor="middle">open_read_only()</text>
<text x="410" y="162" fill="#9fc7dd" font-size="11.5" text-anchor="middle">exclusive open, else copy</text>
<text x="410" y="178" fill="#9fc7dd" font-size="11.5" text-anchor="middle">catalog.redb aside (snapshot)</text>
<!-- SessionContext + schema -->
<rect x="580" y="110" width="240" height="86" rx="10" fill="url(#chip)" stroke="#5aa6cf" stroke-width="2"/>
<text x="700" y="140" fill="#dff3ff" font-size="14" font-weight="700" text-anchor="middle">SessionContext</text>
<text x="700" y="162" fill="#9fc7dd" font-size="11.5" text-anchor="middle">public schema ←</text>
<text x="700" y="178" fill="#9fc7dd" font-size="11.5" text-anchor="middle">lazy WarehouseSchema</text>
<!-- provider -->
<rect x="880" y="110" width="260" height="86" rx="10" fill="url(#chip)" stroke="#7fc8ea" stroke-width="2.5"/>
<text x="1010" y="140" fill="#dff3ff" font-size="14" font-weight="700" text-anchor="middle">IcebergStaticTableProvider</text>
<text x="1010" y="162" fill="#9fc7dd" font-size="11.5" text-anchor="middle">per referenced table only</text>
<text x="1010" y="178" fill="#9fc7dd" font-size="11.5" text-anchor="middle">plans an Iceberg scan</text>
<!-- rails top row -->
<line x1="240" y1="153" x2="300" y2="153" stroke="#6fd3f5" stroke-width="3" marker-end="url(#arr)"/>
<line x1="520" y1="153" x2="580" y2="153" stroke="#6fd3f5" stroke-width="3" marker-end="url(#arr)"/>
<line x1="820" y1="153" x2="880" y2="153" stroke="#6fd3f5" stroke-width="3" marker-end="url(#arr)"/>
<!-- down to parquet -->
<line x1="1010" y1="196" x2="1010" y2="300" stroke="#6fd3f5" stroke-width="3" marker-end="url(#arr)"/>
<!-- parquet data files -->
<rect x="820" y="300" width="320" height="120" rx="10" fill="url(#slot)" stroke="#5aa6cf" stroke-width="2"/>
<text x="980" y="330" fill="#dff3ff" font-size="14" font-weight="700" text-anchor="middle">Iceberg / Parquet data files</text>
<text x="980" y="356" fill="#9fc7dd" font-size="11.5" text-anchor="middle">manifest + row-group bounds prune</text>
<text x="980" y="374" fill="#9fc7dd" font-size="11.5" text-anchor="middle">WHERE repo = 'x' reads only</text>
<text x="980" y="392" fill="#9fc7dd" font-size="11.5" text-anchor="middle">matching files — no MemTable copy</text>
<!-- result out -->
<rect x="40" y="300" width="360" height="120" rx="10" fill="url(#chip)" stroke="#7fc8ea" stroke-width="2.5"/>
<text x="220" y="332" fill="#dff3ff" font-size="15" font-weight="700" text-anchor="middle">Vec<RecordBatch></text>
<text x="220" y="360" fill="#9fc7dd" font-size="12" text-anchor="middle">format_table() → bordered text</text>
<text x="220" y="380" fill="#9fc7dd" font-size="12" text-anchor="middle">format_json() → array of row objects</text>
<line x1="820" y1="360" x2="400" y2="360" stroke="#6fd3f5" stroke-width="3" marker-end="url(#arr)"/>
<text x="610" y="350" fill="#7fb0cc" font-size="12" text-anchor="middle">df.collect()</text>
</svg>