Advertisement
PJH

sql_tdwtf

PJH
Dec 17th, 2014
218
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 21.25 KB | None | 0 0
  1. #!/bin/bash
  2.  
  3. DATABASE=${DATABASE:-discourse}
  4. LIMIT=${LIMIT:-25}
  5. NAME=${NAME:-%}
  6.  
  7. function sql(){
  8.     psql -d $DATABASE -e -c "$@
  9. " | sed 1d
  10.     return
  11. }
  12.  
  13. function restore(){ # restore a backup from /tmp
  14.     previous_backup=""
  15.     most_recent_backup=$(basename $(ls /tmp/*-20??-??-??-??????.tar.gz -rt | tail -n1))
  16.     if [ -e ~/.${DATABASE}_backup ]; then
  17.         previous_backup=$(basename $(head -n1 ~/.${DATABASE}_backup))
  18.     fi
  19.     if [ "$most_recent_backup" == "$previous_backup" ]; then
  20.         echo "Already using the most recent backup available: $previous_backup"
  21.         exit 0
  22.     fi
  23.     backup_date=$(echo "$most_recent_backup" | sed -e 's/^.*\(20[0-9][0-9].*\)-.......tar.gz/\1/g')
  24.  
  25.     echo "$most_recent_backup - restore? [Y/n]"
  26.     read yn
  27.     if [[ $yn == "Y" || $yn == "y" || $yn = "" ]]; then
  28.         echo "Restoring..."
  29.     else
  30.         exit 0
  31.     fi
  32.    
  33.     mkdir -p ~/restores/$backup_date
  34.     echo "Extracting $most_recent_backup"
  35.     tar -C ~/restores/$backup_date -xf /tmp/$most_recent_backup dump.sql
  36.     echo "Restoring..."
  37.     psql -d $DATABASE -c "DROP SCHEMA backup CASCADE"
  38.     psql $DATABASE < ~/restores/$backup_date/dump.sql
  39.     psql -d $DATABASE -c "ALTER SCHEMA public RENAME TO backup;"
  40.     psql -d $DATABASE -c "ALTER SCHEMA restore RENAME TO public"
  41.  
  42.     echo "$most_recent_backup" > ~/.${DATABASE}_backup
  43.  
  44. }
  45.  
  46.  
  47. function backup_date(){ # When the backup was taken
  48.     sql "SELECT created_at
  49. FROM post_actions
  50. ORDER BY created_at DESC
  51. LIMIT 1" | grep "201[45]-"
  52. }
  53.  
  54. function most_liked_posts_x_1000(){ # Most liked posts outside of /t/1000
  55.     sql "
  56. SELECT row_number() OVER (ORDER BY like_count DESC) n,
  57.   badge_posts.topic_id topic,
  58.   badge_posts.post_number post,
  59.   badge_posts.like_count likes,
  60.   users.username
  61. FROM badge_posts, users
  62. WHERE topic_id != 1000 AND
  63.   badge_posts.user_id = users.id
  64. ORDER BY like_count DESC
  65. LIMIT $LIMIT"
  66. }
  67.  
  68. function most_liked_topics(){ # Most liked topic starters
  69.     sql "
  70. SELECT row_number() OVER (ORDER BY bp.like_count DESC) n,
  71.   bp.topic_id topic,
  72.   bp.post_number post,
  73.   bp.like_count likes,
  74.   u.username,
  75.   t.title
  76. FROM badge_posts bp
  77. JOIN topics t on t.id = bp.topic_id
  78. JOIN users u on u.id = bp.user_id
  79. WHERE bp.post_number = 1
  80. ORDER BY bp.like_count DESC
  81. LIMIT $LIMIT"
  82. }
  83.  
  84.  
  85.  
  86. function most_liked_users_x_1000(){ # Most liked users outside of /t/1000
  87.     sql "
  88. SELECT row_number() OVER (ORDER BY SUM(badge_posts.like_count) DESC) n,
  89.   SUM(badge_posts.like_count) likes,
  90.   users.username
  91. FROM badge_posts, users
  92. WHERE topic_id != 1000 AND
  93.   badge_posts.user_id = users.id
  94. GROUP BY users.username
  95. ORDER BY SUM(badge_posts.like_count) DESC
  96. LIMIT $LIMIT"
  97. }
  98.  
  99. function total_likes_x_1000(){ # Total likes excluding /t/1000
  100.     sql "
  101. SELECT row_number() OVER (ORDER BY SUM(badge_posts.like_count) DESC) n,
  102.   SUM(badge_posts.like_count) likes,
  103.   users.username
  104. FROM badge_posts, users
  105. WHERE topic_id != 1000 AND
  106.   badge_posts.user_id = users.id
  107. GROUP BY users.username
  108. ORDER BY SUM(badge_posts.like_count) DESC
  109. LIMIT $LIMIT"
  110. }
  111.  
  112.  
  113. function posts_days(){ # Posts read and days visited
  114.     sql "
  115. SELECT row_number() OVER (ORDER BY sum(posts_read) DESC) as n,
  116.   sum(posts_read) as \"Posts read\",
  117.   count(*) as \"Days visited\",
  118.   u.username as \"User id\"
  119. FROM user_visits v
  120. JOIN users u on u.id = v.user_id
  121. GROUP BY u.username
  122. ORDER BY sum(posts_read) DESC
  123. LIMIT $LIMIT"
  124. }
  125.  
  126.  
  127. function days(){ # Days visited
  128.     sql "
  129. SELECT count(*) as \"Days visited\",
  130.   u.username as \"User id\"
  131. FROM user_visits v
  132. JOIN users u on u.id = v.user_id
  133. GROUP BY u.username
  134. ORDER BY count(*) DESC
  135. LIMIT $LIMIT"
  136. }
  137.  
  138.  
  139. function posts_read(){ # Number of publicly visible (?)posts read
  140.     sql "
  141. SELECT COUNT(1), u.username
  142. FROM badge_posts bp
  143. JOIN post_timings pt ON
  144.   pt.topic_id = bp.topic_id AND
  145.   pt.post_number = bp.post_number
  146. JOIN users u ON u.id = pt.user_id
  147. GROUP BY u.username
  148. ORDER BY COUNT(*) DESC
  149. LIMIT $LIMIT"
  150. }
  151.  
  152. function posts_read2(){ # Number of publicly visible(?) posts read
  153.     sql "
  154. SELECT count(1)
  155. FROM posts p
  156. JOIN post_timings pt ON
  157.   pt.topic_id = p.topic_id AND
  158.   pt.post_number = p.post_number
  159. LIMIT $LIMIT"
  160. }
  161.  
  162. function posts_read3(){ # Number of publicly visible(?) posts read
  163.     sql "
  164. SELECT us.posts_read_count, u.username
  165. FROM user_stats us
  166. JOIN users u on u.id=us.user_id
  167. ORDER BY us.posts_read_count DESC
  168. LIMIT $LIMIT"
  169. }
  170.  
  171. function posts_read4(){ # @Matches variant
  172.     sql "
  173. SELECT count(1)
  174. FROM
  175. (select p.topic_id, p.post_number from posts as p inner join post_timings as pt on pt.topic_id = p.topic_id and pt.post_number = p.post_number) as a
  176. LIMIT $LIMIT"
  177. }
  178.  
  179. function likes_liked(){ # Who's liked who the most
  180.     sql "
  181. SELECT l.username Liker, count(*), r.username Liked
  182. FROM post_actions pa
  183. INNER JOIN users l ON l.id=pa.user_id
  184. INNER JOIN posts p on p.id=pa.post_id
  185. INNER JOIN users r on r.id=p.user_id
  186. WHERE pa.post_action_type_id=2 AND
  187.   p.topic_id != 1000
  188. GROUP BY Liker, Liked
  189. ORDER BY count(*) DESC
  190. LIMIT $LIMIT"
  191. }
  192.  
  193. function likes_per_day(){
  194.     sql "
  195. WITH p1000 AS (
  196.     SELECT date_trunc('day',pa.created_at), COUNT(*)
  197.     FROM posts p
  198.     JOIN post_actions pa on p.id=pa.post_id
  199.     WHERE pa.post_action_type_id=2 AND
  200.         p.topic_id = 1000
  201.     GROUP BY date_trunc('day',pa.created_at)
  202. ),
  203. xp1000 AS (
  204.     SELECT date_trunc('day',pa.created_at), COUNT(*)
  205.     FROM posts p
  206.     JOIN post_actions pa on p.id=pa.post_id
  207.     WHERE pa.post_action_type_id=2 AND
  208.         p.topic_id != 1000
  209.     GROUP BY date_trunc('day',pa.created_at)
  210. )
  211. SELECT xp1000.date_trunc, p1000.count p1000, xp1000.count xp1000
  212. FROM p1000
  213. FULL JOIN xp1000 on xp1000.date_trunc = p1000.date_trunc"
  214. }
  215.  
  216. function post_actions(){ # List post action types
  217.     sql "
  218. SELECT id, name_key as Action, is_flag as flag
  219. FROM post_action_types
  220. ORDER BY id asc"
  221. }
  222.  
  223. function visits_100(){ # Number of visits in the past 100 days
  224.     sql "
  225. SELECT u.username, count(u.username)
  226. FROM user_visits uv
  227. INNER JOIN users u ON u.id=uv.user_id
  228. WHERE date_trunc('day',uv.visited_at) >= date_trunc('day', now() - interval '99 day')
  229. GROUP BY u.username
  230. ORDER BY count(u.username) DESC
  231. LIMIT $LIMIT"
  232. }
  233.  
  234. function visits_100_count(){ # Number of people with X vists in the last 100 days
  235.     sql "
  236. SELECT count(out_of_100), out_of_100 FROM (
  237.     SELECT u.username, count(u.username) out_of_100
  238.     FROM user_visits uv
  239.     INNER JOIN users u ON u.id=uv.user_id
  240.     WHERE date_trunc('day',uv.visited_at) >= date_trunc('day', now() - interval '99 day')
  241.     GROUP BY u.username
  242.     ORDER BY count(u.username) DESC
  243.     ) x
  244. GROUP BY out_of_100
  245. ORDER BY out_of_100 DESC
  246. LIMIT $LIMIT"
  247. }
  248.  
  249.  
  250. function visits_100_named(){  # Number of visits in the past 100 days given a NAME
  251.     sql "
  252. SELECT u.username, count(u.username)
  253. FROM user_visits uv
  254. INNER JOIN users u ON u.id=uv.user_id
  255. WHERE date_trunc('day',uv.visited_at) >= date_trunc('day', now() - interval '99 day') AND
  256.     u.username = '$NAME'
  257. GROUP BY u.username"
  258. }
  259.  
  260. function boomzilla(){ # xx
  261.     sql "
  262. with consecutive as (
  263.  select
  264.    v1.user_id,
  265.    v1.visited_at as start,
  266.    v2.visited_at as end,
  267.    count( v3.visited_at ) days
  268.  from user_visits v1
  269.  join user_visits v2 on (v2.user_id = v1.user_id)
  270.    and (v1.visited_at < v2.visited_at)
  271.  join user_visits v3 on (v3.user_id = v1.user_id)
  272.    and (v3.visited_at between v1.visited_at and v2.visited_at)
  273.  group by v1.user_id, v1.visited_at, v2.visited_at
  274.  having count( v3.visited_at ) = (v2.visited_at - v1.visited_at + 1)
  275.  )
  276. select user_id, max(days)
  277. from consecutive
  278. group by user_id"
  279. }
  280.  
  281. function attendance(){ # Record of continuous days of attendance
  282.     sql "
  283. WITH StartingPoints AS (
  284.   SELECT user_id, visited_at, ROW_NUMBER() OVER(ORDER BY user_id, visited_at) AS rownum
  285.   FROM user_visits AS A
  286.   WHERE NOT EXISTS (
  287.      SELECT *
  288.      FROM user_visits AS B
  289.      WHERE B.visited_at = A.visited_at - 1 AND
  290.      B.user_id = A.user_id
  291.   )
  292. ),
  293. EndingPoints AS (
  294.   SELECT user_id, visited_at, ROW_NUMBER() OVER(ORDER BY user_id, visited_at) AS rownum
  295.   FROM user_visits AS A
  296.   WHERE NOT EXISTS (
  297.      SELECT *
  298.      FROM user_visits AS B
  299.      WHERE B.visited_at = A.visited_at + 1 AND
  300.      B.user_id = A.user_id
  301.   )
  302. )
  303. SELECT u.username, S.visited_at AS start_range, E.visited_at AS end_range, (E.visited_at - S.visited_at +1) AS Days
  304. FROM StartingPoints AS S
  305. JOIN EndingPoints AS E ON E.rownum = S.rownum
  306. JOIN users u ON u.id=S.user_id AND
  307. u.username like '$NAME'"
  308. }
  309.  
  310. function max_attendance(){ # Most continuous days of attendance
  311.     sql "
  312. SELECT username, user_id, current_timestamp granted_at, max(days) from (
  313.     WITH StartingPoints AS (
  314.     SELECT user_id, visited_at, ROW_NUMBER() OVER(ORDER BY user_id, visited_at) AS rownum
  315.     FROM user_visits AS A
  316.     WHERE NOT EXISTS (
  317.         SELECT *
  318.         FROM user_visits AS B
  319.         WHERE B.visited_at = A.visited_at - 1 AND
  320.         B.user_id = A.user_id
  321.     )
  322.     ),
  323.     EndingPoints AS (
  324.     SELECT user_id, visited_at, ROW_NUMBER() OVER(ORDER BY user_id, visited_at) AS rownum
  325.     FROM user_visits AS A
  326.     WHERE NOT EXISTS (
  327.         SELECT *
  328.         FROM user_visits AS B
  329.         WHERE B.visited_at = A.visited_at + 1 AND
  330.         B.user_id = A.user_id
  331.     )
  332.     )
  333.     SELECT u.username, S.user_id AS user_id, S.visited_at AS start_range, E.visited_at AS end_range, (E.visited_at - S.visited_at +1) AS Days
  334.     FROM StartingPoints AS S
  335.     JOIN EndingPoints AS E ON E.rownum = S.rownum
  336.     JOIN users u ON u.id=S.user_id
  337. ) x
  338. GROUP BY x.username, x.user_id
  339. HAVING max(days)>=100"
  340. }
  341.  
  342. function 2n_posts(){ # How many eligible posts have been made
  343.     sql "
  344. WITH exclusions AS ( /* Which categories to exclude from counters */
  345.        SELECT user_id, id, topic_id, post_number
  346.        FROM posts
  347.        WHERE raw LIKE '%c09fa970-5a9a-11e4-8ed6-0800200c9a66%' AND
  348.        user_id IN  (
  349.                SELECT gu.user_id
  350.                FROM group_users gu
  351.                WHERE group_id IN(
  352.                        SELECT g.id
  353.                        FROM groups g
  354.                        WHERE g.name IN ('admins')
  355.                )
  356.        )
  357. )
  358. SELECT u.username, count(*)
  359. FROM badge_posts  bp
  360. JOIN users u on u.id=bp.user_id AND u.username LIKE '$NAME'
  361. WHERE topic_id NOT IN ( /* Topics with less than 10 posts */
  362.        SELECT topic_id
  363.        FROM badge_posts
  364.        GROUP BY topic_id
  365.        HAVING count(topic_id) < 10
  366. ) AND topic_id NOT IN ( /* Excluded topics */
  367.        SELECT topic_id
  368.        FROM exclusions
  369. )
  370. GROUP BY u.username
  371. ORDER BY count(*) DESC
  372. LIMIT $LIMIT"
  373. }
  374.  
  375. function percent_31() { # 31% query
  376.     sql "
  377. SELECT u.username, user_id, 0 post_id, current_timestamp granted_at, count(user_id)
  378. FROM user_visits uv
  379. JOIN users u ON u.id = uv.user_id
  380. WHERE date_trunc('day',uv.visited_at) >=
  381.     date_trunc('day', now() - interval '31 day')
  382. GROUP BY user_id, u.username
  383. HAVING count(user_id) >= 31
  384. "
  385. }
  386.  
  387. function percent_100() { # 100% query
  388.     sql "
  389. SELECT u.username, user_id, 0 post_id, current_timestamp granted_at, count(user_id)
  390. FROM user_visits uv
  391. JOIN users u ON u.id = uv.user_id
  392. WHERE date_trunc('day',uv.visited_at) >=
  393.     date_trunc('day', now() - interval '100 day')
  394. GROUP BY user_id, u.username
  395. HAVING count(user_id) >= 100
  396. "
  397. }
  398.  
  399. function top5(){ # Top 5% posters in the last month
  400.     sql "
  401. WITH LastMonth AS (
  402.    SELECT row_number() OVER (ORDER BY count(*) DESC, bp.user_id), u.username, bp.user_id, count(*)
  403.    FROM badge_posts bp
  404.    JOIN users u on u.id=bp.user_id
  405.    WHERE topic_id NOT IN (
  406.       SELECT topic_id FROM badge_posts GROUP BY topic_id HAVING count(topic_id) <4
  407.    ) AND topic_id NOT IN (
  408.       1000, 1673, 3125
  409.    ) AND bp.created_at > CURRENT_DATE - INTERVAL '1 month'
  410.    GROUP BY u.username, bp.user_id
  411.    HAVING count(*) > 1
  412.    ORDER BY count(*) DESC, bp.user_id
  413. ),
  414. TotalUsers AS (
  415.    SELECT max(row_number) from LastMonth
  416. )
  417. SELECT username, user_id, row_number, count, CURRENT_DATE granted_at
  418. FROM LastMonth, TotalUsers
  419. WHERE row_number < TotalUsers.max *.05"
  420. }
  421.  
  422. function month_posts_old(){ # Post counts per user over last month
  423.     sql "
  424. WITH LastMonth AS (
  425.    SELECT row_number() OVER (ORDER BY count(*) DESC, bp.user_id), u.username, bp.user_id, count(*)
  426.    FROM badge_posts bp
  427.    JOIN users u on u.id=bp.user_id
  428.    WHERE topic_id NOT IN (
  429.       SELECT topic_id FROM badge_posts GROUP BY topic_id HAVING count(topic_id) <4
  430.    ) AND topic_id NOT IN (
  431.       1000, 1673, 3125
  432.    ) AND bp.created_at > CURRENT_DATE - INTERVAL '1 month'
  433.    GROUP BY u.username, bp.user_id
  434.    ORDER BY count(*) DESC, bp.user_id
  435. ),
  436. TotalUsers AS (
  437.    SELECT max(row_number) from LastMonth
  438. )
  439. SELECT row_number, u.username, count
  440. FROM LastMonth, TotalUsers
  441. LIMIT $LIMIT"
  442. }
  443.  
  444. function month_posts(){ # post counts over last month
  445.     sql "
  446. WITH exclusions AS ( /* Which categories to exclude from counters */
  447.     SELECT user_id, id, topic_id, post_number
  448.     FROM posts
  449.     WHERE raw LIKE '%c09fa970-5a9a-11e4-8ed6-0800200c9a66%' AND
  450.     user_id IN  (
  451.         SELECT gu.user_id
  452.         FROM group_users gu
  453.         WHERE group_id IN(
  454.             SELECT g.id
  455.             FROM groups g
  456.             WHERE g.name IN ('admins')
  457.         )
  458.     )
  459. ),
  460. LastMonth AS ( /* Count eligible posts from last month */
  461.    SELECT row_number() OVER (ORDER BY count(*) DESC, bp.user_id), u.username, bp.user_id, count(*)
  462.    FROM badge_posts bp
  463.    JOIN users u on u.id=bp.user_id AND
  464.        bp.user_id NOT IN ( /* ignore bots */
  465.                SELECT gu.user_id
  466.                FROM group_users gu
  467.                WHERE group_id IN(
  468.                    SELECT g.id
  469.                    FROM groups g
  470.                    WHERE g.name IN ('bots')
  471.                )
  472.        )
  473.    WHERE topic_id NOT IN ( /* short topics */
  474.       SELECT topic_id FROM badge_posts GROUP BY topic_id HAVING count(topic_id) <10
  475.    ) AND topic_id NOT IN ( /* Ineligible topics */
  476.       SELECT topic_id
  477.       FROM exclusions
  478.    ) AND bp.created_at > CURRENT_DATE - INTERVAL '1 month'
  479.    GROUP BY u.username, bp.user_id
  480.    HAVING count(*) > 1
  481.    ORDER BY count(*) DESC, bp.user_id
  482. ),
  483. TotalUsers AS (
  484.    SELECT max(row_number) from LastMonth
  485. ),
  486. QUERY AS (
  487. SELECT username, user_id, row_number, cast(row_number*100.0/TotalUsers.max AS numeric(36,2)) as percent, count, CURRENT_DATE granted_at
  488. FROM LastMonth, TotalUsers
  489. WHERE cast(row_number*100.0/TotalUsers.max AS numeric(36,2)) < 30
  490. LIMIT $LIMIT)
  491. SELECT row_number as rank, username, percent, count
  492. FROM QUERY"
  493. }
  494.  
  495. function excluded_cats(){ # Which categories are excluded from badges to prevent abuse
  496.     # Any thread including a post by PJH including the text c09fa970-5a9a-11e4-8ed6-0800200c9a66 should be excluded
  497.     sql "
  498. WITH exclusions AS (
  499.     SELECT p.user_id, p.id, topic_id, t.name, post_number
  500.     FROM posts p
  501.     JOIN topics t ON t.id=p.topic_id
  502.     WHERE raw LIKE '%c09fa970-5a9a-11e4-8ed6-0800200c9a66%' AND
  503.     p.user_id IN  (
  504.         SELECT gu.user_id
  505.         FROM group_users gu
  506.         WHERE group_id IN(
  507.             SELECT g.id
  508.             FROM groups g
  509.             WHERE g.name IN ('admins')
  510.         )
  511.     )
  512. )
  513. SELECT * from exclusions"
  514. }
  515.  
  516. function too_much_time(){ # Who's got this badge?
  517.     sql "
  518. WITH exclusions AS (
  519.     SELECT user_id, id, topic_id, post_number
  520.     FROM posts
  521.     WHERE raw LIKE '%c09fa970-5a9a-11e4-8ed6-0800200c9a66%' AND
  522.     user_id IN  (
  523.         SELECT gu.user_id
  524.         FROM group_users gu
  525.         WHERE group_id IN(
  526.             SELECT g.id
  527.             FROM groups g
  528.             WHERE g.name IN ('admins')
  529.         )
  530.     )
  531. ),
  532. LastMonth AS (
  533.    SELECT row_number() OVER (ORDER BY count(*) DESC, bp.user_id), u.username, bp.user_id, count(*)
  534.    FROM badge_posts bp
  535.    JOIN users u on u.id=bp.user_id AND
  536.        bp.user_id NOT IN (
  537.                SELECT gu.user_id
  538.                FROM group_users gu
  539.                WHERE group_id IN(
  540.                    SELECT g.id
  541.                    FROM groups g
  542.                    WHERE g.name IN ('bots')
  543.                )
  544.        )
  545.    WHERE topic_id NOT IN (
  546.       SELECT topic_id FROM badge_posts GROUP BY topic_id HAVING count(topic_id) <4
  547.    ) AND topic_id NOT IN (
  548.       SELECT topic_id
  549.       FROM exclusions
  550.    ) AND bp.created_at > CURRENT_DATE - INTERVAL '1 month'
  551.    GROUP BY u.username, bp.user_id
  552.    HAVING count(*) > 1
  553.    ORDER BY count(*) DESC, bp.user_id
  554. ),
  555. TotalUsers AS (
  556.    SELECT max(row_number) from LastMonth
  557. )
  558. SELECT username, user_id, row_number, count, CURRENT_DATE granted_at
  559. FROM LastMonth, TotalUsers
  560. WHERE row_number = 1"
  561. }
  562.  
  563. POW=${POW:-4}
  564. function posts_2_static() { # 2^0 posts testing
  565.     sql "
  566. SELECT user_id, 0 post_id, current_timestamp granted_at
  567. FROM badge_posts
  568. WHERE topic_id NOT IN (
  569.   SELECT topic_id FROM badge_posts GROUP BY topic_id HAVING count(topic_id) <4
  570. ) AND topic_id NOT IN (
  571.   1000, 1673, 3125
  572. ) GROUP BY user_id HAVING count(*) >= pow(2, $POW)
  573. "
  574. }
  575.  
  576. function posts_2_dynamic() { # 2^0 posts testing
  577.     sql "
  578. WITH exclusions AS (
  579.     SELECT user_id, id, topic_id, post_number
  580.     FROM posts
  581.     WHERE raw LIKE '%c09fa970-5a9a-11e4-8ed6-0800200c9a66%' AND
  582.     user_id IN  (
  583.         SELECT gu.user_id
  584.         FROM group_users gu
  585.         WHERE group_id IN(
  586.             SELECT g.id
  587.             FROM groups g
  588.             WHERE g.name IN ('admins')
  589.         )
  590.     )
  591. )
  592. SELECT user_id, 0 post_id, current_timestamp granted_at
  593. FROM badge_posts
  594. WHERE topic_id NOT IN (
  595.   SELECT topic_id FROM badge_posts GROUP BY topic_id HAVING count(topic_id) <4
  596. ) AND topic_id NOT IN (
  597.   SELECT topic_id FROM exclusions
  598. ) GROUP BY user_id HAVING count(*) >= pow(2, $POW)
  599. "
  600. }
  601.  
  602. function pedant(){ # Pedantry UUID given
  603.     sql "
  604. SELECT *
  605. FROM post_revisions
  606. WHERE modifications like '%- |-%3b27ba70-5ab4-11e4-8ed6-0800200c9a66%cooked:%'
  607. AND user_id IN  (
  608.     SELECT gu.user_id
  609.     FROM group_users gu
  610.     WHERE group_id IN(
  611.         SELECT g.id
  612.         FROM groups g
  613.         WHERE g.name IN ('admins')
  614.     )
  615. )
  616. "
  617. }
  618.  
  619. function posts_by_hours(){
  620.     sql "
  621. SELECT DATE_TRUNC('day', created_at), EXTRACT(hour FROM created_at), count(id)
  622. FROM posts
  623. WHERE created_at between '01/01/14' and '01/01/19'
  624. GROUP BY DATE_TRUNC('day', created_at), EXTRACT(hour FROM created_at)
  625. ORDER BY DATE_TRUNC('day', created_at) ASC, EXTRACT(hour FROM created_at) ASC
  626. "
  627. }
  628. function topics_by_hours(){
  629.     sql "
  630. SELECT DATE_TRUNC('day', created_at), EXTRACT(hour FROM created_at), topic_id, count(id)
  631. FROM posts
  632. WHERE created_at between '01/01/14' and '01/01/19'
  633. GROUP BY DATE_TRUNC('day', created_at), EXTRACT(hour FROM created_at), topic_id
  634. HAVING count(id)>50
  635. ORDER BY DATE_TRUNC('day', created_at) ASC, EXTRACT(hour FROM created_at) ASC
  636. "
  637. }
  638.  
  639. function posts_per_topic(){
  640.     sql "
  641. WITH post_counts AS (
  642.     SELECT COUNT(*) as post_count, topic_id
  643.     FROM posts
  644.     GROUP BY topic_id
  645. )
  646. SELECT post_count, COUNT(*)
  647. FROM post_counts
  648. GROUP BY post_count
  649. ORDER BY post_count ASC
  650. "
  651. }
  652.  
  653. function time_read(){
  654.     sql "
  655. SELECT u.username, (time_read /86400 || ' day(s)') || ' ' || TO_CHAR((time_read % 86400 || ' second')::interval, 'HH24:MI:SS') AS duration
  656. FROM user_stats us
  657. JOIN users u ON u.id=us.user_id
  658. ORDER BY time_read DESC
  659. LIMIT $LIMIT"
  660. }
  661.  
  662. function time_read_post_timings(){
  663.     sql "
  664. WITH us AS (
  665.     SELECT sum(LEAST(msecs, 100000000000))/1000000 AS time_read, user_id
  666.     FROM post_timings
  667.     GROUP BY user_id
  668. )
  669. SELECT u.username, (time_read /86400 || ' day(s)') || ' ' || TO_CHAR((time_read % 86400 || ' second')::interval, 'HH24:MI:SS') AS duration
  670. FROM us
  671. JOIN users u ON u.id=us.user_id
  672. ORDER BY time_read DESC
  673. LIMIT $LIMIT"
  674. }
  675.  
  676. function x1000_likes(){
  677.     sql "
  678. WITH liked_posts AS (
  679.     SELECT pa.post_id, p.post_number
  680.     FROM post_actions pa
  681.     JOIN users u on u.id=pa.user_id
  682.     JOIN posts p on p.id=pa.post_id
  683.     WHERE pa.post_action_type_id=2 AND
  684.         u.username LIKE '$NAME'
  685.     ORDER BY p.post_number ASC
  686. ),
  687. StartingPoints AS (
  688.     SELECT post_number, ROW_NUMBER() OVER(ORDER BY post_number) AS rownum
  689.     FROM liked_posts as A
  690.     WHERE NOT EXISTS (
  691.         SELECT post_number
  692.         FROM liked_posts as B
  693.         WHERE B.post_number = A.post_number - 1
  694.     )
  695. ),
  696. EndingPoints AS (
  697.     SELECT post_number, ROW_NUMBER() OVER(ORDER BY post_number) AS rownum
  698.     FROM liked_posts as A
  699.     WHERE NOT EXISTS (
  700.         SELECT post_number
  701.         FROM liked_posts as B
  702.         WHERE B.post_number = A.post_number + 1
  703.     )
  704. )
  705. SELECT S.post_number AS start_range, E.post_number AS end_range
  706. FROM StartingPoints AS S
  707. JOIN EndingPoints AS E ON E.rownum = S.rownum
  708. ;"
  709. }
  710.  
  711.  
  712. function primes_1(){
  713.     sql "
  714. WITH digits(i) AS (
  715.     SELECT 1 AS i UNION ALL
  716.     SELECT 2 UNION ALL
  717.     SELECT 3 UNION ALL
  718.     SELECT 4 UNION ALL
  719.     SELECT 5 UNION ALL
  720.     SELECT 6 UNION ALL
  721.     SELECT 7 UNION ALL
  722.     SELECT 8 UNION ALL
  723.     SELECT 9 UNION ALL
  724.     SELECT 0
  725. ),
  726. sequence(i) AS (
  727.     SELECT d1.i + (10*d2.i) + (100*d3.i) + (1000*d4.i) + (10000*d5.i) + (100000*d6.i)
  728.     FROM digits AS d1,
  729.     digits AS d2,
  730.     digits AS d3,
  731.     digits AS d4,
  732.     digits AS d5,
  733.     digits AS d6
  734. )
  735. SELECT      n1.i
  736. FROM        sequence AS n1
  737. WHERE       n1.i > 1
  738.     AND         n1.i < 100
  739.     AND NOT EXISTS(
  740.         SELECT    *
  741.         FROM      sequence AS n2
  742.         WHERE     n2.i > 1
  743.         AND       n2.i < n1.i
  744.         AND       n1.i % n2.i = 0)
  745.     ORDER BY i ASC
  746. "
  747. # SELECT max(i) FROM sequence; "
  748. }
  749.  
  750. user=`whoami`
  751. if [ "$user" != "postgres" ]; then
  752.     echo "Not running as postgres. Execute one of:"
  753.     echo "   su - root -c \"su - postgres\""
  754.     echo "   sudo su - postgres"
  755.     echo "To continue."
  756.     exit 1;
  757. fi
  758.  
  759.  
  760. function help(){ # Show this help
  761.     grep "^function.*#" $0 | sed -e "s/^function \([^(]*\)(){ #\(.*\)$/\1 -- \2/g"
  762. }
  763.  
  764.  
  765. if [ "_$1" = "_" ]; then
  766.     help
  767. else
  768.     grep "$1(" $0 | sed 's/^[^#]*//g'
  769.     tic=$(($(date +%s%N)/1000000))
  770.     "$@" | sed -e '
  771. s/c09fa970-5a9a-11e4-8ed6-0800200c9a66/[UUID removed to prevent this thread accidentally being marked as excluded]/g
  772. '
  773.     toc=$(($(date +%s%N)/1000000))
  774.     delta=$(($toc - $tic))
  775.     LC_NUMERIC=C LC_COLLATE=C
  776.     printf 'Elapsed: %gs\n' $(bc <<< "scale=3; ${delta}/1000")
  777.     echo -n "Backup taken: "; backup_date
  778. fi
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement