You are viewing a plain text version of this content. The canonical link for it is here.
Posted to github@arrow.apache.org by "zanmato1984 (via GitHub)" <gi...@apache.org> on 2023/12/18 06:46:31 UTC
[PR] GH-33962: [C++] [Python] Add temporal component extraction kernels for duration types [arrow]
zanmato1984 opened a new pull request, #39267:
URL: https://github.com/apache/arrow/pull/39267
<!--
Thanks for opening a pull request!
If this is your first pull request you can find detailed information on how
to contribute here:
* [New Contributor's Guide](https://arrow.apache.org/docs/dev/developers/guide/step_by_step/pr_lifecycle.html#reviews-and-merge-of-the-pull-request)
* [Contributing Overview](https://arrow.apache.org/docs/dev/developers/overview.html)
If this is not a [minor PR](https://github.com/apache/arrow/blob/main/CONTRIBUTING.md#Minor-Fixes). Could you open an issue for this pull request on GitHub? https://github.com/apache/arrow/issues/new/choose
Opening GitHub issues ahead of time contributes to the [Openness](http://theapacheway.com/open/#:~:text=Openness%20allows%20new%20users%20the,must%20happen%20in%20the%20open.) of the Apache Arrow project.
Then could you also rename the pull request title in the following format?
GH-${GITHUB_ISSUE_ID}: [${COMPONENT}] ${SUMMARY}
or
MINOR: [${COMPONENT}] ${SUMMARY}
In the case of PARQUET issues on JIRA the title also supports:
PARQUET-${JIRA_ISSUE_ID}: [${COMPONENT}] ${SUMMARY}
-->
### Rationale for this change
<!--
Why are you proposing this change? If this is already explained clearly in the issue then this section is not needed.
Explaining clearly why changes are proposed helps reviewers understand your changes and offer better suggestions for fixes.
-->
### What changes are included in this PR?
<!--
There is no need to duplicate the description in the issue here but it is sometimes worth providing a summary of the individual changes in this PR.
-->
### Are these changes tested?
<!--
We typically require tests for all PRs in order to:
1. Prevent the code from being accidentally broken by subsequent changes
2. Serve as another way to document the expected behavior of the code
If tests are not included in your PR, please explain why (for example, are they covered by existing tests)?
-->
### Are there any user-facing changes?
<!--
If there are user-facing changes then we may require documentation to be updated before approving the PR.
-->
<!--
If there are any breaking changes to public APIs, please uncomment the line below and explain which changes are breaking.
-->
<!-- **This PR includes breaking changes to public APIs.** -->
<!--
Please uncomment the line below (and provide explanation) if the changes fix either (a) a security vulnerability, (b) a bug that caused incorrect or invalid data to be produced, or (c) a bug that causes a crash (even when the API contract is upheld). We use this to highlight fixes to issues that may affect users without their knowledge. For this reason, fixing bugs that cause errors don't count, since those are usually obvious.
-->
<!-- **This PR contains a "Critical Fix".** -->
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] GH-33962: [C++] [Python] Add temporal component extraction kernels for duration types [arrow]
Posted by "rok (via GitHub)" <gi...@apache.org>.
rok commented on code in PR #39267:
URL: https://github.com/apache/arrow/pull/39267#discussion_r1430475197
##########
cpp/src/arrow/compute/kernels/scalar_temporal_test.cc:
##########
@@ -118,6 +118,30 @@ class ScalarTemporalTest : public ::testing::Test {
"2010-01-04T07:35:36", "2006-01-01T08:40:39",
"2005-12-31T09:45:45", "2008-12-27T23:59:59",
"2008-02-28", "2012-03-01", null])";
+ const char* durations_s =
Review Comment:
That's a good enough reason to not use it then :D
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] GH-33962: [C++] [Python] Add temporal component extraction kernels for duration types [arrow]
Posted by "rok (via GitHub)" <gi...@apache.org>.
rok commented on PR #39267:
URL: https://github.com/apache/arrow/pull/39267#issuecomment-1864419873
> I think have "round" functionality for duration as well would be useful, but that seems like a separate issue?
Indeed!
> (to mimic this temporal extraction, you can do that with division, and that is already implemented)
Fair point!
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] GH-33962: [C++] [Python] Add temporal component extraction kernels for duration types [arrow]
Posted by "jorisvandenbossche (via GitHub)" <gi...@apache.org>.
jorisvandenbossche commented on PR #39267:
URL: https://github.com/apache/arrow/pull/39267#issuecomment-1864540796
Let's centralize the discussion in the issue: https://github.com/apache/arrow/issues/33962? (I already added a long comment there with some comparison what other libraries do. And indeed, almost none actually provide this kind of kernels)
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] GH-33962: [C++] [Python] Add temporal component extraction kernels for duration types [arrow]
Posted by "zanmato1984 (via GitHub)" <gi...@apache.org>.
zanmato1984 commented on code in PR #39267:
URL: https://github.com/apache/arrow/pull/39267#discussion_r1429583814
##########
cpp/src/arrow/compute/kernels/temporal_internal.h:
##########
@@ -269,6 +283,18 @@ struct TemporalComponentExtractBase<Op, std::chrono::seconds, Time32Type, OutTyp
}
};
+template <template <typename...> class Op, typename OutType>
+struct TemporalComponentExtractBase<Op, std::chrono::seconds, DurationType, OutType> {
+ template <typename OptionsType>
+ static Status ExecWithOptions(KernelContext* ctx, const OptionsType* options,
+ const ExecSpan& batch, ExecResult* out) {
+ using ExecTemplate = Op<std::chrono::seconds, NonZonedLocalizer, DurationType>;
Review Comment:
Here the `DurationType` is explicitly specified as the third type parameter so it goes to the corresponding specification. And the following similar changes are at the same essence.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] GH-33962: [C++] [Python] Add temporal component extraction kernels for duration types [arrow]
Posted by "rok (via GitHub)" <gi...@apache.org>.
rok commented on code in PR #39267:
URL: https://github.com/apache/arrow/pull/39267#discussion_r1430003288
##########
cpp/src/arrow/compute/kernels/scalar_temporal_test.cc:
##########
@@ -118,6 +118,30 @@ class ScalarTemporalTest : public ::testing::Test {
"2010-01-04T07:35:36", "2006-01-01T08:40:39",
"2005-12-31T09:45:45", "2008-12-27T23:59:59",
"2008-02-28", "2012-03-01", null])";
+ const char* durations_s =
Review Comment:
Nit: you could also reuse on of the already existing sets this file.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] GH-33962: [C++] [Python] Add temporal component extraction kernels for duration types [arrow]
Posted by "jorisvandenbossche (via GitHub)" <gi...@apache.org>.
jorisvandenbossche commented on PR #39267:
URL: https://github.com/apache/arrow/pull/39267#issuecomment-1864342448
I think have "round" functionality for duration as well would be useful, but that seems like a separate issue? (to mimic this temporal extraction, you can do that with division, and that is already implemented)
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] GH-33962: [C++] [Python] Add temporal component extraction kernels for duration types [arrow]
Posted by "zanmato1984 (via GitHub)" <gi...@apache.org>.
zanmato1984 commented on code in PR #39267:
URL: https://github.com/apache/arrow/pull/39267#discussion_r1429580148
##########
cpp/src/arrow/compute/kernels/scalar_temporal_unary.cc:
##########
@@ -255,6 +255,17 @@ struct Day {
Localizer localizer_;
};
+template <typename Duration, typename Localizer>
+struct Day<Duration, Localizer, DurationType> {
Review Comment:
This specialization is necessary because extracting day from duration is different than from timestamp/date: `day(date/timestamp)` returns the "day" component which is in the range of [1, 31], whereas `day(duration)` returns the number of days represented in a specified amount of sec/ms/us/ns whose range is logically [int64_min, int64_max] depending on the unit.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] GH-33962: [C++] [Python] Add temporal component extraction kernels for duration types [arrow]
Posted by "zanmato1984 (via GitHub)" <gi...@apache.org>.
zanmato1984 closed pull request #39267: GH-33962: [C++] [Python] Add temporal component extraction kernels for duration types
URL: https://github.com/apache/arrow/pull/39267
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] GH-33962: [C++] [Python] Add temporal component extraction kernels for duration types [arrow]
Posted by "zanmato1984 (via GitHub)" <gi...@apache.org>.
zanmato1984 commented on code in PR #39267:
URL: https://github.com/apache/arrow/pull/39267#discussion_r1430462644
##########
cpp/src/arrow/compute/kernels/scalar_temporal_test.cc:
##########
@@ -118,6 +118,30 @@ class ScalarTemporalTest : public ::testing::Test {
"2010-01-04T07:35:36", "2006-01-01T08:40:39",
"2005-12-31T09:45:45", "2008-12-27T23:59:59",
"2008-02-28", "2012-03-01", null])";
+ const char* durations_s =
Review Comment:
Thanks for reminding. Actually I was planning to do so at the beginning. However I found the existing times and dates sets lack either duration ranges over 1 day or the subtle cases of negative duration, of which special care must be taken.
Let me know if my understanding is wrong.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] GH-33962: [C++] [Python] Add temporal component extraction kernels for duration types [arrow]
Posted by "rok (via GitHub)" <gi...@apache.org>.
rok commented on PR #39267:
URL: https://github.com/apache/arrow/pull/39267#issuecomment-1864289104
Thinking after @jorisvandenbossche 's comments - would [`FloorTemporal` kernel](https://github.com/apache/arrow/blob/2e71ea6e4d4c52a81a835f2c9855bc3566aa7328/cpp/src/arrow/compute/kernels/scalar_temporal_unary.cc#L1006-L1080) be a better fit? (@zanmato1984 please wait for the discussion so I don't cause you unnecessary work).
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] GH-33962: [C++] [Python] Add temporal component extraction kernels for duration types [arrow]
Posted by "jorisvandenbossche (via GitHub)" <gi...@apache.org>.
jorisvandenbossche commented on PR #39267:
URL: https://github.com/apache/arrow/pull/39267#issuecomment-1864286735
Added a more expanded comment on the issue -> https://github.com/apache/arrow/issues/33962#issuecomment-1864285994
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] GH-33962: [C++] [Python] Add temporal component extraction kernels for duration types [arrow]
Posted by "zanmato1984 (via GitHub)" <gi...@apache.org>.
zanmato1984 commented on code in PR #39267:
URL: https://github.com/apache/arrow/pull/39267#discussion_r1429580148
##########
cpp/src/arrow/compute/kernels/scalar_temporal_unary.cc:
##########
@@ -255,6 +255,17 @@ struct Day {
Localizer localizer_;
};
+template <typename Duration, typename Localizer>
+struct Day<Duration, Localizer, DurationType> {
Review Comment:
This specialization is necessary because extracting day from duration is different than from timestamp/date: `day(date/timestamp)` returns the "day" component which is in the range of [1, 31], whereas `day(duration)` returns the number of days represented in a specified amount of sec/ms/us/ns whose range is logically [int64_min, int64_max] depending on the unit.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] GH-33962: [C++] [Python] Add temporal component extraction kernels for duration types [arrow]
Posted by "rok (via GitHub)" <gi...@apache.org>.
rok commented on code in PR #39267:
URL: https://github.com/apache/arrow/pull/39267#discussion_r1430003288
##########
cpp/src/arrow/compute/kernels/scalar_temporal_test.cc:
##########
@@ -118,6 +118,30 @@ class ScalarTemporalTest : public ::testing::Test {
"2010-01-04T07:35:36", "2006-01-01T08:40:39",
"2005-12-31T09:45:45", "2008-12-27T23:59:59",
"2008-02-28", "2012-03-01", null])";
+ const char* durations_s =
Review Comment:
Nit: you could also reuse a set already in this file.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] GH-33962: [C++] [Python] Add temporal component extraction kernels for duration types [arrow]
Posted by "pitrou (via GitHub)" <gi...@apache.org>.
pitrou commented on PR #39267:
URL: https://github.com/apache/arrow/pull/39267#issuecomment-1864529086
Hmm... I don't think these kernels make sense? A duration is a physical amount of time, not a calendar interval.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] GH-33962: [C++] [Python] Add temporal component extraction kernels for duration types [arrow]
Posted by "zanmato1984 (via GitHub)" <gi...@apache.org>.
zanmato1984 commented on PR #39267:
URL: https://github.com/apache/arrow/pull/39267#issuecomment-1936277900
Closing for now as the requirement is still not clear yet.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] GH-33962: [C++] [Python] Add temporal component extraction kernels for duration types [arrow]
Posted by "rok (via GitHub)" <gi...@apache.org>.
rok commented on PR #39267:
URL: https://github.com/apache/arrow/pull/39267#issuecomment-1860254654
Some cpp linting issues (you can locally run `archery lint --clang-format --fix`).
@pitrou could you please take a look at the proposed template changes?
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] GH-33962: [C++] [Python] Add temporal component extraction kernels for duration types [arrow]
Posted by "zanmato1984 (via GitHub)" <gi...@apache.org>.
zanmato1984 commented on code in PR #39267:
URL: https://github.com/apache/arrow/pull/39267#discussion_r1429580148
##########
cpp/src/arrow/compute/kernels/scalar_temporal_unary.cc:
##########
@@ -255,6 +255,17 @@ struct Day {
Localizer localizer_;
};
+template <typename Duration, typename Localizer>
+struct Day<Duration, Localizer, DurationType> {
Review Comment:
This specialization is necessary because extracting day from duration is different from timestamp/date: `day(date/timestamp)` returns the "day" component which is in the range of [1, 31], whereas `day(duration)` returns the number of days represented in a specified amount of sec/ms/us/ns whose range is logically [int64_min, int64_max] depending on the unit.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] GH-33962: [C++] [Python] Add temporal component extraction kernels for duration types [arrow]
Posted by "zanmato1984 (via GitHub)" <gi...@apache.org>.
zanmato1984 commented on PR #39267:
URL: https://github.com/apache/arrow/pull/39267#issuecomment-1861204905
> @pitrou could you please take a look at the proposed template changes?
Alternatively, I can make the overloads of `day/second/millisecond/microsecond/nanosecond/subsecond` new functions, by registering them with special function names, e.g. `xxx_from_duration`. This way the template change could be minimal, at the cost of extra boilerplate code for new function and possibly Python binding changes, i.e., Python attribute access of `seconds` for a underlying duration array should call C++ `second_from_duration` instead of `second`.
Personally I think the overload way (the present one in this PR) might make more sense, but I could be wrong. I'm open to any comments. Thanks.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] GH-33962: [C++] [Python] Add temporal component extraction kernels for duration types [arrow]
Posted by "jorisvandenbossche (via GitHub)" <gi...@apache.org>.
jorisvandenbossche commented on PR #39267:
URL: https://github.com/apache/arrow/pull/39267#issuecomment-1864221677
I am not sure if we should reuse the existing kernels for the timestamp/date/time types. It's a quite different operation, and for example the docstring for `"day"` is not correct for what this does for duration input. Of course we can update the docstring for each of those that would accept duration as well. But if every time it has to have a separate explanation for what it does in case of duration input, that's maybe a sign it should be a separate kernel?
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] GH-33962: [C++] [Python] Add temporal component extraction kernels for duration types [arrow]
Posted by "zanmato1984 (via GitHub)" <gi...@apache.org>.
zanmato1984 commented on code in PR #39267:
URL: https://github.com/apache/arrow/pull/39267#discussion_r1429583814
##########
cpp/src/arrow/compute/kernels/temporal_internal.h:
##########
@@ -269,6 +283,18 @@ struct TemporalComponentExtractBase<Op, std::chrono::seconds, Time32Type, OutTyp
}
};
+template <template <typename...> class Op, typename OutType>
+struct TemporalComponentExtractBase<Op, std::chrono::seconds, DurationType, OutType> {
+ template <typename OptionsType>
+ static Status ExecWithOptions(KernelContext* ctx, const OptionsType* options,
+ const ExecSpan& batch, ExecResult* out) {
+ using ExecTemplate = Op<std::chrono::seconds, NonZonedLocalizer, DurationType>;
Review Comment:
Here the `DurationType` is explicitly specified as the third type parameter so it goes to the corresponding specification.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] GH-33962: [C++] [Python] Add temporal component extraction kernels for duration types [arrow]
Posted by "zanmato1984 (via GitHub)" <gi...@apache.org>.
zanmato1984 commented on code in PR #39267:
URL: https://github.com/apache/arrow/pull/39267#discussion_r1429583002
##########
cpp/src/arrow/compute/kernels/scalar_temporal_test.cc:
##########
@@ -604,6 +682,62 @@ TEST_F(ScalarTemporalTest, TestTemporalComponentExtractionAllTemporalTypes) {
CheckScalarUnary("subsecond", time64(TimeUnit::NANO), times_ns, float64(), subsecond);
}
+TEST_F(ScalarTemporalTest, TestTemporalComponentExtractionDuration) {
Review Comment:
These cases are verified using Python's `datetime.Timedelta`.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] GH-33962: [C++] [Python] Add temporal component extraction kernels for duration types [arrow]
Posted by "zanmato1984 (via GitHub)" <gi...@apache.org>.
zanmato1984 commented on code in PR #39267:
URL: https://github.com/apache/arrow/pull/39267#discussion_r1429582083
##########
cpp/src/arrow/compute/kernels/scalar_temporal_unary.cc:
##########
@@ -240,7 +240,7 @@ struct Month {
// ----------------------------------------------------------------------
// Extract day from temporal types
-template <typename Duration, typename Localizer>
+template <typename Duration, typename Localizer, typename = void*>
Review Comment:
Add a third type parameter to distinguish `DurationType` from others. Defaults to `void *` so the existing `TemporalComponentExtractBase`s and other kernels that don't have `DurationType` overloads don't have to change.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] GH-33962: [C++] [Python] Add temporal component extraction kernels for duration types [arrow]
Posted by "zanmato1984 (via GitHub)" <gi...@apache.org>.
zanmato1984 commented on code in PR #39267:
URL: https://github.com/apache/arrow/pull/39267#discussion_r1429582275
##########
cpp/src/arrow/compute/kernels/scalar_temporal_unary.cc:
##########
@@ -596,10 +607,23 @@ struct Second {
}
};
+template <typename Duration, typename Localizer>
+struct Second<Duration, Localizer, DurationType> {
Review Comment:
Same as `Day`.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org