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

prerna.reactor.ReactorFactory Maven / Gradle / Ivy

The newest version!
package prerna.reactor;

import java.io.File;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;

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

import com.fasterxml.jackson.databind.ObjectMapper;

import io.github.classgraph.ClassGraph;
import io.github.classgraph.ClassInfoList;
import io.github.classgraph.ScanResult;
import prerna.algorithm.api.ITableDataFrame;
import prerna.aws.s3.PushAssetToS3Reactor;
import prerna.aws.s3.S3FileRetrieverReactor;
import prerna.aws.s3.S3ListBucketsReactor;
import prerna.aws.s3.S3ListFilesReactor;
import prerna.date.reactor.DateReactor;
import prerna.date.reactor.DayReactor;
import prerna.date.reactor.MonthReactor;
import prerna.date.reactor.WeekReactor;
import prerna.date.reactor.YearReactor;
import prerna.ds.TinkerFrame;
import prerna.ds.nativeframe.NativeFrame;
import prerna.ds.py.PandasFrame;
import prerna.ds.r.RDataTable;
import prerna.ds.rdbms.AbstractRdbmsFrame;
import prerna.engine.api.IEngine;
import prerna.forms.UpdateFormReactor;
import prerna.io.connector.surveymonkey.SurveyMonkeyListSurveysReactor;
import prerna.poi.main.helper.excel.GetExcelFormReactor;
import prerna.query.querystruct.delete.DeleteReactor;
import prerna.query.querystruct.update.reactors.UpdateReactor;
import prerna.reactor.algorithms.CreateNLPVizReactor;
import prerna.reactor.algorithms.NLPInstanceCacheReactor;
import prerna.reactor.algorithms.NLSQueryHelperReactor;
import prerna.reactor.algorithms.NaturalLanguageSearchReactor;
import prerna.reactor.algorithms.RAlgReactor;
import prerna.reactor.algorithms.RatioReactor;
import prerna.reactor.algorithms.RunAnomalyReactor;
import prerna.reactor.algorithms.RunClusteringReactor;
import prerna.reactor.algorithms.RunLOFReactor;
import prerna.reactor.algorithms.RunMatrixRegressionReactor;
import prerna.reactor.algorithms.RunMultiClusteringReactor;
import prerna.reactor.algorithms.RunNumericalCorrelationReactor;
import prerna.reactor.algorithms.RunOutlierReactor;
import prerna.reactor.algorithms.RunSimilarityReactor;
import prerna.reactor.algorithms.UpdateNLPHistoryReactor;
import prerna.reactor.algorithms.dataquality.GetDQRulesReactor;
import prerna.reactor.algorithms.dataquality.RunDataQualityReactor;
import prerna.reactor.algorithms.xray.GetCSVSchemaReactor;
import prerna.reactor.algorithms.xray.GetLocalSchemaReactor;
import prerna.reactor.algorithms.xray.GetXLSchemaReactor;
import prerna.reactor.algorithms.xray.GetXrayConfigFileReactor;
import prerna.reactor.algorithms.xray.GetXrayConfigListReactor;
import prerna.reactor.cluster.CleanUpDatabasesReactor;
import prerna.reactor.cluster.OpenDatabaseReactor;
import prerna.reactor.cluster.VersionReactor;
import prerna.reactor.database.DatabaseColumnUniqueReactor;
import prerna.reactor.database.metaeditor.GetOwlDescriptionsReactor;
import prerna.reactor.database.metaeditor.GetOwlDictionaryReactor;
import prerna.reactor.database.metaeditor.GetOwlLogicalNamesReactor;
import prerna.reactor.database.metaeditor.GetOwlMetamodelReactor;
import prerna.reactor.database.metaeditor.ReloadDatabaseOwlReactor;
import prerna.reactor.database.metaeditor.concepts.AddOwlConceptReactor;
import prerna.reactor.database.metaeditor.concepts.EditOwlConceptConceptualNameReactor;
import prerna.reactor.database.metaeditor.concepts.EditOwlConceptDataTypeReactor;
import prerna.reactor.database.metaeditor.concepts.RemoveOwlConceptReactor;
import prerna.reactor.database.metaeditor.meta.AddOwlDescriptionReactor;
import prerna.reactor.database.metaeditor.meta.AddOwlLogicalNamesReactor;
import prerna.reactor.database.metaeditor.meta.EditOwlDescriptionReactor;
import prerna.reactor.database.metaeditor.meta.EditOwlLogicalNamesReactor;
import prerna.reactor.database.metaeditor.meta.RemoveOwlDescriptionReactor;
import prerna.reactor.database.metaeditor.meta.RemoveOwlLogicalNamesReactor;
import prerna.reactor.database.metaeditor.properties.AddOwlPropertyReactor;
import prerna.reactor.database.metaeditor.properties.EditOwlPropertyConceptualNameReactor;
import prerna.reactor.database.metaeditor.properties.EditOwlPropertyDataTypeReactor;
import prerna.reactor.database.metaeditor.properties.RemoveOwlPropertyReactor;
import prerna.reactor.database.metaeditor.relationships.AddBulkOwlRelationshipsReactor;
import prerna.reactor.database.metaeditor.relationships.AddOwlRelationshipReactor;
import prerna.reactor.database.metaeditor.relationships.RemoveOwlRelationshipReactor;
import prerna.reactor.database.metaeditor.routines.FindDirectOwlRelationshipsReactor;
import prerna.reactor.database.metaeditor.routines.FindIndirectOwlRelationshipsReactor;
import prerna.reactor.database.metaeditor.routines.FindSemanticColumnOwlRelationshipsReactor;
import prerna.reactor.database.metaeditor.routines.FindSemanticInstanceOwlRelationshipsReactor;
import prerna.reactor.database.metaeditor.routines.PredictOwlDescriptionReactor;
import prerna.reactor.database.metaeditor.routines.PredictOwlLogicalNamesReactor;
import prerna.reactor.database.upload.CheckHeadersReactor;
import prerna.reactor.database.upload.ParseMetamodelReactor;
import prerna.reactor.database.upload.PredictDataTypesReactor;
import prerna.reactor.database.upload.PredictExcelDataTypesReactor;
import prerna.reactor.database.upload.PredictExcelRangeMetadataReactor;
import prerna.reactor.database.upload.PredictMetamodelReactor;
import prerna.reactor.database.upload.gremlin.external.CreateExternalDSEGraphDatabaseReactor;
import prerna.reactor.database.upload.gremlin.external.CreateExternalGraphDatabaseReactor;
import prerna.reactor.database.upload.gremlin.external.CreateJanusGraphDatabaseReactor;
import prerna.reactor.database.upload.gremlin.external.GetDSEGraphMetaModelReactor;
import prerna.reactor.database.upload.gremlin.external.GetDSEGraphPropertiesReactor;
import prerna.reactor.database.upload.gremlin.external.GetGraphMetaModelReactor;
import prerna.reactor.database.upload.gremlin.external.GetGraphPropertiesReactor;
import prerna.reactor.database.upload.gremlin.external.GetJanusGraphMetaModelReactor;
import prerna.reactor.database.upload.gremlin.external.GetJanusGraphPropertiesReactor;
import prerna.reactor.database.upload.gremlin.file.TinkerCsvUploadReactor;
import prerna.reactor.database.upload.rdbms.csv.RdbmsCsvUploadReactor;
import prerna.reactor.database.upload.rdbms.csv.RdbmsUploadTableDataReactor;
import prerna.reactor.database.upload.rdbms.excel.RdbmsLoaderSheetUploadReactor;
import prerna.reactor.database.upload.rdbms.excel.RdbmsUploadExcelDataReactor;
import prerna.reactor.database.upload.rdbms.external.ExternalJdbcSchemaReactor;
import prerna.reactor.database.upload.rdbms.external.ExternalJdbcTablesAndViewsReactor;
import prerna.reactor.database.upload.rdbms.external.RdbmsExternalUploadReactor;
import prerna.reactor.database.upload.rdf.RdfCsvUploadReactor;
import prerna.reactor.database.upload.rdf.RdfLoaderSheetUploadReactor;
import prerna.reactor.export.AsTaskReactor;
import prerna.reactor.export.CollectAllReactor;
import prerna.reactor.export.CollectGraphReactor;
import prerna.reactor.export.CollectReactor;
import prerna.reactor.export.DropBoxUploaderReactor;
import prerna.reactor.export.EmptyDataReactor;
import prerna.reactor.export.GoogleUploaderReactor;
import prerna.reactor.export.GrabScalarElementReactor;
import prerna.reactor.export.IterateReactor;
import prerna.reactor.export.OneDriveUploaderReactor;
import prerna.reactor.export.ToCsvReactor;
import prerna.reactor.export.ToDatabaseReactor;
import prerna.reactor.export.ToExcelReactor;
import prerna.reactor.export.ToLoaderSheetReactor;
import prerna.reactor.export.ToS3Reactor;
import prerna.reactor.export.ToTsvReactor;
import prerna.reactor.export.ToTxtReactor;
import prerna.reactor.expression.IfError;
import prerna.reactor.expression.OpAbsolute;
import prerna.reactor.expression.OpArrayLength;
import prerna.reactor.expression.OpAsString;
import prerna.reactor.expression.OpConcat;
import prerna.reactor.expression.OpContains;
import prerna.reactor.expression.OpIsEmpty;
import prerna.reactor.expression.OpIsObjectEmpty;
import prerna.reactor.expression.OpLarge;
import prerna.reactor.expression.OpLen;
import prerna.reactor.expression.OpList;
import prerna.reactor.expression.OpMatch;
import prerna.reactor.expression.OpMax;
import prerna.reactor.expression.OpMean;
import prerna.reactor.expression.OpMedian;
import prerna.reactor.expression.OpMin;
import prerna.reactor.expression.OpNotEmpty;
import prerna.reactor.expression.OpPaste;
import prerna.reactor.expression.OpPaste0;
import prerna.reactor.expression.OpPower;
import prerna.reactor.expression.OpRound;
import prerna.reactor.expression.OpSmall;
import prerna.reactor.expression.OpSum;
import prerna.reactor.expression.OpSumIf;
import prerna.reactor.expression.OpSumIfs;
import prerna.reactor.expression.OpSumProduct;
import prerna.reactor.expression.filter.OpAnd;
import prerna.reactor.expression.filter.OpOr;
import prerna.reactor.federation.FederationBestMatches;
import prerna.reactor.federation.FederationBlend;
import prerna.reactor.federation.FuzzyMatchesReactor;
import prerna.reactor.federation.FuzzyMergeReactor;
import prerna.reactor.frame.CreateFrameReactor;
import prerna.reactor.frame.CurrentFrameReactor;
import prerna.reactor.frame.FrameHeaderExistsReactor;
import prerna.reactor.frame.FrameHeadersReactor;
import prerna.reactor.frame.FrameTypeReactor;
import prerna.reactor.frame.HasDuplicatesReactor;
import prerna.reactor.frame.SetCurrentFrameReactor;
import prerna.reactor.frame.convert.ConvertReactor;
import prerna.reactor.frame.filter.AddFrameFilterReactor;
import prerna.reactor.frame.filter.DeleteFrameFilterReactor;
import prerna.reactor.frame.filter.GetFrameFiltersReactor;
import prerna.reactor.frame.filter.RemoveFrameFilterReactor;
import prerna.reactor.frame.filter.ReplaceFrameFilterReactor;
import prerna.reactor.frame.filter.SetFrameFilterReactor;
import prerna.reactor.frame.filter.UnfilterFrameReactor;
import prerna.reactor.frame.filtermodel.FrameFilterModelFilteredValuesReactor;
import prerna.reactor.frame.filtermodel.FrameFilterModelNumericRangeReactor;
import prerna.reactor.frame.filtermodel.FrameFilterModelReactor;
import prerna.reactor.frame.filtermodel.FrameFilterModelVisibleValuesReactor;
import prerna.reactor.frame.graph.ConnectedNodesReactor;
import prerna.reactor.frame.graph.FindPathsConnectingGroupsReactor;
import prerna.reactor.frame.graph.FindPathsConnectingNodesReactor;
import prerna.reactor.frame.graph.RemoveIntermediaryNodeReactor;
import prerna.reactor.frame.graph.r.ChangeGraphLayoutReactor;
import prerna.reactor.frame.graph.r.ClusterGraphReactor;
import prerna.reactor.frame.graph.r.NodeDetailsReactor;
import prerna.reactor.frame.py.GenerateFrameFromPyVariableReactor;
import prerna.reactor.frame.r.GenerateFrameFromRVariableReactor;
import prerna.reactor.frame.r.GenerateH2FrameFromRVariableReactor;
import prerna.reactor.frame.r.SemanticBlendingReactor;
import prerna.reactor.frame.r.SemanticDescription;
import prerna.reactor.frame.r.analytics.RunAssociatedLearningReactor;
import prerna.reactor.frame.r.analytics.RunClassificationReactor;
import prerna.reactor.imports.ImportReactor;
import prerna.reactor.imports.MergeReactor;
import prerna.reactor.insights.ClearInsightReactor;
import prerna.reactor.insights.CurrentVariablesReactor;
import prerna.reactor.insights.DropInsightReactor;
import prerna.reactor.insights.InsightHandleReactor;
import prerna.reactor.insights.LoadInsightReactor;
import prerna.reactor.insights.OpenEmptyInsightReactor;
import prerna.reactor.insights.OpenInsightReactor;
import prerna.reactor.insights.RetrieveInsightOrnamentReactor;
import prerna.reactor.insights.SetInsightOrnamentReactor;
import prerna.reactor.insights.copy.CopyInsightReactor;
import prerna.reactor.insights.dashboard.DashboardInsightConfigReactor;
import prerna.reactor.insights.dashboard.ReloadInsightReactor;
import prerna.reactor.insights.recipemanagement.GetCurrentRecipeReactor;
import prerna.reactor.insights.recipemanagement.InsightRecipeReactor;
import prerna.reactor.insights.recipemanagement.RetrieveInsightPipelineReactor;
import prerna.reactor.insights.save.DeleteInsightCacheReactor;
import prerna.reactor.insights.save.DeleteInsightReactor;
import prerna.reactor.insights.save.SaveInsightReactor;
import prerna.reactor.insights.save.SetInsightCacheableReactor;
import prerna.reactor.insights.save.SetInsightNameReactor;
import prerna.reactor.insights.save.UpdateInsightImageReactor;
import prerna.reactor.insights.save.UpdateInsightReactor;
import prerna.reactor.job.JobReactor;
import prerna.reactor.masterdatabase.AllConceptualNamesReactor;
import prerna.reactor.masterdatabase.CLPModelReactor;
import prerna.reactor.masterdatabase.GetConceptPropertiesReactor;
import prerna.reactor.masterdatabase.GetDatabaseConceptsReactor;
import prerna.reactor.masterdatabase.GetDatabaseConnectionsReactor;
import prerna.reactor.masterdatabase.GetDatabaseListReactor;
import prerna.reactor.masterdatabase.GetDatabaseMetamodelReactor;
import prerna.reactor.masterdatabase.GetDatabaseTableStructureReactor;
import prerna.reactor.masterdatabase.GetPhysicalToLogicalMapping;
import prerna.reactor.masterdatabase.GetPhysicalToPhysicalMapping;
import prerna.reactor.masterdatabase.GetSpecificConceptPropertiesReactor;
import prerna.reactor.masterdatabase.GetTraversalOptionsReactor;
import prerna.reactor.masterdatabase.QueryTranslatorReactor;
import prerna.reactor.masterdatabase.SyncDatabaseWithLocalMasterReactor;
import prerna.reactor.panel.AddPanelConfigReactor;
import prerna.reactor.panel.AddPanelIfAbsentReactor;
import prerna.reactor.panel.AddPanelReactor;
import prerna.reactor.panel.CachedPanelCloneReactor;
import prerna.reactor.panel.CachedPanelReactor;
import prerna.reactor.panel.CloneReactor;
import prerna.reactor.panel.ClosePanelReactor;
import prerna.reactor.panel.GetPanelIdReactor;
import prerna.reactor.panel.InsightPanelIds;
import prerna.reactor.panel.PanelExistsReactor;
import prerna.reactor.panel.PanelReactor;
import prerna.reactor.panel.SetPanelLabelReactor;
import prerna.reactor.panel.SetPanelPositionReactor;
import prerna.reactor.panel.SetPanelViewReactor;
import prerna.reactor.panel.comments.AddPanelCommentReactor;
import prerna.reactor.panel.comments.RemovePanelCommentReactor;
import prerna.reactor.panel.comments.RetrievePanelCommentReactor;
import prerna.reactor.panel.comments.UpdatePanelCommentReactor;
import prerna.reactor.panel.events.AddPanelEventsReactor;
import prerna.reactor.panel.events.RemovePanelEventsReactor;
import prerna.reactor.panel.events.ResetPanelEventsReactor;
import prerna.reactor.panel.events.RetrievePanelEventsReactor;
import prerna.reactor.panel.external.OpenTabReactor;
import prerna.reactor.panel.filter.AddPanelFilterReactor;
import prerna.reactor.panel.filter.SetPanelFilterReactor;
import prerna.reactor.panel.filter.UnfilterPanelReactor;
import prerna.reactor.panel.ornaments.AddPanelOrnamentsReactor;
import prerna.reactor.panel.ornaments.RemovePanelOrnamentsReactor;
import prerna.reactor.panel.ornaments.ResetPanelOrnamentsReactor;
import prerna.reactor.panel.ornaments.RetrievePanelOrnamentsReactor;
import prerna.reactor.panel.rules.AddPanelColorByValueReactor;
import prerna.reactor.panel.rules.GetPanelColorByValueReactor;
import prerna.reactor.panel.rules.RemovePanelColorByValueReactor;
import prerna.reactor.panel.rules.RetrievePanelColorByValueReactor;
import prerna.reactor.panel.sort.AddPanelSortReactor;
import prerna.reactor.panel.sort.SetPanelSortReactor;
import prerna.reactor.panel.sort.UnsortPanelReactor;
import prerna.reactor.planner.GraphPlanReactor;
import prerna.reactor.project.AddDefaultInsightsReactor;
import prerna.reactor.qs.AbstractQueryStructReactor;
import prerna.reactor.qs.DistinctReactor;
import prerna.reactor.qs.ExecQueryReactor;
import prerna.reactor.qs.GroupReactor;
import prerna.reactor.qs.ImplicitFilterOverrideReactor;
import prerna.reactor.qs.InsertReactor;
import prerna.reactor.qs.JoinReactor;
import prerna.reactor.qs.LimitReactor;
import prerna.reactor.qs.OffsetReactor;
import prerna.reactor.qs.QueryAllReactor;
import prerna.reactor.qs.QueryReactor;
import prerna.reactor.qs.SortReactor;
import prerna.reactor.qs.WithReactor;
import prerna.reactor.qs.filter.HavingReactor;
import prerna.reactor.qs.filter.RegexFilterReactor;
import prerna.reactor.qs.selectors.AverageReactor;
import prerna.reactor.qs.selectors.CountReactor;
import prerna.reactor.qs.selectors.GenericSelectorFunctionReactor;
import prerna.reactor.qs.selectors.GroupConcatReactor;
import prerna.reactor.qs.selectors.LowerReactor;
import prerna.reactor.qs.selectors.MaxReactor;
import prerna.reactor.qs.selectors.MedianReactor;
import prerna.reactor.qs.selectors.MinReactor;
import prerna.reactor.qs.selectors.PColReactor;
import prerna.reactor.qs.selectors.PSelectReactor;
import prerna.reactor.qs.selectors.QuerySelectorExpressionAssimilator;
import prerna.reactor.qs.selectors.SelectReactor;
import prerna.reactor.qs.selectors.SelectTableReactor;
import prerna.reactor.qs.selectors.StandardDeviationReactor;
import prerna.reactor.qs.selectors.SumReactor;
import prerna.reactor.qs.selectors.UniqueAverageReactor;
import prerna.reactor.qs.selectors.UniqueCountReactor;
import prerna.reactor.qs.selectors.UniqueGroupConcatReactor;
import prerna.reactor.qs.selectors.UniqueSumReactor;
import prerna.reactor.qs.source.APIReactor;
import prerna.reactor.qs.source.AuditDatabaseReactor;
import prerna.reactor.qs.source.DatabaseReactor;
import prerna.reactor.qs.source.DirectJdbcConnectionReactor;
import prerna.reactor.qs.source.DropBoxFileRetrieverReactor;
import prerna.reactor.qs.source.DropBoxListFilesReactor;
import prerna.reactor.qs.source.FileReadReactor;
import prerna.reactor.qs.source.FrameReactor;
import prerna.reactor.qs.source.GoogleFileRetrieverReactor;
import prerna.reactor.qs.source.GoogleListFilesReactor;
import prerna.reactor.qs.source.JdbcSourceReactor;
import prerna.reactor.qs.source.OneDriveFileRetrieverReactor;
import prerna.reactor.qs.source.OneDriveListFilesReactor;
import prerna.reactor.qs.source.SharePointDriveSelectorReactor;
import prerna.reactor.qs.source.SharePointFileRetrieverReactor;
import prerna.reactor.qs.source.SharePointListFilesReactor;
import prerna.reactor.qs.source.SharePointSiteSelectorReactor;
import prerna.reactor.qs.source.SharePointWebDavPullReactor;
import prerna.reactor.qs.source.URLSourceReactor;
import prerna.reactor.runtime.JavaReactor;
import prerna.reactor.scheduler.ListAllJobsReactor;
import prerna.reactor.scheduler.PauseJobTriggerReactor;
import prerna.reactor.scheduler.ResumeJobTriggerReactor;
import prerna.reactor.scheduler.ScheduleJobReactor;
import prerna.reactor.security.DatabaseInfoReactor;
import prerna.reactor.security.DatabaseUsersReactor;
import prerna.reactor.security.GetInsightsReactor;
import prerna.reactor.security.MyDatabasesReactor;
import prerna.reactor.task.AutoTaskOptionsReactor;
import prerna.reactor.task.CollectMetaReactor;
import prerna.reactor.task.FormatReactor;
import prerna.reactor.task.RefreshPanelTaskReactor;
import prerna.reactor.task.RemoveTaskReactor;
import prerna.reactor.task.ResetTaskReactor;
import prerna.reactor.task.TaskOptionsReactor;
import prerna.reactor.task.TaskReactor;
import prerna.reactor.task.lambda.map.MapLambdaReactor;
import prerna.reactor.task.lambda.map.function.ApplyFormattingReactor;
import prerna.reactor.task.modifiers.CodeLambdaReactor;
import prerna.reactor.task.modifiers.FilterLambdaReactor;
import prerna.reactor.task.modifiers.FlatMapLambdaReactor;
import prerna.reactor.task.modifiers.ToNumericTypeReactor;
import prerna.reactor.task.modifiers.ToUrlTypeReactor;
import prerna.reactor.task.modifiers.TransposeRowsReactor;
import prerna.reactor.tax.RetrieveValue;
import prerna.reactor.tax.StoreValue;
import prerna.reactor.test.LSASpaceColumnLearnedReactor;
import prerna.reactor.test.RunLSILearnedReactor;
import prerna.reactor.utils.AddOperationAliasReactor;
import prerna.reactor.utils.BDelReactor;
import prerna.reactor.utils.BQReactor;
import prerna.reactor.utils.BackupDatabaseReactor;
import prerna.reactor.utils.BaddReactor;
import prerna.reactor.utils.BupdReactor;
import prerna.reactor.utils.CheckRPackagesReactor;
import prerna.reactor.utils.CheckRecommendOptimizationReactor;
import prerna.reactor.utils.DatabaseProfileReactor;
import prerna.reactor.utils.DeleteDatabaseReactor;
import prerna.reactor.utils.ExportDatabaseReactor;
import prerna.reactor.utils.ExternalDatabaseProfileReactor;
import prerna.reactor.utils.GetNumTableReactor;
import prerna.reactor.utils.GetRequestReactor;
import prerna.reactor.utils.GetTableHeader;
import prerna.reactor.utils.GetUserInfoReactor;
import prerna.reactor.utils.HelpReactor;
import prerna.reactor.utils.ImageCaptureReactor;
import prerna.reactor.utils.PostRequestReactor;
import prerna.reactor.utils.RemoveVariableReactor;
import prerna.reactor.utils.SendEmailReactor;
import prerna.reactor.utils.VariableExistsReactor;
import prerna.reactor.workflow.GetInsightDatasourcesReactor;
import prerna.reactor.workflow.GetOptimizedRecipeReactor;
import prerna.reactor.workflow.ModifyInsightDatasourceReactor;
import prerna.reactor.workspace.DeleteUserAssetReactor;
import prerna.reactor.workspace.MoveUserAssetReactor;
import prerna.reactor.workspace.NewDirReactor;
import prerna.reactor.workspace.UploadUserFileReactor;
import prerna.reactor.workspace.UserDirReactor;
import prerna.util.Constants;
import prerna.util.Utility;
import prerna.util.git.reactors.AddAppCollaborator;
import prerna.util.git.reactors.CopyAppRepo;
import prerna.util.git.reactors.DeleteAppRepo;
import prerna.util.git.reactors.DropAppRepo;
import prerna.util.git.reactors.GitStatusReactor;
import prerna.util.git.reactors.InitAppRepo;
import prerna.util.git.reactors.IsGit;
import prerna.util.git.reactors.ListAppCollaborators;
import prerna.util.git.reactors.ListAppRemotes;
import prerna.util.git.reactors.ListUserApps;
import prerna.util.git.reactors.LoginReactor;
import prerna.util.git.reactors.RemoveAppCollaborator;
import prerna.util.git.reactors.SearchAppCollaborator;
import prerna.util.git.reactors.SyncApp;
import prerna.util.git.reactors.SyncAppFiles;
import prerna.util.git.reactors.SyncAppFilesO;
import prerna.util.git.reactors.SyncAppOReactor;
import prerna.util.usertracking.reactors.ExtractDatabaseMetaReactor;
import prerna.util.usertracking.reactors.UpdateQueryDataReactor;
import prerna.util.usertracking.reactors.UpdateSemanticDataReactor;
import prerna.util.usertracking.reactors.WidgetTReactor;
import prerna.util.usertracking.reactors.recommendations.DatabaseRecommendationsReactor;
import prerna.util.usertracking.reactors.recommendations.GetDatabasesByDescriptionReactor;
import prerna.util.usertracking.reactors.recommendations.VizRecommendationsReactor;

public class ReactorFactory {

	private static final Logger classLogger = LogManager.getLogger(ReactorFactory.class);
	
	// This holds the reactors that are frame agnostic and can be used by pixel
	public static Map reactorHash;

	// This holds the reactors that are expressions
	// example Sum, Max, Min
	// the reactors will handle how to execute
	// if it can be run via the frame (i.e. sql/gremlin) or needs to run external
	public static Map expressionHash;

	// this holds that base package name for frame specific reactors
	public static Map rFrameHash;
	public static Map pandasFrameHash;
	public static Map h2FrameHash;
	public static Map tinkerFrameHash;
	public static Map nativeFrameHash;
	
	public static Map  reactors = new HashMap();
	
	public static List  nmList = new ArrayList();
	public static List  classList = new ArrayList();
	public static boolean write = true;
	
	static {
		reactorHash = new HashMap();
		createReactorHash(reactorHash);
		// build expression hash
		expressionHash = new HashMap();
		populateExpressionSet(expressionHash);
		// populate the frame specific hashes
		rFrameHash = new HashMap();
		//populateRFrameHash(rFrameHash);
		pandasFrameHash = new HashMap();
		//populatePandasFrameHash(pandasFrameHash);
		h2FrameHash = new HashMap();
		//populateH2FrameHash(h2FrameHash);
		tinkerFrameHash = new HashMap();
		//populateTinkerFrameHash(tinkerFrameHash);
		nativeFrameHash = new HashMap();
		//populateNativeFrameHash(nativeFrameHash);

		
		String additionalReactorsPath = "";
		try {
			additionalReactorsPath = Utility.getDIHelperProperty(Constants.ADDITIONAL_REACTORS);
			if(additionalReactorsPath != null) {
				classLogger.info("Loading additional reactors from file");
				File f = new File(additionalReactorsPath);
				if(f.exists()) {
					loadAdditionalReactor(f);
				}
			}
		} catch(Exception e) {
			// ignore
			// this would only be null during testing
			// and DIHelper isn't loaded
			// hopefully you dont have anything in a prop file you care about
			// or update the var directly
		}
		
		// load it through the inspect
		List packagesToLoad = new ArrayList<>();
		packagesToLoad.add("prerna");
		String additionalPackages = null;
		try {
			additionalPackages = Utility.getDIHelperProperty(Constants.ADDITIONAL_REACTOR_PACKAGES);
			if(additionalPackages != null && !(additionalPackages=additionalPackages.trim()).isEmpty()) {
				classLogger.info("Loading additional reactors from packages [" + additionalPackages + "]");
				String[] packagesArr = additionalPackages.split(",");
				for(String thisPackage : packagesArr) {
					if(!(thisPackage=thisPackage.trim()).isEmpty()) {
						packagesToLoad.add(thisPackage);
					}
				}
			}
		} catch(Exception e) {
			// ignore
			// this would only be null during testing
			// and DIHelper isn't loaded
			// hopefully you dont have anything in a prop file you care about
			// or update the var directly
		}
		
		loadFromCP(packagesToLoad.toArray(new String[] {}));
	}
	
//	public static void main(String [] args)
//	{
//		// print the inconsistencies
//		
//		printInconsistency("Generic", reactorHash);
//		printInconsistency("h2", h2FrameHash);
//		printInconsistency("R", rFrameHash);
//		printInconsistency("Pandas", pandasFrameHash);
//	}
	
	public static void printInconsistency(String mapname, Map map)
	{
		
		Iterator keys = map.keySet().iterator();
		
		System.out.println(mapname);
		System.out.println("-----------");
		
		while(keys.hasNext())
		{
			String key = (String)keys.next();
			Class value = (Class)map.get(key);
			
			String name = value.getSimpleName();

			name = name.replaceAll("Reactor","");
			if(!name.equals(key))
				System.out.println(key + " <<>> " + name);
			
		}
		System.out.println("-----------");
		
	}
	
	/**
	 * Load reactors based on the class path
	 * @param packages
	 */
	private static void loadFromCP(String... packages) {
		try {
			ScanResult sr = new ClassGraph().whitelistPackages(packages).scan();
			ClassInfoList classes = sr.getClassesImplementing(IReactor.class.getName());
			
			for(int classIndex = 0;classIndex < classes.size();classIndex++) {
				String name = classes.get(classIndex).getSimpleName();
				String packageName = classes.get(classIndex).getPackageName();
				Class actualClass = classes.get(classIndex).loadClass();

				// ignore abstract and engines
				if(	!Modifier.isAbstract( actualClass.getModifiers() )
						&& !Arrays.asList(actualClass.getInterfaces()).contains(IEngine.class) ) {
					String [] packagePaths = packageName.split("\\.");
					//System.out.println("Package name " + packageName);
					packageName = packagePaths[packagePaths.length - 1];
					boolean frame = false;
					if (packagePaths.length > 2) {
						frame = packagePaths[packagePaths.length - 2].equalsIgnoreCase("frame");
					}
					// we will allow for 1 more level 
					// i.e. things of the form so *.frame.r.?
					if(!frame && packagePaths.length > 3) {
						packageName = packagePaths[packagePaths.length - 2];
						frame = packagePaths[packagePaths.length - 3].equalsIgnoreCase("frame");
					}
					String reactorName = name;
					final String REACTOR_KEY = "REACTOR";
					if(reactorName.toUpperCase().endsWith(REACTOR_KEY)) {
						reactorName = reactorName.substring(0, reactorName.length()-REACTOR_KEY.length());
					}
					
					if(frame) {
						if(packageName.equalsIgnoreCase("rdbms")) {
							h2FrameHash.put(reactorName, actualClass);
						} else if(packageName.equalsIgnoreCase("r")) {
							rFrameHash.put(reactorName, actualClass);
						} else if(packageName.equalsIgnoreCase("py")) {
							pandasFrameHash.put(reactorName, actualClass);
						} else if(packageName.equalsIgnoreCase("tinker") || packageName.equalsIgnoreCase("graph")) {
							tinkerFrameHash.put(reactorName, actualClass);
						} else {// nullify the package name
							packageName = null;
							// general reactor
							// example - frame filters
							reactorHash.put(reactorName, actualClass);
						}
						if(packageName != null) {
							reactorName = packageName + "_" + reactorName;
						}
					} else {
						reactorHash.put(reactorName, actualClass);
					}
					nmList.add(reactorName);
					classList.add(actualClass);
					
					reactors.put(reactorName.toUpperCase(), actualClass);
				}
			}
		} catch (Exception e) {
			classLogger.error(Constants.STACKTRACE, e);
		}
	}
	
/*	public static void writeReacFile()
	{
		if(write)
		{
			String reacFileName = "c:/users/pkapaleeswaran/workspacej3/temp/reactornames.txt";
			System.err.println("Writing file.. ");
			try {
				PrintWriter br = new PrintWriter(new OutputStreamWriter(new FileOutputStream(reacFileName)));
				Iterator rIt = reactors.keySet().iterator();
				while(rIt.hasNext())
					br.write(rIt.next().toString() + "\n");
				{
				}
				br.flush();
				br.close();
				write = false;
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				classLogger.error(Constants.STACKTRACE, e);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				classLogger.error(Constants.STACKTRACE, e);
			}
		}
	}
*/	
	// populates the frame agnostic reactors used by pixel
	private static void createReactorHash(Map reactorHash) {
		// used to generate the base Job for the pksl commands being executed
		reactorHash.put("Job", JobReactor.class); // defines the job

		// Import Reactors
		// takes in a query struct and imports data to a new frame
		reactorHash.put("Import", ImportReactor.class);
		// takes in a query struct and merges data to an existing frame
		reactorHash.put("Merge", MergeReactor.class);

		// Utility Reactors
		reactorHash.put("AddOperationAlias", AddOperationAliasReactor.class);
		reactorHash.put("VariableExists", VariableExistsReactor.class);
		reactorHash.put("RemoveVariable", RemoveVariableReactor.class);
		reactorHash.put("SendEmail", SendEmailReactor.class);
		reactorHash.put("BackupDatabase", BackupDatabaseReactor.class);
		reactorHash.put("ExportDatabase", ExportDatabaseReactor.class);
		reactorHash.put("DeleteDatabase", DeleteDatabaseReactor.class);
		reactorHash.put("ImageCapture", ImageCaptureReactor.class);
		reactorHash.put("Help", HelpReactor.class);
		reactorHash.put("help", HelpReactor.class);
		reactorHash.put("DatabaseProfile", DatabaseProfileReactor.class);
		reactorHash.put("DatabaseColumnUnique", DatabaseColumnUniqueReactor.class);
		reactorHash.put("ExternalDatabaseProfile", ExternalDatabaseProfileReactor.class);
		reactorHash.put("GetRequest", GetRequestReactor.class);
		reactorHash.put("PostRequest", PostRequestReactor.class);
		reactorHash.put("CheckRPackages", CheckRPackagesReactor.class);
		reactorHash.put("CheckRecommendOptimization", CheckRecommendOptimizationReactor.class);
		reactorHash.put("PredictExcelRangeMetadata", PredictExcelRangeMetadataReactor.class);
		reactorHash.put("DeleteInsightCache", DeleteInsightCacheReactor.class);
		reactorHash.put("WidgetT", WidgetTReactor.class);
		reactorHash.put("GetUserInfo", GetUserInfoReactor.class);
		
		// Database uploading utils
		reactorHash.put("CheckHeaders", CheckHeadersReactor.class);
		reactorHash.put("PredictDataTypes", PredictDataTypesReactor.class);
		reactorHash.put("PredictExcelDataTypes", PredictExcelDataTypesReactor.class);
		reactorHash.put("PredictMetamodel", PredictMetamodelReactor.class);
		reactorHash.put("ParseMetamodel", ParseMetamodelReactor.class);
		reactorHash.put("ExtractAppMeta", ExtractDatabaseMetaReactor.class);
		reactorHash.put("NLPInstanceCache", NLPInstanceCacheReactor.class);
		
		// Excel Data validation
		reactorHash.put("GetExcelForm", GetExcelFormReactor.class);
		
		// Database Uploading
		reactorHash.put("ExternalJdbcSchema", ExternalJdbcSchemaReactor.class);
		reactorHash.put("ExternalJdbcTablesAndViews", ExternalJdbcTablesAndViewsReactor.class);
//		reactorHash.put("GenerateEmptyApp", GenerateEmptyAppReactor.class);
		reactorHash.put("RdbmsUploadTableData", RdbmsUploadTableDataReactor.class);
		reactorHash.put("RdbmsUploadExcelData", RdbmsUploadExcelDataReactor.class);
		reactorHash.put("RdbmsExternalUpload", RdbmsExternalUploadReactor.class);
		reactorHash.put("RdbmsCsvUpload", RdbmsCsvUploadReactor.class);
		reactorHash.put("RdbmsLoaderSheetUpload", RdbmsLoaderSheetUploadReactor.class);
		reactorHash.put("RdfCsvUpload", RdfCsvUploadReactor.class);
		reactorHash.put("RdfLoaderSheetUpload", RdfLoaderSheetUploadReactor.class);
		reactorHash.put("TinkerCsvUpload", TinkerCsvUploadReactor.class);
//		reactorHash.put("CatalogDescriptionGenerator", CatalogDescriptionGeneratorReactor.class);
//		reactorHash.put("SimilarCatalog", SimilarCatalogReactor.class);
//		reactorHash.put("CatalogSearch", CatalogSearchReactor.class);
			
		// external graph engine
		reactorHash.put("GetGraphProperties", GetGraphPropertiesReactor.class);
		reactorHash.put("GetGraphMetaModel", GetGraphMetaModelReactor.class);
		reactorHash.put("CreateExternalGraphDatabase", CreateExternalGraphDatabaseReactor.class);
		// datastax graph reactors
		reactorHash.put("GetDSEGraphProperties", GetDSEGraphPropertiesReactor.class);
		reactorHash.put("GetDSEGraphMetaModel", GetDSEGraphMetaModelReactor.class);
		reactorHash.put("CreateExternalDSEGraphDatabase", CreateExternalDSEGraphDatabaseReactor.class);
		// janus graph reactors
		reactorHash.put("GetJanusGraphProperties", GetJanusGraphPropertiesReactor.class);
		reactorHash.put("GetJanusGraphMetaModel", GetJanusGraphMetaModelReactor.class);
		reactorHash.put("CreateJanusGraphDatabase", CreateJanusGraphDatabaseReactor.class);
		
		// Query Struct Reactors
		// builds the select portion of the QS
		reactorHash.put("With", WithReactor.class);
		reactorHash.put("Select", SelectReactor.class);
		reactorHash.put("SelectTable", SelectTableReactor.class);
		reactorHash.put("PSelect", PSelectReactor.class);
		reactorHash.put("PCol", PColReactor.class);
		reactorHash.put("Average", AverageReactor.class);
		reactorHash.put("Mean", AverageReactor.class);
		reactorHash.put("UniqueAverage", UniqueAverageReactor.class);
		reactorHash.put("UniqueMean", UniqueAverageReactor.class);
		reactorHash.put("Sum", SumReactor.class);
		reactorHash.put("UniqueSum", UniqueSumReactor.class);
		reactorHash.put("Max", MaxReactor.class);
		reactorHash.put("Min", MinReactor.class);
		reactorHash.put("Median", MedianReactor.class);
		reactorHash.put("StandardDeviation", StandardDeviationReactor.class);
		reactorHash.put("Count", CountReactor.class);
		reactorHash.put("UniqueCount", UniqueCountReactor.class);
		reactorHash.put("GroupConcat", GroupConcatReactor.class);
		reactorHash.put("UniqueGroupConcat", UniqueGroupConcatReactor.class);
		reactorHash.put("Lower", LowerReactor.class);
		reactorHash.put("Group", GroupReactor.class);
		reactorHash.put("GroupBy", GroupReactor.class);
		reactorHash.put("Sort", SortReactor.class);
		reactorHash.put("Order", SortReactor.class);
		reactorHash.put("Limit", LimitReactor.class);
		reactorHash.put("Offset", OffsetReactor.class);
		reactorHash.put("Join", JoinReactor.class);
		reactorHash.put("Filter", FilterReactor.class);
		reactorHash.put("RegexFilter", RegexFilterReactor.class);
		reactorHash.put("Having", HavingReactor.class);
		reactorHash.put("Query", QueryReactor.class);
		reactorHash.put("Distinct", DistinctReactor.class);
		reactorHash.put("ImplicitFilterOverride", ImplicitFilterOverrideReactor.class);
		reactorHash.put("QueryAll", QueryAllReactor.class);

		// modifications to database
		reactorHash.put("Insert", InsertReactor.class);
		reactorHash.put("Delete", DeleteReactor.class);
		reactorHash.put("Update", UpdateReactor.class);
		reactorHash.put("ExecQuery", ExecQueryReactor.class);
		
		// Data Source Reactors
		// specifies that our pixel operations after this point are dealing with the specified database
		reactorHash.put("Database", DatabaseReactor.class);
		reactorHash.put("AuditDatabase", AuditDatabaseReactor.class);
		reactorHash.put("API", APIReactor.class);
		reactorHash.put("FileRead", FileReadReactor.class);
		reactorHash.put("JdbcSource", JdbcSourceReactor.class);
		reactorHash.put("DirectJDBCConnection", DirectJdbcConnectionReactor.class);
		reactorHash.put("URLSource", URLSourceReactor.class);
		// drop box
		reactorHash.put("DropBoxUploader", DropBoxUploaderReactor.class);
		reactorHash.put("DropBoxListFiles", DropBoxListFilesReactor.class);
		reactorHash.put("DropBoxFileRetriever", DropBoxFileRetrieverReactor.class);
		// one drive
		reactorHash.put("OneDriveUploader", OneDriveUploaderReactor.class);
		reactorHash.put("OneDriveListFiles", OneDriveListFilesReactor.class);
		reactorHash.put("OneDriveFileRetriever", OneDriveFileRetrieverReactor.class);
		// google
		reactorHash.put("GoogleUploader", GoogleUploaderReactor.class);
		reactorHash.put("GoogleListFiles", GoogleListFilesReactor.class);
		reactorHash.put("GoogleFileRetriever", GoogleFileRetrieverReactor.class);
		//S3
		reactorHash.put("S3FileRetriever", S3FileRetrieverReactor.class);
		reactorHash.put("ToS3", ToS3Reactor.class);
		reactorHash.put("PushAssetToS3", PushAssetToS3Reactor.class);
		reactorHash.put("S3ListBuckets", S3ListBucketsReactor.class);
		reactorHash.put("S3ListFiles", S3ListFilesReactor.class);

		// share point
		reactorHash.put("SharePointListFiles", SharePointListFilesReactor.class);
		reactorHash.put("SharePointFileRetriever", SharePointFileRetrieverReactor.class);
		reactorHash.put("SharePointSiteSelector", SharePointSiteSelectorReactor.class);
		reactorHash.put("SharePointDriveSelector", SharePointDriveSelectorReactor.class);
		reactorHash.put("SharePointWebDavPull", SharePointWebDavPullReactor.class);
		// survey monkey
		reactorHash.put("SurveyMonkeyListSurveys", SurveyMonkeyListSurveysReactor.class);
		reactorHash.put("NaturalLanguageSearch", NaturalLanguageSearchReactor.class);
		
		// specifies that our pixel operations after this point are dealing with the specified frame
		reactorHash.put("Frame", FrameReactor.class);
		reactorHash.put("CreateFrame", CreateFrameReactor.class);
		reactorHash.put("FrameType", FrameTypeReactor.class);
		reactorHash.put("Convert", ConvertReactor.class);
		reactorHash.put("GenerateFrameFromRVariable", GenerateFrameFromRVariableReactor.class);
		reactorHash.put("GenerateFrameFromPyVariable", GenerateFrameFromPyVariableReactor.class);
		reactorHash.put("GenerateH2FrameFromRVariable", GenerateH2FrameFromRVariableReactor.class);
		//reactorHash.put("SynchronizeToR", SynchronizeToRReactor.class);

		// Task Reactors
		reactorHash.put("Iterate", IterateReactor.class);
		reactorHash.put("Task", TaskReactor.class); // defines the task
		reactorHash.put("ResetTask", ResetTaskReactor.class); // reset a task
		reactorHash.put("ResetAll", RefreshPanelTaskReactor.class); // reset all panel tasks
		reactorHash.put("RemoveTask", RemoveTaskReactor.class);
		reactorHash.put("Collect", CollectReactor.class); // collect from task
		reactorHash.put("CollectAll", CollectAllReactor.class); // collect from task
		reactorHash.put("CollectGraph", CollectGraphReactor.class); // collect from task
		reactorHash.put("GrabScalarElement", GrabScalarElementReactor.class);
		reactorHash.put("AsTask", AsTaskReactor.class);
		reactorHash.put("EmptyData", EmptyDataReactor.class);
		reactorHash.put("CollectMeta", CollectMetaReactor.class); // collect meta from task
		reactorHash.put("Format", FormatReactor.class); // set formats
		reactorHash.put("TaskOptions", TaskOptionsReactor.class); // set options
		reactorHash.put("AutoTaskOptions", AutoTaskOptionsReactor.class);
		reactorHash.put("ToCsv", ToCsvReactor.class); // take any task and output to a file
		reactorHash.put("ToTsv", ToTsvReactor.class); // take any task and output to a file
		reactorHash.put("ToTxt", ToTxtReactor.class); // take any task and output to a file
		reactorHash.put("ToExcel", ToExcelReactor.class); // take any task and output to a file
		reactorHash.put("ToDatabase", ToDatabaseReactor.class);
		reactorHash.put("ToLoaderSheet", ToLoaderSheetReactor.class);
		
		// Task Operations
		reactorHash.put("CodeLambda", CodeLambdaReactor.class);
		reactorHash.put("FlatMapLambda", FlatMapLambdaReactor.class);
		reactorHash.put("MapLambda", MapLambdaReactor.class);
		reactorHash.put("FilterLambda", FilterLambdaReactor.class);
		reactorHash.put("ToNumericType", ToNumericTypeReactor.class);
		reactorHash.put("ToUrlType", ToUrlTypeReactor.class);
		reactorHash.put("TransposeRows", TransposeRowsReactor.class);
		reactorHash.put("ApplyFormatting", ApplyFormattingReactor.class);

		// Local Master Reactors
		// TODO: remove ones no longer used
		reactorHash.put("GetDatabaseList", GetDatabaseListReactor.class);
		reactorHash.put("GetDatabaseConcepts", GetDatabaseConceptsReactor.class);
		reactorHash.put("GetTraversalOptions", GetTraversalOptionsReactor.class);
		reactorHash.put("GetDatabaseMetamodel", GetDatabaseMetamodelReactor.class);
		reactorHash.put("GetConceptProperties", GetConceptPropertiesReactor.class);
		
		// NEW FEDERATE
		reactorHash.put("GetDatabaseConnections", GetDatabaseConnectionsReactor.class);
		reactorHash.put("GetDatabaseTableStructure", GetDatabaseTableStructureReactor.class);
		reactorHash.put("GetSpecificConceptProperties", GetSpecificConceptPropertiesReactor.class);
		reactorHash.put("FuzzyMatches", FuzzyMatchesReactor.class);
		reactorHash.put("FuzzyMerge", FuzzyMergeReactor.class);

		// depcreated
		reactorHash.put("FederationBlend", FederationBlend.class);
		reactorHash.put("FederationBestMatches", FederationBestMatches.class);
		
		// app meta and local master utilities
		reactorHash.put("ReloadDatabaseOwl", ReloadDatabaseOwlReactor.class);
		reactorHash.put("GetOwlMetamodel", GetOwlMetamodelReactor.class);
		reactorHash.put("GetOwlDictionary", GetOwlDictionaryReactor.class);
		// owl concepts
		reactorHash.put("AddOwlConcept", AddOwlConceptReactor.class);
		reactorHash.put("RemoveOwlConcept", RemoveOwlConceptReactor.class);
		// owl properties
		reactorHash.put("AddOwlProperty", AddOwlPropertyReactor.class);
		reactorHash.put("RemoveOwlProperty", RemoveOwlPropertyReactor.class);
		// owl relationships
		reactorHash.put("AddOwlRelationship", AddOwlRelationshipReactor.class);
		reactorHash.put("AddBulkOwlRelationships", AddBulkOwlRelationshipsReactor.class);
		reactorHash.put("RemoveOwlRelationship", RemoveOwlRelationshipReactor.class);
		// conceptual names 
		reactorHash.put("EditOwlConceptConceptualName", EditOwlConceptConceptualNameReactor.class);
		reactorHash.put("EditOwlPropertyConceptualName", EditOwlPropertyConceptualNameReactor.class);
		// data types
		reactorHash.put("EditOwlConceptDataType", EditOwlConceptDataTypeReactor.class);
		reactorHash.put("EditOwlPropertyDataType", EditOwlPropertyDataTypeReactor.class);
		// logical names
		reactorHash.put("AddOwlLogicalNames", AddOwlLogicalNamesReactor.class);
		reactorHash.put("EditOwlLogicalNames", EditOwlLogicalNamesReactor.class);
		reactorHash.put("RemoveOwlLogicalNames", RemoveOwlLogicalNamesReactor.class);
		reactorHash.put("GetOwlLogicalNames", GetOwlLogicalNamesReactor.class);
		reactorHash.put("PredictOwlLogicalNames", PredictOwlLogicalNamesReactor.class);
		// descriptions
		reactorHash.put("AddOwlDescription", AddOwlDescriptionReactor.class);
		reactorHash.put("EditOwlDescription", EditOwlDescriptionReactor.class);
		reactorHash.put("RemoveOwlDescription", RemoveOwlDescriptionReactor.class);
		reactorHash.put("GetOwlDescriptions", GetOwlDescriptionsReactor.class);
		reactorHash.put("PredictOwlDescription", PredictOwlDescriptionReactor.class);
		// routines to predict owl information
		reactorHash.put("FindDirectOwlRelationships", FindDirectOwlRelationshipsReactor.class);
		reactorHash.put("FindIndirectOwlRelationships", FindIndirectOwlRelationshipsReactor.class);
		reactorHash.put("FindSemanticColumnOwlRelationships", FindSemanticColumnOwlRelationshipsReactor.class);
		reactorHash.put("FindSemanticInstanceOwlRelationships", FindSemanticInstanceOwlRelationshipsReactor.class);
		
		reactorHash.put("SyncDatabaseWithLocalMaster", SyncDatabaseWithLocalMasterReactor.class);
		reactorHash.put("QueryTranslator", QueryTranslatorReactor.class);
		reactorHash.put("AllConceptualNames", AllConceptualNamesReactor.class);
		reactorHash.put("CLPModel", CLPModelReactor.class);
		// logical name operations
//		reactorHash.put("AddLogicalName", AddLogicalNameReactor.class);
//		reactorHash.put("GetLogicalNames", GetLogicalNamesReactor.class);
//		reactorHash.put("RemoveLogicalNames", RemoveLogicalNamesReactor.class);
//		// concept description metadata 
//		reactorHash.put("AddMetaDescription", AddMetaDescriptionReactor.class);
//		reactorHash.put("GetMetaDescription", GetMetaDescriptionReactor.class);
//		// concept tag metadata
//		reactorHash.put("AddMetaTags", AddMetaTagsReactor.class);
//		reactorHash.put("GetMetaTags", GetMetaTagsReactor.class);
//		reactorHash.put("DeleteMetaTags", DeleteMetaTagsReactor.class);
		
		// Panel Reactors
		reactorHash.put("InsightPanelIds", InsightPanelIds.class);
		reactorHash.put("Panel", PanelReactor.class);
		reactorHash.put("CachedPanel", CachedPanelReactor.class);
		reactorHash.put("CachedPanelClone", CachedPanelCloneReactor.class);
		reactorHash.put("AddPanel", AddPanelReactor.class);
		reactorHash.put("AddPanelIfAbsent", AddPanelIfAbsentReactor.class);
		reactorHash.put("GetPanelId", GetPanelIdReactor.class);
		reactorHash.put("ClosePanel", ClosePanelReactor.class);
		reactorHash.put("PanelExists", PanelExistsReactor.class);
		reactorHash.put("Clone", CloneReactor.class);
		reactorHash.put("SetPanelLabel", SetPanelLabelReactor.class);
		reactorHash.put("SetPanelView", SetPanelViewReactor.class);
		// panel filters
		reactorHash.put("AddPanelFilter", AddPanelFilterReactor.class);
		reactorHash.put("SetPanelFilter", SetPanelFilterReactor.class);
		reactorHash.put("UnfilterPanel", UnfilterPanelReactor.class);
		// panel sort
		reactorHash.put("AddPanelSort", AddPanelSortReactor.class);
		reactorHash.put("SetPanelSort", SetPanelSortReactor.class);
		reactorHash.put("RemovePanelSort", UnsortPanelReactor.class);
		reactorHash.put("UnsortPanel", UnsortPanelReactor.class);
		// panel comments
		reactorHash.put("AddPanelComment", AddPanelCommentReactor.class);
		reactorHash.put("UpdatePanelComment", UpdatePanelCommentReactor.class);
		reactorHash.put("RemovePanelComment", RemovePanelCommentReactor.class);
		reactorHash.put("RetrievePanelComment", RetrievePanelCommentReactor.class);
		// panel ornaments
		reactorHash.put("AddPanelOrnaments", AddPanelOrnamentsReactor.class);
		reactorHash.put("RemovePanelOrnaments", RemovePanelOrnamentsReactor.class);
		reactorHash.put("ResetPanelOrnaments", ResetPanelOrnamentsReactor.class);
		reactorHash.put("RetrievePanelOrnaments", RetrievePanelOrnamentsReactor.class);
		// panel configuration
		reactorHash.put("AddPanelConfig", AddPanelConfigReactor.class);
		// panel events
		reactorHash.put("AddPanelEvents", AddPanelEventsReactor.class);
		reactorHash.put("RemovePanelEvents", RemovePanelEventsReactor.class);
		reactorHash.put("ResetPanelEvents", ResetPanelEventsReactor.class);
		reactorHash.put("RetrievePanelEvents", RetrievePanelEventsReactor.class);
		// panel position
		reactorHash.put("SetPanelPosition", SetPanelPositionReactor.class);
		// panel color by value
		reactorHash.put("AddPanelColorByValue", AddPanelColorByValueReactor.class);
		reactorHash.put("RetrievePanelColorByValue", RetrievePanelColorByValueReactor.class);
		reactorHash.put("RemovePanelColorByValue", RemovePanelColorByValueReactor.class);
		reactorHash.put("GetPanelColorByValue", GetPanelColorByValueReactor.class);
		
		// new tab in browser
		reactorHash.put("OpenTab", OpenTabReactor.class);

		// Insight Reactors
		reactorHash.put("InsightRecipe", InsightRecipeReactor.class);
		reactorHash.put("CurrentVariables", CurrentVariablesReactor.class);
		reactorHash.put("OpenInsight", OpenInsightReactor.class);
		reactorHash.put("LoadInsight", LoadInsightReactor.class);
		reactorHash.put("ReloadInsight", ReloadInsightReactor.class);
		reactorHash.put("CopyInsight", CopyInsightReactor.class);
		reactorHash.put("OpenEmptyInsight", OpenEmptyInsightReactor.class);
		reactorHash.put("DropInsight", DropInsightReactor.class);
		reactorHash.put("ClearInsight", ClearInsightReactor.class);
		reactorHash.put("InsightHandle", InsightHandleReactor.class);
		reactorHash.put("SetInsightOrnament", SetInsightOrnamentReactor.class);
		reactorHash.put("RetrieveInsightOrnament", RetrieveInsightOrnamentReactor.class);
		reactorHash.put("UpdateInsightImage", UpdateInsightImageReactor.class);
		reactorHash.put("GetCurrentRecipe", GetCurrentRecipeReactor.class);
		reactorHash.put("RetrieveInsightPipeline", RetrieveInsightPipelineReactor.class);
		
		// Save Reactors
		reactorHash.put("SaveInsight", SaveInsightReactor.class);
		reactorHash.put("UpdateInsight", UpdateInsightReactor.class);
		reactorHash.put("DeleteInsight", DeleteInsightReactor.class);
		reactorHash.put("SetInsightName", SetInsightNameReactor.class);
		reactorHash.put("SetInsightCacheable", SetInsightCacheableReactor.class);

		// Dashboard Reactors
		reactorHash.put("DashboardInsightConfig", DashboardInsightConfigReactor.class);

		// General Frame Reactors
		reactorHash.put("FrameHeaders", FrameHeadersReactor.class);
		reactorHash.put("FrameHeaderExists", FrameHeaderExistsReactor.class);
		reactorHash.put("AddFrameFilter", AddFrameFilterReactor.class);
		reactorHash.put("GetFrameFilters", GetFrameFiltersReactor.class);
		reactorHash.put("SetFrameFilter", SetFrameFilterReactor.class);
		reactorHash.put("RemoveFrameFilter", RemoveFrameFilterReactor.class);
		reactorHash.put("ReplaceFrameFilter", ReplaceFrameFilterReactor.class);
		reactorHash.put("DeleteFrameFilter", DeleteFrameFilterReactor.class);
		reactorHash.put("UnfilterFrame", UnfilterFrameReactor.class);
		reactorHash.put("HasDuplicates", HasDuplicatesReactor.class);
		reactorHash.put("CurrentFrame", CurrentFrameReactor.class);
		reactorHash.put("SetCurrentFrame", SetCurrentFrameReactor.class);
		// filter model
		reactorHash.put("FrameFilterModel", FrameFilterModelReactor.class);
		reactorHash.put("FrameFilterModelFilteredValues", FrameFilterModelFilteredValuesReactor.class);
		reactorHash.put("FrameFilterModelVisibleValues", FrameFilterModelVisibleValuesReactor.class);
		reactorHash.put("FrameFilterModelNumericRange", FrameFilterModelNumericRangeReactor.class);

		// Algorithm Reactors
		reactorHash.put("rAlg", RAlgReactor.class);
		reactorHash.put("RunClustering", RunClusteringReactor.class);
		reactorHash.put("RunMultiClustering", RunMultiClusteringReactor.class);
		reactorHash.put("RunLOF", RunLOFReactor.class);
		reactorHash.put("RunSimilarity", RunSimilarityReactor.class);
		reactorHash.put("RunOutlier", RunOutlierReactor.class);
		reactorHash.put("Ratio", RatioReactor.class);
		reactorHash.put("RunAnomaly", RunAnomalyReactor.class);
		
		// X-Ray reactors
//		reactorHash.put("RunXray", RunXRayReactor.class);
		reactorHash.put("GetXrayConfigList", GetXrayConfigListReactor.class);
		reactorHash.put("GetXrayConfigFile", GetXrayConfigFileReactor.class);
		reactorHash.put("GetLocalSchema", GetLocalSchemaReactor.class);
		reactorHash.put("GetXLSchema", GetXLSchemaReactor.class);
		reactorHash.put("GetCSVSchema",GetCSVSchemaReactor.class);
//		reactorHash.put("GetExternalSchema", GetExternalSchemaReactor.class);
//		reactorHash.put("XrayMetamodel", XrayMetamodelReactor.class);
//		reactorHash.put("MetaSemanticSimilarity", MetaSemanticSimilarityReactor.class);
		
		reactorHash.put("SemanticBlending", SemanticBlendingReactor.class);
		reactorHash.put("SemanticDescription", SemanticDescription.class);
		// similar reactors to x-ray
		reactorHash.put("GetPhysicalToLogicalMapping", GetPhysicalToLogicalMapping.class);
		reactorHash.put("GetPhysicalToPhysicalMapping", GetPhysicalToPhysicalMapping.class);

		// these algorithms return viz data to the FE
		reactorHash.put("RunNumericalCorrelation", RunNumericalCorrelationReactor.class);
		reactorHash.put("RunMatrixRegression", RunMatrixRegressionReactor.class);
		reactorHash.put("RunClassification", RunClassificationReactor.class);
		reactorHash.put("RunAssociatedLearning", RunAssociatedLearningReactor.class);

		// In mem storage of data
		reactorHash.put("StoreValue", StoreValue.class);
		reactorHash.put("RetrieveValue", RetrieveValue.class);
		reactorHash.put("GraphPlan", GraphPlanReactor.class);
		
		// Git it
		reactorHash.put("InitAppRepo", InitAppRepo.class);
		reactorHash.put("AddAppCollaborator", AddAppCollaborator.class);
		reactorHash.put("RemoveAppCollaborator", RemoveAppCollaborator.class);
		reactorHash.put("SearchAppCollaborator", SearchAppCollaborator.class);
		reactorHash.put("ListAppCollaborators", ListAppCollaborators.class);
		reactorHash.put("CopyAppRepo", CopyAppRepo.class);
		reactorHash.put("DeleteAppRepo", DeleteAppRepo.class);
		reactorHash.put("DropAppRepo", DropAppRepo.class);
		reactorHash.put("SyncApp", SyncApp.class);
		reactorHash.put("SyncAppFiles", SyncAppFiles.class);
		reactorHash.put("ListAppRemotes", ListAppRemotes.class);
		reactorHash.put("ListUserApps", ListUserApps.class);
		reactorHash.put("IsGit", IsGit.class);
		reactorHash.put("Login", LoginReactor.class);
		reactorHash.put("GitStatus", GitStatusReactor.class);
		reactorHash.put("GitVersion", prerna.util.git.reactors.GitVersion.class);
		reactorHash.put("CreateAsset", prerna.util.git.reactors.CreateAssetReactor.class);
		reactorHash.put("UpdateAsset", prerna.util.git.reactors.UpdateAssetReactor.class);
		reactorHash.put("DeleteAsset", prerna.util.git.reactors.DeleteAssetReactor.class);
		reactorHash.put("SyncAppO", SyncAppOReactor.class);
		reactorHash.put("SyncAppFilesO", SyncAppFilesO.class);
		
		// App Metadata
//		reactorHash.put("MyApps", MyAppsReactor.class);
		reactorHash.put("MyDatabases", MyDatabasesReactor.class);
		reactorHash.put("DatabaseInfo", DatabaseInfoReactor.class);
		reactorHash.put("DatabaseUsersReactor", DatabaseUsersReactor.class);
		// TODO: to be removed once FE changes to only use GetInsights
		reactorHash.put("GetAppInsights", GetInsightsReactor.class);
		reactorHash.put("GetInsights", GetInsightsReactor.class);
//		reactorHash.put("SetAppDescription", SetDatabaseDescriptionReactor.class);
//		reactorHash.put("SetAppTags", SetDatabaseTagsReactor.class);
//		reactorHash.put("GetAppWidgets", GetAppWidgetsReactor.class);
		reactorHash.put("AddDefaultInsights", AddDefaultInsightsReactor.class);
		// Insight Metadata
//		reactorHash.put("SetInsightTags", SetInsightTagsReactor.class);
//		reactorHash.put("SetInsightDescription", SetInsightDescriptionReactor.class);

		// Clusters
		reactorHash.put("OpenDatabase", OpenDatabaseReactor.class);
		reactorHash.put("CleanUpDatabases", CleanUpDatabasesReactor.class);
		reactorHash.put("Version", VersionReactor.class);
		//reactorHash.put("PullCloudApp", PullCloudAppReactor.class);
		//reactorHash.put("SyncRedis", SyncRedisReactor.class);
		//reactorHash.put("PullUserSpace", PullUserSpaceReactor.class);
		
		// User Space
		reactorHash.put("UploadUserFile", UploadUserFileReactor.class);
		reactorHash.put("UserDir", UserDirReactor.class);
		reactorHash.put("DeleteUserAsset", DeleteUserAssetReactor.class);
		reactorHash.put("NewDir", NewDirReactor.class);
		reactorHash.put("MoveUserAsset", MoveUserAssetReactor.class);

		// Scheduler
		reactorHash.put("ScheduleJob", ScheduleJobReactor.class);
		reactorHash.put("PauseJobTrigger", PauseJobTriggerReactor.class);
		reactorHash.put("ListAllJobs", ListAllJobsReactor.class);
		reactorHash.put("ResumeJobTrigger", ResumeJobTriggerReactor.class);
		// User Tracking
		reactorHash.put("UpdateSemanticData", UpdateSemanticDataReactor.class);
		reactorHash.put("UpdateQueryData", UpdateQueryDataReactor.class);
		// Recommendations
		reactorHash.put("DatabaseRecommendations", DatabaseRecommendationsReactor.class);
		reactorHash.put("VizRecommendations", VizRecommendationsReactor.class);
		reactorHash.put("PredictViz", CreateNLPVizReactor.class);
		reactorHash.put("GetDatabasesByDescription", GetDatabasesByDescriptionReactor.class);
		reactorHash.put("UpdateNLPHistory", UpdateNLPHistoryReactor.class);
		reactorHash.put("NLSQueryHelper", NLSQueryHelperReactor.class);
		
		// Forms
		reactorHash.put("UpdateForm", UpdateFormReactor.class);
		
		// Pixels for legacy playsheets
		reactorHash.put("RunPlaysheetMethod", prerna.reactor.legacy.playsheets.RunPlaysheetMethodReactor.class);
		reactorHash.put("RunPlaysheet", prerna.reactor.legacy.playsheets.RunPlaysheetReactor.class);
		reactorHash.put("GetPlaysheetParams", prerna.reactor.legacy.playsheets.GetPlaysheetParamsReactor.class);
		
		//LSA
		reactorHash.put("LSASpaceColumnLearned", LSASpaceColumnLearnedReactor.class);
		reactorHash.put("RunLSILearned", RunLSILearnedReactor.class); 
		//reactorHash.put("LSADescriptionAdd", LSADescriptionAddReactor.class); 
		//reactorHash.put("CreateCriteriaFromText", CreateCriteriaFromTextReactor.class); 
		//reactorHash.put("LSASpaceColumn", LSASpaceColumnReactor.class); 
		//reactorHash.put("RunLSI", RunLSIReactor.class); 
		
		// General Code Execution
		reactorHash.put("Java", JavaReactor.class);
		
		// Pixel Recipe Parsing / Manipulation
		reactorHash.put("GetInsightDatasources", GetInsightDatasourcesReactor.class);
		reactorHash.put("ModifyInsightDatasource", ModifyInsightDatasourceReactor.class);
		reactorHash.put("GetOptimizedRecipe", GetOptimizedRecipeReactor.class);
		
		
		// web scrape engine
		reactorHash.put("GetTableHeader", GetTableHeader.class);
		reactorHash.put("GetNumTable", GetNumTableReactor.class);
		
		// Tax specific handles
//		reactorHash.put("LoadClient", LoadClientReactor.class);
//		reactorHash.put("RunPlan", RunPlanReactor.class);
//		reactorHash.put("UpdatePlan", UpdateGraphPlannerReactor2.class);
//		reactorHash.put("TaxRetrieveValue", TaxRetrieveValue2.class);
//		reactorHash.put("RunAliasMatch", RunAliasMatchReactor.class);
//		reactorHash.put("SaveTaxScenario", SaveTaxScenarioReactor.class);
		
		// bitly
		reactorHash.put("badd", BaddReactor.class);
		reactorHash.put("bupd", BupdReactor.class);
		reactorHash.put("bdel", BDelReactor.class);
		reactorHash.put("bq", BQReactor.class);
		
		// Dates
		reactorHash.put("DATE", DateReactor.class);
		reactorHash.put("DAY", DayReactor.class);
		reactorHash.put("WEEK", WeekReactor.class);
		reactorHash.put("MONTH", MonthReactor.class);
		reactorHash.put("YEAR", YearReactor.class);
	}

	private static void populateNativeFrameHash(Map nativeFrameHash) {

	}

	private static void populateH2FrameHash(Map h2FrameHash) {
		h2FrameHash.put("AddColumn", prerna.reactor.frame.rdbms.AddColumnReactor.class);
		h2FrameHash.put("ChangeColumnType", prerna.reactor.frame.rdbms.ChangeColumnTypeReactor.class);
		h2FrameHash.put("CountIf", prerna.reactor.frame.rdbms.CountIfReactor.class);
		h2FrameHash.put("DropColumn", prerna.reactor.frame.rdbms.DropColumnReactor.class);
		h2FrameHash.put("DropRows", prerna.reactor.frame.rdbms.DropRowsReactor.class);
		h2FrameHash.put("DuplicateColumn", prerna.reactor.frame.rdbms.DuplicateColumnReactor.class);
		h2FrameHash.put("ExtractLetters", prerna.reactor.frame.rdbms.ExtractLettersReactor.class);
		h2FrameHash.put("ExtractNumbers", prerna.reactor.frame.rdbms.ExtractNumbersReactor.class);
		h2FrameHash.put("JoinColumns", prerna.reactor.frame.rdbms.JoinColumnsReactor.class);
		h2FrameHash.put("RenameColumn", prerna.reactor.frame.rdbms.RenameColumnReactor.class);
		h2FrameHash.put("SplitColumns", prerna.reactor.frame.rdbms.SplitColumnsReactor.class);
		h2FrameHash.put("ToLowerCase", prerna.reactor.frame.rdbms.ToLowerCaseReactor.class);
		h2FrameHash.put("ToUpperCase", prerna.reactor.frame.rdbms.ToUpperCaseReactor.class);
		h2FrameHash.put("TrimColumns", prerna.reactor.frame.rdbms.TrimColumnReactor.class);
	}

