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

prerna.usertracking.EngineUsageUtils Maven / Gradle / Ivy

The newest version!
package prerna.usertracking;

import java.io.IOException;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.TimeZone;

import org.apache.commons.lang3.tuple.Pair;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import prerna.engine.api.IHeadersDataRow;
import prerna.engine.api.IRawSelectWrapper;
import prerna.query.querystruct.SelectQueryStruct;
import prerna.query.querystruct.filters.SimpleQueryFilter;
import prerna.query.querystruct.selectors.QueryColumnSelector;
import prerna.query.querystruct.selectors.QueryFunctionHelper;
import prerna.query.querystruct.selectors.QueryFunctionSelector;
import prerna.rdf.engine.wrappers.WrapperManager;
import prerna.util.Constants;
import prerna.util.QueryExecutionUtility;

public class EngineUsageUtils extends UserTrackingUtils {
	
	private static Logger logger = LogManager.getLogger(EngineUsageUtils.class);
	private static String EU_TN = "ENGINE_USES";
	private static String EU_PRE = "ENGINE_USES__";

	public static void add(Set queriedDatabaseIds, String insightId, String projectId) {
		queriedDatabaseIds.forEach(databaseId -> add(databaseId, insightId, projectId));
	}
	
	public static void update(Set queriedDatabaseIds, String insightId, String projectId) {
		List existingDbs = get(insightId, projectId);
		
		for (String db : queriedDatabaseIds) {
			if (existingDbs.remove(db)) {
				// update existing
				update(db, insightId, projectId);
			} else {
				// add new
				add(db, insightId, projectId);
			}
		}
		
		for (String db : existingDbs) {
			// remove no longer used
			remove(db, insightId, projectId);
		}
	}
	
	private static List get(String insightId, String projectId) {
		SelectQueryStruct qs = new SelectQueryStruct();
		qs.addSelector(new QueryColumnSelector(EU_PRE + "ENGINEID"));

		qs.addExplicitFilter(SimpleQueryFilter.makeColToValFilter(EU_PRE + "INSIGHTID", "==", insightId));
		qs.addExplicitFilter(SimpleQueryFilter.makeColToValFilter(EU_PRE + "PROJECTID", "==", projectId));

		return QueryExecutionUtility.flushToListString(userTrackingDb, qs);
	}

	private static void add(String engineId, String insightId, String projectId) {
		add(engineId, insightId, projectId, LocalDate.now(ZoneId.of("UTC")));
	}
	
	private static void update(String engineId, String insightId, String projectId) {
		update(engineId, insightId, projectId, LocalDate.now(ZoneId.of("UTC")));
	}

	private static void add(String engineId, String insightId, String projectId, LocalDate date) {
		String query = "INSERT INTO " + EU_TN + " VALUES (?, ?, ?, ?)";

		PreparedStatement ps = null;
		try {
			ps = userTrackingDb.getPreparedStatement(query);
			int index = 1;
			ps.setString(index++, engineId);
			ps.setString(index++, insightId);
			ps.setString(index++, projectId);
			ps.setDate(index++, java.sql.Date.valueOf(date));

			ps.execute();
			if (!ps.getConnection().getAutoCommit()) {
				ps.getConnection().commit();
			}
		} catch (Exception e) {
			logger.error(Constants.STACKTRACE, e);
		} finally {
			if (ps != null) {
				try {
					ps.close();
				} catch (SQLException e) {
					logger.error(Constants.STACKTRACE, e);
				}
			}
		}
	}

	private static void update(String engineId, String insightId, String projectId, LocalDate date) {
		String query = "UPDATE " + EU_TN + " SET DATE = ? WHERE ENGINEID = ? AND INSIGHTID = ? "
				+ "AND PROJECTID = ?";

		PreparedStatement ps = null;
		try {
			ps = userTrackingDb.getPreparedStatement(query);
			int index = 1;

			ps.setDate(index++, java.sql.Date.valueOf(date));
			ps.setString(index++, engineId);
			ps.setString(index++, insightId);
			ps.setString(index++, projectId);

			ps.execute();
			if (!ps.getConnection().getAutoCommit()) {
				ps.getConnection().commit();
			}
		} catch (Exception e) {
			logger.error(Constants.STACKTRACE, e);
		} finally {
			if (ps != null) {
				try {
					ps.close();
				} catch (SQLException e) {
					logger.error(Constants.STACKTRACE, e);
				}
			}
		}
	}
	
	private static void remove(String engineId, String insightId, String projectId) {
		String query = "DELETE FROM " + EU_TN + " where ENGINEID = ? AND INSIGHTID = ? AND PROJECTID = ?";

		PreparedStatement ps = null;
		try {
			ps = userTrackingDb.getPreparedStatement(query);
			int index = 1;
			ps.setString(index++, engineId);
			ps.setString(index++, insightId);
			ps.setString(index++, projectId);
			ps.execute();
			if (!ps.getConnection().getAutoCommit()) {
				ps.getConnection().commit();
			}
		} catch (Exception e) {
			logger.error(Constants.STACKTRACE, e);
		} finally {
			if (ps != null) {
				try {
					ps.close();
				} catch (SQLException e) {
					logger.error(Constants.STACKTRACE, e);
				}
			}
		}
	}
	
	public static List> getInInsights(String engineId) {
		SelectQueryStruct qs = new SelectQueryStruct();

		qs.addSelector(new QueryColumnSelector(EU_PRE + "INSIGHTID", "insightid"));
		qs.addSelector(new QueryColumnSelector(EU_PRE + "PROJECTID", "projectid"));
		qs.addExplicitFilter(SimpleQueryFilter.makeColToValFilter(EU_PRE + "ENGINEID", "==", engineId));

		IRawSelectWrapper wrapper = null;
		List> insightids = new ArrayList<>();
		try {
			wrapper = WrapperManager.getInstance().getRawWrapper(userTrackingDb, qs);
			while (wrapper.hasNext()) {
				IHeadersDataRow row = wrapper.next();
				String insight = row.getValues()[0].toString();
				String project = row.getValues()[1].toString();
				insightids.add(Pair.of(insight, project));
			}
		} catch (Exception e) {
			logger.error(Constants.STACKTRACE, e);
		} finally {
			if (wrapper != null) {
				try {
					wrapper.close();
				} catch (IOException e) {
					logger.error(Constants.STACKTRACE, e);
				}
			}
		}

		return insightids;
	}

	public static List> getByDate(String engineId) {
		SelectQueryStruct qs = new SelectQueryStruct();

		QueryFunctionSelector function = new QueryFunctionSelector();
		function.addInnerSelector(new QueryColumnSelector(EU_PRE + "INSIGHTID"));
		function.setFunction(QueryFunctionHelper.COUNT);
		function.setAlias("total_uses");
		qs.addSelector(function);
		qs.addSelector(new QueryColumnSelector(EU_PRE + "DATE"));

		String lastYear = LocalDate.now().minusYears(1).toString();
		qs.addExplicitFilter(SimpleQueryFilter.makeColToValFilter(EU_PRE + "DATE", ">", lastYear));
		qs.addExplicitFilter(SimpleQueryFilter.makeColToValFilter(EU_PRE + "ENGINEID", "==", engineId));
		qs.addGroupBy(new QueryColumnSelector(EU_PRE + "DATE"));
		qs.addGroupBy(new QueryColumnSelector(EU_PRE + "INSIGHTID"));

		IRawSelectWrapper wrapper = null;
		List> viewsByDate = new ArrayList<>();
		try {
			wrapper = WrapperManager.getInstance().getRawWrapper(userTrackingDb, qs);
			while (wrapper.hasNext()) {
				IHeadersDataRow row = wrapper.next();
				Integer view = ((Long) row.getValues()[0]).intValue();
				String date = row.getValues()[1].toString();
				viewsByDate.add(Pair.of(date, view));
			}
		} catch (Exception e) {
			logger.error(Constants.STACKTRACE, e);
		} finally {
			if (wrapper != null) {
				try {
					wrapper.close();
				} catch (IOException e) {
					logger.error(Constants.STACKTRACE, e);
				}
			}
		}

		return viewsByDate;
	}
	
	// return the most used catalog in the past month
	// easy solution that I think provides real value.
	// probably not the most exact/in depth solution, but I do believe its the best
	// If we went off views, then we may trending something to people to look at and not use
	// which would keep it stuck in the trending section, which would cause it to get viewed more
	// and we would never display a useful catalog.
	public static List getTrendingDatabases(int limit, List accessibleDbs) {
		SelectQueryStruct qs = new SelectQueryStruct();
		qs.addSelector(new QueryColumnSelector(EU_PRE + "ENGINEID"));
		
		QueryFunctionSelector count = new QueryFunctionSelector();
		count.addInnerSelector(new QueryColumnSelector(EU_PRE + "ENGINEID"));
		count.setAlias("engine_uses");
		count.setFunction(QueryFunctionHelper.COUNT);
		qs.addSelector(count);
		
		// filter out any non viewable databases
		qs.addExplicitFilter(SimpleQueryFilter.makeColToValFilter(EU_PRE + "ENGINEID", "==", accessibleDbs));

		LocalDate now = LocalDate.now(TimeZone.getTimeZone("UTC").toZoneId());
		LocalDate lastMonth = now.minusMonths(1);
		qs.addExplicitFilter(SimpleQueryFilter.makeColToValFilter(EU_PRE + "DATE", ">", lastMonth));
		
		qs.addGroupBy(new QueryColumnSelector(EU_PRE + "ENGINEID"));
		
		qs.addOrderBy("engine_uses", "desc");
		qs.setLimit(limit);
		
		
		return QueryExecutionUtility.flushToListString(userTrackingDb, qs);
	}
	
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy