Pipeline controller: plan 2 (hard +, error +50 %), backlog throttle, 2 trajectory workers, stop rules, summaries every 50; budget reserve

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
Kral
2026-10-05 13:35:54 +02:00
parent 1c4667a0fc
commit 13360292dd
781 changed files with 50211 additions and 22 deletions

View File

@@ -0,0 +1,84 @@
CLASS {{p}}log_merger DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
TYPES:
ty_log_no TYPE c LENGTH 10,
ty_district TYPE c LENGTH 4,
BEGIN OF ty_log,
log_no TYPE ty_log_no,
district TYPE ty_district,
length_cm TYPE i,
diameter_cm TYPE i,
END OF ty_log,
tt_log TYPE STANDARD TABLE OF ty_log WITH EMPTY KEY,
BEGIN OF ty_district_stat,
district TYPE ty_district,
log_qty TYPE i,
total_length_cm TYPE i,
END OF ty_district_stat,
tt_district_stat TYPE STANDARD TABLE OF ty_district_stat WITH EMPTY KEY.
METHODS combine
IMPORTING it_first TYPE tt_log
it_second TYPE tt_log
RETURNING VALUE(rt_result) TYPE tt_log.
METHODS count_by_district
IMPORTING it_log TYPE tt_log
RETURNING VALUE(rt_stat) TYPE tt_district_stat.
PRIVATE SECTION.
CONSTANTS:
c_min_length TYPE i VALUE 200,
c_min_diameter TYPE i VALUE 20.
TYPES tt_log_keyed TYPE SORTED TABLE OF ty_log WITH UNIQUE KEY log_no.
METHODS add_logs
IMPORTING it_log TYPE tt_log
CHANGING ct_keyed TYPE tt_log_keyed.
METHODS is_ready
IMPORTING is_log TYPE ty_log
RETURNING VALUE(rv_ready) TYPE abap_bool.
ENDCLASS.
CLASS {{p}}log_merger IMPLEMENTATION.
METHOD combine.
DATA lt_keyed TYPE tt_log_keyed.
add_logs( EXPORTING it_log = it_first CHANGING ct_keyed = lt_keyed ).
add_logs( EXPORTING it_log = it_second CHANGING ct_keyed = lt_keyed ).
LOOP AT lt_keyed INTO DATA(ls_log).
IF is_ready( ls_log ) = abap_true.
INSERT ls_log INTO TABLE rt_result.
ENDIF.
ENDLOOP.
ENDMETHOD.
METHOD count_by_district.
DATA lt_stat TYPE SORTED TABLE OF ty_district_stat WITH UNIQUE KEY district.
LOOP AT it_log INTO DATA(ls_log).
ASSIGN lt_stat[ district = ls_log-district ] TO FIELD-SYMBOL(<ls_stat>).
IF sy-subrc <> 0.
INSERT VALUE #( district = ls_log-district
log_qty = 1
total_length_cm = ls_log-length_cm ) INTO TABLE lt_stat.
ELSE.
<ls_stat>-log_qty += 1.
<ls_stat>-total_length_cm += ls_log-length_cm.
ENDIF.
ENDLOOP.
rt_stat = lt_stat.
ENDMETHOD.
METHOD add_logs.
LOOP AT it_log INTO DATA(ls_log).
INSERT ls_log INTO TABLE ct_keyed.
ENDLOOP.
ENDMETHOD.
METHOD is_ready.
rv_ready = xsdbool( is_log-length_cm >= c_min_length
AND is_log-diameter_cm >= c_min_diameter ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,71 @@
CLASS ltc_log_merger DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
DATA mo_cut TYPE REF TO {{p}}log_merger.
DATA mt_empty TYPE {{p}}log_merger=>tt_log.
METHODS setup.
METHODS merges_distinct_logs FOR TESTING.
METHODS keeps_first_duplicate FOR TESTING.
METHODS removes_small_logs FOR TESTING.
METHODS sorts_result FOR TESTING.
METHODS empty_input_is_empty FOR TESTING.
METHODS counts_per_district FOR TESTING.
ENDCLASS.
CLASS ltc_log_merger IMPLEMENTATION.
METHOD setup.
mo_cut = NEW {{p}}log_merger( ).
ENDMETHOD.
METHOD merges_distinct_logs.
DATA(lt_result) = mo_cut->combine(
it_first = VALUE #( ( log_no = 'LOG0000001' district = 'A001' length_cm = 500 diameter_cm = 30 ) )
it_second = VALUE #( ( log_no = 'LOG0000002' district = 'B001' length_cm = 600 diameter_cm = 40 ) ) ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lines( lt_result ) ).
cl_abap_unit_assert=>assert_equals( exp = 'LOG0000001' act = lt_result[ 1 ]-log_no ).
cl_abap_unit_assert=>assert_equals( exp = 'LOG0000002' act = lt_result[ 2 ]-log_no ).
ENDMETHOD.
METHOD keeps_first_duplicate.
DATA(lt_result) = mo_cut->combine(
it_first = VALUE #( ( log_no = 'LOG0000001' district = 'A001' length_cm = 500 diameter_cm = 30 ) )
it_second = VALUE #( ( log_no = 'LOG0000001' district = 'B001' length_cm = 900 diameter_cm = 50 ) ) ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_result ) ).
cl_abap_unit_assert=>assert_equals( exp = 'A001' act = lt_result[ 1 ]-district ).
ENDMETHOD.
METHOD removes_small_logs.
DATA(lt_result) = mo_cut->combine(
it_first = VALUE #( ( log_no = 'LOG0000001' district = 'A001' length_cm = 150 diameter_cm = 30 ) )
it_second = VALUE #( ( log_no = 'LOG0000002' district = 'A001' length_cm = 500 diameter_cm = 15 ) ) ).
cl_abap_unit_assert=>assert_equals( exp = 0 act = lines( lt_result ) ).
ENDMETHOD.
METHOD sorts_result.
DATA(lt_result) = mo_cut->combine(
it_first = VALUE #( ( log_no = 'LOG0000002' district = 'A001' length_cm = 500 diameter_cm = 30 ) )
it_second = VALUE #( ( log_no = 'LOG0000001' district = 'B001' length_cm = 500 diameter_cm = 30 ) ) ).
cl_abap_unit_assert=>assert_equals( exp = 'LOG0000001' act = lt_result[ 1 ]-log_no ).
cl_abap_unit_assert=>assert_equals( exp = 'LOG0000002' act = lt_result[ 2 ]-log_no ).
ENDMETHOD.
METHOD empty_input_is_empty.
DATA(lt_result) = mo_cut->combine( it_first = mt_empty it_second = mt_empty ).
cl_abap_unit_assert=>assert_equals( exp = 0 act = lines( lt_result ) ).
ENDMETHOD.
METHOD counts_per_district.
DATA(lt_stat) = mo_cut->count_by_district(
it_log = VALUE #( ( log_no = 'LOG0000001' district = 'A001' length_cm = 500 diameter_cm = 30 )
( log_no = 'LOG0000002' district = 'A001' length_cm = 300 diameter_cm = 25 ) ) ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_stat ) ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lt_stat[ 1 ]-log_qty ).
cl_abap_unit_assert=>assert_equals( exp = 800 act = lt_stat[ 1 ]-total_length_cm ).
ENDMETHOD.
ENDCLASS.