mod common;
#[cfg(test)]
#[cfg(feature = "standalone")]
#[cfg(feature = "test_extended_stack")]
mod extended {
use ballista::prelude::SessionContextExt;
use datafusion::{assert_batches_eq, prelude::*};
#[tokio::test]
async fn bug_1296_basic() -> datafusion::error::Result<()> {
let test_data = crate::common::example_test_data();
let ctx = SessionContext::standalone().await?;
ctx.register_csv(
"date_dim",
&format!("{}/bug_1296/date_dim.csv", test_data),
CsvReadOptions::new().has_header(true),
)
.await?;
ctx.register_csv(
"store",
&format!("{}/bug_1296/store.csv", test_data),
CsvReadOptions::new().has_header(true),
)
.await?;
ctx.register_csv(
"item",
&format!("{}/bug_1296/item.csv", test_data),
CsvReadOptions::new().has_header(true),
)
.await?;
ctx.register_csv(
"store_sales",
&format!("{}/bug_1296/store_sales.csv", test_data),
CsvReadOptions::new().has_header(true),
)
.await?;
let query = r#"
with v1 as(
select i_category,
i_brand,
s_store_name,
s_company_name,
d_year,
d_moy,
sum(ss_sales_price) sum_sales,
avg(sum(ss_sales_price)) over
(partition by i_category, i_brand,
s_store_name, s_company_name, d_year)
avg_monthly_sales,
rank() over
(partition by i_category, i_brand,
s_store_name, s_company_name
order by d_year, d_moy) rn
from item, store_sales, date_dim, store
where ss_item_sk = i_item_sk and
ss_sold_date_sk = d_date_sk
and ss_store_sk = s_store_sk and
(
d_year = 1999 or
( d_year = 1999-1 and d_moy =12) or
( d_year = 1999+1 and d_moy =1)
)
group by i_category, i_brand,
s_store_name, s_company_name,
d_year, d_moy),
v2 as(
select v1.i_category,
v1.i_brand,
v1.s_store_name,
v1.s_company_name,
v1.d_year,
v1.d_moy,
v1.avg_monthly_sales,
v1.sum_sales,
v1_lag.sum_sales psum,
v1_lead.sum_sales nsum
from v1, v1 v1_lag, v1 v1_lead
where v1.i_category = v1_lag.i_category and
v1.i_category = v1_lead.i_category and
v1.i_brand = v1_lag.i_brand and
v1.i_brand = v1_lead.i_brand and
v1.s_store_name = v1_lag.s_store_name and
v1.s_store_name = v1_lead.s_store_name and
v1.s_company_name = v1_lag.s_company_name and
v1.s_company_name = v1_lead.s_company_name and
v1.rn = v1_lag.rn + 1 and
v1.rn = v1_lead.rn - 1)
select *
from v2
where d_year = 1999 and
avg_monthly_sales > 0 and
case when avg_monthly_sales > 0 then abs(sum_sales - avg_monthly_sales) / avg_monthly_sales else null end > 0.1
order by sum_sales - avg_monthly_sales, s_store_name
limit 100;
"#;
let result = ctx.sql(query).await?.collect().await?;
let expected = [
"+-------------+-----------+----------------+----------------+--------+-------+--------------------+-----------+---------+---------+",
"| i_category | i_brand | s_store_name | s_company_name | d_year | d_moy | avg_monthly_sales | sum_sales | psum | nsum |",
"+-------------+-----------+----------------+----------------+--------+-------+--------------------+-----------+---------+---------+",
"| Electronics | TechBrand | Downtown Store | Retail Corp | 1999 | 4 | 1499.9850000000001 | 999.99 | 999.99 | 999.99 |",
"| Electronics | TechBrand | Downtown Store | Retail Corp | 1999 | 3 | 1499.9850000000001 | 999.99 | 1999.98 | 999.99 |",
"| Electronics | TechBrand | Downtown Store | Retail Corp | 1999 | 1 | 1499.9850000000001 | 1999.98 | 1999.98 | 1999.98 |",
"| Electronics | TechBrand | Downtown Store | Retail Corp | 1999 | 2 | 1499.9850000000001 | 1999.98 | 1999.98 | 999.99 |",
"+-------------+-----------+----------------+----------------+--------+-------+--------------------+-----------+---------+---------+",
];
assert_batches_eq!(expected, &result);
Ok(())
}
}