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

prerna.reactor.frame.py.UnpivotReactor Maven / Gradle / Ivy

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

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

import prerna.ds.py.PandasFrame;
import prerna.ds.py.PandasSyntaxHelper;
import prerna.om.HeadersException;
import prerna.sablecc2.om.GenRowStruct;
import prerna.sablecc2.om.PixelDataType;
import prerna.sablecc2.om.PixelOperationType;
import prerna.sablecc2.om.ReactorKeysEnum;
import prerna.sablecc2.om.nounmeta.NounMetadata;
import prerna.util.usertracking.AnalyticsTrackerHelper;
import prerna.util.usertracking.UserTrackerFactory;

public class UnpivotReactor extends AbstractPyFrameReactor {

	public UnpivotReactor() {
		this.keysToGet = new String[] { ReactorKeysEnum.COLUMNS.getKey() };
	}

	@Override
	public NounMetadata execute() {
		// get frame
		PandasFrame frame = (PandasFrame) getFrame();
		String wrapperName = frame.getWrapperName();
		// get column inputs in an array
		String[] columns = getColumns();
		String frameName = frame.getName();

		// makes the columns and converts them into
		// list ['col1', 'col2']
		StringBuilder valueColumns = new StringBuilder();
		valueColumns.append("[");
		for (int i = 0; i < columns.length; i++) {
			valueColumns.append("'" + columns[i] + "'");
			if (i + 1 < columns.length)
				valueColumns.append(", ");
		}
		valueColumns.append("]");

		String script = frameName + " = " + wrapperName + ".unpivot(" + valueColumns + ")";
		frame.runScript(script);
		this.addExecutedCode(script);

		HeadersException headerChecker = HeadersException.getInstance();
		List allColumns = Arrays.asList(getColumns(frame));
		// python unpivot creates two columns variable and value
		// we make the assumption that the start headers
		// are already clean and not duplicating
		String variableName = "variable";
		String valueName = "value";
		String[] newColumns = headerChecker.cleanAndMatchColumnNumbers(variableName, valueName, allColumns);
		String newVarName = newColumns[0];
		String newValueName = newColumns[1];

		// rename variable name
		String rename = PandasSyntaxHelper.alterColumnName(frameName, variableName, newVarName);
		frame.runScript(rename);
		this.addExecutedCode(rename);
		// rename value name
		rename = PandasSyntaxHelper.alterColumnName(frameName, valueName, newValueName);
		frame.runScript(rename);
		this.addExecutedCode(rename);

		// NEW TRACKING
		UserTrackerFactory.getInstance().trackAnalyticsWidget(this.insight, frame, "Unpivot",
				AnalyticsTrackerHelper.getHashInputs(this.store, this.keysToGet));

		frame = (PandasFrame) recreateMetadata(frame);

		return new NounMetadata(frame, PixelDataType.FRAME, PixelOperationType.FRAME_DATA_CHANGE,
				PixelOperationType.FRAME_HEADERS_CHANGE);
	}

	//////////////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////
	///////////////////////// GET PIXEL INPUT ////////////////////////////
	//////////////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////

	private String[] getColumns() {
		// get columns from key
		String[] columns = null;
		GenRowStruct colGrs = this.store.getNoun(this.keysToGet[0]);
		if (colGrs != null && !colGrs.isEmpty()) {
			columns = new String[colGrs.size()];
			for (int selectIndex = 0; selectIndex < colGrs.size(); selectIndex++) {
				String column = colGrs.get(selectIndex) + "";
				columns[selectIndex] = column;
			}
			return columns;
		} else {
			// get columns from index
			GenRowStruct inputsGRS = this.getCurRow();
			columns = new String[inputsGRS.size()];
			if (inputsGRS != null && !inputsGRS.isEmpty()) {
				// input is the columns to unpivot
				for (int i = 0; i < inputsGRS.size(); i++) {
					NounMetadata input = this.getCurRow().getNoun(i);
					String column = input.getValue() + "";
					// clean column
					if (column.contains("__")) {
						column = column.split("__")[1];
						// add the columns to keep to the string array
					}
					columns[i] = column;
				}
				return columns;
			}
		}
		throw new IllegalArgumentException("Need to define columns to unpivot");
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy