mirror of
https://github.com/harness/drone.git
synced 2025-05-17 17:39:54 +08:00
feat: [CDE-353]: Adding gitspace instance store method to calculate active time for all gitspaces between a given time window and filtered by a list of space IDs. (#2748)
* feat: [CDE-353]: Adding gitspace instance store method to calculate active time for all gitspaces between a given time window and filtered by a list of space IDs.
This commit is contained in:
parent
077256b69c
commit
a1a4e3fe06
@ -681,6 +681,10 @@ type (
|
|||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
gitspaceConfigIDs []int64,
|
gitspaceConfigIDs []int64,
|
||||||
) ([]*types.GitspaceInstance, error)
|
) ([]*types.GitspaceInstance, error)
|
||||||
|
|
||||||
|
// FindTotalUsage calculates the total time used in millis for all the instances within the time window
|
||||||
|
// defined by fromTime and toTime.
|
||||||
|
FindTotalUsage(ctx context.Context, fromTime int64, toTime int64, spaceIDs []int64) (int64, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
InfraProviderConfigStore interface {
|
InfraProviderConfigStore interface {
|
||||||
|
@ -16,6 +16,7 @@ package database
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"database/sql"
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
@ -91,6 +92,64 @@ type gitspaceInstanceStore struct {
|
|||||||
db *sqlx.DB
|
db *sqlx.DB
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (g gitspaceInstanceStore) FindTotalUsage(
|
||||||
|
ctx context.Context,
|
||||||
|
fromTime int64,
|
||||||
|
toTime int64,
|
||||||
|
spaceIDs []int64,
|
||||||
|
) (int64, error) {
|
||||||
|
var greatest = "MAX"
|
||||||
|
var least = "MIN"
|
||||||
|
if g.db.DriverName() == "postgres" {
|
||||||
|
greatest = "GREATEST"
|
||||||
|
least = "LEAST"
|
||||||
|
}
|
||||||
|
innerQuery := squirrel.Select(
|
||||||
|
greatest+"(gits_active_time_started, ?) AS effective_start_time",
|
||||||
|
least+"(COALESCE(gits_active_time_ended, ?), ?) AS effective_end_time",
|
||||||
|
).
|
||||||
|
From(gitspaceInstanceTable).
|
||||||
|
Where(
|
||||||
|
squirrel.And{
|
||||||
|
squirrel.Lt{"gits_active_time_started": toTime},
|
||||||
|
squirrel.Or{
|
||||||
|
squirrel.Expr("gits_active_time_ended IS NULL"),
|
||||||
|
squirrel.Gt{"gits_active_time_ended": fromTime},
|
||||||
|
},
|
||||||
|
squirrel.Eq{"gits_space_id": spaceIDs},
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
innerQry, innerArgs, err := innerQuery.ToSql()
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
query := squirrel.
|
||||||
|
Select("SUM(effective_end_time - effective_start_time) AS total_active_time").
|
||||||
|
From("(" + innerQry + ") AS subquery").PlaceholderFormat(squirrel.Dollar)
|
||||||
|
|
||||||
|
qry, _, err := query.ToSql()
|
||||||
|
if err != nil {
|
||||||
|
return 0, errors.Wrap(err, "Failed to convert squirrel builder to sql")
|
||||||
|
}
|
||||||
|
|
||||||
|
args := append([]any{fromTime, toTime, toTime}, innerArgs...)
|
||||||
|
|
||||||
|
var totalActiveTime sql.NullInt64
|
||||||
|
db := dbtx.GetAccessor(ctx, g.db)
|
||||||
|
err = db.GetContext(ctx, &totalActiveTime, qry, args...)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if totalActiveTime.Valid {
|
||||||
|
return totalActiveTime.Int64, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (g gitspaceInstanceStore) Find(ctx context.Context, id int64) (*types.GitspaceInstance, error) {
|
func (g gitspaceInstanceStore) Find(ctx context.Context, id int64) (*types.GitspaceInstance, error) {
|
||||||
stmt := database.Builder.
|
stmt := database.Builder.
|
||||||
Select(gitspaceInstanceSelectColumns).
|
Select(gitspaceInstanceSelectColumns).
|
||||||
|
Loading…
Reference in New Issue
Block a user