SuggestAttrs returns attribute key or key=value suggestions.
( query string, productIDs []string, productAttrs map[string][]string, attributeValues map[string]map[string][]string, selectedTags []string, )
| 333 | |
| 334 | // SuggestAttrs returns attribute key or key=value suggestions. |
| 335 | func SuggestAttrs( |
| 336 | query string, |
| 337 | productIDs []string, |
| 338 | productAttrs map[string][]string, |
| 339 | attributeValues map[string]map[string][]string, |
| 340 | selectedTags []string, |
| 341 | ) []SuggestionItem { |
| 342 | q := strings.ToLower(query) |
| 343 | |
| 344 | if strings.Contains(q, "=") { |
| 345 | // Phase 2: value selection |
| 346 | parts := strings.SplitN(q, "=", 2) |
| 347 | keyFilter := parts[0] |
| 348 | valFilter := parts[1] |
| 349 | |
| 350 | valSet := map[string]struct{}{} |
| 351 | for _, pid := range productIDs { |
| 352 | if attrs, ok := attributeValues[pid]; ok { |
| 353 | for attrName, vals := range attrs { |
| 354 | if strings.ToLower(attrName) == keyFilter { |
| 355 | for _, v := range vals { |
| 356 | valSet[v] = struct{}{} |
| 357 | } |
| 358 | } |
| 359 | } |
| 360 | } |
| 361 | } |
| 362 | |
| 363 | values := make([]string, 0, len(valSet)) |
| 364 | for v := range valSet { |
| 365 | values = append(values, v) |
| 366 | } |
| 367 | |
| 368 | allNumeric := len(values) > 0 |
| 369 | for _, v := range values { |
| 370 | if _, err := strconv.ParseFloat(v, 64); err != nil { |
| 371 | allNumeric = false |
| 372 | break |
| 373 | } |
| 374 | } |
| 375 | if allNumeric { |
| 376 | sort.Slice(values, func(i, j int) bool { |
| 377 | a, _ := strconv.ParseFloat(values[i], 64) |
| 378 | b, _ := strconv.ParseFloat(values[j], 64) |
| 379 | return a < b |
| 380 | }) |
| 381 | } else { |
| 382 | sort.Slice(values, func(i, j int) bool { |
| 383 | return strings.ToLower(values[i]) < strings.ToLower(values[j]) |
| 384 | }) |
| 385 | } |
| 386 | |
| 387 | var items []SuggestionItem |
| 388 | for _, val := range values { |
| 389 | if valFilter != "" && !strings.Contains(strings.ToLower(val), valFilter) { |
| 390 | continue |
| 391 | } |
| 392 | tagVal := keyFilter + "=" + val |