/* * Licensed 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 com.facebook.presto.raptor.metadata; import com.facebook.presto.raptor.metadata.Table.TableMapper; import com.facebook.presto.spi.SchemaTableName; import org.skife.jdbi.v2.sqlobject.Bind; import org.skife.jdbi.v2.sqlobject.GetGeneratedKeys; import org.skife.jdbi.v2.sqlobject.SqlQuery; import org.skife.jdbi.v2.sqlobject.SqlUpdate; import org.skife.jdbi.v2.sqlobject.customizers.Mapper; import java.util.List; import java.util.Set; public interface MetadataDao { String TABLE_INFORMATION_SELECT = "" + "SELECT t.table_id, t.distribution_id, d.distribution_name, d.bucket_count, t.temporal_column_id, t.organization_enabled\n" + "FROM tables t\n" + "LEFT JOIN distributions d ON (t.distribution_id = d.distribution_id)\n"; String TABLE_COLUMN_SELECT = "" + "SELECT t.schema_name, t.table_name,\n" + " c.column_id, c.column_name, c.data_type,\n" + " c.bucket_ordinal_position, c.sort_ordinal_position,\n" + " t.temporal_column_id = c.column_id AS temporal\n" + "FROM tables t\n" + "JOIN columns c ON (t.table_id = c.table_id)\n"; @SqlQuery(TABLE_INFORMATION_SELECT + "WHERE t.table_id = :tableId") @Mapper(TableMapper.class) Table getTableInformation(@Bind("tableId") long tableId); @SqlQuery(TABLE_INFORMATION_SELECT + "WHERE t.schema_name = :schemaName\n" + " AND t.table_name = :tableName") @Mapper(TableMapper.class) Table getTableInformation( @Bind("schemaName") String schemaName, @Bind("tableName") String tableName); @SqlQuery(TABLE_COLUMN_SELECT + "WHERE t.table_id = :tableId\n" + " AND c.column_id = :columnId\n" + "ORDER BY c.ordinal_position\n") TableColumn getTableColumn( @Bind("tableId") long tableId, @Bind("columnId") long columnId); @SqlQuery("SELECT schema_name, table_name\n" + "FROM tables\n" + "WHERE (schema_name = :schemaName OR :schemaName IS NULL)") @Mapper(SchemaTableNameMapper.class) List<SchemaTableName> listTables( @Bind("schemaName") String schemaName); @SqlQuery("SELECT DISTINCT schema_name FROM tables") List<String> listSchemaNames(); @SqlQuery(TABLE_COLUMN_SELECT + "WHERE (schema_name = :schemaName OR :schemaName IS NULL)\n" + " AND (table_name = :tableName OR :tableName IS NULL)\n" + "ORDER BY schema_name, table_name, ordinal_position") List<TableColumn> listTableColumns( @Bind("schemaName") String schemaName, @Bind("tableName") String tableName); @SqlQuery(TABLE_COLUMN_SELECT + "WHERE t.table_id = :tableId\n" + "ORDER BY c.ordinal_position") List<TableColumn> listTableColumns(@Bind("tableId") long tableId); @SqlQuery(TABLE_COLUMN_SELECT + "WHERE t.table_id = :tableId\n" + " AND c.sort_ordinal_position IS NOT NULL\n" + "ORDER BY c.sort_ordinal_position") List<TableColumn> listSortColumns(@Bind("tableId") long tableId); @SqlQuery(TABLE_COLUMN_SELECT + "WHERE t.table_id = :tableId\n" + " AND c.bucket_ordinal_position IS NOT NULL\n" + "ORDER BY c.bucket_ordinal_position") List<TableColumn> listBucketColumns(@Bind("tableId") long tableId); @SqlQuery("SELECT schema_name, table_name, data\n" + "FROM views\n" + "WHERE (schema_name = :schemaName OR :schemaName IS NULL)") @Mapper(SchemaTableNameMapper.class) List<SchemaTableName> listViews( @Bind("schemaName") String schemaName); @SqlQuery("SELECT schema_name, table_name, data\n" + "FROM views\n" + "WHERE (schema_name = :schemaName OR :schemaName IS NULL)\n" + " AND (table_name = :tableName OR :tableName IS NULL)\n" + "ORDER BY schema_name, table_name\n") @Mapper(ViewResult.Mapper.class) List<ViewResult> getViews( @Bind("schemaName") String schemaName, @Bind("tableName") String tableName); @SqlUpdate("INSERT INTO tables (\n" + " schema_name, table_name, compaction_enabled, organization_enabled, distribution_id,\n" + " create_time, update_time, table_version,\n" + " shard_count, row_count, compressed_size, uncompressed_size)\n" + "VALUES (\n" + " :schemaName, :tableName, :compactionEnabled, :organizationEnabled, :distributionId,\n" + " :createTime, :createTime, 0,\n" + " 0, 0, 0, 0)\n") @GetGeneratedKeys long insertTable( @Bind("schemaName") String schemaName, @Bind("tableName") String tableName, @Bind("compactionEnabled") boolean compactionEnabled, @Bind("organizationEnabled") boolean organizationEnabled, @Bind("distributionId") Long distributionId, @Bind("createTime") long createTime); @SqlUpdate("UPDATE tables SET\n" + " update_time = :updateTime\n" + ", table_version = table_version + 1\n" + "WHERE table_id = :tableId") void updateTableVersion( @Bind("tableId") long tableId, @Bind("updateTime") long updateTime); @SqlUpdate("UPDATE tables SET\n" + " shard_count = shard_count + :shardCount \n" + ", row_count = row_count + :rowCount\n" + ", compressed_size = compressed_size + :compressedSize\n" + ", uncompressed_size = uncompressed_size + :uncompressedSize\n" + "WHERE table_id = :tableId") void updateTableStats( @Bind("tableId") long tableId, @Bind("shardCount") long shardCount, @Bind("rowCount") long rowCount, @Bind("compressedSize") long compressedSize, @Bind("uncompressedSize") long uncompressedSize); @SqlUpdate("INSERT INTO columns (table_id, column_id, column_name, ordinal_position, data_type, sort_ordinal_position, bucket_ordinal_position)\n" + "VALUES (:tableId, :columnId, :columnName, :ordinalPosition, :dataType, :sortOrdinalPosition, :bucketOrdinalPosition)") void insertColumn( @Bind("tableId") long tableId, @Bind("columnId") long columnId, @Bind("columnName") String columnName, @Bind("ordinalPosition") int ordinalPosition, @Bind("dataType") String dataType, @Bind("sortOrdinalPosition") Integer sortOrdinalPosition, @Bind("bucketOrdinalPosition") Integer bucketOrdinalPosition); @SqlUpdate("UPDATE tables SET\n" + " schema_name = :newSchemaName\n" + ", table_name = :newTableName\n" + "WHERE table_id = :tableId") void renameTable( @Bind("tableId") long tableId, @Bind("newSchemaName") String newSchemaName, @Bind("newTableName") String newTableName); @SqlUpdate("UPDATE columns SET column_name = :target\n" + "WHERE table_id = :tableId\n" + " AND column_id = :columnId") void renameColumn( @Bind("tableId") long tableId, @Bind("columnId") long columnId, @Bind("target") String target); @SqlUpdate("INSERT INTO views (schema_name, table_name, data)\n" + "VALUES (:schemaName, :tableName, :data)") void insertView( @Bind("schemaName") String schemaName, @Bind("tableName") String tableName, @Bind("data") String data); @SqlUpdate("DELETE FROM tables WHERE table_id = :tableId") int dropTable(@Bind("tableId") long tableId); @SqlUpdate("DELETE FROM columns WHERE table_id = :tableId") int dropColumns(@Bind("tableId") long tableId); @SqlUpdate("DELETE FROM views\n" + "WHERE schema_name = :schemaName\n" + " AND table_name = :tableName") int dropView( @Bind("schemaName") String schemaName, @Bind("tableName") String tableName); // JDBI returns 0 as the column_id when the temporal_column_id is set to NULL // jdbi issue https://github.com/jdbi/jdbi/issues/154 @SqlQuery("SELECT temporal_column_id\n" + "FROM tables\n" + "WHERE table_id = :tableId\n" + " AND temporal_column_id IS NOT NULL") Long getTemporalColumnId(@Bind("tableId") long tableId); @SqlUpdate("UPDATE tables SET\n" + "temporal_column_id = :columnId\n" + "WHERE table_id = :tableId") void updateTemporalColumnId( @Bind("tableId") long tableId, @Bind("columnId") long columnId); @SqlQuery("SELECT compaction_enabled AND maintenance_blocked IS NULL\n" + "FROM tables\n" + "WHERE table_id = :tableId") boolean isCompactionEligible(@Bind("tableId") long tableId); @SqlQuery("SELECT table_id FROM tables WHERE table_id = :tableId FOR UPDATE") Long getLockedTableId(@Bind("tableId") long tableId); @SqlQuery("SELECT distribution_id, distribution_name, column_types, bucket_count\n" + "FROM distributions\n" + "WHERE distribution_id = :distributionId") Distribution getDistribution(@Bind("distributionId") long distributionId); @SqlQuery("SELECT distribution_id, distribution_name, column_types, bucket_count\n" + "FROM distributions\n" + "WHERE distribution_name = :distributionName") Distribution getDistribution(@Bind("distributionName") String distributionName); @SqlUpdate("INSERT INTO distributions (distribution_name, column_types, bucket_count)\n" + "VALUES (:distributionName, :columnTypes, :bucketCount)") @GetGeneratedKeys long insertDistribution( @Bind("distributionName") String distributionName, @Bind("columnTypes") String columnTypes, @Bind("bucketCount") int bucketCount); @SqlQuery("SELECT table_id, schema_name, table_name, temporal_column_id, distribution_name, bucket_count, organization_enabled\n" + "FROM tables\n" + "LEFT JOIN distributions\n" + "ON tables.distribution_id = distributions.distribution_id\n" + "WHERE (schema_name = :schemaName OR :schemaName IS NULL)\n" + " AND (table_name = :tableName OR :tableName IS NULL)\n" + "ORDER BY table_id") @Mapper(TableMetadataRow.Mapper.class) List<TableMetadataRow> getTableMetadataRows( @Bind("schemaName") String schemaName, @Bind("tableName") String tableName); @SqlQuery("SELECT table_id, column_id, column_name, sort_ordinal_position, bucket_ordinal_position\n" + "FROM columns\n" + "WHERE table_id IN (\n" + " SELECT table_id\n" + " FROM tables\n" + " WHERE (schema_name = :schemaName OR :schemaName IS NULL)\n" + " AND (table_name = :tableName OR :tableName IS NULL))\n" + "ORDER BY table_id") @Mapper(ColumnMetadataRow.Mapper.class) List<ColumnMetadataRow> getColumnMetadataRows( @Bind("schemaName") String schemaName, @Bind("tableName") String tableName); @SqlQuery("SELECT schema_name, table_name, create_time, update_time, table_version,\n" + " shard_count, row_count, compressed_size, uncompressed_size\n" + "FROM tables\n" + "WHERE (schema_name = :schemaName OR :schemaName IS NULL)\n" + " AND (table_name = :tableName OR :tableName IS NULL)\n" + "ORDER BY schema_name, table_name") @Mapper(TableStatsRow.Mapper.class) List<TableStatsRow> getTableStatsRows( @Bind("schemaName") String schemaName, @Bind("tableName") String tableName); @SqlQuery("SELECT table_id\n" + "FROM tables\n" + "WHERE organization_enabled\n" + " AND maintenance_blocked IS NULL\n" + " AND table_id IN\n" + " (SELECT table_id\n" + " FROM columns\n" + " WHERE sort_ordinal_position IS NOT NULL)") Set<Long> getOrganizationEligibleTables(); @SqlUpdate("UPDATE tables SET maintenance_blocked = CURRENT_TIMESTAMP\n" + "WHERE table_id = :tableId\n" + " AND maintenance_blocked IS NULL") void blockMaintenance(@Bind("tableId") long tableId); @SqlUpdate("UPDATE tables SET maintenance_blocked = NULL\n" + "WHERE table_id = :tableId") void unblockMaintenance(@Bind("tableId") long tableId); @SqlQuery("SELECT maintenance_blocked IS NOT NULL\n" + "FROM tables\n" + "WHERE table_id = :tableId\n" + "FOR UPDATE") boolean isMaintenanceBlockedLocked(@Bind("tableId") long tableId); @SqlUpdate("UPDATE tables SET maintenance_blocked = NULL\n" + "WHERE maintenance_blocked IS NOT NULL") void unblockAllMaintenance(); }