fix(api): sort graph nodes by degree instead of alphabetically
The unrooted graph endpoint caps at 500 entities with ORDER BY e.slug, which fills the cap with exec:* rows and excludes every host/lxc/service/vm entity. Since edges require both endpoints in the node set (ANY/ANY), 99.9% of edges were dropped — 500 nodes but only 1 edge survived. Fix: select the 500 most-connected entities (by relationship count descending) so the topology is preserved. Result: 500 nodes, 900 edges across all relationship types.
This commit is contained in:
@@ -304,10 +304,24 @@ func (s *Server) GetGraph(ctx context.Context, req gen.GetGraphRequestObject) (g
|
|||||||
LEFT JOIN entity_status st ON st.entity_id = e.id
|
LEFT JOIN entity_status st ON st.entity_id = e.id
|
||||||
ORDER BY e.slug`, rootID, depth, req.Params.RelType)
|
ORDER BY e.slug`, rootID, depth, req.Params.RelType)
|
||||||
} else {
|
} else {
|
||||||
|
// Whole-graph view: pick the most-connected entities first so the
|
||||||
|
// graph shows actual topology, not just whatever sorts first
|
||||||
|
// alphabetically. Without this the cap fills with exec:* rows and
|
||||||
|
// drops every host/lxc/service/vm — and every edge those entities
|
||||||
|
// connect — because edges require both endpoints in the node set.
|
||||||
nodes, err = s.queryEntities(ctx, `
|
nodes, err = s.queryEntities(ctx, `
|
||||||
SELECT `+entityCols+` FROM entities e
|
SELECT `+entityCols+`
|
||||||
|
FROM entities e
|
||||||
LEFT JOIN entity_status st ON st.entity_id = e.id
|
LEFT JOIN entity_status st ON st.entity_id = e.id
|
||||||
ORDER BY e.slug LIMIT $1`,
|
WHERE e.id IN (
|
||||||
|
SELECT e2.id FROM entities e2
|
||||||
|
LEFT JOIN relationships r ON r.valid_to IS NULL
|
||||||
|
AND (r.source_id = e2.id OR r.target_id = e2.id)
|
||||||
|
GROUP BY e2.id
|
||||||
|
ORDER BY count(r.type) DESC, e2.slug
|
||||||
|
LIMIT $1
|
||||||
|
)
|
||||||
|
ORDER BY e.slug`,
|
||||||
graphNodeCap+1)
|
graphNodeCap+1)
|
||||||
if err == nil && len(nodes) > graphNodeCap {
|
if err == nil && len(nodes) > graphNodeCap {
|
||||||
nodes = nodes[:graphNodeCap]
|
nodes = nodes[:graphNodeCap]
|
||||||
|
|||||||
Reference in New Issue
Block a user