All files / src/objects/core zcl_abapgit_item_graph.clas.abap

100% Statements 107/107
100% Branches 3/3
100% Functions 2/2
100% Lines 107/107

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 1081x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 33x 33x 33x 33x 33x 33x 33x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 44x 44x 44x 44x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 44x 44x 44x 44x 44x 44x 44x 44x 44x 44x 44x 1x  
CLASS zcl_abapgit_item_graph DEFINITION
  PUBLIC
  CREATE PUBLIC .
 
  PUBLIC SECTION.
 
    METHODS constructor
      IMPORTING
        !it_items TYPE zif_abapgit_definitions=>ty_items_tt .
    METHODS add_edge
      IMPORTING
        !is_from TYPE zif_abapgit_definitions=>ty_item
        !is_to   TYPE zif_abapgit_definitions=>ty_item .
    METHODS has_vertices
      RETURNING
        VALUE(rv_bool) TYPE abap_bool .
    METHODS get_next
      IMPORTING
        !ii_log        TYPE REF TO zif_abapgit_log
      RETURNING
        VALUE(rs_item) TYPE zif_abapgit_definitions=>ty_item .
  PROTECTED SECTION.
  PRIVATE SECTION.
    TYPES: BEGIN OF ty_edge,
             from TYPE zif_abapgit_definitions=>ty_item,
             to   TYPE zif_abapgit_definitions=>ty_item,
           END OF ty_edge.
 
    DATA mt_vertices TYPE STANDARD TABLE OF zif_abapgit_definitions=>ty_item WITH DEFAULT KEY.
    DATA mt_edges TYPE STANDARD TABLE OF ty_edge WITH DEFAULT KEY
      WITH NON-UNIQUE SORTED KEY sec_to COMPONENTS to
      WITH NON-UNIQUE SORTED KEY sec_from COMPONENTS from.
    DATA mv_warning TYPE abap_bool.
 
    METHODS remove_vertex IMPORTING iv_index TYPE i.
ENDCLASS.
 
 
 
CLASS ZCL_ABAPGIT_ITEM_GRAPH IMPLEMENTATION.
 
 
  METHOD add_edge.
    DATA ls_edge LIKE LINE OF mt_edges.
    ASSERT is_from IS NOT INITIAL.
    ASSERT is_to IS NOT INITIAL.
    ls_edge-from = is_from.
    ls_edge-to   = is_to.
    APPEND ls_edge TO mt_edges.
  ENDMETHOD.
 
 
  METHOD constructor.
    INSERT LINES OF it_items INTO TABLE mt_vertices.
  ENDMETHOD.
 
 
  METHOD get_next.
* find a vertex with no inbound edges, if it does not exist pick anything
 
    DATA ls_vertex LIKE LINE OF mt_vertices.
    DATA lv_index  TYPE i.
 
    LOOP AT mt_vertices INTO ls_vertex.
      lv_index = sy-tabix.
      READ TABLE mt_edges WITH KEY sec_to COMPONENTS
        to-obj_type = ls_vertex-obj_type
        to-obj_name = ls_vertex-obj_name
        TRANSPORTING NO FIELDS.
      IF sy-subrc <> 0.
        remove_vertex( lv_index ).
        rs_item = ls_vertex.
        RETURN.
      ENDIF.
    ENDLOOP.
 
    IF mv_warning = abap_false.
* only issue the warning once per graph
      ii_log->add_warning( |Cycle detected in item graph| ).
      mv_warning = abap_true.
    ENDIF.
 
    READ TABLE mt_vertices INTO rs_item INDEX 1.
    ASSERT sy-subrc = 0.
    remove_vertex( 1 ).
 
  ENDMETHOD.
 
 
  METHOD has_vertices.
    rv_bool = boolc( lines( mt_vertices ) > 0 ).
  ENDMETHOD.
 
 
  METHOD remove_vertex.
    DATA ls_vertex LIKE LINE OF mt_vertices.
 
    READ TABLE mt_vertices INDEX iv_index INTO ls_vertex.
    ASSERT sy-subrc = 0.
 
    DELETE mt_vertices INDEX iv_index.
    DELETE mt_edges USING KEY sec_from
      WHERE from-obj_type = ls_vertex-obj_type
      AND from-obj_name = ls_vertex-obj_name.
 
  ENDMETHOD.
ENDCLASS.