MCPcopy Create free account
hub / github.com/apache/arrow / ComputeKleene

Function ComputeKleene

cpp/src/arrow/compute/kernels/scalar_boolean.cc:36–89  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

34
35template <typename ComputeWord>
36void ComputeKleene(ComputeWord&& compute_word, KernelContext* ctx, const ArraySpan& left,
37 const ArraySpan& right, ArraySpan* out) {
38 DCHECK(left.GetNullCount() != 0 || right.GetNullCount() != 0)
39 << "ComputeKleene is unnecessarily expensive for the non-null case";
40
41 Bitmap left_valid_bm{left.buffers[0].data, left.offset, left.length};
42 Bitmap left_data_bm{left.buffers[1].data, left.offset, left.length};
43
44 Bitmap right_valid_bm{right.buffers[0].data, right.offset, right.length};
45 Bitmap right_data_bm{right.buffers[1].data, right.offset, right.length};
46
47 std::array<Bitmap, 2> out_bms{Bitmap(out->buffers[0].data, out->offset, out->length),
48 Bitmap(out->buffers[1].data, out->offset, out->length)};
49
50 auto apply = [&](uint64_t left_valid, uint64_t left_data, uint64_t right_valid,
51 uint64_t right_data, uint64_t* out_validity, uint64_t* out_data) {
52 auto left_true = left_valid & left_data;
53 auto left_false = left_valid & ~left_data;
54
55 auto right_true = right_valid & right_data;
56 auto right_false = right_valid & ~right_data;
57
58 compute_word(left_true, left_false, right_true, right_false, out_validity, out_data);
59 };
60
61 if (right.GetNullCount() == 0) {
62 std::array<Bitmap, 3> in_bms{left_valid_bm, left_data_bm, right_data_bm};
63 Bitmap::VisitWordsAndWrite(
64 in_bms, &out_bms,
65 [&](const std::array<uint64_t, 3>& in, std::array<uint64_t, 2>* out) {
66 apply(in[0], in[1], ~uint64_t(0), in[2], &(out->at(0)), &(out->at(1)));
67 });
68 return;
69 }
70
71 if (left.GetNullCount() == 0) {
72 std::array<Bitmap, 3> in_bms{left_data_bm, right_valid_bm, right_data_bm};
73 Bitmap::VisitWordsAndWrite(
74 in_bms, &out_bms,
75 [&](const std::array<uint64_t, 3>& in, std::array<uint64_t, 2>* out) {
76 apply(~uint64_t(0), in[0], in[1], in[2], &(out->at(0)), &(out->at(1)));
77 });
78 return;
79 }
80
81 DCHECK(left.GetNullCount() != 0 && right.GetNullCount() != 0);
82 std::array<Bitmap, 4> in_bms{left_valid_bm, left_data_bm, right_valid_bm,
83 right_data_bm};
84 Bitmap::VisitWordsAndWrite(
85 in_bms, &out_bms,
86 [&](const std::array<uint64_t, 4>& in, std::array<uint64_t, 2>* out) {
87 apply(in[0], in[1], in[2], in[3], &(out->at(0)), &(out->at(1)));
88 });
89}
90
91inline BooleanScalar InvertScalar(const Scalar& in) {
92 return in.is_valid ? BooleanScalar(!checked_cast<const BooleanScalar&>(in).value)

Callers 3

CallMethod · 0.85
CallMethod · 0.85
CallMethod · 0.85

Calls 3

VisitWordsAndWriteFunction · 0.85
GetNullCountMethod · 0.80
BitmapFunction · 0.50

Tested by

no test coverage detected