In this document, you will find some guidelines on contributing to Apache Iceberg. Please keep in mind that none of these are hard rules and they're meant as a collection of helpful suggestions to make contributing as seamless of an experience as possible.
If you are thinking of contributing but first would like to discuss the change you wish to make, we welcome you to head over to the Community page on the official Iceberg documentation site to find a number of ways to connect with the community, including slack and our mailing lists. Of course, always feel free to just open a new issue in the GitHub repo.
Pull requests are the preferred mechanism for contributing to Iceberg
Build:
, Docs:
, Spark:
, Flink:
, Core:
, API:
Closes #1234
in the PR description will automatically close the issue and helps keep the project cleanPlease refer to the Building section of the main readme for instructions on how to build iceberg locally.
The Iceberg website and documentations are hosted in a different repository iceberg-docs. Read the repository README for contribution guidelines for the website and documentation.
For Java styling, check out the section Setting up IDE and Code Style from the documentation site.
Continuation indents are 2 indents (4 spaces) from the start of the previous line.
Try to break long lines at the same semantic level to make code more readable.
// BAD: hard to see arguments passed to the same method doSomething(new ArgumentClass(1, 2), 3); // GOOD: break lines at the same semantic level doSomething( new ArgumentClass(1, 2), 3); // BAD: arguments and chained methods mixed SomeObject myNewObject = SomeObject.builder(schema, partitionSpec sortOrder) .withProperty("x", "1") .build() // GOOD: method calls at the same level, arguments indented SomeObject myNewObject = SomeObject .builder(schema, partitionSpec, sortOrder) .withProperty("x", "1") .build()
get
in method names, unless an object must be a Java bean.get
with a more specific verb that describes what is happening in the method, like find
or fetch
.get
because it isn’t helpful to readers and makes method names longer.Transform.preservesOrder()
reads correctly in an if statement: if (transform.preservesOrder()) { ... }
Avoid boolean arguments to methods that are not private
to avoid confusing invocations like sendMessage(false)
. It is better to create two methods with names and behavior, even if both are implemented by one internal method.
// prefer exposing suppressFailure in method names public void sendMessageIgnoreFailure() { sendMessageInternal(true); } public void sendMessage() { sendMessageInternal(false); } private void sendMessageInternal(boolean suppressFailure) { ... }
When passing boolean arguments to existing or external methods, use inline comments to help the reader understand actions without an IDE.
// BAD: it is not clear what false controls dropTable(identifier, false); // GOOD: these uses of dropTable are clear to the reader dropTable(identifier, true /* purge data */); dropTable(identifier, purge);
-
to link words in one conceptaccess-key-id
rather than access.key.id
.
to create a hierarchy of config groupss3
in s3.access-key-id
, s3.secret-access-key