This is an automated email from the ASF dual-hosted git repository.

github-bot pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/datafusion-comet.git


The following commit(s) were added to refs/heads/asf-site by this push:
     new d87b571a Publish built docs triggered by 
36a2307487c528cdaf93fcfb55f23bcbf4b9b563
d87b571a is described below

commit d87b571a329301fcbaf246febbc3fb55b227f085
Author: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
AuthorDate: Tue Dec 3 18:13:12 2024 +0000

    Publish built docs triggered by 36a2307487c528cdaf93fcfb55f23bcbf4b9b563
---
 _sources/contributor-guide/plugin_overview.md.txt  |   67 +-
 _static/images/CometNativeParquetReader.drawio     |  100 -
 _static/images/CometNativeParquetReader.drawio.svg |    4 -
 _static/images/CometOverviewDetailed.drawio        |   94 -
 _static/images/CometOverviewDetailed.drawio.svg    |    4 -
 _static/images/comet-dataflow.excalidraw           | 2134 ++++++++++++++++++++
 _static/images/comet-dataflow.svg                  |   10 +
 contributor-guide/plugin_overview.html             |  101 +-
 searchindex.js                                     |    2 +-
 9 files changed, 2276 insertions(+), 240 deletions(-)

diff --git a/_sources/contributor-guide/plugin_overview.md.txt 
b/_sources/contributor-guide/plugin_overview.md.txt
index a211ca6b..3e7c24f5 100644
--- a/_sources/contributor-guide/plugin_overview.md.txt
+++ b/_sources/contributor-guide/plugin_overview.md.txt
@@ -28,11 +28,21 @@ following setting to the Spark configuration when launching 
`spark-shell` or `sp
 --conf spark.plugins=org.apache.spark.CometPlugin
 ```
 
+This class is loaded by Spark's plugin framework. It will be instantiated in 
the Spark driver only. Comet does not
+provide any executor plugins.
+
+The plugin will update the current `SparkConf` with the extra configuration 
provided by Comet, such as executor memory
+configuration.
+
+The plugin also registers `CometSparkSessionExtensions` with Spark's extension 
API.
+
+## CometSparkSessionExtensions
+
 On initialization, this class registers two physical plan optimization rules 
with Spark: `CometScanRule`
 and `CometExecRule`. These rules run whenever a query stage is being planned 
during Adaptive Query Execution, and
 run once for the entire plan when Adaptive Query Execution is disabled.
 
-## CometScanRule
+### CometScanRule
 
 `CometScanRule` replaces any Parquet scans with Comet operators. There are 
different paths for Spark v1 and v2 data sources.
 
@@ -43,13 +53,13 @@ Parquet data source but leverages native code for decoding 
Parquet row groups di
 
 Comet only supports a subset of data types and will fall back to Spark's scan 
if unsupported types
 exist. Comet can still accelerate the rest of the query execution in this case 
because `CometSparkToColumnarExec` will
-convert the output from Spark's can to Arrow arrays. Note that both 
`spark.comet.exec.enabled=true` and
+convert the output from Spark's scan to Arrow arrays. Note that both 
`spark.comet.exec.enabled=true` and
 `spark.comet.convert.parquet.enabled=true` must be set to enable this 
conversion.
 
 Refer to the [Supported Spark Data 
Types](https://datafusion.apache.org/comet/user-guide/datatypes.html) section
 in the contributor guide to see a list of currently supported data types.
 
-## CometExecRule
+### CometExecRule
 
 This rule traverses bottom-up from the original Spark plan and attempts to 
replace each operator with a Comet equivalent.
 For example, a `ProjectExec` will be replaced by `CometProjectExec`.
@@ -64,25 +74,52 @@ of this could outweigh the benefits of running parts of the 
query stage natively
 
 ## Query Execution
 
-Once the plan has been transformed, any consecutive Comet operators are 
combined into a `CometNativeExec` which contains
-a serialized version of the plan (the serialization code can be found in 
`QueryPlanSerde`). When this operator is
-executed, the serialized plan is passed to the native code when calling 
`Native.createPlan`.
+Once the plan has been transformed, any consecutive native Comet operators are 
combined into a `CometNativeExec` which contains
+a protocol buffer serialized version of the plan (the serialization code can 
be found in `QueryPlanSerde`).
 
-In the native code there is a `PhysicalPlanner` struct (in `planner.rs`) which 
converts the serialized plan into an
+Spark serializes the physical plan and sends it to the executors when 
executing tasks. The executors deserialize the
+plan and invoke it.
+
+When `CometNativeExec` is invoked, it will pass the serialized protobuf plan 
into
+`Native.createPlan`, which invokes the native code via JNI, where the plan is 
then deserialized.
+
+In the native code there is a `PhysicalPlanner` struct (in `planner.rs`) which 
converts the deserialized plan into an
 Apache DataFusion `ExecutionPlan`. In some cases, Comet provides specialized 
physical operators and expressions to
 override the DataFusion versions to ensure compatibility with Apache Spark.
 
-`CometExecIterator` will invoke `Native.executePlan` to pull the next batch 
from the native plan. This is repeated
-until no more batches are available (meaning that all data has been processed 
by the native plan).
+The leaf nodes in the physical plan are always `ScanExec` and each of these 
operators will make a JNI call to 
+`CometBatchIterator.next()` to fetch the next input batch. The input could be 
a Comet native Parquet scan,
+a Spark exchange, or another native plan.
+
+`CometNativeExec` creates a `CometExecIterator` and applies this iterator to 
the input RDD
+partitions. Each call to `CometExecIterator.next()` will invoke 
`Native.executePlan`. Once the plan finishes
+executing, the resulting Arrow batches are imported into the JVM using Arrow 
FFI.
+
+## Arrow
+
+Due to the hybrid execution model, it is necessary to pass batches of data 
between the JVM and native code.
+
+Comet uses a combination of Arrow FFI and Arrow IPC to achieve this.
+
+### Arrow FFI
+
+The foundation for Arrow FFI is the [Arrow C Data Interface], which provides a 
stable ABI-compatible interface for 
+accessing Arrow data structures from multiple languages.
+
+[Arrow C Data Interface]: 
https://arrow.apache.org/docs/format/CDataInterface.html
+
+- `CometExecIterator` invokes native plans and uses Arrow FFI to read the 
output batches
+- Native `ScanExec` operators call `CometBatchIterator` via JNI to fetch input 
batches from the JVM
+
+### Arrow IPC
 
-The leaf nodes in the physical plan are always `ScanExec` and these operators 
consume batches of Arrow data that were
-prepared before the plan is executed. When `CometExecIterator` invokes 
`Native.executePlan` it passes the memory
-addresses of these Arrow arrays to the native code.
+Comet native shuffle uses Arrow IPC to write batches to the shuffle files.
 
-![Diagram of Comet Native 
Execution](../../_static/images/CometOverviewDetailed.drawio.svg)
+- `CometShuffleWriteProcessor` invokes a native plan to fetch batches and then 
passes them to native `ShuffleWriterExec`
+- `CometBlockStoreShuffleReader` reads batches from shuffle files
 
 ## End to End Flow
 
-The following diagram shows the end-to-end flow.
+The following diagram shows an example of the end-to-end flow for a query 
stage.
 
-![Diagram of Comet Native Parquet 
Scan](../../_static/images/CometNativeParquetReader.drawio.svg)
+![Diagram of Comet Data Flow](../../_static/images/comet-dataflow.svg)
diff --git a/_static/images/CometNativeParquetReader.drawio 
b/_static/images/CometNativeParquetReader.drawio
deleted file mode 100644
index 0c7304ef..00000000
--- a/_static/images/CometNativeParquetReader.drawio
+++ /dev/null
@@ -1,100 +0,0 @@
-<mxfile host="app.diagrams.net" agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 
10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.6 Safari/605.1.15" 
version="24.7.16">
-  <diagram name="Page-1" id="IdYZ_KFENTEXElLiOEKC">
-    <mxGraphModel dx="1133" dy="729" grid="1" gridSize="10" guides="1" 
tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" 
pageWidth="850" pageHeight="1100" math="0" shadow="0">
-      <root>
-        <mxCell id="0" />
-        <mxCell id="1" parent="0" />
-        <mxCell id="wVAZ-YzccNhZugPFJvmi-30" value="Spark Executor" 
style="rounded=1;whiteSpace=wrap;html=1;dashed=1;verticalAlign=top;" vertex="1" 
parent="1">
-          <mxGeometry x="10" y="40" width="510" height="430" as="geometry" />
-        </mxCell>
-        <mxCell id="AH3lBTSLKK5181iXBnnY-2" value="JVM Code" 
style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;" parent="1" 
vertex="1">
-          <mxGeometry x="30" y="70" width="210" height="380" as="geometry" />
-        </mxCell>
-        <mxCell id="wVAZ-YzccNhZugPFJvmi-24" 
style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=1;exitDx=0;exitDy=0;entryX=0.75;entryY=0;entryDx=0;entryDy=0;"
 edge="1" parent="1" source="t5OBkkhKOG6cYtw1sPyQ-18" 
target="wVAZ-YzccNhZugPFJvmi-13">
-          <mxGeometry relative="1" as="geometry" />
-        </mxCell>
-        <mxCell id="t5OBkkhKOG6cYtw1sPyQ-18" value="Comet Parquet 
Reader&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;IO
 and Decompression&lt;/div&gt;" 
style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;" parent="1" 
vertex="1">
-          <mxGeometry x="45" y="110" width="180" height="100" as="geometry" />
-        </mxCell>
-        <mxCell id="wVAZ-YzccNhZugPFJvmi-1" value="Native Code" 
style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;" vertex="1" 
parent="1">
-          <mxGeometry x="290" y="70" width="210" height="380" as="geometry" />
-        </mxCell>
-        <mxCell id="wVAZ-YzccNhZugPFJvmi-21" 
style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.75;exitDx=0;exitDy=0;entryX=1;entryY=0.75;entryDx=0;entryDy=0;"
 edge="1" parent="1" source="wVAZ-YzccNhZugPFJvmi-2" 
target="wVAZ-YzccNhZugPFJvmi-13">
-          <mxGeometry relative="1" as="geometry" />
-        </mxCell>
-        <mxCell id="wVAZ-YzccNhZugPFJvmi-2" value="Native Execution Plan" 
style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;" vertex="1" 
parent="1">
-          <mxGeometry x="310" y="240" width="170" height="100" as="geometry" />
-        </mxCell>
-        <mxCell id="wVAZ-YzccNhZugPFJvmi-19" 
style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.75;exitDx=0;exitDy=0;entryX=1;entryY=0.75;entryDx=0;entryDy=0;"
 edge="1" parent="1" source="wVAZ-YzccNhZugPFJvmi-4" 
target="t5OBkkhKOG6cYtw1sPyQ-18">
-          <mxGeometry relative="1" as="geometry" />
-        </mxCell>
-        <mxCell id="wVAZ-YzccNhZugPFJvmi-4" value="Parquet Decoding" 
style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;" vertex="1" 
parent="1">
-          <mxGeometry x="305" y="110" width="180" height="100" as="geometry" />
-        </mxCell>
-        <mxCell id="wVAZ-YzccNhZugPFJvmi-6" value="" 
style="shape=image;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=data:image/svg+xml,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9Im5vbmUiIHZpZXdCb3g9IjAgMCA4MDEgMTY4IiBoZWlnaHQ9IjE2OCIgd2lkdGg9IjgwMSI+JiN4YTs8ZyBjbGlwLXBhdGg9InVybCgjY2xpcDBfMV8xODEpIj4mI3hhOzxwYXRoIGZpbGw9InVybCgjcGFpbnQwX2xpbmVhcl8xXzE4MSkiIGQ9Ik03Ni4xMjk3IDE2OEM4OC40NTk3IDE2OCA5OS42MDk3IDE1
 [...]
-          <mxGeometry x="323.48" y="273.6" width="143.03" height="30" 
as="geometry" />
-        </mxCell>
-        <mxCell id="wVAZ-YzccNhZugPFJvmi-7" value="" 
style="shape=image;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=data:image/png,iVBORw0KGgoAAAANSUhEUgAABwgAAAOoCAMAAADyHlBJAAADAFBMVEUAAAABAQECAgIDAwMEBAQFBQUGBgYHBwcICAgJCQkKCgoLCwsMDAwNDQ0ODg4PDw8QEBARERESEhITExMUFBQVFRUWFhYXFxcYGBgZGRkaGhobGxscHBwdHR0eHh4fHx8gICAhISEiIiIjIyMkJCQlJSUmJiYnJycoKCgpKSkqKiorKyssLCwtLS0uLi4vLy8wMDAxMTEyMjIzMzM0NDQ1NTU2NjY3Nzc4ODg5OTk6Ojo7Ozs8
 [...]
-          <mxGeometry x="360" y="303.6" width="70" height="36.4" as="geometry" 
/>
-        </mxCell>
-        <mxCell id="wVAZ-YzccNhZugPFJvmi-10" value="" 
style="shape=flexArrow;endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;"
 edge="1" parent="1">
-          <mxGeometry width="50" height="50" relative="1" as="geometry">
-            <mxPoint x="394.5" y="340" as="sourcePoint" />
-            <mxPoint x="394.5" y="370" as="targetPoint" />
-          </mxGeometry>
-        </mxCell>
-        <mxCell id="wVAZ-YzccNhZugPFJvmi-11" value="Shuffle Files" 
style="shape=process;whiteSpace=wrap;html=1;backgroundOutline=1;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#666666;"
 vertex="1" parent="1">
-          <mxGeometry x="310" y="370" width="170" height="50" as="geometry" />
-        </mxCell>
-        <mxCell id="wVAZ-YzccNhZugPFJvmi-20" 
style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;entryX=0;entryY=0.25;entryDx=0;entryDy=0;"
 edge="1" parent="1" source="wVAZ-YzccNhZugPFJvmi-13" 
target="wVAZ-YzccNhZugPFJvmi-2">
-          <mxGeometry relative="1" as="geometry" />
-        </mxCell>
-        <mxCell id="wVAZ-YzccNhZugPFJvmi-28" value="executePlan()" 
style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];"
 vertex="1" connectable="0" parent="wVAZ-YzccNhZugPFJvmi-20">
-          <mxGeometry x="-0.1059" y="2" relative="1" as="geometry">
-            <mxPoint y="11" as="offset" />
-          </mxGeometry>
-        </mxCell>
-        <mxCell id="wVAZ-YzccNhZugPFJvmi-23" 
style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=0;exitDx=0;exitDy=0;entryX=0.25;entryY=1;entryDx=0;entryDy=0;"
 edge="1" parent="1" source="wVAZ-YzccNhZugPFJvmi-13" 
target="t5OBkkhKOG6cYtw1sPyQ-18">
-          <mxGeometry relative="1" as="geometry" />
-        </mxCell>
-        <mxCell id="wVAZ-YzccNhZugPFJvmi-25" 
style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=1;exitDx=0;exitDy=0;entryX=0.75;entryY=0;entryDx=0;entryDy=0;"
 edge="1" parent="1" source="wVAZ-YzccNhZugPFJvmi-13" 
target="wVAZ-YzccNhZugPFJvmi-14">
-          <mxGeometry relative="1" as="geometry" />
-        </mxCell>
-        <mxCell id="wVAZ-YzccNhZugPFJvmi-13" value="CometExecIterator" 
style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=middle;" vertex="1" 
parent="1">
-          <mxGeometry x="45" y="240" width="180" height="100" as="geometry" />
-        </mxCell>
-        <mxCell id="wVAZ-YzccNhZugPFJvmi-22" 
style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=0;exitDx=0;exitDy=0;entryX=0.25;entryY=1;entryDx=0;entryDy=0;"
 edge="1" parent="1" source="wVAZ-YzccNhZugPFJvmi-14" 
target="wVAZ-YzccNhZugPFJvmi-13">
-          <mxGeometry relative="1" as="geometry" />
-        </mxCell>
-        <mxCell id="wVAZ-YzccNhZugPFJvmi-26" value="next()" 
style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];"
 vertex="1" connectable="0" parent="wVAZ-YzccNhZugPFJvmi-22">
-          <mxGeometry x="0.0667" y="1" relative="1" as="geometry">
-            <mxPoint x="21" as="offset" />
-          </mxGeometry>
-        </mxCell>
-        <mxCell id="wVAZ-YzccNhZugPFJvmi-14" value="Spark Execution Logic" 
style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=middle;" vertex="1" 
parent="1">
-          <mxGeometry x="45" y="370" width="180" height="40" as="geometry" />
-        </mxCell>
-        <mxCell id="wVAZ-YzccNhZugPFJvmi-15" value="" 
style="shape=image;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=data:image/png,iVBORw0KGgoAAAANSUhEUgAABwgAAAOoCAMAAADyHlBJAAADAFBMVEUAAAABAQECAgIDAwMEBAQFBQUGBgYHBwcICAgJCQkKCgoLCwsMDAwNDQ0ODg4PDw8QEBARERESEhITExMUFBQVFRUWFhYXFxcYGBgZGRkaGhobGxscHBwdHR0eHh4fHx8gICAhISEiIiIjIyMkJCQlJSUmJiYnJycoKCgpKSkqKiorKyssLCwtLS0uLi4vLy8wMDAxMTEyMjIzMzM0NDQ1NTU2NjY3Nzc4ODg5OTk6Ojo7Ozs
 [...]
-          <mxGeometry x="360" y="173.60000000000002" width="70" height="36.4" 
as="geometry" />
-        </mxCell>
-        <mxCell id="wVAZ-YzccNhZugPFJvmi-16" value="" 
style="shape=flexArrow;endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;"
 edge="1" parent="1">
-          <mxGeometry width="50" height="50" relative="1" as="geometry">
-            <mxPoint x="394.5" y="210" as="sourcePoint" />
-            <mxPoint x="394.5" y="240" as="targetPoint" />
-          </mxGeometry>
-        </mxCell>
-        <mxCell id="wVAZ-YzccNhZugPFJvmi-18" 
style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;entryX=0;entryY=0.25;entryDx=0;entryDy=0;"
 edge="1" parent="1" source="t5OBkkhKOG6cYtw1sPyQ-18" 
target="wVAZ-YzccNhZugPFJvmi-4">
-          <mxGeometry relative="1" as="geometry" />
-        </mxCell>
-        <mxCell id="wVAZ-YzccNhZugPFJvmi-29" value="decode()" 
style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];"
 vertex="1" connectable="0" parent="wVAZ-YzccNhZugPFJvmi-18">
-          <mxGeometry x="-0.025" y="-3" relative="1" as="geometry">
-            <mxPoint y="12" as="offset" />
-          </mxGeometry>
-        </mxCell>
-        <mxCell id="wVAZ-YzccNhZugPFJvmi-27" value="next()" 
style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];"
 vertex="1" connectable="0" parent="1">
-          <mxGeometry x="110" y="220" as="geometry" />
-        </mxCell>
-      </root>
-    </mxGraphModel>
-  </diagram>
-</mxfile>
diff --git a/_static/images/CometNativeParquetReader.drawio.svg 
b/_static/images/CometNativeParquetReader.drawio.svg
deleted file mode 100644
index 0c1f93c7..00000000
--- a/_static/images/CometNativeParquetReader.drawio.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Do not edit this file with editors other than draw.io -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd";>
-<svg xmlns="http://www.w3.org/2000/svg"; 
xmlns:xlink="http://www.w3.org/1999/xlink"; version="1.1" width="511px" 
height="431px" viewBox="-0.5 -0.5 511 431" content="&lt;mxfile 
host=&quot;app.diagrams.net&quot; agent=&quot;Mozilla/5.0 (Macintosh; Intel Mac 
OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.6 
Safari/605.1.15&quot; version=&quot;24.7.16&quot; scale=&quot;1&quot; 
border=&quot;0&quot;&gt;&#10;  &lt;diagram name=&quot;Page-1&quot; 
id=&quot;IdYZ_KFENTEXElLiOEKC&quo [...]
\ No newline at end of file
diff --git a/_static/images/CometOverviewDetailed.drawio 
b/_static/images/CometOverviewDetailed.drawio
deleted file mode 100644
index ff7f4c59..00000000
--- a/_static/images/CometOverviewDetailed.drawio
+++ /dev/null
@@ -1,94 +0,0 @@
-<mxfile host="app.diagrams.net" agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 
10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.6 Safari/605.1.15" 
version="24.7.16">
-  <diagram name="Page-1" id="IdYZ_KFENTEXElLiOEKC">
-    <mxGraphModel dx="1193" dy="827" grid="1" gridSize="10" guides="1" 
tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" 
pageWidth="850" pageHeight="1100" math="0" shadow="0">
-      <root>
-        <mxCell id="0" />
-        <mxCell id="1" parent="0" />
-        <mxCell id="AH3lBTSLKK5181iXBnnY-2" value="Spark Executor" 
style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;" parent="1" 
vertex="1">
-          <mxGeometry x="290" width="210" height="430" as="geometry" />
-        </mxCell>
-        <mxCell id="AH3lBTSLKK5181iXBnnY-16" value="Spark Driver" 
style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;" parent="1" 
vertex="1">
-          <mxGeometry y="40" width="200" height="350" as="geometry" />
-        </mxCell>
-        <mxCell id="AH3lBTSLKK5181iXBnnY-17" value="" 
style="shape=image;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=data:image/svg+xml,PHN2ZyB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjI7IiB4bWw6c3BhY2U9InByZXNlcnZlIiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA
 [...]
-          <mxGeometry x="34.519999999999996" y="200" width="125.48" 
height="30" as="geometry" />
-        </mxCell>
-        <mxCell id="t5OBkkhKOG6cYtw1sPyQ-1" value="Spark Logical Plan" 
style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
-          <mxGeometry x="10" y="80" width="180" height="30" as="geometry" />
-        </mxCell>
-        <mxCell id="t5OBkkhKOG6cYtw1sPyQ-2" value="Spark Physical Plan" 
style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
-          <mxGeometry x="10" y="140" width="180" height="30" as="geometry" />
-        </mxCell>
-        <mxCell id="t5OBkkhKOG6cYtw1sPyQ-3" value="Comet Physical Plan" 
style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;" vertex="1" 
parent="1">
-          <mxGeometry x="10" y="260" width="180" height="100" as="geometry" />
-        </mxCell>
-        <mxCell id="t5OBkkhKOG6cYtw1sPyQ-4" value="protobuf intermediate 
representation" 
style="shape=process;whiteSpace=wrap;html=1;backgroundOutline=1;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#666666;"
 vertex="1" parent="1">
-          <mxGeometry x="40" y="290" width="120" height="50" as="geometry" />
-        </mxCell>
-        <mxCell id="t5OBkkhKOG6cYtw1sPyQ-12" value="" 
style="shape=flexArrow;endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;"
 edge="1" parent="1" source="t5OBkkhKOG6cYtw1sPyQ-1" 
target="t5OBkkhKOG6cYtw1sPyQ-2">
-          <mxGeometry width="50" height="50" relative="1" as="geometry">
-            <mxPoint x="270" y="270" as="sourcePoint" />
-            <mxPoint x="320" y="220" as="targetPoint" />
-          </mxGeometry>
-        </mxCell>
-        <mxCell id="t5OBkkhKOG6cYtw1sPyQ-13" value="" 
style="shape=flexArrow;endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;"
 edge="1" parent="1">
-          <mxGeometry width="50" height="50" relative="1" as="geometry">
-            <mxPoint x="96.75999999999999" y="170" as="sourcePoint" />
-            <mxPoint x="96.75999999999999" y="200" as="targetPoint" />
-          </mxGeometry>
-        </mxCell>
-        <mxCell id="t5OBkkhKOG6cYtw1sPyQ-14" value="" 
style="shape=flexArrow;endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;"
 edge="1" parent="1">
-          <mxGeometry width="50" height="50" relative="1" as="geometry">
-            <mxPoint x="96.75999999999999" y="230" as="sourcePoint" />
-            <mxPoint x="96.75999999999999" y="260" as="targetPoint" />
-          </mxGeometry>
-        </mxCell>
-        <mxCell id="t5OBkkhKOG6cYtw1sPyQ-15" value="" 
style="shape=flexArrow;endArrow=classic;html=1;rounded=0;endWidth=28;endSize=9.67;width=11;fillColor=#000000;"
 edge="1" parent="1">
-          <mxGeometry width="50" height="50" relative="1" as="geometry">
-            <mxPoint x="200" y="204.5" as="sourcePoint" />
-            <mxPoint x="290" y="204.5" as="targetPoint" />
-          </mxGeometry>
-        </mxCell>
-        <mxCell id="t5OBkkhKOG6cYtw1sPyQ-16" value="Native Execution Plan" 
style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;" vertex="1" 
parent="1">
-          <mxGeometry x="310" y="230" width="170" height="100" as="geometry" />
-        </mxCell>
-        <mxCell id="t5OBkkhKOG6cYtw1sPyQ-17" value="" 
style="shape=image;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=data:image/svg+xml,PHN2ZyB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjI7IiB4bWw6c3BhY2U9InByZXNlcnZlIiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA
 [...]
-          <mxGeometry x="332.26" y="170" width="125.48" height="30" 
as="geometry" />
-        </mxCell>
-        <mxCell id="t5OBkkhKOG6cYtw1sPyQ-18" value="Comet Physical Plan" 
style="rounded=1;whiteSpace=wrap;html=1;verticalAlign=top;" vertex="1" 
parent="1">
-          <mxGeometry x="305" y="40" width="180" height="100" as="geometry" />
-        </mxCell>
-        <mxCell id="t5OBkkhKOG6cYtw1sPyQ-19" value="protobuf intermediate 
representation" 
style="shape=process;whiteSpace=wrap;html=1;backgroundOutline=1;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#666666;"
 vertex="1" parent="1">
-          <mxGeometry x="335" y="70" width="120" height="50" as="geometry" />
-        </mxCell>
-        <mxCell id="t5OBkkhKOG6cYtw1sPyQ-20" value="" 
style="shape=image;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=data:image/svg+xml,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9Im5vbmUiIHZpZXdCb3g9IjAgMCA4MDEgMTY4IiBoZWlnaHQ9IjE2OCIgd2lkdGg9IjgwMSI+JiN4YTs8ZyBjbGlwLXBhdGg9InVybCgjY2xpcDBfMV8xODEpIj4mI3hhOzxwYXRoIGZpbGw9InVybCgjcGFpbnQwX2xpbmVhcl8xXzE4MSkiIGQ9Ik03Ni4xMjk3IDE2OEM4OC40NTk3IDE2OCA5OS42MDk3IDE
 [...]
-          <mxGeometry x="323.48" y="263.6" width="143.03" height="30" 
as="geometry" />
-        </mxCell>
-        <mxCell id="t5OBkkhKOG6cYtw1sPyQ-21" value="" 
style="shape=image;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=data:image/png,iVBORw0KGgoAAAANSUhEUgAABwgAAAOoCAMAAADyHlBJAAADAFBMVEUAAAABAQECAgIDAwMEBAQFBQUGBgYHBwcICAgJCQkKCgoLCwsMDAwNDQ0ODg4PDw8QEBARERESEhITExMUFBQVFRUWFhYXFxcYGBgZGRkaGhobGxscHBwdHR0eHh4fHx8gICAhISEiIiIjIyMkJCQlJSUmJiYnJycoKCgpKSkqKiorKyssLCwtLS0uLi4vLy8wMDAxMTEyMjIzMzM0NDQ1NTU2NjY3Nzc4ODg5OTk6Ojo7Ozs
 [...]
-          <mxGeometry x="360" y="293.6" width="70" height="36.4" as="geometry" 
/>
-        </mxCell>
-        <mxCell id="t5OBkkhKOG6cYtw1sPyQ-22" value="" 
style="shape=flexArrow;endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;"
 edge="1" parent="1">
-          <mxGeometry width="50" height="50" relative="1" as="geometry">
-            <mxPoint x="394.5" y="140" as="sourcePoint" />
-            <mxPoint x="394.5" y="170" as="targetPoint" />
-          </mxGeometry>
-        </mxCell>
-        <mxCell id="t5OBkkhKOG6cYtw1sPyQ-23" value="" 
style="shape=flexArrow;endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;"
 edge="1" parent="1" source="t5OBkkhKOG6cYtw1sPyQ-17" 
target="t5OBkkhKOG6cYtw1sPyQ-16">
-          <mxGeometry width="50" height="50" relative="1" as="geometry">
-            <mxPoint x="140" y="210" as="sourcePoint" />
-            <mxPoint x="140" y="240" as="targetPoint" />
-          </mxGeometry>
-        </mxCell>
-        <mxCell id="t5OBkkhKOG6cYtw1sPyQ-24" value="" 
style="shape=flexArrow;endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;"
 edge="1" parent="1">
-          <mxGeometry width="50" height="50" relative="1" as="geometry">
-            <mxPoint x="394.5" y="330" as="sourcePoint" />
-            <mxPoint x="394.5" y="360" as="targetPoint" />
-          </mxGeometry>
-        </mxCell>
-        <mxCell id="t5OBkkhKOG6cYtw1sPyQ-25" value="Shuffle Files" 
style="shape=process;whiteSpace=wrap;html=1;backgroundOutline=1;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#666666;"
 vertex="1" parent="1">
-          <mxGeometry x="310" y="360" width="170" height="50" as="geometry" />
-        </mxCell>
-      </root>
-    </mxGraphModel>
-  </diagram>
-</mxfile>
diff --git a/_static/images/CometOverviewDetailed.drawio.svg 
b/_static/images/CometOverviewDetailed.drawio.svg
deleted file mode 100644
index 0f29083b..00000000
--- a/_static/images/CometOverviewDetailed.drawio.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Do not edit this file with editors other than draw.io -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd";>
-<svg xmlns="http://www.w3.org/2000/svg"; 
xmlns:xlink="http://www.w3.org/1999/xlink"; version="1.1" width="501px" 
height="431px" viewBox="-0.5 -0.5 501 431" content="&lt;mxfile 
host=&quot;app.diagrams.net&quot; agent=&quot;Mozilla/5.0 (Macintosh; Intel Mac 
OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.6 
Safari/605.1.15&quot; version=&quot;24.7.16&quot; scale=&quot;1&quot; 
border=&quot;0&quot;&gt;&#10;  &lt;diagram name=&quot;Page-1&quot; 
id=&quot;IdYZ_KFENTEXElLiOEKC&quo [...]
\ No newline at end of file
diff --git a/_static/images/comet-dataflow.excalidraw 
b/_static/images/comet-dataflow.excalidraw
new file mode 100644
index 00000000..dd120998
--- /dev/null
+++ b/_static/images/comet-dataflow.excalidraw
@@ -0,0 +1,2134 @@
+{
+  "type": "excalidraw",
+  "version": 2,
+  "source": "https://excalidraw.com";,
+  "elements": [
+    {
+      "id": "dDrwaYB6MkVSDP_FHWS-F",
+      "type": "rectangle",
+      "x": 825.6666870117188,
+      "y": 116.83334350585938,
+      "width": 321.9999999999999,
+      "height": 324,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#ffd8a8",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "Zz",
+      "roundness": {
+        "type": 3
+      },
+      "seed": 1163356465,
+      "version": 243,
+      "versionNonce": 743550265,
+      "isDeleted": false,
+      "boundElements": [
+        {
+          "id": "u84B3vp5oTVNXI5uXsZ-r",
+          "type": "arrow"
+        },
+        {
+          "id": "dlyj3Gno71fx16oqbbjXF",
+          "type": "arrow"
+        }
+      ],
+      "updated": 1733167126280,
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "8pVcXTnP3tefe_O3kTE0b",
+      "type": "text",
+      "x": 467.66668701171875,
+      "y": 48.833343505859375,
+      "width": 61,
+      "height": 25,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#b2f2bb",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "dotted",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "aS",
+      "roundness": null,
+      "seed": 306458015,
+      "version": 181,
+      "versionNonce": 110788633,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1733167570417,
+      "link": null,
+      "locked": false,
+      "text": "JVM",
+      "fontSize": 20,
+      "fontFamily": 5,
+      "textAlign": "left",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "JVM",
+      "autoResize": false,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "Ax7J0LoYh5TwQoRBM47cz",
+      "type": "text",
+      "x": 941.6666870117188,
+      "y": 56.833343505859375,
+      "width": 97,
+      "height": 25,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#b2f2bb",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "dotted",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "aT",
+      "roundness": null,
+      "seed": 1762016049,
+      "version": 173,
+      "versionNonce": 1117284823,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1733167564367,
+      "link": null,
+      "locked": false,
+      "text": "Native",
+      "fontSize": 20,
+      "fontFamily": 5,
+      "textAlign": "left",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "Native",
+      "autoResize": false,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "lSUrwgLq2W49ULouPfm0h",
+      "type": "rectangle",
+      "x": 868.1666870117188,
+      "y": 168.83334350585938,
+      "width": 245.00000000000006,
+      "height": 83.99999999999997,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#b2f2bb",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "aU",
+      "roundness": {
+        "type": 3
+      },
+      "seed": 1188956881,
+      "version": 337,
+      "versionNonce": 502265527,
+      "isDeleted": false,
+      "boundElements": [
+        {
+          "type": "text",
+          "id": "M6A-P7jOlvlDx-Kc0nsrQ"
+        },
+        {
+          "id": "MqWIMNh5n51EVvWedfTIA",
+          "type": "arrow"
+        },
+        {
+          "id": "GPIY241P4rRnRn48VdbYe",
+          "type": "arrow"
+        },
+        {
+          "id": "6KmKXuc4aon2_yKt2fdZE",
+          "type": "arrow"
+        },
+        {
+          "id": "ou2srC_Up4kjWcmgzdEH4",
+          "type": "arrow"
+        }
+      ],
+      "updated": 1733167585167,
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "M6A-P7jOlvlDx-Kc0nsrQ",
+      "type": "text",
+      "x": 903.4791870117188,
+      "y": 198.33334350585938,
+      "width": 174.375,
+      "height": 25,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#b2f2bb",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "aV",
+      "roundness": null,
+      "seed": 1968605361,
+      "version": 333,
+      "versionNonce": 1113091385,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1733166946960,
+      "link": null,
+      "locked": false,
+      "text": "ShuffleWriterExec",
+      "fontSize": 20,
+      "fontFamily": 5,
+      "textAlign": "center",
+      "verticalAlign": "middle",
+      "containerId": "lSUrwgLq2W49ULouPfm0h",
+      "originalText": "ShuffleWriterExec",
+      "autoResize": true,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "GHKyE6o_at1-J0KO1mWpt",
+      "type": "rectangle",
+      "x": 363.85928382109046,
+      "y": 505.8341459769945,
+      "width": 262.9999999999998,
+      "height": 93.99611799705886,
+      "angle": 0.003703686768755432,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#a5d8ff",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "aa",
+      "roundness": {
+        "type": 3
+      },
+      "seed": 952999857,
+      "version": 632,
+      "versionNonce": 906119703,
+      "isDeleted": false,
+      "boundElements": [
+        {
+          "type": "text",
+          "id": "yHFb7s7QYOWZst8xXlFG2"
+        },
+        {
+          "id": "Jd5Fqfx6eFl_OJ6x0TUki",
+          "type": "arrow"
+        },
+        {
+          "id": "7KEns52XY_jok50o5G5op",
+          "type": "arrow"
+        },
+        {
+          "id": "quv5xELoqOR6W5SJipUrY",
+          "type": "arrow"
+        },
+        {
+          "id": "kQzva6A57whXeUyhhNxOl",
+          "type": "arrow"
+        },
+        {
+          "id": "Pjo3gnqBVibIixMHpFvkK",
+          "type": "arrow"
+        }
+      ],
+      "updated": 1733167372550,
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "yHFb7s7QYOWZst8xXlFG2",
+      "type": "text",
+      "x": 399.93428382109033,
+      "y": 540.3322049755238,
+      "width": 190.85000000000002,
+      "height": 25,
+      "angle": 0.003703686768755432,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#a5d8ff",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "ab",
+      "roundness": null,
+      "seed": 1354040959,
+      "version": 598,
+      "versionNonce": 226422583,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1733167372550,
+      "link": null,
+      "locked": false,
+      "text": "CometExecIterator",
+      "fontSize": 20,
+      "fontFamily": 5,
+      "textAlign": "center",
+      "verticalAlign": "middle",
+      "containerId": "GHKyE6o_at1-J0KO1mWpt",
+      "originalText": "CometExecIterator",
+      "autoResize": true,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "Iv4y4lEpq-EOkw5bBAWNA",
+      "type": "text",
+      "x": 930.6666870117188,
+      "y": 130.83334350585938,
+      "width": 109.9000015258789,
+      "height": 25,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#ffd8a8",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b06",
+      "roundness": null,
+      "seed": 952057055,
+      "version": 92,
+      "versionNonce": 52977177,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1733166946960,
+      "link": null,
+      "locked": false,
+      "text": "Native Plan",
+      "fontSize": 20,
+      "fontFamily": 5,
+      "textAlign": "left",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "Native Plan",
+      "autoResize": true,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "Ro2R78aPw-luRF_bB2EKU",
+      "type": "rectangle",
+      "x": 366.34678047371074,
+      "y": 307.83595662631933,
+      "width": 262.99999999999983,
+      "height": 92.00353907094141,
+      "angle": 0.003703686768755432,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#a5d8ff",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b0g",
+      "roundness": {
+        "type": 3
+      },
+      "seed": 959895479,
+      "version": 644,
+      "versionNonce": 1083149527,
+      "isDeleted": false,
+      "boundElements": [
+        {
+          "type": "text",
+          "id": "twg3z-vK6jWmVl4xySGde"
+        },
+        {
+          "id": "u84B3vp5oTVNXI5uXsZ-r",
+          "type": "arrow"
+        },
+        {
+          "id": "IISSP3sEmCbjsvI4SFgaX",
+          "type": "arrow"
+        },
+        {
+          "id": "7KEns52XY_jok50o5G5op",
+          "type": "arrow"
+        },
+        {
+          "id": "quv5xELoqOR6W5SJipUrY",
+          "type": "arrow"
+        }
+      ],
+      "updated": 1733167372551,
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "twg3z-vK6jWmVl4xySGde",
+      "type": "text",
+      "x": 396.18428047371066,
+      "y": 341.33772616179004,
+      "width": 203.32500000000002,
+      "height": 25,
+      "angle": 0.003703686768755432,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#a5d8ff",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b0h",
+      "roundness": null,
+      "seed": 34654423,
+      "version": 631,
+      "versionNonce": 1121311223,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1733167372551,
+      "link": null,
+      "locked": false,
+      "text": "CometBatchIterator",
+      "fontSize": 20,
+      "fontFamily": 5,
+      "textAlign": "center",
+      "verticalAlign": "middle",
+      "containerId": "Ro2R78aPw-luRF_bB2EKU",
+      "originalText": "CometBatchIterator",
+      "autoResize": true,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "macb6DKtgx8DhcqjKk6no",
+      "type": "rectangle",
+      "x": 366.1634633724364,
+      "y": 157.33528450732996,
+      "width": 262.9999999999998,
+      "height": 93.99611799705886,
+      "angle": 0.003703686768755432,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#a5d8ff",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b0i",
+      "roundness": {
+        "type": 3
+      },
+      "seed": 1827361271,
+      "version": 674,
+      "versionNonce": 1149488599,
+      "isDeleted": false,
+      "boundElements": [
+        {
+          "type": "text",
+          "id": "HzfSeR8C3p6yYRHlGGIdM"
+        },
+        {
+          "id": "dlyj3Gno71fx16oqbbjXF",
+          "type": "arrow"
+        },
+        {
+          "id": "MqWIMNh5n51EVvWedfTIA",
+          "type": "arrow"
+        }
+      ],
+      "updated": 1733167385065,
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "HzfSeR8C3p6yYRHlGGIdM",
+      "type": "text",
+      "x": 402.2384633724363,
+      "y": 191.83334350585938,
+      "width": 190.85000000000002,
+      "height": 25,
+      "angle": 0.003703686768755432,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#a5d8ff",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b0j",
+      "roundness": null,
+      "seed": 901511959,
+      "version": 643,
+      "versionNonce": 1747825847,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1733167372551,
+      "link": null,
+      "locked": false,
+      "text": "CometExecIterator",
+      "fontSize": 20,
+      "fontFamily": 5,
+      "textAlign": "center",
+      "verticalAlign": "middle",
+      "containerId": "macb6DKtgx8DhcqjKk6no",
+      "originalText": "CometExecIterator",
+      "autoResize": true,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "7VTYHzsqQvUuKMy0ShKZn",
+      "type": "rectangle",
+      "x": 871.1634633724364,
+      "y": 304.3333435058594,
+      "width": 245.00000000000006,
+      "height": 83.99999999999997,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#b2f2bb",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b0k",
+      "roundness": {
+        "type": 3
+      },
+      "seed": 1785572407,
+      "version": 379,
+      "versionNonce": 1216788985,
+      "isDeleted": false,
+      "boundElements": [
+        {
+          "type": "text",
+          "id": "YKETugAZBRtG7oeas8CPz"
+        },
+        {
+          "id": "IISSP3sEmCbjsvI4SFgaX",
+          "type": "arrow"
+        },
+        {
+          "id": "u84B3vp5oTVNXI5uXsZ-r",
+          "type": "arrow"
+        },
+        {
+          "id": "GPIY241P4rRnRn48VdbYe",
+          "type": "arrow"
+        },
+        {
+          "id": "6KmKXuc4aon2_yKt2fdZE",
+          "type": "arrow"
+        }
+      ],
+      "updated": 1733167417649,
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "YKETugAZBRtG7oeas8CPz",
+      "type": "text",
+      "x": 947.8009641353758,
+      "y": 333.8333435058594,
+      "width": 91.7249984741211,
+      "height": 25,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#b2f2bb",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b0l",
+      "roundness": null,
+      "seed": 2121862487,
+      "version": 357,
+      "versionNonce": 1828219865,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1733166946960,
+      "link": null,
+      "locked": false,
+      "text": "ScanExec",
+      "fontSize": 20,
+      "fontFamily": 5,
+      "textAlign": "center",
+      "verticalAlign": "middle",
+      "containerId": "7VTYHzsqQvUuKMy0ShKZn",
+      "originalText": "ScanExec",
+      "autoResize": true,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "_a8_bfztXdYiD4AXJxPee",
+      "type": "rectangle",
+      "x": 820.6634633724364,
+      "y": 473.3333435058594,
+      "width": 334.9999999999999,
+      "height": 329,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#ffd8a8",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b0m",
+      "roundness": {
+        "type": 3
+      },
+      "seed": 1577231703,
+      "version": 409,
+      "versionNonce": 1832634263,
+      "isDeleted": false,
+      "boundElements": [
+        {
+          "id": "kQzva6A57whXeUyhhNxOl",
+          "type": "arrow"
+        },
+        {
+          "id": "Pjo3gnqBVibIixMHpFvkK",
+          "type": "arrow"
+        }
+      ],
+      "updated": 1733167465343,
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "aiAipugp154jY5IgHqjTm",
+      "type": "rectangle",
+      "x": 862.1634633724364,
+      "y": 535.3333435058594,
+      "width": 245.00000000000006,
+      "height": 83.99999999999997,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#b2f2bb",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b0n",
+      "roundness": {
+        "type": 3
+      },
+      "seed": 1666310775,
+      "version": 392,
+      "versionNonce": 1164820153,
+      "isDeleted": false,
+      "boundElements": [
+        {
+          "type": "text",
+          "id": "XPpjuVi7ZYpwo3X03G9P1"
+        },
+        {
+          "id": "Pjo3gnqBVibIixMHpFvkK",
+          "type": "arrow"
+        }
+      ],
+      "updated": 1733167345582,
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "XPpjuVi7ZYpwo3X03G9P1",
+      "type": "text",
+      "x": 924.6759633724364,
+      "y": 564.8333435058594,
+      "width": 119.97500000000001,
+      "height": 25,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#b2f2bb",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b0o",
+      "roundness": null,
+      "seed": 838630295,
+      "version": 403,
+      "versionNonce": 1508263831,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1733166982872,
+      "link": null,
+      "locked": false,
+      "text": "ProjectExec",
+      "fontSize": 20,
+      "fontFamily": 5,
+      "textAlign": "center",
+      "verticalAlign": "middle",
+      "containerId": "aiAipugp154jY5IgHqjTm",
+      "originalText": "ProjectExec",
+      "autoResize": true,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "aE2QBjfmrpzBTUB_t6QRY",
+      "type": "text",
+      "x": 924.6634633724364,
+      "y": 497.3333435058594,
+      "width": 109.9000015258789,
+      "height": 25,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#ffd8a8",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b0p",
+      "roundness": null,
+      "seed": 1043787959,
+      "version": 150,
+      "versionNonce": 1187544183,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1733166977658,
+      "link": null,
+      "locked": false,
+      "text": "Native Plan",
+      "fontSize": 20,
+      "fontFamily": 5,
+      "textAlign": "left",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "Native Plan",
+      "autoResize": true,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "vG9tTZvROj2ybA4oAS_bb",
+      "type": "rectangle",
+      "x": 864.160239733154,
+      "y": 671.8333435058594,
+      "width": 245.00000000000006,
+      "height": 83.99999999999997,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#b2f2bb",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b0q",
+      "roundness": {
+        "type": 3
+      },
+      "seed": 27640279,
+      "version": 529,
+      "versionNonce": 1105701913,
+      "isDeleted": false,
+      "boundElements": [
+        {
+          "type": "text",
+          "id": "oWkZozTacCvv40wRG7g3s"
+        }
+      ],
+      "updated": 1733167462816,
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "oWkZozTacCvv40wRG7g3s",
+      "type": "text",
+      "x": 978.160239733154,
+      "y": 701.3333435058594,
+      "width": 17,
+      "height": 25,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#b2f2bb",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b0r",
+      "roundness": null,
+      "seed": 1297968887,
+      "version": 526,
+      "versionNonce": 271368441,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1733167462816,
+      "link": null,
+      "locked": false,
+      "text": "...",
+      "fontSize": 20,
+      "fontFamily": 5,
+      "textAlign": "center",
+      "verticalAlign": "middle",
+      "containerId": "vG9tTZvROj2ybA4oAS_bb",
+      "originalText": "...",
+      "autoResize": true,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "kQzva6A57whXeUyhhNxOl",
+      "type": "arrow",
+      "x": 627.9453883765393,
+      "y": 529.8293445331748,
+      "width": 192.71807499589704,
+      "height": 0.234522891430629,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#b2f2bb",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b0w",
+      "roundness": {
+        "type": 2
+      },
+      "seed": 562773463,
+      "version": 217,
+      "versionNonce": 611157943,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1733167475920,
+      "link": null,
+      "locked": false,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          192.71807499589704,
+          0.234522891430629
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": {
+        "elementId": "GHKyE6o_at1-J0KO1mWpt",
+        "focus": -0.48947127224675757,
+        "gap": 1,
+        "fixedPoint": null
+      },
+      "endBinding": {
+        "elementId": "C3-eUJazhRorbXp9Um-Mo",
+        "focus": -1.9941089907787155,
+        "gap": 12.73052391874603,
+        "fixedPoint": null
+      },
+      "startArrowhead": null,
+      "endArrowhead": "arrow",
+      "elbowed": false
+    },
+    {
+      "id": "Pjo3gnqBVibIixMHpFvkK",
+      "type": "arrow",
+      "x": 861.6634633724364,
+      "y": 571.3333435058594,
+      "width": 233.87028528948713,
+      "height": 0.4072197033743805,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#b2f2bb",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b0y",
+      "roundness": {
+        "type": 2
+      },
+      "seed": 189975865,
+      "version": 190,
+      "versionNonce": 1899895735,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1733167372551,
+      "link": null,
+      "locked": false,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          -233.87028528948713,
+          -0.4072197033743805
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": {
+        "elementId": "aiAipugp154jY5IgHqjTm",
+        "focus": 0.1262072643242283,
+        "gap": 1,
+        "fixedPoint": null
+      },
+      "endBinding": {
+        "elementId": "GHKyE6o_at1-J0KO1mWpt",
+        "focus": 0.37801089214584216,
+        "gap": 1,
+        "fixedPoint": null
+      },
+      "startArrowhead": null,
+      "endArrowhead": "arrow",
+      "elbowed": false
+    },
+    {
+      "id": "u84B3vp5oTVNXI5uXsZ-r",
+      "type": "arrow",
+      "x": 867.6634633724364,
+      "y": 335.3333435058594,
+      "width": 235.9983810536769,
+      "height": 0.5628844927418868,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#b2f2bb",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b0z",
+      "roundness": {
+        "type": 2
+      },
+      "seed": 849585047,
+      "version": 139,
+      "versionNonce": 2098561815,
+      "isDeleted": false,
+      "boundElements": null,
+      "updated": 1733167372551,
+      "link": null,
+      "locked": false,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          -235.9983810536769,
+          0.5628844927418868
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": {
+        "elementId": "7VTYHzsqQvUuKMy0ShKZn",
+        "focus": 0.261904761904762,
+        "gap": 3.5,
+        "fixedPoint": null
+      },
+      "endBinding": {
+        "elementId": "Ro2R78aPw-luRF_bB2EKU",
+        "focus": -0.3765315568105985,
+        "gap": 2.2509344960505473,
+        "fixedPoint": null
+      },
+      "startArrowhead": null,
+      "endArrowhead": "arrow",
+      "elbowed": false
+    },
+    {
+      "id": "IISSP3sEmCbjsvI4SFgaX",
+      "type": "arrow",
+      "x": 630.6644917368169,
+      "y": 368.0556851230956,
+      "width": 238.99897163561945,
+      "height": 0.7223416172362249,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#b2f2bb",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b12",
+      "roundness": {
+        "type": 2
+      },
+      "seed": 1980422201,
+      "version": 131,
+      "versionNonce": 1606617143,
+      "isDeleted": false,
+      "boundElements": null,
+      "updated": 1733167372551,
+      "link": null,
+      "locked": false,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          238.99897163561945,
+          -0.7223416172362249
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": {
+        "elementId": "Ro2R78aPw-luRF_bB2EKU",
+        "focus": 0.31181090317651905,
+        "gap": 1.3694590603334404,
+        "fixedPoint": null
+      },
+      "endBinding": {
+        "elementId": "7VTYHzsqQvUuKMy0ShKZn",
+        "focus": -0.5000000000000002,
+        "gap": 1.5,
+        "fixedPoint": null
+      },
+      "startArrowhead": null,
+      "endArrowhead": "arrow",
+      "elbowed": false
+    },
+    {
+      "id": "7KEns52XY_jok50o5G5op",
+      "type": "arrow",
+      "x": 437.66346337243635,
+      "y": 399.3333435058594,
+      "width": 4,
+      "height": 104,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#b2f2bb",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b13",
+      "roundness": {
+        "type": 2
+      },
+      "seed": 1651841465,
+      "version": 252,
+      "versionNonce": 1005623161,
+      "isDeleted": false,
+      "boundElements": null,
+      "updated": 1733167373032,
+      "link": null,
+      "locked": false,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          4,
+          104
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": {
+        "elementId": "Ro2R78aPw-luRF_bB2EKU",
+        "focus": 0.46419678699387723,
+        "gap": 1,
+        "fixedPoint": null
+      },
+      "endBinding": {
+        "elementId": "GHKyE6o_at1-J0KO1mWpt",
+        "focus": -0.3880655447790852,
+        "gap": 2.3015909311958467,
+        "fixedPoint": null
+      },
+      "startArrowhead": null,
+      "endArrowhead": "arrow",
+      "elbowed": false
+    },
+    {
+      "id": "quv5xELoqOR6W5SJipUrY",
+      "type": "arrow",
+      "x": 555.6634633724364,
+      "y": 503.3333435058594,
+      "width": 0,
+      "height": 103,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#b2f2bb",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b14",
+      "roundness": {
+        "type": 2
+      },
+      "seed": 1677615735,
+      "version": 236,
+      "versionNonce": 55168313,
+      "isDeleted": false,
+      "boundElements": null,
+      "updated": 1733167373032,
+      "link": null,
+      "locked": false,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          0,
+          -103
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": {
+        "elementId": "GHKyE6o_at1-J0KO1mWpt",
+        "focus": 0.4579838276843583,
+        "gap": 2.723810257547825,
+        "fixedPoint": null
+      },
+      "endBinding": {
+        "elementId": "Ro2R78aPw-luRF_bB2EKU",
+        "focus": -0.43910468547182224,
+        "gap": 1,
+        "fixedPoint": null
+      },
+      "startArrowhead": null,
+      "endArrowhead": "arrow",
+      "elbowed": false
+    },
+    {
+      "id": "dlyj3Gno71fx16oqbbjXF",
+      "type": "arrow",
+      "x": 632.6636522386541,
+      "y": 181.2823496270506,
+      "width": 193.99981113378226,
+      "height": 0.9490061211912177,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#b2f2bb",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b15",
+      "roundness": {
+        "type": 2
+      },
+      "seed": 1072669367,
+      "version": 132,
+      "versionNonce": 1271110743,
+      "isDeleted": false,
+      "boundElements": null,
+      "updated": 1733167393399,
+      "link": null,
+      "locked": false,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          193.99981113378226,
+          -0.9490061211912177
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": {
+        "elementId": "macb6DKtgx8DhcqjKk6no",
+        "focus": -0.4652381310069499,
+        "gap": 3.4138894826694752,
+        "fixedPoint": null
+      },
+      "endBinding": {
+        "elementId": "OFwuou30qsm3aMZ96ASUO",
+        "focus": -1.5667144994299218,
+        "gap": 7.5,
+        "fixedPoint": null
+      },
+      "startArrowhead": null,
+      "endArrowhead": "arrow",
+      "elbowed": false
+    },
+    {
+      "id": "C3-eUJazhRorbXp9Um-Mo",
+      "type": "text",
+      "x": 664.6634633724364,
+      "y": 492.3333435058594,
+      "width": 189,
+      "height": 25,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#b2f2bb",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b16",
+      "roundness": null,
+      "seed": 755500537,
+      "version": 76,
+      "versionNonce": 1747049559,
+      "isDeleted": false,
+      "boundElements": [
+        {
+          "id": "kQzva6A57whXeUyhhNxOl",
+          "type": "arrow"
+        }
+      ],
+      "updated": 1733167475516,
+      "link": null,
+      "locked": false,
+      "text": "executePlan()",
+      "fontSize": 20,
+      "fontFamily": 5,
+      "textAlign": "left",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "executePlan()",
+      "autoResize": false,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "OFwuou30qsm3aMZ96ASUO",
+      "type": "text",
+      "x": 669.1634633724364,
+      "y": 147.83334350585938,
+      "width": 189,
+      "height": 25,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#b2f2bb",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b17",
+      "roundness": null,
+      "seed": 1806263479,
+      "version": 124,
+      "versionNonce": 1646888249,
+      "isDeleted": false,
+      "boundElements": [
+        {
+          "id": "dlyj3Gno71fx16oqbbjXF",
+          "type": "arrow"
+        }
+      ],
+      "updated": 1733167389568,
+      "link": null,
+      "locked": false,
+      "text": "executePlan()",
+      "fontSize": 20,
+      "fontFamily": 5,
+      "textAlign": "left",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "executePlan()",
+      "autoResize": false,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "2ZoBSXI-amAjEfzxoQ17b",
+      "type": "text",
+      "x": 749.1634633724364,
+      "y": 308.8333435058594,
+      "width": 111,
+      "height": 25,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#b2f2bb",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b18",
+      "roundness": null,
+      "seed": 1238305721,
+      "version": 97,
+      "versionNonce": 1368434199,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1733167188224,
+      "link": null,
+      "locked": false,
+      "text": "next()",
+      "fontSize": 20,
+      "fontFamily": 5,
+      "textAlign": "left",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "next()",
+      "autoResize": false,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "1-lAVH11BDSwJVoMYl80T",
+      "type": "text",
+      "x": 371.16346337243635,
+      "y": 439.8333435058594,
+      "width": 111,
+      "height": 25,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#b2f2bb",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b19",
+      "roundness": null,
+      "seed": 756108375,
+      "version": 211,
+      "versionNonce": 161358135,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1733167372551,
+      "link": null,
+      "locked": false,
+      "text": "next()",
+      "fontSize": 20,
+      "fontFamily": 5,
+      "textAlign": "left",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "next()",
+      "autoResize": false,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "VFm7kotI1oNa1rIxLMh6W",
+      "type": "text",
+      "x": 676.6634633724364,
+      "y": 376.3333435058594,
+      "width": 147,
+      "height": 25,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#b2f2bb",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b1A",
+      "roundness": null,
+      "seed": 1623222905,
+      "version": 76,
+      "versionNonce": 1030050969,
+      "isDeleted": false,
+      "boundElements": null,
+      "updated": 1733167271120,
+      "link": null,
+      "locked": false,
+      "text": "exportBatch()",
+      "fontSize": 20,
+      "fontFamily": 5,
+      "textAlign": "left",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "exportBatch()",
+      "autoResize": false,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "LZtRekUnAEPkjsECzd7zb",
+      "type": "text",
+      "x": 663.6634633724364,
+      "y": 575.3333435058594,
+      "width": 217,
+      "height": 25,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#b2f2bb",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b1B",
+      "roundness": null,
+      "seed": 187512855,
+      "version": 127,
+      "versionNonce": 1917573399,
+      "isDeleted": false,
+      "boundElements": null,
+      "updated": 1733167377483,
+      "link": null,
+      "locked": false,
+      "text": "importVectors()",
+      "fontSize": 20,
+      "fontFamily": 5,
+      "textAlign": "left",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "importVectors()",
+      "autoResize": false,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "MqWIMNh5n51EVvWedfTIA",
+      "type": "arrow",
+      "x": 868.6634633724364,
+      "y": 220.33334350585938,
+      "width": 239,
+      "height": 1,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#b2f2bb",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b1C",
+      "roundness": {
+        "type": 2
+      },
+      "seed": 685490007,
+      "version": 35,
+      "versionNonce": 652639415,
+      "isDeleted": false,
+      "boundElements": null,
+      "updated": 1733167385065,
+      "link": null,
+      "locked": false,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          -239,
+          1
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": {
+        "elementId": "lSUrwgLq2W49ULouPfm0h",
+        "focus": -0.2114558118557865,
+        "gap": 1,
+        "fixedPoint": null
+      },
+      "endBinding": {
+        "elementId": "macb6DKtgx8DhcqjKk6no",
+        "focus": 0.3654122251883526,
+        "gap": 1,
+        "fixedPoint": null
+      },
+      "startArrowhead": null,
+      "endArrowhead": "arrow",
+      "elbowed": false
+    },
+    {
+      "id": "RYdCN0xyvNHqlA1WDARNx",
+      "type": "text",
+      "x": 670.1634633724364,
+      "y": 225.83334350585938,
+      "width": 217,
+      "height": 25,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#b2f2bb",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b1D",
+      "roundness": null,
+      "seed": 546285145,
+      "version": 165,
+      "versionNonce": 1950128183,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1733167400420,
+      "link": null,
+      "locked": false,
+      "text": "importVectors()",
+      "fontSize": 20,
+      "fontFamily": 5,
+      "textAlign": "left",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "importVectors()",
+      "autoResize": false,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "GPIY241P4rRnRn48VdbYe",
+      "type": "arrow",
+      "x": 941.6634633724364,
+      "y": 264.3333435058594,
+      "width": 2,
+      "height": 32,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#b2f2bb",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b1E",
+      "roundness": {
+        "type": 2
+      },
+      "seed": 1958688375,
+      "version": 17,
+      "versionNonce": 1070980535,
+      "isDeleted": false,
+      "boundElements": null,
+      "updated": 1733167413149,
+      "link": null,
+      "locked": false,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          2,
+          32
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": {
+        "elementId": "lSUrwgLq2W49ULouPfm0h",
+        "focus": 0.4183574316825765,
+        "gap": 11.500000000000014,
+        "fixedPoint": null
+      },
+      "endBinding": {
+        "elementId": "7VTYHzsqQvUuKMy0ShKZn",
+        "focus": -0.37462537462537454,
+        "gap": 8,
+        "fixedPoint": null
+      },
+      "startArrowhead": null,
+      "endArrowhead": "arrow",
+      "elbowed": false
+    },
+    {
+      "id": "6KmKXuc4aon2_yKt2fdZE",
+      "type": "arrow",
+      "x": 1052.6634633724364,
+      "y": 290.3333435058594,
+      "width": 1,
+      "height": 30,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#b2f2bb",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b1F",
+      "roundness": {
+        "type": 2
+      },
+      "seed": 1971585785,
+      "version": 15,
+      "versionNonce": 1869550297,
+      "isDeleted": false,
+      "boundElements": null,
+      "updated": 1733167417649,
+      "link": null,
+      "locked": false,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          -1,
+          -30
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": {
+        "elementId": "7VTYHzsqQvUuKMy0ShKZn",
+        "focus": 0.4912563895614742,
+        "gap": 14,
+        "fixedPoint": null
+      },
+      "endBinding": {
+        "elementId": "lSUrwgLq2W49ULouPfm0h",
+        "focus": -0.4789893168742339,
+        "gap": 7.500000000000014,
+        "fixedPoint": null
+      },
+      "startArrowhead": null,
+      "endArrowhead": "arrow",
+      "elbowed": false
+    },
+    {
+      "id": "0HMrFdchM3CqZB7BeDX-8",
+      "type": "text",
+      "x": 866.1634633724364,
+      "y": 269.8333435058594,
+      "width": 111,
+      "height": 25,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#b2f2bb",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b1G",
+      "roundness": null,
+      "seed": 752246361,
+      "version": 154,
+      "versionNonce": 350456215,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1733167430100,
+      "link": null,
+      "locked": false,
+      "text": "next()",
+      "fontSize": 20,
+      "fontFamily": 5,
+      "textAlign": "left",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "next()",
+      "autoResize": false,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "laDFG84hR_vbCVHWMp16w",
+      "type": "arrow",
+      "x": 942.7269220990613,
+      "y": 628.5394176529115,
+      "width": 2,
+      "height": 32,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#b2f2bb",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b1H",
+      "roundness": {
+        "type": 2
+      },
+      "seed": 1602854839,
+      "version": 100,
+      "versionNonce": 1479430905,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1733167459736,
+      "link": null,
+      "locked": false,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          2,
+          32
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": null,
+      "endBinding": null,
+      "startArrowhead": null,
+      "endArrowhead": "arrow",
+      "elbowed": false
+    },
+    {
+      "id": "PKnVxmYbX4yxvUMYxiED6",
+      "type": "arrow",
+      "x": 1053.7269220990613,
+      "y": 654.5394176529115,
+      "width": 1,
+      "height": 30,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#b2f2bb",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b1I",
+      "roundness": {
+        "type": 2
+      },
+      "seed": 1657442519,
+      "version": 98,
+      "versionNonce": 951815129,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1733167459736,
+      "link": null,
+      "locked": false,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          -1,
+          -30
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": null,
+      "endBinding": null,
+      "startArrowhead": null,
+      "endArrowhead": "arrow",
+      "elbowed": false
+    },
+    {
+      "id": "3s_jHVea7P3zpwyhsYqNO",
+      "type": "text",
+      "x": 867.2269220990613,
+      "y": 634.0394176529115,
+      "width": 111,
+      "height": 25,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#b2f2bb",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b1J",
+      "roundness": null,
+      "seed": 1863343607,
+      "version": 237,
+      "versionNonce": 149858489,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1733167459736,
+      "link": null,
+      "locked": false,
+      "text": "next()",
+      "fontSize": 20,
+      "fontFamily": 5,
+      "textAlign": "left",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "next()",
+      "autoResize": false,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "9t3RnkE-nqccuTgRaqj2w",
+      "type": "text",
+      "x": 492.66346337243635,
+      "y": 444.3333435058594,
+      "width": 60.000000000000014,
+      "height": 25,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#b2f2bb",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b1K",
+      "roundness": null,
+      "seed": 1235248153,
+      "version": 108,
+      "versionNonce": 91341817,
+      "isDeleted": false,
+      "boundElements": null,
+      "updated": 1733167501667,
+      "link": null,
+      "locked": false,
+      "text": "batch",
+      "fontSize": 20,
+      "fontFamily": 5,
+      "textAlign": "left",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "batch",
+      "autoResize": false,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "3xNt8fnnjY9QtNoev_FMj",
+      "type": "text",
+      "x": 1070.6634633724364,
+      "y": 265.8333435058594,
+      "width": 60.000000000000014,
+      "height": 25,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#b2f2bb",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b1L",
+      "roundness": null,
+      "seed": 1471691417,
+      "version": 154,
+      "versionNonce": 195092727,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1733167506301,
+      "link": null,
+      "locked": false,
+      "text": "batch",
+      "fontSize": 20,
+      "fontFamily": 5,
+      "textAlign": "left",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "batch",
+      "autoResize": false,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "p9iXL4J6GojVzXDDx1NVM",
+      "type": "text",
+      "x": 1071.6634633724364,
+      "y": 629.8333435058594,
+      "width": 60.000000000000014,
+      "height": 25,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#b2f2bb",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b1M",
+      "roundness": null,
+      "seed": 951602999,
+      "version": 150,
+      "versionNonce": 595097273,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1733167509787,
+      "link": null,
+      "locked": false,
+      "text": "batch",
+      "fontSize": 20,
+      "fontFamily": 5,
+      "textAlign": "left",
+      "verticalAlign": "top",
+      "containerId": null,
+      "originalText": "batch",
+      "autoResize": false,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "xdQ0w3-b5BGEpSvQ2Uc8A",
+      "type": "rectangle",
+      "x": 1212.6634633724364,
+      "y": 131.83334350585938,
+      "width": 260,
+      "height": 128.99999999999997,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#eaddd7",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b1N",
+      "roundness": {
+        "type": 3
+      },
+      "seed": 407784057,
+      "version": 373,
+      "versionNonce": 1796011255,
+      "isDeleted": false,
+      "boundElements": [
+        {
+          "type": "text",
+          "id": "h6I3dPlbn7bb50l-R-ZrT"
+        },
+        {
+          "id": "ou2srC_Up4kjWcmgzdEH4",
+          "type": "arrow"
+        }
+      ],
+      "updated": 1733167585167,
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "h6I3dPlbn7bb50l-R-ZrT",
+      "type": "text",
+      "x": 1282.2634633724363,
+      "y": 136.83334350585938,
+      "width": 120.80000000000001,
+      "height": 25,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#eaddd7",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b1O",
+      "roundness": null,
+      "seed": 1894814553,
+      "version": 326,
+      "versionNonce": 1273706233,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1733167557133,
+      "link": null,
+      "locked": false,
+      "text": "Shuffle Files",
+      "fontSize": 20,
+      "fontFamily": 5,
+      "textAlign": "center",
+      "verticalAlign": "top",
+      "containerId": "xdQ0w3-b5BGEpSvQ2Uc8A",
+      "originalText": "Shuffle Files",
+      "autoResize": true,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "rpX5p5xVzE-agyW9ssfpT",
+      "type": "rectangle",
+      "x": 1253.6634633724364,
+      "y": 182.33334350585938,
+      "width": 190,
+      "height": 45,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#ffec99",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b1P",
+      "roundness": {
+        "type": 3
+      },
+      "seed": 337035321,
+      "version": 422,
+      "versionNonce": 1799090137,
+      "isDeleted": false,
+      "boundElements": [
+        {
+          "type": "text",
+          "id": "ZHswgvVioPRH-MY0pzRZO"
+        }
+      ],
+      "updated": 1733167557133,
+      "link": null,
+      "locked": false
+    },
+    {
+      "id": "ZHswgvVioPRH-MY0pzRZO",
+      "type": "text",
+      "x": 1264.0634648983153,
+      "y": 192.33334350585938,
+      "width": 169.1999969482422,
+      "height": 25,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#ffec99",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b1Q",
+      "roundness": null,
+      "seed": 1336168729,
+      "version": 390,
+      "versionNonce": 1438813369,
+      "isDeleted": false,
+      "boundElements": [],
+      "updated": 1733167557133,
+      "link": null,
+      "locked": false,
+      "text": "Arrow IPC Batch",
+      "fontSize": 20,
+      "fontFamily": 5,
+      "textAlign": "center",
+      "verticalAlign": "middle",
+      "containerId": "rpX5p5xVzE-agyW9ssfpT",
+      "originalText": "Arrow IPC Batch",
+      "autoResize": true,
+      "lineHeight": 1.25
+    },
+    {
+      "id": "ou2srC_Up4kjWcmgzdEH4",
+      "type": "arrow",
+      "x": 1114.6634633724364,
+      "y": 210.33334350585938,
+      "width": 97,
+      "height": 2,
+      "angle": 0,
+      "strokeColor": "#1e1e1e",
+      "backgroundColor": "#b2f2bb",
+      "fillStyle": "solid",
+      "strokeWidth": 2,
+      "strokeStyle": "solid",
+      "roughness": 1,
+      "opacity": 100,
+      "groupIds": [],
+      "frameId": null,
+      "index": "b1R",
+      "roundness": {
+        "type": 2
+      },
+      "seed": 1875512793,
+      "version": 40,
+      "versionNonce": 1347291095,
+      "isDeleted": false,
+      "boundElements": null,
+      "updated": 1733167585167,
+      "link": null,
+      "locked": false,
+      "points": [
+        [
+          0,
+          0
+        ],
+        [
+          97,
+          -2
+        ]
+      ],
+      "lastCommittedPoint": null,
+      "startBinding": {
+        "elementId": "lSUrwgLq2W49ULouPfm0h",
+        "focus": 0.04618975520292551,
+        "gap": 1.496776360717604,
+        "fixedPoint": null
+      },
+      "endBinding": {
+        "elementId": "xdQ0w3-b5BGEpSvQ2Uc8A",
+        "focus": -0.13841786234942072,
+        "gap": 1,
+        "fixedPoint": null
+      },
+      "startArrowhead": null,
+      "endArrowhead": "arrow",
+      "elbowed": false
+    }
+  ],
+  "appState": {
+    "gridSize": 20,
+    "gridStep": 5,
+    "gridModeEnabled": false,
+    "viewBackgroundColor": "#ffffff"
+  },
+  "files": {}
+}
\ No newline at end of file
diff --git a/_static/images/comet-dataflow.svg 
b/_static/images/comet-dataflow.svg
new file mode 100644
index 00000000..20a573c1
--- /dev/null
+++ b/_static/images/comet-dataflow.svg
@@ -0,0 +1,10 @@
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg"; viewBox="0 0 
1128.9773433315036 773.5" width="1128.9773433315036" height="773.5">
+  <!-- svg-source:excalidraw -->
+  
+  <defs>
+    <style class="style-fonts">
+      @font-face { font-family: Excalifont; src: 
url(data:font/woff2;base64,d09GMgABAAAAABlQAA4AAAAALSgAABj6AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhwbixocgSwGYACBJBEICsMksWILUgABNgIkA4EgBCAFgxgHIBshIzMDZYo2l+y/SuCGTNAGfQESjURQFAsMgzbkR8o96x61X4D9Y/FiOgwGHAyYh4uvctPwdOq/Q+6CBheoips6XFMHqlNpBbB2ZrtOQgd9DNAXB1NkAze3/zW+TjQILJZgCCGEJhiH9GiBwPCWTFdsW9yaQziSu3vAEY+3KNVRAP8/zVnf3netpUO0n8ih4m6/PeUmdsY+CHRTmiQFXEC6SfJ/OU3pqnm9/ZkRGALm0EK8SetFupkKp7Tn9gzoq3PVyJICJFmG0NvgAvCM5FP7pTNxGyCVTYRCFRVhwy6s/M0G
 [...]
+    </style>
+    
+  </defs>
+  <rect x="0" y="0" width="1128.9773433315036" height="773.5" 
fill="#ffffff"></rect><g stroke-linecap="round" 
transform="translate(471.9805669707859 78) rotate(0 161 162)"><path d="M32 0 
C123.09 3.55, 219.04 5.56, 290 0 C313.3 0.74, 320.33 10.98, 322 32 C323.23 
106.37, 328.2 181.34, 322 292 C319.1 315.56, 311.42 326.96, 290 324 C232.9 
325.78, 173.6 325.1, 32 324 C12.98 324.29, -2.09 313.02, 0 292 C1.81 236.77, 
0.94 174.2, 0 32 C-0.73 8.19, 7.39 -2.91, 32 0" stroke="none" stroke-width="0" 
[...]
\ No newline at end of file
diff --git a/contributor-guide/plugin_overview.html 
b/contributor-guide/plugin_overview.html
index 5d6640f5..edb1d7a2 100644
--- a/contributor-guide/plugin_overview.html
+++ b/contributor-guide/plugin_overview.html
@@ -287,19 +287,43 @@ under the License.
   </a>
  </li>
  <li class="toc-h2 nav-item toc-entry">
-  <a class="reference internal nav-link" href="#cometscanrule">
-   CometScanRule
+  <a class="reference internal nav-link" href="#cometsparksessionextensions">
+   CometSparkSessionExtensions
   </a>
+  <ul class="nav section-nav flex-column">
+   <li class="toc-h3 nav-item toc-entry">
+    <a class="reference internal nav-link" href="#cometscanrule">
+     CometScanRule
+    </a>
+   </li>
+   <li class="toc-h3 nav-item toc-entry">
+    <a class="reference internal nav-link" href="#cometexecrule">
+     CometExecRule
+    </a>
+   </li>
+  </ul>
  </li>
  <li class="toc-h2 nav-item toc-entry">
-  <a class="reference internal nav-link" href="#cometexecrule">
-   CometExecRule
+  <a class="reference internal nav-link" href="#query-execution">
+   Query Execution
   </a>
  </li>
  <li class="toc-h2 nav-item toc-entry">
-  <a class="reference internal nav-link" href="#query-execution">
-   Query Execution
+  <a class="reference internal nav-link" href="#arrow">
+   Arrow
   </a>
+  <ul class="nav section-nav flex-column">
+   <li class="toc-h3 nav-item toc-entry">
+    <a class="reference internal nav-link" href="#arrow-ffi">
+     Arrow FFI
+    </a>
+   </li>
+   <li class="toc-h3 nav-item toc-entry">
+    <a class="reference internal nav-link" href="#arrow-ipc">
+     Arrow IPC
+    </a>
+   </li>
+  </ul>
  </li>
  <li class="toc-h2 nav-item toc-entry">
   <a class="reference internal nav-link" href="#end-to-end-flow">
@@ -361,12 +385,19 @@ following setting to the Spark configuration when 
launching <code class="docutil
 <div class="highlight-default notranslate"><div 
class="highlight"><pre><span></span><span class="o">--</span><span 
class="n">conf</span> <span class="n">spark</span><span class="o">.</span><span 
class="n">plugins</span><span class="o">=</span><span class="n">org</span><span 
class="o">.</span><span class="n">apache</span><span class="o">.</span><span 
class="n">spark</span><span class="o">.</span><span class="n">CometPlugin</span>
 </pre></div>
 </div>
+<p>This class is loaded by Spark’s plugin framework. It will be instantiated 
in the Spark driver only. Comet does not
+provide any executor plugins.</p>
+<p>The plugin will update the current <code class="docutils literal 
notranslate"><span class="pre">SparkConf</span></code> with the extra 
configuration provided by Comet, such as executor memory
+configuration.</p>
+<p>The plugin also registers <code class="docutils literal notranslate"><span 
class="pre">CometSparkSessionExtensions</span></code> with Spark’s extension 
API.</p>
+</section>
+<section id="cometsparksessionextensions">
+<h2>CometSparkSessionExtensions<a class="headerlink" 
href="#cometsparksessionextensions" title="Link to this heading">¶</a></h2>
 <p>On initialization, this class registers two physical plan optimization 
rules with Spark: <code class="docutils literal notranslate"><span 
class="pre">CometScanRule</span></code>
 and <code class="docutils literal notranslate"><span 
class="pre">CometExecRule</span></code>. These rules run whenever a query stage 
is being planned during Adaptive Query Execution, and
 run once for the entire plan when Adaptive Query Execution is disabled.</p>
-</section>
 <section id="cometscanrule">
-<h2>CometScanRule<a class="headerlink" href="#cometscanrule" title="Link to 
this heading">¶</a></h2>
+<h3>CometScanRule<a class="headerlink" href="#cometscanrule" title="Link to 
this heading">¶</a></h3>
 <p><code class="docutils literal notranslate"><span 
class="pre">CometScanRule</span></code> replaces any Parquet scans with Comet 
operators. There are different paths for Spark v1 and v2 data sources.</p>
 <p>When reading from Parquet v1 data sources, Comet replaces <code 
class="docutils literal notranslate"><span 
class="pre">FileSourceScanExec</span></code> with a <code class="docutils 
literal notranslate"><span class="pre">CometScanExec</span></code>, and for v2
 data sources, <code class="docutils literal notranslate"><span 
class="pre">BatchScanExec</span></code> is replaced with <code class="docutils 
literal notranslate"><span class="pre">CometBatchScanExec</span></code>. In 
both cases, Comet replaces Spark’s Parquet
@@ -374,13 +405,13 @@ reader with a custom vectorized Parquet reader. This is 
similar to Spark’s vec
 Parquet data source but leverages native code for decoding Parquet row groups 
directly into Arrow format.</p>
 <p>Comet only supports a subset of data types and will fall back to Spark’s 
scan if unsupported types
 exist. Comet can still accelerate the rest of the query execution in this case 
because <code class="docutils literal notranslate"><span 
class="pre">CometSparkToColumnarExec</span></code> will
-convert the output from Spark’s can to Arrow arrays. Note that both <code 
class="docutils literal notranslate"><span 
class="pre">spark.comet.exec.enabled=true</span></code> and
+convert the output from Spark’s scan to Arrow arrays. Note that both <code 
class="docutils literal notranslate"><span 
class="pre">spark.comet.exec.enabled=true</span></code> and
 <code class="docutils literal notranslate"><span 
class="pre">spark.comet.convert.parquet.enabled=true</span></code> must be set 
to enable this conversion.</p>
 <p>Refer to the <a class="reference external" 
href="https://datafusion.apache.org/comet/user-guide/datatypes.html";>Supported 
Spark Data Types</a> section
 in the contributor guide to see a list of currently supported data types.</p>
 </section>
 <section id="cometexecrule">
-<h2>CometExecRule<a class="headerlink" href="#cometexecrule" title="Link to 
this heading">¶</a></h2>
+<h3>CometExecRule<a class="headerlink" href="#cometexecrule" title="Link to 
this heading">¶</a></h3>
 <p>This rule traverses bottom-up from the original Spark plan and attempts to 
replace each operator with a Comet equivalent.
 For example, a <code class="docutils literal notranslate"><span 
class="pre">ProjectExec</span></code> will be replaced by <code class="docutils 
literal notranslate"><span class="pre">CometProjectExec</span></code>.</p>
 <p>When replacing a node, various checks are performed to determine if Comet 
can support the operator and its expressions.
@@ -390,25 +421,51 @@ underlying Spark node and the plan will not be 
converted.</p>
 transitions to convert between row-based and columnar data between Spark 
operators and Comet operators and the overhead
 of this could outweigh the benefits of running parts of the query stage 
natively in Comet.</p>
 </section>
+</section>
 <section id="query-execution">
 <h2>Query Execution<a class="headerlink" href="#query-execution" title="Link 
to this heading">¶</a></h2>
-<p>Once the plan has been transformed, any consecutive Comet operators are 
combined into a <code class="docutils literal notranslate"><span 
class="pre">CometNativeExec</span></code> which contains
-a serialized version of the plan (the serialization code can be found in <code 
class="docutils literal notranslate"><span 
class="pre">QueryPlanSerde</span></code>). When this operator is
-executed, the serialized plan is passed to the native code when calling <code 
class="docutils literal notranslate"><span 
class="pre">Native.createPlan</span></code>.</p>
-<p>In the native code there is a <code class="docutils literal 
notranslate"><span class="pre">PhysicalPlanner</span></code> struct (in <code 
class="docutils literal notranslate"><span 
class="pre">planner.rs</span></code>) which converts the serialized plan into an
+<p>Once the plan has been transformed, any consecutive native Comet operators 
are combined into a <code class="docutils literal notranslate"><span 
class="pre">CometNativeExec</span></code> which contains
+a protocol buffer serialized version of the plan (the serialization code can 
be found in <code class="docutils literal notranslate"><span 
class="pre">QueryPlanSerde</span></code>).</p>
+<p>Spark serializes the physical plan and sends it to the executors when 
executing tasks. The executors deserialize the
+plan and invoke it.</p>
+<p>When <code class="docutils literal notranslate"><span 
class="pre">CometNativeExec</span></code> is invoked, it will pass the 
serialized protobuf plan into
+<code class="docutils literal notranslate"><span 
class="pre">Native.createPlan</span></code>, which invokes the native code via 
JNI, where the plan is then deserialized.</p>
+<p>In the native code there is a <code class="docutils literal 
notranslate"><span class="pre">PhysicalPlanner</span></code> struct (in <code 
class="docutils literal notranslate"><span 
class="pre">planner.rs</span></code>) which converts the deserialized plan into 
an
 Apache DataFusion <code class="docutils literal notranslate"><span 
class="pre">ExecutionPlan</span></code>. In some cases, Comet provides 
specialized physical operators and expressions to
 override the DataFusion versions to ensure compatibility with Apache Spark.</p>
-<p><code class="docutils literal notranslate"><span 
class="pre">CometExecIterator</span></code> will invoke <code class="docutils 
literal notranslate"><span class="pre">Native.executePlan</span></code> to pull 
the next batch from the native plan. This is repeated
-until no more batches are available (meaning that all data has been processed 
by the native plan).</p>
-<p>The leaf nodes in the physical plan are always <code class="docutils 
literal notranslate"><span class="pre">ScanExec</span></code> and these 
operators consume batches of Arrow data that were
-prepared before the plan is executed. When <code class="docutils literal 
notranslate"><span class="pre">CometExecIterator</span></code> invokes <code 
class="docutils literal notranslate"><span 
class="pre">Native.executePlan</span></code> it passes the memory
-addresses of these Arrow arrays to the native code.</p>
-<p><img alt="Diagram of Comet Native Execution" 
src="../_static/images/CometOverviewDetailed.drawio.svg" /></p>
+<p>The leaf nodes in the physical plan are always <code class="docutils 
literal notranslate"><span class="pre">ScanExec</span></code> and each of these 
operators will make a JNI call to
+<code class="docutils literal notranslate"><span 
class="pre">CometBatchIterator.next()</span></code> to fetch the next input 
batch. The input could be a Comet native Parquet scan,
+a Spark exchange, or another native plan.</p>
+<p><code class="docutils literal notranslate"><span 
class="pre">CometNativeExec</span></code> creates a <code class="docutils 
literal notranslate"><span class="pre">CometExecIterator</span></code> and 
applies this iterator to the input RDD
+partitions. Each call to <code class="docutils literal notranslate"><span 
class="pre">CometExecIterator.next()</span></code> will invoke <code 
class="docutils literal notranslate"><span 
class="pre">Native.executePlan</span></code>. Once the plan finishes
+executing, the resulting Arrow batches are imported into the JVM using Arrow 
FFI.</p>
+</section>
+<section id="arrow">
+<h2>Arrow<a class="headerlink" href="#arrow" title="Link to this 
heading">¶</a></h2>
+<p>Due to the hybrid execution model, it is necessary to pass batches of data 
between the JVM and native code.</p>
+<p>Comet uses a combination of Arrow FFI and Arrow IPC to achieve this.</p>
+<section id="arrow-ffi">
+<h3>Arrow FFI<a class="headerlink" href="#arrow-ffi" title="Link to this 
heading">¶</a></h3>
+<p>The foundation for Arrow FFI is the <a class="reference external" 
href="https://arrow.apache.org/docs/format/CDataInterface.html";>Arrow C Data 
Interface</a>, which provides a stable ABI-compatible interface for
+accessing Arrow data structures from multiple languages.</p>
+<ul class="simple">
+<li><p><code class="docutils literal notranslate"><span 
class="pre">CometExecIterator</span></code> invokes native plans and uses Arrow 
FFI to read the output batches</p></li>
+<li><p>Native <code class="docutils literal notranslate"><span 
class="pre">ScanExec</span></code> operators call <code class="docutils literal 
notranslate"><span class="pre">CometBatchIterator</span></code> via JNI to 
fetch input batches from the JVM</p></li>
+</ul>
+</section>
+<section id="arrow-ipc">
+<h3>Arrow IPC<a class="headerlink" href="#arrow-ipc" title="Link to this 
heading">¶</a></h3>
+<p>Comet native shuffle uses Arrow IPC to write batches to the shuffle 
files.</p>
+<ul class="simple">
+<li><p><code class="docutils literal notranslate"><span 
class="pre">CometShuffleWriteProcessor</span></code> invokes a native plan to 
fetch batches and then passes them to native <code class="docutils literal 
notranslate"><span class="pre">ShuffleWriterExec</span></code></p></li>
+<li><p><code class="docutils literal notranslate"><span 
class="pre">CometBlockStoreShuffleReader</span></code> reads batches from 
shuffle files</p></li>
+</ul>
+</section>
 </section>
 <section id="end-to-end-flow">
 <h2>End to End Flow<a class="headerlink" href="#end-to-end-flow" title="Link 
to this heading">¶</a></h2>
-<p>The following diagram shows the end-to-end flow.</p>
-<p><img alt="Diagram of Comet Native Parquet Scan" 
src="../_static/images/CometNativeParquetReader.drawio.svg" /></p>
+<p>The following diagram shows an example of the end-to-end flow for a query 
stage.</p>
+<p><img alt="Diagram of Comet Data Flow" 
src="../_static/images/comet-dataflow.svg" /></p>
 </section>
 </section>
 
diff --git a/searchindex.js b/searchindex.js
index 68be9de8..8a441ad6 100644
--- a/searchindex.js
+++ b/searchindex.js
@@ -1 +1 @@
-Search.setIndex({"alltitles": {"1. Install Comet": [[9, "install-comet"]], "2. 
Clone Spark and Apply Diff": [[9, "clone-spark-and-apply-diff"]], "3. Run Spark 
SQL Tests": [[9, "run-spark-sql-tests"]], "ANSI mode": [[11, "ansi-mode"]], 
"API Differences Between Spark Versions": [[0, 
"api-differences-between-spark-versions"]], "ASF Links": [[10, null]], "Adding 
Spark-side Tests for the New Expression": [[0, 
"adding-spark-side-tests-for-the-new-expression"]], "Adding a New Expression": 
[[0,  [...]
\ No newline at end of file
+Search.setIndex({"alltitles": {"1. Install Comet": [[9, "install-comet"]], "2. 
Clone Spark and Apply Diff": [[9, "clone-spark-and-apply-diff"]], "3. Run Spark 
SQL Tests": [[9, "run-spark-sql-tests"]], "ANSI mode": [[11, "ansi-mode"]], 
"API Differences Between Spark Versions": [[0, 
"api-differences-between-spark-versions"]], "ASF Links": [[10, null]], "Adding 
Spark-side Tests for the New Expression": [[0, 
"adding-spark-side-tests-for-the-new-expression"]], "Adding a New Expression": 
[[0,  [...]
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to