fix period user metric aggregation
This commit is contained in:
parent
cfbc50a3fb
commit
84e29c689f
@ -31,6 +31,7 @@ func (r *MySQLRepository) EnsureSchema(ctx context.Context) error {
|
|||||||
KEY idx_dashboard_cdc_user_country_origin_country (sys_origin, country_code)
|
KEY idx_dashboard_cdc_user_country_origin_country (sys_origin, country_code)
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci`,
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci`,
|
||||||
createDailyMetricTable,
|
createDailyMetricTable,
|
||||||
|
createDailyUserMetricTable,
|
||||||
createPeriodMetricTable,
|
createPeriodMetricTable,
|
||||||
createPeriodUserMetricTable,
|
createPeriodUserMetricTable,
|
||||||
createGamePeriodMetricTable,
|
createGamePeriodMetricTable,
|
||||||
@ -64,6 +65,20 @@ const createDailyMetricTable = `CREATE TABLE IF NOT EXISTS country_dashboard_dai
|
|||||||
KEY idx_daily_origin_date (sys_origin, stat_date)
|
KEY idx_daily_origin_date (sys_origin, stat_date)
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci`
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci`
|
||||||
|
|
||||||
|
const createDailyUserMetricTable = `CREATE TABLE IF NOT EXISTS country_dashboard_daily_user_metric (
|
||||||
|
id bigint NOT NULL AUTO_INCREMENT,
|
||||||
|
stat_date date NOT NULL,
|
||||||
|
sys_origin varchar(50) NOT NULL,
|
||||||
|
country_code varchar(64) NOT NULL,
|
||||||
|
country_name varchar(128) NOT NULL,
|
||||||
|
user_id bigint NOT NULL,
|
||||||
|
metric_type varchar(32) NOT NULL,
|
||||||
|
created_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
PRIMARY KEY (id),
|
||||||
|
UNIQUE KEY uk_daily_user_metric (stat_date, sys_origin, country_code, user_id, metric_type),
|
||||||
|
KEY idx_daily_user_metric (sys_origin, user_id, metric_type)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci`
|
||||||
|
|
||||||
const createPeriodMetricTable = `CREATE TABLE IF NOT EXISTS country_dashboard_period_metric (
|
const createPeriodMetricTable = `CREATE TABLE IF NOT EXISTS country_dashboard_period_metric (
|
||||||
id bigint NOT NULL AUTO_INCREMENT,
|
id bigint NOT NULL AUTO_INCREMENT,
|
||||||
period_type varchar(16) NOT NULL,
|
period_type varchar(16) NOT NULL,
|
||||||
|
|||||||
@ -12,13 +12,7 @@ func (r *MySQLRepository) applyDailyUserMetric(ctx context.Context, tx *sql.Tx,
|
|||||||
if c.DeltaSign < 0 {
|
if c.DeltaSign < 0 {
|
||||||
return r.deleteDailyUserMetric(ctx, tx, c, day, metricType)
|
return r.deleteDailyUserMetric(ctx, tx, c, day, metricType)
|
||||||
}
|
}
|
||||||
inserted, err := insertPeriodUserMetric(ctx, tx, c, dashboard.PeriodWindow{
|
inserted, err := insertDailyUserMetric(ctx, tx, c, day, metricType)
|
||||||
Type: dashboard.PeriodDay,
|
|
||||||
Key: day.Format("2006-01-02"),
|
|
||||||
Name: day.Format("2006-01-02"),
|
|
||||||
StartDate: dashboardPtr(day),
|
|
||||||
EndDate: dashboardPtr(day.AddDate(0, 0, 1)),
|
|
||||||
}, r.cfg.Dashboard.StorageTimezone, metricType)
|
|
||||||
if err != nil || !inserted {
|
if err != nil || !inserted {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -59,14 +53,7 @@ ON DUPLICATE KEY UPDATE `+column+` = `+column+` + 1, country_name = VALUES(count
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (r *MySQLRepository) deleteDailyUserMetric(ctx context.Context, tx *sql.Tx, c dashboard.Contribution, day time.Time, metricType string) error {
|
func (r *MySQLRepository) deleteDailyUserMetric(ctx context.Context, tx *sql.Tx, c dashboard.Contribution, day time.Time, metricType string) error {
|
||||||
window := dashboard.PeriodWindow{
|
deleted, err := deleteDailyUserMetricRow(ctx, tx, c, day, metricType)
|
||||||
Type: dashboard.PeriodDay,
|
|
||||||
Key: day.Format("2006-01-02"),
|
|
||||||
Name: day.Format("2006-01-02"),
|
|
||||||
StartDate: dashboardPtr(day),
|
|
||||||
EndDate: dashboardPtr(day.AddDate(0, 0, 1)),
|
|
||||||
}
|
|
||||||
deleted, err := deletePeriodUserMetric(ctx, tx, c, window, r.cfg.Dashboard.StorageTimezone, metricType)
|
|
||||||
if err != nil || !deleted {
|
if err != nil || !deleted {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -99,6 +86,31 @@ WHERE period_type = ? AND period_key = ? AND stat_timezone = ? AND sys_origin =
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func insertDailyUserMetric(ctx context.Context, tx *sql.Tx, c dashboard.Contribution, day time.Time, metricType string) (bool, error) {
|
||||||
|
result, err := tx.ExecContext(ctx, `
|
||||||
|
INSERT IGNORE INTO country_dashboard_daily_user_metric (
|
||||||
|
stat_date, sys_origin, country_code, country_name, user_id, metric_type
|
||||||
|
) VALUES (?, ?, ?, ?, ?, ?)
|
||||||
|
`, day, c.SysOrigin, c.Country.Code, c.Country.Name, c.UserID, metricType)
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
affected, err := result.RowsAffected()
|
||||||
|
return affected > 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func deleteDailyUserMetricRow(ctx context.Context, tx *sql.Tx, c dashboard.Contribution, day time.Time, metricType string) (bool, error) {
|
||||||
|
result, err := tx.ExecContext(ctx, `
|
||||||
|
DELETE FROM country_dashboard_daily_user_metric
|
||||||
|
WHERE stat_date = ? AND sys_origin = ? AND country_code = ? AND user_id = ? AND metric_type = ?
|
||||||
|
`, day, c.SysOrigin, c.Country.Code, c.UserID, metricType)
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
affected, err := result.RowsAffected()
|
||||||
|
return affected > 0, err
|
||||||
|
}
|
||||||
|
|
||||||
func (r *MySQLRepository) applyGamePeriodUserMetric(ctx context.Context, tx *sql.Tx, c dashboard.Contribution, window dashboard.PeriodWindow, statTimezone string) error {
|
func (r *MySQLRepository) applyGamePeriodUserMetric(ctx context.Context, tx *sql.Tx, c dashboard.Contribution, window dashboard.PeriodWindow, statTimezone string) error {
|
||||||
result, err := tx.ExecContext(ctx, `
|
result, err := tx.ExecContext(ctx, `
|
||||||
INSERT IGNORE INTO country_dashboard_game_period_user_metric (
|
INSERT IGNORE INTO country_dashboard_game_period_user_metric (
|
||||||
|
|||||||
@ -26,3 +26,17 @@ CREATE TABLE IF NOT EXISTS dashboard_cdc_user_country (
|
|||||||
PRIMARY KEY (user_id),
|
PRIMARY KEY (user_id),
|
||||||
KEY idx_dashboard_cdc_user_country_origin_country (sys_origin, country_code)
|
KEY idx_dashboard_cdc_user_country_origin_country (sys_origin, country_code)
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS country_dashboard_daily_user_metric (
|
||||||
|
id bigint NOT NULL AUTO_INCREMENT,
|
||||||
|
stat_date date NOT NULL,
|
||||||
|
sys_origin varchar(50) NOT NULL,
|
||||||
|
country_code varchar(64) NOT NULL,
|
||||||
|
country_name varchar(128) NOT NULL,
|
||||||
|
user_id bigint NOT NULL,
|
||||||
|
metric_type varchar(32) NOT NULL,
|
||||||
|
created_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
PRIMARY KEY (id),
|
||||||
|
UNIQUE KEY uk_daily_user_metric (stat_date, sys_origin, country_code, user_id, metric_type),
|
||||||
|
KEY idx_daily_user_metric (sys_origin, user_id, metric_type)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user