Query returns the set of releases that match the provided set of labels.
(labels map[string]string)
| 395 | |
| 396 | // Query returns the set of releases that match the provided set of labels. |
| 397 | func (s *SQL) Query(labels map[string]string) ([]release.Releaser, error) { |
| 398 | sb := s.statementBuilder. |
| 399 | Select(sqlReleaseTableKeyColumn, sqlReleaseTableNamespaceColumn, sqlReleaseTableBodyColumn). |
| 400 | From(sqlReleaseTableName) |
| 401 | |
| 402 | keys := make([]string, 0, len(labels)) |
| 403 | for key := range labels { |
| 404 | keys = append(keys, key) |
| 405 | } |
| 406 | sort.Strings(keys) |
| 407 | for _, key := range keys { |
| 408 | if _, ok := labelMap[key]; ok { |
| 409 | sb = sb.Where(sq.Eq{key: labels[key]}) |
| 410 | } else { |
| 411 | s.Logger().Debug("unknown label", "key", key) |
| 412 | return nil, fmt.Errorf("unknown label %s", key) |
| 413 | } |
| 414 | } |
| 415 | |
| 416 | // If a namespace was specified, we only list releases from that namespace |
| 417 | if s.namespace != "" { |
| 418 | sb = sb.Where(sq.Eq{sqlReleaseTableNamespaceColumn: s.namespace}) |
| 419 | } |
| 420 | |
| 421 | // Build our query |
| 422 | query, args, err := sb.ToSql() |
| 423 | if err != nil { |
| 424 | s.Logger().Debug("failed to build query", slog.Any("error", err)) |
| 425 | return nil, err |
| 426 | } |
| 427 | |
| 428 | var records = []SQLReleaseWrapper{} |
| 429 | if err := s.db.Select(&records, query, args...); err != nil { |
| 430 | s.Logger().Debug("failed to query with labels", slog.Any("error", err)) |
| 431 | return nil, err |
| 432 | } |
| 433 | |
| 434 | if len(records) == 0 { |
| 435 | return nil, ErrReleaseNotFound |
| 436 | } |
| 437 | |
| 438 | var releases []release.Releaser |
| 439 | for _, record := range records { |
| 440 | release, err := decodeRelease(record.Body) |
| 441 | if err != nil { |
| 442 | s.Logger().Debug("failed to decode release", slog.Any("record", record), slog.Any("error", err)) |
| 443 | continue |
| 444 | } |
| 445 | |
| 446 | if release.Labels, err = s.getReleaseCustomLabels(record.Key, record.Namespace); err != nil { |
| 447 | s.Logger().Debug( |
| 448 | "failed to get release custom labels", |
| 449 | slog.String("namespace", record.Namespace), |
| 450 | slog.String("key", record.Key), |
| 451 | slog.Any("error", err), |
| 452 | ) |
| 453 | return nil, err |
| 454 | } |
nothing calls this directly
no test coverage detected