feat(search): support platform and benchmark config filters
Some checks failed
Build and Publish Docker Image / deploy (push) Failing after 1m2s
Some checks failed
Build and Publish Docker Image / deploy (push) Failing after 1m2s
Add platform handling to submissions and persist a normalized value (`windows`, `linux`, `macos`) with a default of `windows` when omitted. Extend search/index filtering to support `thread`, `platform`, `intensity`, and `durationSecs` alongside existing text/CPU token matching, and wire these params through request parsing, page data, and navigation URLs. Update API/README docs and examples to reflect the new submission inputs and search capabilities so users can run more precise queries.feat(search): support platform and benchmark config filters Add platform handling to submissions and persist a normalized value (`windows`, `linux`, `macos`) with a default of `windows` when omitted. Extend search/index filtering to support `thread`, `platform`, `intensity`, and `durationSecs` alongside existing text/CPU token matching, and wire these params through request parsing, page data, and navigation URLs. Update API/README docs and examples to reflect the new submission inputs and search capabilities so users can run more precise queries.
This commit is contained in:
@@ -21,6 +21,10 @@ type indexedSubmission struct {
|
||||
submission *model.Submission
|
||||
searchText string
|
||||
cpuText string
|
||||
platform string
|
||||
threadMode string
|
||||
intensity int
|
||||
duration int
|
||||
}
|
||||
|
||||
type Store struct {
|
||||
@@ -61,10 +65,11 @@ func (s *Store) Count() int {
|
||||
return len(s.orderedIDs)
|
||||
}
|
||||
|
||||
func (s *Store) SaveSubmission(result model.BenchmarkResult, submitter string) (*model.Submission, error) {
|
||||
func (s *Store) SaveSubmission(result model.BenchmarkResult, submitter, platform string) (*model.Submission, error) {
|
||||
submission := &model.Submission{
|
||||
SubmissionID: uuid.NewString(),
|
||||
Submitter: model.NormalizeSubmitter(submitter),
|
||||
Platform: model.NormalizePlatform(platform),
|
||||
SubmittedAt: time.Now().UTC(),
|
||||
BenchmarkResult: result,
|
||||
}
|
||||
@@ -111,9 +116,11 @@ func (s *Store) ListSubmissions(page, pageSize int) ([]model.Submission, int) {
|
||||
return results, total
|
||||
}
|
||||
|
||||
func (s *Store) SearchSubmissions(text, cpu string) []model.Submission {
|
||||
func (s *Store) SearchSubmissions(text, cpu, thread, platform string, intensity, durationSecs int) []model.Submission {
|
||||
queryText := normalizeSearchText(text)
|
||||
cpuText := normalizeSearchText(cpu)
|
||||
thread = normalizeThreadFilter(thread)
|
||||
platform = normalizePlatformFilter(platform)
|
||||
|
||||
s.mu.RLock()
|
||||
defer s.mu.RUnlock()
|
||||
@@ -133,6 +140,22 @@ func (s *Store) SearchSubmissions(text, cpu string) []model.Submission {
|
||||
continue
|
||||
}
|
||||
|
||||
if thread != "" && record.threadMode != thread {
|
||||
continue
|
||||
}
|
||||
|
||||
if platform != "" && record.platform != platform {
|
||||
continue
|
||||
}
|
||||
|
||||
if intensity > 0 && record.intensity != intensity {
|
||||
continue
|
||||
}
|
||||
|
||||
if durationSecs > 0 && record.duration != durationSecs {
|
||||
continue
|
||||
}
|
||||
|
||||
results = append(results, *model.CloneSubmission(record.submission))
|
||||
}
|
||||
|
||||
@@ -173,6 +196,10 @@ func newIndexedSubmission(submission *model.Submission) *indexedSubmission {
|
||||
submission: model.CloneSubmission(submission),
|
||||
searchText: buildSearchText(submission),
|
||||
cpuText: normalizeSearchText(submission.CPUInfo.BrandString),
|
||||
platform: model.NormalizePlatform(submission.Platform),
|
||||
threadMode: normalizeThreadMode(submission.Config.MultiCore),
|
||||
intensity: submission.Config.Intensity,
|
||||
duration: submission.Config.DurationSecs,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -180,10 +207,12 @@ func buildSearchText(submission *model.Submission) string {
|
||||
parts := []string{
|
||||
submission.SubmissionID,
|
||||
submission.Submitter,
|
||||
submission.Platform,
|
||||
submission.CPUInfo.BrandString,
|
||||
submission.CPUInfo.VendorID,
|
||||
model.ThreadModeLabel(submission.Config.MultiCore),
|
||||
strconv.Itoa(submission.Config.DurationSecs),
|
||||
strconv.Itoa(submission.Config.Intensity),
|
||||
strconv.Itoa(submission.CPUInfo.PhysicalCores),
|
||||
strconv.Itoa(submission.CPUInfo.LogicalCores),
|
||||
strconv.FormatInt(submission.Duration, 10),
|
||||
@@ -231,6 +260,42 @@ func matchesSearch(target, query string) bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func normalizeThreadFilter(value string) string {
|
||||
switch strings.ToLower(strings.TrimSpace(value)) {
|
||||
case "", "all":
|
||||
return ""
|
||||
case "single":
|
||||
return "single"
|
||||
case "multi":
|
||||
return "multi"
|
||||
default:
|
||||
return ""
|
||||
}
|
||||
}
|
||||
|
||||
func normalizeThreadMode(multiCore bool) string {
|
||||
if multiCore {
|
||||
return "multi"
|
||||
}
|
||||
|
||||
return "single"
|
||||
}
|
||||
|
||||
func normalizePlatformFilter(value string) string {
|
||||
switch strings.ToLower(strings.TrimSpace(value)) {
|
||||
case "", "all":
|
||||
return ""
|
||||
case "windows":
|
||||
return "windows"
|
||||
case "linux":
|
||||
return "linux"
|
||||
case "macos":
|
||||
return "macos"
|
||||
default:
|
||||
return ""
|
||||
}
|
||||
}
|
||||
|
||||
func pageBounds(page, pageSize, total int) (int, int, int) {
|
||||
if pageSize <= 0 {
|
||||
pageSize = 50
|
||||
|
||||
Reference in New Issue
Block a user