Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
95 commits
Select commit Hold shift + click to select a range
620bc2d
Add fast-path logic to some libcudf regex APIs
davidwendt Apr 16, 2026
1cec387
Merge branch 'main' into regex-fast-paths
davidwendt Apr 16, 2026
510787e
Merge branch 'main' into regex-fast-paths
davidwendt Apr 20, 2026
e99504b
update benchmarks
davidwendt Apr 20, 2026
b5a614a
redo fast-path check member function
davidwendt Apr 20, 2026
408aeba
Merge branch 'main' into regex-fast-paths
davidwendt Apr 20, 2026
76837a4
Merge branch 'regex-fast-paths' of github.com:davidwendt/cudf into re…
davidwendt Apr 20, 2026
87f73ba
Merge branch 'main' into regex-fast-paths
davidwendt Apr 20, 2026
8368b4b
Merge branch 'main' into regex-fast-paths
davidwendt Apr 21, 2026
b62fb79
Merge branch 'main' into regex-fast-paths
davidwendt Apr 21, 2026
f4e115f
Merge branch 'main' into regex-fast-paths
davidwendt Apr 22, 2026
c436da0
Merge branch 'main' into regex-fast-paths
davidwendt Apr 24, 2026
949d9b5
fix while CHAR logic for embedded nulls
davidwendt Apr 24, 2026
1dcd12f
Merge branch 'main' into regex-fast-paths
davidwendt Apr 24, 2026
cf3d04b
Merge branch 'main' into regex-fast-paths
davidwendt Apr 27, 2026
79102fe
Merge branch 'main' into regex-fast-paths
davidwendt Apr 27, 2026
282935d
add count fast-path
davidwendt Apr 28, 2026
a074ee7
Merge branch 'main' into regex-fast-paths
davidwendt Apr 28, 2026
9d6e1e0
Merge branch 'regex-fast-paths' of github.com:davidwendt/cudf into re…
davidwendt Apr 29, 2026
cfb7635
Merge branch 'main' into regex-fast-paths
davidwendt Apr 29, 2026
475b086
Merge branch 'main' into regex-fast-paths
davidwendt Apr 30, 2026
52ed43b
Merge branch 'main' into regex-fast-paths
davidwendt May 5, 2026
96c38d2
Merge branch 'main' into regex-fast-paths
davidwendt May 6, 2026
a39feab
Merge branch 'main' into regex-fast-paths
davidwendt May 11, 2026
e548e15
add fp replace; fix count tests
davidwendt May 11, 2026
1b18450
Merge branch 'main' into regex-fast-paths
davidwendt May 11, 2026
79cc8e0
fix linter violations
davidwendt May 11, 2026
a0dfdff
Merge branch 'main' into regex-fast-paths
davidwendt May 11, 2026
11cd7ca
Merge branch 'main' into regex-fast-paths
davidwendt May 12, 2026
b82f8e6
Merge branch 'regex-fast-paths' of github.com:davidwendt/cudf into re…
davidwendt May 12, 2026
9c44470
Merge branch 'main' into regex-fast-paths
davidwendt May 12, 2026
f4cd92b
add nodiscard
davidwendt May 12, 2026
4be7dba
Merge branch 'main' into regex-fast-paths
davidwendt May 13, 2026
f7ded86
Merge branch 'main' into regex-fast-paths
davidwendt May 13, 2026
1cad01c
Merge branch 'main' into regex-fast-paths
davidwendt May 14, 2026
1f7d6b0
Merge branch 'main' into regex-fast-paths
davidwendt May 18, 2026
65b64df
Merge branch 'main' into regex-fast-paths
davidwendt May 18, 2026
4a5535f
Merge branch 'main' into regex-fast-paths
davidwendt May 20, 2026
82942d1
combine literal-fast-path logic
davidwendt May 20, 2026
3c1a831
Merge branch 'main' into regex-fast-paths
davidwendt May 20, 2026
bdb95aa
Merge branch 'main' into regex-fast-paths
davidwendt May 22, 2026
98d9298
Merge branch 'regex-fast-paths' of github.com:davidwendt/cudf into re…
davidwendt May 22, 2026
e5ad645
Merge branch 'main' into regex-fast-paths
davidwendt May 22, 2026
4911f4e
Merge branch 'main' into regex-fast-paths
davidwendt May 26, 2026
bf0a24b
Merge branch 'main' into regex-fast-paths
davidwendt May 27, 2026
a5d457d
Merge branch 'main' into regex-fast-paths
davidwendt May 28, 2026
4f753b8
Merge branch 'main' into regex-fast-paths
davidwendt May 29, 2026
97c7bde
fix merge conflicts
davidwendt Jun 1, 2026
efe3c9b
Merge branch 'regex-fast-paths' of github.com:davidwendt/cudf into re…
davidwendt Jun 1, 2026
6b68167
Merge branch 'main' into regex-fast-paths
davidwendt Jun 1, 2026
a922d71
Merge branch 'main' into regex-fast-paths
davidwendt Jun 3, 2026
84fe5fc
Merge branch 'main' into regex-fast-paths
davidwendt Jun 3, 2026
9ca6a64
Merge branch 'main' into regex-fast-paths
davidwendt Jun 5, 2026
285b735
Merge branch 'main' into regex-fast-paths
davidwendt Jun 5, 2026
61d17cc
Merge branch 'main' into regex-fast-paths
davidwendt Jun 8, 2026
1ad51c4
Merge branch 'main' into regex-fast-paths
davidwendt Jun 8, 2026
41d1481
Merge branch 'main' into regex-fast-paths
davidwendt Jun 9, 2026
8e36390
add fast-path for split_re
davidwendt Jun 9, 2026
fb51e77
Merge branch 'regex-fast-paths' of github.com:davidwendt/cudf into re…
davidwendt Jun 10, 2026
7a6490b
Merge branch 'main' into regex-fast-paths
davidwendt Jun 10, 2026
5e94779
Merge branch 'main' into regex-fast-paths
davidwendt Jun 10, 2026
7535bb0
fix merge conflicts
davidwendt Jun 12, 2026
38ebe30
Merge branch 'main' into regex-fast-paths
davidwendt Jun 12, 2026
ab87830
exper: test_java_settings.xml
davidwendt Jun 12, 2026
95033f2
exper: fix path to test_java_settings.xml
davidwendt Jun 12, 2026
5410a4d
Merge branch 'regex-fast-paths' of github.com:davidwendt/cudf into re…
davidwendt Jun 22, 2026
66768d7
Merge branch 'main' into regex-fast-paths
davidwendt Jun 22, 2026
baf1ad9
Merge branch 'main' into regex-fast-paths
davidwendt Jun 22, 2026
259c9ce
Merge branch 'main' into regex-fast-paths
davidwendt Jun 24, 2026
a69a88a
Merge branch 'main' into regex-fast-paths
davidwendt Jun 24, 2026
11cfb14
Merge branch 'main' into regex-fast-paths
davidwendt Jun 25, 2026
3c49387
Merge branch 'main' into regex-fast-paths
davidwendt Jun 25, 2026
210e0b8
fix match_re fast-path logic
davidwendt Jun 25, 2026
fd5eeda
Merge branch 'main' into regex-fast-paths
davidwendt Jun 26, 2026
81ef526
Merge branch 'regex-fast-paths' of github.com:davidwendt/cudf into re…
davidwendt Jun 26, 2026
8486a04
Merge branch 'main' into regex-fast-paths
davidwendt Jun 26, 2026
012159b
Merge branch 'main' into regex-fast-paths
davidwendt Jun 26, 2026
806030d
fix merge conflict
davidwendt Jun 26, 2026
cfe8e8f
fix merge conflict II
davidwendt Jun 26, 2026
71a7d4a
fix copyrights
davidwendt Jun 26, 2026
acbf7e8
Merge branch 'regex-fast-paths' of github.com:davidwendt/cudf into re…
davidwendt Jun 30, 2026
0b97d1a
Merge branch 'main' into regex-fast-paths
davidwendt Jun 30, 2026
755fa44
Merge branch 'main' into regex-fast-paths
davidwendt Jun 30, 2026
a4b4e34
Merge branch 'main' into regex-fast-paths
davidwendt Jul 1, 2026
9aca9cb
Merge branch 'main' into regex-fast-paths
davidwendt Jul 1, 2026
66e5422
Merge branch 'main' into regex-fast-paths
davidwendt Jul 2, 2026
4715813
Merge branch 'main' into regex-fast-paths
davidwendt Jul 2, 2026
110837d
Merge branch 'main' into regex-fast-paths
davidwendt Jul 2, 2026
144ad72
Merge branch 'main' into regex-fast-paths
davidwendt Jul 6, 2026
b2adf2a
Merge branch 'main' into regex-fast-paths
davidwendt Jul 8, 2026
b8481af
Merge branch 'main' into regex-fast-paths
davidwendt Jul 8, 2026
aa0c5f7
Merge branch 'main' into regex-fast-paths
davidwendt Jul 9, 2026
2951b25
fix EOL logic; remove split fast-path
davidwendt Jul 9, 2026
fae9116
really undo changes to split
davidwendt Jul 9, 2026
b98ea54
remove defaults from details functions
davidwendt Jul 9, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 43 additions & 0 deletions cpp/include/cudf/strings/detail/find.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
/*
* SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
* SPDX-License-Identifier: Apache-2.0
*/
#pragma once

#include <cudf/strings/find.hpp>

namespace cudf::strings::detail {

/**
* @copydoc cudf::strings::contains
*/
std::unique_ptr<column> contains(strings_column_view const& input,
string_scalar const& target,
rmm::cuda_stream_view stream,
rmm::device_async_resource_ref mr);

/**
* @copydoc cudf::strings::starts_with
*/
std::unique_ptr<column> starts_with(strings_column_view const& input,
string_scalar const& target,
rmm::cuda_stream_view stream,
rmm::device_async_resource_ref mr);

/**
* @copydoc cudf::strings::ends_with
*/
std::unique_ptr<column> ends_with(strings_column_view const& input,
string_scalar const& target,
rmm::cuda_stream_view stream,
rmm::device_async_resource_ref mr);

/**
* @copydoc cudf::strings::count
*/
std::unique_ptr<column> count(strings_column_view const& input,
string_scalar const& target,
rmm::cuda_stream_view stream,
rmm::device_async_resource_ref mr);

} // namespace cudf::strings::detail
12 changes: 11 additions & 1 deletion cpp/include/cudf/strings/regex/flags.hpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: Copyright (c) 2021-2026, NVIDIA CORPORATION.
* SPDX-FileCopyrightText: Copyright (c) 2021-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
* SPDX-License-Identifier: Apache-2.0
*/
#pragma once
Expand Down Expand Up @@ -99,6 +99,16 @@ enum class capture_groups : uint32_t {
NON_CAPTURE ///< Convert all capture groups to non-capture groups
};

