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

prerna.reactor.scheduler.SchedulerHistoryReactor Maven / Gradle / Ivy

The newest version!
package prerna.reactor.scheduler;

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

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

import prerna.engine.api.IRawSelectWrapper;
import prerna.engine.impl.rdbms.RDBMSNativeEngine;
import prerna.query.querystruct.SelectQueryStruct;
import prerna.query.querystruct.filters.GenRowFilters;
import prerna.query.querystruct.filters.SimpleQueryFilter;
import prerna.query.querystruct.selectors.IQuerySort;
import prerna.query.querystruct.selectors.QueryColumnOrderBySelector;
import prerna.query.querystruct.selectors.QueryColumnSelector;
import prerna.rdf.engine.wrappers.WrapperManager;
import prerna.reactor.AbstractReactor;
import prerna.sablecc2.om.GenRowStruct;
import prerna.sablecc2.om.PixelDataType;
import prerna.sablecc2.om.ReactorKeysEnum;
import prerna.sablecc2.om.nounmeta.NounMetadata;
import prerna.sablecc2.om.task.BasicIteratorTask;
import prerna.util.Constants;
import prerna.util.Utility;

public class SchedulerHistoryReactor extends AbstractReactor {
	
	private static final Logger classLogger = LogManager.getLogger(SchedulerHistoryReactor.class);

	public SchedulerHistoryReactor() {
		this.keysToGet = new String[] {ReactorKeysEnum.FILTERS.getKey(), ReactorKeysEnum.SORT.getKey(), 
				ReactorKeysEnum.LIMIT.getKey(), ReactorKeysEnum.OFFSET.getKey(), ReactorKeysEnum.JOB_TAGS.getKey()};
	}

	@Override
	public NounMetadata execute() {
		if(Utility.schedulerForceDisable()) {
			throw new IllegalArgumentException("Scheduler is not enabled");
		}
		
		Scheduler scheduler = SchedulerFactorySingleton.getInstance().getScheduler();
		// start up scheduler if it isn't on
		SchedulerDatabaseUtility.startScheduler(scheduler);
		RDBMSNativeEngine schedulerDb = SchedulerDatabaseUtility.getSchedulerDB();

		List jobTags = getJobTags();

		SelectQueryStruct qs = new SelectQueryStruct();
		qs.addSelector(new QueryColumnSelector(SchedulerConstants.SMSS_JOB_RECIPES + "__" + SchedulerConstants.JOB_NAME));
		qs.addSelector(new QueryColumnSelector(SchedulerConstants.SMSS_JOB_RECIPES + "__" + SchedulerConstants.JOB_ID));
		qs.addSelector(new QueryColumnSelector(SchedulerConstants.SMSS_AUDIT_TRAIL + "__" + SchedulerConstants.JOB_ID));
		qs.addSelector(new QueryColumnSelector(SchedulerConstants.SMSS_AUDIT_TRAIL + "__" + SchedulerConstants.JOB_GROUP));
		qs.addSelector(new QueryColumnSelector(SchedulerConstants.SMSS_AUDIT_TRAIL + "__" + SchedulerConstants.EXECUTION_START));
		qs.addSelector(new QueryColumnSelector(SchedulerConstants.SMSS_AUDIT_TRAIL + "__" + SchedulerConstants.EXECUTION_END));
		qs.addSelector(new QueryColumnSelector(SchedulerConstants.SMSS_AUDIT_TRAIL + "__" + SchedulerConstants.EXECUTION_DELTA));
		qs.addSelector(new QueryColumnSelector(SchedulerConstants.SMSS_AUDIT_TRAIL + "__" + SchedulerConstants.SUCCESS));
		qs.addSelector(new QueryColumnSelector(SchedulerConstants.SMSS_AUDIT_TRAIL + "__" + SchedulerConstants.IS_LATEST));
		qs.addSelector(new QueryColumnSelector(SchedulerConstants.SMSS_AUDIT_TRAIL + "__" + SchedulerConstants.SCHEDULER_OUTPUT));
		qs.addRelation(SchedulerConstants.SMSS_JOB_RECIPES+"__"+SchedulerConstants.JOB_ID, SchedulerConstants.SMSS_AUDIT_TRAIL+"__"+SchedulerConstants.JOB_ID, "left.outer.join");

/*		QueryFunctionSelector tagSelector = new QueryFunctionSelector();
		tagSelector.addInnerSelector(new QueryColumnSelector(SchedulerConstants.SMSS_JOB_TAGS+ "__" + SchedulerConstants.JOB_TAG));
		tagSelector.setFunction(QueryFunctionHelper.UNIQUE_GROUP_CONCAT);
		tagSelector.setDistinct(true);
		qs.addSelector(tagSelector);
		qs.addSelector(new QueryColumnSelector(SchedulerConstants.SMSS_JOB_TAGS+ "__" + SchedulerConstants.JOB_TAG));
		qs.addGroupBy( new QueryColumnSelector(SchedulerConstants.SMSS_JOB_TAGS+ "__" + SchedulerConstants.JOB_TAG));
		qs.addGroupBy( new QueryColumnSelector(SchedulerConstants.SMSS_JOB_RECIPES+ "__" + SchedulerConstants.JOB_NAME));
		qs.addGroupBy( new QueryColumnSelector(SchedulerConstants.SMSS_AUDIT_TRAIL+ "__" + SchedulerConstants.JOB_ID));
		qs.addGroupBy( new QueryColumnSelector(SchedulerConstants.SMSS_AUDIT_TRAIL+ "__" + SchedulerConstants.EXECUTION_START));
		qs.addRelation(SchedulerConstants.SMSS_AUDIT_TRAIL+"__"+SchedulerConstants.JOB_ID, SchedulerConstants.SMSS_JOB_TAGS+"__"+SchedulerConstants.JOB_ID, "inner.join");
 */
		
		if(jobTags != null && !jobTags.isEmpty()) {
			// require specific job tags
			qs.addRelation(SchedulerConstants.SMSS_JOB_RECIPES+"__"+SchedulerConstants.JOB_ID, SchedulerConstants.SMSS_JOB_TAGS+"__"+SchedulerConstants.JOB_ID, "inner.join");
			for( String tag : jobTags ) {
				qs.addExplicitFilter(SimpleQueryFilter.makeColToValFilter(SchedulerConstants.SMSS_JOB_TAGS + "__" + SchedulerConstants.JOB_TAG, "==", tag, PixelDataType.CONST_STRING));
			}
		}

		GenRowFilters additionalFilters = getFilters();
		if(additionalFilters != null) {
			qs.mergeExplicitFilters(additionalFilters);
		}
		List sorts = getSort();
		if(sorts != null) {
			qs.setOrderBy(sorts);
		} else {
			// set default
			qs.addOrderBy(SchedulerConstants.SMSS_AUDIT_TRAIL + "__" + SchedulerConstants.EXECUTION_START, 
					QueryColumnOrderBySelector.ORDER_BY_DIRECTION.DESC.toString());
		}
		qs.setLimit(getLimit());
		qs.setOffSet(getOffset());

		IRawSelectWrapper iterator = null;
		try {
			iterator = WrapperManager.getInstance().getRawWrapper(schedulerDb, qs);
		} catch (Exception e) {
			classLogger.error(Constants.STACKTRACE, e);
			String message = e.getMessage();
			if(message == null || message.isEmpty()) {
				throw new IllegalArgumentException(message);
			} else {
				throw new IllegalArgumentException("An error occurred attempting to get your requests");
			}
		}
		BasicIteratorTask task = new BasicIteratorTask(qs, iterator);
		task.setNumCollect(-1);
		return new NounMetadata(task, PixelDataType.FORMATTED_DATA_SET);
	}
	
	////////////////////////////////////////////////////////////////////////////////////
	/*
	 * Additional inputs for filtering
	 */
	
	protected GenRowFilters getFilters() {
		GenRowStruct inputsGRS = this.store.getNoun(ReactorKeysEnum.FILTERS.getKey());
		if (inputsGRS != null && !inputsGRS.isEmpty()) {
			NounMetadata filterNoun = inputsGRS.getNoun(0);
			SelectQueryStruct qs = (SelectQueryStruct) filterNoun.getValue();
			GenRowFilters filters = qs.getCombinedFilters();
			return filters;
		}
		return null;
	}

	protected List getSort() {
		GenRowStruct inputsGRS = this.store.getNoun(ReactorKeysEnum.SORT.getKey());
		if (inputsGRS != null && !inputsGRS.isEmpty()) {
			NounMetadata sortNoun = inputsGRS.getNoun(0);
			SelectQueryStruct qs = (SelectQueryStruct) sortNoun.getValue();
			List orderBy = qs.getOrderBy();
			return orderBy;
		}
		return null;
	}

	protected int getLimit() {
		GenRowStruct inputsGRS = this.store.getNoun(ReactorKeysEnum.LIMIT.getKey());
		if (inputsGRS != null && !inputsGRS.isEmpty()) {
			NounMetadata limitNoun = inputsGRS.getNoun(0);
			return ((Number) limitNoun.getValue()).intValue();
		}
		return -1;
	}

	protected int getOffset() {
		GenRowStruct inputsGRS = this.store.getNoun(ReactorKeysEnum.OFFSET.getKey());
		if (inputsGRS != null && !inputsGRS.isEmpty()) {
			NounMetadata offsetNoun = inputsGRS.getNoun(0);
			return ((Number) offsetNoun.getValue()).intValue();
		}
		return -1;
	}
	
	private List getJobTags() {
		List jobTags = null;
		GenRowStruct grs= this.store.getNoun(ReactorKeysEnum.JOB_TAGS.getKey());
		if(grs != null && !grs.isEmpty()) {
			jobTags = new ArrayList<>();
			int size = grs.size();
			for(int i = 0; i < size; i++) {
				jobTags.add( grs.get(i)+"" );
			}
		}
		return jobTags;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy