better query
This commit is contained in:
		| @@ -47,13 +47,12 @@ func (self PostEntry) Count() int64 { | |||||||
| 	return self[1] | 	return self[1] | ||||||
| } | } | ||||||
|  |  | ||||||
|  | type PostEntryList []PostEntry | ||||||
|  |  | ||||||
|  |  | ||||||
| // stats about newsgroup postings | // stats about newsgroup postings | ||||||
| type NewsgroupStats struct { | type NewsgroupStats struct { | ||||||
| 	Posted []PostEntry | 	PPD    int64 | ||||||
| 	Delted []PostEntry |  | ||||||
| 	Hits   []PostEntry |  | ||||||
| 	Start  time.Time |  | ||||||
| 	End    time.Time |  | ||||||
| 	Name   string | 	Name   string | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -70,6 +69,8 @@ type NewsgroupListEntry [3]string | |||||||
|  |  | ||||||
| type NewsgroupList []NewsgroupListEntry | type NewsgroupList []NewsgroupListEntry | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| type Database interface { | type Database interface { | ||||||
| 	Close() | 	Close() | ||||||
| 	CreateTables() | 	CreateTables() | ||||||
| @@ -81,7 +82,7 @@ type Database interface { | |||||||
| 	GetAllArticlesInGroup(group string, send chan ArticleEntry) | 	GetAllArticlesInGroup(group string, send chan ArticleEntry) | ||||||
| 	CountAllArticlesInGroup(group string) (int64, error) | 	CountAllArticlesInGroup(group string) (int64, error) | ||||||
| 	GetAllArticles() []ArticleEntry | 	GetAllArticles() []ArticleEntry | ||||||
|  | 	 | ||||||
| 	SetConnectionLifetime(seconds int) | 	SetConnectionLifetime(seconds int) | ||||||
| 	SetMaxOpenConns(n int) | 	SetMaxOpenConns(n int) | ||||||
| 	SetMaxIdleConns(n int) | 	SetMaxIdleConns(n int) | ||||||
| @@ -124,6 +125,9 @@ type Database interface { | |||||||
| 	// if N <= 0 then count all we have now | 	// if N <= 0 then count all we have now | ||||||
| 	CountPostsInGroup(group string, time_frame int64) int64 | 	CountPostsInGroup(group string, time_frame int64) int64 | ||||||
|  |  | ||||||
|  | 	// get the stats for the overview page | ||||||
|  | 	GetNewsgroupStats() ([]NewsgroupStats, error) | ||||||
|  |  | ||||||
| 	// get all replies to a thread | 	// get all replies to a thread | ||||||
| 	// if last > 0 then get that many of the last replies | 	// if last > 0 then get that many of the last replies | ||||||
| 	// start at reply number start | 	// start at reply number start | ||||||
|   | |||||||
| @@ -224,6 +224,8 @@ type boardPageRow struct { | |||||||
| 	Hour  int64 | 	Hour  int64 | ||||||
| 	Day   int64 | 	Day   int64 | ||||||
| 	All   int64 | 	All   int64 | ||||||
|  | 	Hi    int64 | ||||||
|  | 	Lo    int64 | ||||||
| } | } | ||||||
|  |  | ||||||
| type boardPageRows []boardPageRow | type boardPageRows []boardPageRow | ||||||
| @@ -242,6 +244,7 @@ func (self boardPageRows) Swap(i, j int) { | |||||||
| 	self[i], self[j] = self[j], self[i] | 	self[i], self[j] = self[j], self[i] | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| type postsGraphRow struct { | type postsGraphRow struct { | ||||||
| 	day time.Time | 	day time.Time | ||||||
| 	Num int64 | 	Num int64 | ||||||
|   | |||||||
| @@ -151,9 +151,11 @@ const GetCitesByPostHashLike = "GetCitesByPostHashLike" | |||||||
| const GetYearlyPostHistory = "GetYearlyPostHistory" | const GetYearlyPostHistory = "GetYearlyPostHistory" | ||||||
| const GetNewsgroupList = "GetNewsgroupList" | const GetNewsgroupList = "GetNewsgroupList" | ||||||
| const CountUkko = "CountUkko" | const CountUkko = "CountUkko" | ||||||
|  | const GetNewsgroupStats = "GetNewsgroupStats" | ||||||
|  |  | ||||||
| func (self *PostgresDatabase) prepareStatements() { | func (self *PostgresDatabase) prepareStatements() { | ||||||
| 	self.stmt = map[string]string{ | 	self.stmt = map[string]string{ | ||||||
|  | 		GetNewsgroupStats: "SELECT COUNT(message_id), newsgroup FROM articleposts WHERE time_posted > (EXTRACT(epoch FROM NOW()) - (24*3600)) GROUP BY newsgroup", | ||||||
| 		NewsgroupBanned:                 "SELECT 1 FROM BannedGroups WHERE newsgroup = $1", | 		NewsgroupBanned:                 "SELECT 1 FROM BannedGroups WHERE newsgroup = $1", | ||||||
| 		ArticleBanned:                   "SELECT 1 FROM BannedArticles WHERE message_id = $1", | 		ArticleBanned:                   "SELECT 1 FROM BannedArticles WHERE message_id = $1", | ||||||
| 		GetAllNewsgroups:                "SELECT name FROM Newsgroups WHERE name NOT IN ( SELECT newsgroup FROM BannedGroups )", | 		GetAllNewsgroups:                "SELECT name FROM Newsgroups WHERE name NOT IN ( SELECT newsgroup FROM BannedGroups )", | ||||||
| @@ -2039,6 +2041,21 @@ func (self *PostgresDatabase) GetUkkoPageCount(perpage int) (count int64, err er | |||||||
| 	return | 	return | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func (self *PostgresDatabase)	GetNewsgroupStats() (stats []NewsgroupStats, err error) { | ||||||
|  | 	var rows *sql.Rows | ||||||
|  | 	rows, err = self.conn.Query(self.stmt[GetNewsgroupStats]) | ||||||
|  | 	if err == nil { | ||||||
|  | 		for rows.Next() { | ||||||
|  | 			var s NewsgroupStats | ||||||
|  | 			rows.Scan(&s.PPD, &s.Name) | ||||||
|  | 			stats = append(stats, s) | ||||||
|  | 		} | ||||||
|  | 		rows.Close() | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
| func (self *PostgresDatabase) FindHeaders(group, headername string, lo, hi int64) (hdr ArticleHeaders, err error) { | func (self *PostgresDatabase) FindHeaders(group, headername string, lo, hi int64) (hdr ArticleHeaders, err error) { | ||||||
| 	hdr = make(ArticleHeaders) | 	hdr = make(ArticleHeaders) | ||||||
| 	q := "SELECT header_value FROM nntpheaders WHERE header_name = $1 AND header_article_message_id IN ( SELECT message_id FROM articleposts WHERE newsgroup = $2 )" | 	q := "SELECT header_value FROM nntpheaders WHERE header_name = $1 AND header_article_message_id IN ( SELECT message_id FROM articleposts WHERE newsgroup = $2 )" | ||||||
|   | |||||||
| @@ -475,36 +475,29 @@ func (self *templateEngine) genGraphs(prefix string, wr io.Writer, db Database, | |||||||
|  |  | ||||||
| func (self *templateEngine) genBoardList(prefix, name string, wr io.Writer, db Database, i18n *I18N) { | func (self *templateEngine) genBoardList(prefix, name string, wr io.Writer, db Database, i18n *I18N) { | ||||||
| 	// the graph for the front page | 	// the graph for the front page | ||||||
| 	var frontpage_graph boardPageRows | 	var graph boardPageRows | ||||||
|  |  | ||||||
| 	// for each group | 	stats, err := db.GetNewsgroupStats() | ||||||
| 	groups := db.GetAllNewsgroups() | 	if err != nil { | ||||||
| 	for _, group := range groups { | 		log.Println("error getting board list", err) | ||||||
| 		// exclude banned | 		io.WriteString(wr, err.Error()) | ||||||
| 		banned, _ := db.NewsgroupBanned(group) | 		return | ||||||
| 		if banned { | 	} | ||||||
| 			continue |  | ||||||
| 		} | 	for idx := range stats { | ||||||
| 		// posts this hour | 		graph = append(graph, boardPageRow{ | ||||||
| 		hour := db.CountPostsInGroup(group, 3600) | 			Board: stats[idx].Name, | ||||||
| 		// posts today | 			Day: stats[idx].PPD, | ||||||
| 		day := db.CountPostsInGroup(group, 86400) |  | ||||||
| 		// posts total |  | ||||||
| 		all := db.CountPostsInGroup(group, 0) |  | ||||||
| 		frontpage_graph = append(frontpage_graph, boardPageRow{ |  | ||||||
| 			All:   all, |  | ||||||
| 			Day:   day, |  | ||||||
| 			Hour:  hour, |  | ||||||
| 			Board: group, |  | ||||||
| 		}) | 		}) | ||||||
| 	} | 	} | ||||||
|  | 	 | ||||||
| 	param := map[string]interface{}{ | 	param := map[string]interface{}{ | ||||||
| 		"prefix":   prefix, | 		"prefix":   prefix, | ||||||
| 		"frontend": name, | 		"frontend": name, | ||||||
| 	} | 	} | ||||||
| 	sort.Sort(frontpage_graph) | 	sort.Sort(graph) | ||||||
| 	param["graph"] = frontpage_graph | 	param["graph"] = graph | ||||||
| 	_, err := io.WriteString(wr, self.renderTemplate("boardlist", param, i18n)) | 	_, err = io.WriteString(wr, self.renderTemplate("boardlist", param, i18n)) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		log.Println("error writing board list page", err) | 		log.Println("error writing board list page", err) | ||||||
| 	} | 	} | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user