copy_filtered_column Subroutine

private subroutine copy_filtered_column(source_df, target_df, col_index, selected_rows)

Internal: Copy filtered column from source to target

Arguments

Type IntentOptional Attributes Name
type(data_frame), intent(in) :: source_df
type(data_frame), intent(inout) :: target_df
integer, intent(in) :: col_index
integer, intent(in), dimension(:) :: selected_rows

Source Code

    subroutine copy_filtered_column(source_df, target_df, col_index, selected_rows)
        type(data_frame), intent(in) :: source_df
        type(data_frame), intent(inout) :: target_df
        integer, intent(in) :: col_index
        integer, dimension(:), intent(in) :: selected_rows

        integer :: i, n_selected
        real(rk), allocatable :: real_filtered(:)
        integer(ik), allocatable :: int_filtered(:)
        logical, allocatable :: logical_filtered(:)
        character(len=:), allocatable :: char_filtered(:)
        complex(rk), allocatable :: complex_filtered(:)
        type(column) :: col

        n_selected = size(selected_rows)
        col = source_df % get_data_col(col_index)

        select case (col % get_type())
        case (REAL_NUM)
            allocate (real_filtered(n_selected))
            do i = 1, n_selected
                real_filtered(i) = col % getr(selected_rows(i))
            end do
            if (source_df % get_with_headers()) then
                call df_append_real(target_df, real_filtered, source_df % header(col_index))
            else
                call df_append_real(target_df, real_filtered)
            end if
            deallocate (real_filtered)
        case (INTEGER_NUM)
            allocate (int_filtered(n_selected))
            do i = 1, n_selected
                int_filtered(i) = col % geti(selected_rows(i))
            end do
            if (source_df % get_with_headers()) then
                call df_append_integer(target_df, int_filtered, source_df % header(col_index))
            else
                call df_append_integer(target_df, int_filtered)
            end if
            deallocate (int_filtered)
        case (LOGICAL_NUM)
            allocate (logical_filtered(n_selected))
            do i = 1, n_selected
                logical_filtered(i) = col % getl(selected_rows(i))
            end do
            if (source_df % get_with_headers()) then
                call df_append_logical(target_df, logical_filtered, source_df % header(col_index))
            else
                call df_append_logical(target_df, logical_filtered)
            end if
            deallocate (logical_filtered)
        case (CHARACTER_NUM)
            allocate (character(len=len(col % getch(1))) :: char_filtered(n_selected))
            do i = 1, n_selected
                char_filtered(i) = col % getch(selected_rows(i))
            end do
            if (source_df % get_with_headers()) then
                call df_append_character(target_df, char_filtered, source_df % header(col_index))
            else
                call df_append_character(target_df, char_filtered)
            end if
            deallocate (char_filtered)
        case (COMPLEX_NUM)
            allocate (complex_filtered(n_selected))
            do i = 1, n_selected
                complex_filtered(i) = col % getc(selected_rows(i))
            end do
            if (source_df % get_with_headers()) then
                call df_append_complex(target_df, complex_filtered, source_df % header(col_index))
            else
                call df_append_complex(target_df, complex_filtered)
            end if
            deallocate (complex_filtered)
        end select
    end subroutine copy_filtered_column