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,16 @@
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'Tutor load'
define view entity {{P}}I_TUTOR_LOAD
as select from {{p}}tutor as tutor
inner join {{p}}lesson as lesson on lesson.tutor_id <> tutor.tutor_id
{
key tutor.tutor_id as tutor_id,
tutor.tutor_name as tutor_name,
count( * ) as lesson_count,
sum( lesson.dur_min ) as total_minutes
}
where lesson.dur_min > 0
group by
tutor.tutor_id,
tutor.tutor_name
having count( * ) >= 3

View File

@@ -0,0 +1,16 @@
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'Tutor load'
define view entity {{P}}I_TUTOR_LOAD
as select from {{p}}tutor as tutor
inner join {{p}}lesson as lesson on lesson.tutor_id = tutor.tutor_id
{
key tutor.tutor_id as tutor_id,
tutor.tutor_name as tutor_name,
count( * ) as lesson_count,
max( lesson.dur_min ) as total_minutes
}
where lesson.dur_min > 0
group by
tutor.tutor_id,
tutor.tutor_name
having count( * ) >= 3

View File

@@ -0,0 +1,16 @@
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'Tutor load'
define view entity {{P}}I_TUTOR_LOAD
as select from {{p}}tutor as tutor
inner join {{p}}lesson as lesson on lesson.tutor_id = tutor.tutor_id
{
key tutor.tutor_id as tutor_id,
tutor.tutor_name as tutor_name,
count( * ) as lesson_count,
sum( lesson.dur_min ) as total_minutes
}
where lesson.dur_min <= 0
group by
tutor.tutor_id,
tutor.tutor_name
having count( * ) >= 3

View File

@@ -0,0 +1,16 @@
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'Tutor load'
define view entity {{P}}I_TUTOR_LOAD
as select from {{p}}tutor as tutor
inner join {{p}}lesson as lesson on lesson.tutor_id = tutor.tutor_id
{
key tutor.tutor_id as tutor_id,
tutor.tutor_name as tutor_name,
count( * ) as lesson_count,
sum( lesson.dur_min ) as total_minutes
}
where lesson.dur_min > 0
group by
tutor.tutor_id,
tutor.tutor_name
having count( * ) >= 4

View File

@@ -0,0 +1,28 @@
{
"id": "G1032",
"pool": "train",
"object_type": "DDLS",
"category": "B",
"attempts": [
{
"stage": "bundle",
"errors": [
"seed/lesson.tabl.asabap: field name minutes is a reserved word; choose another name"
],
"by_check": {
"static": 1
}
},
{
"stage": "validate",
"oracle": 100.0,
"null": 0,
"mutation": {
"valid": 5,
"killed": 4,
"ok": true
}
}
],
"accepted": true
}

View File

