Snapshot: new training tasks (balanced generation), docs
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
34
tasks_gen/train/G1928/faulty/m0_i_wind_grade.ddls.asddls
Normal file
34
tasks_gen/train/G1928/faulty/m0_i_wind_grade.ddls.asddls
Normal file
@@ -0,0 +1,34 @@
|
||||
@AccessControl.authorizationCheck: #NOT_REQUIRED
|
||||
@EndUserText.label: 'Wind turbine yield grade'
|
||||
define view entity {{P}}I_WIND_GRADE
|
||||
as select from {{p}}yield as y
|
||||
left outer join {{p}}turbine as t on t.turbine_id = y.turbine_id
|
||||
{
|
||||
key y.turbine_id as turbine_id,
|
||||
key y.calmonth as calmonth,
|
||||
t.site as site,
|
||||
y.energy_kwh as energy_kwh,
|
||||
y.downtime_hrs as downtime_hrs,
|
||||
case
|
||||
when y.energy_kwh >= 200000 then 'A'
|
||||
when y.energy_kwh >= 100000 then 'B'
|
||||
when y.energy_kwh >= 50000 then 'C'
|
||||
when y.energy_kwh >= 10000 then 'D'
|
||||
else 'E'
|
||||
end as yield_grade,
|
||||
case
|
||||
when y.downtime_hrs <= 10 then 'FULL'
|
||||
when y.downtime_hrs <= 100 then 'PARTIAL'
|
||||
else 'POOR'
|
||||
end as availability,
|
||||
case
|
||||
when y.energy_kwh >= 200000 and y.downtime_hrs <= 10 then 'TOP'
|
||||
when y.energy_kwh >= 100000 and y.downtime_hrs <= 100 then 'GOOD'
|
||||
else 'WEAK'
|
||||
end as rating,
|
||||
case
|
||||
when y.downtime_hrs > 100 then y.downtime_hrs * 25
|
||||
when y.downtime_hrs > 10 then y.downtime_hrs * 10
|
||||
else 0
|
||||
end as penalty
|
||||
}
|
||||
34
tasks_gen/train/G1928/faulty/m1_i_wind_grade.ddls.asddls
Normal file
34
tasks_gen/train/G1928/faulty/m1_i_wind_grade.ddls.asddls
Normal file
@@ -0,0 +1,34 @@
|
||||
@AccessControl.authorizationCheck: #NOT_REQUIRED
|
||||
@EndUserText.label: 'Wind turbine yield grade'
|
||||
define view entity {{P}}I_WIND_GRADE
|
||||
as select from {{p}}yield as y
|
||||
inner join {{p}}turbine as t on t.turbine_id = y.turbine_id
|
||||
{
|
||||
key y.turbine_id as turbine_id,
|
||||
key y.calmonth as calmonth,
|
||||
t.site as site,
|
||||
y.energy_kwh as energy_kwh,
|
||||
y.downtime_hrs as downtime_hrs,
|
||||
case
|
||||
when y.energy_kwh < 200000 then 'A'
|
||||
when y.energy_kwh >= 100000 then 'B'
|
||||
when y.energy_kwh >= 50000 then 'C'
|
||||
when y.energy_kwh >= 10000 then 'D'
|
||||
else 'E'
|
||||
end as yield_grade,
|
||||
case
|
||||
when y.downtime_hrs <= 10 then 'FULL'
|
||||
when y.downtime_hrs <= 100 then 'PARTIAL'
|
||||
else 'POOR'
|
||||
end as availability,
|
||||
case
|
||||
when y.energy_kwh >= 200000 and y.downtime_hrs <= 10 then 'TOP'
|
||||
when y.energy_kwh >= 100000 and y.downtime_hrs <= 100 then 'GOOD'
|
||||
else 'WEAK'
|
||||
end as rating,
|
||||
case
|
||||
when y.downtime_hrs > 100 then y.downtime_hrs * 25
|
||||
when y.downtime_hrs > 10 then y.downtime_hrs * 10
|
||||
else 0
|
||||
end as penalty
|
||||
}
|
||||
34
tasks_gen/train/G1928/faulty/m2_i_wind_grade.ddls.asddls
Normal file
34
tasks_gen/train/G1928/faulty/m2_i_wind_grade.ddls.asddls
Normal file
@@ -0,0 +1,34 @@
|
||||
@AccessControl.authorizationCheck: #NOT_REQUIRED
|
||||
@EndUserText.label: 'Wind turbine yield grade'
|
||||
define view entity {{P}}I_WIND_GRADE
|
||||
as select from {{p}}yield as y
|
||||
inner join {{p}}turbine as t on t.turbine_id = y.turbine_id
|
||||
{
|
||||
key y.turbine_id as turbine_id,
|
||||
key y.calmonth as calmonth,
|
||||
t.site as site,
|
||||
y.energy_kwh as energy_kwh,
|
||||
y.downtime_hrs as downtime_hrs,
|
||||
case
|
||||
when y.energy_kwh >= 200000 then 'A'
|
||||
when y.energy_kwh >= 100000 then 'B'
|
||||
when y.energy_kwh >= 50000 then 'C'
|
||||
when y.energy_kwh >= 10000 then 'D'
|
||||
else 'E'
|
||||
end as yield_grade,
|
||||
case
|
||||
when y.downtime_hrs <= 10 then 'FULL'
|
||||
when y.downtime_hrs <= 100 then 'PARTIAL'
|
||||
else 'POOR'
|
||||
end as availability,
|
||||
case
|
||||
when y.energy_kwh >= 200000 or y.downtime_hrs <= 10 then 'TOP'
|
||||
when y.energy_kwh >= 100000 and y.downtime_hrs <= 100 then 'GOOD'
|
||||
else 'WEAK'
|
||||
end as rating,
|
||||
case
|
||||
when y.downtime_hrs > 100 then y.downtime_hrs * 25
|
||||
when y.downtime_hrs > 10 then y.downtime_hrs * 10
|
||||
else 0
|
||||
end as penalty
|
||||
}
|
||||
34
tasks_gen/train/G1928/faulty/m3_i_wind_grade.ddls.asddls
Normal file
34
tasks_gen/train/G1928/faulty/m3_i_wind_grade.ddls.asddls
Normal file
@@ -0,0 +1,34 @@
|
||||
@AccessControl.authorizationCheck: #NOT_REQUIRED
|
||||
@EndUserText.label: 'Wind turbine yield grade'
|
||||
define view entity {{P}}I_WIND_GRADE
|
||||
as select from {{p}}yield as y
|
||||
inner join {{p}}turbine as t on t.turbine_id = y.turbine_id
|
||||
{
|
||||
key y.turbine_id as turbine_id,
|
||||
key y.calmonth as calmonth,
|
||||
t.site as site,
|
||||
y.energy_kwh as energy_kwh,
|
||||
y.downtime_hrs as downtime_hrs,
|
||||
case
|
||||
when y.energy_kwh >= 200000 then 'A'
|
||||
when y.energy_kwh >= 100000 then 'B'
|
||||
when y.energy_kwh >= 50000 then 'C'
|
||||
when y.energy_kwh >= 10000 then 'D'
|
||||
else 'E'
|
||||
end as yield_grade,
|
||||
case
|
||||
when y.downtime_hrs <= 10 then 'FULL'
|
||||
when y.downtime_hrs <= 100 then 'PARTIAL'
|
||||
else 'POOR'
|
||||
end as availability,
|
||||
case
|
||||
when y.energy_kwh >= 200000 and y.downtime_hrs <= 10 then 'TOP'
|
||||
when y.energy_kwh >= 100000 and y.downtime_hrs <= 101 then 'GOOD'
|
||||
else 'WEAK'
|
||||
end as rating,
|
||||
case
|
||||
when y.downtime_hrs > 100 then y.downtime_hrs * 25
|
||||
when y.downtime_hrs > 10 then y.downtime_hrs * 10
|
||||
else 0
|
||||
end as penalty
|
||||
}
|
||||
34
tasks_gen/train/G1928/faulty/m4_i_wind_grade.ddls.asddls
Normal file
34
tasks_gen/train/G1928/faulty/m4_i_wind_grade.ddls.asddls
Normal file
@@ -0,0 +1,34 @@
|
||||
@AccessControl.authorizationCheck: #NOT_REQUIRED
|
||||
@EndUserText.label: 'Wind turbine yield grade'
|
||||
define view entity {{P}}I_WIND_GRADE
|
||||
as select from {{p}}yield as y
|
||||
inner join {{p}}turbine as t on t.turbine_id = y.turbine_id
|
||||
{
|
||||
key y.turbine_id as turbine_id,
|
||||
key y.calmonth as calmonth,
|
||||
t.site as site,
|
||||
y.energy_kwh as energy_kwh,
|
||||
y.downtime_hrs as downtime_hrs,
|
||||
case
|
||||
when y.energy_kwh >= 200000 then 'A'
|
||||
when y.energy_kwh >= 100000 then 'B'
|
||||
when y.energy_kwh >= 50000 then 'C'
|
||||
when y.energy_kwh >= 10000 then 'D'
|
||||
else 'E'
|
||||
end as yield_grade,
|
||||
case
|
||||
when y.downtime_hrs <= 10 then 'FULL'
|
||||
when y.downtime_hrs <= 100 then 'PARTIAL'
|
||||
else 'POOR'
|
||||
end as availability,
|
||||
case
|
||||
when y.energy_kwh >= 200000 and y.downtime_hrs <= 10 then 'TOP'
|
||||
when y.energy_kwh >= 100000 and y.downtime_hrs <= 100 then 'GOOD'
|
||||
else 'ZEAK'
|
||||
end as rating,
|
||||
case
|
||||
when y.downtime_hrs > 100 then y.downtime_hrs * 25
|
||||
when y.downtime_hrs > 10 then y.downtime_hrs * 10
|
||||
else 0
|
||||
end as penalty
|
||||
}
|
||||
29
tasks_gen/train/G1928/generation.json
Normal file
29
tasks_gen/train/G1928/generation.json
Normal file
@@ -0,0 +1,29 @@
|
||||
{
|
||||
"id": "G1928",
|
||||
"pool": "train",
|
||||
"object_type": "DDLS",
|
||||
"category": "E",
|
||||
"attempts": [
|
||||
{
|
||||
"stage": "validate",
|
||||
"oracle": 100.0,
|
||||
"null": 0,
|
||||
"mutation": {
|
||||
"valid": 5,
|
||||
"killed": 3,
|
||||
"ok": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"stage": "validate",
|
||||
"oracle": 100.0,
|
||||
"null": 0,
|
||||
"mutation": {
|
||||
"valid": 5,
|
||||
"killed": 5,
|
||||
"ok": true
|
||||
}
|
||||
}
|
||||
],
|
||||
"accepted": true
|
||||
}
|
||||
159
tasks_gen/train/G1928/hidden/t31_hidden.clas.abap
Normal file
159
tasks_gen/train/G1928/hidden/t31_hidden.clas.abap
Normal file
@@ -0,0 +1,159 @@
|
||||
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 grade_a_top FOR TESTING.
|
||||
METHODS grade_b_good FOR TESTING.
|
||||
METHODS grade_c_weak FOR TESTING.
|
||||
METHODS grade_d_and_e FOR TESTING.
|
||||
METHODS avail_poor FOR TESTING.
|
||||
METHODS rating_weak FOR TESTING.
|
||||
METHODS rating_at_101_hrs FOR TESTING.
|
||||
METHODS penalty_high FOR TESTING.
|
||||
METHODS penalty_mid FOR TESTING.
|
||||
METHODS penalty_zero FOR TESTING.
|
||||
METHODS row_count FOR TESTING.
|
||||
METHODS orphan_yield_hidden FOR TESTING.
|
||||
ENDCLASS.
|
||||
|
||||
|
||||
CLASS {{p}}t31_hidden IMPLEMENTATION.
|
||||
|
||||
METHOD class_setup.
|
||||
go_env = cl_cds_test_environment=>create( i_for_entity = '{{P}}I_WIND_GRADE' ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD class_teardown.
|
||||
go_env->destroy( ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD setup.
|
||||
DATA lt_turbine TYPE STANDARD TABLE OF {{p}}turbine WITH EMPTY KEY.
|
||||
DATA lt_yield TYPE STANDARD TABLE OF {{p}}yield WITH EMPTY KEY.
|
||||
|
||||
go_env->clear_doubles( ).
|
||||
|
||||
lt_turbine = VALUE #(
|
||||
( turbine_id = 'T1' site = 'NORTH' capacity_kw = 2000 commissioned = '20150101' )
|
||||
( turbine_id = 'T2' site = 'SOUTH' capacity_kw = 1500 commissioned = '20180101' )
|
||||
( turbine_id = 'T3' site = 'NORTH' capacity_kw = 800 commissioned = '20200101' ) ).
|
||||
|
||||
lt_yield = VALUE #(
|
||||
( turbine_id = 'T1' calmonth = '202401' energy_kwh = '250000.00' downtime_hrs = 5 )
|
||||
( turbine_id = 'T1' calmonth = '202402' energy_kwh = '200000.00' downtime_hrs = 10 )
|
||||
( turbine_id = 'T1' calmonth = '202403' energy_kwh = '250000.00' downtime_hrs = 200 )
|
||||
( turbine_id = 'T2' calmonth = '202401' energy_kwh = '100000.00' downtime_hrs = 100 )
|
||||
( turbine_id = 'T2' calmonth = '202402' energy_kwh = '99999.99' downtime_hrs = 101 )
|
||||
( turbine_id = 'T2' calmonth = '202403' energy_kwh = '50000.00' downtime_hrs = 11 )
|
||||
( turbine_id = 'T2' calmonth = '202404' energy_kwh = '10000.00' downtime_hrs = 0 )
|
||||
( turbine_id = 'T2' calmonth = '202405' energy_kwh = '9999.99' downtime_hrs = 0 )
|
||||
( turbine_id = 'T2' calmonth = '202406' energy_kwh = '150000.00' downtime_hrs = 101 )
|
||||
( turbine_id = 'T9' calmonth = '202407' energy_kwh = '300000.00' downtime_hrs = 0 ) ).
|
||||
|
||||
go_env->insert_test_data( lt_turbine ).
|
||||
go_env->insert_test_data( lt_yield ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD grade_a_top.
|
||||
SELECT SINGLE yield_grade, availability, rating, penalty
|
||||
FROM {{p}}i_wind_grade
|
||||
WHERE turbine_id = 'T1' AND calmonth = '202402'
|
||||
INTO @DATA(ls_row).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 'A' act = ls_row-yield_grade ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 'FULL' act = ls_row-availability ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 'TOP' act = ls_row-rating ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( 0 )
|
||||
act = CONV decfloat34( ls_row-penalty ) ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD grade_b_good.
|
||||
SELECT SINGLE site, yield_grade, availability, rating, penalty
|
||||
FROM {{p}}i_wind_grade
|
||||
WHERE turbine_id = 'T2' AND calmonth = '202401'
|
||||
INTO @DATA(ls_row).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 'SOUTH' act = ls_row-site ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 'B' act = ls_row-yield_grade ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 'PARTIAL' act = ls_row-availability ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 'GOOD' act = ls_row-rating ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( 1000 )
|
||||
act = CONV decfloat34( ls_row-penalty ) ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD grade_c_weak.
|
||||
SELECT SINGLE yield_grade, rating FROM {{p}}i_wind_grade
|
||||
WHERE turbine_id = 'T2' AND calmonth = '202403'
|
||||
INTO @DATA(ls_row).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 'C' act = ls_row-yield_grade ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 'WEAK' act = ls_row-rating ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD grade_d_and_e.
|
||||
SELECT SINGLE yield_grade FROM {{p}}i_wind_grade
|
||||
WHERE turbine_id = 'T2' AND calmonth = '202404' INTO @DATA(lv_grade_d).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 'D' act = lv_grade_d ).
|
||||
|
||||
SELECT SINGLE yield_grade FROM {{p}}i_wind_grade
|
||||
WHERE turbine_id = 'T2' AND calmonth = '202405' INTO @DATA(lv_grade_e).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 'E' act = lv_grade_e ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD avail_poor.
|
||||
SELECT SINGLE yield_grade, availability FROM {{p}}i_wind_grade
|
||||
WHERE turbine_id = 'T2' AND calmonth = '202402' INTO @DATA(ls_row).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 'POOR' act = ls_row-availability ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 'C' act = ls_row-yield_grade ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD rating_weak.
|
||||
SELECT SINGLE rating FROM {{p}}i_wind_grade
|
||||
WHERE turbine_id = 'T1' AND calmonth = '202403' INTO @DATA(lv_rating).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 'WEAK' act = lv_rating ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD rating_at_101_hrs.
|
||||
SELECT SINGLE yield_grade, availability, rating FROM {{p}}i_wind_grade
|
||||
WHERE turbine_id = 'T2' AND calmonth = '202406' INTO @DATA(ls_row).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 'B' act = ls_row-yield_grade ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 'POOR' act = ls_row-availability ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 'WEAK' act = ls_row-rating ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD penalty_high.
|
||||
SELECT SINGLE penalty FROM {{p}}i_wind_grade
|
||||
WHERE turbine_id = 'T1' AND calmonth = '202403' INTO @DATA(lv_penalty).
|
||||
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( 5000 )
|
||||
act = CONV decfloat34( lv_penalty ) ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD penalty_mid.
|
||||
SELECT SINGLE penalty FROM {{p}}i_wind_grade
|
||||
WHERE turbine_id = 'T2' AND calmonth = '202403' INTO @DATA(lv_penalty).
|
||||
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( 110 )
|
||||
act = CONV decfloat34( lv_penalty ) ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD penalty_zero.
|
||||
SELECT SINGLE penalty FROM {{p}}i_wind_grade
|
||||
WHERE turbine_id = 'T1' AND calmonth = '202401' INTO @DATA(lv_penalty).
|
||||
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( 0 )
|
||||
act = CONV decfloat34( lv_penalty ) ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD row_count.
|
||||
SELECT COUNT(*) FROM {{p}}i_wind_grade INTO @DATA(lv_rows).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 9 act = lv_rows ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD orphan_yield_hidden.
|
||||
SELECT COUNT(*) FROM {{p}}i_wind_grade
|
||||
WHERE turbine_id = 'T9' INTO @DATA(lv_orphan).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 0 act = lv_orphan ).
|
||||
|
||||
SELECT COUNT(*) FROM {{p}}i_wind_grade
|
||||
WHERE turbine_id = 'T3' INTO @DATA(lv_no_yield).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 0 act = lv_no_yield ).
|
||||
ENDMETHOD.
|
||||
ENDCLASS.
|
||||
62
tasks_gen/train/G1928/mutation.json
Normal file
62
tasks_gen/train/G1928/mutation.json
Normal file
@@ -0,0 +1,62 @@
|
||||
{
|
||||
"task": "G1928",
|
||||
"mutants": [
|
||||
{
|
||||
"object": "{{P}}I_WIND_GRADE",
|
||||
"mutant": "line 5: inner join -> left outer join (join)",
|
||||
"status": "killed",
|
||||
"hidden": "10/12",
|
||||
"failed_tests": [
|
||||
"ORPHAN_YIELD_HIDDEN",
|
||||
"ROW_COUNT"
|
||||
]
|
||||
},
|
||||
{
|
||||
"object": "{{P}}I_WIND_GRADE",
|
||||
"mutant": "line 13: >= -> < (rel)",
|
||||
"status": "killed",
|
||||
"hidden": "6/12",
|
||||
"failed_tests": [
|
||||
"AVAIL_POOR",
|
||||
"GRADE_A_TOP",
|
||||
"GRADE_B_GOOD",
|
||||
"GRADE_C_WEAK",
|
||||
"GRADE_D_AND_E",
|
||||
"RATING_AT_101_HRS"
|
||||
]
|
||||
},
|
||||
{
|
||||
"object": "{{P}}I_WIND_GRADE",
|
||||
"mutant": "line 25: and -> or (logic)",
|
||||
"status": "killed",
|
||||
"hidden": "11/12",
|
||||
"failed_tests": [
|
||||
"RATING_WEAK"
|
||||
]
|
||||
},
|
||||
{
|
||||
"object": "{{P}}I_WIND_GRADE",
|
||||
"mutant": "line 26: 100 -> 101 (const)",
|
||||
"status": "killed",
|
||||
"hidden": "11/12",
|
||||
"failed_tests": [
|
||||
"RATING_AT_101_HRS"
|
||||
]
|
||||
},
|
||||
{
|
||||
"object": "{{P}}I_WIND_GRADE",
|
||||
"mutant": "line 27: 'WEAK' -> 'ZEAK' (lit)",
|
||||
"status": "killed",
|
||||
"hidden": "9/12",
|
||||
"failed_tests": [
|
||||
"GRADE_C_WEAK",
|
||||
"RATING_AT_101_HRS",
|
||||
"RATING_WEAK"
|
||||
]
|
||||
}
|
||||
],
|
||||
"valid": 5,
|
||||
"killed": 5,
|
||||
"kill_rate": 1.0,
|
||||
"ok": true
|
||||
}
|
||||
34
tasks_gen/train/G1928/reference/i_wind_grade.ddls.asddls
Normal file
34
tasks_gen/train/G1928/reference/i_wind_grade.ddls.asddls
Normal file
@@ -0,0 +1,34 @@
|
||||
@AccessControl.authorizationCheck: #NOT_REQUIRED
|
||||
@EndUserText.label: 'Wind turbine yield grade'
|
||||
define view entity {{P}}I_WIND_GRADE
|
||||
as select from {{p}}yield as y
|
||||
inner join {{p}}turbine as t on t.turbine_id = y.turbine_id
|
||||
{
|
||||
key y.turbine_id as turbine_id,
|
||||
key y.calmonth as calmonth,
|
||||
t.site as site,
|
||||
y.energy_kwh as energy_kwh,
|
||||
y.downtime_hrs as downtime_hrs,
|
||||
case
|
||||
when y.energy_kwh >= 200000 then 'A'
|
||||
when y.energy_kwh >= 100000 then 'B'
|
||||
when y.energy_kwh >= 50000 then 'C'
|
||||
when y.energy_kwh >= 10000 then 'D'
|
||||
else 'E'
|
||||
end as yield_grade,
|
||||
case
|
||||
when y.downtime_hrs <= 10 then 'FULL'
|
||||
when y.downtime_hrs <= 100 then 'PARTIAL'
|
||||
else 'POOR'
|
||||
end as availability,
|
||||
case
|
||||
when y.energy_kwh >= 200000 and y.downtime_hrs <= 10 then 'TOP'
|
||||
when y.energy_kwh >= 100000 and y.downtime_hrs <= 100 then 'GOOD'
|
||||
else 'WEAK'
|
||||
end as rating,
|
||||
case
|
||||
when y.downtime_hrs > 100 then y.downtime_hrs * 25
|
||||
when y.downtime_hrs > 10 then y.downtime_hrs * 10
|
||||
else 0
|
||||
end as penalty
|
||||
}
|
||||
64
tasks_gen/train/G1928/reference/t31_test.clas.abap
Normal file
64
tasks_gen/train/G1928/reference/t31_test.clas.abap
Normal file
@@ -0,0 +1,64 @@
|
||||
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 grades_one_month FOR TESTING.
|
||||
METHODS excludes_turbine_without_yield FOR TESTING.
|
||||
METHODS excludes_orphan_yield FOR TESTING.
|
||||
ENDCLASS.
|
||||
|
||||
|
||||
CLASS {{p}}t31_test IMPLEMENTATION.
|
||||
|
||||
METHOD class_setup.
|
||||
go_env = cl_cds_test_environment=>create( i_for_entity = '{{P}}I_WIND_GRADE' ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD class_teardown.
|
||||
go_env->destroy( ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD setup.
|
||||
DATA lt_turbine TYPE STANDARD TABLE OF {{p}}turbine WITH EMPTY KEY.
|
||||
DATA lt_yield TYPE STANDARD TABLE OF {{p}}yield WITH EMPTY KEY.
|
||||
|
||||
go_env->clear_doubles( ).
|
||||
|
||||
lt_turbine = VALUE #(
|
||||
( turbine_id = 'T1' site = 'NORTH' capacity_kw = 2000 commissioned = '20150101' )
|
||||
( turbine_id = 'T2' site = 'SOUTH' capacity_kw = 1500 commissioned = '20180101' ) ).
|
||||
|
||||
lt_yield = VALUE #(
|
||||
( turbine_id = 'T1' calmonth = '202401' energy_kwh = '250000.00' downtime_hrs = 5 )
|
||||
( turbine_id = 'T9' calmonth = '202401' energy_kwh = '300000.00' downtime_hrs = 0 ) ).
|
||||
|
||||
go_env->insert_test_data( lt_turbine ).
|
||||
go_env->insert_test_data( lt_yield ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD grades_one_month.
|
||||
SELECT SINGLE yield_grade, availability, rating, penalty
|
||||
FROM {{p}}i_wind_grade
|
||||
WHERE turbine_id = 'T1' AND calmonth = '202401'
|
||||
INTO @DATA(ls_row).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 'A' act = ls_row-yield_grade ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 'FULL' act = ls_row-availability ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 'TOP' act = ls_row-rating ).
|
||||
cl_abap_unit_assert=>assert_equals( exp = CONV decfloat34( 0 )
|
||||
act = CONV decfloat34( ls_row-penalty ) ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD excludes_turbine_without_yield.
|
||||
SELECT COUNT(*) FROM {{p}}i_wind_grade INTO @DATA(lv_rows).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 1 act = lv_rows ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD excludes_orphan_yield.
|
||||
SELECT COUNT(*) FROM {{p}}i_wind_grade
|
||||
WHERE turbine_id = 'T9' INTO @DATA(lv_rows).
|
||||
cl_abap_unit_assert=>assert_equals( exp = 0 act = lv_rows ).
|
||||
ENDMETHOD.
|
||||
ENDCLASS.
|
||||
48
tasks_gen/train/G1928/seed/i_wind_grade.ddls.asddls
Normal file
48
tasks_gen/train/G1928/seed/i_wind_grade.ddls.asddls
Normal file
@@ -0,0 +1,48 @@
|
||||
@AbapCatalog.sqlViewName: '{{p}}WGRD'
|
||||
@AbapCatalog.preserveKey: true
|
||||
@AccessControl.authorizationCheck: #NOT_REQUIRED
|
||||
@EndUserText.label: 'Wind turbine yield grade'
|
||||
define view {{P}}I_WIND_GRADE
|
||||
as select from {{p}}yield as y
|
||||
inner join {{p}}turbine as t on t.turbine_id = y.turbine_id
|
||||
{
|
||||
key y.turbine_id as turbine_id,
|
||||
key y.calmonth as calmonth,
|
||||
t.site as site,
|
||||
y.energy_kwh as energy_kwh,
|
||||
y.downtime_hrs as downtime_hrs,
|
||||
case
|
||||
when y.energy_kwh >= 200000 then 'A'
|
||||
else case
|
||||
when y.energy_kwh >= 100000 then 'B'
|
||||
else case
|
||||
when y.energy_kwh >= 50000 then 'C'
|
||||
else case
|
||||
when y.energy_kwh >= 10000 then 'D'
|
||||
else 'E'
|
||||
end
|
||||
end
|
||||
end
|
||||
end as yield_grade,
|
||||
case
|
||||
when y.downtime_hrs <= 10 then 'FULL'
|
||||
else case
|
||||
when y.downtime_hrs <= 100 then 'PARTIAL'
|
||||
else 'POOR'
|
||||
end
|
||||
end as availability,
|
||||
case
|
||||
when y.energy_kwh >= 200000 and y.downtime_hrs <= 10 then 'TOP'
|
||||
else case
|
||||
when y.energy_kwh >= 100000 and y.downtime_hrs <= 100 then 'GOOD'
|
||||
else 'WEAK'
|
||||
end
|
||||
end as rating,
|
||||
case
|
||||
when y.downtime_hrs > 100 then y.downtime_hrs * 25
|
||||
else case
|
||||
when y.downtime_hrs > 10 then y.downtime_hrs * 10
|
||||
else 0
|
||||
end
|
||||
end as penalty
|
||||
}
|
||||
12
tasks_gen/train/G1928/seed/turbine.tabl.asabap
Normal file
12
tasks_gen/train/G1928/seed/turbine.tabl.asabap
Normal file
@@ -0,0 +1,12 @@
|
||||
@EndUserText.label : 'Wind turbine'
|
||||
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
|
||||
@AbapCatalog.tableCategory : #TRANSPARENT
|
||||
@AbapCatalog.deliveryClass : #A
|
||||
@AbapCatalog.dataMaintenance : #RESTRICTED
|
||||
define table {{p}}turbine {
|
||||
key client : abap.clnt not null;
|
||||
key turbine_id : abap.char(10) not null;
|
||||
site : abap.char(10);
|
||||
capacity_kw : abap.int4;
|
||||
commissioned : abap.dats;
|
||||
}
|
||||
12
tasks_gen/train/G1928/seed/yield.tabl.asabap
Normal file
12
tasks_gen/train/G1928/seed/yield.tabl.asabap
Normal file
@@ -0,0 +1,12 @@
|
||||
@EndUserText.label : 'Monthly yield of a wind turbine'
|
||||
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
|
||||
@AbapCatalog.tableCategory : #TRANSPARENT
|
||||
@AbapCatalog.deliveryClass : #A
|
||||
@AbapCatalog.dataMaintenance : #RESTRICTED
|
||||
define table {{p}}yield {
|
||||
key client : abap.clnt not null;
|
||||
key turbine_id : abap.char(10) not null;
|
||||
key calmonth : abap.char(6) not null;
|
||||
energy_kwh : abap.dec(15,2);
|
||||
downtime_hrs : abap.int4;
|
||||
}
|
||||
54
tasks_gen/train/G1928/spec.md
Normal file
54
tasks_gen/train/G1928/spec.md
Normal file
@@ -0,0 +1,54 @@
|
||||
# 1. Goal
|
||||
|
||||
Refactor the legacy CDS view {{P}}I_WIND_GRADE in package $TMP.
|
||||
|
||||
A wind farm operator uses the view to grade the monthly yield of each wind
|
||||
turbine. The view is active, but its CASE expressions are deeply nested and
|
||||
hard to read. Make the view clean and easy to read.
|
||||
|
||||
The behavior stays the same. The name {{P}}I_WIND_GRADE and all element names
|
||||
stay the same. A report and an OData service read the view, so the interface
|
||||
must not change.
|
||||
|
||||
# 2. Open questions
|
||||
|
||||
None.
|
||||
|
||||
# 3. Context
|
||||
|
||||
- Table {{P}}TURBINE (wind turbine master data), package $TMP.
|
||||
Key: TURBINE_ID (CHAR 10).
|
||||
Fields: SITE (CHAR 10), CAPACITY_KW (INT4), COMMISSIONED (DATS).
|
||||
- Table {{P}}YIELD (monthly yield of one wind turbine), package $TMP.
|
||||
Key: TURBINE_ID (CHAR 10), CALMONTH (CHAR 6, format YYYYMM).
|
||||
Fields: ENERGY_KWH (DEC 15,2), DOWNTIME_HRS (INT4).
|
||||
- The view {{P}}I_WIND_GRADE already exists in package $TMP. Its DDL source is
|
||||
the specification of the behavior. Read the DDL source.
|
||||
|
||||
# 4. Contract
|
||||
|
||||
- Refactor the CDS view {{P}}I_WIND_GRADE in package $TMP. The name stays the
|
||||
same.
|
||||
- Elements, with these names: TURBINE_ID (key), CALMONTH (key), SITE,
|
||||
ENERGY_KWH, DOWNTIME_HRS, YIELD_GRADE, AVAILABILITY, RATING, PENALTY.
|
||||
- The element names and the element types stay the same.
|
||||
- No authorization check (#NOT_REQUIRED).
|
||||
|
||||
# 5. Business rules
|
||||
|
||||
The behavior stays the same. The current DDL source of {{P}}I_WIND_GRADE is the
|
||||
only specification of the behavior. Keep every result value, every limit value
|
||||
and every element. Do not add an element and do not remove an element.
|
||||
|
||||
# 6. Constraints
|
||||
|
||||
- Release target: 8.16.
|
||||
- Coding standards: use "define view entity". Write clean CDS. A CASE
|
||||
expression must not contain another CASE expression.
|
||||
- Out of scope: do not change {{P}}TURBINE and {{P}}YIELD.
|
||||
|
||||
# 7. Acceptance
|
||||
|
||||
- The view entity 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.
|
||||
76
tasks_gen/train/G1928/task.json
Normal file
76
tasks_gen/train/G1928/task.json
Normal file
@@ -0,0 +1,76 @@
|
||||
{
|
||||
"id": "G1928",
|
||||
"category": "E",
|
||||
"object_type": "DDLS",
|
||||
"difficulty": 2,
|
||||
"release_target": "v816",
|
||||
"expected_outcome": "implement",
|
||||
"budget": {
|
||||
"max_tool_calls": 60,
|
||||
"max_activations": 15
|
||||
},
|
||||
"seed": [
|
||||
{
|
||||
"type": "TABL",
|
||||
"name": "{{P}}TURBINE",
|
||||
"file": "seed/turbine.tabl.asabap",
|
||||
"description": "Wind turbine master data"
|
||||
},
|
||||
{
|
||||
"type": "TABL",
|
||||
"name": "{{P}}YIELD",
|
||||
"file": "seed/yield.tabl.asabap",
|
||||
"description": "Monthly yield of one wind turbine"
|
||||
},
|
||||
{
|
||||
"type": "DDLS",
|
||||
"name": "{{P}}I_WIND_GRADE",
|
||||
"file": "seed/i_wind_grade.ddls.asddls",
|
||||
"description": "Legacy view with nested CASE expressions"
|
||||
}
|
||||
],
|
||||
"contract": [
|
||||
{
|
||||
"type": "DDLS",
|
||||
"name": "{{P}}I_WIND_GRADE",
|
||||
"fields": [
|
||||
"TURBINE_ID",
|
||||
"CALMONTH",
|
||||
"SITE",
|
||||
"ENERGY_KWH",
|
||||
"DOWNTIME_HRS",
|
||||
"YIELD_GRADE",
|
||||
"AVAILABILITY",
|
||||
"RATING",
|
||||
"PENALTY"
|
||||
]
|
||||
}
|
||||
],
|
||||
"out_of_scope": [
|
||||
"{{P}}TURBINE",
|
||||
"{{P}}YIELD"
|
||||
],
|
||||
"hidden_tests": [
|
||||
{
|
||||
"type": "CLAS",
|
||||
"name": "{{P}}T31_HIDDEN",
|
||||
"file": "hidden/t31_hidden.clas.abap",
|
||||
"description": "T31 hidden tests"
|
||||
}
|
||||
],
|
||||
"reference": [
|
||||
{
|
||||
"type": "DDLS",
|
||||
"name": "{{P}}I_WIND_GRADE",
|
||||
"file": "reference/i_wind_grade.ddls.asddls",
|
||||
"description": "Refactored view entity with flat CASE expressions"
|
||||
},
|
||||
{
|
||||
"type": "CLAS",
|
||||
"name": "{{P}}T31_TEST",
|
||||
"file": "reference/t31_test.clas.abap",
|
||||
"description": "T31 own tests"
|
||||
}
|
||||
],
|
||||
"craft_checks": []
|
||||
}
|
||||
Reference in New Issue
Block a user