import { CfnTable } from 'aws-cdk-lib/aws-glue';
import * as iam from 'aws-cdk-lib/aws-iam';
import { IResource, Resource } from 'aws-cdk-lib/core';
import { Construct } from 'constructs';
import { DataFormat } from './data-format';
import { IDatabase } from './database';
import { Column } from './schema';
import { StorageParameter } from './storage-parameter';
/**
 * Properties of a Partition Index.
 */
export interface PartitionIndex {
    /**
     * The name of the partition index.
     *
     * @default - a name will be generated for you.
     */
    readonly indexName?: string;
    /**
     * The partition key names that comprise the partition
     * index. The names must correspond to a name in the
     * table's partition keys.
     */
    readonly keyNames: string[];
}
export interface ITable extends IResource {
    /**
     * @attribute
     */
    readonly tableArn: string;
    /**
     * @attribute
     */
    readonly tableName: string;
}
export interface TableAttributes {
    readonly tableArn: string;
    readonly tableName: string;
}
export interface TableBaseProps {
    /**
     * Name of the table.
     *
     * @default - generated by CDK.
     */
    readonly tableName?: string;
    /**
     * Description of the table.
     *
     * @default generated
     */
    readonly description?: string;
    /**
     * Database in which to store the table.
     */
    readonly database: IDatabase;
    /**
     * Columns of the table.
     */
    readonly columns: Column[];
    /**
     * Partition columns of the table.
     *
     * @default table is not partitioned
     */
    readonly partitionKeys?: Column[];
    /**
     * Partition indexes on the table. A maximum of 3 indexes
     * are allowed on a table. Keys in the index must be part
     * of the table's partition keys.
     *
     * @default table has no partition indexes
     */
    readonly partitionIndexes?: PartitionIndex[];
    /**
     * Storage type of the table's data.
     */
    readonly dataFormat: DataFormat;
    /**
     * Indicates whether the table's data is compressed or not.
     *
     * @default false
     */
    readonly compressed?: boolean;
    /**
     * Indicates whether the table data is stored in subdirectories.
     *
     * @default false
     */
    readonly storedAsSubDirectories?: boolean;
    /**
     * Enables partition filtering.
     *
     * @see https://docs.aws.amazon.com/athena/latest/ug/glue-best-practices.html#glue-best-practices-partition-index
     *
     * @default - The parameter is not defined
     */
    readonly enablePartitionFiltering?: boolean;
    /**
     * The user-supplied properties for the description of the physical storage of this table. These properties help describe the format of the data that is stored within the crawled data sources.
     *
     * The key/value pairs that are allowed to be submitted are not limited, however their functionality is not guaranteed.
     *
     * Some keys will be auto-populated by glue crawlers, however, you can override them by specifying the key and value in this property.
     *
     * @see https://docs.aws.amazon.com/glue/latest/dg/table-properties-crawler.html
     *
     * @see https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_TABLE.html#r_CREATE_EXTERNAL_TABLE-parameters - under _"TABLE PROPERTIES"_
     *
     * @example
     *
     *    declare const glueDatabase: glue.IDatabase;
     *    const table = new glue.Table(this, 'Table', {
     *      storageParameters: [
     *          glue.StorageParameter.skipHeaderLineCount(1),
     *          glue.StorageParameter.compressionType(glue.CompressionType.GZIP),
     *          glue.StorageParameter.custom('foo', 'bar'), // Will have no effect
     *          glue.StorageParameter.custom('separatorChar', ','), // Will describe the separator char used in the data
     *          glue.StorageParameter.custom(glue.StorageParameters.WRITE_PARALLEL, 'off'),
     *      ],
     *      // ...
     *      database: glueDatabase,
     *      columns: [{
     *          name: 'col1',
     *          type: glue.Schema.STRING,
     *      }],
     *      dataFormat: glue.DataFormat.CSV,
     *    });
     *
     * @default - The parameter is not defined
     */
    readonly storageParameters?: StorageParameter[];
    /**
     * The key/value pairs define properties associated with the table.
     * The key/value pairs that are allowed to be submitted are not limited, however their functionality is not guaranteed.
     *
     * @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-tableinput.html#cfn-glue-table-tableinput-parameters
     *
     * @default - The parameter is not defined
     */
    readonly parameters?: {
        [key: string]: string;
    };
}
/**
 * A Glue table.
 */
export declare abstract class TableBase extends Resource implements ITable {
    static fromTableArn(scope: Construct, id: string, tableArn: string): ITable;
    /**
     * Creates a Table construct that represents an external table.
     *
     * @param scope The scope creating construct (usually `this`).
     * @param id The construct's id.
     * @param attrs Import attributes
     */
    static fromTableAttributes(scope: Construct, id: string, attrs: TableAttributes): ITable;
    protected abstract readonly tableResource: CfnTable;
    abstract readonly tableName: string;
    abstract readonly tableArn: string;
    abstract readonly partitionIndexes?: PartitionIndex[];
    /**
     * Database this table belongs to.
     */
    readonly database: IDatabase;
    /**
     * Indicates whether the table's data is compressed or not.
     */
    readonly compressed: boolean;
    /**
     * Format of this table's data files.
     */
    readonly dataFormat: DataFormat;
    /**
     * This table's columns.
     */
    readonly columns: Column[];
    /**
     * This table's partition keys if the table is partitioned.
     */
    readonly partitionKeys?: Column[];
    /**
     * The tables' storage descriptor properties.
     */
    readonly storageParameters?: StorageParameter[];
    /**
     * The tables' properties associated with the table.
     * @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-tableinput.html#cfn-glue-table-tableinput-parameters
     */
    protected readonly parameters: {
        [key: string]: string;
    };
    /**
     * Partition indexes must be created one at a time. To avoid
     * race conditions, we store the resource and add dependencies
     * each time a new partition index is created.
     */
    private partitionIndexCustomResources;
    constructor(scope: Construct, id: string, props: TableBaseProps);
    abstract grantRead(grantee: iam.IGrantable): iam.Grant;
    abstract grantWrite(grantee: iam.IGrantable): iam.Grant;
    abstract grantReadWrite(grantee: iam.IGrantable): iam.Grant;
    /**
     * Add a partition index to the table. You can have a maximum of 3 partition
     * indexes to a table. Partition index keys must be a subset of the table's
     * partition keys.
     *
     * @see https://docs.aws.amazon.com/glue/latest/dg/partition-indexes.html
     */
    addPartitionIndex(index: PartitionIndex): void;
    private generateIndexName;
    private validatePartitionIndex;
    /**
     * Grant the given identity custom permissions.
     */
    grant(grantee: iam.IGrantable, actions: string[]): iam.Grant;
    /**
     * Grant the given identity custom permissions to ALL underlying resources of the table.
     * Permissions will be granted to the catalog, the database, and the table.
     */
    grantToUnderlyingResources(grantee: iam.IGrantable, actions: string[]): iam.Grant;
}
