Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
4c4fd0c
Implement benchmarks and tests for SearchSorted functionality
Alex-PLACET Apr 2, 2026
bb6bfec
Refactor vector_search_sorted kernel to use ArrayData and add benchma…
Alex-PLACET Apr 2, 2026
6eacd47
Enhance documentation for search_sorted kernel with detailed implemen…
Alex-PLACET Apr 2, 2026
cc3844a
Refactor vector_search_sorted kernel to improve null handling and uti…
Alex-PLACET Apr 3, 2026
a1f83b6
Refactor search_sorted kernel: improve error messages and add compreh…
Alex-PLACET Apr 7, 2026
e155e49
Formatting
Alex-PLACET Apr 8, 2026
001e5e7
Refactor vector_search_sorted kernel: enhance readability and add noe…
Alex-PLACET Apr 8, 2026
e0a2536
Refactor search_sorted documentation: adjust indentation for clarity
Alex-PLACET Apr 8, 2026
7c54d61
Implement chunked array support in search_sorted: enhance validation …
Alex-PLACET Apr 22, 2026
1293759
Refactor CheckSimpleScalarSearchSorted: support multiple needles and …
Alex-PLACET Apr 22, 2026
3c9372e
Add tests for chunked run-end encoded values and needles in SearchSorted
Alex-PLACET Apr 22, 2026
3d0b0b5
formatting
Alex-PLACET Apr 23, 2026
9b000cd
Refactor search_sorted: extract null counting logic into reusable fun…
Alex-PLACET Apr 23, 2026
b5fe986
Formatting
Alex-PLACET Apr 23, 2026
e82738f
Fix benchmark
Alex-PLACET Apr 24, 2026
0c78052
Refactor SearchSorted tests: consolidate assertions into reusable Che…
Alex-PLACET Apr 24, 2026
57d509f
Refactor SearchSorted tests: rename and enhance scalar search functio…
Alex-PLACET Apr 24, 2026
1c20ad8
Update SearchSorted tests: modify input values and needles for consis…
Alex-PLACET Apr 24, 2026
adff29c
Add tests for sliced ChunkedRunEndEncodedValues and handle all-null c…
Alex-PLACET Apr 24, 2026
d1e502a
Add FindNonNullValuesRange method annotation and new test for Chunked…
Alex-PLACET Apr 24, 2026
e76b5bd
Remove redundant check for RUN_END_ENCODED type in ReadChunkValue method
Alex-PLACET Apr 24, 2026
5435f01
Add chunked array support for search sorted operations and enhance te…
Alex-PLACET Apr 27, 2026
370510d
Formatting
Alex-PLACET Apr 27, 2026
454afea
Add support for run-end encoded needles in search sorted operations
Alex-PLACET Apr 27, 2026
519fb25
Refactor search sorted output handling to use InsertionIndexBuilder f…
Alex-PLACET May 4, 2026
6c46db5
Enhance search sorted functionality by adding tests for sliced run-en…
Alex-PLACET May 4, 2026
fbe4deb
Fix
Alex-PLACET May 7, 2026
632e079
Refactor search sorted to dispatch on physical types
Alex-PLACET Jun 5, 2026
eea8db3
fix
Alex-PLACET Jun 5, 2026
dedffb9
Reject interspersed nulls in search_sorted values
Alex-PLACET Jun 10, 2026
a49a373
fix casting
Alex-PLACET Jun 15, 2026
caf67aa
formatting
Alex-PLACET Jun 15, 2026
4f3acb3
Add documentation and address comments
Alex-PLACET Jun 29, 2026
be117d6
wip
Alex-PLACET Jun 29, 2026
4901c49
fix conversion
Alex-PLACET Jun 30, 2026
d2ed7e6
formatting
Alex-PLACET Jul 1, 2026
4932f16
Use ChunkedArray::ComputeLogicalNullCount
Alex-PLACET Jul 3, 2026
802cbd4
fix search_sorted: handle chunked needles at top-level
Alex-PLACET Jul 3, 2026
62eecdc
wip 0
Alex-PLACET Jul 3, 2026
f56c61f
wip 1
Alex-PLACET Jul 3, 2026
eb2460d
reduce code duplication
Alex-PLACET Jul 7, 2026
e0deca6
formatting
Alex-PLACET Jul 9, 2026
e66c9f9
remove deprecated test
Alex-PLACET Jul 9, 2026
d846392
handle chunked REE with trailing nulls across empty chunks
Alex-PLACET Jul 23, 2026
a097b3b
revert testing submodule
Alex-PLACET Jul 23, 2026
1f08221
Fix ToPhysicalData for run-end encoded arrays and update tests
Alex-PLACET Jul 29, 2026
72576b0
fix compilation
Alex-PLACET Jul 30, 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
1 change: 1 addition & 0 deletions cpp/src/arrow/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -857,6 +857,7 @@ if(ARROW_COMPUTE)
compute/kernels/vector_rank.cc
compute/kernels/vector_replace.cc
compute/kernels/vector_run_end_encode.cc
compute/kernels/vector_search_sorted.cc
compute/kernels/vector_select_k.cc
compute/kernels/vector_sort.cc
compute/kernels/vector_statistics.cc
Expand Down
30 changes: 29 additions & 1 deletion cpp/src/arrow/compute/api_vector.cc
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ using compute::FilterOptions;
using compute::NullPlacement;
using compute::RankOptions;
using compute::RankQuantileOptions;
using compute::SearchSortedOptions;

