Merge pull request #532 from ivanfemia/revert-529-bilencekic-patch-1

Revert "Performance improvement for GET_ROW method"
This commit is contained in:
Ivan 2018-03-27 11:58:27 -05:00 committed by GitHub
commit 399c614e25
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 59 additions and 104 deletions

View File

@ -3,51 +3,45 @@
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
* *
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS ZCL_EXCEL_ROWS DEFINITION class ZCL_EXCEL_ROWS definition
PUBLIC public
FINAL final
CREATE PUBLIC . create public .
*"* public components of class ZCL_EXCEL_ROWS *"* public components of class ZCL_EXCEL_ROWS
*"* do not include other source files here!!! *"* do not include other source files here!!!
*"* protected components of class ZABAP_EXCEL_WORKSHEETS *"* protected components of class ZABAP_EXCEL_WORKSHEETS
*"* do not include other source files here!!! *"* do not include other source files here!!!
PUBLIC SECTION. public section.
TYPES:
BEGIN OF T_ROWS, " performance improvement #527
ROW_INDEX TYPE INT4,
ROW TYPE REF TO ZCL_EXCEL_ROW,
END OF T_ROWS.
DATA: methods ADD
DT_ROWS TYPE HASHED TABLE OF T_ROWS WITH UNIQUE KEY ROW_INDEX READ-ONLY. importing
!IO_ROW type ref to ZCL_EXCEL_ROW .
METHODS ADD methods CLEAR .
IMPORTING methods CONSTRUCTOR .
!IO_ROW TYPE REF TO ZCL_EXCEL_ROW . methods GET
METHODS CLEAR . importing
METHODS CONSTRUCTOR . !IP_INDEX type I
METHODS GET returning
IMPORTING value(EO_ROW) type ref to ZCL_EXCEL_ROW .
!IP_INDEX TYPE I methods GET_ITERATOR
RETURNING returning
VALUE(EO_ROW) TYPE REF TO ZCL_EXCEL_ROW . value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR .
METHODS IS_EMPTY methods IS_EMPTY
RETURNING returning
VALUE(IS_EMPTY) TYPE FLAG . value(IS_EMPTY) type FLAG .
METHODS REMOVE methods REMOVE
IMPORTING importing
!IO_ROW TYPE REF TO ZCL_EXCEL_ROW . !IO_ROW type ref to ZCL_EXCEL_ROW .
METHODS SIZE methods SIZE
RETURNING returning
VALUE(EP_SIZE) TYPE I . value(EP_SIZE) type I .
PROTECTED SECTION. PROTECTED SECTION.
*"* private components of class ZABAP_EXCEL_RANGES *"* private components of class ZABAP_EXCEL_RANGES
*"* do not include other source files here!!! *"* do not include other source files here!!!
PRIVATE SECTION. PRIVATE SECTION.
DATA ROWS TYPE REF TO CL_OBJECT_COLLECTION . DATA rows TYPE REF TO cl_object_collection .
ENDCLASS. ENDCLASS.
@ -55,89 +49,44 @@ ENDCLASS.
CLASS ZCL_EXCEL_ROWS IMPLEMENTATION. CLASS ZCL_EXCEL_ROWS IMPLEMENTATION.
* <SIGNATURE>---------------------------------------------------------------------------------------+ METHOD add.
* | Instance Public Method ZCL_EXCEL_ROWS->ADD rows->add( io_row ).
* +-------------------------------------------------------------------------------------------------+
* | [--->] IO_ROW TYPE REF TO ZCL_EXCEL_ROW
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD ADD.
DATA:
LS_ROW TYPE T_ROWS.
LS_ROW-ROW_INDEX = IO_ROW->GET_ROW_INDEX( ).
LS_ROW-ROW = IO_ROW.
INSERT LS_ROW INTO TABLE DT_ROWS.
ENDMETHOD. "ADD ENDMETHOD. "ADD
* <SIGNATURE>---------------------------------------------------------------------------------------+ METHOD clear.
* | Instance Public Method ZCL_EXCEL_ROWS->CLEAR rows->clear( ).
* +-------------------------------------------------------------------------------------------------+
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD CLEAR.
CLEAR DT_ROWS[].
ENDMETHOD. "CLEAR ENDMETHOD. "CLEAR
* <SIGNATURE>---------------------------------------------------------------------------------------+ METHOD constructor.
* | Instance Public Method ZCL_EXCEL_ROWS->CONSTRUCTOR
* +-------------------------------------------------------------------------------------------------+
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD CONSTRUCTOR.
CREATE OBJECT ROWS. CREATE OBJECT rows.
ENDMETHOD. "CONSTRUCTOR ENDMETHOD. "CONSTRUCTOR
* <SIGNATURE>---------------------------------------------------------------------------------------+ METHOD get.
* | Instance Public Method ZCL_EXCEL_ROWS->GET eo_row ?= rows->if_object_collection~get( ip_index ).
* +-------------------------------------------------------------------------------------------------+
* | [--->] IP_INDEX TYPE I
* | [<-()] EO_ROW TYPE REF TO ZCL_EXCEL_ROW
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD GET.
READ TABLE DT_ROWS ASSIGNING FIELD-SYMBOL(<LS_ROW>) WITH TABLE KEY ROW_INDEX = IP_INDEX.
IF SY-SUBRC = 0.
EO_ROW ?= <LS_ROW>-ROW.
ENDIF.
ENDMETHOD. "GET ENDMETHOD. "GET
* <SIGNATURE>---------------------------------------------------------------------------------------+ METHOD get_iterator.
* | Instance Public Method ZCL_EXCEL_ROWS->IS_EMPTY eo_iterator ?= rows->if_object_collection~get_iterator( ).
* +-------------------------------------------------------------------------------------------------+ ENDMETHOD. "GET_ITERATOR
* | [<-()] IS_EMPTY TYPE FLAG
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD IS_EMPTY.
DATA(LV_LINES) = LINES( DT_ROWS ).
IF LV_LINES = 0.
IS_EMPTY = abap_true. METHOD is_empty.
ELSE. is_empty = rows->if_object_collection~is_empty( ).
IS_EMPTY = abap_false.
ENDIF.
ENDMETHOD. "IS_EMPTY ENDMETHOD. "IS_EMPTY
* <SIGNATURE>---------------------------------------------------------------------------------------+ METHOD remove.
* | Instance Public Method ZCL_EXCEL_ROWS->REMOVE rows->remove( io_row ).
* +-------------------------------------------------------------------------------------------------+
* | [--->] IO_ROW TYPE REF TO ZCL_EXCEL_ROW
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD REMOVE.
DELETE DT_ROWS WHERE ROW_INDEX = IO_ROW->GET_ROW_INDEX( ).
ENDMETHOD. "REMOVE ENDMETHOD. "REMOVE
* <SIGNATURE>---------------------------------------------------------------------------------------+ METHOD size.
* | Instance Public Method ZCL_EXCEL_ROWS->SIZE ep_size = rows->if_object_collection~size( ).
* +-------------------------------------------------------------------------------------------------+
* | [<-()] EP_SIZE TYPE I
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD SIZE.
EP_SIZE = LINES( DT_ROWS )..
ENDMETHOD. "SIZE ENDMETHOD. "SIZE
ENDCLASS. ENDCLASS.

View File

@ -4098,14 +4098,20 @@ method GET_RANGES_ITERATOR.
METHOD get_row. METHOD get_row.
* performance improvement for issue #527 DATA: lo_row_iterator TYPE REF TO cl_object_collection_iterator,
READ TABLE ROWS->DT_ROWS ASSIGNING FIELD-SYMBOL(<LS_ROW>) WITH TABLE KEY ROW_INDEX = IP_ROW. lo_row TYPE REF TO zcl_excel_row.
IF SY-SUBRC = 0.
EO_ROW = <LS_ROW>-ROW.
ENDIF.
IF EO_ROW IS NOT BOUND. lo_row_iterator = me->get_rows_iterator( ).
EO_ROW = ME->ADD_NEW_ROW( IP_ROW ). WHILE lo_row_iterator->has_next( ) = abap_true.
lo_row ?= lo_row_iterator->get_next( ).
IF lo_row->get_row_index( ) = ip_row.
eo_row = lo_row.
EXIT.
ENDIF.
ENDWHILE.
IF eo_row IS NOT BOUND.
eo_row = me->add_new_row( ip_row ).
ENDIF. ENDIF.
ENDMETHOD. ENDMETHOD.