	private static void populateRFrameHash(Map rFrameHash) {
		rFrameHash.put("AddColumn", prerna.reactor.frame.r.AddColumnReactor.class);
		rFrameHash.put("AutoCleanColumn", prerna.reactor.frame.r.AutoCleanColumnReactor.class);
		rFrameHash.put("ChangeColumnType", prerna.reactor.frame.r.ChangeColumnTypeReactor.class);
		rFrameHash.put("CountIf", prerna.reactor.frame.r.CountIfReactor.class);
		rFrameHash.put("Collapse", prerna.reactor.frame.r.CollapseReactor.class);
		rFrameHash.put("Concatenate", prerna.reactor.frame.r.ConcatenateReactor.class);
		rFrameHash.put("DropColumn", prerna.reactor.frame.r.DropColumnReactor.class);
		rFrameHash.put("DropRows", prerna.reactor.frame.r.DropRowsReactor.class);
		rFrameHash.put("DuplicateColumn", prerna.reactor.frame.r.DuplicateColumnReactor.class);
		rFrameHash.put("ExtractLetters", prerna.reactor.frame.r.ExtractLettersReactor.class);
		rFrameHash.put("ExtractNumbers", prerna.reactor.frame.r.ExtractNumbersReactor.class);
		rFrameHash.put("JoinColumns", prerna.reactor.frame.r.JoinColumnsReactor.class);
		rFrameHash.put("Pivot", prerna.reactor.frame.r.PivotReactor.class);
		rFrameHash.put("RegexReplaceColumnValue", prerna.reactor.frame.r.RegexReplaceColumnValueReactor.class);
		rFrameHash.put("RemoveDuplicateRows", prerna.reactor.frame.r.RemoveDuplicateRowsReactor.class);
		rFrameHash.put("RenameColumn", prerna.reactor.frame.r.RenameColumnReactor.class);
		rFrameHash.put("ReplaceColumnValue", prerna.reactor.frame.r.ReplaceColumnValueReactor.class);
		rFrameHash.put("SortColumn", prerna.reactor.frame.r.SortColumnReactor.class);
		rFrameHash.put("SplitColumns", prerna.reactor.frame.r.SplitColumnsReactor.class);
		rFrameHash.put("SplitUnpivot", prerna.reactor.frame.r.SplitUnpivotReactor.class);
		rFrameHash.put("ToLowerCase", prerna.reactor.frame.r.ToLowerCaseReactor.class);
		rFrameHash.put("ToUpperCase", prerna.reactor.frame.r.ToUpperCaseReactor.class);
		rFrameHash.put("ToProperCase", prerna.reactor.frame.r.ToProperCaseReactor.class);
		rFrameHash.put("TrimColumns", prerna.reactor.frame.r.TrimColumnsReactor.class);
		rFrameHash.put("Transpose", prerna.reactor.frame.r.TransposeReactor.class);
		rFrameHash.put("Unpivot", prerna.reactor.frame.r.UnpivotReactor.class);
		rFrameHash.put("UpdateRowValues", prerna.reactor.frame.r.UpdateRowValuesReactor.class);
		rFrameHash.put("Discretize", prerna.reactor.frame.r.DiscretizeReactor.class);
		rFrameHash.put("DateExpander", prerna.reactor.frame.r.DateExpanderReactor.class);
		rFrameHash.put("DateDifference", prerna.reactor.frame.r.DateDifferenceReactor.class);
		rFrameHash.put("DateAddValue", prerna.reactor.frame.r.DateAddValueReactor.class);

		// frame stats
		rFrameHash.put("ColumnCount", prerna.reactor.frame.r.ColumnCountReactor.class);
		rFrameHash.put("DescriptiveStats", prerna.reactor.frame.r.DescriptiveStatsReactor.class);
		rFrameHash.put("SummaryStats", prerna.reactor.frame.r.SummaryStatsReactor.class);
		rFrameHash.put("Histogram", prerna.reactor.frame.r.HistogramReactor.class);
		
		// algorithms
		rFrameHash.put("RunAssociatedLearning", prerna.reactor.frame.r.analytics.RunAssociatedLearningReactor.class);
		rFrameHash.put("RunClassification", prerna.reactor.frame.r.analytics.RunClassificationReactor.class);
		rFrameHash.put("RunClustering", prerna.reactor.frame.r.analytics.RunClusteringReactor.class);
		rFrameHash.put("RunDescriptionGenerator", prerna.reactor.frame.r.analytics.RunDescriptionGeneratorReactor.class);
		rFrameHash.put("RunDocCosSimilarity", prerna.reactor.frame.r.analytics.RunDocCosSimilarityReactor.class);
		rFrameHash.put("RunDocumentSummarization", prerna.reactor.algorithms.RunDocumentSummarizationReactor.class);
		rFrameHash.put("RunLOF", prerna.reactor.frame.r.analytics.RunLOFReactor.class);
		rFrameHash.put("RunMatrixRegression", prerna.reactor.frame.r.analytics.RunMatrixRegressionReactor.class);
		rFrameHash.put("RunNumericalColumnSimilarity", prerna.reactor.frame.r.analytics.RunNumericalColumnSimilarityReactor.class);
		rFrameHash.put("RunNumericalCorrelation", prerna.reactor.frame.r.analytics.RunNumericalCorrelationReactor.class);
		rFrameHash.put("RunNumericalModel", prerna.reactor.frame.r.analytics.RunNumericalModelReactor.class);
		rFrameHash.put("RunOutlier", prerna.reactor.frame.r.analytics.RunOutlierReactor.class);
		rFrameHash.put("RunRandomForest", prerna.reactor.frame.r.analytics.RunRandomForestReactor.class);
		rFrameHash.put("GetRFResults", prerna.reactor.frame.r.analytics.GetRFResultsReactor.class);
		rFrameHash.put("RunSimilarity", prerna.reactor.frame.r.analytics.RunSimilarityReactor.class);
		rFrameHash.put("RunSimilarityHeat", prerna.reactor.frame.r.analytics.RunSimilarityHeatReactor.class);
		rFrameHash.put("MatchColumnValues", prerna.reactor.frame.r.MatchColumnValuesReactor.class);
		rFrameHash.put("UpdateMatchColumnValues", prerna.reactor.frame.r.UpdateMatchColumnValuesReactor.class);
//		rFrameHash.put("MetaSemanticSimilarity", prerna.sablecc2.reactor.frame.r.MetaSemanticSimilarityReactor.class);

		// data quality rectors
		rFrameHash.put("RunDataQuality",RunDataQualityReactor.class);
		rFrameHash.put("GetDQRules", GetDQRulesReactor.class);
	}

	private static void populateTinkerFrameHash(Map tinkerFrameHash) {
		tinkerFrameHash.put("ConnectedNodes", ConnectedNodesReactor.class);
		tinkerFrameHash.put("RemoveIntermediaryNode", RemoveIntermediaryNodeReactor.class);
		tinkerFrameHash.put("FindPathsConnectingNodes", FindPathsConnectingNodesReactor.class);
		tinkerFrameHash.put("FindPathsConnectingGroups", FindPathsConnectingGroupsReactor.class);
		// require r
		tinkerFrameHash.put("ChangeGraphLayout", ChangeGraphLayoutReactor.class);
		tinkerFrameHash.put("ClusterGraph", ClusterGraphReactor.class);
		tinkerFrameHash.put("NodeDetails", NodeDetailsReactor.class);
	}
	
	private static void populatePandasFrameHash(Map pandasFrameHash) {
		pandasFrameHash.put("ToUpperCase", prerna.reactor.frame.py.ToUpperCaseReactor.class);
		pandasFrameHash.put("ToLowerCase", prerna.reactor.frame.py.ToLowerCaseReactor.class);
		pandasFrameHash.put("ToProperCase", prerna.reactor.frame.py.ToProperCaseReactor.class);
		pandasFrameHash.put("ReplaceColumnValue", prerna.reactor.frame.py.ReplaceColumnValueReactor.class);
		pandasFrameHash.put("RenameColumn", prerna.reactor.frame.py.RenameColumnReactor.class);
		pandasFrameHash.put("Pivot", prerna.reactor.frame.py.PivotReactor.class);
		pandasFrameHash.put("ChangeColumnType", prerna.reactor.frame.py.ChangeColumnTypeReactor.class);
		pandasFrameHash.put("DropRows", prerna.reactor.frame.py.DropRowsReactor.class);
		pandasFrameHash.put("DropColumn", prerna.reactor.frame.py.DropColumnReactor.class);
		pandasFrameHash.put("DuplicateColumn", prerna.reactor.frame.py.DuplicateColumnReactor.class);
		pandasFrameHash.put("ExtractLetters", prerna.reactor.frame.py.ExtractLettersReactor.class);
		pandasFrameHash.put("ExtractNumbers", prerna.reactor.frame.py.ExtractNumbersReactor.class);
		pandasFrameHash.put("CountIf", prerna.reactor.frame.py.CountIfReactor.class);
		pandasFrameHash.put("SplitColumns", prerna.reactor.frame.py.SplitColumnsReactor.class);
		pandasFrameHash.put("UpdateRowValues", prerna.reactor.frame.py.UpdateRowValuesReactor.class);
		pandasFrameHash.put("SplitUnpivot", prerna.reactor.frame.py.SplitUnpivotReactor.class);
		pandasFrameHash.put("TrimColumns", prerna.reactor.frame.py.TrimColumnsReactor.class);
		pandasFrameHash.put("MatchColumnValues", prerna.reactor.frame.py.MatchColumnValuesReactor.class);
		pandasFrameHash.put("Collapse", prerna.reactor.frame.py.CollapseReactor.class);
		pandasFrameHash.put("JoinColumns", prerna.reactor.frame.py.JoinColumnsReactor.class);
		
		// frame stats
		pandasFrameHash.put("ColumnCount", prerna.reactor.frame.py.ColumnCountReactor.class);
		pandasFrameHash.put("Histogram", prerna.reactor.frame.py.ColumnCountReactor.class);
		pandasFrameHash.put("DescriptiveStats", prerna.reactor.frame.py.DescriptiveStatsReactor.class);
	}

	private static void populateExpressionSet(Map expressionHash) {
		// excel like operations
		expressionHash.put("SUM", OpSum.class);
		expressionHash.put("AVERAGE", OpMean.class);
		expressionHash.put("AVG", OpMean.class);
		expressionHash.put("MEAN", OpMean.class);
		expressionHash.put("MIN", OpMin.class);
		expressionHash.put("MAX", OpMax.class);
		expressionHash.put("MEDIAN", OpMedian.class);
		expressionHash.put("POWER", OpPower.class);
		expressionHash.put("LARGE", OpLarge.class);
		expressionHash.put("SMALL", OpSmall.class);
		expressionHash.put("ROUND", OpRound.class);
		expressionHash.put("ABS", OpAbsolute.class);
		expressionHash.put("ABSOLUTE", OpAbsolute.class);
		expressionHash.put("MATCH", OpMatch.class);
		expressionHash.put("SUMIF", OpSumIf.class);
		expressionHash.put("SUMIFS", OpSumIfs.class);
		expressionHash.put("SUMPRODUCT", OpSumProduct.class);
		expressionHash.put("AND", OpAnd.class);
		expressionHash.put("OR", OpOr.class);
		expressionHash.put("LEN", OpLen.class);
		expressionHash.put("IFERROR", IfError.class);
		expressionHash.put("NOTEMPTY", OpNotEmpty.class);
		expressionHash.put("ISEMPTY", OpIsEmpty.class);
		expressionHash.put("ISOBJECTEMPTY", OpIsObjectEmpty.class);
		expressionHash.put("ASSTRING", OpAsString.class);
		expressionHash.put("CONCAT", OpConcat.class);
		
		// none excel functions
		// If is in its own category
		expressionHash.put("IF", IfReactor.class);
		expressionHash.put("LIST", OpList.class);
		expressionHash.put("PASTE0", OpPaste0.class);
		expressionHash.put("PASTE", OpPaste.class);
		expressionHash.put("CONTAINS", OpContains.class);
		expressionHash.put("ARRAYLENGTH", OpArrayLength.class);
	}

	/**
	 * 
	 * @param reactorId
	 *            - reactor name
	 * @param nodeString
	 *            - pixel
	 * @param frame
	 *            - frame we will be operating on
	 * @param parentReactor
	 *            - the parent reactor
	 * @return
	 * 
	 * 		This will simply return the IReactor responsible for execution
	 *         based on the reactorId
	 * 
	 *         Special case: if we are dealing with an expression, we determine
	 *         if this expression is part of a select query or should be reduced
	 *         If it is a reducing expression we 1. create an expr reactor 2.
	 *         grab the reducing expression reactor from the frame 3. set that
	 *         reactor to the expr reactor and return the expr reactor The expr
	 *         reactor when executed will use that reducing expression reactor
	 *         to evaluate
	 */
	public static IReactor getReactor(String reactorId, String nodeString, ITableDataFrame frame, IReactor parentReactor) {
		IReactor reactor = null;

		try {
			// is this an expression?
			// we need to determine if we are treating this expression as a
			// reducer or as a selector
			if (expressionHash.containsKey(reactorId.toUpperCase())) {
				// if this expression is not a selector
				if (!(parentReactor instanceof AbstractQueryStructReactor) && 
						!(parentReactor instanceof QuerySelectorExpressionAssimilator)) {
					reactor = (IReactor) expressionHash.get(reactorId.toUpperCase()).newInstance();
					reactor.setPixel(reactorId, nodeString);
					return reactor;
				}
			}
			
			// see if it is a frame specific reactor
			if (frame != null) {
				// identify the correct hash to use
				if (frame instanceof AbstractRdbmsFrame) {
					// see if the hash contains the reactor id
					if (h2FrameHash.containsKey(reactorId)) {
						reactor = (IReactor) h2FrameHash.get(reactorId).newInstance();
					}
				} else if (frame instanceof RDataTable) {
					if (rFrameHash.containsKey(reactorId)) {
						reactor = (IReactor) rFrameHash.get(reactorId).newInstance();
					}
				} else if (frame instanceof TinkerFrame) {
					if (tinkerFrameHash.containsKey(reactorId)) {
						reactor = (IReactor) tinkerFrameHash.get(reactorId).newInstance();
					}
				} else if (frame instanceof NativeFrame) {
					if (nativeFrameHash.containsKey(reactorId)) {
						reactor = (IReactor) nativeFrameHash.get(reactorId).newInstance();
					}
				} else if(frame instanceof PandasFrame) {
					if (pandasFrameHash.containsKey(reactorId)) {
						reactor = (IReactor) pandasFrameHash.get(reactorId).newInstance();
					}
				}
				
				// if we have retrieved a reactor from a frame hash
				if (reactor != null) {
					reactor.setPixel(reactorId, nodeString);
					return reactor;
				}
			}


			// see if it is a generic one
			// if not an expression
			// search in the normal reactor hash
			if (reactorHash.containsKey(reactorId)) {
				reactor = (IReactor) reactorHash.get(reactorId).newInstance();
				reactor.setPixel(reactorId, nodeString);
				return reactor;
			}
		} catch (InstantiationException | IllegalAccessException e) {
			classLogger.error(Constants.STACKTRACE, e);
		}
		
		/*
		 * I want to account for various functions that a person wants to execute
		 * I will just create this as a generic function reactor 
		 * that creates a function selector to return 
		 */
		if (parentReactor instanceof AbstractQueryStructReactor || parentReactor instanceof QuerySelectorExpressionAssimilator) {
			reactor = new GenericSelectorFunctionReactor();
			reactor.setPixel(reactorId, nodeString);
			// set the fuction name
			((GenericSelectorFunctionReactor) reactor).setFunction(reactorId);
			return reactor;
		}
		
		// ughhh... idk what you are trying to do
		throw new IllegalArgumentException("Cannot find reactor for keyword = " + reactorId);
	}
	
	public static boolean hasReactor(String reactorId) {
		return reactorHash.containsKey(reactorId) || expressionHash.containsKey(reactorId.toUpperCase());
	}
	
	/**
	 * This method takes in a prop file to build the reactorHash
	 * 
	 * @param propFile
	 *            - the path to the prop file with the reactor names and classes
	 * @param reactorHash
	 *            - the specific reactor hash object that we are building
	 * 
	 */
	public static void buildReactorHashFromPropertyFile(Map hash, String propFile) {
		// move info from the prop file into a Properties object
		Properties properties = Utility.loadProperties(propFile);
		// for each line in the file
		// each line maps a reactor (operation) to a class
		for (Object operation : properties.keySet()) {
			try {
				// identify the class that corresponds to each reactor
				String reactorClass = properties.get(operation).toString();
				Class reactor = (Class.forName(reactorClass));
				// put the operation and the class into the reactor hash
				hash.put(operation.toString(), reactor);
			} catch (ClassNotFoundException e) {
				classLogger.error(Constants.STACKTRACE, e);
			}
		}
	}
	
	/**
	 * Loads the JSON for additional reactors
	 * IF NAMES COLLIDE, THE PROP FILE WILL TAKE PRECEDENCE
	 * @param jsonFile 
	 * 
	 */
	private static void loadAdditionalReactor(File jsonFile) {
		Map> jsonData = null;
		try {
			jsonData = new ObjectMapper().readValue(jsonFile, Map.class);
		} catch(Exception e) {
			// oops...
			System.out.println("COULDN'T LOAD JSON FILE FOR ADDITIOANL REACTORS!!!!!");
		}
		if(jsonData != null) {
			for(String key : jsonData.keySet()) {
				Map hash = getReactorsForType(key);
				if(hash != null) {
					Map reactorNameToClass = jsonData.get(key);
					for(String reactorName : reactorNameToClass.keySet()) {
						String classname = reactorNameToClass.get(reactorName);
						Class reactor;
						try {
							reactor = (Class.forName(classname));
							hash.put(reactorName, reactor);
						} catch (ClassNotFoundException e) {
							classLogger.warn("COULDN'T FIND THE REACTOR! " + classname);
							classLogger.error(Constants.STACKTRACE, e);
						}
					}
				}
			}
		}
	}
	
	private static Map getReactorsForType(String key) {
		key = key.toUpperCase();
		if(key.equals("GENERAL")) {
			return reactorHash;
		} else if(key.equals("H2")) {
			return h2FrameHash;
		} else if(key.equals("R")) {
			return rFrameHash;
		} else if(key.equals("PY")) {
			return pandasFrameHash;
		} else if(key.equals("NATIVE")) {
			return nativeFrameHash;
		} else if(key.equals("TINKER")) {
			return tinkerFrameHash;
		}
		return null;
	}
	
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy