1// Copyright 2020 The Prometheus Authors
2// Licensed under the Apache License, Version 2.0 (the "License");
3// you may not use this file except in compliance with the License.
4// You may obtain a copy of the License at
5//
6// http://www.apache.org/licenses/LICENSE-2.0
7//
8// Unless required by applicable law or agreed to in writing, software
9// distributed under the License is distributed on an "AS IS" BASIS,
10// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11// See the License for the specific language governing permissions and
12// limitations under the License.
13
14// This file holds boilerplate adapters for generic MergeSeriesSet and MergeQuerier functions, so we can have one optimized
15// solution that works for both ChunkSeriesSet as well as SeriesSet.
16
17package storage
18
19import (
20	"github.com/prometheus/prometheus/pkg/labels"
21)
22
23type genericQuerier interface {
24	LabelQuerier
25	Select(bool, *SelectHints, ...*labels.Matcher) genericSeriesSet
26}
27
28type genericSeriesSet interface {
29	Next() bool
30	At() Labels
31	Err() error
32	Warnings() Warnings
33}
34
35type genericSeriesMergeFunc func(...Labels) Labels
36
37type genericSeriesSetAdapter struct {
38	SeriesSet
39}
40
41func (a *genericSeriesSetAdapter) At() Labels {
42	return a.SeriesSet.At()
43}
44
45type genericChunkSeriesSetAdapter struct {
46	ChunkSeriesSet
47}
48
49func (a *genericChunkSeriesSetAdapter) At() Labels {
50	return a.ChunkSeriesSet.At()
51}
52
53type genericQuerierAdapter struct {
54	LabelQuerier
55
56	// One-of. If both are set, Querier will be used.
57	q  Querier
58	cq ChunkQuerier
59}
60
61func (q *genericQuerierAdapter) Select(sortSeries bool, hints *SelectHints, matchers ...*labels.Matcher) genericSeriesSet {
62	if q.q != nil {
63		return &genericSeriesSetAdapter{q.q.Select(sortSeries, hints, matchers...)}
64	}
65	return &genericChunkSeriesSetAdapter{q.cq.Select(sortSeries, hints, matchers...)}
66}
67
68func newGenericQuerierFrom(q Querier) genericQuerier {
69	return &genericQuerierAdapter{LabelQuerier: q, q: q}
70}
71
72func newGenericQuerierFromChunk(cq ChunkQuerier) genericQuerier {
73	return &genericQuerierAdapter{LabelQuerier: cq, cq: cq}
74}
75
76type querierAdapter struct {
77	genericQuerier
78}
79
80type seriesSetAdapter struct {
81	genericSeriesSet
82}
83
84func (a *seriesSetAdapter) At() Series {
85	return a.genericSeriesSet.At().(Series)
86}
87
88func (q *querierAdapter) Select(sortSeries bool, hints *SelectHints, matchers ...*labels.Matcher) SeriesSet {
89	return &seriesSetAdapter{q.genericQuerier.Select(sortSeries, hints, matchers...)}
90}
91
92type chunkQuerierAdapter struct {
93	genericQuerier
94}
95
96type chunkSeriesSetAdapter struct {
97	genericSeriesSet
98}
99
100func (a *chunkSeriesSetAdapter) At() ChunkSeries {
101	return a.genericSeriesSet.At().(ChunkSeries)
102}
103
104func (q *chunkQuerierAdapter) Select(sortSeries bool, hints *SelectHints, matchers ...*labels.Matcher) ChunkSeriesSet {
105	return &chunkSeriesSetAdapter{q.genericQuerier.Select(sortSeries, hints, matchers...)}
106}
107
108type seriesMergerAdapter struct {
109	VerticalSeriesMergeFunc
110}
111
112func (a *seriesMergerAdapter) Merge(s ...Labels) Labels {
113	buf := make([]Series, 0, len(s))
114	for _, ser := range s {
115		buf = append(buf, ser.(Series))
116	}
117	return a.VerticalSeriesMergeFunc(buf...)
118}
119
120type chunkSeriesMergerAdapter struct {
121	VerticalChunkSeriesMergeFunc
122}
123
124func (a *chunkSeriesMergerAdapter) Merge(s ...Labels) Labels {
125	buf := make([]ChunkSeries, 0, len(s))
126	for _, ser := range s {
127		buf = append(buf, ser.(ChunkSeries))
128	}
129	return a.VerticalChunkSeriesMergeFunc(buf...)
130}
131
132type noopGenericSeriesSet struct{}
133
134func (noopGenericSeriesSet) Next() bool { return false }
135
136func (noopGenericSeriesSet) At() Labels { return nil }
137
138func (noopGenericSeriesSet) Err() error { return nil }
139
140func (noopGenericSeriesSet) Warnings() Warnings { return nil }
141