X-Git-Url: http://mop.ddnsfree.com/gitweb/?a=blobdiff_plain;f=sql%2Fsql.d%2F075-users-network.sql;h=a371ec583bdce544cfe650240a9685b2532a44c0;hb=a277a83b5415d5abc56625fd56d8f043cd77062f;hp=9356b378e874cc42408288b72bab25111579468f;hpb=5cf7309d9937fba5b9b97c3bf0d7c6ca2db1e4df;p=brisk.git diff --git a/sql/sql.d/075-users-network.sql b/sql/sql.d/075-users-network.sql index 9356b37..a371ec5 100644 --- a/sql/sql.d/075-users-network.sql +++ b/sql/sql.d/075-users-network.sql @@ -8,8 +8,9 @@ CREATE TABLE #PFX#usersnet ( target integer REFERENCES #PFX#users (code) ON DELETE cascade ON UPDATE cascade, -- evaluated user friend integer, -- friendship level - skill integer, -- skill level - trust integer, -- auth + -- 1"black", 2"unknown", 3"test", 4"friend", 5"bff" + skill float, -- skill level + trust float, -- auth ctime timestamp DEFAULT now(), -- creation time mtime timestamp DEFAULT to_timestamp(0) -- modification time ); @@ -17,8 +18,47 @@ CREATE TABLE #PFX#usersnet ( DROP INDEX IF EXISTS #PFX#usersnet_owner_idx; DROP INDEX IF EXISTS #PFX#usersnet_target_idx; DROP INDEX IF EXISTS #PFX#usersnet_owner_target_idx; + 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); +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 + GROUP BY un.owner, ur.target; +DROP VIEW #PFX#usersnet_narrowskill; +CREATE VIEW #PFX#usersnet_narrowskill + AS SELECT un.owner AS owner, ur.target AS target, SUM(ur.skill * un.trust) / SUM(un.trust) AS skill, + COUNT(*) AS count, + SUM(CASE WHEN ur.friend = 1 THEN 1 ELSE 0 END) AS black -- count number of friend + -- blacklisting the target + 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 + GROUP BY un.owner, ur.target HAVING SUM(CASE WHEN ur.friend = 1 THEN 1 ELSE 0 END) = 0; +DROP VIEW #PFX#usersnet_party; +CREATE VIEW #PFX#usersnet_party + AS (SELECT ns.* FROM #PFX#usersnet_narrowskill AS ns + -- all except targets managed directly by the owner + WHERE target NOT IN (SELECT target FROM #PFX#usersnet WHERE owner = ns.owner) + UNION ALL + (SELECT owner, target, skill, 1 AS count, 0 AS black FROM #PFX#usersnet + WHERE friend > 2)) ORDER BY target;