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

prerna.rdf.engine.wrappers.WrapperManager Maven / Gradle / Ivy

The newest version!
/*******************************************************************************
 * Copyright 2015 Defense Health Agency (DHA)
 *
 * If your use of this software does not include any GPLv2 components:
 * 	Licensed under the Apache License, Version 2.0 (the "License");
 * 	you may not use this file except in compliance with the License.
 * 	You may obtain a copy of the License at
 *
 * 	  http://www.apache.org/licenses/LICENSE-2.0
 *
 * 	Unless required by applicable law or agreed to in writing, software
 * 	distributed under the License is distributed on an "AS IS" BASIS,
 * 	WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * 	See the License for the specific language governing permissions and
 * 	limitations under the License.
 * ----------------------------------------------------------------------------
 * If your use of this software includes any GPLv2 components:
 * 	This program is free software; you can redistribute it and/or
 * 	modify it under the terms of the GNU General Public License
 * 	as published by the Free Software Foundation; either version 2
 * 	of the License, or (at your option) any later version.
 *
 * 	This program is distributed in the hope that it will be useful,
 * 	but WITHOUT ANY WARRANTY; without even the implied warranty of
 * 	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * 	GNU General Public License for more details.
 *******************************************************************************/
package prerna.rdf.engine.wrappers;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

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

import prerna.auth.User;
import prerna.ds.RawGemlinSelectWrapper;
import prerna.engine.api.IConstructWrapper;
import prerna.engine.api.IDatabaseEngine;
import prerna.engine.api.IRawSelectWrapper;
import prerna.engine.api.ISelectWrapper;
import prerna.engine.impl.json.JsonWrapper;
import prerna.engine.impl.json.JsonWrapper2;
import prerna.engine.impl.web.WebWrapper;
import prerna.om.ThreadStore;
import prerna.query.interpreters.GremlinInterpreter;
import prerna.query.interpreters.IQueryInterpreter;
import prerna.query.querystruct.SelectQueryStruct;
import prerna.query.querystruct.evaluator.QueryStructExpressionIterator;
import prerna.usertracking.UserQueryTrackingThread;
import prerna.util.Constants;
import prerna.util.SemossDefaultEngines;

public class WrapperManager {

	// main job of this class is to take an engine
	// find the type of the engine
	// and the type of query
	// and then give back a wrapper
	// I need to make this completely through reflection
	// I will do that later

	private static final Logger classLogger = LogManager.getLogger(WrapperManager.class);
	private static WrapperManager manager = null;
	private static List ignoreDatabases = new ArrayList<>();
	{
		ignoreDatabases.addAll(SemossDefaultEngines.getIgnoreDatabaseOwlList());
		// add the OWLs as well
		ignoreDatabases.add(Constants.LOCAL_MASTER_DB + "_" + Constants.OWL_ENGINE_SUFFIX);
		ignoreDatabases.add(Constants.SECURITY_DB + "_" + Constants.OWL_ENGINE_SUFFIX);
		ignoreDatabases.add(Constants.SCHEDULER_DB + "_" + Constants.OWL_ENGINE_SUFFIX);
		ignoreDatabases.add(Constants.THEMING_DB + "_" + Constants.OWL_ENGINE_SUFFIX);
		ignoreDatabases.add(Constants.USER_TRACKING_DB + "_" + Constants.OWL_ENGINE_SUFFIX);
		ignoreDatabases.add(Constants.OWL_TEMPORAL_ENGINE_META);
	}
	
	private WrapperManager() {

	}

	public static WrapperManager getInstance() {
		if(manager != null) {
			return manager;
		}
		
		synchronized (WrapperManager.class) {
			if(manager == null) {
				manager = new WrapperManager();
			}
		}
		
		return manager;
	}
	
	// TODO >>>timb: REST - here add another engine type REMOTE or REST
	public IRawSelectWrapper getRawWrapper(IDatabaseEngine engine, SelectQueryStruct qs) throws Exception {
		return getRawWrapper(engine, qs, false);
	}

