Skip to content

Commit b8a66c8

Browse files
committed
Cargo fmt and clippy. Move ES DSL tests into test submodule.
1 parent 12c73e4 commit b8a66c8

6 files changed

Lines changed: 466 additions & 167 deletions

File tree

asap-common/dependencies/rs/elastic_dsl_utilities/src/parsing.rs

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,11 @@ pub fn extract_metric_aggs(aggs: &Value) -> Option<Vec<MetricAggregation>> {
2222
let body_obj = agg_body.as_object()?;
2323
let mut found = None;
2424
for (key, inner) in body_obj {
25-
if let Some(agg_type) = MetricAggType::from_str(key) {
25+
if let Some(agg_type) = MetricAggType::from_json_str(key) {
2626
let field = inner.get("field")?.as_str()?.to_owned();
27-
let kwargs_map = inner.as_object()?.iter()
27+
let kwargs_map = inner
28+
.as_object()?
29+
.iter()
2830
.filter(|(k, _)| *k != "field")
2931
.map(|(k, v)| (k.clone(), v.clone()))
3032
.collect();
@@ -165,7 +167,9 @@ pub fn extract_label_filters(query: &Value) -> Option<(Vec<LabelFilter>, Option<
165167
/// - `{"range": ...}` -> `(label_filters=[], time_range=Some(...))`
166168
/// - `{"bool": {"filter": ...}}` -> label filters + optional time range
167169
/// - `None`/`null` query is represented by caller as `(vec![], None)`.
168-
pub fn extract_predicates_from_query(query: &Value) -> Option<(Vec<LabelFilter>, Option<TimeRange>)> {
170+
pub fn extract_predicates_from_query(
171+
query: &Value,
172+
) -> Option<(Vec<LabelFilter>, Option<TimeRange>)> {
169173
if query.is_null() {
170174
return Some((Vec::new(), None));
171175
}
@@ -211,9 +215,7 @@ pub fn extract_predicates_from_query(query: &Value) -> Option<(Vec<LabelFilter>,
211215
/// }
212216
/// }
213217
/// ```
214-
pub fn extract_group_by_agg(
215-
aggs: &Value,
216-
) -> Option<(String, GroupBySpec, Vec<MetricAggregation>)> {
218+
pub fn extract_group_by_agg(aggs: &Value) -> Option<(String, GroupBySpec, Vec<MetricAggregation>)> {
217219
let obj = aggs.as_object()?;
218220
// There must be exactly one top-level aggregation entry.
219221
if obj.len() != 1 {
@@ -262,15 +264,27 @@ mod tests {
262264
});
263265
let result = extract_metric_aggs(&aggs).unwrap();
264266
assert_eq!(result.len(), 3);
265-
let avg = result.iter().find(|a| a.result_name == "avg_latency").unwrap();
267+
let avg = result
268+
.iter()
269+
.find(|a| a.result_name == "avg_latency")
270+
.unwrap();
266271
assert_eq!(avg.agg_type, MetricAggType::Avg);
267272
assert_eq!(avg.field, "latency_ms");
268-
let p95 = result.iter().find(|a| a.result_name == "p95_latency").unwrap();
273+
let p95 = result
274+
.iter()
275+
.find(|a| a.result_name == "p95_latency")
276+
.unwrap();
269277
assert_eq!(p95.agg_type, MetricAggType::Percentiles);
270278
assert_eq!(p95.field, "latency_ms");
271-
assert_eq!(p95.params.as_ref().unwrap().get("percents").unwrap(), &json!([95]));
279+
assert_eq!(
280+
p95.params.as_ref().unwrap().get("percents").unwrap(),
281+
&json!([95])
282+
);
272283

273-
let avg = result.iter().find(|a| a.result_name == "avg_latency").unwrap();
284+
let avg = result
285+
.iter()
286+
.find(|a| a.result_name == "avg_latency")
287+
.unwrap();
274288
assert!(avg.params.is_none());
275289
}
276290

@@ -374,7 +388,12 @@ mod tests {
374388
});
375389
let (name, group_by, metric_aggs) = extract_group_by_agg(&aggs).unwrap();
376390
assert_eq!(name, "by_service");
377-
assert_eq!(group_by, GroupBySpec::Terms { field: "service".to_string() });
391+
assert_eq!(
392+
group_by,
393+
GroupBySpec::Terms {
394+
field: "service".to_string()
395+
}
396+
);
378397
assert_eq!(metric_aggs.len(), 1);
379398
assert_eq!(metric_aggs[0].agg_type, MetricAggType::Avg);
380399
}

asap-common/dependencies/rs/elastic_dsl_utilities/src/pattern.rs

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
use serde_json::Value;
22

33
use crate::{
4-
parsing::{
5-
extract_group_by_agg, extract_metric_aggs, extract_predicates_from_query,
6-
},
4+
parsing::{extract_group_by_agg, extract_metric_aggs, extract_predicates_from_query},
75
types::EsDslQueryPattern,
86
};
97

@@ -28,7 +26,6 @@ pub fn classify(value: &Value) -> EsDslQueryPattern {
2826
}
2927
_ => return EsDslQueryPattern::Unknown,
3028
}
31-
3229

3330
let aggs = value.get("aggs").unwrap_or(&Value::Null);
3431
let query = value.get("query");
@@ -198,8 +195,20 @@ mod tests {
198195
aggregations,
199196
} => {
200197
assert_eq!(label_filters.len(), 2);
201-
assert_eq!(label_filters[0], LabelFilter { field: "service".into(), value: "frontend".into() });
202-
assert_eq!(label_filters[1], LabelFilter { field: "env".into(), value: "staging".into() });
198+
assert_eq!(
199+
label_filters[0],
200+
LabelFilter {
201+
field: "service".into(),
202+
value: "frontend".into()
203+
}
204+
);
205+
assert_eq!(
206+
label_filters[1],
207+
LabelFilter {
208+
field: "env".into(),
209+
value: "staging".into()
210+
}
211+
);
203212
assert!(time_range.is_some());
204213
assert_eq!(aggregations.len(), 1);
205214
}
@@ -257,7 +266,12 @@ mod tests {
257266
aggregations,
258267
} => {
259268
assert_eq!(grouped_result_name, "grouped_result");
260-
assert_eq!(group_by, GroupBySpec::Terms { field: "service".into() });
269+
assert_eq!(
270+
group_by,
271+
GroupBySpec::Terms {
272+
field: "service".into()
273+
}
274+
);
261275
assert_eq!(label_filters[0].field, "service");
262276
assert_eq!(label_filters[0].value, "frontend");
263277
assert_eq!(label_filters[1].field, "env");
@@ -312,7 +326,13 @@ mod tests {
312326
fields: vec!["service".into(), "region".into()]
313327
}
314328
);
315-
assert_eq!(label_filters[0], LabelFilter { field: "env".into(), value: "staging".into() });
329+
assert_eq!(
330+
label_filters[0],
331+
LabelFilter {
332+
field: "env".into(),
333+
value: "staging".into()
334+
}
335+
);
316336
assert!(time_range.is_none());
317337
assert_eq!(aggregations.len(), 1);
318338
}
@@ -370,7 +390,10 @@ mod tests {
370390
fn test_parse_and_classify_roundtrip() {
371391
let json = r#"{"size":0,"aggs":{"avg_cpu":{"avg":{"field":"cpu_usage"}}}}"#;
372392
let result = parse_and_classify(json).unwrap();
373-
assert!(matches!(result, EsDslQueryPattern::SimpleAggregation { .. }));
393+
assert!(matches!(
394+
result,
395+
EsDslQueryPattern::SimpleAggregation { .. }
396+
));
374397
}
375398

376399
#[test]

asap-common/dependencies/rs/elastic_dsl_utilities/src/types.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ pub enum MetricAggType {
2121

2222
impl MetricAggType {
2323
/// Returns the JSON key name for this aggregation type.
24-
pub fn as_str(&self) -> &'static str {
24+
pub fn as_json_str(&self) -> &'static str {
2525
match self {
2626
MetricAggType::Avg => "avg",
2727
MetricAggType::Min => "min",
@@ -32,7 +32,7 @@ impl MetricAggType {
3232
}
3333

3434
/// Try to parse from a string key.
35-
pub fn from_str(s: &str) -> Option<Self> {
35+
pub fn from_json_str(s: &str) -> Option<Self> {
3636
match s {
3737
"avg" => Some(MetricAggType::Avg),
3838
"min" => Some(MetricAggType::Min),
@@ -198,9 +198,6 @@ pub enum EsDslQueryPattern {
198198
}
199199

200200
impl EsDslQueryPattern {
201-
/// Classify the given ES DSL query into one of the above patterns, extracting
202-
/// the relevant components for routing to sketch fast-paths.
203-
204201
pub fn get_time_range(&self) -> Option<&TimeRange> {
205202
match self {
206203
EsDslQueryPattern::SimpleAggregation { time_range, .. } => time_range.as_ref(),

asap-query-engine/src/engines/simple_engine.rs

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1488,7 +1488,10 @@ impl SimpleEngine {
14881488
time: f64,
14891489
) -> Option<(KeyByLabelNames, QueryResult)> {
14901490
let context = self.build_query_execution_context_elastic(query, time)?;
1491-
debug!("Built execution context for ElasticSearch query {:?}", context);
1491+
debug!(
1492+
"Built execution context for ElasticSearch query {:?}",
1493+
context
1494+
);
14921495
// Execute complete query pipeline
14931496
let results = self
14941497
.execute_query_pipeline(&context, false) // SQL: topk disabled
@@ -1584,7 +1587,7 @@ impl SimpleEngine {
15841587
// By default, we only include grouping labels in the output for ES DSL.
15851588

15861589
// Take first aggregation by default since current engine doesn't support multiple aggregations in a single query.
1587-
let aggregation = query_pattern.get_metric_aggs()?.first()?.clone();
1590+
let aggregation = query_pattern.get_metric_aggs()?.first()?.clone();
15881591

15891592
// By default, we only include grouping labels in the output for ES DSL.
15901593
let mut query_output_labels = match query_pattern.get_groupby_spec() {
@@ -1624,7 +1627,8 @@ impl SimpleEngine {
16241627
.and_then(|arr| arr.first())
16251628
.and_then(|v| v.as_f64());
16261629
// ES percentiles are specified as values between 0 and 100, but we want to convert to 0-1 range for our internal representation.
1627-
query_kwargs.insert("quantile".to_string(), (quantile? / 100.0).to_string());
1630+
query_kwargs
1631+
.insert("quantile".to_string(), (quantile? / 100.0).to_string());
16281632
}
16291633
}
16301634
}
@@ -1639,9 +1643,13 @@ impl SimpleEngine {
16391643
Some((metric, metadata))
16401644
}
16411645

1642-
pub fn resolve_query_time_range_elastic(&self, query_time: u64, query_pattern: EsDslQueryPattern) -> QueryTimestamps {
1643-
// Resolves the actual start and end timestamps into milliseconds for an ElasticSearch query
1644-
// based on the provided query_time and the time range specified in the ES DSL query pattern (if any).
1646+
pub fn resolve_query_time_range_elastic(
1647+
&self,
1648+
query_time: u64,
1649+
query_pattern: EsDslQueryPattern,
1650+
) -> QueryTimestamps {
1651+
// Resolves the actual start and end timestamps into milliseconds for an ElasticSearch query
1652+
// based on the provided query_time and the time range specified in the ES DSL query pattern (if any).
16451653
// If no time range is specified, default to entire history up to query_time.
16461654

16471655
let mut start_timestamp: u64 = 0;

0 commit comments

Comments
 (0)