/**
* @brief Fast-path classification for literal-only patterns
*/
enum class literal_fast_path : int8_t {
NONE, ///< pattern is not eligible for any literal fast-path
LITERAL_ONLY, ///< pattern is a simple character sequence (literal)
STARTS_WITH, ///< pattern is a literal preceded by a begin-of-line anchor
ENDS_WITH ///< pattern is a literal followed by an end-of-line anchor
};

/** @} */ // end of doxygen group
} // namespace strings
} // namespace CUDF_EXPORT cudf
7 changes: 7 additions & 0 deletions cpp/include/cudf/strings/regex/regex_program.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,13 @@ struct regex_program {
*/
[[nodiscard]] std::size_t compute_working_memory_size(int32_t num_strings) const;

/**
* @brief Returns literal string if specific fast-path is possible
*
* @return Which fast-path is available and the associate literal string
*/
[[nodiscard]] std::pair<literal_fast_path, std::string> get_literal_fast_path() const;

private:
std::string _pattern;
regex_flags _flags;
Expand Down
40 changes: 38 additions & 2 deletions cpp/src/strings/contains.cu
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: Copyright (c) 2019-2025, NVIDIA CORPORATION.
* SPDX-FileCopyrightText: Copyright (c) 2019-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
* SPDX-License-Identifier: Apache-2.0
*/

Expand All @@ -13,7 +13,9 @@
#include <cudf/detail/null_mask.hpp>
#include <cudf/detail/nvtx/ranges.hpp>
#include <cudf/strings/contains.hpp>
#include <cudf/strings/detail/find.hpp>
#include <cudf/strings/detail/utilities.hpp>
#include <cudf/strings/regex/regex_program.hpp>
#include <cudf/strings/string_view.cuh>
#include <cudf/utilities/default_stream.hpp>
#include <cudf/utilities/memory_resource.hpp>
Expand Down Expand Up @@ -80,6 +82,27 @@ std::unique_ptr<column> contains_re(strings_column_view const& input,
rmm::cuda_stream_view stream,
rmm::device_async_resource_ref mr)
{
// check for potential fast-paths
auto [fp, literal] = prog.get_literal_fast_path();
switch (fp) {
case literal_fast_path::LITERAL_ONLY: {
auto const target =
cudf::string_scalar(literal, true, stream, cudf::get_current_device_resource_ref());
return contains(input, target, stream, mr);
}
case literal_fast_path::STARTS_WITH: {
auto const target =
cudf::string_scalar(literal, true, stream, cudf::get_current_device_resource_ref());
return starts_with(input, target, stream, mr);
}
case literal_fast_path::ENDS_WITH: {
auto const target =
cudf::string_scalar(literal, true, stream, cudf::get_current_device_resource_ref());
return ends_with(input, target, stream, mr);
}
default: break;
}

return contains_impl(input, prog, false, stream, mr);
}

Expand All @@ -88,6 +111,13 @@ std::unique_ptr<column> matches_re(strings_column_view const& input,
rmm::cuda_stream_view stream,
rmm::device_async_resource_ref mr)
{
auto [fp, literal] = prog.get_literal_fast_path();
if (fp == literal_fast_path::LITERAL_ONLY or fp == literal_fast_path::STARTS_WITH) {
auto const target =
cudf::string_scalar(literal, true, stream, cudf::get_current_device_resource_ref());
return starts_with(input, target, stream, mr);
}

return contains_impl(input, prog, true, stream, mr);
}

Expand All @@ -96,7 +126,13 @@ std::unique_ptr<column> count_re(strings_column_view const& input,
rmm::cuda_stream_view stream,
rmm::device_async_resource_ref mr)
{
// create device object from regex_program
auto [fp, literal] = prog.get_literal_fast_path();
if (fp == literal_fast_path::LITERAL_ONLY) {
auto const target =
cudf::string_scalar(literal, true, stream, cudf::get_current_device_resource_ref());
return count(input, target, stream, mr);
}

auto d_prog = regex_device_builder::create_prog_device(prog, stream);

auto const d_strings = column_device_view::create(input.parent(), stream);
Expand Down
52 changes: 52 additions & 0 deletions cpp/src/strings/regex/regcomp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1220,6 +1220,50 @@ void reprog::check_for_errors()
}
}

std::pair<literal_fast_path, std::string> reprog::check_for_literal_fast_path() const
{
if (_flags != regex_flags::DEFAULT) { return {literal_fast_path::NONE, {}}; }
if (_startinst_ids.size() > 2) { return {literal_fast_path::NONE, {}}; }
auto const count = static_cast<size_type>(_insts.size());
if (count < 2) { return {literal_fast_path::NONE, {}}; }

auto inst = _insts[_startinst_id];

// Optional BOL at the start of the pattern
bool const has_bol = (inst.type == BOL);
if (has_bol) {
auto const id = inst.u2.next_id;
if (id < 0 || id >= count) { return {literal_fast_path::NONE, {}}; }
inst = _insts[id];
}

// Accumulate sequential CHAR bytes
std::string literal;
while (inst.type == CHAR && inst.u1.c != 0) {
std::array<char, 5> utf8 = {};
utf8[from_char_utf8(inst.u1.c, utf8.data())] = 0;
literal += utf8.data();
auto const id = inst.u2.next_id;
if (id < 0 || id >= count) { return {literal_fast_path::NONE, {}}; }
inst = _insts[id];
}
if (literal.empty()) { return {literal_fast_path::NONE, {}}; }

// If we are at END then we are literal-only or starts-with.
if (inst.type == END) {
return {has_bol ? literal_fast_path::STARTS_WITH : literal_fast_path::LITERAL_ONLY,
std::move(literal)};
}
// Final check for ends-with: EOL followed by END
if (!has_bol && inst.type == EOL && inst.u1.c == 'Z') {
auto const id = inst.u2.next_id;
if (id >= 0 && id < count && _insts[id].type == END) {
return {literal_fast_path::ENDS_WITH, std::move(literal)};
}
}
return {literal_fast_path::NONE, {}};
}

match_flags reprog::compute_match_flags() const
{
static std::unordered_set<int> const non_consuming_inst_types{
Expand Down Expand Up @@ -1346,6 +1390,14 @@ void reprog::print() const
printf("\n");
}
if (_num_capturing_groups) { printf("Number of capturing groups: %d\n", _num_capturing_groups); }

auto [fp, literal] = check_for_literal_fast_path();
switch (fp) {
case literal_fast_path::LITERAL_ONLY: printf("literal-only: %s\n", literal.c_str()); break;
case literal_fast_path::STARTS_WITH: printf("starts-with: %s\n", literal.c_str()); break;
case literal_fast_path::ENDS_WITH: printf("ends-with: %s\n", literal.c_str()); break;
default: break;
}
}
#endif

Expand Down
3 changes: 2 additions & 1 deletion cpp/src/strings/regex/regcomp.h
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,7 @@ class reprog {
void finalize();
void check_for_errors();

[[nodiscard]] std::pair<literal_fast_path, std::string> check_for_literal_fast_path() const;
[[nodiscard]] match_flags compute_match_flags() const;

#ifndef NDEBUG
Expand All @@ -147,7 +148,7 @@ class reprog {
int32_t _startinst_id{}; // id of first instruction
std::vector<int32_t> _startinst_ids; // short-cut to speed-up ORs
int32_t _num_capturing_groups{};
[[maybe_unused]] regex_flags _flags{};
regex_flags _flags{};

reprog(regex_flags);
void collapse_nops();
Expand Down
7 changes: 6 additions & 1 deletion cpp/src/strings/regex/regex_program.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: Copyright (c) 2022-2025, NVIDIA CORPORATION.
* SPDX-FileCopyrightText: Copyright (c) 2022-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
* SPDX-License-Identifier: Apache-2.0
*/

Expand Down Expand Up @@ -48,5 +48,10 @@ std::size_t regex_program::compute_working_memory_size(int32_t num_strings) cons
return detail::compute_working_memory_size(num_strings, instructions_count());
}

std::pair<literal_fast_path, std::string> regex_program::get_literal_fast_path() const
{
return _impl->prog.check_for_literal_fast_path();
}

} // namespace strings
} // namespace cudf
18 changes: 12 additions & 6 deletions cpp/src/strings/replace/replace_re.cu
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: Copyright (c) 2019-2025, NVIDIA CORPORATION.
* SPDX-FileCopyrightText: Copyright (c) 2019-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
* SPDX-License-Identifier: Apache-2.0
*/

Expand All @@ -11,6 +11,7 @@
#include <cudf/column/column_factories.hpp>
#include <cudf/detail/null_mask.hpp>
#include <cudf/detail/nvtx/ranges.hpp>
#include <cudf/strings/detail/replace.hpp>
#include <cudf/strings/detail/utilities.cuh>
#include <cudf/strings/replace_re.hpp>
#include <cudf/strings/string_view.cuh>
Expand Down Expand Up @@ -95,16 +96,21 @@ std::unique_ptr<column> replace_re(strings_column_view const& input,
rmm::cuda_stream_view stream,
rmm::device_async_resource_ref mr)
{
if (input.is_empty()) return make_empty_column(type_id::STRING);
if (input.is_empty()) { return make_empty_column(type_id::STRING); }

CUDF_EXPECTS(replacement.is_valid(stream), "Parameter replacement must be valid");
string_view d_repl(replacement.data(), replacement.size());

// create device object from regex_program
auto d_prog = regex_device_builder::create_prog_device(prog, stream);

auto const maxrepl = max_replace_count.value_or(-1);

auto [fp, literal] = prog.get_literal_fast_path();
if (fp == literal_fast_path::LITERAL_ONLY) {
auto const target =
cudf::string_scalar(literal, true, stream, cudf::get_current_device_resource_ref());
return replace(input, target, replacement, maxrepl, stream, mr);
}

auto const d_repl = string_view(replacement.data(), replacement.size());
auto const d_prog = regex_device_builder::create_prog_device(prog, stream);
auto const d_strings = column_device_view::create(input.parent(), stream);

auto [offsets_column, chars] = make_strings_children(
Expand Down
2 changes: 1 addition & 1 deletion cpp/src/strings/search/count.cu
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include <cudf/column/column_factories.hpp>
#include <cudf/detail/null_mask.hpp>
#include <cudf/detail/nvtx/ranges.hpp>
#include <cudf/strings/detail/find.hpp>
#include <cudf/strings/find.hpp>
#include <cudf/strings/string_view.cuh>
#include <cudf/strings/strings_column_view.hpp>
Expand Down Expand Up @@ -79,7 +80,6 @@ std::unique_ptr<column> count(strings_column_view const& input,

return results;
}

} // namespace detail

// external APIs
Expand Down
30 changes: 28 additions & 2 deletions cpp/tests/strings/contains_tests.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: Copyright (c) 2019-2026, NVIDIA CORPORATION.
* SPDX-FileCopyrightText: Copyright (c) 2019-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
* SPDX-License-Identifier: Apache-2.0
*/

Expand Down Expand Up @@ -373,7 +373,7 @@ TEST_F(StringsContainsTests, Errors)
TEST_F(StringsContainsTests, CountTest)
{
std::vector<char const*> h_strings{
"The quick brown @fox jumps ovér the", "lazy @dog", "1:2:3:4", "00:0:00", nullptr, ""};
"The quick brown @fox jumps ovér the", "lazy @dog lazy", "1:2:3:4", "00:0:00", nullptr, ""};
cudf::test::strings_column_wrapper strings(
h_strings.begin(), h_strings.end(), cudf::test::iterators::nulls_from_nullptrs(h_strings));

Expand Down Expand Up @@ -402,6 +402,22 @@ TEST_F(StringsContainsTests, CountTest)
auto results = cudf::strings::count_re(strings_view, *prog);
CUDF_TEST_EXPECT_COLUMNS_EQUAL(*results, expected);
}
{
auto pattern = std::string("o");
cudf::test::fixed_width_column_wrapper<int32_t> expected(
{3, 1, 0, 0, 0, 0}, cudf::test::iterators::nulls_from_nullptrs(h_strings));
auto prog = cudf::strings::regex_program::create(pattern);
auto results = cudf::strings::count_re(strings_view, *prog);
CUDF_TEST_EXPECT_COLUMNS_EQUAL(*results, expected);
}
{
auto pattern = std::string("\\blazy\\b");
cudf::test::fixed_width_column_wrapper<int32_t> expected(
{0, 2, 0, 0, 0, 0}, cudf::test::iterators::nulls_from_nullptrs(h_strings));
auto prog = cudf::strings::regex_program::create(pattern);
auto results = cudf::strings::count_re(strings_view, *prog);
CUDF_TEST_EXPECT_COLUMNS_EQUAL(*results, expected);
}
}

TEST_F(StringsContainsTests, CountEmptyMatching)
Expand Down Expand Up @@ -787,6 +803,16 @@ TEST_F(StringsContainsTests, EndOfString)
CUDF_TEST_EXPECT_COLUMNS_EQUIVALENT(*results, expected_count);
results = cudf::strings::count_re(view, *prog_ml);
CUDF_TEST_EXPECT_COLUMNS_EQUIVALENT(*results, expected_count);

pattern = std::string("abé$");
prog = cudf::strings::regex_program::create(pattern);
expected = cudf::test::fixed_width_column_wrapper<bool>({1, 0, 1, 0, 1, 1});
results = cudf::strings::contains_re(view, *prog);
CUDF_TEST_EXPECT_COLUMNS_EQUIVALENT(*results, expected);
prog_ml = cudf::strings::regex_program::create(pattern, cudf::strings::regex_flags::MULTILINE);
expected = cudf::test::fixed_width_column_wrapper<bool>({1, 1, 1, 0, 1, 1});
results = cudf::strings::contains_re(view, *prog_ml);
CUDF_TEST_EXPECT_COLUMNS_EQUIVALENT(*results, expected);
Comment thread
coderabbitai[bot] marked this conversation as resolved.
}

TEST_F(StringsContainsTests, DotAll)
Expand Down
Loading