Performance update for iterator

Iterator is slowing down for read operations, row class reference is now stored in hash table rather than iterator.
This commit is contained in:
Bilen 2018-03-20 09:32:36 +08:00 committed by GitHub
parent 33e215d075
commit 66e4ef4793
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -3,45 +3,54 @@
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
* *
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
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,
ROW_INDEX TYPE INT4,
ROW TYPE REF TO ZCL_EXCEL_ROW,
END OF T_ROWS.
methods ADD DATA:
importing DT_ROWS TYPE HASHED TABLE OF T_ROWS WITH UNIQUE KEY ROW_INDEX.
!IO_ROW type ref to ZCL_EXCEL_ROW .
methods CLEAR . METHODS ADD
methods CONSTRUCTOR . IMPORTING
methods GET !IO_ROW TYPE REF TO ZCL_EXCEL_ROW .
importing METHODS CLEAR .
!IP_INDEX type I METHODS CONSTRUCTOR .
returning METHODS GET
value(EO_ROW) type ref to ZCL_EXCEL_ROW . IMPORTING
methods GET_ITERATOR !IP_INDEX TYPE I
returning RETURNING
value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . VALUE(EO_ROW) TYPE REF TO ZCL_EXCEL_ROW .
methods IS_EMPTY METHODS GET_ITERATOR
returning RETURNING
value(IS_EMPTY) type FLAG . VALUE(EO_ITERATOR) TYPE REF TO CL_OBJECT_COLLECTION_ITERATOR .
methods REMOVE METHODS IS_EMPTY
importing RETURNING
!IO_ROW type ref to ZCL_EXCEL_ROW . VALUE(IS_EMPTY) TYPE FLAG .
methods SIZE METHODS REMOVE
returning IMPORTING
value(EP_SIZE) type I . !IO_ROW TYPE REF TO ZCL_EXCEL_ROW .
METHODS SIZE
RETURNING
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.
@ -49,44 +58,118 @@ ENDCLASS.
CLASS ZCL_EXCEL_ROWS IMPLEMENTATION. CLASS ZCL_EXCEL_ROWS IMPLEMENTATION.
METHOD add. * <SIGNATURE>---------------------------------------------------------------------------------------+
rows->add( io_row ). * | Instance Public Method ZCL_EXCEL_ROWS->ADD
* +-------------------------------------------------------------------------------------------------+
* | [--->] IO_ROW TYPE REF TO ZCL_EXCEL_ROW
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD ADD.
* IF SY-UNAME = 'BILEN'.
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.
*
* ELSE.
* ROWS->ADD( IO_ROW ).
*
* ENDIF.
ENDMETHOD. "ADD ENDMETHOD. "ADD
METHOD clear. * <SIGNATURE>---------------------------------------------------------------------------------------+
rows->clear( ). * | Instance Public Method ZCL_EXCEL_ROWS->CLEAR
* +-------------------------------------------------------------------------------------------------+
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD CLEAR.
* ROWS->CLEAR( ).
CLEAR DT_ROWS[].
ENDMETHOD. "CLEAR ENDMETHOD. "CLEAR
METHOD constructor. * <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_EXCEL_ROWS->CONSTRUCTOR
* +-------------------------------------------------------------------------------------------------+
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD CONSTRUCTOR.
CREATE OBJECT rows. CREATE OBJECT ROWS.
ENDMETHOD. "CONSTRUCTOR ENDMETHOD. "CONSTRUCTOR
METHOD get. * <SIGNATURE>---------------------------------------------------------------------------------------+
eo_row ?= rows->if_object_collection~get( ip_index ). * | Instance Public Method ZCL_EXCEL_ROWS->GET
* +-------------------------------------------------------------------------------------------------+
* | [--->] IP_INDEX TYPE I
* | [<-()] EO_ROW TYPE REF TO ZCL_EXCEL_ROW
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD GET.
* IF SY-UNAME = 'BILEN'.
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.
* ELSE.
* EO_ROW ?= ROWS->IF_OBJECT_COLLECTION~GET( IP_INDEX ).
*
* ENDIF.
ENDMETHOD. "GET ENDMETHOD. "GET
METHOD get_iterator. * <SIGNATURE>---------------------------------------------------------------------------------------+
eo_iterator ?= rows->if_object_collection~get_iterator( ). * | Instance Public Method ZCL_EXCEL_ROWS->GET_ITERATOR
* +-------------------------------------------------------------------------------------------------+
* | [<-()] EO_ITERATOR TYPE REF TO CL_OBJECT_COLLECTION_ITERATOR
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD GET_ITERATOR.
EO_ITERATOR ?= ROWS->IF_OBJECT_COLLECTION~GET_ITERATOR( ).
ENDMETHOD. "GET_ITERATOR ENDMETHOD. "GET_ITERATOR
METHOD is_empty. * <SIGNATURE>---------------------------------------------------------------------------------------+
is_empty = rows->if_object_collection~is_empty( ). * | Instance Public Method ZCL_EXCEL_ROWS->IS_EMPTY
* +-------------------------------------------------------------------------------------------------+
* | [<-()] IS_EMPTY TYPE FLAG
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD IS_EMPTY.
DATA(LV_LINES) = LINES( DT_ROWS ).
IF LV_LINES = 0.
IS_EMPTY = 'X'.
ELSE.
IS_EMPTY = ' '.
ENDIF.
* IS_EMPTY = ROWS->IF_OBJECT_COLLECTION~IS_EMPTY( ).
ENDMETHOD. "IS_EMPTY ENDMETHOD. "IS_EMPTY
METHOD remove. * <SIGNATURE>---------------------------------------------------------------------------------------+
rows->remove( io_row ). * | Instance Public Method ZCL_EXCEL_ROWS->REMOVE
* +-------------------------------------------------------------------------------------------------+
* | [--->] IO_ROW TYPE REF TO ZCL_EXCEL_ROW
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD REMOVE.
* ROWS->REMOVE( IO_ROW ).
DELETE DT_ROWS WHERE ROW_INDEX = IO_ROW->GET_ROW_INDEX( ).
ENDMETHOD. "REMOVE ENDMETHOD. "REMOVE
METHOD size. * <SIGNATURE>---------------------------------------------------------------------------------------+
ep_size = rows->if_object_collection~size( ). * | Instance Public Method ZCL_EXCEL_ROWS->SIZE
* +-------------------------------------------------------------------------------------------------+
* | [<-()] EP_SIZE TYPE I
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD SIZE.
* IF sy-uname = 'BILEN'.
EP_SIZE = LINES( DT_ROWS )..
*
* else.
* EP_SIZE = ROWS->IF_OBJECT_COLLECTION~SIZE( ).
*
* ENDIF.
ENDMETHOD. "SIZE ENDMETHOD. "SIZE
ENDCLASS. ENDCLASS.