
prerna.reactor.frame.rdbms.JoinColumnsReactor Maven / Gradle / Ivy
The newest version!
package prerna.reactor.frame.rdbms;
import java.util.Arrays;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import prerna.algorithm.api.SemossDataType;
import prerna.ds.OwlTemporalEngineMeta;
import prerna.ds.rdbms.AbstractRdbmsFrame;
import prerna.reactor.frame.AbstractFrameReactor;
import prerna.sablecc2.om.GenRowStruct;
import prerna.sablecc2.om.PixelDataType;
import prerna.sablecc2.om.PixelOperationType;
import prerna.sablecc2.om.nounmeta.NounMetadata;
import prerna.util.Constants;
public class JoinColumnsReactor extends AbstractFrameReactor {
private static final Logger classLogger = LogManager.getLogger(JoinColumnsReactor.class);
@Override
public NounMetadata execute() {
// JoinColumns("newColumnName", "separator", Col1, Col2...);
AbstractRdbmsFrame frame = (AbstractRdbmsFrame) getFrame();
GenRowStruct inputsGRS = this.getCurRow();
if (inputsGRS != null && !inputsGRS.isEmpty()) {
// get new column name
NounMetadata colNameNoun = inputsGRS.getNoun(0);
String colName = colNameNoun.getValue() + "";
// make sql data type
String dataType = frame.getQueryUtil().cleanType(SemossDataType.STRING.toString());
String table = frame.getName();
// validate new column name
colName = getCleanNewColName(frame, colName);
// create sql statement to add new column
String addColumn = "ALTER TABLE " + table + " ADD " + colName + " " + dataType + ";";
// prepare separator for sql
String separator = String.valueOf(inputsGRS.getNoun(1).getValue());
if (separator.contains("'")) {
separator = separator.replaceAll("'", "''");
}
separator = "'" + separator + "'";
// update new column with concatenated values col1 + separator col2 ...
String updateColumn = "UPDATE " + table + " SET " + colName + " = CONCAT (";
for (int i = 2; i < inputsGRS.size(); i++) {
String column = inputsGRS.getNoun(i).getValue() + "";
// Clean column
if (column.contains("__")) {
String[] split = column.split("__");
column = split[1];
}
// if only one column
if (inputsGRS.size() == 3) {
updateColumn += column + " , " + separator;
} else if (i == inputsGRS.size() - 1) {
updateColumn += column;
} else {
updateColumn += column + " , " + separator + " , ";
}
// does the column exist?
String[] existCols = getColNames(frame);
if (Arrays.asList(existCols).contains(column) != true) {
throw new IllegalArgumentException("Column: " + column + " doesn't exist.");
}
}
updateColumn += ");";
try {
frame.getBuilder().runQuery(addColumn + updateColumn);
// set metadata for new column
OwlTemporalEngineMeta metaData = frame.getMetaData();
metaData.addProperty(table, table + "__" + colName);
metaData.setAliasToProperty(table + "__" + colName, colName);
metaData.setDataTypeToProperty(table + "__" + colName, dataType);
frame.syncHeaders();
} catch (Exception e) {
classLogger.error(Constants.STACKTRACE, e);
}
}
return new NounMetadata(frame, PixelDataType.FRAME, PixelOperationType.FRAME_DATA_CHANGE);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy