From f7787a90b50e6bdf24fa3ac350a9041fa02f0039 Mon Sep 17 00:00:00 2001 From: Ivan Date: Tue, 27 Mar 2018 11:57:41 -0500 Subject: [PATCH] Revert "Performance improvement for GET_ROW method" --- src/zcl_excel_rows.clas.abap | 143 ++++++++++-------------------- src/zcl_excel_worksheet.clas.abap | 20 +++-- 2 files changed, 59 insertions(+), 104 deletions(-) diff --git a/src/zcl_excel_rows.clas.abap b/src/zcl_excel_rows.clas.abap index 5ef7600..c1cf0f1 100644 --- a/src/zcl_excel_rows.clas.abap +++ b/src/zcl_excel_rows.clas.abap @@ -3,51 +3,45 @@ *----------------------------------------------------------------------* * *----------------------------------------------------------------------* -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. - TYPES: - BEGIN OF T_ROWS, " performance improvement #527 - ROW_INDEX TYPE INT4, - ROW TYPE REF TO ZCL_EXCEL_ROW, - END OF T_ROWS. +public section. - DATA: - DT_ROWS TYPE HASHED TABLE OF T_ROWS WITH UNIQUE KEY ROW_INDEX READ-ONLY. - - 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 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 . + 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. @@ -55,89 +49,44 @@ ENDCLASS. CLASS ZCL_EXCEL_ROWS IMPLEMENTATION. -* ---------------------------------------------------------------------------------------+ -* | Instance Public Method ZCL_EXCEL_ROWS->ADD -* +-------------------------------------------------------------------------------------------------+ -* | [--->] IO_ROW TYPE REF TO ZCL_EXCEL_ROW -* +-------------------------------------------------------------------------------------- - 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. - + METHOD add. + rows->add( io_row ). ENDMETHOD. "ADD -* ---------------------------------------------------------------------------------------+ -* | Instance Public Method ZCL_EXCEL_ROWS->CLEAR -* +-------------------------------------------------------------------------------------------------+ -* +-------------------------------------------------------------------------------------- - METHOD CLEAR. - CLEAR DT_ROWS[]. - + METHOD clear. + rows->clear( ). ENDMETHOD. "CLEAR -* ---------------------------------------------------------------------------------------+ -* | Instance Public Method ZCL_EXCEL_ROWS->CONSTRUCTOR -* +-------------------------------------------------------------------------------------------------+ -* +-------------------------------------------------------------------------------------- - METHOD CONSTRUCTOR. + METHOD constructor. - CREATE OBJECT ROWS. + CREATE OBJECT rows. ENDMETHOD. "CONSTRUCTOR -* ---------------------------------------------------------------------------------------+ -* | Instance Public Method ZCL_EXCEL_ROWS->GET -* +-------------------------------------------------------------------------------------------------+ -* | [--->] IP_INDEX TYPE I -* | [<-()] EO_ROW TYPE REF TO ZCL_EXCEL_ROW -* +-------------------------------------------------------------------------------------- - METHOD GET. - READ TABLE DT_ROWS ASSIGNING FIELD-SYMBOL() WITH TABLE KEY ROW_INDEX = IP_INDEX. - IF SY-SUBRC = 0. - EO_ROW ?= -ROW. - ENDIF. + METHOD get. + eo_row ?= rows->if_object_collection~get( ip_index ). ENDMETHOD. "GET -* ---------------------------------------------------------------------------------------+ -* | Instance Public Method ZCL_EXCEL_ROWS->IS_EMPTY -* +-------------------------------------------------------------------------------------------------+ -* | [<-()] IS_EMPTY TYPE FLAG -* +-------------------------------------------------------------------------------------- - METHOD IS_EMPTY. - DATA(LV_LINES) = LINES( DT_ROWS ). + METHOD get_iterator. + eo_iterator ?= rows->if_object_collection~get_iterator( ). + ENDMETHOD. "GET_ITERATOR - IF LV_LINES = 0. - IS_EMPTY = abap_true. - ELSE. - IS_EMPTY = abap_false. - ENDIF. + + METHOD is_empty. + is_empty = rows->if_object_collection~is_empty( ). ENDMETHOD. "IS_EMPTY -* ---------------------------------------------------------------------------------------+ -* | Instance Public Method ZCL_EXCEL_ROWS->REMOVE -* +-------------------------------------------------------------------------------------------------+ -* | [--->] IO_ROW TYPE REF TO ZCL_EXCEL_ROW -* +-------------------------------------------------------------------------------------- - METHOD REMOVE. - DELETE DT_ROWS WHERE ROW_INDEX = IO_ROW->GET_ROW_INDEX( ). + METHOD remove. + rows->remove( io_row ). ENDMETHOD. "REMOVE -* ---------------------------------------------------------------------------------------+ -* | Instance Public Method ZCL_EXCEL_ROWS->SIZE -* +-------------------------------------------------------------------------------------------------+ -* | [<-()] EP_SIZE TYPE I -* +-------------------------------------------------------------------------------------- - METHOD SIZE. - EP_SIZE = LINES( DT_ROWS ).. + METHOD size. + ep_size = rows->if_object_collection~size( ). ENDMETHOD. "SIZE ENDCLASS. diff --git a/src/zcl_excel_worksheet.clas.abap b/src/zcl_excel_worksheet.clas.abap index 21b6173..8a57774 100644 --- a/src/zcl_excel_worksheet.clas.abap +++ b/src/zcl_excel_worksheet.clas.abap @@ -4098,14 +4098,20 @@ method GET_RANGES_ITERATOR. METHOD get_row. -* performance improvement for issue #527 - READ TABLE ROWS->DT_ROWS ASSIGNING FIELD-SYMBOL() WITH TABLE KEY ROW_INDEX = IP_ROW. - IF SY-SUBRC = 0. - EO_ROW = -ROW. - ENDIF. + DATA: lo_row_iterator TYPE REF TO cl_object_collection_iterator, + lo_row TYPE REF TO zcl_excel_row. - IF EO_ROW IS NOT BOUND. - EO_ROW = ME->ADD_NEW_ROW( IP_ROW ). + lo_row_iterator = me->get_rows_iterator( ). + 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. ENDMETHOD.