@@ -70,33 +70,15 @@ func (f *FrostDB) Query() error {
70
70
}
71
71
72
72
func (f * FrostQuerier ) LabelValues (name string , matchers ... * labels.Matcher ) ([]string , storage.Warnings , error ) {
73
- exprs := []logicalplan.Expr {}
74
- // Build a filter from matchers
75
- for _ , matcher := range matchers {
76
- switch matcher .Type {
77
- case labels .MatchEqual :
78
- exprs = append (exprs , logicalplan .Col ("labels." + matcher .Name ).Eq (logicalplan .Literal (matcher .Value )))
79
- case labels .MatchNotEqual :
80
- exprs = append (exprs , logicalplan .Col ("labels." + matcher .Name ).NotEq (logicalplan .Literal (matcher .Value )))
81
- case labels .MatchRegexp :
82
- exprs = append (exprs , logicalplan .Col ("labels." + matcher .Name ).RegexMatch (matcher .Value ))
83
- case labels .MatchNotRegexp :
84
- exprs = append (exprs , logicalplan .Col ("labels." + matcher .Name ).RegexNotMatch (matcher .Value ))
85
- }
86
- }
87
-
88
73
engine := query .NewEngine (
89
74
memory .NewGoAllocator (),
90
75
f .db .TableProvider (),
91
76
)
92
77
93
- bld := engine .ScanTable ("metrics" )
94
- if len (exprs ) != 0 {
95
- bld .Filter (logicalplan .And (exprs ... ))
96
- }
97
-
98
78
sets := map [uint64 ]* series {}
99
- err := bld .Distinct (logicalplan .Col ("labels." + name )).
79
+ err := engine .ScanTable ("metrics" ).
80
+ Filter (promMatchersToFrostDBExprs (matchers )).
81
+ Distinct (logicalplan .Col ("labels." + name )).
100
82
Execute (context .Background (), func (ar arrow.Record ) error {
101
83
defer ar .Release ()
102
84
parseRecordIntoSeriesSet (ar , sets )
@@ -117,9 +99,8 @@ func (f *FrostQuerier) LabelValues(name string, matchers ...*labels.Matcher) ([]
117
99
return names , nil , nil
118
100
}
119
101
120
- func ( f * FrostQuerier ) LabelNames ( matchers ... * labels.Matcher ) ([] string , storage. Warnings , error ) {
102
+ func promMatchersToFrostDBExprs ( matchers [] * labels.Matcher ) logicalplan. Expr {
121
103
exprs := []logicalplan.Expr {}
122
- // Build a filter from matchers
123
104
for _ , matcher := range matchers {
124
105
switch matcher .Type {
125
106
case labels .MatchEqual :
@@ -132,25 +113,26 @@ func (f *FrostQuerier) LabelNames(matchers ...*labels.Matcher) ([]string, storag
132
113
exprs = append (exprs , logicalplan .Col ("labels." + matcher .Name ).RegexNotMatch (matcher .Value ))
133
114
}
134
115
}
116
+ return logicalplan .And (exprs ... )
117
+ }
135
118
119
+ func (f * FrostQuerier ) LabelNames (matchers ... * labels.Matcher ) ([]string , storage.Warnings , error ) {
136
120
engine := query .NewEngine (
137
121
memory .NewGoAllocator (),
138
122
f .db .TableProvider (),
139
123
)
140
124
141
- bld := engine .ScanSchema ("metrics" )
142
- if len (exprs ) != 0 {
143
- bld .Filter (logicalplan .And (exprs ... ))
144
- }
145
-
146
125
sets := map [string ]struct {}{}
147
- err := bld .Project (logicalplan .DynCol ("labels" )).Execute (context .Background (), func (ar arrow.Record ) error {
148
- defer ar .Release ()
149
- for i := 0 ; i < int (ar .NumCols ()); i ++ {
150
- sets [ar .ColumnName (i )] = struct {}{}
151
- }
152
- return nil
153
- })
126
+ err := engine .ScanSchema ("metrics" ).
127
+ Distinct (logicalplan .Col ("labels" )).
128
+ Filter (promMatchersToFrostDBExprs (matchers )).
129
+ Execute (context .Background (), func (ar arrow.Record ) error {
130
+ defer ar .Release ()
131
+ for i := 0 ; i < int (ar .NumCols ()); i ++ {
132
+ sets [ar .ColumnName (i )] = struct {}{}
133
+ }
134
+ return nil
135
+ })
154
136
if err != nil {
155
137
return nil , nil , fmt .Errorf (" failed to perform labels query: %v" , err )
156
138
}
@@ -166,33 +148,20 @@ func (f *FrostQuerier) LabelNames(matchers ...*labels.Matcher) ([]string, storag
166
148
func (f * FrostQuerier ) Close () error { return nil }
167
149
168
150
func (f * FrostQuerier ) Select (sortSeries bool , hints * storage.SelectHints , matchers ... * labels.Matcher ) storage.SeriesSet {
169
-
170
- exprs := []logicalplan.Expr {
171
- logicalplan .Col ("timestamp" ).GT (logicalplan .Literal (hints .Start )),
172
- logicalplan .Col ("timestamp" ).LT (logicalplan .Literal (hints .End )),
173
- }
174
- // Build a filter from matchers
175
- for _ , matcher := range matchers {
176
- switch matcher .Type {
177
- case labels .MatchEqual :
178
- exprs = append (exprs , logicalplan .Col ("labels." + matcher .Name ).Eq (logicalplan .Literal (matcher .Value )))
179
- case labels .MatchNotEqual :
180
- exprs = append (exprs , logicalplan .Col ("labels." + matcher .Name ).NotEq (logicalplan .Literal (matcher .Value )))
181
- case labels .MatchRegexp :
182
- exprs = append (exprs , logicalplan .Col ("labels." + matcher .Name ).RegexMatch (matcher .Value ))
183
- case labels .MatchNotRegexp :
184
- exprs = append (exprs , logicalplan .Col ("labels." + matcher .Name ).RegexNotMatch (matcher .Value ))
185
- }
186
- }
187
-
188
151
engine := query .NewEngine (
189
152
memory .NewGoAllocator (),
190
153
f .db .TableProvider (),
191
154
)
192
155
193
156
sets := map [uint64 ]* series {}
194
157
err := engine .ScanTable ("metrics" ).
195
- Filter (logicalplan .And (exprs ... )).
158
+ Filter (logicalplan .And (
159
+ logicalplan .And (
160
+ logicalplan .Col ("timestamp" ).GT (logicalplan .Literal (hints .Start )),
161
+ logicalplan .Col ("timestamp" ).LT (logicalplan .Literal (hints .End )),
162
+ ),
163
+ promMatchersToFrostDBExprs (matchers ),
164
+ )).
196
165
Project (
197
166
logicalplan .DynCol ("labels" ),
198
167
logicalplan .Col ("timestamp" ),
0 commit comments