[add] split wanted files vs wanted metadata for ko apis, [add] documentation
This commit is contained in:
@@ -157,16 +157,16 @@ func (q *Queries) GetActivity(ctx context.Context, arg GetActivityParams) ([]Act
|
||||
|
||||
const getDailyReadStats = `-- name: GetDailyReadStats :many
|
||||
WITH RECURSIVE last_30_days (date) AS (
|
||||
SELECT date('now') AS date
|
||||
SELECT DATE('now') AS date
|
||||
UNION ALL
|
||||
SELECT date(date, '-1 days')
|
||||
SELECT DATE(date, '-1 days')
|
||||
FROM last_30_days
|
||||
LIMIT 30
|
||||
),
|
||||
activity_records AS (
|
||||
SELECT
|
||||
sum(duration) AS seconds_read,
|
||||
date(start_time, 'localtime') AS day
|
||||
DATE(start_time, 'localtime') AS day
|
||||
FROM activity
|
||||
WHERE user_id = ?1
|
||||
GROUP BY day
|
||||
@@ -372,7 +372,7 @@ func (q *Queries) GetDocument(ctx context.Context, documentID string) (Document,
|
||||
|
||||
const getDocumentDaysRead = `-- name: GetDocumentDaysRead :one
|
||||
WITH document_days AS (
|
||||
SELECT date(start_time, 'localtime') AS dates
|
||||
SELECT DATE(start_time, 'localtime') AS dates
|
||||
FROM rescaled_activity
|
||||
WHERE document_id = ?1
|
||||
AND user_id = ?2
|
||||
@@ -758,141 +758,13 @@ func (q *Queries) GetUser(ctx context.Context, userID string) (User, error) {
|
||||
return i, err
|
||||
}
|
||||
|
||||
const getUserDayStreaks = `-- name: GetUserDayStreaks :one
|
||||
WITH document_days AS (
|
||||
SELECT date(start_time, 'localtime') AS read_day
|
||||
FROM activity
|
||||
WHERE user_id = ?1
|
||||
GROUP BY read_day
|
||||
ORDER BY read_day DESC
|
||||
),
|
||||
partitions AS (
|
||||
SELECT
|
||||
document_days.read_day,
|
||||
row_number() OVER (
|
||||
PARTITION BY 1 ORDER BY read_day DESC
|
||||
) AS seqnum
|
||||
FROM document_days
|
||||
),
|
||||
streaks AS (
|
||||
SELECT
|
||||
count(*) AS streak,
|
||||
MIN(read_day) AS start_date,
|
||||
MAX(read_day) AS end_date
|
||||
FROM partitions
|
||||
GROUP BY date(read_day, '+' || seqnum || ' day')
|
||||
ORDER BY end_date DESC
|
||||
),
|
||||
max_streak AS (
|
||||
SELECT
|
||||
MAX(streak) AS max_streak,
|
||||
start_date AS max_streak_start_date,
|
||||
end_date AS max_streak_end_date
|
||||
FROM streaks
|
||||
)
|
||||
SELECT
|
||||
CAST(max_streak AS INTEGER),
|
||||
CAST(max_streak_start_date AS TEXT),
|
||||
CAST(max_streak_end_date AS TEXT),
|
||||
streak AS current_streak,
|
||||
CAST(start_date AS TEXT) AS current_streak_start_date,
|
||||
CAST(end_date AS TEXT) AS current_streak_end_date
|
||||
FROM max_streak, streaks LIMIT 1
|
||||
`
|
||||
|
||||
type GetUserDayStreaksRow struct {
|
||||
MaxStreak int64 `json:"max_streak"`
|
||||
MaxStreakStartDate string `json:"max_streak_start_date"`
|
||||
MaxStreakEndDate string `json:"max_streak_end_date"`
|
||||
CurrentStreak int64 `json:"current_streak"`
|
||||
CurrentStreakStartDate string `json:"current_streak_start_date"`
|
||||
CurrentStreakEndDate string `json:"current_streak_end_date"`
|
||||
}
|
||||
|
||||
func (q *Queries) GetUserDayStreaks(ctx context.Context, userID string) (GetUserDayStreaksRow, error) {
|
||||
row := q.db.QueryRowContext(ctx, getUserDayStreaks, userID)
|
||||
var i GetUserDayStreaksRow
|
||||
err := row.Scan(
|
||||
&i.MaxStreak,
|
||||
&i.MaxStreakStartDate,
|
||||
&i.MaxStreakEndDate,
|
||||
&i.CurrentStreak,
|
||||
&i.CurrentStreakStartDate,
|
||||
&i.CurrentStreakEndDate,
|
||||
)
|
||||
return i, err
|
||||
}
|
||||
|
||||
const getUserWeekStreaks = `-- name: GetUserWeekStreaks :one
|
||||
WITH document_weeks AS (
|
||||
SELECT STRFTIME('%Y-%m-%d', start_time, 'localtime', 'weekday 0', '-7 day') AS read_week
|
||||
FROM activity
|
||||
WHERE user_id = ?1
|
||||
GROUP BY read_week
|
||||
ORDER BY read_week DESC
|
||||
),
|
||||
partitions AS (
|
||||
SELECT
|
||||
document_weeks.read_week,
|
||||
row_number() OVER (
|
||||
PARTITION BY 1 ORDER BY read_week DESC
|
||||
) AS seqnum
|
||||
FROM document_weeks
|
||||
),
|
||||
streaks AS (
|
||||
SELECT
|
||||
count(*) AS streak,
|
||||
MIN(read_week) AS start_date,
|
||||
MAX(read_week) AS end_date
|
||||
FROM partitions
|
||||
GROUP BY date(read_week, '+' || (seqnum * 7) || ' day')
|
||||
ORDER BY end_date DESC
|
||||
),
|
||||
max_streak AS (
|
||||
SELECT
|
||||
MAX(streak) AS max_streak,
|
||||
start_date AS max_streak_start_date,
|
||||
end_date AS max_streak_end_date
|
||||
FROM streaks
|
||||
)
|
||||
SELECT
|
||||
CAST(max_streak AS INTEGER),
|
||||
CAST(max_streak_start_date AS TEXT),
|
||||
CAST(max_streak_end_date AS TEXT),
|
||||
streak AS current_streak,
|
||||
CAST(start_date AS TEXT) AS current_streak_start_date,
|
||||
CAST(end_date AS TEXT) AS current_streak_end_date
|
||||
FROM max_streak, streaks LIMIT 1
|
||||
`
|
||||
|
||||
type GetUserWeekStreaksRow struct {
|
||||
MaxStreak int64 `json:"max_streak"`
|
||||
MaxStreakStartDate string `json:"max_streak_start_date"`
|
||||
MaxStreakEndDate string `json:"max_streak_end_date"`
|
||||
CurrentStreak int64 `json:"current_streak"`
|
||||
CurrentStreakStartDate string `json:"current_streak_start_date"`
|
||||
CurrentStreakEndDate string `json:"current_streak_end_date"`
|
||||
}
|
||||
|
||||
func (q *Queries) GetUserWeekStreaks(ctx context.Context, userID string) (GetUserWeekStreaksRow, error) {
|
||||
row := q.db.QueryRowContext(ctx, getUserWeekStreaks, userID)
|
||||
var i GetUserWeekStreaksRow
|
||||
err := row.Scan(
|
||||
&i.MaxStreak,
|
||||
&i.MaxStreakStartDate,
|
||||
&i.MaxStreakEndDate,
|
||||
&i.CurrentStreak,
|
||||
&i.CurrentStreakStartDate,
|
||||
&i.CurrentStreakEndDate,
|
||||
)
|
||||
return i, err
|
||||
}
|
||||
|
||||
const getUserWindowStreaks = `-- name: GetUserWindowStreaks :one
|
||||
WITH document_windows AS (
|
||||
SELECT CASE
|
||||
WHEN ?2 = "WEEK" THEN STRFTIME('%Y-%m-%d', start_time, 'localtime', 'weekday 0', '-7 day')
|
||||
WHEN ?2 = "DAY" THEN date(start_time, 'localtime')
|
||||
-- TODO: Timezones! E.g. DATE(start_time, '-5 hours')
|
||||
-- TODO: Timezones! E.g. DATE(start_time, '-5 hours', '-7 days')
|
||||
WHEN ?2 = "WEEK" THEN STRFTIME('%Y-%m-%d', start_time, 'weekday 0', '-7 day')
|
||||
WHEN ?2 = "DAY" THEN DATE(start_time)
|
||||
END AS read_window
|
||||
FROM activity
|
||||
WHERE user_id = ?1
|
||||
@@ -915,8 +787,8 @@ streaks AS (
|
||||
MAX(read_window) AS end_date
|
||||
FROM partitions
|
||||
GROUP BY CASE
|
||||
WHEN ?2 = "DAY" THEN date(read_window, '+' || seqnum || ' day')
|
||||
WHEN ?2 = "WEEK" THEN date(read_window, '+' || (seqnum * 7) || ' day')
|
||||
WHEN ?2 = "DAY" THEN DATE(read_window, '+' || seqnum || ' day')
|
||||
WHEN ?2 = "WEEK" THEN DATE(read_window, '+' || (seqnum * 7) || ' day')
|
||||
END
|
||||
ORDER BY end_date DESC
|
||||
),
|
||||
@@ -926,15 +798,29 @@ max_streak AS (
|
||||
start_date AS max_streak_start_date,
|
||||
end_date AS max_streak_end_date
|
||||
FROM streaks
|
||||
),
|
||||
current_streak AS (
|
||||
SELECT
|
||||
streak AS current_streak,
|
||||
start_date AS current_streak_start_date,
|
||||
end_date AS current_streak_end_date
|
||||
FROM streaks
|
||||
WHERE CASE
|
||||
WHEN ?2 = "WEEK" THEN STRFTIME('%Y-%m-%d', 'now', 'weekday 0', '-7 day') = current_streak_end_date
|
||||
WHEN ?2 = "DAY" THEN DATE('now', '-1 day') = current_streak_end_date OR DATE('now') = current_streak_end_date
|
||||
END
|
||||
LIMIT 1
|
||||
)
|
||||
SELECT
|
||||
CAST(max_streak AS INTEGER),
|
||||
CAST(max_streak_start_date AS TEXT),
|
||||
CAST(max_streak_end_date AS TEXT),
|
||||
streak AS current_streak,
|
||||
CAST(start_date AS TEXT) AS current_streak_start_date,
|
||||
CAST(end_date AS TEXT) AS current_streak_end_date
|
||||
FROM max_streak, streaks LIMIT 1
|
||||
CAST(IFNULL(max_streak, 0) AS INTEGER) AS max_streak,
|
||||
CAST(IFNULL(max_streak_start_date, "N/A") AS TEXT) AS max_streak_start_date,
|
||||
CAST(IFNULL(max_streak_end_date, "N/A") AS TEXT) AS max_streak_end_date,
|
||||
IFNULL(current_streak, 0) AS current_streak,
|
||||
CAST(IFNULL(current_streak_start_date, "N/A") AS TEXT) AS current_streak_start_date,
|
||||
CAST(IFNULL(current_streak_end_date, "N/A") AS TEXT) AS current_streak_end_date
|
||||
FROM max_streak
|
||||
LEFT JOIN current_streak ON 1 = 1
|
||||
LIMIT 1
|
||||
`
|
||||
|
||||
type GetUserWindowStreaksParams struct {
|
||||
@@ -943,12 +829,12 @@ type GetUserWindowStreaksParams struct {
|
||||
}
|
||||
|
||||
type GetUserWindowStreaksRow struct {
|
||||
MaxStreak int64 `json:"max_streak"`
|
||||
MaxStreakStartDate string `json:"max_streak_start_date"`
|
||||
MaxStreakEndDate string `json:"max_streak_end_date"`
|
||||
CurrentStreak int64 `json:"current_streak"`
|
||||
CurrentStreakStartDate string `json:"current_streak_start_date"`
|
||||
CurrentStreakEndDate string `json:"current_streak_end_date"`
|
||||
MaxStreak int64 `json:"max_streak"`
|
||||
MaxStreakStartDate string `json:"max_streak_start_date"`
|
||||
MaxStreakEndDate string `json:"max_streak_end_date"`
|
||||
CurrentStreak interface{} `json:"current_streak"`
|
||||
CurrentStreakStartDate string `json:"current_streak_start_date"`
|
||||
CurrentStreakEndDate string `json:"current_streak_end_date"`
|
||||
}
|
||||
|
||||
func (q *Queries) GetUserWindowStreaks(ctx context.Context, arg GetUserWindowStreaksParams) (GetUserWindowStreaksRow, error) {
|
||||
@@ -1015,31 +901,44 @@ func (q *Queries) GetUsers(ctx context.Context, arg GetUsersParams) ([]User, err
|
||||
}
|
||||
|
||||
const getWantedDocuments = `-- name: GetWantedDocuments :many
|
||||
SELECT CAST(value AS TEXT) AS id
|
||||
SELECT
|
||||
CAST(value AS TEXT) AS id,
|
||||
CAST((documents.filepath IS NULL) AS BOOLEAN) AS want_file,
|
||||
CAST((documents.synced != true) AS BOOLEAN) AS want_metadata
|
||||
FROM json_each(?1)
|
||||
LEFT JOIN documents
|
||||
ON value = documents.id
|
||||
WHERE (
|
||||
documents.id IS NOT NULL
|
||||
AND documents.synced = false
|
||||
AND documents.deleted = false
|
||||
AND (
|
||||
documents.synced = false
|
||||
OR documents.filepath IS NULL
|
||||
)
|
||||
)
|
||||
OR (documents.id IS NULL)
|
||||
OR CAST(?1 AS TEXT) != CAST(?1 AS TEXT)
|
||||
`
|
||||
|
||||
func (q *Queries) GetWantedDocuments(ctx context.Context, documentIds string) ([]string, error) {
|
||||
type GetWantedDocumentsRow struct {
|
||||
ID string `json:"id"`
|
||||
WantFile bool `json:"want_file"`
|
||||
WantMetadata bool `json:"want_metadata"`
|
||||
}
|
||||
|
||||
func (q *Queries) GetWantedDocuments(ctx context.Context, documentIds string) ([]GetWantedDocumentsRow, error) {
|
||||
rows, err := q.db.QueryContext(ctx, getWantedDocuments, documentIds)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer rows.Close()
|
||||
var items []string
|
||||
var items []GetWantedDocumentsRow
|
||||
for rows.Next() {
|
||||
var id string
|
||||
if err := rows.Scan(&id); err != nil {
|
||||
var i GetWantedDocumentsRow
|
||||
if err := rows.Scan(&i.ID, &i.WantFile, &i.WantMetadata); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
items = append(items, id)
|
||||
items = append(items, i)
|
||||
}
|
||||
if err := rows.Close(); err != nil {
|
||||
return nil, err
|
||||
|
||||
Reference in New Issue
Block a user