rewrite wrong implementation of party view
[brisk.git] / sql / sql.d / 075-users-network.sql
index 8d4fca4..c725938 100644 (file)
@@ -23,21 +23,58 @@ CREATE INDEX #PFX#usersnet_owner_idx ON #PFX#usersnet (owner);
 CREATE INDEX #PFX#usersnet_target_idx ON #PFX#usersnet (target);
 CREATE UNIQUE INDEX #PFX#usersnet_owner_target_idx ON #PFX#usersnet (owner, target);
 
+DROP VIEW #PFX#usersnet_widefriend;
+CREATE VIEW #PFX#usersnet_widefriend
+    AS SELECT un.owner, ur.target, ur.friend, count(*) as count
+        FROM #PFX#usersnet AS un, #PFX#usersnet AS ur
+        WHERE un.target = ur.owner AND un.friend >= 4  -- 'un' is, at least, our friend
+        GROUP BY un.owner, ur.target, ur.friend;
+
+DROP VIEW #PFX#usersnet_narrowfriend;
+CREATE VIEW #PFX#usersnet_narrowfriend
+    AS SELECT un.owner, ur.target, ur.friend, count(*) as count
+        FROM #PFX#usersnet AS un, #PFX#usersnet AS ur
+        WHERE un.target = ur.owner AND un.friend >= 5  -- 'un' is, at least, our friend
+        GROUP BY un.owner, ur.target, ur.friend;
+
 DROP VIEW #PFX#usersnet_wideskill;
 CREATE VIEW #PFX#usersnet_wideskill
     AS SELECT un.owner, ur.target, SUM(ur.skill * un.trust) / SUM(un.trust) as skill, count(*) as count
         FROM #PFX#usersnet AS un, #PFX#usersnet AS ur
-        WHERE un.target = ur.owner AND un.friend >= 4  -- 'un' is, at least, our friend
+        WHERE un.target = ur.owner AND un.friend >= 4   -- 'un' is, at least, our friend
+            AND ur.friend > 2
         GROUP BY un.owner, ur.target;
 
 DROP VIEW #PFX#usersnet_narrowskill;
 CREATE VIEW #PFX#usersnet_narrowskill
-    AS SELECT un.owner, ur.target, SUM(ur.skill * un.trust) / SUM(un.trust) as skill, count(*) as count
-        FROM #PFX#usersnet AS un, #PFX#usersnet AS ur      -- 'un' primary records, 'ur' inheriting records
-        WHERE un.target = ur.owner AND un.friend = 5   -- 'un' is, at least, our friend
-        GROUP BY un.owner, ur.target;
+    AS SELECT
+        un.owner AS owner
+        , ur.target AS target
+        , SUM(ur.skill * un.trust) / SUM(un.trust) AS skill
+        , COUNT(*) AS count
+        FROM #PFX#usersnet AS un, #PFX#usersnet as ur
+        WHERE un.target = ur.owner AND un.friend = 5    -- 'ur' owner must be bbf of un.owner
+            AND ur.friend > 2
+    GROUP BY un.owner, ur.target;
+
+DROP VIEW #PFX#usersnet_narrowblack;
+CREATE VIEW #PFX#usersnet_narrowblack
+    AS SELECT DISTINCT un.owner AS owner, ur.target AS target, 1 AS black_cnt
+        FROM #PFX#usersnet AS un, #PFX#usersnet as ur
+        WHERE un.target = ur.owner
+            AND un.friend = 5              -- ur owner must be bbf of un.owner
+            AND ur.friend = 1;             -- ur must be blacked
 
--- DROP VIEW #PFX#usersnet_allfriends;
--- CREATE VIEW #PFX#usersnet_allfriends
---     AS SELECT un.owner, ur.target FROM #PFX#usersnet AS un, #PFX#usersnet AS ur
---     WHERE 
+DROP VIEW #PFX#usersnet_party;
+CREATE VIEW #PFX#usersnet_party
+    AS (SELECT ns.*, nb.black_cnt FROM #PFX#usersnet_narrowskill AS ns
+        LEFT JOIN #PFX#usersnet_narrowblack AS nb
+            USING (owner, target)
+            -- all except targets managed directly by the owner
+            WHERE black_cnt is null
+                AND target NOT IN (SELECT target FROM #PFX#usersnet AS du WHERE du.owner = ns.owner)
+        UNION ALL
+            (SELECT owner, target, skill, 1 AS count, null AS black_cnt
+                FROM #PFX#usersnet
+                WHERE friend > 2))
+        ORDER BY target;