common/repository/statistics/click_statistics.go

116 lines
2.8 KiB
Go
Raw Normal View History

2024-06-13 12:39:18 +00:00
package statistics
2024-06-13 15:37:58 +00:00
import (
"context"
"database/sql"
"fmt"
)
2024-06-13 12:39:18 +00:00
type DepsClick struct {
Conn *sql.DB
}
type StatisticClick struct {
conn *sql.DB
}
2024-06-13 15:37:58 +00:00
func NewClickStatistic(ctx context.Context, deps DepsClick) (*StatisticClick, error) {
s := &StatisticClick{
2024-06-13 12:39:18 +00:00
conn: deps.Conn,
}
2024-06-13 15:37:58 +00:00
err := s.checkMW(ctx)
if err != nil {
fmt.Println("error check material view existing")
return nil, err
}
return s, nil
}
2024-06-13 16:01:44 +00:00
// todo toanaliz for keydevice,keydevicetype,keybrowser,
2024-06-13 15:37:58 +00:00
func (s *StatisticClick) checkMW(ctx context.Context) error {
query := `
CREATE MATERIALIZED VIEW IF NOT EXISTS mv_last_answers_events
ENGINE = MergeTree()
ORDER BY (ctxsession, event_time) AS
SELECT
event_time, ctxsession, ctxquizid, ctxquestionid, ctxidint, message, keyos,
ctxuserip, ctxuserport, keydomain, keypath, ctxquiz, ctxreferrer
FROM (SELECT
event_time, ctxsession, ctxquizid, ctxquestionid, ctxidint, message, keyos,
ctxuserip, ctxuserport, keydomain, keypath, ctxquiz, ctxreferrer,
2024-06-14 11:22:18 +00:00
row_number() OVER (PARTITION BY ctxsession ORDER BY event_time DESC) as row_num
FROM statistics
WHERE message IN ('InfoQuizOpen', 'InfoAnswer', 'InfoResult') AND event_level = 'info') AS sorted
WHERE row_num = 1;
2024-06-13 15:37:58 +00:00
`
_, err := s.conn.ExecContext(ctx, query)
if err != nil {
return err
}
return nil
}
2024-06-13 19:03:41 +00:00
type Statistic struct {
2024-06-13 15:37:58 +00:00
Count int64
QuestionID int64
}
2024-06-13 19:03:41 +00:00
type PipeLineStatsResp [][]Statistic
func (s *StatisticClick) GetPipelinesStatistics(ctx context.Context, quizID int64, from uint64, to uint64) (PipeLineStatsResp, error) {
2024-06-13 15:37:58 +00:00
query := `
SELECT
ctxsession,ctxquestionid,count(*) as session_count
2024-06-13 15:44:06 +00:00
FROM mv_last_answers_events WHERE ctxquizid = ? AND event_time BETWEEN ? AND ?
2024-06-13 15:37:58 +00:00
GROUP BY ctxsession, ctxquestionid ORDER BY ctxsession, ctxquestionid
`
2024-06-13 15:44:06 +00:00
rows, err := s.conn.QueryContext(ctx, query, quizID, from, to)
2024-06-13 15:37:58 +00:00
if err != nil {
return nil, err
}
defer rows.Close()
2024-06-13 19:03:41 +00:00
var pipelines PipeLineStatsResp
var currentPipeline []Statistic
2024-06-13 15:37:58 +00:00
var lastSession string
for rows.Next() {
var session string
var questionID int64
var count int64
err := rows.Scan(&session, &questionID, &count)
if err != nil {
return nil, err
}
// новая сессия - новая воронка
2024-06-13 19:03:41 +00:00
if session != lastSession {
if lastSession != "" {
pipelines = append(pipelines, currentPipeline)
}
currentPipeline = []Statistic{}
2024-06-13 15:37:58 +00:00
}
// текущая статистика в текущую воронку
2024-06-13 19:03:41 +00:00
currentPipeline = append(currentPipeline, Statistic{
Count: count,
QuestionID: questionID,
})
2024-06-13 15:37:58 +00:00
lastSession = session
}
// последня воронка если есть то добавляем
if len(currentPipeline) > 0 {
pipelines = append(pipelines, currentPipeline)
}
if err := rows.Err(); err != nil {
return nil, err
}
return pipelines, nil
2024-06-13 12:39:18 +00:00
}