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

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

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

import java.util.Arrays;
import java.util.List;
import java.util.Vector;

import prerna.algorithm.api.SemossDataType;
import prerna.ds.OwlTemporalEngineMeta;
import prerna.ds.r.RDataTable;
import prerna.sablecc2.om.PixelDataType;
import prerna.sablecc2.om.PixelOperationType;
import prerna.sablecc2.om.ReactorKeysEnum;
import prerna.sablecc2.om.execptions.SemossPixelException;
import prerna.sablecc2.om.nounmeta.NounMetadata;

public class DivisionReactor extends AbstractRFrameReactor {
	private static final String NUMERATOR = "numerator";
	private static final String DENOMINATOR = "denominator";
	private static final String ROUND = "round";
	
	public DivisionReactor() {
		this.keysToGet = new String[] { NUMERATOR, DENOMINATOR, ROUND, ReactorKeysEnum.NEW_COLUMN.getKey() };
	}

	@Override
	public NounMetadata execute() {
		init();
		organizeKeys();

		// get frame
		RDataTable frame = (RDataTable) getFrame();
		String frameName = frame.getName();
		String numerator = this.keyValue.get(NUMERATOR);
		String denominator = this.keyValue.get(DENOMINATOR);
		String round = this.keyValue.get(ROUND);
		if(round == null || round.isEmpty()) {
			round = "2";
		} else {
			// make sure positive #
			int num = 0;
			try {
				num = ((Number) Double.parseDouble(round)).intValue();
			} catch(Exception e) {
				throw new IllegalArgumentException("Must pass in a valid number for round");
			}
			if(num < 0) {
				throw new IllegalArgumentException("Round value must be > 0");
			}
		}
		String newColName = this.keyValue.get(ReactorKeysEnum.NEW_COLUMN.getKey());
		newColName = getCleanNewColName(newColName);

		// make sure column exists
		String[] startingColumns = getColumns(frameName);
		List startingColumnsList = new Vector(startingColumns.length);
		startingColumnsList.addAll(Arrays.asList(startingColumns));
		if (numerator == null || !startingColumnsList.contains(numerator) || denominator == null
				|| !startingColumnsList.contains(denominator)) {
			throw new IllegalArgumentException("Need to define existing numerator and denominator columns.");
		}

		// create R script
		StringBuilder script = new StringBuilder();
		script.append(frameName).append("$").append(newColName).append(" <- round(")
			.append(frameName).append("$").append(numerator).append("/")
			.append(frameName).append("$").append(denominator).append(", digits = ")
			.append(round).append(");");

		// run R script
		this.rJavaTranslator.runR(script.toString());
		this.addExecutedCode(script.toString());

		// check if new column exists
		String colExistsScript = "\"" + newColName + "\" %in% colnames(" + frameName + ")";
		boolean colExists = this.rJavaTranslator.getBoolean(colExistsScript);
		if (!colExists) {
			NounMetadata error = NounMetadata.getErrorNounMessage("Unable to perform column division");
			SemossPixelException exception = new SemossPixelException(error);
			exception.setContinueThreadOfExecution(false);
			throw exception;
		}

		// update meta data to add new column
		OwlTemporalEngineMeta metaData = frame.getMetaData();
		metaData.addProperty(frameName, frameName + "__" + newColName);
		metaData.setAliasToProperty(frameName + "__" + newColName, newColName);
		metaData.setDataTypeToProperty(frameName + "__" + newColName, SemossDataType.DOUBLE.toString());
		metaData.setDerivedToProperty(frameName + "__" + newColName, true);
		frame.syncHeaders();

		NounMetadata retNoun = new NounMetadata(frame, PixelDataType.FRAME, PixelOperationType.FRAME_HEADERS_CHANGE,
				PixelOperationType.FRAME_DATA_CHANGE);
		retNoun.addAdditionalReturn(NounMetadata.getSuccessNounMessage("Successfully performed column division"));
		return retNoun;
	}

	///////////////////////// KEYS /////////////////////////////////////

	@Override
	protected String getDescriptionForKey(String key) {
		if (key.equals(NUMERATOR)) {
			return "The column to use as the numerator";
		} else if (key.equals(DENOMINATOR)) {
			return "The column to use as the denominator";
		} else {
			return super.getDescriptionForKey(key);
		}
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy