parallel: refactoring, #2121 (#2122)

* parallel: refactoring, #2121

* move cache handling outside of main loop

* fix error found by abaplint
This commit is contained in:
Lars Hvam 2018-11-22 05:07:49 +01:00 committed by GitHub
parent b96abd8eb4
commit 54e0155891
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 92 additions and 68 deletions

View File

@ -22,11 +22,13 @@ CLASS zcl_abapgit_objects DEFINITION
END OF ty_serialization . END OF ty_serialization .
CLASS-METHODS serialize CLASS-METHODS serialize
IMPORTING is_item TYPE zif_abapgit_definitions=>ty_item IMPORTING
iv_language TYPE spras !is_item TYPE zif_abapgit_definitions=>ty_item
io_log TYPE REF TO zcl_abapgit_log OPTIONAL !iv_language TYPE spras
RETURNING VALUE(rs_files_and_item) TYPE zcl_abapgit_objects=>ty_serialization RETURNING
RAISING zcx_abapgit_exception . VALUE(rs_files_and_item) TYPE zcl_abapgit_objects=>ty_serialization
RAISING
zcx_abapgit_exception .
CLASS-METHODS deserialize CLASS-METHODS deserialize
IMPORTING IMPORTING
!io_repo TYPE REF TO zcl_abapgit_repo !io_repo TYPE REF TO zcl_abapgit_repo
@ -84,9 +86,12 @@ CLASS zcl_abapgit_objects DEFINITION
RETURNING RETURNING
VALUE(rt_types) TYPE ty_types_tt . VALUE(rt_types) TYPE ty_types_tt .
CLASS-METHODS is_active CLASS-METHODS is_active
IMPORTING is_item TYPE zif_abapgit_definitions=>ty_item IMPORTING
RETURNING VALUE(rv_active) TYPE abap_bool !is_item TYPE zif_abapgit_definitions=>ty_item
RAISING zcx_abapgit_exception . RETURNING
VALUE(rv_active) TYPE abap_bool
RAISING
zcx_abapgit_exception .
PROTECTED SECTION. PROTECTED SECTION.
PRIVATE SECTION. PRIVATE SECTION.
@ -226,6 +231,19 @@ ENDCLASS.
CLASS ZCL_ABAPGIT_OBJECTS IMPLEMENTATION. CLASS ZCL_ABAPGIT_OBJECTS IMPLEMENTATION.
METHOD adjust_namespaces.
FIELD-SYMBOLS: <ls_result> LIKE LINE OF rt_results.
rt_results = it_results.
LOOP AT rt_results ASSIGNING <ls_result>.
REPLACE ALL OCCURRENCES OF '#' IN <ls_result>-obj_name WITH '/'.
ENDLOOP.
ENDMETHOD.
METHOD changed_by. METHOD changed_by.
DATA: li_obj TYPE REF TO zif_abapgit_object. DATA: li_obj TYPE REF TO zif_abapgit_object.
@ -682,6 +700,23 @@ CLASS ZCL_ABAPGIT_OBJECTS IMPLEMENTATION.
ENDMETHOD. ENDMETHOD.
METHOD filter_files_to_deserialize.
rt_results = it_results.
DELETE rt_results WHERE match = abap_true. " Full match
SORT rt_results
BY obj_type ASCENDING
obj_name ASCENDING
rstate DESCENDING. " ensures that non-empty rstate is kept
DELETE ADJACENT DUPLICATES FROM rt_results COMPARING obj_type obj_name.
DELETE rt_results WHERE obj_type IS INITIAL.
DELETE rt_results WHERE lstate = zif_abapgit_definitions=>c_state-added AND rstate IS INITIAL.
ENDMETHOD.
METHOD has_changed_since. METHOD has_changed_since.
rv_changed = abap_true. " Assume changed rv_changed = abap_true. " Assume changed
@ -849,12 +884,9 @@ CLASS ZCL_ABAPGIT_OBJECTS IMPLEMENTATION.
rs_files_and_item-item = is_item. rs_files_and_item-item = is_item.
IF is_supported( rs_files_and_item-item ) = abap_false. IF is_supported( rs_files_and_item-item ) = abap_false.
IF NOT io_log IS INITIAL. zcx_abapgit_exception=>raise( |Object type ignored, not supported: {
io_log->add( iv_msg = |Object type ignored, not supported: { rs_files_and_item-item-obj_type rs_files_and_item-item-obj_type }-{
}-{ rs_files_and_item-item-obj_name }| rs_files_and_item-item-obj_name }| ).
iv_type = 'E' ).
ENDIF.
RETURN.
ENDIF. ENDIF.
CREATE OBJECT lo_files CREATE OBJECT lo_files
@ -1066,34 +1098,4 @@ CLASS ZCL_ABAPGIT_OBJECTS IMPLEMENTATION.
rt_overwrite = lt_overwrite_uniqe. rt_overwrite = lt_overwrite_uniqe.
ENDMETHOD. ENDMETHOD.
METHOD filter_files_to_deserialize.
rt_results = it_results.
DELETE rt_results WHERE match = abap_true. " Full match
SORT rt_results
BY obj_type ASCENDING
obj_name ASCENDING
rstate DESCENDING. " ensures that non-empty rstate is kept
DELETE ADJACENT DUPLICATES FROM rt_results COMPARING obj_type obj_name.
DELETE rt_results WHERE obj_type IS INITIAL.
DELETE rt_results WHERE lstate = zif_abapgit_definitions=>c_state-added AND rstate IS INITIAL.
ENDMETHOD.
METHOD adjust_namespaces.
FIELD-SYMBOLS: <ls_result> LIKE LINE OF rt_results.
rt_results = it_results.
LOOP AT rt_results ASSIGNING <ls_result>.
REPLACE ALL OCCURRENCES OF '#' IN <ls_result>-obj_name WITH '/'.
ENDLOOP.
ENDMETHOD.
ENDCLASS. ENDCLASS.

View File

@ -161,9 +161,10 @@ CLASS zcl_abapgit_repo DEFINITION
METHODS lookup_cache METHODS lookup_cache
IMPORTING IMPORTING
!it_cache TYPE ty_cache_tt !it_cache TYPE ty_cache_tt
!is_item TYPE zif_abapgit_definitions=>ty_item EXPORTING
RETURNING !et_found TYPE zif_abapgit_definitions=>ty_files_item_tt
VALUE(rt_found) TYPE zif_abapgit_definitions=>ty_files_item_tt CHANGING
!ct_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt
RAISING RAISING
zcx_abapgit_exception . zcx_abapgit_exception .
METHODS update_last_deserialize METHODS update_last_deserialize
@ -346,6 +347,7 @@ CLASS zcl_abapgit_repo IMPLEMENTATION.
lo_progress TYPE REF TO zcl_abapgit_progress, lo_progress TYPE REF TO zcl_abapgit_progress,
lt_cache TYPE ty_cache_tt, lt_cache TYPE ty_cache_tt,
lt_found LIKE rt_files, lt_found LIKE rt_files,
lx_error TYPE REF TO zcx_abapgit_exception,
ls_fils_item TYPE zcl_abapgit_objects=>ty_serialization. ls_fils_item TYPE zcl_abapgit_objects=>ty_serialization.
FIELD-SYMBOLS: <ls_file> LIKE LINE OF ls_fils_item-files, FIELD-SYMBOLS: <ls_file> LIKE LINE OF ls_fils_item-files,
@ -374,6 +376,12 @@ CLASS zcl_abapgit_repo IMPLEMENTATION.
apply_filter( EXPORTING it_filter = it_filter apply_filter( EXPORTING it_filter = it_filter
CHANGING ct_tadir = lt_tadir ). CHANGING ct_tadir = lt_tadir ).
lookup_cache(
EXPORTING it_cache = lt_cache
IMPORTING et_found = lt_found
CHANGING ct_tadir = lt_tadir ).
APPEND LINES OF lt_found TO rt_files.
CREATE OBJECT lo_progress CREATE OBJECT lo_progress
EXPORTING EXPORTING
iv_total = lines( lt_tadir ). iv_total = lines( lt_tadir ).
@ -388,17 +396,13 @@ CLASS zcl_abapgit_repo IMPLEMENTATION.
ls_fils_item-item-obj_name = <ls_tadir>-obj_name. ls_fils_item-item-obj_name = <ls_tadir>-obj_name.
ls_fils_item-item-devclass = <ls_tadir>-devclass. ls_fils_item-item-devclass = <ls_tadir>-devclass.
lt_found = lookup_cache( is_item = ls_fils_item-item TRY.
it_cache = lt_cache ).
IF lines( lt_found ) > 0.
APPEND LINES OF lt_found TO rt_files.
CONTINUE.
ENDIF.
ls_fils_item = zcl_abapgit_objects=>serialize( ls_fils_item = zcl_abapgit_objects=>serialize(
is_item = ls_fils_item-item is_item = ls_fils_item-item
iv_language = get_dot_abapgit( )->get_master_language( ) iv_language = get_dot_abapgit( )->get_master_language( ) ).
io_log = io_log ). CATCH zcx_abapgit_exception INTO lx_error.
io_log->add_error( lx_error->get_text( ) ).
ENDTRY.
LOOP AT ls_fils_item-files ASSIGNING <ls_file>. LOOP AT ls_fils_item-files ASSIGNING <ls_file>.
<ls_file>-path = <ls_tadir>-path. <ls_file>-path = <ls_tadir>-path.
@ -461,22 +465,40 @@ CLASS zcl_abapgit_repo IMPLEMENTATION.
METHOD lookup_cache. METHOD lookup_cache.
FIELD-SYMBOLS: <ls_cache> LIKE LINE OF it_cache. DATA: ls_item TYPE zif_abapgit_definitions=>ty_item,
lv_index TYPE i.
FIELD-SYMBOLS: <ls_cache> LIKE LINE OF it_cache,
<ls_tadir> LIKE LINE OF ct_tadir.
CLEAR et_found.
IF mv_last_serialization IS INITIAL.
RETURN.
ENDIF.
LOOP AT ct_tadir ASSIGNING <ls_tadir>.
lv_index = sy-tabix.
ls_item-obj_type = <ls_tadir>-object.
ls_item-obj_name = <ls_tadir>-obj_name.
ls_item-devclass = <ls_tadir>-devclass.
IF mv_last_serialization IS NOT INITIAL. " Try to fetch from cache
READ TABLE it_cache TRANSPORTING NO FIELDS READ TABLE it_cache TRANSPORTING NO FIELDS
WITH KEY item = is_item. " type+name+package key WITH KEY item = ls_item. " type+name+package key
" There is something in cache and the object is unchanged " There is something in cache and the object is unchanged
IF sy-subrc = 0 IF sy-subrc = 0
AND abap_false = zcl_abapgit_objects=>has_changed_since( AND abap_false = zcl_abapgit_objects=>has_changed_since(
is_item = is_item is_item = ls_item
iv_timestamp = mv_last_serialization ). iv_timestamp = mv_last_serialization ).
LOOP AT it_cache ASSIGNING <ls_cache> WHERE item = is_item. LOOP AT it_cache ASSIGNING <ls_cache> WHERE item = ls_item.
APPEND <ls_cache> TO rt_found. APPEND <ls_cache> TO et_found.
ENDLOOP. ENDLOOP.
DELETE ct_tadir INDEX lv_index.
ENDIF. ENDIF.
ENDIF.
ENDLOOP.
ENDMETHOD. ENDMETHOD.