	public IRawSelectWrapper getRawWrapper(IDatabaseEngine engine, SelectQueryStruct qs, boolean delayExecIfPossible) throws Exception {
		String engineId = engine.getEngineId();
		boolean ignoreQueryLogging = ignoreDatabases.contains(engineId) 
				|| engineId.endsWith(Constants.OWL_ENGINE_SUFFIX)
				|| engineId.endsWith(Constants.RDBMS_INSIGHTS_ENGINE_SUFFIX);
		
		User user = ThreadStore.getUser();
		UserQueryTrackingThread queryT = null;
		if(!ignoreQueryLogging) {
			queryT = new UserQueryTrackingThread(user, engineId);
		}
		try {
			IRawSelectWrapper returnWrapper = null;
			boolean genQueryString = true;
			switch(engine.getDatabaseType()) {
				case SESAME : {
					returnWrapper = new RawSesameSelectWrapper();
					break;
				}
				case JENA : {
					returnWrapper = new RawJenaSelectWrapper();
					break;
				}
				case RDBMS : {
					returnWrapper = new RawRDBMSSelectWrapper();
					break;
				}
				case IMPALA : {
					returnWrapper = new RawImpalaSelectWrapper(qs);
					break;
				}
				case R : {
					long start = System.currentTimeMillis();
					genQueryString = false;
					returnWrapper = new RawRSelectWrapper();
					IQueryInterpreter interpreter = engine.getQueryInterpreter();
					interpreter.setQueryStruct(qs);
					String query = interpreter.composeQuery();
					classLogger.debug("Executing query on engine " + engine.getEngineId());
					returnWrapper.setEngine(engine);
					returnWrapper.setQuery(query);
					// we need to pass the qs to properly set the limit/offset
					// since R will still run even if the limit+offset is > numRows and return null entries
					((RawRSelectWrapper) returnWrapper).execute(qs);
					long end = System.currentTimeMillis();
					classLogger.debug("Engine execution time = " + (end-start) + "ms");
					break;
				}
				case JSON : {
					returnWrapper = new JsonWrapper();
					break;
				}
				case JSON2 : {
					returnWrapper = new JsonWrapper2();
					break;
				}
		//		case JMES_API : {
		//			returnWrapper = new JmesWrapper();
		//			break;
		//		}
				case WEB : {
					returnWrapper = new WebWrapper();
					break;
				}
				case TINKER : {
					long start = System.currentTimeMillis();
					genQueryString = false;
					// since we dont do math on gremlin
					// right now, we will just construct and return a QSExpressionIterator
					GremlinInterpreter interpreter = (GremlinInterpreter) engine.getQueryInterpreter();
					interpreter.setQueryStruct(qs);
					RawGemlinSelectWrapper gdi = new RawGemlinSelectWrapper(interpreter, qs);
					queryT.setStartTimeNow();
					gdi.execute();
					queryT.setQuery(interpreter.getQueryString());
					returnWrapper = new QueryStructExpressionIterator(gdi, qs);
					returnWrapper.execute();
					queryT.setEndTimeNow();
					long end = System.currentTimeMillis();
					classLogger.debug("Engine execution time = " + (end-start) + "ms");
					break;
				}
				case JANUS_GRAPH : {
					long start = System.currentTimeMillis();
					genQueryString = false;
					// since we dont do math on gremlin
					// right now, we will just construct and return a QSExpressionIterator
					GremlinInterpreter interpreter = (GremlinInterpreter) engine.getQueryInterpreter();
					interpreter.setQueryStruct(qs);
					RawGemlinSelectWrapper gdi = new RawGemlinSelectWrapper(interpreter, qs);
					gdi.execute();
					returnWrapper = new QueryStructExpressionIterator(gdi, qs);
					returnWrapper.execute();
					long end = System.currentTimeMillis();
					classLogger.debug("Engine execution time = " + (end-start) + "ms");
					break;
				}
				case DATASTAX_GRAPH : {
					long start = System.currentTimeMillis();
					genQueryString = false;
					// since we dont do math on gremlin
					// right now, we will just construct and return a QSExpressionIterator
					GremlinInterpreter interpreter = (GremlinInterpreter) engine.getQueryInterpreter();
					interpreter.setQueryStruct(qs);
					RawGemlinSelectWrapper gdi = new RawGemlinSelectWrapper(interpreter, qs);
					gdi.execute();
					returnWrapper = new QueryStructExpressionIterator(gdi, qs);
					returnWrapper.execute();
					long end = System.currentTimeMillis();
					classLogger.debug("Engine execution time = " + (end-start) + "ms");
					break;
				}
				case REMOTE_SEMOSS : {
					// TODO >>>timb: REST - either replace with rest remote or remove this
				}
//				case NEO4J_EMBEDDED : {
//					returnWrapper = new Neo4jWrapper();
//					break;
//				}
				case NEO4J : {
					returnWrapper = new RawRDBMSSelectWrapper();
					break;
				}
				default: {
					//TODO: build iterator
					break;
				}
			}
	
			if (returnWrapper == null) {
				throw new NullPointerException("No wrapper has been identifier for engine of type " + engine.getDatabaseType());
			}
	
			if(genQueryString) {
				boolean error = false;
				String query = null;
				try {
					long start = System.currentTimeMillis();
					
					IQueryInterpreter interpreter = engine.getQueryInterpreter();
					interpreter.setQueryStruct(qs);
					query = interpreter.composeQuery();
					returnWrapper.setEngine(engine);
					returnWrapper.setQuery(query);
					if(ignoreQueryLogging) {
						if(!delayExecIfPossible) {
							classLogger.debug(User.getSingleLogginName(user) + " Running query on " + engine.getEngineId());
							returnWrapper.execute();
							
							long end = System.currentTimeMillis();
							long execTime = end - start;
							classLogger.debug(User.getSingleLogginName(user) + " Running query on " + engine.getEngineId() + " finished execution time = " + execTime + "ms");
						} else {
							classLogger.debug("Delaying query execution");
						}
					} else {
						// set the query for tracking
						queryT.setQuery(query);
						if(!delayExecIfPossible) {
							classLogger.info(User.getSingleLogginName(user) + " Running query on " + engine.getEngineId());
							// set the start time
							queryT.setStartTimeNow();
							// run
							returnWrapper.execute();
							// set the end time
							queryT.setEndTimeNow();
							
							long end = System.currentTimeMillis();
							long execTime = end - start;
							classLogger.info(User.getSingleLogginName(user) + " Running query on " + engine.getEngineId() + " finished execution time = " + execTime + "ms");
						} else {
							classLogger.info(User.getSingleLogginName(user) + " Delayed query execution on " + engine.getEngineId());
						}
					}
				} catch(Exception e) {
					if(queryT != null) { queryT.setFailed(); };
					classLogger.error(Constants.STACKTRACE, e);
					error = true;
					throw e;
				} finally {
					// clean up errors 
					// if the wrapper is created
					// but not returned
					if(error && returnWrapper != null) {
						if(classLogger.isDebugEnabled()) {
							classLogger.error("Error occurred executing query on engine " + engine.getEngineId() + " with query = " + query);
						}
						try {
							returnWrapper.close();
						} catch(IOException e) {
							classLogger.error(Constants.STACKTRACE, e);
						}
					}
				}
			}
			
			return returnWrapper;
		} finally {
			if(queryT != null && !ignoreQueryLogging && !delayExecIfPossible) {
				new Thread(queryT).start();
			}
		}
	}

	/**
	 * 
	 * @param engine
	 * @param query
	 * @return
	 * @throws Exception
	 */
	public IRawSelectWrapper getRawWrapper(IDatabaseEngine engine, String query) throws Exception {
		String engineId = engine.getEngineId();
		boolean ignoreQueryLogging = ignoreDatabases.contains(engineId) 
				|| engineId.endsWith(Constants.OWL_ENGINE_SUFFIX)
				|| engineId.endsWith(Constants.RDBMS_INSIGHTS_ENGINE_SUFFIX);
		
		User user = ThreadStore.getUser();
		UserQueryTrackingThread queryT = null;
		if(!ignoreQueryLogging) {
			queryT = new UserQueryTrackingThread(user, engineId);
		}
		try {
			IRawSelectWrapper returnWrapper = null;
			switch(engine.getDatabaseType()) {
				case SESAME : {
					returnWrapper = new RawSesameSelectWrapper();
					break;
				}
				case JENA : {
					returnWrapper = new RawJenaSelectWrapper();
					break;
				}
				case RDBMS : {
					returnWrapper = new RawRDBMSSelectWrapper();
					break;
				}
				case IMPALA : {
					returnWrapper = new RawImpalaSelectWrapper();
					break;
				}
				case R : {
					returnWrapper = new RawRSelectWrapper();
					break;
				}
				case JSON : {
					returnWrapper = new JsonWrapper();
					break;
				}
				case JSON2 : {
					returnWrapper = new JsonWrapper2();
					break;
				}
		//		case JMES_API : {
		//			returnWrapper = new JmesWrapper();
		//			break;
		//		}
				case WEB : {
					returnWrapper = new WebWrapper();
					break;
				}
				case REMOTE_SEMOSS : {
					// TODO >>>timb: REST - either replace with rest remote or remove this
					//TODO: build iterator
					break;
				}
//				case NEO4J_EMBEDDED : {
//					returnWrapper = new Neo4jWrapper();
//					break;
//				}
				case NEO4J: {
					returnWrapper = new RawRDBMSSelectWrapper();
					break;
				}
				default: {
		
				}
			}
	
			if (returnWrapper == null) {
				throw new NullPointerException("No wrapper has been identifier for engine of type " + engine.getDatabaseType());
			}

			boolean error = false;
			try {
				returnWrapper.setEngine(engine);
				returnWrapper.setQuery(query);
				if(ignoreQueryLogging) {
					classLogger.debug(User.getSingleLogginName(user) + " Running query on " + engine.getEngineId());
				} else {
					classLogger.info(User.getSingleLogginName(user) + " Running query on " + engine.getEngineId());
				}
				long start = System.currentTimeMillis();
				if(ignoreQueryLogging) {
					returnWrapper.execute();
				} else {
					// set the query for tracking
					queryT.setQuery(query);
					// set the start time
					queryT.setStartTimeNow();
					// run
					returnWrapper.execute();
					// set the end time
					queryT.setEndTimeNow();
				}
				
				long end = System.currentTimeMillis();
				long execTime = end - start;
				
				if(ignoreQueryLogging) {
					classLogger.debug(User.getSingleLogginName(user) + " Running query on " + engine.getEngineId() + " finished execution time = " + execTime + "ms");
				} else {
					classLogger.info(User.getSingleLogginName(user) + " Running query on " + engine.getEngineId() + " finished execution time = " + execTime + "ms");
				}
				
			} catch(Exception e) {
				if(queryT != null) { queryT.setFailed(); };
				classLogger.error(Constants.STACKTRACE, e);
				error = true;
				throw e;
			} finally {
				// clean up errors 
				// if the wrapper is created
				// but not returned
				if(error && returnWrapper != null) {
					if(classLogger.isDebugEnabled()) {
						classLogger.error("Error occurred executing query on engine " + engine.getEngineId() + " with query = " + query);
					}
					try {
						returnWrapper.close();
					} catch(IOException e) {
						classLogger.error(Constants.STACKTRACE, e);
					}
				}
			}
			
			return returnWrapper;
		} finally {
			if(!ignoreQueryLogging && queryT != null) {
				new Thread(queryT).start();
			}
		}
	}
	
