Your browser sucks, JavaScript disabled! Gunnar's console needs JavaScript and WebAssembly. Git over SSH on port 2222 does not.

nordisk/nornir

.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&lt;RecordBatch&gt;</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>