forked from Mirrors/gomuks
hicli/database: don't store space depth
This commit is contained in:
parent
326b06c702
commit
2b206bb32f
3 changed files with 16 additions and 72 deletions
|
@ -16,19 +16,16 @@ import (
|
||||||
|
|
||||||
const (
|
const (
|
||||||
getAllSpaceChildren = `
|
getAllSpaceChildren = `
|
||||||
SELECT space_id, child_id, depth, child_event_rowid, "order", suggested, parent_event_rowid, canonical, parent_validated
|
SELECT space_id, child_id, child_event_rowid, "order", suggested, parent_event_rowid, canonical, parent_validated
|
||||||
FROM space_edge
|
FROM space_edge
|
||||||
WHERE (space_id = $1 OR $1 = '') AND depth IS NOT NULL AND (child_event_rowid IS NOT NULL OR parent_validated)
|
-- This check should be redundant thanks to parent_validated and validation before insert for children
|
||||||
ORDER BY depth, space_id, "order", child_id
|
--INNER JOIN room ON space_id = room.room_id AND room.room_type = 'm.space'
|
||||||
|
WHERE (space_id = $1 OR $1 = '') AND (child_event_rowid IS NOT NULL OR parent_validated)
|
||||||
|
ORDER BY space_id, "order", child_id
|
||||||
`
|
`
|
||||||
// language=sqlite - for some reason GoLand doesn't auto-detect SQL when using WITH RECURSIVE
|
getTopLevelSpaces = `
|
||||||
recalculateAllSpaceChildDepths = `
|
|
||||||
UPDATE space_edge SET depth = NULL;
|
|
||||||
WITH RECURSIVE
|
|
||||||
top_level_spaces AS (
|
|
||||||
SELECT space_id
|
SELECT space_id
|
||||||
FROM (SELECT DISTINCT(space_id) FROM space_edge) outeredge
|
FROM (SELECT DISTINCT(space_id) FROM space_edge) outeredge
|
||||||
INNER JOIN room ON outeredge.space_id = room.room_id AND room.room_type = 'm.space'
|
|
||||||
WHERE NOT EXISTS(
|
WHERE NOT EXISTS(
|
||||||
SELECT 1
|
SELECT 1
|
||||||
FROM space_edge inneredge
|
FROM space_edge inneredge
|
||||||
|
@ -36,23 +33,6 @@ const (
|
||||||
WHERE inneredge.child_id = outeredge.space_id
|
WHERE inneredge.child_id = outeredge.space_id
|
||||||
AND (inneredge.child_event_rowid IS NOT NULL OR inneredge.parent_validated)
|
AND (inneredge.child_event_rowid IS NOT NULL OR inneredge.parent_validated)
|
||||||
)
|
)
|
||||||
),
|
|
||||||
children AS (
|
|
||||||
SELECT space_id, child_id, 1 AS depth, space_id AS path
|
|
||||||
FROM space_edge
|
|
||||||
WHERE space_id IN top_level_spaces AND (child_event_rowid IS NOT NULL OR parent_validated)
|
|
||||||
UNION
|
|
||||||
SELECT se.space_id, se.child_id, c.depth+1, c.path || se.space_id
|
|
||||||
FROM space_edge se
|
|
||||||
INNER JOIN children c ON se.space_id = c.child_id
|
|
||||||
WHERE instr(c.path, se.space_id) = 0
|
|
||||||
AND c.depth < 10
|
|
||||||
AND (child_event_rowid IS NOT NULL OR parent_validated)
|
|
||||||
)
|
|
||||||
UPDATE space_edge
|
|
||||||
SET depth = c.depth
|
|
||||||
FROM children c
|
|
||||||
WHERE space_edge.space_id = c.space_id AND space_edge.child_id = c.child_id;
|
|
||||||
`
|
`
|
||||||
revalidateAllParents = `
|
revalidateAllParents = `
|
||||||
UPDATE space_edge
|
UPDATE space_edge
|
||||||
|
@ -202,10 +182,6 @@ func (seq *SpaceEdgeQuery) RevalidateSpecificParentValidity(ctx context.Context,
|
||||||
return seq.Exec(ctx, revalidateSpecificParentQuery, spaceID, childID)
|
return seq.Exec(ctx, revalidateSpecificParentQuery, spaceID, childID)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (seq *SpaceEdgeQuery) RecalculateAllChildDepths(ctx context.Context) error {
|
|
||||||
return seq.Exec(ctx, recalculateAllSpaceChildDepths)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (seq *SpaceEdgeQuery) GetAll(ctx context.Context, spaceID id.RoomID) (map[id.RoomID][]*SpaceEdge, error) {
|
func (seq *SpaceEdgeQuery) GetAll(ctx context.Context, spaceID id.RoomID) (map[id.RoomID][]*SpaceEdge, error) {
|
||||||
edges := make(map[id.RoomID][]*SpaceEdge)
|
edges := make(map[id.RoomID][]*SpaceEdge)
|
||||||
err := seq.QueryManyIter(ctx, getAllSpaceChildren, spaceID).Iter(func(edge *SpaceEdge) (bool, error) {
|
err := seq.QueryManyIter(ctx, getAllSpaceChildren, spaceID).Iter(func(edge *SpaceEdge) (bool, error) {
|
||||||
|
@ -223,7 +199,6 @@ func (seq *SpaceEdgeQuery) GetAll(ctx context.Context, spaceID id.RoomID) (map[i
|
||||||
type SpaceEdge struct {
|
type SpaceEdge struct {
|
||||||
SpaceID id.RoomID `json:"space_id,omitempty"`
|
SpaceID id.RoomID `json:"space_id,omitempty"`
|
||||||
ChildID id.RoomID `json:"child_id"`
|
ChildID id.RoomID `json:"child_id"`
|
||||||
Depth int `json:"-"`
|
|
||||||
|
|
||||||
ChildEventRowID EventRowID `json:"child_event_rowid,omitempty"`
|
ChildEventRowID EventRowID `json:"child_event_rowid,omitempty"`
|
||||||
Order string `json:"order,omitempty"`
|
Order string `json:"order,omitempty"`
|
||||||
|
@ -237,7 +212,7 @@ type SpaceEdge struct {
|
||||||
func (se *SpaceEdge) Scan(row dbutil.Scannable) (*SpaceEdge, error) {
|
func (se *SpaceEdge) Scan(row dbutil.Scannable) (*SpaceEdge, error) {
|
||||||
var childRowID, parentRowID sql.NullInt64
|
var childRowID, parentRowID sql.NullInt64
|
||||||
err := row.Scan(
|
err := row.Scan(
|
||||||
&se.SpaceID, &se.ChildID, &se.Depth,
|
&se.SpaceID, &se.ChildID,
|
||||||
&childRowID, &se.Order, &se.Suggested,
|
&childRowID, &se.Order, &se.Suggested,
|
||||||
&parentRowID, &se.Canonical, &se.ParentValidated,
|
&parentRowID, &se.Canonical, &se.ParentValidated,
|
||||||
)
|
)
|
||||||
|
|
|
@ -283,7 +283,6 @@ CREATE TABLE receipt (
|
||||||
CREATE TABLE space_edge (
|
CREATE TABLE space_edge (
|
||||||
space_id TEXT NOT NULL,
|
space_id TEXT NOT NULL,
|
||||||
child_id TEXT NOT NULL,
|
child_id TEXT NOT NULL,
|
||||||
depth INTEGER,
|
|
||||||
|
|
||||||
-- m.space.child fields
|
-- m.space.child fields
|
||||||
child_event_rowid INTEGER,
|
child_event_rowid INTEGER,
|
||||||
|
|
|
@ -7,7 +7,6 @@ CREATE INDEX room_type_idx ON room (room_type);
|
||||||
CREATE TABLE space_edge (
|
CREATE TABLE space_edge (
|
||||||
space_id TEXT NOT NULL,
|
space_id TEXT NOT NULL,
|
||||||
child_id TEXT NOT NULL,
|
child_id TEXT NOT NULL,
|
||||||
depth INTEGER,
|
|
||||||
|
|
||||||
-- m.space.child fields
|
-- m.space.child fields
|
||||||
child_event_rowid INTEGER,
|
child_event_rowid INTEGER,
|
||||||
|
@ -82,32 +81,3 @@ SET parent_validated=(SELECT EXISTS(
|
||||||
)
|
)
|
||||||
))
|
))
|
||||||
WHERE parent_event_rowid IS NOT NULL;
|
WHERE parent_event_rowid IS NOT NULL;
|
||||||
|
|
||||||
WITH RECURSIVE
|
|
||||||
top_level_spaces AS (
|
|
||||||
SELECT space_id
|
|
||||||
FROM (SELECT DISTINCT(space_id) FROM space_edge) outeredge
|
|
||||||
WHERE NOT EXISTS(
|
|
||||||
SELECT 1
|
|
||||||
FROM space_edge inneredge
|
|
||||||
INNER JOIN room ON inneredge.space_id = room.room_id
|
|
||||||
WHERE inneredge.child_id=outeredge.space_id
|
|
||||||
AND (inneredge.child_event_rowid IS NOT NULL OR inneredge.parent_validated)
|
|
||||||
)
|
|
||||||
),
|
|
||||||
children AS (
|
|
||||||
SELECT space_id, child_id, 1 AS depth, space_id AS path
|
|
||||||
FROM space_edge
|
|
||||||
WHERE space_id IN top_level_spaces AND (child_event_rowid IS NOT NULL OR parent_validated)
|
|
||||||
UNION
|
|
||||||
SELECT se.space_id, se.child_id, c.depth+1, c.path || se.space_id
|
|
||||||
FROM space_edge se
|
|
||||||
INNER JOIN children c ON se.space_id=c.child_id
|
|
||||||
WHERE instr(c.path, se.space_id)=0
|
|
||||||
AND c.depth < 10
|
|
||||||
AND (child_event_rowid IS NOT NULL OR parent_validated)
|
|
||||||
)
|
|
||||||
UPDATE space_edge
|
|
||||||
SET depth = c.depth
|
|
||||||
FROM children c
|
|
||||||
WHERE space_edge.space_id = c.space_id AND space_edge.child_id = c.child_id;
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue