') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); GH-15256: [C++][Dataset] Add support for writing with Partitioning::Default() by kou · Pull Request #33674 · apache/arrow · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
37 changes: 8 additions & 29 deletions c_glib/arrow-dataset-glib/partitioning.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -38,9 +38,6 @@ G_BEGIN_DECLS
* #GADatasetPartitioning is a base class for partitioning classes
* such as #GADatasetDirectoryPartitioning.
*
* #GADatasetDefaultPartitioning is a class for partitioning that
* doesn't partition.
*
* #GADatasetKeyValuePartitioningOptions is a class for key-value
* partitioning options.
*
Expand DownExpand Up@@ -345,35 +342,19 @@ gadataset_partitioning_get_type_name(GADatasetPartitioning *partitioning)
}


G_DEFINE_TYPE(GADatasetDefaultPartitioning,
gadataset_default_partitioning,
GADATASET_TYPE_PARTITIONING)

static void
gadataset_default_partitioning_init(GADatasetDefaultPartitioning *object)
{
}

static void
gadataset_default_partitioning_class_init(
GADatasetDefaultPartitioningClass *klass)
{
}

/**
* gadataset_default_partitioning_new:
* gadataset_partitioning_create_default:
*
* Returns: The newly created #GADatasetDefaultPartitioning that
* doesn't partition.
* Returns: (transfer full): The newly created #GADatasetPartitioning
* that doesn't partition.
*
* Since: 11.0.0
* Since: 12.0.0
*/
GADatasetDefaultPartitioning *
gadataset_default_partitioning_new(void)
GADatasetPartitioning *
gadataset_partitioning_create_default(void)
{
auto arrow_partitioning = arrow::dataset::Partitioning::Default();
return GADATASET_DEFAULT_PARTITIONING(
gadataset_partitioning_new_raw(&arrow_partitioning));
return gadataset_partitioning_new_raw(&arrow_partitioning);
}


