#pragma once
#include <cudf/join/join.hpp>
#include <cudf/join/hash_join.hpp>
#include <cudf/join/filtered_join.hpp>
#include <cudf/join/mark_join.hpp>
#include <memory>
#include "rust/cxx.h"
#include "table_shim.h"
namespace cudf_shims {
std::unique_ptr<OwnedTable> inner_join(
const OwnedTable& left_keys, const OwnedTable& right_keys);
std::unique_ptr<OwnedTable> left_join(
const OwnedTable& left_keys, const OwnedTable& right_keys);
std::unique_ptr<OwnedTable> full_join(
const OwnedTable& left_keys, const OwnedTable& right_keys);
std::unique_ptr<OwnedTable> cross_join(
const OwnedTable& left, const OwnedTable& right);
std::unique_ptr<OwnedTable> left_semi_join(
const OwnedTable& left_keys, const OwnedTable& right_keys);
std::unique_ptr<OwnedTable> left_anti_join(
const OwnedTable& left_keys, const OwnedTable& right_keys);
std::unique_ptr<OwnedTable> mark_semi_join(
const OwnedTable& left_keys, const OwnedTable& right_keys);
std::unique_ptr<OwnedTable> mark_anti_join(
const OwnedTable& left_keys, const OwnedTable& right_keys);
struct OwnedHashJoin {
std::unique_ptr<cudf::hash_join> inner;
explicit OwnedHashJoin(std::unique_ptr<cudf::hash_join> hj)
: inner(std::move(hj)) {}
};
std::unique_ptr<OwnedHashJoin> hash_join_create(const OwnedTable& build);
std::unique_ptr<OwnedTable> hash_join_inner(
const OwnedHashJoin& hj, const OwnedTable& probe);
std::unique_ptr<OwnedTable> hash_join_left(
const OwnedHashJoin& hj, const OwnedTable& probe);
std::unique_ptr<OwnedTable> hash_join_full(
const OwnedHashJoin& hj, const OwnedTable& probe);
int64_t hash_join_inner_size(const OwnedHashJoin& hj, const OwnedTable& probe);
int64_t hash_join_left_size(const OwnedHashJoin& hj, const OwnedTable& probe);
int64_t hash_join_full_size(const OwnedHashJoin& hj, const OwnedTable& probe);
}