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

prerna.reactor.qs.ExecQueryReactor Maven / Gradle / Ivy

The newest version!
package prerna.reactor.qs;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import prerna.algorithm.api.ITableDataFrame;
import prerna.auth.User;
import prerna.auth.utils.SecurityEngineUtils;
import prerna.cluster.util.ClusterUtil;
import prerna.ds.rdbms.AbstractRdbmsFrame;
import prerna.engine.api.IDatabaseEngine;
import prerna.engine.impl.rdbms.AuditDatabase;
import prerna.query.querystruct.AbstractQueryStruct;
import prerna.query.querystruct.AbstractQueryStruct.QUERY_STRUCT_TYPE;
import prerna.query.querystruct.HardSelectQueryStruct;
import prerna.query.querystruct.SelectQueryStruct;
import prerna.query.querystruct.delete.DeleteSqlInterpreter;
import prerna.query.querystruct.transform.QSAliasToPhysicalConverter;
import prerna.query.querystruct.update.UpdateQueryStruct;
import prerna.query.querystruct.update.UpdateSqlInterpreter;
import prerna.reactor.AbstractReactor;
import prerna.sablecc2.om.GenRowStruct;
import prerna.sablecc2.om.PixelDataType;
import prerna.sablecc2.om.PixelOperationType;
import prerna.sablecc2.om.ReactorKeysEnum;
import prerna.sablecc2.om.execptions.SemossPixelException;
import prerna.sablecc2.om.nounmeta.NounMetadata;
import prerna.util.Constants;

public class ExecQueryReactor extends AbstractReactor {

	private static final Logger logger = LogManager.getLogger(ExecQueryReactor.class);

	private NounMetadata qStruct = null;

	public ExecQueryReactor() {
		this.keysToGet = new String[] { ReactorKeysEnum.QUERY_STRUCT.getKey(), "commit", ReactorKeysEnum.CUSTOM_SUCCESS_MESSAGE.getKey()};
	}

