// Copyright 2020 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // This file holds boilerplate adapters for generic MergeSeriesSet and MergeQuerier functions, so we can have one optimized // solution that works for both ChunkSeriesSet as well as SeriesSet. package storage import ( "context" "github.com/prometheus/prometheus/model/labels" ) type genericQuerier interface { LabelQuerier Select(context.Context, bool, *SelectHints, ...*labels.Matcher) genericSeriesSet } type genericSeriesSet interface { Next() bool At() Labels Err() error Warnings() Warnings } type genericSeriesMergeFunc func(...Labels) Labels type genericSeriesSetAdapter struct { SeriesSet } func (a *genericSeriesSetAdapter) At() Labels { return a.SeriesSet.At() } type genericChunkSeriesSetAdapter struct { ChunkSeriesSet } func (a *genericChunkSeriesSetAdapter) At() Labels { return a.ChunkSeriesSet.At() } type genericQuerierAdapter struct { LabelQuerier // One-of. If both are set, Querier will be used. q Querier cq ChunkQuerier } func (q *genericQuerierAdapter) Select(ctx context.Context, sortSeries bool, hints *SelectHints, matchers ...*labels.Matcher) genericSeriesSet { if q.q != nil { return &genericSeriesSetAdapter{q.q.Select(ctx, sortSeries, hints, matchers...)} } return &genericChunkSeriesSetAdapter{q.cq.Select(ctx, sortSeries, hints, matchers...)} } func newGenericQuerierFrom(q Querier) genericQuerier { return &genericQuerierAdapter{LabelQuerier: q, q: q} } func newGenericQuerierFromChunk(cq ChunkQuerier) genericQuerier { return &genericQuerierAdapter{LabelQuerier: cq, cq: cq} } type querierAdapter struct { genericQuerier } type seriesSetAdapter struct { genericSeriesSet } func (a *seriesSetAdapter) At() Series { return a.genericSeriesSet.At().(Series) } func (q *querierAdapter) Select(ctx context.Context, sortSeries bool, hints *SelectHints, matchers ...*labels.Matcher) SeriesSet { return &seriesSetAdapter{q.genericQuerier.Select(ctx, sortSeries, hints, matchers...)} } type chunkQuerierAdapter struct { genericQuerier } type chunkSeriesSetAdapter struct { genericSeriesSet } func (a *chunkSeriesSetAdapter) At() ChunkSeries { return a.genericSeriesSet.At().(ChunkSeries) } func (q *chunkQuerierAdapter) Select(ctx context.Context, sortSeries bool, hints *SelectHints, matchers ...*labels.Matcher) ChunkSeriesSet { return &chunkSeriesSetAdapter{q.genericQuerier.Select(ctx, sortSeries, hints, matchers...)} } type seriesMergerAdapter struct { VerticalSeriesMergeFunc } func (a *seriesMergerAdapter) Merge(s ...Labels) Labels { buf := make([]Series, 0, len(s)) for _, ser := range s { buf = append(buf, ser.(Series)) } return a.VerticalSeriesMergeFunc(buf...) } type chunkSeriesMergerAdapter struct { VerticalChunkSeriesMergeFunc } func (a *chunkSeriesMergerAdapter) Merge(s ...Labels) Labels { buf := make([]ChunkSeries, 0, len(s)) for _, ser := range s { buf = append(buf, ser.(ChunkSeries)) } return a.VerticalChunkSeriesMergeFunc(buf...) } type noopGenericSeriesSet struct{} func (noopGenericSeriesSet) Next() bool { return false } func (noopGenericSeriesSet) At() Labels { return nil } func (noopGenericSeriesSet) Err() error { return nil } func (noopGenericSeriesSet) Warnings() Warnings { return nil }