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

com.netflix.metacat.main.services.search.MetacatEventHandlers 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.services.search;

import com.fasterxml.jackson.databind.node.ObjectNode;
import com.google.common.eventbus.Subscribe;
import com.netflix.metacat.common.MetacatContext;
import com.netflix.metacat.common.dto.DatabaseDto;
import com.netflix.metacat.common.dto.PartitionDto;
import com.netflix.metacat.common.dto.TableDto;
import com.netflix.metacat.common.json.MetacatJsonLocator;
import com.netflix.metacat.common.server.events.MetacatCreateDatabasePostEvent;
import com.netflix.metacat.common.server.events.MetacatCreateMViewPostEvent;
import com.netflix.metacat.common.server.events.MetacatCreateTablePostEvent;
import com.netflix.metacat.common.server.events.MetacatDeleteDatabasePostEvent;
import com.netflix.metacat.common.server.events.MetacatDeleteMViewPartitionPostEvent;
import com.netflix.metacat.common.server.events.MetacatDeleteMViewPostEvent;
import com.netflix.metacat.common.server.events.MetacatDeleteTablePartitionPostEvent;
import com.netflix.metacat.common.server.events.MetacatDeleteTablePostEvent;
import com.netflix.metacat.common.server.events.MetacatRenameTablePostEvent;
import com.netflix.metacat.common.server.events.MetacatSaveMViewPartitionPostEvent;
import com.netflix.metacat.common.server.events.MetacatSaveTablePartitionPostEvent;
import com.netflix.metacat.common.server.events.MetacatUpdateMViewPostEvent;
import com.netflix.metacat.common.server.events.MetacatUpdateTablePostEvent;
import com.netflix.metacat.main.services.TableService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.inject.Inject;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

import static com.netflix.metacat.main.services.search.ElasticSearchDoc.Type.database;
import static com.netflix.metacat.main.services.search.ElasticSearchDoc.Type.mview;
import static com.netflix.metacat.main.services.search.ElasticSearchDoc.Type.partition;
import static com.netflix.metacat.main.services.search.ElasticSearchDoc.Type.table;

public class MetacatEventHandlers {
    private static final Logger log = LoggerFactory.getLogger(MetacatEventHandlers.class);
    private final ElasticSearchUtil es;
    private final TableService tableService;

    @Inject
    public MetacatEventHandlers(ElasticSearchUtil es, TableService tableService) {
        this.es = es;
        this.tableService = tableService;
    }

    @Subscribe
    public void metacatCreateDatabasePostEventHandler(MetacatCreateDatabasePostEvent event) {
        DatabaseDto dto = event.getDto();
        ElasticSearchDoc doc = new ElasticSearchDoc(dto.getName().toString(),dto,  event.getMetacatContext().getUserName(), false);
        es.save(database.name(),doc.getId(), doc.toJsonString());
    }

    @Subscribe
    public void metacatCreateMViewPostEventHandler(MetacatCreateMViewPostEvent event) {
        TableDto dto = event.getDto();
        ElasticSearchDoc doc = new ElasticSearchDoc(dto.getName().toString(),dto,  event.getMetacatContext().getUserName(), false);
        es.save(mview.name(), doc.getId(), doc.toJsonString());
    }

    @Subscribe
    public void metacatCreateTablePostEventHandler(MetacatCreateTablePostEvent event) {
        TableDto dto = event.getDto();
        ElasticSearchDoc doc = new ElasticSearchDoc(dto.getName().toString(),dto,  event.getMetacatContext().getUserName(), false);
        es.save(table.name(), doc.getId(), doc.toJsonString());
    }

    @Subscribe
    public void metacatDeleteDatabasePostEventHandler(MetacatDeleteDatabasePostEvent event) {
        DatabaseDto dto = event.getDto();
        es.softDelete(database.name(), dto.getName().toString(), event.getMetacatContext());
    }

    @Subscribe
    public void metacatDeleteMViewPostEventHandler(MetacatDeleteMViewPostEvent event) {
        TableDto dto = event.getDto();
        es.softDelete(mview.name(), dto.getName().toString(), event.getMetacatContext());
    }

    @Subscribe
    public void metacatDeleteTablePostEventHandler(MetacatDeleteTablePostEvent event) {
        TableDto dto = event.getDto();
        es.softDelete(table.name(), dto.getName().toString(), event.getMetacatContext());
    }

    @Subscribe
    public void metacatDeleteMViewPartitionPostEventHandler(MetacatDeleteMViewPartitionPostEvent event) {
        List partitionIds = event.getPartitionIds();
        es.softDelete(partition.name(), partitionIds, event.getMetacatContext());
    }

    @Subscribe
    public void metacatDeleteTablePartitionPostEventHandler(MetacatDeleteTablePartitionPostEvent event) {
        List partitionIds = event.getPartitionIds();
        es.softDelete(partition.name(), partitionIds, event.getMetacatContext());
    }


    @Subscribe
    public void metacatRenameTablePostEventHandler(MetacatRenameTablePostEvent event) {
        es.delete(table.name(), event.getName().toString());

        TableDto dto = event.getDto();
        ElasticSearchDoc doc = new ElasticSearchDoc(dto.getName().toString(),dto,  event.getMetacatContext().getUserName(), false);
        es.save(table.name(), doc.getId(), doc.toJsonString());
    }

    @Subscribe
    public void metacatUpdateMViewPostEventHandler(MetacatUpdateMViewPostEvent event) {
        TableDto dto = event.getDto();
        ElasticSearchDoc doc = new ElasticSearchDoc(dto.getName().toString(),dto,  event.getMetacatContext().getUserName(), false);
        es.save(mview.name(), doc.getId(), doc.toJsonString());
    }

    @Subscribe
    public void metacatUpdateTablePostEventHandler(MetacatUpdateTablePostEvent event) {
        TableDto dto = event.getDto();
        if( dto == null){
            Optional oDto = tableService.get(event.getName(), true);
            if( oDto.isPresent()){
                dto = oDto.get();
                event.setDto(dto);
            }
        }
        if( dto != null) {
            ElasticSearchDoc doc = new ElasticSearchDoc(dto.getName().toString(),dto,  event.getMetacatContext().getUserName(), false);
            es.save(table.name(), doc.getId(), doc.toJsonString());
            updateEntitiesWIthSameUri(table.name(), dto, event.getMetacatContext());
        }
    }

    private void updateEntitiesWIthSameUri(String metadata_type, TableDto dto, MetacatContext metacatContext) {
        List ids = es.getTableIdsByUri(metadata_type, dto.getDataUri());
        ObjectNode node =  MetacatJsonLocator.INSTANCE.emptyObjectNode();
        node.put("dataMetadata", dto.getDataMetadata());
        es.updates(table.name(), ids, metacatContext, node);
    }

    @Subscribe
    public void metacatSaveMViewPartitionPostEventHandler(MetacatSaveMViewPartitionPostEvent event) {
        List partitionDtos = event.getPartitions();
        MetacatContext context = event.getMetacatContext();
        List docs = partitionDtos.stream()
                .map(dto -> new ElasticSearchDoc( dto.getName().toString(), dto, context.getUserName(), false))
                .collect(Collectors.toList());
        es.save(partition.name(), docs);
    }

    @Subscribe
    public void metacatSaveTablePartitionPostEventHandler(MetacatSaveTablePartitionPostEvent event) {
        List partitionDtos = event.getPartitions();
        MetacatContext context = event.getMetacatContext();
        List docs = partitionDtos.stream()
                .map( dto -> new ElasticSearchDoc( dto.getName().toString(), dto, context.getUserName(), false))
                .collect(Collectors.toList());
        es.save(partition.name(), docs);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy