in abap-sdk/ZGOOG_SDK_UTILITIES/zgoog_bq_read_odata/zcl_bq_table_read_base.clas.abap [0:0]
METHOD select.
**********************************************************************
* Copyright 2024 Google LLC *
* *
* Licensed under the Apache License, Version 2.0 (the "License"); *
* you may not use this file except in compliance with the License. *
* You may obtain a copy of the License at *
* https://www.apache.org/licenses/LICENSE-2.0 *
* Unless required by applicable law or agreed to in writing, *
* software distributed under the License is distributed on an *
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, *
* either express or implied. *
* See the License for the specific language governing permissions *
* and limitations under the License. *
**********************************************************************
DATA(lv_top) = io_request->get_paging( )->get_page_size( ).
DATA(lv_skip) = io_request->get_paging( )->get_offset( ).
DATA(lt_requested_fields) = io_request->get_requested_elements( ).
DATA(lt_sort_order) = io_request->get_sort_elements( ).
DATA(lv_filter_condition_string) = io_request->get_filter( )->get_as_sql_string( ).
DATA:
lv_p_project_id TYPE string,
ls_input TYPE /goog/cl_bigquery_v2=>ty_103,
ls_raw TYPE REF TO data,
ls_output TYPE /goog/cl_bigquery_v2=>ty_104,
lo_exception TYPE REF TO /goog/cx_sdk.
TRY.
DATA(lo_bq) = NEW /goog/cl_bigquery_v2( iv_key_name = iv_key ).
CATCH /goog/cx_sdk INTO lo_exception.
ENDTRY.
DATA(lv_entity) = io_request->get_entity_id( ).
lv_p_project_id = lo_bq->gv_project_id.
ls_input-query =
COND #( WHEN lv_filter_condition_string IS INITIAL THEN
|SELECT * FROM { iv_table } |
ELSE |SELECT * FROM { iv_table } Where { lv_filter_condition_string } | ).
ls_input-max_results = lv_top + lv_skip.
ls_input-use_legacy_sql = abap_false.
ls_input-use_query_cache = abap_false.
ls_input-default_dataset-dataset_id = iv_dataset.
ls_input-default_dataset-project_id = lo_bq->gv_project_id.
TRY.
lo_bq->query_jobs(
EXPORTING
iv_p_projects_id = lv_p_project_id
is_input = ls_input
IMPORTING
es_output = ls_output ).
CATCH /goog/cx_sdk INTO lo_exception.
ENDTRY.
DATA: lr_result_tab TYPE REF TO data.
DATA: lr_result_wa TYPE REF TO data.
CREATE DATA lr_result_wa TYPE (lv_entity).
CREATE DATA lr_result_tab TYPE STANDARD TABLE OF (lv_entity).
FIELD-SYMBOLS: <ls_result> TYPE any.
FIELD-SYMBOLS: <lt_result> TYPE STANDARD TABLE.
ASSIGN lr_result_wa->* TO <ls_result>.
ASSIGN lr_result_tab->* TO <lt_result>.
LOOP AT ls_output-rows REFERENCE INTO DATA(ls_rows).
CLEAR: <ls_result>.
LOOP AT ls_rows->f ASSIGNING FIELD-SYMBOL(<ls_field>).
DATA(lv_tabix_field) = sy-tabix.
ASSIGN COMPONENT lv_tabix_field OF STRUCTURE <ls_result>
TO FIELD-SYMBOL(<ls_target_field>).
IF <ls_field>-v IS BOUND AND
<ls_target_field> IS ASSIGNED.
CASE cl_abap_typedescr=>describe_by_data( <ls_target_field> )->type_kind.
WHEN cl_abap_typedescr=>typekind_date.
IF strlen( <ls_field>-v->* ) = 10.
<ls_target_field> = <ls_field>-v->*(4) && <ls_field>-v->*+5(2) && <ls_field>-v->*+8(2).
ENDIF.
WHEN cl_abap_typedescr=>typekind_time.
IF strlen( <ls_field>-v->* ) = 8.
<ls_target_field> = <ls_field>-v->*(2) && <ls_field>-v->*+3(2) && <ls_field>-v->*+6(2).
ENDIF.
WHEN cl_abap_typedescr=>typekind_utclong.
IF strlen( <ls_field>-v->* ) > 26.
<ls_target_field> = <ls_field>-v->*(26).
ENDIF.
WHEN OTHERS.
<ls_target_field> = <ls_field>-v->*.
ENDCASE.
ENDIF.
ENDLOOP.
APPEND <ls_result> TO <lt_result>.
ENDLOOP.
IF lv_skip IS NOT INITIAL.
DELETE <lt_result> TO lv_skip.
ENDIF.
io_response->set_total_number_of_records( lines( <lt_result> ) ).
io_response->set_data( <lt_result> ).