
prerna.util.usertracking.reactors.recommendations.DatabaseRecommendationsReactor Maven / Gradle / Ivy
The newest version!
package prerna.util.usertracking.reactors.recommendations;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.logging.log4j.Logger;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import prerna.auth.User;
import prerna.auth.utils.SecurityEngineUtils;
import prerna.ds.r.RSyntaxHelper;
import prerna.reactor.frame.r.AbstractRFrameReactor;
import prerna.sablecc2.om.GenRowStruct;
import prerna.sablecc2.om.PixelDataType;
import prerna.sablecc2.om.PixelOperationType;
import prerna.sablecc2.om.ReactorKeysEnum;
import prerna.sablecc2.om.execptions.SemossPixelException;
import prerna.sablecc2.om.nounmeta.NounMetadata;
import prerna.util.Utility;
public class DatabaseRecommendationsReactor extends AbstractRFrameReactor {
protected static final String CLASS_NAME = DatabaseRecommendationsReactor.class.getName();
public static final String COMMUNITIES = "communities";
public DatabaseRecommendationsReactor() {
this.keysToGet = new String[] { COMMUNITIES, ReactorKeysEnum.ACCESS.getKey() };
}
@Override
public NounMetadata execute() {
init();
organizeKeys();
Logger logger = getLogger(CLASS_NAME);
HashMap recommendations = new HashMap();
String[] packages = { "igraph", "jsonlite" };
String userName = "null";
User user = this.insight.getUser();
String baseFolder = Utility.getBaseFolder();
// Check to make sure that the necessary files exist
File itemsim = new File(baseFolder + DIR_SEPARATOR + "R" + DIR_SEPARATOR + "Recommendations" + DIR_SEPARATOR + "dataitem-itemsim.rds");
File usersim = new File(baseFolder + DIR_SEPARATOR + "R" + DIR_SEPARATOR + "Recommendations" + DIR_SEPARATOR + "dataitem-usersim.rds");
if (!itemsim.exists() || !usersim.exists()) {
String message = "Necessary files missing to generate recommendations. Please run UpdateQueryData().";
NounMetadata noun = new NounMetadata(message, PixelDataType.CONST_STRING, PixelOperationType.ERROR);
SemossPixelException exception = new SemossPixelException(noun);
exception.setContinueThreadOfExecution(false);
throw exception;
}
if (user == null) {
String message = "Please login to enable recommendation features.";
NounMetadata noun = new NounMetadata(message, PixelDataType.CONST_STRING, PixelOperationType.ERROR);
SemossPixelException exception = new SemossPixelException(noun);
exception.setContinueThreadOfExecution(false);
throw exception;
}
if (rJavaTranslator.checkPackages(packages, logger) && user != null) {
// Step 1:
// Run an R script to generate all communities, then get
// additional data for each engine that exists on this machine,
// package it up as a map to add to a list of outputs for the FE.
boolean accessFlag = getAccessBool();
userName = user.getAccessToken(user.getLogins().get(0)).getId();
StringBuilder esb = new StringBuilder();
esb.append(RSyntaxHelper.loadPackages(packages));
esb.append("source(\"" + baseFolder + "\\R\\Recommendations\\db_recom.r\"); ");
esb.append("fileroot<-\"" + baseFolder + "\\R\\Recommendations\\dataitem\" ; ");
String varR = esb.toString().replace("\\", "/");
// run communities script
String communityOutput = Utility.getRandomString(8);
List myEngines = SecurityEngineUtils.getFullUserEngineIds(this.insight.getUser());
String items = "";
for (int row = 0; row < myEngines.size(); row++) {
String dbid = myEngines.get(row);
String dbname = SecurityEngineUtils.getEngineAliasForId(dbid);
String oneItem = dbid + "$" + dbname + "$";
if(row < myEngines.size() - 1) {
items += "\"" + oneItem + "\", ";
}else {
items += "\"" + oneItem + "\"";
}
}
StringBuilder rsb = new StringBuilder();
rsb.append(communityOutput + "<- locate_data_communities(fileroot,items=c(" + items + "));");
rsb.append(communityOutput + "<- jsonlite::toJSON(" + communityOutput + "[3]);");
// Step 2:
// Run another R script to generate user specific recommendations,
// add additional data and package as a map to be added to the list
// for the FE.
String userSpecificOutput = Utility.getRandomString(8);
//rsb.append(userSpecificOutput + "<- dataitem_recom_mgr(\"" + userName + "\",fileroot);");
rsb.append(userSpecificOutput + "<- dataitem_recom_mgr(\"" + userName + "\",fileroot,items=c(" + items + "));");
rsb.append(userSpecificOutput + "<- jsonlite::toJSON(as.data.table(" + userSpecificOutput
+ "[2])[,1:2], byrow = TRUE, colNames = TRUE);");
String funcR = rsb.toString();
this.rJavaTranslator.runR(varR + funcR);
List enginesWithAccess = SecurityEngineUtils.getFullUserEngineIds(this.insight.getUser());
ArrayList
© 2015 - 2025 Weber Informatics LLC | Privacy Policy