mirror of
https://github.com/penpot/penpot.git
synced 2026-08-29 08:08:46 +00:00
A projected graph is a cache of one file at one revision, built by one schema, and nothing in it said so. `GraphMeta` records the file, the revision, the schema version and the producer, and is written last, so its presence also marks the build complete and its contents say whether a cached database is still worth opening. - `graph/meta.clj`: the `GraphMeta` table and its writer. - `graph/schema/contract.clj`: one place that maps a Penpot key to its graph column. The rule is snake_case of the key; every exception, be it a rename, a drop or a type override, is recorded there with its reason, so a divergence is a diff to review rather than a silent rename. - `graph/project/document.clj`: `page-id` and the inherited `component-id` are written during the tree walk, which already knows both, rather than by a post-ingest statement. `graph/sync.clj` does the same on the incremental path, so a live-synced graph matches a rebuild. - `graph/project/transforms.clj`: a registry, so adding a derived-link pass is one entry. Adds `RefersTo` (from `shape-ref`) and `FillsSwapSlot` (from `swap-slot-*` entries in `touched`, then stripped as `ctk/normal-touched-groups` does). - `graph/debug.clj`, `graph/stats.clj`: enumerate relationship tables from the catalog instead of naming them, so the console's graph view and the ingest counts pick up new edge types without being told. - `graph/debug.clj`, `http/debug.clj`: `graph-export` gains `source=session`, which snapshots the live in-memory console graph through EXPORT/IMPORT DATABASE. Live sync moves that graph away from a fresh projection, and taking it away to query elsewhere is the point of asking for it. AI-assisted-by: mixed models
66 lines
1.9 KiB
Clojure
66 lines
1.9 KiB
Clojure
;; This Source Code Form is subject to the terms of the Mozilla Public
|
|
;; License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
;;
|
|
;; Copyright (c) KALEIDOS INC Sucursal en España SL
|
|
|
|
(ns app.graph.report
|
|
(:require
|
|
[clojure.core :as c]
|
|
[clojure.string :as str]))
|
|
|
|
(defn- println!
|
|
[& lines]
|
|
(doseq [line lines]
|
|
(println line)))
|
|
|
|
(defn- section-title
|
|
[title]
|
|
(println! (str "\n" title)
|
|
(str (apply str (repeat (count title) "─")))))
|
|
|
|
(defn- kv-line
|
|
[k v]
|
|
(format " %-14s %s" (str k ":") v))
|
|
|
|
(defn- print-node-counts
|
|
[nodes]
|
|
(doseq [[table count] (sort-by first nodes)
|
|
:when (pos? (long count))]
|
|
(println! (kv-line table count))))
|
|
|
|
(defn print-ingest!
|
|
"Pretty-print the result map returned by `app.graph.ingest/ingest-file!`."
|
|
[{:keys [file-id revn name db-path schema-version projection transforms stats]}]
|
|
(section-title "Graph ingest")
|
|
(println! (kv-line "File" (str name " (" file-id ")"))
|
|
(kv-line "Revision" revn)
|
|
(kv-line "Schema" schema-version)
|
|
(kv-line "Database" db-path))
|
|
|
|
(when-let [pstats (:stats projection)]
|
|
(section-title "Projection")
|
|
(doseq [[k v] (sort-by key pstats)]
|
|
(println! (kv-line (c/name k) v))))
|
|
|
|
(section-title "Transforms")
|
|
(println! (kv-line "Applied" (or (:transforms transforms) 0)))
|
|
(doseq [[rel count] (sort-by key (:counts transforms))]
|
|
(println! (kv-line (c/name rel) count)))
|
|
(when-let [ids (seq (:ids transforms))]
|
|
(println! (kv-line "Recorded" (str/join ", " ids))))
|
|
|
|
(when stats
|
|
(section-title "Graph counts")
|
|
(when-let [nodes (:nodes stats)]
|
|
(println! " Nodes")
|
|
(print-node-counts nodes))
|
|
(when-let [edges (:edges stats)]
|
|
(println! " Edges")
|
|
(doseq [[rel count] (sort-by key edges)
|
|
:when (pos? (long count))]
|
|
(println! (kv-line (c/name rel) count)))))
|
|
|
|
(println!)
|
|
nil)
|