Expand DownExpand Up@@ -813,9 +794,7 @@ gadataset_partitioning_new_raw(
{
GType type = GADATASET_TYPE_PARTITIONING;
const auto arrow_type_name = (*arrow_partitioning)->type_name();
if (arrow_type_name == "default") {
type = GADATASET_TYPE_DEFAULT_PARTITIONING;
} else if (arrow_type_name == "directory") {
if (arrow_type_name == "directory") {
type = GADATASET_TYPE_DIRECTORY_PARTITIONING;
} else if (arrow_type_name == "hive") {
type = GADATASET_TYPE_HIVE_PARTITIONING;
Expand Down
18 changes: 3 additions & 15 deletions c_glib/arrow-dataset-glib/partitioning.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -71,21 +71,9 @@ gchar *
gadataset_partitioning_get_type_name(GADatasetPartitioning *partitioning);


#define GADATASET_TYPE_DEFAULT_PARTITIONING \
(gadataset_default_partitioning_get_type())
G_DECLARE_DERIVABLE_TYPE(GADatasetDefaultPartitioning,
gadataset_default_partitioning,
GADATASET,
DEFAULT_PARTITIONING,
GADatasetPartitioning)
struct _GADatasetDefaultPartitioningClass
{
GADatasetPartitioningClass parent_class;
};

GARROW_AVAILABLE_IN_11_0
GADatasetDefaultPartitioning *
gadataset_default_partitioning_new(void);
GARROW_AVAILABLE_IN_12_0
GADatasetPartitioning *
gadataset_partitioning_create_default(void);


#define GADATASET_TYPE_KEY_VALUE_PARTITIONING_OPTIONS \
Expand Down
3 changes: 2 additions & 1 deletion c_glib/test/dataset/test-partitioning.rb
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,7 +23,8 @@ def setup
end

def test_default
assert_equal("default", ArrowDataset::DefaultPartitioning.new.type_name)
assert_equal("directory",
ArrowDataset::Partitioning.create_default.type_name)
end

def test_directory
Expand Down
27 changes: 1 addition & 26 deletions cpp/src/arrow/dataset/partition.cc
Original file line numberDiff line numberDiff line change
Expand Up@@ -75,32 +75,7 @@ std::string StripNonPrefix(const std::string& path) {
} // namespace

std::shared_ptr<Partitioning> Partitioning::Default() {
class DefaultPartitioning : public Partitioning {
public:
DefaultPartitioning() : Partitioning(::arrow::schema({})) {}

std::string type_name() const override { return "default"; }

bool Equals(const Partitioning& other) const override {
return type_name() == other.type_name();
}

Result<compute::Expression> Parse(const std::string& path) const override {
return compute::literal(true);
}

Result<PartitionPathFormat> Format(const compute::Expression& expr) const override {
return Status::NotImplemented("formatting paths from ", type_name(),
" Partitioning");
}

Result<PartitionedBatches> Partition(
const std::shared_ptr<RecordBatch>& batch) const override {
return PartitionedBatches{{batch}, {compute::literal(true)}};
}
};

return std::make_shared<DefaultPartitioning>();
return std::make_shared<DirectoryPartitioning>(arrow::schema({}));
}

static Result<RecordBatchVector> ApplyGroupings(
Expand Down
3 changes: 2 additions & 1 deletion cpp/src/arrow/dataset/partition.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -90,7 +90,8 @@ class ARROW_DS_EXPORT Partitioning : public util::EqualityComparable<Partitionin

virtual Result<PartitionPathFormat> Format(const compute::Expression& expr) const = 0;

/// \brief A default Partitioning which always yields scalar(true)
/// \brief A default Partitioning which is a DirectoryPartitioning
/// with an empty schema.
static std::shared_ptr<Partitioning> Default();

/// \brief The partition schema.
Expand Down
18 changes: 18 additions & 0 deletions cpp/src/arrow/dataset/partition_test.cc
Original file line numberDiff line numberDiff line change
Expand Up@@ -189,6 +189,12 @@ TEST_F(TestPartitioning, Partition) {
expected_expressions);
}

TEST_F(TestPartitioning, DefaultPartitioningIsDirectoryPartitioning) {
auto partitioning = Partitioning::Default();
ASSERT_EQ(partitioning->type_name(), "directory");
AssertSchemaEqual(partitioning->schema(), schema({}));
}

Comment thread
westonpace marked this conversation as resolved.
Outdated
TEST_F(TestPartitioning, DirectoryPartitioning) {
partitioning_ = std::make_shared<DirectoryPartitioning>(
schema({field("alpha", int32()), field("beta", utf8())}));
Expand All@@ -209,6 +215,18 @@ TEST_F(TestPartitioning, DirectoryPartitioning) {
equal(field_ref("beta"), literal("foo"))));
}

TEST_F(TestPartitioning, DirectoryPartitioningEmpty) {
partitioning_ = std::make_shared<DirectoryPartitioning>(schema({}));
written_schema_ = partitioning_->schema();

// No partitioning info
AssertParse("", literal(true));
// Files can be in subdirectories
AssertParse("/foo/", literal(true));
// Partitioning info is discarded on write
AssertFormat(equal(field_ref("alpha"), literal(7)), "");
}

TEST_F(TestPartitioning, DirectoryPartitioningEquals) {
auto part = std::make_shared<DirectoryPartitioning>(
schema({field("alpha", int32()), field("beta", utf8())}));
Expand Down
4 changes: 2 additions & 2 deletions python/pyarrow/tests/test_dataset.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -3640,12 +3640,12 @@ def test_dataset_preserved_partitioning(tempdir):
# through discovery, but without partitioning
_, path = _create_single_file(tempdir)
dataset = ds.dataset(path)
assert dataset.partitioning is None
assert isinstance(dataset.partitioning, ds.DirectoryPartitioning)

# through discovery, with hive partitioning but not specified
full_table, path = _create_partitioned_dataset(tempdir)
dataset = ds.dataset(path)
assert dataset.partitioning is None
assert isinstance(dataset.partitioning, ds.DirectoryPartitioning)

# through discovery, with hive partitioning (from a partitioning factory)
dataset = ds.dataset(path, partitioning="hive")
Expand Down