Snapshot: new training tasks (balanced generation), docs

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
Kral
2026-10-05 22:08:59 +02:00
parent eb13453097
commit 6984fc7917
572 changed files with 30024 additions and 0 deletions

View 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
}

View 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
}

View 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
}

View 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
}

View 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
}

View 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
}

View 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.

View 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
}

View 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
}

View 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.

View 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
}

View 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;
}

View 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;
}

View 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.

View 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": []
}