| 161 | } |
| 162 | |
| 163 | func getCardinalityForLimitsPerLabelSet(ctx context.Context, numSeries uint64, ir tsdb.IndexReader, allLimits []validation.LimitsPerLabelSet, limit validation.LimitsPerLabelSet) (int, error) { |
| 164 | // Easy path with explicit labels. |
| 165 | if limit.LabelSet.Len() > 0 { |
| 166 | p, err := getPostingForLabels(ctx, ir, limit.LabelSet) |
| 167 | if err != nil { |
| 168 | return 0, err |
| 169 | } |
| 170 | return getPostingCardinality(p) |
| 171 | } |
| 172 | |
| 173 | // Default partition needs to get cardinality of all series that doesn't belong to any existing partitions. |
| 174 | postings := make([]index.Postings, 0, len(allLimits)-1) |
| 175 | for _, l := range allLimits { |
| 176 | if l.Hash == limit.Hash { |
| 177 | continue |
| 178 | } |
| 179 | p, err := getPostingForLabels(ctx, ir, l.LabelSet) |
| 180 | if err != nil { |
| 181 | return 0, err |
| 182 | } |
| 183 | postings = append(postings, p) |
| 184 | } |
| 185 | mergedCardinality, err := getPostingCardinality(index.Merge(ctx, postings...)) |
| 186 | if err != nil { |
| 187 | return 0, err |
| 188 | } |
| 189 | |
| 190 | return int(numSeries) - mergedCardinality, nil |
| 191 | } |
| 192 | |
| 193 | func getPostingForLabels(ctx context.Context, ir tsdb.IndexReader, lbls labels.Labels) (index.Postings, error) { |
| 194 | postings := make([]index.Postings, 0, lbls.Len()) |