Coverage Report

Created: 2025-08-26 07:03

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/Users/andrewlamb/Software/arrow-rs/arrow-data/src/equal/dictionary.rs
Line
Count
Source
1
// Licensed to the Apache Software Foundation (ASF) under one
2
// or more contributor license agreements.  See the NOTICE file
3
// distributed with this work for additional information
4
// regarding copyright ownership.  The ASF licenses this file
5
// to you under the Apache License, Version 2.0 (the
6
// "License"); you may not use this file except in compliance
7
// with the License.  You may obtain a copy of the License at
8
//
9
//   http://www.apache.org/licenses/LICENSE-2.0
10
//
11
// Unless required by applicable law or agreed to in writing,
12
// software distributed under the License is distributed on an
13
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
// KIND, either express or implied.  See the License for the
15
// specific language governing permissions and limitations
16
// under the License.
17
18
use crate::data::{contains_nulls, ArrayData};
19
use arrow_buffer::ArrowNativeType;
20
21
use super::equal_range;
22
23
6
pub(super) fn dictionary_equal<T: ArrowNativeType>(
24
6
    lhs: &ArrayData,
25
6
    rhs: &ArrayData,
26
6
    lhs_start: usize,
27
6
    rhs_start: usize,
28
6
    len: usize,
29
6
) -> bool {
30
6
    let lhs_keys = lhs.buffer::<T>(0);
31
6
    let rhs_keys = rhs.buffer::<T>(0);
32
33
6
    let lhs_values = &lhs.child_data()[0];
34
6
    let rhs_values = &rhs.child_data()[0];
35
36
    // Only checking one null mask here because by the time the control flow reaches
37
    // this point, the equality of the two masks would have already been verified.
38
6
    if !contains_nulls(lhs.nulls(), lhs_start, len) {
39
16
        
(0..len)4
.
all4
(|i| {
40
16
            let lhs_pos = lhs_start + i;
41
16
            let rhs_pos = rhs_start + i;
42
43
16
            equal_range(
44
16
                lhs_values,
45
16
                rhs_values,
46
16
                lhs_keys[lhs_pos].to_usize().unwrap(),
47
16
                rhs_keys[rhs_pos].to_usize().unwrap(),
48
                1,
49
            )
50
16
        })
51
    } else {
52
        // get a ref of the null buffer bytes, to use in testing for nullness
53
2
        let lhs_nulls = lhs.nulls().unwrap();
54
2
        let rhs_nulls = rhs.nulls().unwrap();
55
8
        
(0..len)2
.
all2
(|i| {
56
8
            let lhs_pos = lhs_start + i;
57
8
            let rhs_pos = rhs_start + i;
58
59
8
            let lhs_is_null = lhs_nulls.is_null(lhs_pos);
60
8
            let rhs_is_null = rhs_nulls.is_null(rhs_pos);
61
62
8
            lhs_is_null
63
6
                || (lhs_is_null == rhs_is_null)
64
6
                    && equal_range(
65
6
                        lhs_values,
66
6
                        rhs_values,
67
6
                        lhs_keys[lhs_pos].to_usize().unwrap(),
68
6
                        rhs_keys[rhs_pos].to_usize().unwrap(),
69
                        1,
70
                    )
71
8
        })
72
    }
73
6
}