-- This pattern generated a merge statement for Vertica database or equivalent of a merge in other dbs
--(c) 2015 Talend Inc.
<% 
	EXTRACT(__MERGE_ON__);
	EXTRACT(__UPDATE_MAPPING__);
	EXTRACT(__ADDITIONAL_UPDATE_COLUMNS__);
	EXTRACT(__INSERT_MAPPING__);
	EXTRACT(__ADDITIONAL_INSERT_COLUMNS__);
	String dbTypeInsert = "__DBTYPE__";
	boolean hasInsertClause = __USE_INSERT__;
	boolean hasAdditionalInsertColumns = __SPECIFY_ADDITIONAL_INSERT_COLUMNS__;
	boolean hasInsertWhereClause = __SPECIFY_INSERT_WHERE_CLAUSE__;
	boolean iFlag = false;
	
	
	String mergeOnStrInsert = "";
	for(int i=0; i < __MERGE_ON_SRC_COLUMN__.length; i++){
		if (iFlag) {
			mergeOnStrInsert += " AND ";
		} else {
			iFlag = true;
		}
		mergeOnStrInsert += (__TARGET_TABLE__ + "." + __MERGE_ON_TRG_COLUMN__[i] + " = " + __SOURCE_TABLE__ + "." + __MERGE_ON_SRC_COLUMN__[i]);
	}
	
	String insertColumnsStr = "";
	String insertValuesStr = "";
	String insertWhereStr = "";
	String insertStr = "";
	iFlag = false;
	if (hasInsertClause) {
		for(int i=0; i < __INSERT_MAPPING_TRG_COLUMN__.length; i++) {
			if (iFlag) {
				insertColumnsStr += ",";
				insertValuesStr += ",";
			} else {
				iFlag = true;
			}
			insertColumnsStr += (__INSERT_MAPPING_TRG_COLUMN__[i]);
			insertValuesStr += (__SOURCE_TABLE__ + "." + __INSERT_MAPPING_SRC_COLUMN__[i]);
		}
		if (hasAdditionalInsertColumns) {
			for(int i=0; i < __ADDITIONAL_INSERT_COLUMNS_TRG_COLUMN_NAME__.length; i++) {
				if (iFlag) {
					insertColumnsStr += ",";
					insertValuesStr += ",";
				} else {
					iFlag = true;
				}
				insertColumnsStr += (__ADDITIONAL_INSERT_COLUMNS_TRG_COLUMN_NAME__[i]);
				insertValuesStr += (__ADDITIONAL_INSERT_COLUMNS_TRG_COLUMN_VALUE__[i]);
			}
		}
		if (hasInsertWhereClause) {
			insertWhereStr = " " + __INSERT_WHERE_CLAUSE__ + " ";
		}
		
		insertStr = "(" + insertColumnsStr + ") VALUES (" + insertValuesStr + ")";
	}
	
	String mergeStringInsert = "";
	
	
	if (hasInsertClause) {
		mergeStringInsert += "INSERT INTO " + __TARGET_TABLE__ + " (" + insertColumnsStr + ") " +
							 " (SELECT " + insertValuesStr + " FROM " + __SOURCE_TABLE__ + 
							 " WHERE NOT EXISTS (SELECT 1 FROM " + __TARGET_TABLE__ + " WHERE (" + mergeOnStrInsert + ")) " + 
							 (hasInsertWhereClause ? (" AND (" + insertWhereStr + ")"): "") + ");";
	} else {
		mergeStringInsert = "DELETE FROM " + __TARGET_TABLE__ + " WHERE 1=0";
	}
	
%>
<%=mergeStringInsert%>;