All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.netflix.metacat.main.api.MetacatV1Resource Maven / Gradle / Ivy

There is a newer version: 1.3.1
Show newest version
/*
 * Copyright 2016 Netflix, Inc.
 *    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.netflix.metacat.main.api;

import com.facebook.presto.spi.SchemaTableName;
import com.facebook.presto.spi.TableNotFoundException;
import com.netflix.metacat.common.MetacatContext;
import com.netflix.metacat.common.NameDateDto;
import com.netflix.metacat.common.QualifiedName;
import com.netflix.metacat.common.api.MetacatV1;
import com.netflix.metacat.common.dto.CatalogDto;
import com.netflix.metacat.common.dto.CatalogMappingDto;
import com.netflix.metacat.common.dto.CreateCatalogDto;
import com.netflix.metacat.common.dto.DatabaseCreateRequestDto;
import com.netflix.metacat.common.dto.DatabaseDto;
import com.netflix.metacat.common.dto.TableDto;
import com.netflix.metacat.common.exception.MetacatNotFoundException;
import com.netflix.metacat.common.exception.MetacatNotSupportedException;
import com.netflix.metacat.common.server.events.MetacatCreateDatabasePostEvent;
import com.netflix.metacat.common.server.events.MetacatCreateDatabasePreEvent;
import com.netflix.metacat.common.server.events.MetacatCreateMViewPostEvent;
import com.netflix.metacat.common.server.events.MetacatCreateMViewPreEvent;
import com.netflix.metacat.common.server.events.MetacatCreateTablePostEvent;
import com.netflix.metacat.common.server.events.MetacatCreateTablePreEvent;
import com.netflix.metacat.common.server.events.MetacatDeleteDatabasePostEvent;
import com.netflix.metacat.common.server.events.MetacatDeleteDatabasePreEvent;
import com.netflix.metacat.common.server.events.MetacatDeleteMViewPostEvent;
import com.netflix.metacat.common.server.events.MetacatDeleteMViewPreEvent;
import com.netflix.metacat.common.server.events.MetacatDeleteTablePostEvent;
import com.netflix.metacat.common.server.events.MetacatDeleteTablePreEvent;
import com.netflix.metacat.common.server.events.MetacatEventBus;
import com.netflix.metacat.common.server.events.MetacatRenameTablePostEvent;
import com.netflix.metacat.common.server.events.MetacatRenameTablePreEvent;
import com.netflix.metacat.common.server.events.MetacatUpdateDatabasePostEvent;
import com.netflix.metacat.common.server.events.MetacatUpdateDatabasePreEvent;
import com.netflix.metacat.common.server.events.MetacatUpdateMViewPostEvent;
import com.netflix.metacat.common.server.events.MetacatUpdateMViewPreEvent;
import com.netflix.metacat.common.server.events.MetacatUpdateTablePostEvent;
import com.netflix.metacat.common.server.events.MetacatUpdateTablePreEvent;
import com.netflix.metacat.common.util.MetacatContextManager;
import com.netflix.metacat.main.services.CatalogService;
import com.netflix.metacat.main.services.DatabaseService;
import com.netflix.metacat.main.services.MViewService;
import com.netflix.metacat.main.services.TableService;

import javax.inject.Inject;
import java.util.List;
import java.util.Optional;
import java.util.function.Supplier;

import static com.google.common.base.Preconditions.checkArgument;
import static com.netflix.metacat.main.api.RequestWrapper.qualifyName;
import static com.netflix.metacat.main.api.RequestWrapper.requestWrapper;

public class MetacatV1Resource implements MetacatV1 {
    private final CatalogService catalogService;
    private final DatabaseService databaseService;
    private final MetacatEventBus eventBus;
    private final MViewService mViewService;
    private final TableService tableService;

    @Inject
    public MetacatV1Resource(
            CatalogService catalogService,
            DatabaseService databaseService,
            MetacatEventBus eventBus,
            MViewService mViewService,
            TableService tableService) {
        this.catalogService = catalogService;
        this.databaseService = databaseService;
        this.eventBus = eventBus;
        this.mViewService = mViewService;
        this.tableService = tableService;
    }

    @Override
    public void createCatalog(CreateCatalogDto createCatalogDto) {
        throw new MetacatNotSupportedException();
    }

    @Override
    public void createDatabase(String catalogName, String databaseName,
            DatabaseCreateRequestDto databaseCreateRequestDto) {
        MetacatContext metacatContext = MetacatContextManager.getContext();
        QualifiedName name = qualifyName(() -> QualifiedName.ofDatabase(catalogName, databaseName));
        requestWrapper(name, "createDatabase", () -> {
            eventBus.post(new MetacatCreateDatabasePreEvent(name, metacatContext));

            DatabaseDto newDto = new DatabaseDto();
            newDto.setName(name);
            if (databaseCreateRequestDto != null) {
                newDto.setDefinitionMetadata(databaseCreateRequestDto.getDefinitionMetadata());
            }
            databaseService.create(name, newDto);

            DatabaseDto dto = databaseService.get(name, newDto.getDefinitionMetadata() != null);
            eventBus.post(new MetacatCreateDatabasePostEvent(dto, metacatContext));
            return null;
        });
    }

    @Override
    public TableDto createMView(String catalogName,
            String databaseName,
            String tableName,
            String viewName,
            Boolean snapshot,
            String filter) {
        MetacatContext metacatContext = MetacatContextManager.getContext();
        QualifiedName name = qualifyName(() -> QualifiedName.ofView(catalogName, databaseName, tableName, viewName));
        return requestWrapper(name, "createMView", () -> {
            eventBus.post(new MetacatCreateMViewPreEvent(name, snapshot, filter, metacatContext));

            TableDto dto = mViewService.create(name);
            if (snapshot != null && snapshot) {
                mViewService.snapshotPartitions(name, filter);
            }

            eventBus.post(new MetacatCreateMViewPostEvent(dto, snapshot, filter, metacatContext));
            return dto;
        });
    }

    @Override
    public TableDto createTable(String catalogName, String databaseName, String tableName, TableDto table) {
        MetacatContext metacatContext = MetacatContextManager.getContext();
        QualifiedName name = qualifyName(() -> QualifiedName.ofTable(catalogName, databaseName, tableName));
        return requestWrapper(name, "createTable", () -> {
            checkArgument(table != null, "Table cannot be null");
            checkArgument(tableName != null && !tableName.isEmpty(), "table name is required");
            checkArgument(table.getName() != null && tableName.equalsIgnoreCase(table.getName().getTableName()),
                    "Table name does not match the name in the table");

            eventBus.post(new MetacatCreateTablePreEvent(name, metacatContext));

            tableService.create(name, table);

            TableDto dto = tableService.get(name, true).orElseThrow(() -> new IllegalStateException("Should exist"));
            eventBus.post(new MetacatCreateTablePostEvent(dto, metacatContext));
            return dto;
        });
    }

    @Override
    public void deleteDatabase(String catalogName, String databaseName) {
        MetacatContext metacatContext = MetacatContextManager.getContext();
        QualifiedName name = qualifyName(() -> QualifiedName.ofDatabase(catalogName, databaseName));
        requestWrapper(name, "deleteDatabase", () -> {
            DatabaseDto dto = databaseService.get(name, true);
            eventBus.post(new MetacatDeleteDatabasePreEvent(dto, metacatContext));

            databaseService.delete(name);

            eventBus.post(new MetacatDeleteDatabasePostEvent(dto, metacatContext));
            return null;
        });
    }

    @Override
    public TableDto deleteMView(String catalogName, String databaseName, String tableName, String viewName) {
        MetacatContext metacatContext = MetacatContextManager.getContext();
        QualifiedName name = qualifyName(() -> QualifiedName.ofView(catalogName, databaseName, tableName, viewName));
        return requestWrapper(name, "deleteMView", () -> {
            eventBus.post(new MetacatDeleteMViewPreEvent(name, metacatContext));

            TableDto dto = mViewService.deleteAndReturn(name);

            eventBus.post(new MetacatDeleteMViewPostEvent(dto, metacatContext));
            return dto;
        });
    }

    @Override
    public TableDto deleteTable(String catalogName, String databaseName, String tableName) {
        MetacatContext metacatContext = MetacatContextManager.getContext();
        QualifiedName name = qualifyName(() -> QualifiedName.ofTable(catalogName, databaseName, tableName));
        return requestWrapper(name, "deleteTable", () -> {
            eventBus.post(new MetacatDeleteTablePreEvent(name, metacatContext));

            TableDto dto = tableService.deleteAndReturn(name);

            eventBus.post(new MetacatDeleteTablePostEvent(dto, metacatContext));
            return dto;
        });
    }

    @Override
    public CatalogDto getCatalog(String catalogName) {
        QualifiedName name = qualifyName(() -> QualifiedName.ofCatalog(catalogName));
        return requestWrapper(name, "getCatalog", () -> catalogService.get(name));
    }

    @Override
    public List getCatalogNames() {
        QualifiedName name = QualifiedName.ofCatalog("getCatalogNames");
        return requestWrapper(name, "getCatalogNames", catalogService::getCatalogNames);
    }

    @Override
    public DatabaseDto getDatabase(String catalogName, String databaseName, Boolean includeUserMetadata) {
        QualifiedName name = qualifyName(() -> QualifiedName.ofDatabase(catalogName, databaseName));
        return requestWrapper(name, "getDatabase", () -> databaseService.get(name, includeUserMetadata));
    }

    @Override
    public TableDto getMView(String catalogName, String databaseName, String tableName, String viewName) {
        QualifiedName name = qualifyName(() -> QualifiedName.ofView(catalogName, databaseName, tableName, viewName));
        return requestWrapper(name, "getMView", (Supplier) () -> {
            Optional table = mViewService.getOpt(name);
            return table.orElseThrow(() -> new MetacatNotFoundException("Unable to find view: " + name));
        });
    }

    @Override
    public List getMViews(String catalogName) {
        QualifiedName name = qualifyName(() -> QualifiedName.ofCatalog(catalogName));
        return requestWrapper(name, "getMViews", () -> mViewService.list(name));
    }

    @Override
    public List getMViews(String catalogName, String databaseName, String tableName) {
        QualifiedName name = qualifyName(() -> QualifiedName.ofTable(catalogName, databaseName, tableName));
        return requestWrapper(name, "getMViews", () -> mViewService.list(name));
    }

    @Override
    public TableDto getTable(String catalogName, String databaseName, String tableName, Boolean includeInfo, Boolean includeDefinitionMetadata, Boolean includeDataMetadata) {
        QualifiedName name = qualifyName(() -> QualifiedName.ofTable(catalogName, databaseName, tableName));
        return requestWrapper(name, "getTable", (Supplier) () -> {
            Optional table = tableService.get(name, includeInfo, includeDefinitionMetadata, includeDataMetadata);
            return table.orElseThrow(() -> new TableNotFoundException(new SchemaTableName(databaseName, tableName)));
        });
    }

    @Override
    public void renameTable(String catalogName, String databaseName, String tableName, String newTableName) {
        MetacatContext metacatContext = MetacatContextManager.getContext();
        QualifiedName oldName = qualifyName(() -> QualifiedName.ofTable(catalogName, databaseName, tableName));
        QualifiedName newName = qualifyName(() -> QualifiedName.ofTable(catalogName, databaseName, newTableName));
        requestWrapper(oldName, "renameTable", () -> {
            eventBus.post(new MetacatRenameTablePreEvent(newName, oldName, metacatContext));

            tableService.rename(oldName, newName, false);

            TableDto dto = tableService.get(newName, true).orElseThrow(() -> new IllegalStateException("should exist"));
            eventBus.post(new MetacatRenameTablePostEvent(oldName, dto, metacatContext));
            return null;
        });
    }

    public void updateCatalog(String catalogName, CreateCatalogDto createCatalogDto) {
        MetacatContext metacatContext = MetacatContextManager.getContext();
        QualifiedName name = qualifyName(() -> QualifiedName.ofCatalog(catalogName));
        requestWrapper(name, "updateDatabase", () -> {
            eventBus.post(new MetacatUpdateDatabasePreEvent(name, metacatContext));

            createCatalogDto.setName(name);
            catalogService.update(name, createCatalogDto);

            eventBus.post(new MetacatUpdateDatabasePostEvent(name, metacatContext));
            return null;
        });
    }

    @Override
    public void updateDatabase(
            String catalogName,
            String databaseName,
            DatabaseCreateRequestDto databaseUpdateRequestDto) {
        MetacatContext metacatContext = MetacatContextManager.getContext();
        QualifiedName name = qualifyName(() -> QualifiedName.ofDatabase(catalogName, databaseName));
        requestWrapper(name, "updateDatabase", () -> {
            eventBus.post(new MetacatUpdateDatabasePreEvent(name, metacatContext));

            DatabaseDto newDto = new DatabaseDto();
            newDto.setName(name);
            newDto.setDefinitionMetadata(databaseUpdateRequestDto.getDefinitionMetadata());
            databaseService.update(name, newDto);

            eventBus.post(new MetacatUpdateDatabasePostEvent(name, metacatContext));
            return null;
        });
    }

    @Override
    public TableDto updateMView(String catalogName, String databaseName, String tableName, String viewName, TableDto table) {
        MetacatContext metacatContext = MetacatContextManager.getContext();
        QualifiedName name = qualifyName(() -> QualifiedName.ofView(catalogName, databaseName, tableName, viewName));
        return requestWrapper(name, "getMView", () -> {
            eventBus.post(new MetacatUpdateMViewPreEvent(name, table, metacatContext));

            mViewService.update(name, table);

            TableDto dto = mViewService.getOpt(name).orElseThrow(() -> new IllegalStateException("should exist"));
            eventBus.post(new MetacatUpdateMViewPostEvent(dto, metacatContext));
            return dto;
        });
    }

    @Override
    public TableDto updateTable(String catalogName, String databaseName, String tableName, TableDto table) {
        MetacatContext metacatContext = MetacatContextManager.getContext();
        QualifiedName name = qualifyName(() -> QualifiedName.ofTable(catalogName, databaseName, tableName));
        return requestWrapper(name, "updateTable", () -> {
            checkArgument(table != null, "Table cannot be null");
            checkArgument(tableName != null && !tableName.isEmpty(), "table name is required");
            checkArgument(table.getName() != null && tableName.equalsIgnoreCase(table.getName().getTableName()),
                    "Table name does not match the name in the table");

            eventBus.post(new MetacatUpdateTablePreEvent(name, table, metacatContext));

            tableService.update(name, table);

            TableDto dto = tableService.get(name, true).orElseThrow(() -> new IllegalStateException("should exist"));
            eventBus.post(new MetacatUpdateTablePostEvent(dto, metacatContext));
            return dto;
        });
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy