Added Buffering to ZCL_ABAPGIT_FOLDER_LOGIC (#1723)

* Added Buffering to ZCL_ABAPGIT_FOLDER_LOGIC

- Converted ZCL_ABAPGIT_FOLDER_LOGIC=>PACKAGE_TO_PATH and ZCL_ABAPGIT_FOLDER_LOGIC=>PATH_TO_PACKAGE to instance methods, so they can work with buffered data when constructiing path information. This gives a performance advantage in repos with a depp tree structure and multiple leaf packages
- Adapted all calling code to use an instance of ZCL_ABAPGIT_FOLDER_LOGIC instead of the previously available static methods
- Where applicaple PACKAGE_TO_PATH and PATH_TO_PACKAGE were called in an instance of ZCL_ABAPGIT_FOLDER_LOGIC, which was instanced outside of a processing loop and thus profited from the introduced buffering

* Fixed errors

* Removed obsolete coding artifacts

Removed an obsolete parameter, that accidentally got merged into the code when building the pull request

* Forwarded FOLDER_LOGIC instance to recursed calls

Forwarded ZCL_ABAPGIT_FOLDER_LOGIC instance to subsequent BUILD calls to make use of buffering, until the optimizations in #1725 are in place.
This commit is contained in:
Michael Käsemann 2018-07-31 12:19:29 +02:00 committed by Lars Hvam
parent eac0045305
commit b3679f0868
5 changed files with 67 additions and 12 deletions

View File

@ -298,7 +298,7 @@ CLASS ZCL_ABAPGIT_FILE_STATUS IMPLEMENTATION.
" Try to get a unique package name for DEVC by using the path " Try to get a unique package name for DEVC by using the path
IF lv_type = 'DEVC'. IF lv_type = 'DEVC'.
ASSERT lv_name = 'PACKAGE'. ASSERT lv_name = 'PACKAGE'.
lv_name = zcl_abapgit_folder_logic=>path_to_package( lv_name = zcl_abapgit_folder_logic=>get_instance( )->path_to_package(
iv_top = iv_devclass iv_top = iv_devclass
io_dot = io_dot io_dot = io_dot
iv_create_if_not_exists = abap_false iv_create_if_not_exists = abap_false
@ -320,6 +320,7 @@ CLASS ZCL_ABAPGIT_FILE_STATUS IMPLEMENTATION.
ls_file TYPE zif_abapgit_definitions=>ty_file_signature, ls_file TYPE zif_abapgit_definitions=>ty_file_signature,
lt_res_sort LIKE it_results, lt_res_sort LIKE it_results,
lt_item_idx LIKE it_results. lt_item_idx LIKE it_results.
DATA: lo_folder_logic TYPE REF TO zcl_abapgit_folder_logic.
FIELD-SYMBOLS: <ls_res1> LIKE LINE OF it_results, FIELD-SYMBOLS: <ls_res1> LIKE LINE OF it_results,
<ls_res2> LIKE LINE OF it_results. <ls_res2> LIKE LINE OF it_results.
@ -360,9 +361,10 @@ CLASS ZCL_ABAPGIT_FILE_STATUS IMPLEMENTATION.
ENDLOOP. ENDLOOP.
" Check that objects are created in package corresponding to folder " Check that objects are created in package corresponding to folder
lo_folder_logic = zcl_abapgit_folder_logic=>get_instance( ).
LOOP AT it_results ASSIGNING <ls_res1> LOOP AT it_results ASSIGNING <ls_res1>
WHERE NOT package IS INITIAL AND NOT path IS INITIAL. WHERE NOT package IS INITIAL AND NOT path IS INITIAL.
lv_path = zcl_abapgit_folder_logic=>package_to_path( lv_path = lo_folder_logic->package_to_path(
iv_top = iv_top iv_top = iv_top
io_dot = io_dot io_dot = io_dot
iv_package = <ls_res1>-package ). iv_package = <ls_res1>-package ).

View File

@ -4,7 +4,7 @@ CLASS zcl_abapgit_folder_logic DEFINITION
PUBLIC SECTION. PUBLIC SECTION.
CLASS-METHODS package_to_path METHODS package_to_path
IMPORTING IMPORTING
!iv_top TYPE devclass !iv_top TYPE devclass
!io_dot TYPE REF TO zcl_abapgit_dot_abapgit !io_dot TYPE REF TO zcl_abapgit_dot_abapgit
@ -13,7 +13,7 @@ CLASS zcl_abapgit_folder_logic DEFINITION
VALUE(rv_path) TYPE string VALUE(rv_path) TYPE string
RAISING RAISING
zcx_abapgit_exception . zcx_abapgit_exception .
CLASS-METHODS path_to_package METHODS path_to_package
IMPORTING IMPORTING
!iv_top TYPE devclass !iv_top TYPE devclass
!io_dot TYPE REF TO zcl_abapgit_dot_abapgit !io_dot TYPE REF TO zcl_abapgit_dot_abapgit
@ -23,6 +23,26 @@ CLASS zcl_abapgit_folder_logic DEFINITION
VALUE(rv_package) TYPE devclass VALUE(rv_package) TYPE devclass
RAISING RAISING
zcx_abapgit_exception . zcx_abapgit_exception .
CLASS-METHODS get_instance
RETURNING
VALUE(ro_instance) TYPE REF TO zcl_abapgit_folder_logic .
PROTECTED SECTION.
METHODS get_parent
IMPORTING
!iv_package TYPE devclass
RETURNING
VALUE(r_parent) TYPE devclass.
PRIVATE SECTION.
TYPES:
BEGIN OF ty_devclass_info,
devclass TYPE devclass,
namespace TYPE namespace,
parentcl TYPE parentcl,
END OF ty_devclass_info .
TYPES:
ty_devclass_info_tt TYPE SORTED TABLE OF ty_devclass_info
WITH UNIQUE KEY devclass .
DATA mt_parent TYPE ty_devclass_info_tt .
ENDCLASS. ENDCLASS.
@ -30,6 +50,26 @@ ENDCLASS.
CLASS ZCL_ABAPGIT_FOLDER_LOGIC IMPLEMENTATION. CLASS ZCL_ABAPGIT_FOLDER_LOGIC IMPLEMENTATION.
METHOD get_instance.
CREATE OBJECT ro_instance.
ENDMETHOD.
METHOD get_parent.
DATA: st_parent LIKE LINE OF mt_parent.
"Determine Parent Package
READ TABLE mt_parent INTO st_parent
WITH TABLE KEY devclass = iv_package.
IF sy-subrc <> 0.
r_parent = zcl_abapgit_factory=>get_sap_package( iv_package )->read_parent( ).
st_parent-devclass = iv_package.
st_parent-parentcl = r_parent.
INSERT st_parent INTO TABLE mt_parent.
ELSE.
r_parent = st_parent-parentcl.
ENDIF.
ENDMETHOD.
METHOD package_to_path. METHOD package_to_path.
DATA: lv_len TYPE i, DATA: lv_len TYPE i,
@ -41,7 +81,7 @@ CLASS ZCL_ABAPGIT_FOLDER_LOGIC IMPLEMENTATION.
IF iv_top = iv_package. IF iv_top = iv_package.
rv_path = io_dot->get_starting_folder( ). rv_path = io_dot->get_starting_folder( ).
ELSE. ELSE.
lv_parentcl = zcl_abapgit_factory=>get_sap_package( iv_package )->read_parent( ). lv_parentcl = get_parent( iv_package ).
IF lv_parentcl IS INITIAL. IF lv_parentcl IS INITIAL.
zcx_abapgit_exception=>raise( |error, expected parent package, { iv_package }| ). zcx_abapgit_exception=>raise( |error, expected parent package, { iv_package }| ).

View File

@ -25,12 +25,12 @@ CLASS ltcl_folder_logic_helper IMPLEMENTATION.
lo_dot->set_starting_folder( iv_starting ). lo_dot->set_starting_folder( iv_starting ).
lo_dot->set_folder_logic( iv_logic ). lo_dot->set_folder_logic( iv_logic ).
lv_package = zcl_abapgit_folder_logic=>path_to_package( lv_package = zcl_abapgit_folder_logic=>get_instance( )->path_to_package(
iv_top = iv_top iv_top = iv_top
io_dot = lo_dot io_dot = lo_dot
iv_path = iv_path ). iv_path = iv_path ).
lv_path = zcl_abapgit_folder_logic=>package_to_path( lv_path = zcl_abapgit_folder_logic=>get_instance( )->package_to_path(
iv_top = iv_top iv_top = iv_top
io_dot = lo_dot io_dot = lo_dot
iv_package = iv_package ). iv_package = iv_package ).

View File

@ -474,6 +474,7 @@ CLASS zcl_abapgit_objects IMPLEMENTATION.
lo_progress TYPE REF TO zcl_abapgit_progress, lo_progress TYPE REF TO zcl_abapgit_progress,
lv_path TYPE string, lv_path TYPE string,
lt_items TYPE zif_abapgit_definitions=>ty_items_tt. lt_items TYPE zif_abapgit_definitions=>ty_items_tt.
DATA: lo_folder_logic TYPE REF TO zcl_abapgit_folder_logic.
FIELD-SYMBOLS: <ls_result> TYPE zif_abapgit_definitions=>ty_result, FIELD-SYMBOLS: <ls_result> TYPE zif_abapgit_definitions=>ty_result,
<ls_deser> LIKE LINE OF lt_late. <ls_deser> LIKE LINE OF lt_late.
@ -507,6 +508,7 @@ CLASS zcl_abapgit_objects IMPLEMENTATION.
check_objects_locked( iv_language = io_repo->get_dot_abapgit( )->get_master_language( ) check_objects_locked( iv_language = io_repo->get_dot_abapgit( )->get_master_language( )
it_items = lt_items ). it_items = lt_items ).
lo_folder_logic = zcl_abapgit_folder_logic=>get_instance( ).
LOOP AT lt_results ASSIGNING <ls_result>. LOOP AT lt_results ASSIGNING <ls_result>.
lo_progress->show( iv_current = sy-tabix lo_progress->show( iv_current = sy-tabix
iv_text = |Deserialize { <ls_result>-obj_name }| ) ##NO_TEXT. iv_text = |Deserialize { <ls_result>-obj_name }| ) ##NO_TEXT.
@ -515,7 +517,7 @@ CLASS zcl_abapgit_objects IMPLEMENTATION.
ls_item-obj_type = <ls_result>-obj_type. ls_item-obj_type = <ls_result>-obj_type.
ls_item-obj_name = <ls_result>-obj_name. ls_item-obj_name = <ls_result>-obj_name.
lv_package = zcl_abapgit_folder_logic=>path_to_package( lv_package = lo_folder_logic->path_to_package(
iv_top = io_repo->get_package( ) iv_top = io_repo->get_package( )
io_dot = io_repo->get_dot_abapgit( ) io_dot = io_repo->get_dot_abapgit( )
iv_path = <ls_result>-path ). iv_path = <ls_result>-path ).
@ -994,13 +996,14 @@ CLASS zcl_abapgit_objects IMPLEMENTATION.
WITH UNIQUE KEY obj_type obj_name devclass, WITH UNIQUE KEY obj_type obj_name devclass,
ls_overwrite LIKE LINE OF rt_overwrite, ls_overwrite LIKE LINE OF rt_overwrite,
ls_tadir TYPE tadir. ls_tadir TYPE tadir.
DATA: lo_folder_logic TYPE REF TO zcl_abapgit_folder_logic.
FIELD-SYMBOLS: <ls_result> LIKE LINE OF it_results. FIELD-SYMBOLS: <ls_result> LIKE LINE OF it_results.
lo_folder_logic = zcl_abapgit_folder_logic=>get_instance( ).
LOOP AT it_results ASSIGNING <ls_result>. LOOP AT it_results ASSIGNING <ls_result>.
lv_package = zcl_abapgit_folder_logic=>path_to_package( lv_package = lo_folder_logic->path_to_package(
iv_top = io_repo->get_package( ) iv_top = io_repo->get_package( )
io_dot = io_repo->get_dot_abapgit( ) io_dot = io_repo->get_dot_abapgit( )
iv_path = <ls_result>-path ). iv_path = <ls_result>-path ).

View File

@ -29,6 +29,7 @@ CLASS zcl_abapgit_tadir DEFINITION
!iv_ignore_subpackages TYPE abap_bool DEFAULT abap_false !iv_ignore_subpackages TYPE abap_bool DEFAULT abap_false
!iv_only_local_objects TYPE abap_bool !iv_only_local_objects TYPE abap_bool
!io_log TYPE REF TO zcl_abapgit_log OPTIONAL !io_log TYPE REF TO zcl_abapgit_log OPTIONAL
!io_folder_logic TYPE REF TO zcl_abapgit_folder_logic OPTIONAL
RETURNING RETURNING
VALUE(rt_tadir) TYPE zif_abapgit_definitions=>ty_tadir_tt VALUE(rt_tadir) TYPE zif_abapgit_definitions=>ty_tadir_tt
RAISING RAISING
@ -50,6 +51,7 @@ CLASS zcl_abapgit_tadir IMPLEMENTATION.
lt_srcsystem TYPE RANGE OF tadir-srcsystem, lt_srcsystem TYPE RANGE OF tadir-srcsystem,
ls_srcsystem LIKE LINE OF lt_srcsystem, ls_srcsystem LIKE LINE OF lt_srcsystem,
ls_exclude LIKE LINE OF lt_excludes. ls_exclude LIKE LINE OF lt_excludes.
DATA: lo_folder_logic TYPE REF TO zcl_abapgit_folder_logic.
FIELD-SYMBOLS: <ls_tdevc> LIKE LINE OF lt_tdevc, FIELD-SYMBOLS: <ls_tdevc> LIKE LINE OF lt_tdevc,
<ls_tadir> LIKE LINE OF rt_tadir. <ls_tadir> LIKE LINE OF rt_tadir.
@ -98,7 +100,14 @@ CLASS zcl_abapgit_tadir IMPLEMENTATION.
ENDIF. ENDIF.
IF NOT io_dot IS INITIAL. IF NOT io_dot IS INITIAL.
lv_path = zcl_abapgit_folder_logic=>package_to_path( "Reuse given Folder Logic Instance
lo_folder_logic = io_folder_logic.
IF lo_folder_logic IS NOT BOUND.
"Get Folder Logic Instance
lo_folder_logic = zcl_abapgit_folder_logic=>get_instance( ).
ENDIF.
lv_path = lo_folder_logic->package_to_path(
iv_top = iv_top iv_top = iv_top
io_dot = io_dot io_dot = io_dot
iv_package = iv_package ). iv_package = iv_package ).
@ -126,7 +135,8 @@ CLASS zcl_abapgit_tadir IMPLEMENTATION.
iv_only_local_objects = iv_only_local_objects iv_only_local_objects = iv_only_local_objects
iv_top = iv_top iv_top = iv_top
io_dot = io_dot io_dot = io_dot
io_log = io_log ). io_log = io_log
io_folder_logic = lo_folder_logic ). "Hand down existing folder logic instance
APPEND LINES OF lt_tadir TO rt_tadir. APPEND LINES OF lt_tadir TO rt_tadir.
ENDLOOP. ENDLOOP.