') + ')', '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); } })(); })(); ARROW-14093: [C++] subtract(date, date) -> duration kernel by rok · Pull Request #12124 · apache/arrow · GitHub
Skip to content

ARROW-14093: [C++] subtract(date, date) -> duration kernel - #12124

Closed
rok wants to merge 6 commits into
apache:masterfrom
rok:ARROW-14093
Closed

ARROW-14093: [C++] subtract(date, date) -> duration kernel#12124
rok wants to merge 6 commits into
apache:masterfrom
rok:ARROW-14093

Conversation

@rok

@rokrok commented Jan 11, 2022

Copy link
Copy Markdown
Member

This is to resolve ARROW-14093.

@github-actions

Copy link
Copy Markdown

@github-actions

Copy link
Copy Markdown

⚠️ Ticket has not been started in JIRA, please click 'Start Progress'.

@lidavidm

Copy link
Copy Markdown
Member

The title should be -> duration, not -> interval, right?

Comment threadcpp/src/arrow/compute/kernels/scalar_arithmetic.cc Outdated
@rok

rok commented Jan 12, 2022

Copy link
Copy Markdown
MemberAuthor

The title should be -> duration, not -> interval, right?

I think so. I suppose same goes for most most ARROW-11090 jiras.

@rokrok changed the title ARROW-14093: [C++] subtract(date, date) -> interval kernelARROW-14093: [C++] subtract(date, date) -> duration kernelJan 12, 2022
@rok

rok commented Jan 12, 2022

Copy link
Copy Markdown
MemberAuthor

This now always returns in ms. Do we want to be able to output other units or is it ok to defer to casting kernels if other units are desired?

@lidavidm

Copy link
Copy Markdown
Member

I don't see a problem with ms.

@lidavidm

Copy link
Copy Markdown
Member

Sorry, I've been a bit backlogged, I'll try to get through these tomorrow (Friday)

@rok

rok commented Jan 27, 2022

Copy link
Copy Markdown
MemberAuthor

No worries @lidavidm! :)

Comment threadcpp/src/arrow/compute/kernels/scalar_arithmetic.cc Outdated
Comment threadcpp/src/arrow/compute/kernels/scalar_temporal_test.cc Outdated
@rok
rokforce-pushed the ARROW-14093 branch 3 times, most recently from bb12021 to 970ac73CompareJanuary 31, 2022 21:09
@lidavidm
lidavidm self-requested a review January 31, 2022 22:36

@lidavidmlidavidm left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, just a couple nits.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit, but as used, the units should always match right?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's used to resolve duration resolution in subtract(timestamp, timestamp) -> duration and the timestamps could be of any resolution. Am I missing something?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, I was thinking, since we only register kernels where the units match, technically this max is redundant, but it doesn't hurt to have it. (Though perhaps it would be safer to DCHECK or return an error if they don't match to avoid accidentally doing arithmetic on incompatible types.)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(I think return types are computed post-implicit-casts, right? So they should match here.)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, yes of course! Fixed. Thanks :).

Comment threadcpp/src/arrow/compute/kernels/scalar_arithmetic.cc Outdated
Comment threadcpp/src/arrow/compute/kernels/scalar_arithmetic.cc Outdated
@rok

rok commented Feb 1, 2022

Copy link
Copy Markdown
MemberAuthor

Thanks for the review @lidavidm! I've accidentally amended changes to the last commit, sorry.
I've also refactored some other temporal subtraction tests to avoid duplicating subtract and subtract_checked logic.

@lidavidmlidavidm left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, just some nits/suggestions (sorry for the back-and-forth)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, I was thinking, since we only register kernels where the units match, technically this max is redundant, but it doesn't hurt to have it. (Though perhaps it would be safer to DCHECK or return an error if they don't match to avoid accidentally doing arithmetic on incompatible types.)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(I think return types are computed post-implicit-casts, right? So they should match here.)

const std::vector<ValueDescr>& args) {
auto left_type = checked_cast<const TimestampType*>(args[0].type.get());
auto right_type = checked_cast<const TimestampType*>(args[1].type.get());
DCHECK_EQ(left_type->id(), right_type->id());

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit, but the checked_cast should account for this in debug mode since the dynamic_cast will give us nullptr (or else if we're going to assert, we should assert before casting)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.

Comment on lines +1647 to +1649
RETURN_NOT_OK(
Status::Invalid("Subtraction of zoned and non-zoned times is ambiguous. (",
left_type->timezone(), right_type->timezone(), ")."));

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit, but just return Status::Invalid(...);?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.

@ursabot

ursabot commented Feb 2, 2022

Copy link
Copy Markdown

Benchmark runs are scheduled for baseline = c715beb and contender = 56386a4. 56386a4 is a master commit associated with this PR. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-xlarge-us-east-2
[Finished ⬇️0.36% ⬆️0.0%] ursa-i9-9960x
[Finished ⬇️0.3% ⬆️0.09%] ursa-thinkcentre-m75q
Supported benchmarks:
ec2-t3-xlarge-us-east-2: Supported benchmark langs: Python. Runs only benchmarks with cloud = True
ursa-i9-9960x: Supported benchmark langs: Python, R, JavaScript
ursa-thinkcentre-m75q: Supported benchmark langs: C++, Java

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@rok@lidavidm@ursabot