template <>
struct EnumTraits<FilterOptions::NullSelectionBehavior>
Expand Down Expand Up @@ -82,6 +83,22 @@ struct EnumTraits<DictionaryEncodeOptions::NullEncodingBehavior>
return "<INVALID>";
}
};

template <>
struct EnumTraits<SearchSortedOptions::Side>
: BasicEnumTraits<SearchSortedOptions::Side, SearchSortedOptions::Left,
SearchSortedOptions::Right> {
static std::string name() { return "SearchSortedOptions::Side"; }
static std::string value_name(SearchSortedOptions::Side value) {
switch (value) {
case SearchSortedOptions::Left:
return "Left";
case SearchSortedOptions::Right:
return "Right";
}
return "<INVALID>";
}
};
template <>
struct EnumTraits<RankOptions::Tiebreaker>
: BasicEnumTraits<RankOptions::Tiebreaker, RankOptions::Min, RankOptions::Max,
Expand Down Expand Up @@ -125,6 +142,8 @@ static auto kRunEndEncodeOptionsType = GetFunctionOptionsType<RunEndEncodeOption
static auto kArraySortOptionsType = GetFunctionOptionsType<ArraySortOptions>(
DataMember("order", &ArraySortOptions::order),
DataMember("null_placement", &ArraySortOptions::null_placement));
static auto kSearchSortedOptionsType = GetFunctionOptionsType<SearchSortedOptions>(
DataMember("side", &SearchSortedOptions::side));
static auto kSortOptionsType = GetFunctionOptionsType<SortOptions>(
CoercedDataMember("sort_keys", &SortOptions::sort_keys, &SortOptions::GetSortKeys));
static auto kPartitionNthOptionsType = GetFunctionOptionsType<PartitionNthOptions>(
Expand Down Expand Up @@ -182,12 +201,15 @@ ArraySortOptions::ArraySortOptions(SortOrder order, NullPlacement null_placement
null_placement(null_placement) {}
constexpr char ArraySortOptions::kTypeName[];

SearchSortedOptions::SearchSortedOptions(SearchSortedOptions::Side side)
: FunctionOptions(internal::kSearchSortedOptionsType), side(side) {}
constexpr char SearchSortedOptions::kTypeName[];

ARROW_SUPPRESS_DEPRECATION_WARNING
SortOptions::SortOptions(std::vector<SortKey> sort_keys)
: FunctionOptions(internal::kSortOptionsType),
sort_keys(std::move(sort_keys)),
null_placement(std::nullopt) {}

SortOptions::SortOptions(std::vector<SortKey> sort_keys,
std::optional<NullPlacement> null_placement)
: FunctionOptions(internal::kSortOptionsType),
Expand Down Expand Up @@ -277,6 +299,7 @@ void RegisterVectorOptions(FunctionRegistry* registry) {
DCHECK_OK(registry->AddFunctionOptionsType(kDictionaryEncodeOptionsType));
DCHECK_OK(registry->AddFunctionOptionsType(kRunEndEncodeOptionsType));
DCHECK_OK(registry->AddFunctionOptionsType(kArraySortOptionsType));
DCHECK_OK(registry->AddFunctionOptionsType(kSearchSortedOptionsType));
DCHECK_OK(registry->AddFunctionOptionsType(kSortOptionsType));
DCHECK_OK(registry->AddFunctionOptionsType(kPartitionNthOptionsType));
DCHECK_OK(registry->AddFunctionOptionsType(kSelectKOptionsType));
Expand Down Expand Up @@ -318,6 +341,11 @@ Result<std::shared_ptr<Array>> SelectKUnstable(const Datum& datum,
return result.make_array();
}

Result<Datum> SearchSorted(const Datum& values, const Datum& needles,
const SearchSortedOptions& options, ExecContext* ctx) {
return CallFunction("search_sorted", {values, needles}, &options, ctx);
}

Result<Datum> ReplaceWithMask(const Datum& values, const Datum& mask,
const Datum& replacements, ExecContext* ctx) {
return CallFunction("replace_with_mask", {values, mask, replacements}, ctx);
Expand Down
38 changes: 38 additions & 0 deletions cpp/src/arrow/compute/api_vector.h
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,21 @@ class ARROW_EXPORT ArraySortOptions : public FunctionOptions {
NullPlacement null_placement;
};

class ARROW_EXPORT SearchSortedOptions : public FunctionOptions {
public:
enum Side {
Left,
Right,
};

explicit SearchSortedOptions(Side side = Side::Left);
static constexpr const char kTypeName[] = "SearchSortedOptions";
static SearchSortedOptions Defaults() { return SearchSortedOptions(); }

/// Whether to return the leftmost or rightmost insertion point.
Side side;
};

class ARROW_EXPORT SortOptions : public FunctionOptions {
public:
explicit SortOptions(std::vector<SortKey> sort_keys = {});
Expand Down Expand Up @@ -598,6 +613,29 @@ Result<std::shared_ptr<Array>> SelectKUnstable(const Datum& datum,
const SelectKOptions& options,
ExecContext* ctx = NULLPTR);

/// \brief Find insertion indices that preserve sorted order.
///
/// The `values` datum must be a plain array, chunked array, or run-end encoded
/// array (including chunked run-end encoded) sorted in ascending order.
/// `needles` may be a scalar, plain array, chunked array, or run-end encoded
/// array (including chunked run-end encoded) whose logical value type matches
/// `values`.
///
/// Nulls in `values` are supported when clustered entirely at the start or the
/// end of the sorted array. Non-null needles are matched only against the
/// non-null portion of `values`. Null needles yield null outputs.
///
/// \param[in] values sorted array to search within
/// \param[in] needles scalar or array-like values to search for
/// \param[in] options selects left or right insertion semantics
/// \param[in] ctx the function execution context, optional
/// \return insertion indices as uint64 scalar or array
ARROW_EXPORT
Result<Datum> SearchSorted(
const Datum& values, const Datum& needles,
const SearchSortedOptions& options = SearchSortedOptions::Defaults(),
ExecContext* ctx = NULLPTR);

/// \brief Return the indices that would sort an array.
///
/// Perform an indirect sort of array. The output array will contain
Expand Down
1 change: 1 addition & 0 deletions cpp/src/arrow/compute/initialize.cc
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ Status RegisterComputeKernels() {
internal::RegisterVectorNested(registry);
internal::RegisterVectorRank(registry);
internal::RegisterVectorReplace(registry);
internal::RegisterVectorSearchSorted(registry);
internal::RegisterVectorSelectK(registry);
internal::RegisterVectorSort(registry);
internal::RegisterVectorRunEndEncode(registry);
Expand Down
8 changes: 8 additions & 0 deletions cpp/src/arrow/compute/kernels/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,13 @@ add_arrow_compute_test(vector_sort_test
arrow_compute_kernels_testing
arrow_compute_testing)

add_arrow_compute_test(vector_search_sorted_test
SOURCES
vector_search_sorted_test.cc
EXTRA_LINK_LIBS
arrow_compute_kernels_testing
arrow_compute_testing)

add_arrow_compute_test(vector_selection_test
SOURCES
vector_selection_test.cc
Expand All @@ -141,6 +148,7 @@ add_arrow_compute_benchmark(vector_sort_benchmark)
add_arrow_compute_benchmark(vector_partition_benchmark)
add_arrow_compute_benchmark(vector_topk_benchmark)
add_arrow_compute_benchmark(vector_replace_benchmark)
add_arrow_compute_benchmark(vector_search_sorted_benchmark)
add_arrow_compute_benchmark(vector_selection_benchmark)

# ----------------------------------------------------------------------
Expand Down
1 change: 1 addition & 0 deletions cpp/src/arrow/compute/kernels/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,7 @@ vector_kernel_benchmarks = [
'vector_partition_benchmark',
'vector_topk_benchmark',
'vector_replace_benchmark',
'vector_search_sorted_benchmark',
'vector_selection_benchmark',
]

Expand Down
Loading
Loading