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

prerna.reactor.planner.graph.RunPlanReactor Maven / Gradle / Ivy

The newest version!
package prerna.reactor.planner.graph;

import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.tinkerpop.gremlin.structure.Vertex;

import com.google.common.collect.Lists;

import prerna.reactor.BaseJavaRuntime;
import prerna.reactor.PixelPlanner;
import prerna.sablecc2.om.GenRowStruct;
import prerna.sablecc2.om.PixelDataType;
import prerna.sablecc2.om.nounmeta.NounMetadata;

public class RunPlanReactor extends AbstractPlannerReactor {

	private static final Logger LOGGER = LogManager.getLogger(RunPlanReactor.class.getName());

	@Override
	public NounMetadata execute() {
		long start = System.currentTimeMillis();

		PixelPlanner planner = getPlanner();
		PixelPlanner basePlanner = getBasePlanner();
		List pksls = new LinkedList();
		Class superClass = null;
		Map mainMap = (Map) planner.getProperty("MAIN_MAP", "MAIN_MAP");
		if (basePlanner != null) {
			// We are excuting a plan based on a base plan
			// 1. copy the Main Map to Base Map
			// 2. Get the super class from the base plan
			superClass = (Class) basePlanner.getProperty("RUN_CLASS", "RUN_CLASS");
			Map baseMap = new HashMap((HashMap) basePlanner.getProperty("MAIN_MAP", "MAIN_MAP"));
			planner.addProperty("BASE_MAP", "BASE_MAP", baseMap);

			// Exclude nodes already in base plan
			mainMap.keySet().removeAll(baseMap.keySet());
		}

		// using the root vertices
		// iterate down all the other vertices and add the signatures
		// for the desired travels in the appropriate order
		// note: this is adding to the list of undefined variables
		// calculated at beginning of class
		traverseDownstreamVertsProcessor(planner, pksls);

		// now we can the pksls

		RuntimeJavaClassBuilder builder = new RuntimeJavaClassBuilder();
		long startTime = System.currentTimeMillis();
		List fieldsList = buildFields(mainMap, planner, builder);
		long endTime = System.currentTimeMillis();
		LOGGER.info("****************    Build fields " + (endTime - startTime) + "ms      *************************");

		startTime = System.currentTimeMillis();
		superClass = buildSuperClassWithOnlyFields(fieldsList, superClass);
		endTime = System.currentTimeMillis();
		LOGGER.info("****************    Build Super Clases with Fields " + (endTime - startTime) + "ms      *************************");
		
		startTime = System.currentTimeMillis();
		builder.addEquations(pksls);
		endTime = System.currentTimeMillis();
		LOGGER.info("****************    Add equations " + (endTime - startTime) + "ms      *************************");

		startTime = System.currentTimeMillis();
		builder.addFields(fieldsList);
		endTime = System.currentTimeMillis();
		LOGGER.info("****************    Add equations " + (endTime - startTime) + "ms      *************************");

		startTime = System.currentTimeMillis();
		builder.setSuperClass(superClass);
		endTime = System.currentTimeMillis();
		LOGGER.info("****************    Set super " + (endTime - startTime) + "ms      *************************");
		
		startTime = System.currentTimeMillis();
		Class javaClass = builder.generateClass();
		endTime = System.currentTimeMillis();
		LOGGER.info("****************    Build Class " + (endTime - startTime) + "ms      *************************");

		planner.addProperty("RUN_CLASS", "RUN_CLASS", javaClass);
		return new NounMetadata(planner, PixelDataType.PLANNER);
	}

	private PixelPlanner getPlanner() {
		GenRowStruct allNouns = getNounStore().getNoun(PixelDataType.PLANNER.getKey());
		PixelPlanner planner = null;
		if (allNouns != null) {
			planner = (PixelPlanner) allNouns.get(0);
			return planner;
		} else {
			return this.planner;
		}
	}

	private Class buildSuperClassWithOnlyFields(List fieldsList, Class superClass) {
		for (List partList : Lists.partition(fieldsList, fieldsList.size()/2)) {
			RuntimeJavaClassBuilder superClassBuilder = new RuntimeJavaClassBuilder();
			superClassBuilder.addFields(partList);
			if(superClass != null){
				superClassBuilder.setSuperClass(superClass);
			}
			superClass = superClassBuilder.generateClassWithOnlyFields();
		}
		fieldsList.clear();
		return superClass;
	}

	private List buildFields(Map mainMap, PixelPlanner planner,
			RuntimeJavaClassBuilder builder) {
		List fields = new LinkedList<>();
		Set assignedFields = new HashSet<>();
		for (String assignment : planner.getVariables()) {
			if (!assignedFields.contains(assignment)) {
				NounMetadata noun = planner.getVariableValue(assignment);
				if (noun != null) {
					PixelDataType nounType = noun.getNounType();
					Object nounValue = noun.getValue();
					String field = "";
					// String addToMapString = "{a(\"" + assignment + "\"," +
					// assignment + ");}";
					boolean isValidTypeFlag = false;
					if (nounType == PixelDataType.CONST_DECIMAL || nounType == PixelDataType.CONST_INT) {
						field = "public double " + assignment + " = " + nounValue + ";";
						isValidTypeFlag = true;
					} else if (nounType == PixelDataType.CONST_STRING) {
						field = "public String " + assignment + " = \"" + nounValue + "\";";
						isValidTypeFlag = true;
					} else if (nounType == PixelDataType.BOOLEAN) {
						field = "public boolean " + assignment + " = " + nounValue + ";";
						isValidTypeFlag = true;
					}
					if (isValidTypeFlag) {
						fields.add(field);
						assignedFields.add(assignment);
					}

				}
			}

		}

		for (String assignment : mainMap.keySet()) {
			if (!assignedFields.contains(assignment)) {
				String value = mainMap.get(assignment);
				String field = "public " + value + " " + assignment;
				boolean isValidType = false;
				if (value.equals("double") || value.equals("int")) {
					field += " = 0.0;";
					isValidType = true;
				} else if (value.equals("String")) {
					field += " = \"\";";
					isValidType = true;
				} else if (value.equals("boolean")) {
					field += " = true;\n";
					isValidType = true;
				}
				if (isValidType) {
					fields.add(field);
					assignedFields.add(assignment);
				}
			}
		}
		builder.variables = assignedFields;
		return fields;
	}

	/**
	 * We want to override the pksl that is extracted from the vertex so that we
	 * grab the java string instead of the pksl string
	 */
	@Override
	protected String getPksl(Vertex vert) {
		// get the java signatures
		try {
			if (vert.property("JAVA_SIGNATURE") != null) {
				String pkslOperation = vert.value("JAVA_SIGNATURE");
				if (pkslOperation.isEmpty()) {
					return pkslOperation;
				} else
					return pkslOperation + ";";
			}
			return "";
		} catch (Exception e) {
			return "";
		}
	}

	/**
	 * Get the Base Plan passed as the second Parameter
	 * 
	 * @return
	 */
	protected PixelPlanner getBasePlanner() {
		GenRowStruct allNouns = getNounStore().getNoun(PixelDataType.PLANNER.getKey());
		if (allNouns != null && allNouns.size() > 1) {
			Object secondParam = allNouns.get(1);
			if (secondParam != null) {
				PixelPlanner basePlan = (PixelPlanner) secondParam;
				return basePlan;
			}
		}
		return null;
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy