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

prerna.util.usertracking.reactors.UpdateSemanticDataReactor Maven / Gradle / Ivy

The newest version!
package prerna.util.usertracking.reactors;

import java.io.File;
import java.util.List;

import org.apache.logging.log4j.Logger;

import prerna.auth.utils.SecurityEngineUtils;
import prerna.reactor.frame.r.AbstractRFrameReactor;
import prerna.sablecc2.om.PixelDataType;
import prerna.sablecc2.om.PixelOperationType;
import prerna.sablecc2.om.nounmeta.NounMetadata;
import prerna.util.Utility;
import prerna.util.usertracking.UserTrackerFactory;

/**
 * Pulls column descriptions from semantic table Generates the .rds files to
 * create recommendations and search
 */
public class UpdateSemanticDataReactor extends AbstractRFrameReactor {

	private static final String CLASS_NAME = UpdateSemanticDataReactor.class.getName();

	@Override
	public NounMetadata execute() {
		if (UserTrackerFactory.isTracking()) {
			init();
			Logger logger = getLogger(CLASS_NAME);
			// NEW: Updating "datasemantic.tsv" and storing it in working
			// directory
			String[] packages = new String[] { "mlapi", "text2vec", "lattice", "foreach", "grid", "lambda.r",
					"futile.logger", "iterators", "RcppParallel", "digest", "Matrix", "lsa", "formatR",
					"futile.options", "codetools", "SnowballC", "compiler" };
			this.rJavaTranslator.checkPackages(packages);
			String extension = "?databases=";
			// read datadistrict file
			String[] relevantEngines = new String[10000]; //arbitrary size.. but should not have more than 10,000 relevant databases
			String baseFolder = Utility.getBaseFolder().replace("\\", "/");
			File f = new File(baseFolder + DIR_SEPARATOR + "R" + DIR_SEPARATOR + "Recommendations" + DIR_SEPARATOR + "dataitem-datadistrict.rds");

			if (f.exists()) {
				StringBuilder sb = new StringBuilder();
				sb.append("output <- readRDS(\"" + f.getPath() + "\");\n");
				sb.append("output;");
				String script = sb.toString().replace("\\", "/");
				relevantEngines = this.rJavaTranslator.getStringArray(script);
			} else {
				String message = "Unable to access required dataitem-datadistrict.rds file to update semantic data.";
				NounMetadata retNoun = new NounMetadata(false, PixelDataType.BOOLEAN);
				retNoun.addAdditionalReturn(
						new NounMetadata(message, PixelDataType.CONST_STRING, PixelOperationType.ERROR));
				return retNoun;
			}

			// generate list of databases and store it into an array
			for (String row : relevantEngines) {
				String[] parsed = row.split("\\$");
				extension += parsed[0] + ";";
			}
			
			List enginesWithAccess = SecurityEngineUtils.getFullUserEngineIds(this.insight.getUser());
			for (String row : enginesWithAccess) {
				extension+= row + ";";
			}

			String FILE_URL = Utility.getDIHelperProperty("T_ENDPOINT") + "exportTable/semantic" + extension;
			String FILE_NAME = "dataitem-datasemantic.tsv";
			String path = Utility.getBaseFolder().replace("\\", "/") + DIR_SEPARATOR + "R" + DIR_SEPARATOR + "Recommendations" + DIR_SEPARATOR;

			// server is available: Begin Method
			logger.info("Cacheing data semantic file");
			long start = System.currentTimeMillis();
			Utility.copyURLtoFile(FILE_URL, path + FILE_NAME);
			long end = System.currentTimeMillis();
			logger.info("Cacheing time " + (end - start) + " ms");

			File semanticData = new File(path + FILE_NAME);
			if (!semanticData.exists()) {
				String message = "Unable to connect to the server database for data query and visualization information.";
				NounMetadata retNoun = new NounMetadata(false, PixelDataType.BOOLEAN);
				retNoun.addAdditionalReturn(
						new NounMetadata(message, PixelDataType.CONST_STRING, PixelOperationType.ERROR));
				return retNoun;
			} else {
				// Updating the local file using "datasemantic.tsv"
				String rwd = "wd_" + Utility.getRandomString(8);
				StringBuilder rsb = new StringBuilder();
				rsb.append(rwd + "<- getwd();");
				rsb.append("setwd(\"" + baseFolder + "\\R\\Recommendations\");");

				// generate script for database recommendations
				rsb.append("source(\"db_recom.r\");");
				rsb.append("source(\"datasemantic.r\");");
				rsb.append("source(\"SemanticSimilarity\\lsi_dataitem.r\");");
				rsb.append("source(\"topic_modelling.r\");");
				String fileroot = baseFolder + "\\R\\Recommendations\\dataitem";
				rsb.append("refresh_semantic_mgr(\"" + fileroot + "\");");
				// set the work directory back to normal
				rsb.append("setwd(" + rwd + ");");
				// garbage collection
				String script = rsb.toString().replace("\\", "/");
				this.rJavaTranslator.runR(script);
				String gc = "rm(\"apply_tfidf\",                        \"assign_unique_concepts\","
						+ "\"blend_mgr\",                          \"blend_tracking_semantic\","
						+ "\"breakdown\",                          \"build_data_landmarks\","
						+ "\"build_dbid_domain\",                  \"build_query_doc\","
						+ "\"build_query_tdm\",                    \"build_sim\","
						+ "\"build_tdm\",                          \"col2db\","
						+ "\"col2tbl\",                            \"column_doc_mgr_do\","
						+ "\"column_doc_mgr_dopar\",               \"column_lsi_mgr\","
						+ "\"compute_column_desc_sim\",            \"compute_entity_sim\","
						+ "\"construct_column_doc\","
						+ "\"constructName\",                      \"cosine_jaccard_sim\","
						+ "\"create_column_doc\",                  \"data_domain_mgr\","
						+ "\"dataitem_history_do\",                \"dataitem_history_dopar\","
						+ "\"dataitem_recom_mgr\",                 \"datasemantic_history\","
						+ "\"discover_column_desc\",               \"drilldown_communities\","
						+ "\"exec_tfidf\",                         \"find_db\","
						+ "\"get_dataitem_rating\",                \"get_item_recom\","
						+ "\"get_items_users\",                    \"get_similar_doc\","
						+ "\"get_user_recom\",                     \"getSearchURL\","
						+ "\"hop_away_mgr\",                       \"hop_away_recom_mgr\","
						+ "\"jaccard_sim\",                        \"locate_data_communities\","
						+ "\"locate_data_district\",               \"locate_user_communities\","
						+ "\"lsi_mgr\",                            \"match_desc\","
						+ "\"populate_ratings\",                   \"read_datamatrix\","
						+ "\"refresh_base\",                       \"refresh_data_mgr\","
						+ "\"refresh_semantic_mgr\",               \"remove_files\"," + "\"semantic_tracking_mgr\", \""
						+ rwd + "\");";
				this.rJavaTranslator.runR(gc);
				return new NounMetadata(true, PixelDataType.BOOLEAN);
			}
		}
		return new NounMetadata(false, PixelDataType.BOOLEAN);
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy