com.flipkart.aesop.hbasedatalayer.delete.HBaseDeleteDataLayer.java Source code

Java tutorial

Introduction

Here is the source code for com.flipkart.aesop.hbasedatalayer.delete.HBaseDeleteDataLayer.java

Source

/*******************************************************************************
 *
 * Copyright 2012-2015, the original author or authors.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obta 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.flipkart.aesop.hbasedatalayer.delete;

import com.flipkart.aesop.destinationoperation.DeleteDestinationStoreProcessor;
import com.flipkart.aesop.destinationoperation.JDBCDataLayer;
import com.flipkart.aesop.destinationoperation.utils.DataLayerConstants;
import com.flipkart.aesop.destinationoperation.utils.DataLayerHelper;
import com.flipkart.aesop.event.AbstractEvent;
import com.flipkart.aesop.hbasedatalayer.upsert.HBaseUpsertDataLayer;
import com.linkedin.databus.client.pub.ConsumerCallbackResult;
import com.linkedin.databus.core.DbusOpcode;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.trpr.platform.core.impl.logging.LogFactory;
import org.trpr.platform.core.spi.logging.Logger;

import java.util.Map;

/**
 * HBase Delete Data Layer. Persists {@link DbusOpcode#DELETE} events to HBase through Phoenix.
 * @author Prakhar Jain
 * @see HBaseUpsertDataLayer
 */
public class HBaseDeleteDataLayer extends DeleteDestinationStoreProcessor implements JDBCDataLayer {
    /** Logger for this class. */
    public static final Logger LOGGER = LogFactory.getLogger(HBaseUpsertDataLayer.class);

    /** JDBC Template Map, with Namespace name as key and the corresponding JDBC template as value. */
    private Map<String, NamedParameterJdbcTemplate> jdbcTemplateMap;

    /**
     * Field Constructor.
     * @param jdbcTemplateMap jdbcTemplateMap
     */
    public HBaseDeleteDataLayer(Map<String, NamedParameterJdbcTemplate> jdbcTemplateMap) {
        this.jdbcTemplateMap = jdbcTemplateMap;
    }

    public Map<String, NamedParameterJdbcTemplate> getJdbcTemplateMap() {
        return jdbcTemplateMap;
    }

    @Override
    protected ConsumerCallbackResult delete(AbstractEvent event) {
        String deleteQuery = generateDeleteQuery(event);
        NamedParameterJdbcTemplate jdbcTemplate = jdbcTemplateMap.get(event.getNamespaceName());
        Map<String, Object> nullValueColumnMapping = DataLayerHelper
                .generateColumnMappingWithNullValues(event.getFieldMapPair(), event.getPrimaryKeySet());
        jdbcTemplate.update(deleteQuery, nullValueColumnMapping);
        return ConsumerCallbackResult.SUCCESS;
    }

    /**
     * Generates Delete Query using {@link #buildQuery(String, String, StringBuilder, StringBuilder)} and
     * {@link #populateQueryParts(Map, StringBuilder, StringBuilder)} helper functions.
     * @param event event
     * @return Delete Query.
     */
    private String generateDeleteQuery(AbstractEvent event) {
        StringBuilder columnNameStringBuilder = new StringBuilder();
        StringBuilder placeholderStringBuilder = new StringBuilder();

        populateQueryParts(event.getFieldMapPair(), columnNameStringBuilder, placeholderStringBuilder);

        return buildQuery(event.getNamespaceName(), event.getEntityName(), columnNameStringBuilder,
                placeholderStringBuilder);

    }

    /**
     * Helper function for {@link #generateDeleteQuery(AbstractEvent)}.
     * @param namespace namespace
     * @param entity entity
     * @param columnNameStringBuilder columnNameStringBuilder
     * @param placeholderStringBuilder placeholderStringBuilder
     * @return Delete Query
     */
    private String buildQuery(String namespace, String entity, StringBuilder columnNameStringBuilder,
            StringBuilder placeholderStringBuilder) {
        StringBuilder upsertQuery = new StringBuilder();

        upsertQuery.append("UPSERT INTO ");
        if (namespace != null && !"".equals(namespace)) {
            upsertQuery.append(namespace + ".");
        }
        upsertQuery.append(entity + "(");
        upsertQuery.append(columnNameStringBuilder.substring(0, columnNameStringBuilder.length() - 1));
        upsertQuery.append(") VALUES(");
        upsertQuery.append(placeholderStringBuilder.substring(0, placeholderStringBuilder.length() - 1));
        upsertQuery.append(")");

        return upsertQuery.toString();
    }

    /**
     * Helper function for {@link #generateDeleteQuery(AbstractEvent)}.
     * @param fieldMap
     * @param columnNameStringBuilder
     * @param placeholderStringBuilder
     */
    private void populateQueryParts(Map<String, Object> fieldMap, StringBuilder columnNameStringBuilder,
            StringBuilder placeholderStringBuilder) {
        for (String columnName : fieldMap.keySet()) {
            columnNameStringBuilder.append(columnName + DataLayerConstants.COMMA);
            placeholderStringBuilder.append(DataLayerConstants.COLON + columnName + DataLayerConstants.COMMA);
        }
    }
}