use super::framework::*;
use super::helpers::*;
fn runner() -> ConformanceTestRunner {
ConformanceTestRunner::new()
}
#[test]
fn test_subq_01_basic() {
let ds = subquery_dataset();
let inner = project(
filter(
bgp(vec![triple(var("s"), ex("score"), var("sc"))]),
expr_eq(expr_var("sc"), expr_lit(lit_int(92))),
),
vec![variable("s")],
);
let outer_bgp = bgp(vec![triple(var("s"), foaf("name"), var("name"))]);
let algebra = project(join(inner, outer_bgp), vec![variable("name")]);
let test = ConformanceTest::new(
"subq-01",
ConformanceGroup::Subquery,
algebra,
ds,
ConformanceResult::ResultCount(2), );
runner().run_test(&test).expect("subq-01 failed");
}
#[test]
fn test_subq_02_aggregate_in_subquery() {
let ds = subquery_dataset();
let inner = project(
group(
bgp(vec![triple(var("s_inner"), ex("score"), var("sc"))]),
vec![],
vec![(variable("max_score"), agg_max("sc"))],
),
vec![variable("max_score")],
);
let outer = filter(
join(
inner,
join(
bgp(vec![triple(var("s"), ex("score"), var("score"))]),
bgp(vec![triple(var("s"), foaf("name"), var("name"))]),
),
),
expr_eq(expr_var("score"), expr_var("max_score")),
);
let algebra = project(outer, vec![variable("name")]);
let test = ConformanceTest::new(
"subq-02",
ConformanceGroup::Subquery,
algebra,
ds,
ConformanceResult::ResultCount(2), );
runner().run_test(&test).expect("subq-02 failed");
}
#[test]
fn test_subq_03_limit_in_subquery() {
let ds = subquery_dataset();
let inner = slice(
project(
bgp(vec![triple(var("s"), ex("score"), var("sc"))]),
vec![variable("s")],
),
None,
Some(2),
);
let algebra = project(
join(
inner,
bgp(vec![triple(var("s"), foaf("name"), var("name"))]),
),
vec![variable("name")],
);
let test = ConformanceTest::new(
"subq-03",
ConformanceGroup::Subquery,
algebra,
ds,
ConformanceResult::ResultCount(2),
);
runner().run_test(&test).expect("subq-03 failed");
}
#[test]
fn test_subq_04_order_in_subquery() {
let ds = subquery_dataset();
let inner = slice(
order_by(
project(
bgp(vec![triple(var("s"), ex("score"), var("sc"))]),
vec![variable("s"), variable("sc")],
),
vec![desc_cond(expr_var("sc"))],
),
None,
Some(1),
);
let algebra = project(
join(
inner,
bgp(vec![triple(var("s"), foaf("name"), var("name"))]),
),
vec![variable("name")],
);
let test = ConformanceTest::new(
"subq-04",
ConformanceGroup::Subquery,
algebra,
ds,
ConformanceResult::ResultCount(1),
);
runner().run_test(&test).expect("subq-04 failed");
}
#[test]
fn test_subq_05_count_in_subquery() {
let ds = subquery_dataset();
let inner = project(
group(
bgp(vec![triple(var("s"), ex("score"), var("sc"))]),
vec![],
vec![(variable("count"), agg_count_star())],
),
vec![variable("count")],
);
let test = ConformanceTest::new(
"subq-05",
ConformanceGroup::Subquery,
inner,
ds,
ConformanceResult::SelectResults(vec![row(&[("count", "4")])]),
);
runner().run_test(&test).expect("subq-05 failed");
}
#[test]
fn test_subq_06_group_in_subquery() {
let ds = subquery_dataset();
let inner = project(
group(
bgp(vec![triple(var("s"), ex("score"), var("sc"))]),
vec![group_var("s")],
vec![(variable("avg_score"), agg_avg("sc"))],
),
vec![variable("s"), variable("avg_score")],
);
let test = ConformanceTest::new(
"subq-06",
ConformanceGroup::Subquery,
inner,
ds,
ConformanceResult::ResultCount(4),
);
runner().run_test(&test).expect("subq-06 failed");
}
#[test]
fn test_subq_07_empty_subquery() {
let ds = subquery_dataset();
let inner = project(
bgp(vec![triple(var("s"), ex("nonexistent"), var("o"))]),
vec![variable("s")],
);
let algebra = project(
join(
inner,
bgp(vec![triple(var("s"), foaf("name"), var("name"))]),
),
vec![variable("name")],
);
let test = ConformanceTest::new(
"subq-07",
ConformanceGroup::Subquery,
algebra,
ds,
ConformanceResult::ResultCount(0),
);
runner().run_test(&test).expect("subq-07 failed");
}
#[test]
fn test_subq_08_nested_subqueries() {
let ds = subquery_dataset();
let innermost = project(
bgp(vec![triple(var("s"), ex("score"), var("sc"))]),
vec![variable("s"), variable("sc")],
);
let middle = project(
filter(innermost, expr_gt(expr_var("sc"), expr_lit(lit_int(89)))),
vec![variable("s")],
);
let algebra = project(
join(
middle,
bgp(vec![triple(var("s"), foaf("name"), var("name"))]),
),
vec![variable("name")],
);
let test = ConformanceTest::new(
"subq-08",
ConformanceGroup::Subquery,
algebra,
ds,
ConformanceResult::ResultCount(2), );
runner().run_test(&test).expect("subq-08 failed");
}
#[test]
fn test_subq_09_distinct_in_subquery() {
let ds = subquery_dataset();
let inner = distinct(project(
bgp(vec![triple(var("s"), ex("score"), var("sc"))]),
vec![variable("s")],
));
let test = ConformanceTest::new(
"subq-09",
ConformanceGroup::Subquery,
inner,
ds,
ConformanceResult::ResultCount(4),
);
runner().run_test(&test).expect("subq-09 failed");
}
#[test]
fn test_subq_10_union_in_subquery() {
let ds = subquery_dataset();
let inner = distinct(project(
union(
bgp(vec![triple(var("s"), ex("score"), var("sc"))]),
bgp(vec![triple(var("s"), foaf("name"), var("n"))]),
),
vec![variable("s")],
));
let test = ConformanceTest::new(
"subq-10",
ConformanceGroup::Subquery,
inner,
ds,
ConformanceResult::ResultCount(4),
);
runner().run_test(&test).expect("subq-10 failed");
}
#[test]
fn test_subq_11_filter_after_subquery() {
let ds = subquery_dataset();
let inner = project(
bgp(vec![triple(var("s"), ex("score"), var("sc"))]),
vec![variable("s"), variable("sc")],
);
let algebra = project(
filter(
join(
inner,
bgp(vec![triple(var("s"), foaf("name"), var("name"))]),
),
expr_lt(expr_var("sc"), expr_lit(lit_int(85))),
),
vec![variable("name"), variable("sc")],
);
let test = ConformanceTest::new(
"subq-11",
ConformanceGroup::Subquery,
algebra,
ds,
ConformanceResult::ResultCount(1), );
runner().run_test(&test).expect("subq-11 failed");
}
#[test]
fn test_subq_12_min_score() {
let ds = subquery_dataset();
let algebra = project(
group(
bgp(vec![triple(var("s"), ex("score"), var("sc"))]),
vec![],
vec![(variable("min"), agg_min("sc"))],
),
vec![variable("min")],
);
let test = ConformanceTest::new(
"subq-12",
ConformanceGroup::Subquery,
algebra,
ds,
ConformanceResult::SelectResults(vec![row(&[("min", "78")])]),
);
runner().run_test(&test).expect("subq-12 failed");
}