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

prerna.reactor.imports.union.RUnion Maven / Gradle / Ivy

The newest version!
package prerna.reactor.imports.union;

import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

import org.apache.logging.log4j.Logger;

import prerna.algorithm.api.ITableDataFrame;
import prerna.ds.OwlTemporalEngineMeta;
import prerna.ds.r.RDataTable;
import prerna.om.HeadersException;
import prerna.om.Insight;
import prerna.reactor.frame.r.util.AbstractRJavaTranslator;
import prerna.reactor.imports.ImportUtility;
import prerna.sablecc2.om.execptions.SemossPixelException;

/**
 * Concrete R union class.
 *
 */
public class RUnion extends AbstractUnion{
	
	private AbstractRJavaTranslator rJavaTranslator;
	private Logger logger;
	private Map colMappings;
	
	public RUnion() {
		
	}

	@Override
	public ITableDataFrame performUnion(ITableDataFrame a, ITableDataFrame b, String unionType, Insight insight, Logger logger) {
		List aCols = getSemossCols(a.getQsHeaders());
		List bCols = getSemossCols(b.getQsHeaders());
		checkRBaseCases(a, b, aCols, bCols);
		this.logger = logger;
		this.rJavaTranslator = insight.getRJavaTranslator(logger);
		ITableDataFrame[] frameArr;
		try {
			frameArr = matchColMetadata(insight, a, b, aCols, bCols);
		} catch (Exception e) {
			throw new SemossPixelException("Union frame array does not contain the frames for union.");
		}
		unionR(unionType, frameArr[0].getName(), frameArr[1].getName(), insight);
		return a;
	}
	
	/**
	 * This method takes both the frames and runs the union script
	 * in the R interpretor.
	 * 
	 * @param unionType
	 * @param frameA
	 * @param frameB
	 * @return
	 */
	
	private void unionR(String unionType, String frameA, String frameB, Insight insight) {
		StringBuilder script = new StringBuilder();
		//String retVar = "Union_Frame_" + Utility.getRandomString(5);
		String uType = null;
		if(unionType.equals("union")) {
			uType = "union";
		}else {
			uType = "union_all";
		}
		script.append(frameA).append("<-").append(uType).append("(").append(frameA).append(",").append(frameB).append(")");
		rJavaTranslator.runR(script.toString());
		//return frameA;
		//return createNewFrameFromVariable(retVar, insight);
	}
	
	/********************************************
	 * 
	 * Helper methods to flush R data into new
	 * variables.
	 * 
	 * ******************************************
	 */
	
	protected RDataTable createNewFrameFromVariable(String frameName, Insight insight) {
		// create new frame
		RDataTable newTable = new RDataTable(insight.getRJavaTranslator(logger), frameName);
		OwlTemporalEngineMeta meta = genNewMetaFromVariable(frameName);
		newTable.setMetaData(meta);
		return newTable;
	}
	
	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;
	}
	
	public String[] getColumns(String frameName) {
		return this.rJavaTranslator.getColumns(frameName);
	}

	public String[] getColumnTypes(String frameName) {
		return this.rJavaTranslator.getColumnTypes(frameName);
	}

	private ITableDataFrame[] matchColMetadata(Insight insight, ITableDataFrame a, ITableDataFrame b, List aCols, List bCols) throws Exception {
		
		//ITableDataFrame aTemp = CopyFrameUtil.copyFrame(insight, a, -1);
		//ITableDataFrame bTemp = CopyFrameUtil.copyFrame(insight, b, -1);
		
		//if(colMappings != null) {
			for(String col : aCols) {
				if(!colMappings.containsKey(col)) {
					deleteFrameCols(a, col);
				}
			}
			
			Set colBSet = new HashSet<>(colMappings.values().stream().map(String :: trim).collect(Collectors.toList()));
			for(String col : bCols) {
				if(!colBSet.contains(col)) {
					deleteFrameCols(b, col);
				}
			}
		//}
//		for(Entry entry : colMappings.entrySet()) {
//			String leftColNm = entry.getKey();
//			String rightColNm = entry.getValue();
//			renameCol(b, leftColNm, rightColNm);
//		}
		realignCols(a, b, aCols, bCols); 
		
		return new ITableDataFrame[] {a, b};
		
	}
	
	private void realignCols(ITableDataFrame a, ITableDataFrame b, List aCols, List bCols) {
		String dfName = a.getName();
		String script = new StringBuilder().append(dfName).append("<-").append(dfName).append("[, c(").append(aCols).append(")]").toString();
		logger.info(script);
		rJavaTranslator.runR(script);
		dfName = b.getName();
		script = new StringBuilder().append(dfName).append("<-").append(dfName).append("[, c(").append(bCols).append(")]").toString();
		logger.info(script);
		rJavaTranslator.runR(script);
	}
	
	public void setColMapping(Map colMappings) {
		this.colMappings = colMappings;
	}
	
	private void renameCol(ITableDataFrame frame, String leftCol, String rightCol) {
		String script = new StringBuilder().append(frame.getName()).append("<-").append(frame.getName()).append(" %>% ")
				.append("rename(").append(leftCol).append("=").append(rightCol).append(")").toString();
		rJavaTranslator.runR(script);
		OwlTemporalEngineMeta metadata = frame.getMetaData();
		frame.syncHeaders();
	}

	
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy