perf(selfop): aggregate daily facts before SKU coverage calculations

This commit is contained in:
2026-10-12 23:06:45 +08:00
parent cbc316b34d
commit 6e9f4b7932
3 changed files with 52 additions and 3 deletions
@@ -57,11 +57,16 @@ class AnalyticsReadMapperTest {
assertFalse(count.contains("ll_selfop_sku_daily_sales")); assertFalse(count.contains("ll_selfop_inventory_snapshot"));
String page=bound(c,"page",parameters).getSql();
assertTrue(page.contains("d.sales_run_id=?")); assertTrue(page.contains("d.business_date>=CAST(? AS DATE) AND d.business_date<CAST(? AS DATE)"));
assertTrue(page.contains("GROUP BY b.customer_code,b.sku_code")); assertFalse(page.contains("business_date>=DATE_SUB"));
assertTrue(page.contains("GROUP BY d.customer_code,d.sku_code")); assertFalse(page.contains("business_date>=DATE_SUB"));
assertFalse(page.contains("ll_selfop_inventory_snapshot"));
assertFalse(page.contains("metric_sales"));assertFalse(page.contains("FROM bounds WHERE 1=0"));
assertTrue(page.contains("bounds AS (SELECT DISTINCT evidence.*,"));
assertTrue(page.endsWith("ORDER BY observed_quantity IS NULL,observed_quantity DESC,sku_code ASC,customer_code ASC LIMIT ? OFFSET ?"));
assertTrue(page.indexOf("GROUP BY b.customer_code,b.sku_code")<page.lastIndexOf("LIMIT")); immutableOnly(page);
assertTrue(page.indexOf("GROUP BY d.customer_code,d.sku_code")<page.lastIndexOf("LIMIT"));
assertFalse(page.contains("FROM bounds b JOIN ll_selfop_sku_daily_sales"));
assertTrue(page.contains("d2.customer_code=b.customer_code AND d2.sku_code=b.sku_code"));
assertTrue(page.contains("d2.sales_run_id=? AND d2.source_account=? AND d2.warehouse_code=?"));
immutableOnly(page);
}
@Test void metricsPreFilterQualityAndStableSortAggregatesBeforePagination(){
var c=config();
@@ -163,6 +163,27 @@ public class AnalyticsSqlSemanticTest {
var totals=totals(request("INVENTORY",D.minusDays(30),D,"C",null,utc(D,8),0,20),new AnalyticsInventoryOptions(null,null,null,30));
assertDecimal("12",(BigDecimal)totals.get("owner_outbound_known"));assertEquals(0L,((Number)totals.get("owner_outbound_unknown")).longValue());
}
@Test void yearlySparseSummaryPreservesOwnerIdentityAndCompletePartialUnknownSpanCounts() throws Exception {
for(String owner:List.of("A","B")){
profile(11,owner,"SAME","VALID_OUTBOUND",utc(D.minusDays(400),0),"PCS");
profile(22,owner,"SAME","INVENTORY_OBSERVATION",utc(D.minusDays(400),0),"PCS");
}
profile(22,"A","NONE","NONE",null,"PCS");
profile(22,"A","LATE","INVENTORY_OBSERVATION",utc(D.plusDays(1),0),"PCS");
daily(11,"W","A","SAME",D.minusDays(364),"1");
daily(11,"W","A","SAME",D.minusDays(1),"2");daily(11,"W","A","SAME",D,"5");
daily(11,"W","B","SAME",D.minusDays(2),"9");
var p=new AnalyticsSqlRequest("demo","W",null,null,11,22,D.minusDays(365),D.plusDays(1),D,D.minusDays(30),
D.minusDays(365),D,utc(D.minusDays(365),0),utc(D,8),true,true,false,true,true,0,20,"SUMMARY");
assertEquals(4,mapper.count(p));var rows=page(p);assertEquals(4,rows.size());
for(var row:rows)if("SAME".equals(row.skuCode())){
assertDecimal("A".equals(row.customerCode())?"8":"9",row.observedQuantity());
assertEquals(365,row.completeDayCount());assertEquals(1,row.partialDayCount());assertEquals(0,row.unknownDayCount());
}else{
assertNull(row.observedQuantity());assertEquals(0,row.completeDayCount());
assertEquals(0,row.partialDayCount());assertEquals(366,row.unknownDayCount());
}
}
@Test void rankingStatisticsPreserveFullEligibilityTopCapExclusionsAndSharedSkuOwners() throws Exception {
for(int i=0;i<110;i++){
String sku=String.format("SKU-%03d",i);profile(11,"C",sku,"VALID_OUTBOUND",utc(D.minusDays(40),0),"PCS");