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

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

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

import java.util.HashSet;
import java.util.List;
import java.util.Vector;

import prerna.ds.r.RDataTable;
import prerna.ds.r.RSyntaxHelper;
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.Utility;
import prerna.util.usertracking.AnalyticsTrackerHelper;
import prerna.util.usertracking.UserTrackerFactory;

public class CollapseReactor extends AbstractRFrameReactor {

	public CollapseReactor() {
		this.keysToGet = new String[] { "groupByColumn", ReactorKeysEnum.VALUE.getKey(),
				ReactorKeysEnum.DELIMITER.getKey(), ReactorKeysEnum.MAINTAIN_COLUMNS.getKey() };
	}

	@Override
	public NounMetadata execute() {
		init();
		organizeKeys();
		RDataTable frame = (RDataTable) getFrame();
		String frameName = frame.getName();
		List groupByCol = getGroupByCols();
		String valueCol = this.keyValue.get(this.keysToGet[1]);
		String delim = this.keyValue.get(this.keysToGet[2]);

		StringBuilder rsb = new StringBuilder();
		String groupByColsR = "list(";
		String[] row = new String[groupByCol.size() + 1];
		Object[] newColNames = new Object[groupByCol.size() + 1];
		String tempFrame = "tempFrame" + Utility.getRandomString(8);
		String collapsedColName = valueCol + "_Collapse";
		for (int i = 0; i < groupByCol.size(); i++) {
			String groupCol = groupByCol.get(i);
			groupByColsR += tempFrame + "$" + groupCol;
			if (i < groupByCol.size() - 1) {
				groupByColsR += " , ";
			}
			row[i] = groupCol;
			newColNames[i] = groupCol;
		}
		groupByColsR += ")";
		row[groupByCol.size()] = valueCol;
		newColNames[groupByCol.size()] = collapsedColName;

		// get subset of frame using columns selected
		rsb.append(RSyntaxHelper.getFrameSubset(tempFrame, frameName, row));
		
		// get unique subset values
		rsb.append(tempFrame + "<-unique(" + tempFrame + ");");

		// aggregate values
		String aggFrame = "aggFrame" + Utility.getRandomString(8);
		String delimR = "'" + delim + "'";
		rsb.append(aggFrame + " <- aggregate(" + tempFrame + "$" + valueCol + ", by = " + groupByColsR + ", paste, collapse=" + delimR + ");");		
		
		// rename columns
		String names = RSyntaxHelper.createStringRColVec(newColNames);
		rsb.append("colnames(" + aggFrame + ") <- " + names + ";");
		
		// get columns to keep
		HashSet colsToKeep = getKeepCols();
		if (colsToKeep != null) {
			// merge columns
			colsToKeep.addAll(groupByCol);
			String mergeFrame = Utility.getRandomString(8);
			// get subset of frame using columns selected
			rsb.append(RSyntaxHelper.getFrameSubset(mergeFrame, frameName, colsToKeep.toArray()));
			rsb.append(aggFrame + "<- merge(" + aggFrame + "," + mergeFrame + ", by = " + RSyntaxHelper.createStringRColVec(groupByCol.toArray()) + ");");
		}
		// replace current frame with agg frame
		rsb.append(RSyntaxHelper.asDataTable(frameName, aggFrame));
		rsb.append("rm(" + aggFrame + ");");
		rsb.append("rm(" + tempFrame + ");");
		rsb.append("gc();");

		this.rJavaTranslator.runR(rsb.toString());
		this.addExecutedCode(rsb.toString());
		frame.recreateMeta();

		// NEW TRACKING
		UserTrackerFactory.getInstance().trackAnalyticsWidget(
				this.insight, 
				frame, 
				"Collapse", 
				AnalyticsTrackerHelper.getHashInputs(this.store, this.keysToGet));
		
		NounMetadata retNoun = new NounMetadata(frame, PixelDataType.FRAME, PixelOperationType.FRAME_HEADERS_CHANGE, PixelOperationType.FRAME_DATA_CHANGE);
		return retNoun;
	}
	
	private List getGroupByCols() {
		List colInputs = new Vector();
		GenRowStruct colGRS = this.store.getNoun(this.keysToGet[0]);
		if (colGRS != null) {
			int size = colGRS.size();
			if (size > 0) {
				for (int i = 0; i < size; i++) {
					// get each individual column entry and clean
					String column = colGRS.get(i).toString();
					colInputs.add(column);
				}
			}
		}
		return colInputs;
	}

	private HashSet getKeepCols() {
		HashSet colInputs = new HashSet();
		GenRowStruct colGRS = this.store.getNoun(ReactorKeysEnum.MAINTAIN_COLUMNS.getKey());
		if (colGRS != null) {
			int size = colGRS.size();
			if (size > 0) {
				for (int i = 0; i < size; i++) {
					// get each individual column entry and clean
					String column = colGRS.get(i).toString();
					colInputs.add(column);
				}
				return colInputs;
			}
		}
		return null;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy