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

nordisk/knut

.nornir/assets/thund-pushdown.svg

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 900 340" font-family="-apple-system,Segoe UI,Roboto,sans-serif" font-size="14">
  <defs>
    <marker id="a" markerWidth="9" markerHeight="9" refX="7" refY="3" orient="auto">
      <path d="M0,0 L7,3 L0,6 Z" fill="#555"/>
    </marker>
  </defs>
  <text x="24" y="26" font-weight="700" font-size="16">Typed projection/filter — pushdown into the source scan</text>
  <text x="24" y="46" fill="#555" font-size="12">A structured node the planner reads (not opaque SQL): only the needed columns/rows are read off disk.</text>

  <!-- wide source (green) -->
  <text x="24" y="80" fill="#2f8f4e" font-size="12" font-weight="600">source · parquet/csv (wide)</text>
  <rect x="24" y="90" width="160" height="120" rx="8" fill="#eefaf0" stroke="#2f8f4e" stroke-width="1.5"/>
  <text x="104" y="112" text-anchor="middle" font-weight="600">orders</text>
  <text x="104" y="134" text-anchor="middle" fill="#555" font-size="11">id · customer</text>
  <text x="104" y="150" text-anchor="middle" fill="#555" font-size="11">amount · note</text>
  <text x="104" y="174" text-anchor="middle" fill="#999" font-size="11">6 rows</text>
  <text x="104" y="194" text-anchor="middle" fill="#999" font-size="11">4 columns</text>

  <!-- typed node (blue) -->
  <rect x="248" y="104" width="210" height="92" rx="8" fill="#eef3fb" stroke="#2b5fb3" stroke-width="1.5"/>
  <text x="353" y="128" text-anchor="middle" font-weight="600">Flow · typed node</text>
  <text x="353" y="150" text-anchor="middle" fill="#555" font-size="12">projection=[customer, amount]</text>
  <text x="353" y="168" text-anchor="middle" fill="#555" font-size="12">filter="amount &gt; 100"</text>
  <text x="353" y="188" text-anchor="middle" fill="#2b5fb3" font-size="11" font-style="italic">no opaque SQL — introspectable</text>

  <path d="M184,150 L248,150" fill="none" stroke="#555" stroke-width="1.5" marker-end="url(#a)"/>

  <!-- pruned scan (orange) -->
  <rect x="522" y="96" width="180" height="108" rx="8" fill="#fdf2ec" stroke="#c26a2b" stroke-width="1.5"/>
  <text x="612" y="120" text-anchor="middle" font-weight="700">DataSourceExec</text>
  <text x="612" y="142" text-anchor="middle" fill="#555" font-size="11">projection=[customer, amount]</text>
  <text x="612" y="160" text-anchor="middle" fill="#555" font-size="11">predicate=amount &gt; 100</text>
  <text x="612" y="182" text-anchor="middle" fill="#c26a2b" font-size="11" font-style="italic">id/note never read · rows pruned</text>

  <path d="M458,150 L522,150" fill="none" stroke="#555" stroke-width="1.5" marker-end="url(#a)"/>
  <text x="466" y="142" fill="#c26a2b" font-size="11">lower</text>

  <!-- slim output (purple) -->
  <rect x="742" y="110" width="140" height="80" rx="8" fill="#f6eefb" stroke="#7a3fb3" stroke-width="1.5"/>
  <text x="812" y="134" text-anchor="middle" font-weight="600">output</text>
  <text x="812" y="156" text-anchor="middle" fill="#555" font-size="11">[customer, amount]</text>
  <text x="812" y="174" text-anchor="middle" fill="#555" font-size="11">2 rows</text>

  <path d="M702,150 L742,150" fill="none" stroke="#555" stroke-width="1.5" marker-end="url(#a)"/>

  <!-- both backends note -->
  <rect x="248" y="238" width="454" height="72" rx="8" fill="#f7f7f7" stroke="#bbb" stroke-width="1.2"/>
  <text x="475" y="262" text-anchor="middle" font-weight="600" font-size="13">lowers to BOTH backends</text>
  <text x="475" y="282" text-anchor="middle" fill="#555" font-size="12">native: ctx.table(orders).filter(…).select_columns(…) → scan pushdown</text>
  <text x="475" y="300" text-anchor="middle" fill="#555" font-size="12">spark: synth_query → "SELECT customer, amount FROM orders WHERE amount &gt; 100"</text>
</svg>