@@ -24,30 +24,12 @@ func NewPostgreSQLReader(pool *pgxpool.Pool) (*PostgreSQLReader, error) {
2424
2525// GetSummary returns aggregated usage statistics for the given query parameters.
2626func (r * PostgreSQLReader ) GetSummary (ctx context.Context , params UsageQueryParams ) (* UsageSummary , error ) {
27- var query string
28- var args []interface {}
29-
30- startZero := params .StartDate .IsZero ()
31- endZero := params .EndDate .IsZero ()
27+ conditions , args , _ := pgDateRangeConditions (params , 1 )
28+ where := buildWhereClause (conditions )
3229
3330 costCols := `, COALESCE(SUM(input_cost),0), COALESCE(SUM(output_cost),0), COALESCE(SUM(total_cost),0)`
34-
35- if ! startZero && ! endZero {
36- query = `SELECT COUNT(*), COALESCE(SUM(input_tokens), 0), COALESCE(SUM(output_tokens), 0), COALESCE(SUM(total_tokens), 0)` + costCols + `
37- FROM "usage" WHERE timestamp >= $1 AND timestamp < $2`
38- args = append (args , params .StartDate .UTC (), params .EndDate .AddDate (0 , 0 , 1 ).UTC ())
39- } else if ! startZero {
40- query = `SELECT COUNT(*), COALESCE(SUM(input_tokens), 0), COALESCE(SUM(output_tokens), 0), COALESCE(SUM(total_tokens), 0)` + costCols + `
41- FROM "usage" WHERE timestamp >= $1`
42- args = append (args , params .StartDate .UTC ())
43- } else if ! endZero {
44- query = `SELECT COUNT(*), COALESCE(SUM(input_tokens), 0), COALESCE(SUM(output_tokens), 0), COALESCE(SUM(total_tokens), 0)` + costCols + `
45- FROM "usage" WHERE timestamp < $1`
46- args = append (args , params .EndDate .AddDate (0 , 0 , 1 ).UTC ())
47- } else {
48- query = `SELECT COUNT(*), COALESCE(SUM(input_tokens), 0), COALESCE(SUM(output_tokens), 0), COALESCE(SUM(total_tokens), 0)` + costCols + `
49- FROM "usage"`
50- }
31+ query := `SELECT COUNT(*), COALESCE(SUM(input_tokens), 0), COALESCE(SUM(output_tokens), 0), COALESCE(SUM(total_tokens), 0)` + costCols + `
32+ FROM "usage"` + where
5133
5234 summary := & UsageSummary {}
5335 err := r .pool .QueryRow (ctx , query , args ... ).Scan (
@@ -63,30 +45,12 @@ func (r *PostgreSQLReader) GetSummary(ctx context.Context, params UsageQueryPara
6345
6446// GetUsageByModel returns token and cost totals grouped by model and provider.
6547func (r * PostgreSQLReader ) GetUsageByModel (ctx context.Context , params UsageQueryParams ) ([]ModelUsage , error ) {
66- var query string
67- var args []interface {}
68-
69- startZero := params .StartDate .IsZero ()
70- endZero := params .EndDate .IsZero ()
48+ conditions , args , _ := pgDateRangeConditions (params , 1 )
49+ where := buildWhereClause (conditions )
7150
7251 costCols := `, COALESCE(SUM(input_cost),0), COALESCE(SUM(output_cost),0), COALESCE(SUM(total_cost),0)`
73-
74- if ! startZero && ! endZero {
75- query = `SELECT model, provider, COALESCE(SUM(input_tokens), 0), COALESCE(SUM(output_tokens), 0)` + costCols + `
76- FROM "usage" WHERE timestamp >= $1 AND timestamp < $2 GROUP BY model, provider`
77- args = append (args , params .StartDate .UTC (), params .EndDate .AddDate (0 , 0 , 1 ).UTC ())
78- } else if ! startZero {
79- query = `SELECT model, provider, COALESCE(SUM(input_tokens), 0), COALESCE(SUM(output_tokens), 0)` + costCols + `
80- FROM "usage" WHERE timestamp >= $1 GROUP BY model, provider`
81- args = append (args , params .StartDate .UTC ())
82- } else if ! endZero {
83- query = `SELECT model, provider, COALESCE(SUM(input_tokens), 0), COALESCE(SUM(output_tokens), 0)` + costCols + `
84- FROM "usage" WHERE timestamp < $1 GROUP BY model, provider`
85- args = append (args , params .EndDate .AddDate (0 , 0 , 1 ).UTC ())
86- } else {
87- query = `SELECT model, provider, COALESCE(SUM(input_tokens), 0), COALESCE(SUM(output_tokens), 0)` + costCols + `
88- FROM "usage" GROUP BY model, provider`
89- }
52+ query := `SELECT model, provider, COALESCE(SUM(input_tokens), 0), COALESCE(SUM(output_tokens), 0)` + costCols + `
53+ FROM "usage"` + where + ` GROUP BY model, provider`
9054
9155 rows , err := r .pool .Query (ctx , query , args ... )
9256 if err != nil {
@@ -114,29 +78,7 @@ func (r *PostgreSQLReader) GetUsageByModel(ctx context.Context, params UsageQuer
11478func (r * PostgreSQLReader ) GetUsageLog (ctx context.Context , params UsageLogParams ) (* UsageLogResult , error ) {
11579 limit , offset := clampLimitOffset (params .Limit , params .Offset )
11680
117- var conditions []string
118- var args []interface {}
119- argIdx := 1
120-
121- startZero := params .StartDate .IsZero ()
122- endZero := params .EndDate .IsZero ()
123-
124- if ! startZero && ! endZero {
125- conditions = append (conditions , fmt .Sprintf ("timestamp >= $%d" , argIdx ))
126- args = append (args , params .StartDate .UTC ())
127- argIdx ++
128- conditions = append (conditions , fmt .Sprintf ("timestamp < $%d" , argIdx ))
129- args = append (args , params .EndDate .AddDate (0 , 0 , 1 ).UTC ())
130- argIdx ++
131- } else if ! startZero {
132- conditions = append (conditions , fmt .Sprintf ("timestamp >= $%d" , argIdx ))
133- args = append (args , params .StartDate .UTC ())
134- argIdx ++
135- } else if ! endZero {
136- conditions = append (conditions , fmt .Sprintf ("timestamp < $%d" , argIdx ))
137- args = append (args , params .EndDate .AddDate (0 , 0 , 1 ).UTC ())
138- argIdx ++
139- }
81+ conditions , args , argIdx := pgDateRangeConditions (params .UsageQueryParams , 1 )
14082
14183 if params .Model != "" {
14284 conditions = append (conditions , fmt .Sprintf ("model = $%d" , argIdx ))
@@ -204,6 +146,23 @@ func (r *PostgreSQLReader) GetUsageLog(ctx context.Context, params UsageLogParam
204146 }, nil
205147}
206148
149+ // pgDateRangeConditions returns WHERE conditions and args for a date range.
150+ // argIdx is the starting $N placeholder index; nextIdx is the next available index.
151+ func pgDateRangeConditions (params UsageQueryParams , argIdx int ) (conditions []string , args []interface {}, nextIdx int ) {
152+ nextIdx = argIdx
153+ if ! params .StartDate .IsZero () {
154+ conditions = append (conditions , fmt .Sprintf ("timestamp >= $%d" , nextIdx ))
155+ args = append (args , params .StartDate .UTC ())
156+ nextIdx ++
157+ }
158+ if ! params .EndDate .IsZero () {
159+ conditions = append (conditions , fmt .Sprintf ("timestamp < $%d" , nextIdx ))
160+ args = append (args , params .EndDate .AddDate (0 , 0 , 1 ).UTC ())
161+ nextIdx ++
162+ }
163+ return conditions , args , nextIdx
164+ }
165+
207166func pgGroupExpr (interval string ) string {
208167 switch interval {
209168 case "weekly" :
@@ -225,22 +184,8 @@ func (r *PostgreSQLReader) GetDailyUsage(ctx context.Context, params UsageQueryP
225184 }
226185 groupExpr := pgGroupExpr (interval )
227186
228- var where string
229- var args []interface {}
230-
231- startZero := params .StartDate .IsZero ()
232- endZero := params .EndDate .IsZero ()
233-
234- if ! startZero && ! endZero {
235- where = ` WHERE timestamp >= $1 AND timestamp < $2`
236- args = append (args , params .StartDate .UTC (), params .EndDate .AddDate (0 , 0 , 1 ).UTC ())
237- } else if ! startZero {
238- where = ` WHERE timestamp >= $1`
239- args = append (args , params .StartDate .UTC ())
240- } else if ! endZero {
241- where = ` WHERE timestamp < $1`
242- args = append (args , params .EndDate .AddDate (0 , 0 , 1 ).UTC ())
243- }
187+ conditions , args , _ := pgDateRangeConditions (params , 1 )
188+ where := buildWhereClause (conditions )
244189
245190 query := fmt .Sprintf (`SELECT %s as period, COUNT(*), COALESCE(SUM(input_tokens), 0), COALESCE(SUM(output_tokens), 0), COALESCE(SUM(total_tokens), 0)
246191 FROM "usage"%s GROUP BY %s ORDER BY period` , groupExpr , where , groupExpr )
0 commit comments