rap_call

in src/ZGOOG_DEMO_RAP_AGENT/src/zcl_goog_rap_generative_model.clas.abap [0:0]


  METHOD rap_call.

    DATA(ls_rap_tool) = REF #( gt_rap_tools[ name = iv_function_name ] OPTIONAL ).
    DATA: lo_client_proxy TYPE REF TO /iwbep/if_cp_client_proxy.

    TRY.
        CASE ls_rap_tool->implementation-version.
          WHEN 'V2'.

            lo_client_proxy =
               /iwbep/cl_cp_client_proxy_fact=>create_v2_local_proxy(
                 VALUE #( service_id = ls_rap_tool->implementation-service service_version =  '0001' ) ).

          WHEN 'V4'.

            lo_client_proxy =
                /iwbep/cl_cp_client_proxy_fact=>create_v4_local_proxy(
                   VALUE #( service_id = ls_rap_tool->implementation-service service_version = '0001' repository_id = 'SRVD_A2X' ) ).

          WHEN OTHERS.
        ENDCASE.

        CASE ls_rap_tool->implementation-operation.
          WHEN 'GET'.
            DATA: lo_read_request TYPE REF TO /iwbep/if_cp_request_read_list.
            DATA: lo_read_response TYPE REF TO /iwbep/if_cp_response_read_lst.

            lo_read_request =
              lo_client_proxy->create_resource_for_entity_set(
                 CONV #( ls_rap_tool->implementation-entity )
                 )->create_request_for_read( ).

            DATA(lo_filter_factory) = lo_read_request->create_filter_factory( ).

            LOOP AT it_function_parameters REFERENCE INTO DATA(ls_function_param).
              DATA(lr_range_func) =
              get_range_table(
                EXPORTING
                  pi_type  = CONV #( ls_rap_tool->implementation-cds_name && '-' && ls_function_param->parameter_name )
                  pi_value = ls_function_param->parameter_value ).

              FIELD-SYMBOLS: <lt_range_func> TYPE STANDARD TABLE.

              ASSIGN lr_range_func->* TO <lt_range_func>.

              DATA(lo_filter_func)  =
                lo_filter_factory->create_by_range(
                 iv_property_path = ls_function_param->parameter_name
                 it_range         = <lt_range_func> ).

              lo_read_request->set_filter( lo_filter_func ).

            ENDLOOP.

            LOOP AT ls_rap_tool->implementation-const_qp REFERENCE INTO DATA(ls_const_qp).
              DATA(lr_range_const) =
              get_range_table(
                EXPORTING
                  pi_type  = CONV #( ls_rap_tool->implementation-cds_name && '-' && ls_const_qp->name )
                  pi_value = ls_const_qp->value ).

              FIELD-SYMBOLS: <lt_range_const> TYPE STANDARD TABLE.

              ASSIGN lr_range_const->* TO <lt_range_const>.

              DATA(lo_filter_const)  =
                lo_filter_factory->create_by_range(
                 iv_property_path = ls_const_qp->name
                 it_range         = <lt_range_const> ).

              lo_read_request->set_filter( lo_filter_const ).
            ENDLOOP.

            DATA: lr_data TYPE REF TO data.
            CREATE DATA lr_data TYPE STANDARD TABLE OF (ls_rap_tool->implementation-cds_name).
            FIELD-SYMBOLS: <lt_data> TYPE STANDARD TABLE.
            ASSIGN lr_data->* TO <lt_data>.

            lo_read_request->set_top( iv_top = 10 ).
            lo_read_response = lo_read_request->execute( ).

            "Retrieve the business data
            lo_read_response->get_business_data( IMPORTING et_business_data = <lt_data> ).
            IF <lt_data> IS INITIAL.
              RETURN.
            ENDIF.

            ev_function_response = |List of { ls_rap_tool->implementation-cds_column }: |.
            LOOP AT <lt_data> ASSIGNING FIELD-SYMBOL(<ls_data>).
              ASSIGN COMPONENT ls_rap_tool->implementation-cds_column
                     OF STRUCTURE <ls_data> TO  FIELD-SYMBOL(<lv_column>).
              ev_function_response = ev_function_response && space && <lv_column>.
            ENDLOOP.

          WHEN 'PATCH'.

            DATA: lo_update_request TYPE REF TO /iwbep/if_cp_request_update.
            DATA: lo_entity_resource TYPE REF TO /iwbep/if_cp_resource_entity.

            DATA: lr_upd_data TYPE REF TO data.

            CREATE DATA lr_upd_data TYPE (ls_rap_tool->implementation-cds_name).

            ASSIGN lr_upd_data->* TO FIELD-SYMBOL(<ls_upd_data>).
            ASSIGN COMPONENT ls_rap_tool->implementation-cds_column OF STRUCTURE <ls_upd_data> TO FIELD-SYMBOL(<lv_upd_key>).
            <lv_upd_key> = VALUE #( it_function_parameters[ 1 ]-parameter_value OPTIONAL ).

            lo_entity_resource =
             lo_client_proxy->create_resource_for_entity_set(
               CONV #( ls_rap_tool->implementation-entity ) )->navigate_with_key( <ls_upd_data> ).

            lo_update_request = lo_entity_resource->create_request_for_update( /iwbep/if_cp_request_update=>gcs_update_semantic-patch ).

            LOOP AT ls_rap_tool->implementation-upd_param REFERENCE INTO DATA(ls_upd_param).
              ASSIGN COMPONENT ls_upd_param->name OF STRUCTURE <ls_upd_data> TO FIELD-SYMBOL(<lv_upd_prop>).
              <lv_upd_prop> = ls_upd_param->value.
            ENDLOOP.

            lo_update_request->set_business_data(
               is_business_data = <ls_upd_data>
               it_provided_property = VALUE #( FOR <wa_prop> IN ls_rap_tool->implementation-upd_param
                                                 ( <wa_prop>-name ) ) ).

            DATA(lo_update_response) = lo_update_request->execute( ).
            lo_update_response->get_business_data( IMPORTING es_business_data = <ls_upd_data> ).

            ev_function_response = |Update Performed successfully |.

          WHEN OTHERS.
        ENDCASE.


      CATCH /iwbep/cx_cp_remote INTO DATA(lx_cp_remote).
        " Error handling
        DATA(lv_text) = lx_cp_remote->get_longtext( ).
      CATCH /iwbep/cx_gateway INTO DATA(lx_gateway).
        " Error Handling
        DATA(lv_text1) = lx_gateway->get_longtext( ).
    ENDTRY.

    INSERT VALUE #( step = lines( gt_execution_plan[] ) + 1 ) INTO TABLE gt_execution_plan
           REFERENCE INTO DATA(ls_execution_plan) .
    APPEND CONV #( |Calling tool { ls_rap_tool->name }| ) TO ls_execution_plan->details.
    APPEND CONV #( |  - Implemented by RAP service { ls_rap_tool->implementation-service } | ) TO ls_execution_plan->details.
    APPEND CONV #( |  - Perfoming operation { ls_rap_tool->implementation-operation } on entity { ls_rap_tool->implementation-entity } | ) TO ls_execution_plan->details.
    LOOP AT it_function_parameters REFERENCE INTO DATA(ls_func_param_output).
      APPEND CONV #( |  - With Parameters name { ls_func_param_output->parameter_name } and Value { ls_func_param_output->parameter_value } | ) TO ls_execution_plan->details.
    ENDLOOP.
    APPEND CONV #( |  - Tool response: { ev_function_response } | ) TO ls_execution_plan->details.