@@ -163,6 +163,10 @@ where
163
163
164
164
impl Query for WriteQuery {
165
165
fn build ( & self ) -> Result < ValidQuery , Error > {
166
+ self . build_with_opts ( false )
167
+ }
168
+
169
+ fn build_with_opts ( & self , use_v2 : bool ) -> Result < ValidQuery , Error > {
166
170
if self . fields . is_empty ( ) {
167
171
return Err ( Error :: InvalidQueryError {
168
172
error : "fields cannot be empty" . to_string ( ) ,
@@ -173,10 +177,20 @@ impl Query for WriteQuery {
173
177
. tags
174
178
. iter ( )
175
179
. map ( |( tag, value) | {
180
+ let escaped_tag_key = if use_v2 {
181
+ LineProtoTerm :: TagKey ( tag) . escape_v2 ( )
182
+ } else {
183
+ LineProtoTerm :: TagKey ( tag) . escape ( )
184
+ } ;
185
+ let escaped_tag_value = if use_v2 {
186
+ LineProtoTerm :: TagValue ( value) . escape_v2 ( )
187
+ } else {
188
+ LineProtoTerm :: TagValue ( value) . escape ( )
189
+ } ;
176
190
format ! (
177
191
"{tag}={value}" ,
178
- tag = LineProtoTerm :: TagKey ( tag ) . escape ( ) ,
179
- value = LineProtoTerm :: TagValue ( value ) . escape ( ) ,
192
+ tag = escaped_tag_key ,
193
+ value = escaped_tag_value ,
180
194
)
181
195
} )
182
196
. collect :: < Vec < String > > ( )
@@ -189,18 +203,34 @@ impl Query for WriteQuery {
189
203
. fields
190
204
. iter ( )
191
205
. map ( |( field, value) | {
206
+ let escaped_field_key = if use_v2 {
207
+ LineProtoTerm :: FieldKey ( field) . escape_v2 ( )
208
+ } else {
209
+ LineProtoTerm :: FieldKey ( field) . escape ( )
210
+ } ;
211
+ let escaped_field_value = if use_v2 {
212
+ LineProtoTerm :: FieldValue ( value) . escape_v2 ( )
213
+ } else {
214
+ LineProtoTerm :: FieldValue ( value) . escape ( )
215
+ } ;
192
216
format ! (
193
217
"{field}={value}" ,
194
- field = LineProtoTerm :: FieldKey ( field ) . escape ( ) ,
195
- value = LineProtoTerm :: FieldValue ( value ) . escape ( ) ,
218
+ field = escaped_field_key ,
219
+ value = escaped_field_value ,
196
220
)
197
221
} )
198
222
. collect :: < Vec < String > > ( )
199
223
. join ( "," ) ;
200
224
225
+ let escaped_measurement = if use_v2 {
226
+ LineProtoTerm :: Measurement ( & self . measurement ) . escape_v2 ( )
227
+ } else {
228
+ LineProtoTerm :: Measurement ( & self . measurement ) . escape ( )
229
+ } ;
230
+
201
231
Ok ( ValidQuery ( format ! (
202
232
"{measurement}{tags} {fields} {time}" ,
203
- measurement = LineProtoTerm :: Measurement ( & self . measurement ) . escape ( ) ,
233
+ measurement = escaped_measurement ,
204
234
tags = tags,
205
235
fields = fields,
206
236
time = self . timestamp
@@ -224,6 +254,17 @@ impl Query for Vec<WriteQuery> {
224
254
Ok ( ValidQuery ( qlines. join ( "\n " ) ) )
225
255
}
226
256
257
+ fn build_with_opts ( & self , use_v2 : bool ) -> Result < ValidQuery , Error > {
258
+ let mut qlines = Vec :: new ( ) ;
259
+
260
+ for q in self {
261
+ let valid_query = q. build_with_opts ( use_v2) ?;
262
+ qlines. push ( valid_query. 0 ) ;
263
+ }
264
+
265
+ Ok ( ValidQuery ( qlines. join ( "\n " ) ) )
266
+ }
267
+
227
268
fn get_type ( & self ) -> QueryType {
228
269
QueryType :: WriteQuery (
229
270
self . get ( 0 )
@@ -267,6 +308,22 @@ mod tests {
267
308
. add_field ( "temperature_unsigned" , 82u64 )
268
309
. build ( ) ;
269
310
311
+ assert ! ( query. is_ok( ) , "Query was empty" ) ;
312
+ assert_eq ! (
313
+ query. unwrap( ) ,
314
+ "weather temperature=82i,wind_strength=3.7,temperature_unsigned=82i 11"
315
+ ) ;
316
+ }
317
+
318
+ #[ test]
319
+ fn test_write_builder_multiple_fields_with_v2 ( ) {
320
+ let query = Timestamp :: Hours ( 11 )
321
+ . into_query ( "weather" . to_string ( ) )
322
+ . add_field ( "temperature" , 82 )
323
+ . add_field ( "wind_strength" , 3.7 )
324
+ . add_field ( "temperature_unsigned" , 82u64 )
325
+ . build_with_opts ( true ) ;
326
+
270
327
assert ! ( query. is_ok( ) , "Query was empty" ) ;
271
328
assert_eq ! (
272
329
query. unwrap( ) ,
@@ -282,6 +339,18 @@ mod tests {
282
339
. add_tag ( "wind_strength" , <Option < u64 > >:: None )
283
340
. build ( ) ;
284
341
342
+ assert ! ( query. is_ok( ) , "Query was empty" ) ;
343
+ assert_eq ! ( query. unwrap( ) , "weather temperature=82i 11" ) ;
344
+ }
345
+
346
+ #[ test]
347
+ fn test_write_builder_optional_fields_with_v2 ( ) {
348
+ let query = Timestamp :: Hours ( 11 )
349
+ . into_query ( "weather" . to_string ( ) )
350
+ . add_field ( "temperature" , 82u64 )
351
+ . add_tag ( "wind_strength" , <Option < u64 > >:: None )
352
+ . build_with_opts ( true ) ;
353
+
285
354
assert ! ( query. is_ok( ) , "Query was empty" ) ;
286
355
assert_eq ! ( query. unwrap( ) , "weather temperature=82u 11" ) ;
287
356
}
0 commit comments