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

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

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

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

import prerna.algorithm.api.ICodeExecution;
import prerna.algorithm.api.ITableDataFrame;
import prerna.ds.OwlTemporalEngineMeta;
import prerna.ds.r.RDataTable;
import prerna.om.HeadersException;
import prerna.om.Variable.LANGUAGE;
import prerna.reactor.frame.AbstractFrameReactor;
import prerna.reactor.frame.r.util.AbstractRJavaTranslator;
import prerna.reactor.frame.r.util.IRJavaTranslator;
import prerna.reactor.frame.r.util.RJavaJriTranslator;
import prerna.reactor.imports.ImportUtility;
import prerna.sablecc2.om.nounmeta.NounMetadata;
import prerna.util.Utility;

public abstract class AbstractRFrameReactor extends AbstractFrameReactor implements ICodeExecution {

	// the code that was executed
	private List codeExecuted = new ArrayList<>();
	protected AbstractRJavaTranslator rJavaTranslator;

	/**
	 * This method must be called to initialize the rJavaTranslator
	 */
	protected void init() {
		this.rJavaTranslator = this.insight.getRJavaTranslator(this.getLogger(this.getClass().getName()));
		this.rJavaTranslator.startR(); 
	}

	/**
	 * This method is used to recreate the frame metadata
	 * when we execute a script that modifies the data structure
	 * @param frameName
	 */
	protected RDataTable createNewFrameFromVariable(String frameName) {
		// create new frame
		RDataTable newTable = new RDataTable(this.insight.getRJavaTranslator(getLogger(this.getClass().getName())), frameName);
		OwlTemporalEngineMeta meta = genNewMetaFromVariable(frameName);
		newTable.setMetaData(meta);
		return newTable;
	}
	
	/**
	 * Recreate a new engine metadata
	 * @param frameName
	 * @return
	 */
	protected OwlTemporalEngineMeta genNewMetaFromVariable(String frameName) {
		// recreate a new frame and set the frame name
		String[] colNames = getColumns(frameName);
		String[] colTypes = getColumnTypes(frameName);
		//clean headers
		HeadersException headerChecker = HeadersException.getInstance();
		colNames = headerChecker.getCleanHeaders(colNames);
		// update frame header names in R
		String rColNames = "";
		for (int i = 0; i < colNames.length; i++) {
			rColNames += "\"" + colNames[i] + "\"";
			if (i < colNames.length - 1) {
				rColNames += ", ";
			}
		}
		String script = "colnames(" + frameName + ") <- c(" + rColNames + ")";
		this.rJavaTranslator.executeEmptyR(script);
		
		OwlTemporalEngineMeta meta = new OwlTemporalEngineMeta();
		ImportUtility.parseTableColumnsAndTypesToFlatTable(meta, colNames, colTypes, frameName);
		return meta;
	}
	
	/**
	 * Renames columns based on a string[] of old names and a string[] of new
	 * names Used by synchronize methods
	 * 
	 * @param frameName
	 * @param oldNames
	 * @param newNames
	 *            boolean print
	 */
	protected void renameColumn(String frameName, String[] oldNames, String[] newNames, boolean print) {
		int size = oldNames.length;
		if (size != newNames.length) {
			throw new IllegalArgumentException("Names arrays do not match in length");
		}
		StringBuilder oldC = new StringBuilder("c(");
		int i = 0;
		oldC.append("'").append(oldNames[i]).append("'");
		i++;
		for (; i < size; i++) {
			oldC.append(", '").append(oldNames[i]).append("'");
		}
		oldC.append(")");

		StringBuilder newC = new StringBuilder("c(");
		i = 0;
		newC.append("'").append(newNames[i]).append("'");
		i++;
		for (; i < size; i++) {
			newC.append(", '").append(newNames[i]).append("'");
		}
		newC.append(")");

		String script = "setnames(" + frameName + ", old = " + oldC + ", new = " + newC + ")";
		this.rJavaTranslator.executeEmptyR(script);

		if (print) {
			System.out.println("Running script : " + script);
			System.out.println("Successfully modified old names = " + Arrays.toString(oldNames) + " to new names " + Arrays.toString(newNames));
		}

		// FE passes the column name
		// but meta will still be table __ column
		for (i = 0; i < size; i++) {
			this.getFrame().getMetaData().modifyPropertyName(frameName + "__" + oldNames[i], frameName,
					frameName + "__" + newNames[i]);
		}
		this.getFrame().syncHeaders();
	}


	/**
	 * This method is used to fix the frame headers to be valid
	 * 
	 * @param frameName
	 * @param newColName
	 */
	protected String getCleanNewHeader(String frameName, String newColName) {
		// make the new column name valid
		HeadersException headerChecker = HeadersException.getInstance();
		String[] currentColumnNames = getColumns(frameName);
		String validNewHeader = headerChecker.recursivelyFixHeaders(newColName, currentColumnNames);
		return validNewHeader;
	}

	/**
	 * This method is used to get the column names of a frame
	 * @param frameName
	 */
	public String[] getColumns(String frameName) {
		return this.rJavaTranslator.getColumns(frameName);
	}

	/**
	 * This method is used to get the column types of a frame
	 * @param frameName
	 */
	public String[] getColumnTypes(String frameName) {
		return this.rJavaTranslator.getColumnTypes(frameName);
	}

	/**
	 * This method is used to get the column type for a single column of a frame
	 * @param frameName
	 * @param column
	 */
	public String getColumnType(String frameName, String column) {
		return this.rJavaTranslator.getColumnType(frameName, column);
	}
	
	/**
	 * Change the frame column type
	 * @param frame
	 * @param frameName
	 * @param colName
	 * @param newType
	 * @param dateFormat
	 */
	public void changeColumnType(RDataTable frame, String frameName, String colName, String newType, String dateFormat) {
		this.rJavaTranslator.changeColumnType(frame, frameName, colName, newType, dateFormat);
	}
	
	protected void storeVariable(String varName, NounMetadata noun) {
		this.insight.getVarStore().put(varName, noun);
	}

	protected Object retrieveVariable(String varName) {
		NounMetadata noun = this.insight.getVarStore().get(varName);
		if (noun == null) {
			return null;
		}
		return noun.getValue();
	}

	protected void removeVariable(String varName) {
		this.insight.getVarStore().remove(varName);
	}

	protected void endR() {
		// java.lang.System.setSecurityManager(curManager);
		// clean up other things
		this.rJavaTranslator.endR();
		if(rJavaTranslator instanceof RJavaJriTranslator) {
			removeVariable(IRJavaTranslator.R_ENGINE);
			removeVariable(IRJavaTranslator.R_PORT);
		} else {
			removeVariable(IRJavaTranslator.R_CONN);
			removeVariable(IRJavaTranslator.R_PORT);
		}
		System.out.println("R Shutdown!!");
//		java.lang.System.setSecurityManager(reactorManager);
	}
	
	/**
     * Get the base folder
     * @return
     */
     protected String getBaseFolder() {
          String baseFolder = null;
          try {
              baseFolder = Utility.getBaseFolder();
          } catch (Exception ignored) {
              //logger.info("No BaseFolder detected... most likely running as test...");
          }
          return baseFolder;
     }
     
 	public boolean smartSync(AbstractRJavaTranslator rJavaTranslator)
 	{
 		// at this point try to see if something has changed and if so
 		// trigger smart sync
 		boolean frameChanged = false;
 		ITableDataFrame frame = this.insight.getCurFrame();
 		if(frame != null && frame instanceof RDataTable)
 		{
 			StringBuffer script = new StringBuffer();
 			String baseFolder = Utility.getBaseFolder();
 			script.append("source(\"" + baseFolder.replace("\\", "/") + "/R/util/smssutil.R\");\n");
 			script.append("if (!exists(\"allframe\")) allframe <- list();");
 			script.append("allframe <- getCurMeta(" + this.insight.getCurFrame().getName() + ", allframe); \n");
 			script.append("allframe <- hasFrameChanged('" + this.insight.getCurFrame().getName() + "', allframe); \n");
 			
 			// source the script
 			//script.append("source(\"" + baseFolder.replace("\\", "/") + "/R/util/smssutil.R\");").append("hasFrameChanged(" + this.insight.getCurFrame().getName() + ");");
 			//String output = rJavaTranslator.getString(script.toString());
 			
 			String sync = rJavaTranslator.runRAndReturnOutput(script.toString());
 			System.err.println("Output >> " + sync);
 			if(sync.contains("true"))
 			{
 				frameChanged = true;
 				System.err.println("sync > " + sync);
 				OwlTemporalEngineMeta meta =  genNewMetaFromVariable(frame.getName());
 				// replace the meta in the R Data table
 				((RDataTable)frame).setMetaData(meta);
 			}
 		}		
 		return frameChanged;
 	}
 	
 	/////////////////////////////////////////////////////
 	
 	/*
 	 * ICodeExecution methods
 	 */

 	public void addExecutedCode(String code) {
 		if(this.codeExecuted.isEmpty()) {
 			this.codeExecuted.add("###### Code executed from " + getClass().getSimpleName() + " #######");
 		}
 		this.codeExecuted.add(code);
 	}
	
	@Override
	public String getExecutedCode() {
		StringBuffer finalScript = new StringBuffer();
		for(String c : this.codeExecuted) {
			finalScript.append(c).append("\n");
		}
		return finalScript.toString();
	}

	@Override
	public LANGUAGE getLanguage() {
		return LANGUAGE.R;
	}
	
	@Override
	public boolean isUserScript() {
		return false;
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy