From 66e4ef4793406f2a1289bd71c65a137014781a3b Mon Sep 17 00:00:00 2001 From: Bilen Date: Tue, 20 Mar 2018 09:32:36 +0800 Subject: [PATCH] Performance update for iterator Iterator is slowing down for read operations, row class reference is now stored in hash table rather than iterator. --- src/zcl_excel_rows.clas.abap | 171 ++++++++++++++++++++++++++--------- 1 file changed, 127 insertions(+), 44 deletions(-) diff --git a/src/zcl_excel_rows.clas.abap b/src/zcl_excel_rows.clas.abap index c1cf0f1..f7dfc06 100644 --- a/src/zcl_excel_rows.clas.abap +++ b/src/zcl_excel_rows.clas.abap @@ -3,45 +3,54 @@ *----------------------------------------------------------------------* * *----------------------------------------------------------------------* -class ZCL_EXCEL_ROWS definition - public - final - create public . +CLASS ZCL_EXCEL_ROWS DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + *"* public components of class ZCL_EXCEL_ROWS *"* do not include other source files here!!! *"* protected components of class ZABAP_EXCEL_WORKSHEETS *"* 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 - importing - !IO_ROW type ref to ZCL_EXCEL_ROW . - methods CLEAR . - methods CONSTRUCTOR . - methods GET - importing - !IP_INDEX type I - returning - value(EO_ROW) type ref to ZCL_EXCEL_ROW . - methods GET_ITERATOR - returning - value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . - methods IS_EMPTY - returning - value(IS_EMPTY) type FLAG . - methods REMOVE - importing - !IO_ROW type ref to ZCL_EXCEL_ROW . - methods SIZE - returning - value(EP_SIZE) type I . + DATA: + DT_ROWS TYPE HASHED TABLE OF T_ROWS WITH UNIQUE KEY ROW_INDEX. + + METHODS ADD + IMPORTING + !IO_ROW TYPE REF TO ZCL_EXCEL_ROW . + METHODS CLEAR . + METHODS CONSTRUCTOR . + METHODS GET + IMPORTING + !IP_INDEX TYPE I + RETURNING + VALUE(EO_ROW) TYPE REF TO ZCL_EXCEL_ROW . + METHODS GET_ITERATOR + RETURNING + VALUE(EO_ITERATOR) TYPE REF TO CL_OBJECT_COLLECTION_ITERATOR . + METHODS IS_EMPTY + RETURNING + VALUE(IS_EMPTY) TYPE FLAG . + METHODS REMOVE + IMPORTING + !IO_ROW TYPE REF TO ZCL_EXCEL_ROW . + METHODS SIZE + RETURNING + VALUE(EP_SIZE) TYPE I . PROTECTED SECTION. *"* private components of class ZABAP_EXCEL_RANGES *"* do not include other source files here!!! PRIVATE SECTION. - DATA rows TYPE REF TO cl_object_collection . + DATA ROWS TYPE REF TO CL_OBJECT_COLLECTION . ENDCLASS. @@ -49,44 +58,118 @@ ENDCLASS. CLASS ZCL_EXCEL_ROWS IMPLEMENTATION. - METHOD add. - rows->add( io_row ). +* ---------------------------------------------------------------------------------------+ +* | Instance Public Method ZCL_EXCEL_ROWS->ADD +* +-------------------------------------------------------------------------------------------------+ +* | [--->] IO_ROW TYPE REF TO ZCL_EXCEL_ROW +* +-------------------------------------------------------------------------------------- + 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 - METHOD clear. - rows->clear( ). +* ---------------------------------------------------------------------------------------+ +* | Instance Public Method ZCL_EXCEL_ROWS->CLEAR +* +-------------------------------------------------------------------------------------------------+ +* +-------------------------------------------------------------------------------------- + METHOD CLEAR. +* ROWS->CLEAR( ). + CLEAR DT_ROWS[]. + ENDMETHOD. "CLEAR - METHOD constructor. +* ---------------------------------------------------------------------------------------+ +* | Instance Public Method ZCL_EXCEL_ROWS->CONSTRUCTOR +* +-------------------------------------------------------------------------------------------------+ +* +-------------------------------------------------------------------------------------- + METHOD CONSTRUCTOR. - CREATE OBJECT rows. + CREATE OBJECT ROWS. ENDMETHOD. "CONSTRUCTOR - METHOD get. - 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 +* +-------------------------------------------------------------------------------------- + METHOD GET. +* IF SY-UNAME = 'BILEN'. + READ TABLE DT_ROWS ASSIGNING FIELD-SYMBOL() WITH TABLE KEY ROW_INDEX = IP_INDEX. + IF SY-SUBRC = 0. + EO_ROW ?= -ROW. + ENDIF. +* ELSE. +* EO_ROW ?= ROWS->IF_OBJECT_COLLECTION~GET( IP_INDEX ). +* +* ENDIF. ENDMETHOD. "GET - METHOD get_iterator. - 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 +* +-------------------------------------------------------------------------------------- + METHOD GET_ITERATOR. + EO_ITERATOR ?= ROWS->IF_OBJECT_COLLECTION~GET_ITERATOR( ). ENDMETHOD. "GET_ITERATOR - METHOD is_empty. - is_empty = rows->if_object_collection~is_empty( ). +* ---------------------------------------------------------------------------------------+ +* | Instance Public Method ZCL_EXCEL_ROWS->IS_EMPTY +* +-------------------------------------------------------------------------------------------------+ +* | [<-()] IS_EMPTY TYPE FLAG +* +-------------------------------------------------------------------------------------- + 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 - METHOD remove. - rows->remove( io_row ). +* ---------------------------------------------------------------------------------------+ +* | Instance Public Method ZCL_EXCEL_ROWS->REMOVE +* +-------------------------------------------------------------------------------------------------+ +* | [--->] IO_ROW TYPE REF TO ZCL_EXCEL_ROW +* +-------------------------------------------------------------------------------------- + METHOD REMOVE. +* ROWS->REMOVE( IO_ROW ). + DELETE DT_ROWS WHERE ROW_INDEX = IO_ROW->GET_ROW_INDEX( ). ENDMETHOD. "REMOVE - METHOD size. - ep_size = rows->if_object_collection~size( ). +* ---------------------------------------------------------------------------------------+ +* | Instance Public Method ZCL_EXCEL_ROWS->SIZE +* +-------------------------------------------------------------------------------------------------+ +* | [<-()] EP_SIZE TYPE I +* +-------------------------------------------------------------------------------------- + METHOD SIZE. +* IF sy-uname = 'BILEN'. + EP_SIZE = LINES( DT_ROWS ).. +* +* else. +* EP_SIZE = ROWS->IF_OBJECT_COLLECTION~SIZE( ). +* +* ENDIF. ENDMETHOD. "SIZE ENDCLASS.