diff --git a/internal/repository/job.go b/internal/repository/job.go index 8f00124..b712a86 100644 --- a/internal/repository/job.go +++ b/internal/repository/job.go @@ -10,7 +10,6 @@ import ( "encoding/json" "errors" "fmt" - "math" "strconv" "sync" "time" @@ -18,7 +17,6 @@ import ( "github.com/ClusterCockpit/cc-backend/internal/auth" "github.com/ClusterCockpit/cc-backend/internal/graph/model" "github.com/ClusterCockpit/cc-backend/internal/metricdata" - "github.com/ClusterCockpit/cc-backend/internal/util" "github.com/ClusterCockpit/cc-backend/pkg/log" "github.com/ClusterCockpit/cc-backend/pkg/lrucache" "github.com/ClusterCockpit/cc-backend/pkg/schema" @@ -318,7 +316,7 @@ func (r *JobRepository) FindConcurrentJobs( stopTime = startTime + int64(job.Duration) } - // Add 5m overlap for jobs start time at the end + // Add 200s overlap for jobs start time at the end startTimeTail := startTime + 10 stopTimeTail := stopTime - 200 startTimeFront := startTime + 200 @@ -338,8 +336,7 @@ func (r *JobRepository) FindConcurrentJobs( } items := make([]*model.JobLink, 0, 10) - minStart := int64(math.MaxInt64) - maxStart := int64(0) + queryString := fmt.Sprintf("cluster=%s", job.Cluster) for rows.Next() { var id, jobId, startTime sql.NullInt64 @@ -350,9 +347,7 @@ func (r *JobRepository) FindConcurrentJobs( } if id.Valid { - minStart = util.Min(minStart, startTime.Int64) - maxStart = util.Max(maxStart, startTime.Int64) - + queryString += fmt.Sprintf("&jobId=%d", int(jobId.Int64)) items = append(items, &model.JobLink{ ID: fmt.Sprint(id.Int64), @@ -376,9 +371,7 @@ func (r *JobRepository) FindConcurrentJobs( } if id.Valid { - minStart = util.Min(minStart, startTime.Int64) - maxStart = util.Max(maxStart, startTime.Int64) - + queryString += fmt.Sprintf("&jobId=%d", int(jobId.Int64)) items = append(items, &model.JobLink{ ID: fmt.Sprint(id.Int64), @@ -388,8 +381,6 @@ func (r *JobRepository) FindConcurrentJobs( } cnt := len(items) - queryString := fmt.Sprintf("cluster=%s&startTime=%d-%d&node=%s", - job.Cluster, minStart, maxStart, hostname) return &model.JobLinkResultList{ ListQuery: &queryString, diff --git a/internal/repository/query.go b/internal/repository/query.go index d6a9c75..02e5304 100644 --- a/internal/repository/query.go +++ b/internal/repository/query.go @@ -263,11 +263,11 @@ func buildStringCondition(field string, cond *model.StringInput, query sq.Select return query.Where(field+" LIKE ?", fmt.Sprint("%", *cond.Contains, "%")) } if cond.In != nil { - queryUsers := make([]string, len(cond.In)) + queryElements := make([]string, len(cond.In)) for i, val := range cond.In { - queryUsers[i] = val + queryElements[i] = val } - return query.Where(sq.Or{sq.Eq{"job.user": queryUsers}}) + return query.Where(sq.Or{sq.Eq{field: queryElements}}) } return query } diff --git a/internal/routerConfig/routes.go b/internal/routerConfig/routes.go index c6b777c..351941a 100644 --- a/internal/routerConfig/routes.go +++ b/internal/routerConfig/routes.go @@ -208,7 +208,13 @@ func buildFilterPresets(query url.Values) map[string]interface{} { } } if query.Get("jobId") != "" { - filterPresets["jobId"] = query.Get("jobId") + if len(query["jobId"]) == 1 { + filterPresets["jobId"] = query.Get("jobId") + filterPresets["jobIdMatch"] = "eq" + } else { + filterPresets["jobId"] = query["jobId"] + filterPresets["jobIdMatch"] = "in" + } } if query.Get("arrayJobId") != "" { if num, err := strconv.Atoi(query.Get("arrayJobId")); err == nil { diff --git a/web/frontend/src/filters/Filters.svelte b/web/frontend/src/filters/Filters.svelte index f05a4cd..38d7e7a 100644 --- a/web/frontend/src/filters/Filters.svelte +++ b/web/frontend/src/filters/Filters.svelte @@ -32,8 +32,9 @@ export let startTimeQuickSelect = false let filters = { - projectMatch: filterPresets.projectMatch || 'contains', - userMatch: filterPresets.userMatch || 'contains', + projectMatch: filterPresets.projectMatch || 'contains', + userMatch: filterPresets.userMatch || 'contains', + jobIdMatch: filterPresets.jobIdMatch || 'eq', cluster: filterPresets.cluster || null, partition: filterPresets.partition || null, @@ -88,7 +89,7 @@ if (filters.duration.from || filters.duration.to) items.push({ duration: { from: filters.duration.from, to: filters.duration.to } }) if (filters.jobId) - items.push({ jobId: { eq: filters.jobId } }) + items.push({ jobId: { [filters.jobIdMatch]: filters.jobId } }) if (filters.arrayJobId != null) items.push({ arrayJobId: filters.arrayJobId }) if (filters.numNodes.from != null || filters.numNodes.to != null) @@ -130,6 +131,15 @@ // } else { opts.push(`startTime=${dateToUnixEpoch(filters.startTime.from)}-${dateToUnixEpoch(filters.startTime.to)}`) // } + if (filters.jobId.length != 0) + if (filters.jobIdMatch != 'in') { + opts.push(`jobId=${filters.jobId}`) + } else { + for (let singleJobId of filters.jobId) + opts.push(`jobId=${singleJobId}`) + } + if (filters.jobIdMatch != 'eq') + opts.push(`jobIdMatch=${filters.jobIdMatch}`) for (let tag of filters.tags) opts.push(`tag=${tag}`) if (filters.duration.from && filters.duration.to)