	/////////////////////////////////////////////////////////////////////
	/////////////////////////////////////////////////////////////////////
	/////////////////////////////////////////////////////////////////////
	/////////////////////////////////////////////////////////////////////

	/*
	 * Deprecated methods
	 */

	@Deprecated
	public ISelectWrapper getSWrapper(IDatabaseEngine engine, String query) {
		ISelectWrapper returnWrapper = null;
		switch(engine.getDatabaseType()) {
			case SESAME : {
				returnWrapper = new SesameSelectWrapper();
				break;
			}
			case JENA : {
				returnWrapper = new JenaSelectWrapper();
				break;
			}
			case SEMOSS_SESAME_REMOTE : {
				returnWrapper = new RemoteSesameSelectWrapper();
				break;
			}
			case RDBMS : {
				returnWrapper = new RDBMSSelectWrapper();
				break;
			}
			default: {
	
			}
		}

		if (returnWrapper == null) {
			throw new NullPointerException("No wrapper has been identifier for engine of type " + engine.getDatabaseType());
		}

		classLogger.debug(returnWrapper.getClass() + " executing query: " + query);
		returnWrapper.setEngine(engine);
		returnWrapper.setQuery(query);
		try {
			returnWrapper.execute();
		} catch (Exception e) {
			classLogger.error(Constants.STACKTRACE, e);
		}
		returnWrapper.getDisplayVariables();
		returnWrapper.getPhysicalVariables();
		return returnWrapper;
	}

	@Deprecated
	public IConstructWrapper getCWrapper(IDatabaseEngine engine, String query) {
		IConstructWrapper returnWrapper = null;
		switch(engine.getDatabaseType())
		{
			case SESAME : {
				returnWrapper = new SesameConstructWrapper();
				break;
			}
			case JENA : {
				returnWrapper = new JenaConstructWrapper();
				break;
			}
			case SEMOSS_SESAME_REMOTE : {
				returnWrapper = new RemoteSesameConstructWrapper();
				break;
			}
			case RDBMS : {
				//TBD
			}
	
			default: {
	
			}
		}

		if (returnWrapper == null) {
			throw new NullPointerException("returnWrapper cannot be null here.");
		}

		returnWrapper.setEngine(engine);
		returnWrapper.setQuery(query);
		try {
			returnWrapper.execute();
		} catch (Exception e) {
			classLogger.error(Constants.STACKTRACE, e);
		}
		return returnWrapper;
	}

	@Deprecated
	public IConstructWrapper getChWrapper(IDatabaseEngine engine, String query) {
		IConstructWrapper returnWrapper = null;
		switch(engine.getDatabaseType())
		{
			case SESAME : {
				returnWrapper = new SesameSelectCheater();
				break;
			}
			case JENA : {
				returnWrapper = new JenaSelectCheater();
				break;
			}
//			case SEMOSS_SESAME_REMOTE : {
//				returnWrapper = new RemoteSesameSelectCheater();
//				break;
//			}
			case RDBMS : {
				returnWrapper = new RDBMSSelectCheater();
				break;
			}
			default: {
	
			}
		}

		if (returnWrapper == null) {
			throw new NullPointerException("No wrapper has been identifier for engine of type " + engine.getDatabaseType());
		}

		returnWrapper.setEngine(engine);
		returnWrapper.setQuery(query);
		try {
			returnWrapper.execute();
		} catch (Exception e) {
			classLogger.error(Constants.STACKTRACE, e);
		}
		return returnWrapper;
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy