
prerna.reactor.frame.r.AutoCleanColumnReactor Maven / Gradle / Ivy
The newest version!
package prerna.reactor.frame.r;
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.GenRowStruct;
import prerna.sablecc2.om.PixelDataType;
import prerna.sablecc2.om.PixelOperationType;
import prerna.sablecc2.om.ReactorKeysEnum;
import prerna.sablecc2.om.nounmeta.AddHeaderNounMetadata;
import prerna.sablecc2.om.nounmeta.NounMetadata;
import prerna.util.Utility;
import prerna.util.usertracking.AnalyticsTrackerHelper;
import prerna.util.usertracking.UserTrackerFactory;
public class AutoCleanColumnReactor extends AbstractRFrameReactor {
public AutoCleanColumnReactor() {
this.keysToGet = new String[] { ReactorKeysEnum.COLUMN.getKey(), ReactorKeysEnum.OVERRIDE.getKey() };
}
@Override
public NounMetadata execute() {
init();
organizeKeys();
String column = this.keyValue.get(this.keysToGet[0]);
boolean override = overrideExistingColumn();
RDataTable frame = (RDataTable) this.getFrame();
String tableName = frame.getName();
// check if packages are installed
String[] packages = { "stringdist", "data.table", "tm", "cluster" };
this.rJavaTranslator.checkPackages(packages);
// make sure its a string
String dataType = this.getColumnType(tableName, column);
if(dataType == null)
return getWarning("Frame is out of sync / No Such Column. Cannot perform this operation");
if (SemossDataType.convertStringToDataType(dataType) != SemossDataType.STRING) {
throw new IllegalArgumentException("The column type must be a String.");
}
// source teh scripts
String baseFolder = Utility.getBaseFolder();
String sourceScript = "source(\"" + baseFolder + "\\R\\Recommendations\\master_col_data.r\") ;";
sourceScript = sourceScript.replace("\\", "/");
this.rJavaTranslator.runR(sourceScript);
List opTypes = new Vector();
opTypes.add(PixelOperationType.FRAME_DATA_CHANGE);
NounMetadata retNoun = null;
OwlTemporalEngineMeta metaData = frame.getMetaData();
if(!override) {
// adding new column
// data + headers change
opTypes.add(PixelOperationType.FRAME_HEADERS_CHANGE);
retNoun = new NounMetadata(frame, PixelDataType.FRAME, opTypes);
// new col is mastered version of column
String tempCol = Utility.getRandomString(8);
String newHeaderName = getCleanNewHeader(tableName, column);
StringBuilder script = new StringBuilder();
script.append(tempCol + " <- " + tableName + "$" + column + ";");
script.append(tempCol + " <- master_col_data(as.character(" + tempCol + "));");
script.append(tableName + " <- " + "cbind(" + tableName + ", " + tempCol + ");");
script.append(tableName + "$" + newHeaderName + " <- " + tempCol + "; ");
script.append(tableName + " <- " + tableName + "[,-c('" + tempCol + "')];");
script.append("rm(" + tempCol + ");");
this.rJavaTranslator.runR(script.toString());
this.addExecutedCode(script.toString());
// add meta data to frame
retNoun.addAdditionalReturn(new AddHeaderNounMetadata(newHeaderName));
metaData.addProperty(tableName, tableName + "__" + newHeaderName);
metaData.setAliasToProperty(tableName + "__" + newHeaderName, newHeaderName);
metaData.setDataTypeToProperty(tableName + "__" + newHeaderName, SemossDataType.STRING.toString());
} else {
// override existing column
// just a data change
retNoun = new NounMetadata(frame, PixelDataType.FRAME, opTypes);
// execute the script on the column and replace original
this.rJavaTranslator.runR(tableName + "$" + column + " <- master_col_data(" + tableName + "$" + column + ");");
}
frame.syncHeaders();
// NEW TRACKING
UserTrackerFactory.getInstance().trackAnalyticsWidget(
this.insight,
frame,
"AutoClean",
AnalyticsTrackerHelper.getHashInputs(this.store, this.keysToGet));
return retNoun;
}
/**
* Create new column or override existing column
* @return
*/
private boolean overrideExistingColumn() {
GenRowStruct boolGrs = this.store.getNoun(this.keysToGet[1]);
if (boolGrs != null) {
if (boolGrs.size() > 0) {
List
© 2015 - 2025 Weber Informatics LLC | Privacy Policy