docs/source/contributor-guide/architecture/dependency-graph.md
This page shows the dependency relationships between DataFusion's workspace
crates. This only includes internal dependencies, external crates like Arrow are not included
The dependency graph is auto-generated by docs/scripts/generate_dependency_graph.sh to ensure it stays up-to-date, and the script now runs automatically as part of docs/build.sh.
<div id="workspace-deps-wrapper" style="border:1px solid #d4d4d8;border-radius:10px;overflow:hidden;background:#fff;">
<div id="workspace-deps-inline" style="min-height:760px;width:100%;background:#f8fafc;overflow:hidden;padding:0;margin:0;">
.. raw:: html
:file: ../../_static/data/deps.svg
</div>
<div style="padding:10px 12px;background:#f1f5f9;border-top:1px solid #e5e7eb;display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:8px;">
<span style="color:#334155;font-size:0.95rem;">Interactive SVG (pan, zoom, search)</span>
<div style="display:flex;align-items:center;gap:6px;">
<button id="workspace-deps-zoom-out" type="button" style="padding:6px 10px;border:1px solid #cbd5e1;border-radius:6px;background:#fff;color:#334155;cursor:pointer;">−</button>
<button id="workspace-deps-zoom-in" type="button" style="padding:6px 10px;border:1px solid #cbd5e1;border-radius:6px;background:#fff;color:#334155;cursor:pointer;">+</button>
</div>
<a href="../../_static/data/deps.svg" target="_blank" rel="noopener"
style="font-weight:600;color:#2563eb;text-decoration:none;">Open SVG ↗</a>
</div>
</div>
<script>
(function () {
const host = document.getElementById("workspace-deps-inline");
if (!host) {
return;
}
const svg = host.querySelector("svg");
if (!svg) {
host.textContent = "Unable to load dependency graph.";
host.style.display = "flex";
host.style.alignItems = "center";
host.style.justifyContent = "center";
host.style.background = "#f8fafc";
return;
}
svg.removeAttribute("width");
svg.removeAttribute("height");
svg.style.width = "100%";
svg.style.height = "100%";
svg.style.cursor = "grab";
svg.style.touchAction = "none";
const rawViewBox = (svg.getAttribute("viewBox") || "").split(/\s+/).map(Number);
if (rawViewBox.length !== 4 || rawViewBox.some((v) => Number.isNaN(v))) {
return;
}
const initial = {
x: rawViewBox[0],
y: rawViewBox[1],
width: rawViewBox[2],
height: rawViewBox[3],
};
const state = { ...initial };
const applyViewBox = () => {
svg.setAttribute("viewBox", `${state.x} ${state.y} ${state.width} ${state.height}`);
};
let isPanning = false;
let last = { x: 0, y: 0 };
svg.addEventListener("pointerdown", (event) => {
isPanning = true;
last = { x: event.clientX, y: event.clientY };
svg.setPointerCapture(event.pointerId);
svg.style.cursor = "grabbing";
});
const endPan = (event) => {
if (event && svg.hasPointerCapture(event.pointerId)) {
svg.releasePointerCapture(event.pointerId);
}
isPanning = false;
svg.style.cursor = "grab";
};
svg.addEventListener("pointerup", endPan);
svg.addEventListener("pointerleave", endPan);
svg.addEventListener("pointercancel", endPan);
const zoomBy = (factor) => {
const targetWidth = state.width * factor;
const targetHeight = state.height * factor;
const minSize = Math.max(initial.width * 0.05, 10);
const maxSize = initial.width * 20;
const clampedWidth = Math.min(Math.max(targetWidth, minSize), maxSize);
const clampedHeight = Math.min(Math.max(targetHeight, minSize), maxSize);
state.x += (state.width - clampedWidth) / 2;
state.y += (state.height - clampedHeight) / 2;
state.width = clampedWidth;
state.height = clampedHeight;
applyViewBox();
};
const normalizeDelta = (deltaY, deltaMode) => {
// Make trackpad/wheel zoom feel smooth across devices.
const multiplier = deltaMode === 1 ? 16 : deltaMode === 2 ? window.innerHeight : 1;
return deltaY * multiplier;
};
svg.addEventListener("pointermove", (event) => {
if (!isPanning) {
return;
}
const scaleX = state.width / svg.clientWidth;
const scaleY = state.height / svg.clientHeight;
state.x -= (event.clientX - last.x) * scaleX;
state.y -= (event.clientY - last.y) * scaleY;
last = { x: event.clientX, y: event.clientY };
applyViewBox();
});
svg.addEventListener("wheel", (event) => {
event.preventDefault();
const delta = normalizeDelta(event.deltaY, event.deltaMode);
const factor = Math.exp(delta * 0.0015); // smaller magnitude for smoother scrolling
zoomBy(factor);
}, { passive: false });
const zoomIn = document.getElementById("workspace-deps-zoom-in");
const zoomOut = document.getElementById("workspace-deps-zoom-out");
if (zoomIn) {
zoomIn.addEventListener("click", () => zoomBy(0.9));
}
if (zoomOut) {
zoomOut.addEventListener("click", () => zoomBy(1.1));
}
})();
</script>
Transitive dependencies are intentionally ignored to keep the graph readable.
The dependency graph is generated through cargo depgraph by docs/scripts/generate_dependency_graph.sh.