mirror of
https://github.com/penpot/penpot.git
synced 2026-08-13 08:18:52 +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
49 lines
1.7 KiB
Clojure
49 lines
1.7 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.stats
|
|
(:require
|
|
[app.graph.ladybug :as ladybug]
|
|
[app.graph.schema.nodes :as nodes]))
|
|
|
|
(defn- count-on-connection
|
|
[conn statement]
|
|
(or (ladybug/query-scalar-on-connection! conn statement) 0))
|
|
|
|
(defn- rel-table-names
|
|
"Relationship tables present in the open database.
|
|
|
|
Read from the catalog so a newly ported transform's edges are counted
|
|
without this namespace being told about it."
|
|
[conn]
|
|
(->> (ladybug/query-on-connection!
|
|
conn "CALL show_tables() WHERE type = 'REL' RETURN name;" :max-rows 1000)
|
|
:rows
|
|
(map first)))
|
|
|
|
(defn summarize-connection
|
|
"Return node/edge counts using an open Ladybug connection."
|
|
[conn]
|
|
{:nodes (into {}
|
|
(map (fn [table]
|
|
[table (count-on-connection
|
|
conn
|
|
(str "MATCH (n:" (nodes/match-label table) ") "
|
|
"RETURN count(n) AS " table "_c;"))])
|
|
(map :table nodes/node-types)))
|
|
:edges (into {}
|
|
(map (fn [rel]
|
|
[(keyword rel)
|
|
(count-on-connection
|
|
conn
|
|
(str "MATCH ()-[e:`" rel "`]->() RETURN count(e) AS c;"))]))
|
|
(rel-table-names conn))})
|
|
|
|
(defn summarize
|
|
"Return node/edge counts from the graph database."
|
|
[db-path]
|
|
(ladybug/with-connection! db-path summarize-connection))
|