blob: 5e85dd991925aa64860d37c19cbcc9128d8f6226 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.iceberg;
import org.apache.iceberg.exceptions.CommitFailedException;
import org.apache.iceberg.expressions.Expressions;
import org.apache.iceberg.expressions.Term;
/**
* API for partition spec evolution.
* <p>
* When committing, these changes will be applied to the current table metadata. Commit conflicts
* will not be resolved and will result in a {@link CommitFailedException}.
*/
public interface UpdatePartitionSpec extends PendingUpdate<PartitionSpec> {
/**
* Set whether column resolution in the source schema should be case sensitive.
*
* @param isCaseSensitive whether column resolution should be case sensitive
* @return this for method chaining
*/
UpdatePartitionSpec caseSensitive(boolean isCaseSensitive);
/**
* Add a new partition field from a source column.
* <p>
* The partition field will be created as an identity partition field for the given source column, with the same name
* as the source column.
* <p>
* The source column is located using {@link Schema#findField(String)}.
*
* @param sourceName source column name in the table schema
* @return this for method chaining
* @throws IllegalArgumentException If the an identity partition field for the source already exists, or if this
* change conflicts with other additions, removals, or renames.
*/
UpdatePartitionSpec addField(String sourceName);
/**
* Add a new partition field from an {@link Expressions expression term}.
* <p>
* The partition field will use the term's transform or the identity transform if the term is a reference.
* <p>
* The term's reference is used to locate the source column using {@link Schema#findField(String)}.
* <p>
* The new partition field will be named for the source column and the transform.
*
* @param term source column name in the table schema
* @return this for method chaining
* @throws IllegalArgumentException If the a partition field for the transform and source already exists, or if this
* change conflicts with other additions, removals, or renames.
*/
UpdatePartitionSpec addField(Term term);
/**
* Add a new partition field from an {@link Expressions expression term}, with the given partition field name.
* <p>
* The partition field will use the term's transform or the identity transform if the term is a reference.
* <p>
* The term's reference is used to locate the source column using {@link Schema#findField(String)}.
*
* @param name name for the partition field
* @param term expression for the partition transform
* @return this for method chaining
* @throws IllegalArgumentException If the a partition field for the transform and source already exists, if a
* partition field with the given name already exists, or if this change conflicts
* with other additions, removals, or renames.
*/
UpdatePartitionSpec addField(String name, Term term);
/**
* Remove a partition field by name.
*
* @param name name of the partition field to remove
* @return this for method chaining
* @throws IllegalArgumentException If the a partition field with the given name does not exist, or if this change
* conflicts with other additions, removals, or renames.
*/
UpdatePartitionSpec removeField(String name);
/**
* Remove a partition field by its transform {@link Expressions expression term}.
* <p>
* The partition field with the same transform and source reference will be removed. If the term is a reference and
* does not have a transform, the identity transform is used.
*
* @param term expression for the partition transform to remove
* @return this for method chaining
* @throws IllegalArgumentException If the a partition field with the given transform and source does not exist, or
* if this change conflicts with other additions, removals, or renames.
*/
UpdatePartitionSpec removeField(Term term);
/**
* Rename a field in the partition spec.
*
* @param name name of the partition field to rename
* @param newName replacement name for the partition field
* @return this for method chaining
* @throws IllegalArgumentException If name doesn't identify a column in the schema or if this change conflicts with
* other additions, removals, or renames.
*/
UpdatePartitionSpec renameField(String name, String newName);
}