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

prerna.reactor.frame.rdbms.UpdateRowValuesReactor Maven / Gradle / Ivy

The newest version!
package prerna.reactor.frame.rdbms;

import java.util.Arrays;
import java.util.List;
import java.util.Set;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import prerna.ds.rdbms.AbstractRdbmsFrame;
import prerna.om.HeadersException;
import prerna.query.querystruct.SelectQueryStruct;
import prerna.query.querystruct.filters.GenRowFilters;
import prerna.query.querystruct.filters.SimpleQueryFilter;
import prerna.reactor.frame.AbstractFrameReactor;
import prerna.sablecc2.om.GenRowStruct;
import prerna.sablecc2.om.PixelDataType;
import prerna.sablecc2.om.PixelOperationType;
import prerna.sablecc2.om.nounmeta.NounMetadata;
import prerna.util.Constants;

public class UpdateRowValuesReactor extends AbstractFrameReactor {
	
	private static final Logger classLogger = LogManager.getLogger(UpdateRowValuesReactor.class);

	@Override
	public NounMetadata execute() {
		AbstractRdbmsFrame frame = (AbstractRdbmsFrame) getFrame();
		String updateColumnInput = "";
		String updateTable = "";
		String updateColumn = "";
		String updateValueSQL = "";
		GenRowStruct inputsGRS = this.getCurRow();
		String sqlStatements = "";
		// get update column
		updateColumnInput = inputsGRS.getNoun(0).getValue() + "";
		if (updateColumnInput.contains("__")) {
			String[] split = updateColumnInput.split("__");
			updateTable = split[0];
			updateColumn = split[1];
		} else {
			updateTable = frame.getName();
			updateColumn = updateColumnInput;
		}
		// get update value
		NounMetadata noun = inputsGRS.getNoun(1);
		PixelDataType nounType = noun.getNounType();
		if (nounType.equals(PixelDataType.CONST_STRING)) {
			updateValueSQL = noun.getValue() + "";
		}

		// validate updateColumn exists
		String[] existCols = getColNames(frame);
		if (Arrays.asList(existCols).contains(updateColumn) != true) {
			throw new IllegalArgumentException("Column " + updateColumn + " doesn't exist.");
		}

		// clean updateValueSQL value
		HeadersException colNameChecker = HeadersException.getInstance();
		updateValueSQL = "'" + colNameChecker.removeIllegalCharacters(updateValueSQL) + "'";

		// get filters
		String update = "UPDATE " + updateTable + " SET " + updateColumn + " = " + updateValueSQL + " WHERE ";
		NounMetadata filterNoun = inputsGRS.getNoun(2);
		PixelDataType filterNounType = filterNoun.getNounType();
		if (filterNounType.equals(PixelDataType.QUERY_STRUCT)) {
			SelectQueryStruct qs = (SelectQueryStruct) filterNoun.getValue();
			GenRowFilters grf = qs.getExplicitFilters();
			Set filteredColumns = grf.getAllFilteredColumns();
			for (String column : filteredColumns) {
				List filterList = grf.getAllSimpleQueryFiltersContainingColumn(column);
				for (SimpleQueryFilter queryFilter : filterList) {
					String sqlCondition = "";
					// col to values
					NounMetadata leftComp = queryFilter.getLComparison();
					String columnComp = leftComp.getValue() + "";
					if (columnComp.contains("__")) {
						String[] split = columnComp.split("__");
						sqlCondition += split[1];
					}
					// does sqlCondition exist
					if (Arrays.asList(existCols).contains(sqlCondition) != true) {
						throw new IllegalArgumentException("Column " + sqlCondition + " doesn't exist.");
					}
					String nounComparator = queryFilter.getComparator();
					// clean nounComparator for sql statement
					if (nounComparator.equals("==")) {
						nounComparator = "=";
					} else if (nounComparator.equals("<>")) {
						nounComparator = "!=";
					}
					sqlCondition += " " + nounComparator + " ";
					// rightComp has values
					NounMetadata rightComp = queryFilter.getRComparison();
					Object value = rightComp.getValue();

					// clean value
					value = colNameChecker.removeIllegalCharacters(String.valueOf(value));

					// if it is a string put quotes
					if (rightComp.getNounType().equals(PixelDataType.CONST_STRING)) {
						sqlStatements += update + sqlCondition + "'" + value + "' ; ";
					} else {
						sqlStatements += update + sqlCondition + "'" + value + "' ; ";
					}
				}
			}
		}
		try {
			frame.getBuilder().runQuery(sqlStatements);
		} catch (Exception e) {
			classLogger.error(Constants.STACKTRACE, e);
		}
		return new NounMetadata(frame, PixelDataType.FRAME, PixelOperationType.FRAME_DATA_CHANGE);
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy