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

prerna.reactor.frame.r.RenameColumnReactor Maven / Gradle / Ivy

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

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

import prerna.ds.OwlTemporalEngineMeta;
import prerna.ds.r.RDataTable;
import prerna.query.querystruct.transform.QSRenameColumnConverter;
import prerna.sablecc2.om.PixelDataType;
import prerna.sablecc2.om.PixelOperationType;
import prerna.sablecc2.om.ReactorKeysEnum;
import prerna.sablecc2.om.nounmeta.ModifyHeaderNounMetadata;
import prerna.sablecc2.om.nounmeta.NounMetadata;
import prerna.util.usertracking.AnalyticsTrackerHelper;
import prerna.util.usertracking.UserTrackerFactory;

public class RenameColumnReactor extends AbstractRFrameReactor {

	/**
	 * This reactor renames a column 
	 * 1) the original column
	 * 2) the new column name 
	 */
	
	public RenameColumnReactor() {
		this.keysToGet = new String[] { ReactorKeysEnum.FRAME.getKey(), 
				ReactorKeysEnum.COLUMN.getKey(), ReactorKeysEnum.NEW_COLUMN.getKey() };
	}

	@Override
	public NounMetadata execute() {
		organizeKeys();
		init();
		// get frame
		RDataTable frame = (RDataTable) getFrame();
		OwlTemporalEngineMeta metadata = this.getFrame().getMetaData();
		String table = frame.getName();

		// get inputs
		String originalColName = keyValue.get(this.keysToGet[1]);
		String dataType = metadata.getHeaderTypeAsString(table + "__" + originalColName);
		if(dataType == null)
			return getWarning("Frame is out of sync / No Such Column. Cannot perform this operation");

		String updatedColName = keyValue.get(this.keysToGet[2]);
		// check that the frame isn't null
		// check if new colName is valid
		updatedColName = getCleanNewColName(frame, updatedColName);
		if (originalColName.contains("__")) {
			String[] split = originalColName.split("__");
			table = split[0];
			originalColName = split[1];
		}
		// ensure new header name is valid
		// make sure that the new name we want to use is valid
		String[] existCols = getColNames(frame);
		if (Arrays.asList(existCols).contains(originalColName) != true) {
			throw new IllegalArgumentException("Column doesn't exist.");
		}
		String validNewHeader = getCleanNewHeader(table, updatedColName);
		if (validNewHeader.equals("")) {
			throw new IllegalArgumentException("Provide valid new column name (no special characters)");
		}
		// define the r script to be executed
		String script = "names(" + table + ")[names(" + table + ") == \"" + originalColName + "\"] = \""
				+ validNewHeader + "\"";
		// execute the r script
		// script is of the form: names(FRAME)[names(FRAME) == "Director"] = "directing_person"
		frame.executeRScript(script);
		this.addExecutedCode(script);
		// FE passes the column name
		// but meta will still be table __ column
		// update the metadata because column names have changed
		metadata.modifyPropertyName(table + "__" + originalColName, table, table + "__" + validNewHeader);
		metadata.setAliasToProperty(table + "__" + validNewHeader, validNewHeader);
		this.getFrame().syncHeaders();

		NounMetadata retNoun = new NounMetadata(frame, PixelDataType.FRAME, PixelOperationType.FRAME_HEADERS_CHANGE, PixelOperationType.FRAME_DATA_CHANGE);
		ModifyHeaderNounMetadata metaNoun = new ModifyHeaderNounMetadata(frame.getName(), originalColName, validNewHeader);
		retNoun.addAdditionalReturn(metaNoun);
		
		// also modify the frame filters
		Map modMap = new HashMap();
		modMap.put(originalColName, validNewHeader);
		frame.setFrameFilters(QSRenameColumnConverter.convertGenRowFilters(frame.getFrameFilters(), modMap, false));
		
		// NEW TRACKING
		UserTrackerFactory.getInstance().trackAnalyticsWidget(
				this.insight, 
				frame, 
				"RenameColumn", 
				AnalyticsTrackerHelper.getHashInputs(this.store, this.keysToGet));
		
		// return the output
		return retNoun;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy