perf(selfop): cover range reads and stream yearly SKU aggregation
This commit is contained in:
+36
@@ -42,6 +42,42 @@ public class AnalyticsSqlSemanticTest {
|
||||
public static LocalDateTime convertZone(LocalDateTime value,String from,String to) {
|
||||
return value==null?null:value.atOffset(ZoneOffset.of(from)).withOffsetSameInstant(ZoneOffset.of(to)).toLocalDateTime();
|
||||
}
|
||||
@Test void skuOrderedCoverHintIsLimitedToExactly366DaySummary() {
|
||||
for(int days:List.of(1,7,30,365,366,367)) {
|
||||
var p=request("SUMMARY",D.minusDays(days),D,null,null,utc(D,8),0,20);
|
||||
String sql=AnalyticsReadSql.page(Map.of("p",p));
|
||||
String hint="/*+ INDEX(d idx_selfop_daily_sku_cover) */";
|
||||
assertEquals(days==366,sql.contains(hint),"window="+days);
|
||||
if(days==366) {
|
||||
assertTrue(sql.contains("ranged AS (SELECT "+hint+" d.customer_code"));
|
||||
assertEquals(sql.indexOf(hint),sql.lastIndexOf(hint));
|
||||
}
|
||||
assertFalse(AnalyticsReadSql.count(Map.of("p",p)).contains("INDEX("));
|
||||
}
|
||||
for(String kind:List.of("HOT","SLOW","INVENTORY")) {
|
||||
var p=request(kind,D.minusDays(366),D,null,null,utc(D,8),0,20);
|
||||
assertFalse(AnalyticsReadSql.page(Map.of("p",p)).contains("INDEX("),kind);
|
||||
}
|
||||
}
|
||||
@Test void hinted366DaySummaryPreservesSparseZeroUnknownAndDateBoundaries() throws Exception {
|
||||
LocalDate from=D.minusDays(365),until=D.plusDays(1);
|
||||
profile(11,"C","SOLD","VALID_OUTBOUND",utc(from,0),"PCS");
|
||||
profile(22,"C","ZERO","INVENTORY_OBSERVATION",utc(from,0),"PCS");
|
||||
profile(22,"C","UNKNOWN","NONE",null,"PCS");
|
||||
daily(11,"W","C","SOLD",from,"2");daily(11,"W","C","SOLD",D,"3");
|
||||
daily(11,"W","C","SOLD",from.minusDays(1),"999");daily(11,"W","C","SOLD",until,"999");
|
||||
daily(33,"W","C","SOLD",from,"999");daily(11,"OTHER","C","SOLD",from,"999");
|
||||
var p=new AnalyticsSqlRequest("demo","W",null,null,11,22,from,until,D,D.minusDays(30),from,D,
|
||||
utc(from,0),utc(D,8),true,true,false,true,true,0,20,"SUMMARY");
|
||||
assertEquals(3,mapper.count(p));var rows=page(p);assertEquals(3,rows.size());
|
||||
var sold=rows.get(0);assertEquals("SOLD",sold.skuCode());assertDecimal("5",sold.observedQuantity());
|
||||
assertEquals(2L,sold.skuOrderCount());assertEquals(365,sold.completeDayCount());
|
||||
assertEquals(1,sold.partialDayCount());assertEquals(0,sold.unknownDayCount());
|
||||
var zero=rows.get(1);assertEquals("ZERO",zero.skuCode());assertDecimal("0",zero.observedQuantity());
|
||||
assertEquals(365,zero.completeDayCount());assertEquals(1,zero.partialDayCount());
|
||||
var unknown=rows.get(2);assertEquals("UNKNOWN",unknown.skuCode());assertNull(unknown.observedQuantity());
|
||||
assertEquals(0,unknown.completeDayCount());assertEquals(0,unknown.partialDayCount());assertEquals(366,unknown.unknownDayCount());
|
||||
}
|
||||
@Test void sqlReturnsTwoCompleteDaysAndTodayPartialObservedFive() throws Exception {
|
||||
profile(11,"C","SKU","VALID_OUTBOUND",utc(D.minusDays(40),0),"PCS");
|
||||
profile(22,"C","SKU","INVENTORY_OBSERVATION",utc(D.minusDays(35),0),"PCS");
|
||||
|
||||
Reference in New Issue
Block a user