From fca3d110e2bbf862313944dd55bb480bb03b1259 Mon Sep 17 00:00:00 2001
From: Bartek Wrona <wrona@syncad.com>
Date: Wed, 22 Jul 2020 01:37:49 +0200
Subject: [PATCH] Fixed setting children count for each posts (at the end of
 initial sync)

---
 hive/db/db_state.py |  6 ++++++
 hive/db/schema.py   | 38 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 44 insertions(+)

diff --git a/hive/db/db_state.py b/hive/db/db_state.py
index 6fde19f50..aa721e314 100644
--- a/hive/db/db_state.py
+++ b/hive/db/db_state.py
@@ -174,6 +174,12 @@ class DbState:
 
             index.create(engine)
 
+        # Update count of all child posts (what was hold during initial sync)
+        sql = """
+              select update_hive_posts_children_count()
+              """
+        row = DbState.db().query_row(sql)
+
         # TODO: #111
         #for key in cls._all_foreign_keys():
         #    log.info("Create fk %s", key.name)
diff --git a/hive/db/schema.py b/hive/db/schema.py
index 0611c4c13..cad12ca99 100644
--- a/hive/db/schema.py
+++ b/hive/db/schema.py
@@ -650,6 +650,44 @@ def setup(db):
           """
     db.query_no_return(sql)
 
+    sql = """
+          DROP FUNCTION if exists update_hive_posts_children_count()
+          ;
+          CREATE OR REPLACE FUNCTION update_hive_posts_children_count()
+          RETURNS VOID
+          LANGUAGE plpgsql
+          AS
+          $function$
+          BEGIN
+
+          update hive_posts uhp
+          set children = data_source.childrencount
+          from
+          (
+          WITH RECURSIVE ChildrenCTE AS (
+            SELECT  ID as RootId, ID
+            FROM    hive_posts hp
+            where hp.parent_id != 0
+            UNION ALL
+            SELECT  cte.RootID, d.ID
+            FROM    ChildrenCTE cte
+                    INNER JOIN hive_posts d ON d.parent_id = cte.ID
+          )
+          SELECT  d.ID, d.parent_id, cnt.ChildrenCount
+          FROM    hive_posts d 
+                  INNER JOIN (
+                    SELECT  RootID as ID, COUNT(*) - 1 as ChildrenCount
+                    FROM    ChildrenCTE
+                    GROUP BY RootID
+                  ) cnt ON cnt.ID = d.ID
+          ) as data_source
+          where uhp.id = data_source.id
+          ;
+          END
+          $function$
+          """
+    db.query_no_return(sql)
+
 def reset_autovac(db):
     """Initializes/resets per-table autovacuum/autoanalyze params.
 
-- 
GitLab