69 lines
2.1 KiB
Go
69 lines
2.1 KiB
Go
package repository
|
|
|
|
import (
|
|
"context"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
|
|
"billing/internal/collection"
|
|
)
|
|
|
|
func TestSQLiteUsageQueryAtMillionRows(t *testing.T) {
|
|
if os.Getenv("CPA_EXT_MILLION_TEST") != "1" {
|
|
t.Skip("set CPA_EXT_MILLION_TEST=1 to run the million-row query check")
|
|
}
|
|
store, err := OpenSQLiteUsage(filepath.Join(t.TempDir(), "usage.db"))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer store.Close()
|
|
started := time.Now()
|
|
_, err = store.db.Exec(`
|
|
WITH RECURSIVE sequence(value) AS (
|
|
SELECT 1 UNION ALL SELECT value+1 FROM sequence WHERE value<1000000
|
|
)
|
|
INSERT INTO request_detail_index
|
|
(lifecycle_request_id, requested_at, managed_key_id, model, result, auth_id, endpoint_kind, request_id)
|
|
SELECT 'load-' || value,
|
|
printf('2026-08-%02dT%02d:%02d:%02d.000000000Z', 1 + ((value / 86400) % 15), (value / 3600) % 24, (value / 60) % 60, value % 60),
|
|
'key-' || (value % 5), 'model-' || (value % 3),
|
|
CASE WHEN value % 17=0 THEN 'failed' ELSE 'succeeded' END,
|
|
'auth-' || (value % 2), 'responses', 'load-' || value
|
|
FROM sequence`)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
t.Logf("seeded one million indexed details in %s", time.Since(started))
|
|
|
|
started = time.Now()
|
|
page, err := store.QueryUsage(context.Background(), collection.UsageQuery{Page: 600, PageSize: 100, KeyID: "key-1", Model: "model-1"})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if page.Total == 0 || len(page.Records) == 0 {
|
|
t.Fatalf("deep filtered page is empty: %+v", page)
|
|
}
|
|
t.Logf("counted and loaded deep filtered page in %s", time.Since(started))
|
|
|
|
rows, err := store.db.Query(`EXPLAIN QUERY PLAN SELECT id FROM request_detail_index d WHERE d.managed_key_id=? ORDER BY d.requested_at DESC, d.id DESC LIMIT 100 OFFSET 900000`, "key-1")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer rows.Close()
|
|
var plan strings.Builder
|
|
for rows.Next() {
|
|
var id, parent, unused int
|
|
var detail string
|
|
if err := rows.Scan(&id, &parent, &unused, &detail); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
plan.WriteString(detail)
|
|
}
|
|
if !strings.Contains(plan.String(), "idx_request_detail_key") {
|
|
t.Fatalf("key query did not use projection index: %s", plan.String())
|
|
}
|
|
}
|