@@ -0,0 +1,112 @@
CLASS {{p}}t31_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC
FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
CLASS-DATA go_env TYPE REF TO if_cds_test_environment.
CLASS-METHODS class_setup.
CLASS-METHODS class_teardown.
METHODS setup.
METHODS row_count FOR TESTING.
METHODS count_of_busy_tutor FOR TESTING.
METHODS minutes_of_busy_tutor FOR TESTING.
METHODS count_of_top_tutor FOR TESTING.
METHODS minutes_of_top_tutor FOR TESTING.
METHODS zero_minutes_ignored FOR TESTING.
METHODS zero_minutes_reduce_count FOR TESTING.
METHODS tutor_with_two_lessons FOR TESTING.
METHODS tutor_without_lessons FOR TESTING.
METHODS name_is_shown FOR TESTING.
ENDCLASS.
CLASS {{p}}t31_hidden IMPLEMENTATION.
METHOD class_setup.
go_env = cl_cds_test_environment=>create( i_for_entity = '{{P}}I_TUTOR_LOAD' ).
ENDMETHOD.
METHOD class_teardown.
go_env->destroy( ).
ENDMETHOD.
METHOD setup.
DATA lt_tutor TYPE STANDARD TABLE OF {{p}}tutor WITH EMPTY KEY.
DATA lt_lesson TYPE STANDARD TABLE OF {{p}}lesson WITH EMPTY KEY.
go_env->clear_doubles( ).
lt_tutor = VALUE #( ( tutor_id = 'T1' tutor_name = 'ALICE' subject = 'PIANO' )
( tutor_id = 'T2' tutor_name = 'BOB' subject = 'GUITAR' )
( tutor_id = 'T3' tutor_name = 'CARLA' subject = 'VIOLIN' )
( tutor_id = 'T4' tutor_name = 'DAVE' subject = 'DRUMS' )
( tutor_id = 'T5' tutor_name = 'EMMA' subject = 'FLUTE' )
( tutor_id = 'T6' tutor_name = 'FELIX' subject = 'CELLO' ) ).
lt_lesson = VALUE #( ( lesson_id = 'L01' tutor_id = 'T1' dur_min = 30 )
( lesson_id = 'L02' tutor_id = 'T1' dur_min = 45 )
( lesson_id = 'L03' tutor_id = 'T1' dur_min = 45 )
( lesson_id = 'L04' tutor_id = 'T2' dur_min = 60 )
( lesson_id = 'L05' tutor_id = 'T2' dur_min = 60 )
( lesson_id = 'L06' tutor_id = 'T2' dur_min = 30 )
( lesson_id = 'L07' tutor_id = 'T2' dur_min = 15 )
( lesson_id = 'L08' tutor_id = 'T4' dur_min = 30 )
( lesson_id = 'L09' tutor_id = 'T4' dur_min = 30 )
( lesson_id = 'L10' tutor_id = 'T5' dur_min = 30 )
( lesson_id = 'L11' tutor_id = 'T5' dur_min = 30 )
( lesson_id = 'L12' tutor_id = 'T5' dur_min = 0 )
( lesson_id = 'L13' tutor_id = 'T6' dur_min = 30 )
( lesson_id = 'L14' tutor_id = 'T6' dur_min = 30 )
( lesson_id = 'L15' tutor_id = 'T6' dur_min = 30 )
( lesson_id = 'L16' tutor_id = 'T6' dur_min = 0 ) ).
go_env->insert_test_data( lt_tutor ).
go_env->insert_test_data( lt_lesson ).
ENDMETHOD.
METHOD row_count.
SELECT COUNT(*) FROM {{p}}i_tutor_load INTO @DATA(lv_rows).
cl_abap_unit_assert=>assert_equals( exp = 3 act = CONV i( lv_rows ) ).
ENDMETHOD.
METHOD count_of_busy_tutor.
SELECT SINGLE lesson_count FROM {{p}}i_tutor_load WHERE tutor_id = 'T1' INTO @DATA(lv_count).
cl_abap_unit_assert=>assert_equals( exp = 3 act = CONV i( lv_count ) ).
ENDMETHOD.
METHOD minutes_of_busy_tutor.
SELECT SINGLE total_minutes FROM {{p}}i_tutor_load WHERE tutor_id = 'T1' INTO @DATA(lv_total).
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( 120 ) act = CONV decfloat34( lv_total ) ).
ENDMETHOD.
METHOD count_of_top_tutor.
SELECT SINGLE lesson_count FROM {{p}}i_tutor_load WHERE tutor_id = 'T2' INTO @DATA(lv_count).
cl_abap_unit_assert=>assert_equals( exp = 4 act = CONV i( lv_count ) ).
ENDMETHOD.
METHOD minutes_of_top_tutor.
SELECT SINGLE total_minutes FROM {{p}}i_tutor_load WHERE tutor_id = 'T2' INTO @DATA(lv_total).
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( 165 ) act = CONV decfloat34( lv_total ) ).
ENDMETHOD.
METHOD zero_minutes_ignored.
SELECT SINGLE lesson_count, total_minutes FROM {{p}}i_tutor_load
WHERE tutor_id = 'T6' INTO @DATA(ls_load).
cl_abap_unit_assert=>assert_equals( exp = 3 act = CONV i( ls_load-lesson_count ) ).
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( 90 )
act = CONV decfloat34( ls_load-total_minutes ) ).
ENDMETHOD.
METHOD zero_minutes_reduce_count.
SELECT COUNT(*) FROM {{p}}i_tutor_load WHERE tutor_id = 'T5' INTO @DATA(lv_rows).
cl_abap_unit_assert=>assert_equals( exp = 0 act = CONV i( lv_rows ) ).
ENDMETHOD.
METHOD tutor_with_two_lessons.
SELECT COUNT(*) FROM {{p}}i_tutor_load WHERE tutor_id = 'T4' INTO @DATA(lv_rows).
cl_abap_unit_assert=>assert_equals( exp = 0 act = CONV i( lv_rows ) ).
ENDMETHOD.
METHOD tutor_without_lessons.
SELECT COUNT(*) FROM {{p}}i_tutor_load WHERE tutor_id = 'T3' INTO @DATA(lv_rows).
cl_abap_unit_assert=>assert_equals( exp = 0 act = CONV i( lv_rows ) ).
ENDMETHOD.
METHOD name_is_shown.
SELECT SINGLE tutor_name FROM {{p}}i_tutor_load WHERE tutor_id = 'T2' INTO @DATA(lv_name).
cl_abap_unit_assert=>assert_equals( exp = 'BOB' act = lv_name ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,71 @@
{
"task": "G1032",
"mutants": [
{
"object": "{{P}}I_TUTOR_LOAD",
"mutant": "line 5: inner join -> left outer join (join)",
"status": "survived",
"hidden": "10/10",
"failed_tests": []
},
{
"object": "{{P}}I_TUTOR_LOAD",
"mutant": "line 5: = -> <> (eq)",
"status": "killed",
"hidden": "1/10",
"failed_tests": [
"COUNT_OF_BUSY_TUTOR",
"COUNT_OF_TOP_TUTOR",
"MINUTES_OF_BUSY_TUTOR",
"MINUTES_OF_TOP_TUTOR",
"ROW_COUNT",
"TUTOR_WITHOUT_LESSONS",
"TUTOR_WITH_TWO_LESSONS",
"ZERO_MINUTES_IGNORED",
"ZERO_MINUTES_REDUCE_COUNT"
]
},
{
"object": "{{P}}I_TUTOR_LOAD",
"mutant": "line 10: sum( -> max( (agg)",
"status": "killed",
"hidden": "7/10",
"failed_tests": [
"MINUTES_OF_BUSY_TUTOR",
"MINUTES_OF_TOP_TUTOR",
"ZERO_MINUTES_IGNORED"
]
},
{
"object": "{{P}}I_TUTOR_LOAD",
"mutant": "line 12: > -> <= (rel)",
"status": "killed",
"hidden": "3/10",
"failed_tests": [
"COUNT_OF_BUSY_TUTOR",
"COUNT_OF_TOP_TUTOR",
"MINUTES_OF_BUSY_TUTOR",
"MINUTES_OF_TOP_TUTOR",
"NAME_IS_SHOWN",
"ROW_COUNT",
"ZERO_MINUTES_IGNORED"
]
},
{
"object": "{{P}}I_TUTOR_LOAD",
"mutant": "line 16: 3 -> 4 (const)",
"status": "killed",
"hidden": "6/10",
"failed_tests": [
"COUNT_OF_BUSY_TUTOR",
"MINUTES_OF_BUSY_TUTOR",
"ROW_COUNT",
"ZERO_MINUTES_IGNORED"
]
}
],
"valid": 5,
"killed": 4,
"kill_rate": 0.8,
"ok": true
}

View File

@@ -0,0 +1,16 @@
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'Tutor load'
define view entity {{P}}I_TUTOR_LOAD
as select from {{p}}tutor as tutor
inner join {{p}}lesson as lesson on lesson.tutor_id = tutor.tutor_id
{
key tutor.tutor_id as tutor_id,
tutor.tutor_name as tutor_name,
count( * ) as lesson_count,
sum( lesson.dur_min ) as total_minutes
}
where lesson.dur_min > 0
group by
tutor.tutor_id,
tutor.tutor_name
having count( * ) >= 3

View File

@@ -0,0 +1,40 @@
CLASS {{p}}t31_test DEFINITION PUBLIC FINAL CREATE PUBLIC
FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
CLASS-DATA go_env TYPE REF TO if_cds_test_environment.
CLASS-METHODS class_setup.
CLASS-METHODS class_teardown.
METHODS setup.
METHODS load_of_one_tutor FOR TESTING.
ENDCLASS.
CLASS {{p}}t31_test IMPLEMENTATION.
METHOD class_setup.
go_env = cl_cds_test_environment=>create( i_for_entity = '{{P}}I_TUTOR_LOAD' ).
ENDMETHOD.
METHOD class_teardown.
go_env->destroy( ).
ENDMETHOD.
METHOD setup.
go_env->clear_doubles( ).
ENDMETHOD.
METHOD load_of_one_tutor.
DATA lt_tutor TYPE STANDARD TABLE OF {{p}}tutor WITH EMPTY KEY.
DATA lt_lesson TYPE STANDARD TABLE OF {{p}}lesson WITH EMPTY KEY.
lt_tutor = VALUE #( ( tutor_id = 'A' tutor_name = 'ANNA' subject = 'PIANO' ) ).
lt_lesson = VALUE #( ( lesson_id = 'X1' tutor_id = 'A' dur_min = 20 )
( lesson_id = 'X2' tutor_id = 'A' dur_min = 40 )
( lesson_id = 'X3' tutor_id = 'A' dur_min = 60 ) ).
go_env->insert_test_data( lt_tutor ).
go_env->insert_test_data( lt_lesson ).
SELECT SINGLE lesson_count, total_minutes FROM {{p}}i_tutor_load
WHERE tutor_id = 'A' INTO @DATA(ls_load).
cl_abap_unit_assert=>assert_equals( exp = 3 act = CONV i( ls_load-lesson_count ) ).
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( 120 )
act = CONV decfloat34( ls_load-total_minutes ) ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,12 @@
@EndUserText.label : 'Lesson'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #RESTRICTED
define table {{p}}lesson {
key client : abap.clnt not null;
key lesson_id : abap.char(10) not null;
tutor_id : abap.char(10);
lesson_date : abap.dats;
dur_min : abap.int4;
}

View File

@@ -0,0 +1,11 @@
@EndUserText.label : 'Tutor'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #RESTRICTED
define table {{p}}tutor {
key client : abap.clnt not null;
key tutor_id : abap.char(10) not null;
tutor_name : abap.char(30);
subject : abap.char(20);
}

View File

@@ -0,0 +1,39 @@
# 1. Goal
Show the workload of each tutor of a music school. A report and an OData
service will read the workload, so the calculation must be in the database,
in a CDS view.
# 2. Open questions
None.
# 3. Context
- Table {{P}}TUTOR (tutor master data), package $TMP. Key: TUTOR_ID (CHAR 10).
Fields: TUTOR_NAME (CHAR 30), SUBJECT (CHAR 20).
- Table {{P}}LESSON (the lessons that the tutors give), package $TMP.
Key: LESSON_ID (CHAR 10). Fields: TUTOR_ID (CHAR 10), LESSON_DATE (DATS),
DUR_MIN (INT4, the length of the lesson in minutes).
# 4. Contract
- Create the CDS view entity {{P}}I_TUTOR_LOAD in package $TMP.
- Elements, with these names: TUTOR_ID (key), TUTOR_NAME, LESSON_COUNT,
TOTAL_MINUTES.
- No authorization check (#NOT_REQUIRED).
# 5. Business rules
1. Count only lessons with DUR_MIN greater than 0. A lesson with DUR_MIN = 0
is not a lesson of this view. It does not count and it does not add minutes.
2. Show one row for each tutor who has at least 3 lessons. Do not show a tutor
with fewer than 3 lessons. Do not show a tutor without lessons.
3. LESSON_COUNT is the number of lessons of the tutor.
4. TOTAL_MINUTES is the sum of the DUR_MIN values of all lessons of the tutor.
5. TUTOR_NAME is the name of the tutor.
# 6. Constraints
- Release target: 8.16 (SAP_BASIS 816).
- Coding standards: Clean ABAP.
- Out of scope: do not change {{P}}TUTOR and {{P}}LESSON.
# 7. Acceptance
- The view is active and has no syntax error.
- The hidden tests pass.
- Write ABAP Unit tests with CL_CDS_TEST_ENVIRONMENT in a global test class.

View File

@@ -0,0 +1,65 @@
{
"id": "G1032",
"category": "B",
"object_type": "DDLS",
"difficulty": 2,
"release_target": "v816",
"expected_outcome": "implement",
"budget": {
"max_tool_calls": 60,
"max_activations": 15
},
"seed": [
{
"type": "TABL",
"name": "{{P}}TUTOR",
"file": "seed/tutor.tabl.asabap",
"description": "Tutor master data"
},
{
"type": "TABL",
"name": "{{P}}LESSON",
"file": "seed/lesson.tabl.asabap",
"description": "Lessons that the tutors give"
}
],
"contract": [
{
"type": "DDLS",
"name": "{{P}}I_TUTOR_LOAD",
"fields": [
"TUTOR_ID",
"TUTOR_NAME",
"LESSON_COUNT",
"TOTAL_MINUTES"
]
}
],
"out_of_scope": [
"{{P}}TUTOR",
"{{P}}LESSON"
],
"hidden_tests": [
{
"type": "CLAS",
"name": "{{P}}T31_HIDDEN",
"file": "hidden/t31_hidden.clas.abap",
"description": "T31 hidden tests"
}
],
"reference": [
{
"type": "DDLS",
"name": "{{P}}I_TUTOR_LOAD",
"file": "reference/i_tutor_load.ddls.asddls",
"description": "Workload of each tutor"
},
{
"type": "CLAS",
"name": "{{P}}T31_TEST",
"file": "reference/t31_test.clas.abap",
"description": "T31 own tests"
}
],
"craft_checks": []
}