ARROW-4810: [Format][C++] Add "LargeList" type with 64-bit offsets - #3848

Closed
pcmoritz wants to merge 1 commit into
apache:masterfrom
pcmoritz:large-list-array
Closed

ARROW-4810: [Format][C++] Add "LargeList" type with 64-bit offsets#3848
pcmoritz wants to merge 1 commit into
apache:masterfrom
pcmoritz:large-list-array

Conversation

@pcmoritz

Copy link
Copy Markdown
Contributor

No description provided.

Comment threadformat/Schema.fbs Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I think this might be backwards incompatible, because the type is encoded with an enum which is just an integer (https://google.github.io/flatbuffers/md__schemas.html), you probably need to put this at the end.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

thanks, fixed!

Comment threadformat/Schema.fbs Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Please document that this is type optional for implementations (unless we can get consensus on the mailing list if we want it to be globally supported)

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

good point, I fixed it!

@pcmoritz

Copy link
Copy Markdown
ContributorAuthor

This is ready to review in case there is more feedback!

@emkornfieldemkornfield left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

There was a comment on the jira asking for both c++ and Java implementations before adding a type to schema.fbs might want to discuss this on the mailing list (sorry if I missed the Java side)

@pcmoritz

Copy link
Copy Markdown
ContributorAuthor

Thanks for pointing me to that. Yeah, there is currently no Java implementation for this I'm afraid (and I don't know the Java codebase well enough to implement it). If anybody has time to do it that would be great!

@emkornfield

Copy link
Copy Markdown
Contributor

If someone else doesn't speak up I can put it on my to do list, behind getting my currently open PRs checked in (unless this is blocking something, in which case I can reprioritize)

@pcmoritz

Copy link
Copy Markdown
ContributorAuthor

Thanks, that would be amazing! I'm not really blocked and will just squash this PR for now and keep working on top of it.

Let me know if I can help you with your currently open PRs!

@emkornfield

Copy link
Copy Markdown
Contributor

Actually, if you want to trade #3644 is missing the C++ side of the implementation if you can pick that up, I can prioritize the work on the java side for this. For now I will just clone this PR and start working on top of it, but if there is a good way to collaborate (on a different PR a using branches was mentioned, I don't know the exact mechanics) let me know.

@wesm

wesm commented Mar 11, 2019

Copy link
Copy Markdown
Member

I have funding if you know any Java contractors who might be interested in doing work-for-hire on this project to help with work beyond what the handful of us volunteers are able to do

@maartenbreddels

Copy link
Copy Markdown
Contributor

I started working together with an 'ex'-JVM contractor today actally, maybe we can help out here.

@emkornfield

Copy link
Copy Markdown
Contributor

@maartenbreddels@pcmoritz I'm going to pick up the java side of things (unless you've already started). My aim is to have a PR out sometime towards the end of the week.

@emkornfield

emkornfield commented Mar 13, 2019

Copy link
Copy Markdown
Contributor

A proof of concept java version (see caveats in commit message): 03956ca@pcmoritz let me know if you want to try to write the integration tests or can I can try to do it later in the week. Also if someone can point me to java benchmarks (and any other tests that should be run), so I can try to assess regressions and upstream API breakages I would appreciate it.

@maartenbreddels

Copy link
Copy Markdown
Contributor

My aim is to have a PR out sometime towards the end of the week.

👍

@pcmoritz

pcmoritz commented Mar 14, 2019

Copy link
Copy Markdown
ContributorAuthor

@emkornfield Thanks, this is great! I got started on the C++ side of DurationInterval and plan to have something by the end of the week. Unfortunately I can't commit to more at the moment :(

@emkornfield

emkornfield commented Mar 14, 2019

Copy link
Copy Markdown
Contributor

Actually if you want to share what you have I wouldn't mind doing it myself for durationinterval I want to get more familiar with the code. I think we should discuss use cases for LargeList on the ML since I think it is limited by other parts of the arrow spec but I might be misunderstanding something

@pcmoritz

pcmoritz commented Mar 14, 2019

Copy link
Copy Markdown
ContributorAuthor

I haven't gotten too far yet: master...pcmoritz:interval-cpp

Most of the code will be pretty similar to this PR (in terms of what needs to be added, etc) :)

Feel free to continue/make your own branch!

@emkornfield

Copy link
Copy Markdown
Contributor

Thanks. Also I commented on the JIRA, but my confusion over utility was based on the memory layout document to indicates arrays should still only be 32-bit but Message.fbs was updated quite a while ago to indicate 64-bit offsets.

Comment threadformat/Schema.fbs

// List with 64-bit offsets. This type is optional and currently
// only supported by the C++ implementation.
table LargeList {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

@fsaintjacques had a suggestion which I liked and I think is worth discussing to parameterize List instead of creating a new type. I know @wesm suggested he prefers this as a separate type like you have here, but I'm not sure what the rationale is.

@pitroupitrou 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.

On the principle this must be validated through the ML discussion. But here are some comments on the implementation.

Comment threadcpp/src/arrow/type.h
LIST,

/// A list of some logical data type, using 64-bit offsets
LARGE_LIST,

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.

Putting this before the end of the enum will break the ABI. I'm not sure we care. @xhochy Comments ?

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.

We sadly break the ABI quite a lot, I've given up a bit on keeping it stable. I'll look into this in 3-6 months again.

Comment threadcpp/src/arrow/type.h

std::string ToString() const override;

std::string name() const override { return "large_list"; }

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.

Or perhaps "list64".

Comment threadcpp/src/arrow/type.h
///
/// List data is nested data where each value is a variable number of
/// child items. Lists can be recursively nested, for example
/// list(list(int32)).

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.

"large_list(large_list(int32))".

Status Visit(const BinaryArray& array) override { return VisitBinary(array); }

Status Visit(const ListArray& array) override {
template <typename ListArrayType, typename OffsetType>

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.

Perhaps the offset type should be available as ListType::offset_type and LargeListType::offset_type.

template <typename T>
inline typename std::enable_if<std::is_base_of<ListArray, T>::value, Status>::type
inline typename std::enable_if<std::is_base_of<ListArray, T>::value ||
std::is_base_of<LargeListArray, T>::value,

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.

Perhaps a BaseListArray base class would be useful (and perhaps also a BaseListType).
Also enable_if_list<T> in type_traits.h may deserve updating.

ASSERT_EQ("counts", type.value_field()->name());
}

TEST_F(TestLargeListArray, TestBuilderPreserveFieleName) {

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.

Do we really want to copy/paste all ListArray tests instead of using some kind of parametrization?

/// represent multiple different logical types. If no logical type is provided
/// at construction time, the class defaults to List<T> where t is taken from the
/// value_builder/values that the object is constructed with.
class ARROW_EXPORT LargeListBuilder : public ArrayBuilder {

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.

Instead of copy/pasting the ListBuilder implementation, how about factoring it into a templated base class that both concrete implementations can inherit from?

@emkornfield

Copy link
Copy Markdown
Contributor

@pcmoritz were you going to take this up again?

@kszucs
kszucsforce-pushed the master branch 2 times, most recently from ed180da to 85fe336CompareJuly 22, 2019 19:29
@pitrou

Copy link
Copy Markdown
Member

Recommending to close this in favour of #4969

@emkornfield

Copy link
Copy Markdown
Contributor

Closing in favor of #4969 which is merged

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@pcmoritz@emkornfield@wesm@maartenbreddels@pitrou@xhochy
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

ARROW-4810: [Format][C++] Add "LargeList" type with 64-bit offsets - #3848

Closed
pcmoritz wants to merge 1 commit into
apache:masterfrom
pcmoritz:large-list-array
Closed

ARROW-4810: [Format][C++] Add "LargeList" type with 64-bit offsets#3848
pcmoritz wants to merge 1 commit into
apache:masterfrom
pcmoritz:large-list-array

Conversation

@pcmoritz

Copy link
Copy Markdown
Contributor

No description provided.

Comment threadformat/Schema.fbs Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I think this might be backwards incompatible, because the type is encoded with an enum which is just an integer (https://google.github.io/flatbuffers/md__schemas.html), you probably need to put this at the end.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

thanks, fixed!

Comment threadformat/Schema.fbs Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Please document that this is type optional for implementations (unless we can get consensus on the mailing list if we want it to be globally supported)

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

good point, I fixed it!

@pcmoritz

Copy link
Copy Markdown
ContributorAuthor

This is ready to review in case there is more feedback!

@emkornfieldemkornfield left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

There was a comment on the jira asking for both c++ and Java implementations before adding a type to schema.fbs might want to discuss this on the mailing list (sorry if I missed the Java side)

@pcmoritz

Copy link
Copy Markdown
ContributorAuthor

Thanks for pointing me to that. Yeah, there is currently no Java implementation for this I'm afraid (and I don't know the Java codebase well enough to implement it). If anybody has time to do it that would be great!

@emkornfield

Copy link
Copy Markdown
Contributor

If someone else doesn't speak up I can put it on my to do list, behind getting my currently open PRs checked in (unless this is blocking something, in which case I can reprioritize)

@pcmoritz

Copy link
Copy Markdown
ContributorAuthor

Thanks, that would be amazing! I'm not really blocked and will just squash this PR for now and keep working on top of it.

Let me know if I can help you with your currently open PRs!

@emkornfield

Copy link
Copy Markdown
Contributor

Actually, if you want to trade #3644 is missing the C++ side of the implementation if you can pick that up, I can prioritize the work on the java side for this. For now I will just clone this PR and start working on top of it, but if there is a good way to collaborate (on a different PR a using branches was mentioned, I don't know the exact mechanics) let me know.

@wesm

wesm commented Mar 11, 2019

Copy link
Copy Markdown
Member

I have funding if you know any Java contractors who might be interested in doing work-for-hire on this project to help with work beyond what the handful of us volunteers are able to do

@maartenbreddels

Copy link
Copy Markdown
Contributor

I started working together with an 'ex'-JVM contractor today actally, maybe we can help out here.

@emkornfield

Copy link
Copy Markdown
Contributor

@maartenbreddels@pcmoritz I'm going to pick up the java side of things (unless you've already started). My aim is to have a PR out sometime towards the end of the week.

@emkornfield

emkornfield commented Mar 13, 2019

Copy link
Copy Markdown
Contributor

A proof of concept java version (see caveats in commit message): 03956ca@pcmoritz let me know if you want to try to write the integration tests or can I can try to do it later in the week. Also if someone can point me to java benchmarks (and any other tests that should be run), so I can try to assess regressions and upstream API breakages I would appreciate it.

@maartenbreddels

Copy link
Copy Markdown
Contributor

My aim is to have a PR out sometime towards the end of the week.

👍

@pcmoritz

pcmoritz commented Mar 14, 2019

Copy link
Copy Markdown
ContributorAuthor

@emkornfield Thanks, this is great! I got started on the C++ side of DurationInterval and plan to have something by the end of the week. Unfortunately I can't commit to more at the moment :(

@emkornfield

emkornfield commented Mar 14, 2019

Copy link
Copy Markdown
Contributor

Actually if you want to share what you have I wouldn't mind doing it myself for durationinterval I want to get more familiar with the code. I think we should discuss use cases for LargeList on the ML since I think it is limited by other parts of the arrow spec but I might be misunderstanding something

@pcmoritz

pcmoritz commented Mar 14, 2019

Copy link
Copy Markdown
ContributorAuthor

I haven't gotten too far yet: master...pcmoritz:interval-cpp

Most of the code will be pretty similar to this PR (in terms of what needs to be added, etc) :)

Feel free to continue/make your own branch!

@emkornfield

Copy link
Copy Markdown
Contributor

Thanks. Also I commented on the JIRA, but my confusion over utility was based on the memory layout document to indicates arrays should still only be 32-bit but Message.fbs was updated quite a while ago to indicate 64-bit offsets.

Comment threadformat/Schema.fbs

// List with 64-bit offsets. This type is optional and currently
// only supported by the C++ implementation.
table LargeList {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

@fsaintjacques had a suggestion which I liked and I think is worth discussing to parameterize List instead of creating a new type. I know @wesm suggested he prefers this as a separate type like you have here, but I'm not sure what the rationale is.

@pitroupitrou 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.

On the principle this must be validated through the ML discussion. But here are some comments on the implementation.

Comment threadcpp/src/arrow/type.h
LIST,

/// A list of some logical data type, using 64-bit offsets
LARGE_LIST,

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.

Putting this before the end of the enum will break the ABI. I'm not sure we care. @xhochy Comments ?

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.

We sadly break the ABI quite a lot, I've given up a bit on keeping it stable. I'll look into this in 3-6 months again.

Comment threadcpp/src/arrow/type.h

std::string ToString() const override;

std::string name() const override { return "large_list"; }

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.

Or perhaps "list64".

Comment threadcpp/src/arrow/type.h
///
/// List data is nested data where each value is a variable number of
/// child items. Lists can be recursively nested, for example
/// list(list(int32)).

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.

"large_list(large_list(int32))".

Status Visit(const BinaryArray& array) override { return VisitBinary(array); }

Status Visit(const ListArray& array) override {
template <typename ListArrayType, typename OffsetType>

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.

Perhaps the offset type should be available as ListType::offset_type and LargeListType::offset_type.

template <typename T>
inline typename std::enable_if<std::is_base_of<ListArray, T>::value, Status>::type
inline typename std::enable_if<std::is_base_of<ListArray, T>::value ||
std::is_base_of<LargeListArray, T>::value,

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.

Perhaps a BaseListArray base class would be useful (and perhaps also a BaseListType).
Also enable_if_list<T> in type_traits.h may deserve updating.

ASSERT_EQ("counts", type.value_field()->name());
}

TEST_F(TestLargeListArray, TestBuilderPreserveFieleName) {

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.

Do we really want to copy/paste all ListArray tests instead of using some kind of parametrization?

/// represent multiple different logical types. If no logical type is provided
/// at construction time, the class defaults to List<T> where t is taken from the
/// value_builder/values that the object is constructed with.
class ARROW_EXPORT LargeListBuilder : public ArrayBuilder {

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.

Instead of copy/pasting the ListBuilder implementation, how about factoring it into a templated base class that both concrete implementations can inherit from?

@emkornfield

Copy link
Copy Markdown
Contributor

@pcmoritz were you going to take this up again?

@kszucs
kszucsforce-pushed the master branch 2 times, most recently from ed180da to 85fe336CompareJuly 22, 2019 19:29
@pitrou

Copy link
Copy Markdown
Member

Recommending to close this in favour of #4969

@emkornfield

Copy link
Copy Markdown
Contributor

Closing in favor of #4969 which is merged

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@pcmoritz@emkornfield@wesm@maartenbreddels@pitrou@xhochy
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

ARROW-4810: [Format][C++] Add "LargeList" type with 64-bit offsets - #3848

Closed
pcmoritz wants to merge 1 commit into
apache:masterfrom
pcmoritz:large-list-array
Closed

ARROW-4810: [Format][C++] Add "LargeList" type with 64-bit offsets#3848
pcmoritz wants to merge 1 commit into
apache:masterfrom
pcmoritz:large-list-array

Conversation

@pcmoritz

Copy link
Copy Markdown
Contributor

No description provided.

Comment threadformat/Schema.fbs Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I think this might be backwards incompatible, because the type is encoded with an enum which is just an integer (https://google.github.io/flatbuffers/md__schemas.html), you probably need to put this at the end.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

thanks, fixed!

Comment threadformat/Schema.fbs Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Please document that this is type optional for implementations (unless we can get consensus on the mailing list if we want it to be globally supported)

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

good point, I fixed it!

@pcmoritz

Copy link
Copy Markdown
ContributorAuthor

This is ready to review in case there is more feedback!

@emkornfieldemkornfield left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

There was a comment on the jira asking for both c++ and Java implementations before adding a type to schema.fbs might want to discuss this on the mailing list (sorry if I missed the Java side)

@pcmoritz

Copy link
Copy Markdown
ContributorAuthor

Thanks for pointing me to that. Yeah, there is currently no Java implementation for this I'm afraid (and I don't know the Java codebase well enough to implement it). If anybody has time to do it that would be great!

@emkornfield

Copy link
Copy Markdown
Contributor

If someone else doesn't speak up I can put it on my to do list, behind getting my currently open PRs checked in (unless this is blocking something, in which case I can reprioritize)

@pcmoritz

Copy link
Copy Markdown
ContributorAuthor

Thanks, that would be amazing! I'm not really blocked and will just squash this PR for now and keep working on top of it.

Let me know if I can help you with your currently open PRs!

@emkornfield

Copy link
Copy Markdown
Contributor

Actually, if you want to trade #3644 is missing the C++ side of the implementation if you can pick that up, I can prioritize the work on the java side for this. For now I will just clone this PR and start working on top of it, but if there is a good way to collaborate (on a different PR a using branches was mentioned, I don't know the exact mechanics) let me know.

@wesm

wesm commented Mar 11, 2019

Copy link
Copy Markdown
Member

I have funding if you know any Java contractors who might be interested in doing work-for-hire on this project to help with work beyond what the handful of us volunteers are able to do

@maartenbreddels

Copy link
Copy Markdown
Contributor

I started working together with an 'ex'-JVM contractor today actally, maybe we can help out here.

@emkornfield

Copy link
Copy Markdown
Contributor

@maartenbreddels@pcmoritz I'm going to pick up the java side of things (unless you've already started). My aim is to have a PR out sometime towards the end of the week.

@emkornfield

emkornfield commented Mar 13, 2019

Copy link
Copy Markdown
Contributor

A proof of concept java version (see caveats in commit message): 03956ca@pcmoritz let me know if you want to try to write the integration tests or can I can try to do it later in the week. Also if someone can point me to java benchmarks (and any other tests that should be run), so I can try to assess regressions and upstream API breakages I would appreciate it.

@maartenbreddels

Copy link
Copy Markdown
Contributor

My aim is to have a PR out sometime towards the end of the week.

👍

@pcmoritz

pcmoritz commented Mar 14, 2019

Copy link
Copy Markdown
ContributorAuthor

@emkornfield Thanks, this is great! I got started on the C++ side of DurationInterval and plan to have something by the end of the week. Unfortunately I can't commit to more at the moment :(

@emkornfield

emkornfield commented Mar 14, 2019

Copy link
Copy Markdown
Contributor

Actually if you want to share what you have I wouldn't mind doing it myself for durationinterval I want to get more familiar with the code. I think we should discuss use cases for LargeList on the ML since I think it is limited by other parts of the arrow spec but I might be misunderstanding something

@pcmoritz

pcmoritz commented Mar 14, 2019

Copy link
Copy Markdown
ContributorAuthor

I haven't gotten too far yet: master...pcmoritz:interval-cpp

Most of the code will be pretty similar to this PR (in terms of what needs to be added, etc) :)

Feel free to continue/make your own branch!

@emkornfield

Copy link
Copy Markdown
Contributor

Thanks. Also I commented on the JIRA, but my confusion over utility was based on the memory layout document to indicates arrays should still only be 32-bit but Message.fbs was updated quite a while ago to indicate 64-bit offsets.

Comment threadformat/Schema.fbs

// List with 64-bit offsets. This type is optional and currently
// only supported by the C++ implementation.
table LargeList {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

@fsaintjacques had a suggestion which I liked and I think is worth discussing to parameterize List instead of creating a new type. I know @wesm suggested he prefers this as a separate type like you have here, but I'm not sure what the rationale is.

@pitroupitrou 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.

On the principle this must be validated through the ML discussion. But here are some comments on the implementation.

Comment threadcpp/src/arrow/type.h
LIST,

/// A list of some logical data type, using 64-bit offsets
LARGE_LIST,

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.

Putting this before the end of the enum will break the ABI. I'm not sure we care. @xhochy Comments ?

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.

We sadly break the ABI quite a lot, I've given up a bit on keeping it stable. I'll look into this in 3-6 months again.

Comment threadcpp/src/arrow/type.h

std::string ToString() const override;

std::string name() const override { return "large_list"; }

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.

Or perhaps "list64".

Comment threadcpp/src/arrow/type.h
///
/// List data is nested data where each value is a variable number of
/// child items. Lists can be recursively nested, for example
/// list(list(int32)).

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.

"large_list(large_list(int32))".

Status Visit(const BinaryArray& array) override { return VisitBinary(array); }

Status Visit(const ListArray& array) override {
template <typename ListArrayType, typename OffsetType>

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.

Perhaps the offset type should be available as ListType::offset_type and LargeListType::offset_type.

template <typename T>
inline typename std::enable_if<std::is_base_of<ListArray, T>::value, Status>::type
inline typename std::enable_if<std::is_base_of<ListArray, T>::value ||
std::is_base_of<LargeListArray, T>::value,

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.

Perhaps a BaseListArray base class would be useful (and perhaps also a BaseListType).
Also enable_if_list<T> in type_traits.h may deserve updating.

ASSERT_EQ("counts", type.value_field()->name());
}

TEST_F(TestLargeListArray, TestBuilderPreserveFieleName) {

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.

Do we really want to copy/paste all ListArray tests instead of using some kind of parametrization?

/// represent multiple different logical types. If no logical type is provided
/// at construction time, the class defaults to List<T> where t is taken from the
/// value_builder/values that the object is constructed with.
class ARROW_EXPORT LargeListBuilder : public ArrayBuilder {

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.

Instead of copy/pasting the ListBuilder implementation, how about factoring it into a templated base class that both concrete implementations can inherit from?

@emkornfield

Copy link
Copy Markdown
Contributor

@pcmoritz were you going to take this up again?

@kszucs
kszucsforce-pushed the master branch 2 times, most recently from ed180da to 85fe336CompareJuly 22, 2019 19:29
@pitrou

Copy link
Copy Markdown
Member

Recommending to close this in favour of #4969

@emkornfield

Copy link
Copy Markdown
Contributor

Closing in favor of #4969 which is merged

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@pcmoritz@emkornfield@wesm@maartenbreddels@pitrou@xhochy
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

ARROW-4810: [Format][C++] Add "LargeList" type with 64-bit offsets - #3848

Closed
pcmoritz wants to merge 1 commit into
apache:masterfrom
pcmoritz:large-list-array
Closed

ARROW-4810: [Format][C++] Add "LargeList" type with 64-bit offsets#3848
pcmoritz wants to merge 1 commit into
apache:masterfrom
pcmoritz:large-list-array

Conversation

@pcmoritz

Copy link
Copy Markdown
Contributor

No description provided.

Comment threadformat/Schema.fbs Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I think this might be backwards incompatible, because the type is encoded with an enum which is just an integer (https://google.github.io/flatbuffers/md__schemas.html), you probably need to put this at the end.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

thanks, fixed!

Comment threadformat/Schema.fbs Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Please document that this is type optional for implementations (unless we can get consensus on the mailing list if we want it to be globally supported)

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

good point, I fixed it!

@pcmoritz

Copy link
Copy Markdown
ContributorAuthor

This is ready to review in case there is more feedback!

@emkornfieldemkornfield left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

There was a comment on the jira asking for both c++ and Java implementations before adding a type to schema.fbs might want to discuss this on the mailing list (sorry if I missed the Java side)

@pcmoritz

Copy link
Copy Markdown
ContributorAuthor

Thanks for pointing me to that. Yeah, there is currently no Java implementation for this I'm afraid (and I don't know the Java codebase well enough to implement it). If anybody has time to do it that would be great!

@emkornfield

Copy link
Copy Markdown
Contributor

If someone else doesn't speak up I can put it on my to do list, behind getting my currently open PRs checked in (unless this is blocking something, in which case I can reprioritize)

@pcmoritz

Copy link
Copy Markdown
ContributorAuthor

Thanks, that would be amazing! I'm not really blocked and will just squash this PR for now and keep working on top of it.

Let me know if I can help you with your currently open PRs!

@emkornfield

Copy link
Copy Markdown
Contributor

Actually, if you want to trade #3644 is missing the C++ side of the implementation if you can pick that up, I can prioritize the work on the java side for this. For now I will just clone this PR and start working on top of it, but if there is a good way to collaborate (on a different PR a using branches was mentioned, I don't know the exact mechanics) let me know.

@wesm

wesm commented Mar 11, 2019

Copy link
Copy Markdown
Member

I have funding if you know any Java contractors who might be interested in doing work-for-hire on this project to help with work beyond what the handful of us volunteers are able to do

@maartenbreddels

Copy link
Copy Markdown
Contributor

I started working together with an 'ex'-JVM contractor today actally, maybe we can help out here.

@emkornfield

Copy link
Copy Markdown
Contributor

@maartenbreddels@pcmoritz I'm going to pick up the java side of things (unless you've already started). My aim is to have a PR out sometime towards the end of the week.

@emkornfield

emkornfield commented Mar 13, 2019

Copy link
Copy Markdown
Contributor

A proof of concept java version (see caveats in commit message): 03956ca@pcmoritz let me know if you want to try to write the integration tests or can I can try to do it later in the week. Also if someone can point me to java benchmarks (and any other tests that should be run), so I can try to assess regressions and upstream API breakages I would appreciate it.

@maartenbreddels

Copy link
Copy Markdown
Contributor

My aim is to have a PR out sometime towards the end of the week.

👍

@pcmoritz

pcmoritz commented Mar 14, 2019

Copy link
Copy Markdown
ContributorAuthor

@emkornfield Thanks, this is great! I got started on the C++ side of DurationInterval and plan to have something by the end of the week. Unfortunately I can't commit to more at the moment :(

@emkornfield

emkornfield commented Mar 14, 2019

Copy link
Copy Markdown
Contributor

Actually if you want to share what you have I wouldn't mind doing it myself for durationinterval I want to get more familiar with the code. I think we should discuss use cases for LargeList on the ML since I think it is limited by other parts of the arrow spec but I might be misunderstanding something

@pcmoritz

pcmoritz commented Mar 14, 2019

Copy link
Copy Markdown
ContributorAuthor

I haven't gotten too far yet: master...pcmoritz:interval-cpp

Most of the code will be pretty similar to this PR (in terms of what needs to be added, etc) :)

Feel free to continue/make your own branch!

@emkornfield

Copy link
Copy Markdown
Contributor

Thanks. Also I commented on the JIRA, but my confusion over utility was based on the memory layout document to indicates arrays should still only be 32-bit but Message.fbs was updated quite a while ago to indicate 64-bit offsets.

Comment threadformat/Schema.fbs

// List with 64-bit offsets. This type is optional and currently
// only supported by the C++ implementation.
table LargeList {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

@fsaintjacques had a suggestion which I liked and I think is worth discussing to parameterize List instead of creating a new type. I know @wesm suggested he prefers this as a separate type like you have here, but I'm not sure what the rationale is.

@pitroupitrou 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.

On the principle this must be validated through the ML discussion. But here are some comments on the implementation.

Comment threadcpp/src/arrow/type.h
LIST,

/// A list of some logical data type, using 64-bit offsets
LARGE_LIST,

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.

Putting this before the end of the enum will break the ABI. I'm not sure we care. @xhochy Comments ?

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.

We sadly break the ABI quite a lot, I've given up a bit on keeping it stable. I'll look into this in 3-6 months again.

Comment threadcpp/src/arrow/type.h

std::string ToString() const override;

std::string name() const override { return "large_list"; }

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.

Or perhaps "list64".

Comment threadcpp/src/arrow/type.h
///
/// List data is nested data where each value is a variable number of
/// child items. Lists can be recursively nested, for example
/// list(list(int32)).

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.

"large_list(large_list(int32))".

Status Visit(const BinaryArray& array) override { return VisitBinary(array); }

Status Visit(const ListArray& array) override {
template <typename ListArrayType, typename OffsetType>

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.

Perhaps the offset type should be available as ListType::offset_type and LargeListType::offset_type.

template <typename T>
inline typename std::enable_if<std::is_base_of<ListArray, T>::value, Status>::type
inline typename std::enable_if<std::is_base_of<ListArray, T>::value ||
std::is_base_of<LargeListArray, T>::value,

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.

Perhaps a BaseListArray base class would be useful (and perhaps also a BaseListType).
Also enable_if_list<T> in type_traits.h may deserve updating.

ASSERT_EQ("counts", type.value_field()->name());
}

TEST_F(TestLargeListArray, TestBuilderPreserveFieleName) {

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.

Do we really want to copy/paste all ListArray tests instead of using some kind of parametrization?

/// represent multiple different logical types. If no logical type is provided
/// at construction time, the class defaults to List<T> where t is taken from the
/// value_builder/values that the object is constructed with.
class ARROW_EXPORT LargeListBuilder : public ArrayBuilder {

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.

Instead of copy/pasting the ListBuilder implementation, how about factoring it into a templated base class that both concrete implementations can inherit from?

@emkornfield

Copy link
Copy Markdown
Contributor

@pcmoritz were you going to take this up again?

@kszucs
kszucsforce-pushed the master branch 2 times, most recently from ed180da to 85fe336CompareJuly 22, 2019 19:29
@pitrou

Copy link
Copy Markdown
Member

Recommending to close this in favour of #4969

@emkornfield

Copy link
Copy Markdown
Contributor

Closing in favor of #4969 which is merged

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@pcmoritz@emkornfield@wesm@maartenbreddels@pitrou@xhochy
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

ARROW-4810: [Format][C++] Add "LargeList" type with 64-bit offsets - #3848

Closed
pcmoritz wants to merge 1 commit into
apache:masterfrom
pcmoritz:large-list-array
Closed

ARROW-4810: [Format][C++] Add "LargeList" type with 64-bit offsets#3848
pcmoritz wants to merge 1 commit into
apache:masterfrom
pcmoritz:large-list-array

Conversation

@pcmoritz

Copy link
Copy Markdown
Contributor

No description provided.

Comment threadformat/Schema.fbs Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I think this might be backwards incompatible, because the type is encoded with an enum which is just an integer (https://google.github.io/flatbuffers/md__schemas.html), you probably need to put this at the end.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

thanks, fixed!

Comment threadformat/Schema.fbs Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Please document that this is type optional for implementations (unless we can get consensus on the mailing list if we want it to be globally supported)

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

good point, I fixed it!

@pcmoritz

Copy link
Copy Markdown
ContributorAuthor

This is ready to review in case there is more feedback!

@emkornfieldemkornfield left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

There was a comment on the jira asking for both c++ and Java implementations before adding a type to schema.fbs might want to discuss this on the mailing list (sorry if I missed the Java side)

@pcmoritz

Copy link
Copy Markdown
ContributorAuthor

Thanks for pointing me to that. Yeah, there is currently no Java implementation for this I'm afraid (and I don't know the Java codebase well enough to implement it). If anybody has time to do it that would be great!

@emkornfield

Copy link
Copy Markdown
Contributor

If someone else doesn't speak up I can put it on my to do list, behind getting my currently open PRs checked in (unless this is blocking something, in which case I can reprioritize)

@pcmoritz

Copy link
Copy Markdown
ContributorAuthor

Thanks, that would be amazing! I'm not really blocked and will just squash this PR for now and keep working on top of it.

Let me know if I can help you with your currently open PRs!

@emkornfield

Copy link
Copy Markdown
Contributor

Actually, if you want to trade #3644 is missing the C++ side of the implementation if you can pick that up, I can prioritize the work on the java side for this. For now I will just clone this PR and start working on top of it, but if there is a good way to collaborate (on a different PR a using branches was mentioned, I don't know the exact mechanics) let me know.

@wesm

wesm commented Mar 11, 2019

Copy link
Copy Markdown
Member

I have funding if you know any Java contractors who might be interested in doing work-for-hire on this project to help with work beyond what the handful of us volunteers are able to do

@maartenbreddels

Copy link
Copy Markdown
Contributor

I started working together with an 'ex'-JVM contractor today actally, maybe we can help out here.

@emkornfield

Copy link
Copy Markdown
Contributor

@maartenbreddels@pcmoritz I'm going to pick up the java side of things (unless you've already started). My aim is to have a PR out sometime towards the end of the week.

@emkornfield

emkornfield commented Mar 13, 2019

Copy link
Copy Markdown
Contributor

A proof of concept java version (see caveats in commit message): 03956ca@pcmoritz let me know if you want to try to write the integration tests or can I can try to do it later in the week. Also if someone can point me to java benchmarks (and any other tests that should be run), so I can try to assess regressions and upstream API breakages I would appreciate it.

@maartenbreddels

Copy link
Copy Markdown
Contributor

My aim is to have a PR out sometime towards the end of the week.

👍

@pcmoritz

pcmoritz commented Mar 14, 2019

Copy link
Copy Markdown
ContributorAuthor

@emkornfield Thanks, this is great! I got started on the C++ side of DurationInterval and plan to have something by the end of the week. Unfortunately I can't commit to more at the moment :(

@emkornfield

emkornfield commented Mar 14, 2019

Copy link
Copy Markdown
Contributor

Actually if you want to share what you have I wouldn't mind doing it myself for durationinterval I want to get more familiar with the code. I think we should discuss use cases for LargeList on the ML since I think it is limited by other parts of the arrow spec but I might be misunderstanding something

@pcmoritz

pcmoritz commented Mar 14, 2019

Copy link
Copy Markdown
ContributorAuthor

I haven't gotten too far yet: master...pcmoritz:interval-cpp

Most of the code will be pretty similar to this PR (in terms of what needs to be added, etc) :)

Feel free to continue/make your own branch!

@emkornfield

Copy link
Copy Markdown
Contributor

Thanks. Also I commented on the JIRA, but my confusion over utility was based on the memory layout document to indicates arrays should still only be 32-bit but Message.fbs was updated quite a while ago to indicate 64-bit offsets.

Comment threadformat/Schema.fbs

// List with 64-bit offsets. This type is optional and currently
// only supported by the C++ implementation.
table LargeList {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

@fsaintjacques had a suggestion which I liked and I think is worth discussing to parameterize List instead of creating a new type. I know @wesm suggested he prefers this as a separate type like you have here, but I'm not sure what the rationale is.

@pitroupitrou 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.

On the principle this must be validated through the ML discussion. But here are some comments on the implementation.

Comment threadcpp/src/arrow/type.h
LIST,

/// A list of some logical data type, using 64-bit offsets
LARGE_LIST,

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.

Putting this before the end of the enum will break the ABI. I'm not sure we care. @xhochy Comments ?

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.

We sadly break the ABI quite a lot, I've given up a bit on keeping it stable. I'll look into this in 3-6 months again.

Comment threadcpp/src/arrow/type.h

std::string ToString() const override;

std::string name() const override { return "large_list"; }

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.

Or perhaps "list64".

Comment threadcpp/src/arrow/type.h
///
/// List data is nested data where each value is a variable number of
/// child items. Lists can be recursively nested, for example
/// list(list(int32)).

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.

"large_list(large_list(int32))".

Status Visit(const BinaryArray& array) override { return VisitBinary(array); }

Status Visit(const ListArray& array) override {
template <typename ListArrayType, typename OffsetType>

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.

Perhaps the offset type should be available as ListType::offset_type and LargeListType::offset_type.

template <typename T>
inline typename std::enable_if<std::is_base_of<ListArray, T>::value, Status>::type
inline typename std::enable_if<std::is_base_of<ListArray, T>::value ||
std::is_base_of<LargeListArray, T>::value,

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.

Perhaps a BaseListArray base class would be useful (and perhaps also a BaseListType).
Also enable_if_list<T> in type_traits.h may deserve updating.

ASSERT_EQ("counts", type.value_field()->name());
}

TEST_F(TestLargeListArray, TestBuilderPreserveFieleName) {

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.

Do we really want to copy/paste all ListArray tests instead of using some kind of parametrization?

/// represent multiple different logical types. If no logical type is provided
/// at construction time, the class defaults to List<T> where t is taken from the
/// value_builder/values that the object is constructed with.
class ARROW_EXPORT LargeListBuilder : public ArrayBuilder {

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.

Instead of copy/pasting the ListBuilder implementation, how about factoring it into a templated base class that both concrete implementations can inherit from?

@emkornfield

Copy link
Copy Markdown
Contributor

@pcmoritz were you going to take this up again?

@kszucs
kszucsforce-pushed the master branch 2 times, most recently from ed180da to 85fe336CompareJuly 22, 2019 19:29
@pitrou

Copy link
Copy Markdown
Member

Recommending to close this in favour of #4969

@emkornfield

Copy link
Copy Markdown
Contributor

Closing in favor of #4969 which is merged

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@pcmoritz@emkornfield@wesm@maartenbreddels@pitrou@xhochy
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

ARROW-4810: [Format][C++] Add "LargeList" type with 64-bit offsets - #3848

Closed
pcmoritz wants to merge 1 commit into
apache:masterfrom
pcmoritz:large-list-array
Closed

ARROW-4810: [Format][C++] Add "LargeList" type with 64-bit offsets#3848
pcmoritz wants to merge 1 commit into
apache:masterfrom
pcmoritz:large-list-array

Conversation

@pcmoritz

Copy link
Copy Markdown
Contributor

No description provided.

Comment threadformat/Schema.fbs Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I think this might be backwards incompatible, because the type is encoded with an enum which is just an integer (https://google.github.io/flatbuffers/md__schemas.html), you probably need to put this at the end.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

thanks, fixed!

Comment threadformat/Schema.fbs Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Please document that this is type optional for implementations (unless we can get consensus on the mailing list if we want it to be globally supported)

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

good point, I fixed it!

@pcmoritz

Copy link
Copy Markdown
ContributorAuthor

This is ready to review in case there is more feedback!

@emkornfieldemkornfield left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

There was a comment on the jira asking for both c++ and Java implementations before adding a type to schema.fbs might want to discuss this on the mailing list (sorry if I missed the Java side)

@pcmoritz

Copy link
Copy Markdown
ContributorAuthor

Thanks for pointing me to that. Yeah, there is currently no Java implementation for this I'm afraid (and I don't know the Java codebase well enough to implement it). If anybody has time to do it that would be great!

@emkornfield

Copy link
Copy Markdown
Contributor

If someone else doesn't speak up I can put it on my to do list, behind getting my currently open PRs checked in (unless this is blocking something, in which case I can reprioritize)

@pcmoritz

Copy link
Copy Markdown
ContributorAuthor

Thanks, that would be amazing! I'm not really blocked and will just squash this PR for now and keep working on top of it.

Let me know if I can help you with your currently open PRs!

@emkornfield

Copy link
Copy Markdown
Contributor

Actually, if you want to trade #3644 is missing the C++ side of the implementation if you can pick that up, I can prioritize the work on the java side for this. For now I will just clone this PR and start working on top of it, but if there is a good way to collaborate (on a different PR a using branches was mentioned, I don't know the exact mechanics) let me know.

@wesm

wesm commented Mar 11, 2019

Copy link
Copy Markdown
Member

I have funding if you know any Java contractors who might be interested in doing work-for-hire on this project to help with work beyond what the handful of us volunteers are able to do

@maartenbreddels

Copy link
Copy Markdown
Contributor

I started working together with an 'ex'-JVM contractor today actally, maybe we can help out here.

@emkornfield

Copy link
Copy Markdown
Contributor

@maartenbreddels@pcmoritz I'm going to pick up the java side of things (unless you've already started). My aim is to have a PR out sometime towards the end of the week.

@emkornfield

emkornfield commented Mar 13, 2019

Copy link
Copy Markdown
Contributor

A proof of concept java version (see caveats in commit message): 03956ca@pcmoritz let me know if you want to try to write the integration tests or can I can try to do it later in the week. Also if someone can point me to java benchmarks (and any other tests that should be run), so I can try to assess regressions and upstream API breakages I would appreciate it.

@maartenbreddels

Copy link
Copy Markdown
Contributor

My aim is to have a PR out sometime towards the end of the week.

👍

@pcmoritz

pcmoritz commented Mar 14, 2019

Copy link
Copy Markdown
ContributorAuthor

@emkornfield Thanks, this is great! I got started on the C++ side of DurationInterval and plan to have something by the end of the week. Unfortunately I can't commit to more at the moment :(

@emkornfield

emkornfield commented Mar 14, 2019

Copy link
Copy Markdown
Contributor

Actually if you want to share what you have I wouldn't mind doing it myself for durationinterval I want to get more familiar with the code. I think we should discuss use cases for LargeList on the ML since I think it is limited by other parts of the arrow spec but I might be misunderstanding something

@pcmoritz

pcmoritz commented Mar 14, 2019

Copy link
Copy Markdown
ContributorAuthor

I haven't gotten too far yet: master...pcmoritz:interval-cpp

Most of the code will be pretty similar to this PR (in terms of what needs to be added, etc) :)

Feel free to continue/make your own branch!

@emkornfield

Copy link
Copy Markdown
Contributor

Thanks. Also I commented on the JIRA, but my confusion over utility was based on the memory layout document to indicates arrays should still only be 32-bit but Message.fbs was updated quite a while ago to indicate 64-bit offsets.

Comment threadformat/Schema.fbs

// List with 64-bit offsets. This type is optional and currently
// only supported by the C++ implementation.
table LargeList {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

@fsaintjacques had a suggestion which I liked and I think is worth discussing to parameterize List instead of creating a new type. I know @wesm suggested he prefers this as a separate type like you have here, but I'm not sure what the rationale is.

@pitroupitrou 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.

On the principle this must be validated through the ML discussion. But here are some comments on the implementation.

Comment threadcpp/src/arrow/type.h
LIST,

/// A list of some logical data type, using 64-bit offsets
LARGE_LIST,

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.

Putting this before the end of the enum will break the ABI. I'm not sure we care. @xhochy Comments ?

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.

We sadly break the ABI quite a lot, I've given up a bit on keeping it stable. I'll look into this in 3-6 months again.

Comment threadcpp/src/arrow/type.h

std::string ToString() const override;

std::string name() const override { return "large_list"; }

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.

Or perhaps "list64".

Comment threadcpp/src/arrow/type.h
///
/// List data is nested data where each value is a variable number of
/// child items. Lists can be recursively nested, for example
/// list(list(int32)).

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.

"large_list(large_list(int32))".

Status Visit(const BinaryArray& array) override { return VisitBinary(array); }

Status Visit(const ListArray& array) override {
template <typename ListArrayType, typename OffsetType>

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.

Perhaps the offset type should be available as ListType::offset_type and LargeListType::offset_type.

template <typename T>
inline typename std::enable_if<std::is_base_of<ListArray, T>::value, Status>::type
inline typename std::enable_if<std::is_base_of<ListArray, T>::value ||
std::is_base_of<LargeListArray, T>::value,

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.

Perhaps a BaseListArray base class would be useful (and perhaps also a BaseListType).
Also enable_if_list<T> in type_traits.h may deserve updating.

ASSERT_EQ("counts", type.value_field()->name());
}

TEST_F(TestLargeListArray, TestBuilderPreserveFieleName) {

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.

Do we really want to copy/paste all ListArray tests instead of using some kind of parametrization?

/// represent multiple different logical types. If no logical type is provided
/// at construction time, the class defaults to List<T> where t is taken from the
/// value_builder/values that the object is constructed with.
class ARROW_EXPORT LargeListBuilder : public ArrayBuilder {

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.

Instead of copy/pasting the ListBuilder implementation, how about factoring it into a templated base class that both concrete implementations can inherit from?

@emkornfield

Copy link
Copy Markdown
Contributor

@pcmoritz were you going to take this up again?

@kszucs
kszucsforce-pushed the master branch 2 times, most recently from ed180da to 85fe336CompareJuly 22, 2019 19:29
@pitrou

Copy link
Copy Markdown
Member

Recommending to close this in favour of #4969

@emkornfield

Copy link
Copy Markdown
Contributor

Closing in favor of #4969 which is merged

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@pcmoritz@emkornfield@wesm@maartenbreddels@pitrou@xhochy
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

ARROW-4810: [Format][C++] Add "LargeList" type with 64-bit offsets - #3848

Closed
pcmoritz wants to merge 1 commit into
apache:masterfrom
pcmoritz:large-list-array
Closed

ARROW-4810: [Format][C++] Add "LargeList" type with 64-bit offsets#3848
pcmoritz wants to merge 1 commit into
apache:masterfrom
pcmoritz:large-list-array

Conversation

@pcmoritz

Copy link
Copy Markdown
Contributor

No description provided.

Comment threadformat/Schema.fbs Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I think this might be backwards incompatible, because the type is encoded with an enum which is just an integer (https://google.github.io/flatbuffers/md__schemas.html), you probably need to put this at the end.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

thanks, fixed!

Comment threadformat/Schema.fbs Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Please document that this is type optional for implementations (unless we can get consensus on the mailing list if we want it to be globally supported)

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

good point, I fixed it!

@pcmoritz

Copy link
Copy Markdown
ContributorAuthor

This is ready to review in case there is more feedback!

@emkornfieldemkornfield left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

There was a comment on the jira asking for both c++ and Java implementations before adding a type to schema.fbs might want to discuss this on the mailing list (sorry if I missed the Java side)

@pcmoritz

Copy link
Copy Markdown
ContributorAuthor

Thanks for pointing me to that. Yeah, there is currently no Java implementation for this I'm afraid (and I don't know the Java codebase well enough to implement it). If anybody has time to do it that would be great!

@emkornfield

Copy link
Copy Markdown
Contributor

If someone else doesn't speak up I can put it on my to do list, behind getting my currently open PRs checked in (unless this is blocking something, in which case I can reprioritize)

@pcmoritz

Copy link
Copy Markdown
ContributorAuthor

Thanks, that would be amazing! I'm not really blocked and will just squash this PR for now and keep working on top of it.

Let me know if I can help you with your currently open PRs!

@emkornfield

Copy link
Copy Markdown
Contributor

Actually, if you want to trade #3644 is missing the C++ side of the implementation if you can pick that up, I can prioritize the work on the java side for this. For now I will just clone this PR and start working on top of it, but if there is a good way to collaborate (on a different PR a using branches was mentioned, I don't know the exact mechanics) let me know.

@wesm

wesm commented Mar 11, 2019

Copy link
Copy Markdown
Member

I have funding if you know any Java contractors who might be interested in doing work-for-hire on this project to help with work beyond what the handful of us volunteers are able to do

@maartenbreddels

Copy link
Copy Markdown
Contributor

I started working together with an 'ex'-JVM contractor today actally, maybe we can help out here.

@emkornfield

Copy link
Copy Markdown
Contributor

@maartenbreddels@pcmoritz I'm going to pick up the java side of things (unless you've already started). My aim is to have a PR out sometime towards the end of the week.

@emkornfield

emkornfield commented Mar 13, 2019

Copy link
Copy Markdown
Contributor

A proof of concept java version (see caveats in commit message): 03956ca@pcmoritz let me know if you want to try to write the integration tests or can I can try to do it later in the week. Also if someone can point me to java benchmarks (and any other tests that should be run), so I can try to assess regressions and upstream API breakages I would appreciate it.

@maartenbreddels

Copy link
Copy Markdown
Contributor

My aim is to have a PR out sometime towards the end of the week.

👍

@pcmoritz

pcmoritz commented Mar 14, 2019

Copy link
Copy Markdown
ContributorAuthor

@emkornfield Thanks, this is great! I got started on the C++ side of DurationInterval and plan to have something by the end of the week. Unfortunately I can't commit to more at the moment :(

@emkornfield

emkornfield commented Mar 14, 2019

Copy link
Copy Markdown
Contributor

Actually if you want to share what you have I wouldn't mind doing it myself for durationinterval I want to get more familiar with the code. I think we should discuss use cases for LargeList on the ML since I think it is limited by other parts of the arrow spec but I might be misunderstanding something

@pcmoritz

pcmoritz commented Mar 14, 2019

Copy link
Copy Markdown
ContributorAuthor

I haven't gotten too far yet: master...pcmoritz:interval-cpp

Most of the code will be pretty similar to this PR (in terms of what needs to be added, etc) :)

Feel free to continue/make your own branch!

@emkornfield

Copy link
Copy Markdown
Contributor

Thanks. Also I commented on the JIRA, but my confusion over utility was based on the memory layout document to indicates arrays should still only be 32-bit but Message.fbs was updated quite a while ago to indicate 64-bit offsets.

Comment threadformat/Schema.fbs

// List with 64-bit offsets. This type is optional and currently
// only supported by the C++ implementation.
table LargeList {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

@fsaintjacques had a suggestion which I liked and I think is worth discussing to parameterize List instead of creating a new type. I know @wesm suggested he prefers this as a separate type like you have here, but I'm not sure what the rationale is.

@pitroupitrou 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.

On the principle this must be validated through the ML discussion. But here are some comments on the implementation.

Comment threadcpp/src/arrow/type.h
LIST,

/// A list of some logical data type, using 64-bit offsets
LARGE_LIST,

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.

Putting this before the end of the enum will break the ABI. I'm not sure we care. @xhochy Comments ?

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.

We sadly break the ABI quite a lot, I've given up a bit on keeping it stable. I'll look into this in 3-6 months again.

Comment threadcpp/src/arrow/type.h

std::string ToString() const override;

std::string name() const override { return "large_list"; }

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.

Or perhaps "list64".

Comment threadcpp/src/arrow/type.h
///
/// List data is nested data where each value is a variable number of
/// child items. Lists can be recursively nested, for example
/// list(list(int32)).

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.

"large_list(large_list(int32))".

Status Visit(const BinaryArray& array) override { return VisitBinary(array); }

Status Visit(const ListArray& array) override {
template <typename ListArrayType, typename OffsetType>

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.

Perhaps the offset type should be available as ListType::offset_type and LargeListType::offset_type.

template <typename T>
inline typename std::enable_if<std::is_base_of<ListArray, T>::value, Status>::type
inline typename std::enable_if<std::is_base_of<ListArray, T>::value ||
std::is_base_of<LargeListArray, T>::value,

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.

Perhaps a BaseListArray base class would be useful (and perhaps also a BaseListType).
Also enable_if_list<T> in type_traits.h may deserve updating.

ASSERT_EQ("counts", type.value_field()->name());
}

TEST_F(TestLargeListArray, TestBuilderPreserveFieleName) {

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.

Do we really want to copy/paste all ListArray tests instead of using some kind of parametrization?

/// represent multiple different logical types. If no logical type is provided
/// at construction time, the class defaults to List<T> where t is taken from the
/// value_builder/values that the object is constructed with.
class ARROW_EXPORT LargeListBuilder : public ArrayBuilder {

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.

Instead of copy/pasting the ListBuilder implementation, how about factoring it into a templated base class that both concrete implementations can inherit from?

@emkornfield

Copy link
Copy Markdown
Contributor

@pcmoritz were you going to take this up again?

@kszucs
kszucsforce-pushed the master branch 2 times, most recently from ed180da to 85fe336CompareJuly 22, 2019 19:29
@pitrou

Copy link
Copy Markdown
Member

Recommending to close this in favour of #4969

@emkornfield

Copy link
Copy Markdown
Contributor

Closing in favor of #4969 which is merged

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@pcmoritz@emkornfield@wesm@maartenbreddels@pitrou@xhochy
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

ARROW-4810: [Format][C++] Add "LargeList" type with 64-bit offsets - #3848

Closed
pcmoritz wants to merge 1 commit into
apache:masterfrom
pcmoritz:large-list-array
Closed

ARROW-4810: [Format][C++] Add "LargeList" type with 64-bit offsets#3848
pcmoritz wants to merge 1 commit into
apache:masterfrom
pcmoritz:large-list-array

Conversation

@pcmoritz

Copy link
Copy Markdown
Contributor

No description provided.

Comment threadformat/Schema.fbs Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I think this might be backwards incompatible, because the type is encoded with an enum which is just an integer (https://google.github.io/flatbuffers/md__schemas.html), you probably need to put this at the end.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

thanks, fixed!

Comment threadformat/Schema.fbs Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Please document that this is type optional for implementations (unless we can get consensus on the mailing list if we want it to be globally supported)

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

good point, I fixed it!

@pcmoritz

Copy link
Copy Markdown
ContributorAuthor

This is ready to review in case there is more feedback!

@emkornfieldemkornfield left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

There was a comment on the jira asking for both c++ and Java implementations before adding a type to schema.fbs might want to discuss this on the mailing list (sorry if I missed the Java side)

@pcmoritz

Copy link
Copy Markdown
ContributorAuthor

Thanks for pointing me to that. Yeah, there is currently no Java implementation for this I'm afraid (and I don't know the Java codebase well enough to implement it). If anybody has time to do it that would be great!

@emkornfield

Copy link
Copy Markdown
Contributor

If someone else doesn't speak up I can put it on my to do list, behind getting my currently open PRs checked in (unless this is blocking something, in which case I can reprioritize)

@pcmoritz

Copy link
Copy Markdown
ContributorAuthor

Thanks, that would be amazing! I'm not really blocked and will just squash this PR for now and keep working on top of it.

Let me know if I can help you with your currently open PRs!

@emkornfield

Copy link
Copy Markdown
Contributor

Actually, if you want to trade #3644 is missing the C++ side of the implementation if you can pick that up, I can prioritize the work on the java side for this. For now I will just clone this PR and start working on top of it, but if there is a good way to collaborate (on a different PR a using branches was mentioned, I don't know the exact mechanics) let me know.

@wesm

wesm commented Mar 11, 2019

Copy link
Copy Markdown
Member

I have funding if you know any Java contractors who might be interested in doing work-for-hire on this project to help with work beyond what the handful of us volunteers are able to do

@maartenbreddels

Copy link
Copy Markdown
Contributor

I started working together with an 'ex'-JVM contractor today actally, maybe we can help out here.

@emkornfield

Copy link
Copy Markdown
Contributor

@maartenbreddels@pcmoritz I'm going to pick up the java side of things (unless you've already started). My aim is to have a PR out sometime towards the end of the week.

@emkornfield

emkornfield commented Mar 13, 2019

Copy link
Copy Markdown
Contributor

A proof of concept java version (see caveats in commit message): 03956ca@pcmoritz let me know if you want to try to write the integration tests or can I can try to do it later in the week. Also if someone can point me to java benchmarks (and any other tests that should be run), so I can try to assess regressions and upstream API breakages I would appreciate it.

@maartenbreddels

Copy link
Copy Markdown
Contributor

My aim is to have a PR out sometime towards the end of the week.

👍

@pcmoritz

pcmoritz commented Mar 14, 2019

Copy link
Copy Markdown
ContributorAuthor

@emkornfield Thanks, this is great! I got started on the C++ side of DurationInterval and plan to have something by the end of the week. Unfortunately I can't commit to more at the moment :(

@emkornfield

emkornfield commented Mar 14, 2019

Copy link
Copy Markdown
Contributor

Actually if you want to share what you have I wouldn't mind doing it myself for durationinterval I want to get more familiar with the code. I think we should discuss use cases for LargeList on the ML since I think it is limited by other parts of the arrow spec but I might be misunderstanding something

@pcmoritz

pcmoritz commented Mar 14, 2019

Copy link
Copy Markdown
ContributorAuthor

I haven't gotten too far yet: master...pcmoritz:interval-cpp

Most of the code will be pretty similar to this PR (in terms of what needs to be added, etc) :)

Feel free to continue/make your own branch!

@emkornfield

Copy link
Copy Markdown
Contributor

Thanks. Also I commented on the JIRA, but my confusion over utility was based on the memory layout document to indicates arrays should still only be 32-bit but Message.fbs was updated quite a while ago to indicate 64-bit offsets.

Comment threadformat/Schema.fbs

// List with 64-bit offsets. This type is optional and currently
// only supported by the C++ implementation.
table LargeList {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

@fsaintjacques had a suggestion which I liked and I think is worth discussing to parameterize List instead of creating a new type. I know @wesm suggested he prefers this as a separate type like you have here, but I'm not sure what the rationale is.

@pitroupitrou 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.

On the principle this must be validated through the ML discussion. But here are some comments on the implementation.

Comment threadcpp/src/arrow/type.h
LIST,

/// A list of some logical data type, using 64-bit offsets
LARGE_LIST,

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.

Putting this before the end of the enum will break the ABI. I'm not sure we care. @xhochy Comments ?

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.

We sadly break the ABI quite a lot, I've given up a bit on keeping it stable. I'll look into this in 3-6 months again.

Comment threadcpp/src/arrow/type.h

std::string ToString() const override;

std::string name() const override { return "large_list"; }

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.

Or perhaps "list64".

Comment threadcpp/src/arrow/type.h
///
/// List data is nested data where each value is a variable number of
/// child items. Lists can be recursively nested, for example
/// list(list(int32)).

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.

"large_list(large_list(int32))".

Status Visit(const BinaryArray& array) override { return VisitBinary(array); }

Status Visit(const ListArray& array) override {
template <typename ListArrayType, typename OffsetType>

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.

Perhaps the offset type should be available as ListType::offset_type and LargeListType::offset_type.

template <typename T>
inline typename std::enable_if<std::is_base_of<ListArray, T>::value, Status>::type
inline typename std::enable_if<std::is_base_of<ListArray, T>::value ||
std::is_base_of<LargeListArray, T>::value,

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.

Perhaps a BaseListArray base class would be useful (and perhaps also a BaseListType).
Also enable_if_list<T> in type_traits.h may deserve updating.

ASSERT_EQ("counts", type.value_field()->name());
}

TEST_F(TestLargeListArray, TestBuilderPreserveFieleName) {

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.

Do we really want to copy/paste all ListArray tests instead of using some kind of parametrization?

/// represent multiple different logical types. If no logical type is provided
/// at construction time, the class defaults to List<T> where t is taken from the
/// value_builder/values that the object is constructed with.
class ARROW_EXPORT LargeListBuilder : public ArrayBuilder {

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.

Instead of copy/pasting the ListBuilder implementation, how about factoring it into a templated base class that both concrete implementations can inherit from?

@emkornfield

Copy link
Copy Markdown
Contributor

@pcmoritz were you going to take this up again?

@kszucs
kszucsforce-pushed the master branch 2 times, most recently from ed180da to 85fe336CompareJuly 22, 2019 19:29
@pitrou

Copy link
Copy Markdown
Member

Recommending to close this in favour of #4969

@emkornfield

Copy link
Copy Markdown
Contributor

Closing in favor of #4969 which is merged

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@pcmoritz@emkornfield@wesm@maartenbreddels@pitrou@xhochy