X-Git-Url: http://mop.ddnsfree.com/gitweb/?a=blobdiff_plain;f=sql%2Fsql.d%2F075-users-network.sql;h=c725938ce6a58c1745286f909d53dfb53b1ea038;hb=c50bd1cf600bc07608e6dfdf4f7c854ee13aee29;hp=d6c2f61677c656bd8c09310e8175f67c0b5d124b;hpb=330d75c856cac51f3136b1ab1791c8ef8c564ac0;p=brisk.git diff --git a/sql/sql.d/075-users-network.sql b/sql/sql.d/075-users-network.sql index d6c2f61..c725938 100644 --- a/sql/sql.d/075-users-network.sql +++ b/sql/sql.d/075-users-network.sql @@ -5,8 +5,6 @@ DROP TABLE IF EXISTS #PFX#usersnet; CREATE TABLE #PFX#usersnet ( owner integer REFERENCES #PFX#users (code) ON DELETE cascade ON UPDATE cascade, -- network owner - inher integer NULL REFERENCES #PFX#users (code) - ON DELETE cascade ON UPDATE cascade, -- inheriting user target integer REFERENCES #PFX#users (code) ON DELETE cascade ON UPDATE cascade, -- evaluated user friend integer, -- friendship level @@ -20,28 +18,63 @@ 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; -DROP INDEX IF EXISTS #PFX#usersnet_owner_inher_idx; -DROP INDEX IF EXISTS #PFX#usersnet_owner_target_inher_idx; CREATE INDEX #PFX#usersnet_owner_idx ON #PFX#usersnet (owner); CREATE INDEX #PFX#usersnet_target_idx ON #PFX#usersnet (target); -CREATE INDEX #PFX#usersnet_owner_target_idx ON #PFX#usersnet (owner, target); -CREATE INDEX #PFX#usersnet_owner_inher_idx ON #PFX#usersnet (owner,inher); -CREATE UNIQUE INDEX #PFX#usersnet_owner_target_inher_idx ON #PFX#usersnet (owner, target, inher); +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 bsk_usersnet AS un, bsk_usersnet AS ur - WHERE un.owner = 10101 -- owner is xxx - AND un.target = ur.owner AND un.friend >= 4 -- 'un' is, at least, our friend + FROM #PFX#usersnet AS un, #PFX#usersnet AS ur + 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 bsk_usersnet AS un, bsk_usersnet AS ur -- 'un' primary records, 'ur' inheriting records - WHERE un.owner = 10101 -- owner is xxx - AND 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_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;