	@Override
	public NounMetadata execute() {
		if (qStruct == null) {
			qStruct = getQueryStruct();
		}

		GenRowStruct commitGrs = this.store.getNoun("commit");
		Boolean commit = false;
		if(commitGrs != null && !commitGrs.isEmpty()) {
			commit = Boolean.parseBoolean(commitGrs.get(0) + "");
		}
		
		IDatabaseEngine engine = null;
		ITableDataFrame frame = null;
		AbstractQueryStruct qs = null;
		String userId = "user not defined";

		if (qStruct.getValue() instanceof AbstractQueryStruct) {
			qs = ((AbstractQueryStruct) qStruct.getValue());
			if (qs.getQsType() == QUERY_STRUCT_TYPE.ENGINE || qs.getQsType() == QUERY_STRUCT_TYPE.RAW_ENGINE_QUERY) {
				engine = qs.retrieveQueryStructEngine();
				if (!(engine.getDatabaseType() == IDatabaseEngine.DATABASE_TYPE.RDBMS
						|| engine.getDatabaseType() == IDatabaseEngine.DATABASE_TYPE.SESAME
						|| engine.getDatabaseType() == IDatabaseEngine.DATABASE_TYPE.JENA)
						) {
					throw new IllegalArgumentException("Query update/deletes only works for rdbms/rdf databases");
				}

				// If an engine and the user is defined, then grab it for the audit log
				User user = this.insight.getUser();
				if (user != null) {
					userId = user.getAccessToken(user.getLogins().get(0)).getId();
				}

				// check that the user can edit the engine
				if (!SecurityEngineUtils.userCanEditEngine(user, engine.getEngineId())) {
					throw new IllegalArgumentException("User does not have permission to exec query for this app");
				}
			} else if (qs.getQsType() == QUERY_STRUCT_TYPE.FRAME) {
				frame = qs.getFrame();
				if (!(frame instanceof AbstractRdbmsFrame)) {
					throw new IllegalArgumentException("Query update/deletes only works for sql frames");
				}
				// convert any aliases the FE is using from the frame
				qs = QSAliasToPhysicalConverter.getPhysicalQs(qs, frame.getMetaData());
			}
		} else {
			throw new IllegalArgumentException("Input to exec query requires a query struct");
		}

		boolean update = false;
		boolean custom = false;
		String query = null;
		// grab query && determine how to store in audit db
		if (qs instanceof HardSelectQueryStruct) {
			query = ((HardSelectQueryStruct) qs).getQuery();
			custom = true;
		} else if (qs instanceof UpdateQueryStruct) {
			UpdateSqlInterpreter interp = new UpdateSqlInterpreter((UpdateQueryStruct) qs);
			interp.setUserId(userId);
			query = interp.composeQuery();
			update = true;
		} else if (qs instanceof SelectQueryStruct) {
			DeleteSqlInterpreter interp = new DeleteSqlInterpreter((SelectQueryStruct) qs);
			query = interp.composeQuery();
			update = false;
		}

		logger.info("EXEC QUERY.... " + query);
		if (qs.getQsType() == QUERY_STRUCT_TYPE.ENGINE || qs.getQsType() == QUERY_STRUCT_TYPE.RAW_ENGINE_QUERY) {
			if(engine == null) {
				throw new NullPointerException("No engine passed in to execute the query");
			}
			try {
				engine.insertData(query);
				if(commit) {
					engine.commit();
				}
			} catch (Exception e) {
				logger.error(Constants.STACKTRACE, e);
				String errorMessage = "An error occurred trying to execute the query in the database";
				if(e.getMessage() != null && !e.getMessage().isEmpty()) {
					errorMessage += ": " + e.getMessage();
				}
				throw new SemossPixelException(NounMetadata.getErrorNounMessage(errorMessage));
			}
			// store query in audit db
			AuditDatabase audit = engine.generateAudit();
			if (custom) {
				audit.storeQuery(userId, query);
			} else {
				if (update) {
					audit.auditUpdateQuery((UpdateQueryStruct) qs, userId, query);
				} else {
					audit.auditDeleteQuery((SelectQueryStruct) qs, userId, query);
				}
			}

			ClusterUtil.pushEngine(engine.getEngineId());
		} else {
			try {
				if (frame != null) {
					((AbstractRdbmsFrame) frame).getBuilder().runQuery(query);
				}
			} catch (Exception e) {
				logger.error(Constants.STACKTRACE, e);
				String errorMessage = "An error occurred trying to update the frame";
				if(e.getMessage() != null && !e.getMessage().isEmpty()) {
					errorMessage += ": " + e.getMessage();
				}
				throw new SemossPixelException(NounMetadata.getErrorNounMessage(errorMessage));
			}
		}

		NounMetadata noun = new NounMetadata(true, PixelDataType.BOOLEAN, PixelOperationType.ALTER_DATABASE, PixelOperationType.FORCE_SAVE_DATA_TRANSFORMATION);
		String customSuccessMessage = getCustomSuccessMessage();
		if(customSuccessMessage != null && !customSuccessMessage.isEmpty()) {
			noun.addAdditionalReturn(NounMetadata.getSuccessNounMessage(customSuccessMessage));
		}
		return noun;
	}

	/**
	 * 
	 * @return
	 */
	private NounMetadata getQueryStruct() {
		NounMetadata object = new NounMetadata(null, PixelDataType.QUERY_STRUCT);
		GenRowStruct allNouns = getNounStore().getNoun(PixelDataType.QUERY_STRUCT.getKey());
		NounMetadata f = new NounMetadata(false, PixelDataType.BOOLEAN);
		if (allNouns != null) {
			object = allNouns.getNoun(0);
			return object;
		}
		return f;
	}
	
	/**
	 * 
	 * @return
	 */
	public String getCustomSuccessMessage() {
		GenRowStruct grs = this.store.getNoun(ReactorKeysEnum.CUSTOM_SUCCESS_MESSAGE.getKey());
		if(grs != null && !grs.isEmpty()) {
			return (String) grs.get(0);
		}
		
		return null;
	}

	/**
	 * 
	 * @param qs
	 */
	public void setQueryStruct(NounMetadata qs) {
		this.qStruct = qs;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy