stats_storage.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. package storage
  2. import (
  3. "ohurlshortener/core"
  4. "ohurlshortener/utils"
  5. )
  6. // GetUrlStats 获取短链接的访问量统计信息
  7. func GetUrlStats(url string) (core.ShortUrlStats, error) {
  8. found := core.ShortUrlStats{}
  9. query := `select * from public.stats_ip_sum WHERE short_url = $1`
  10. err := DbGet(query, &found, url)
  11. return found, err
  12. }
  13. // GetUrlCount 获取短链接总数
  14. func GetUrlCount() (int, error) {
  15. var (
  16. result int
  17. query = `SELECT count(l.id) FROM public.short_urls l`
  18. )
  19. // query := `SELECT n_live_tup AS estimate_rows FROM pg_stat_all_tables WHERE relname = 'short_urls'`
  20. return result, DbGet(query, &result)
  21. }
  22. // GetSumOfUrlStats 获取所有短链接的访问量统计信息
  23. func GetSumOfUrlStats() (core.ShortUrlStats, error) {
  24. query := `SELECT * FROM public.stats_sum`
  25. result := core.ShortUrlStats{}
  26. data := []core.StatsSum{}
  27. err := DbSelect(query, &data)
  28. if err != nil {
  29. return result, err
  30. }
  31. for _, v := range data {
  32. switch v.Key {
  33. case "today_count":
  34. result.TodayCount = v.Value
  35. case "yesterday_count":
  36. result.YesterdayCount = v.Value
  37. case "last_7_days_count":
  38. result.Last7DaysCount = v.Value
  39. case "monthly_count":
  40. result.MonthlyCount = v.Value
  41. case "d_today_count":
  42. result.DistinctTodayCount = v.Value
  43. case "d_yesterday_count":
  44. result.DistinctYesterdayCount = v.Value
  45. case "d_last_7_days_count":
  46. result.DistinctLast7DaysCount = v.Value
  47. case "d_monthly_count":
  48. result.DistinctMonthlyCount = v.Value
  49. }
  50. }
  51. return result, nil
  52. }
  53. // GetTop25 获取访问量前 25 的短链接
  54. func GetTop25() ([]core.Top25Url, error) {
  55. query := `SELECT u.*,s.today_count AS today_count,s.d_today_count AS d_today_count FROM public.short_urls u , public.stats_top25 s WHERE u.short_url = s.short_url`
  56. found := []core.Top25Url{}
  57. return found, DbSelect(query, &found)
  58. }
  59. // FindPagedUrlIpCountStats 获取单个短链接的 IP 访问量统计信息
  60. func FindPagedUrlIpCountStats(url string, page int, size int) ([]core.UrlIpCountStats, error) {
  61. found := []core.UrlIpCountStats{}
  62. offset := (page - 1) * size
  63. query := `SELECT s.*,u.id,u.dest_url,u.created_at,u.is_valid,u.memo FROM public.stats_ip_sum s , public.short_urls u WHERE u.short_url = s.short_url ORDER BY u.created_at DESC LIMIT $1 OFFSET $2`
  64. if !utils.EmptyString(url) {
  65. query := `SELECT s.*,u.id,u.dest_url,u.created_at,u.is_valid,u.memo
  66. FROM public.stats_ip_sum s , public.short_urls u WHERE u.short_url = s.short_url AND u.short_url = $1 ORDER BY u.created_at DESC LIMIT $2 OFFSET $3`
  67. var foundUrl core.UrlIpCountStats
  68. err := DbGet(query, &foundUrl, url, size, offset)
  69. if !foundUrl.IsEmpty() {
  70. found = append(found, foundUrl)
  71. }
  72. return found, err
  73. }
  74. return found, DbSelect(query, &found, size, offset)
  75. }
  76. // CallProcedureStatsIPSum
  77. // Call scheduled procedures to calculate stats result.
  78. //
  79. // Suggested time interval to call this procedure : 30 ~ 60 minutes
  80. func CallProcedureStatsIPSum() error {
  81. query := `SELECT 1 AS r FROM p_stats_ip_sum()`
  82. var r int
  83. return DbGet(query, &r)
  84. }
  85. // CallProcedureStatsTop25
  86. // Call scheduled procedures to calculate stats result.
  87. //
  88. // Suggested time interval to call this procedure 5 ~ 10 minutes
  89. func CallProcedureStatsTop25() error {
  90. query := `SELECT 2 AS r FROM p_stats_top25()`
  91. var r int
  92. return DbGet(query, &r)
  93. }
  94. // CallProcedureStatsSum
  95. // Call scheduled procedures to calculate stats result.
  96. //
  97. // Suggested time interval to call this procedure : 5 ~ 10 minutes
  98. func CallProcedureStatsSum() error {
  99. query := `SELECT 3 AS r FROM p_stats_sum()`
  100. var r int
  101. return DbGet(query, &r)
  102. }