package com.linkedin.cubert.utils;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.node.ArrayNode;
import org.codehaus.jackson.node.ObjectNode;
import org.codehaus.jackson.node.JsonNodeFactory;
public class RewriteUtils
{
public static ObjectNode createProjectionExpressionNode(String outColName, String inColName){
return JsonUtils.createObjectNode("col_name", outColName, "expression", createProjection(inColName));
}
public static ObjectNode createProjection(String gcol)
{
if (gcol.split("\\.").length == 1)
return createSimpleColumnNode(gcol);
else
return createdNestedColumnNode(gcol);
}
private static ObjectNode createSimpleColumnNode(String gcol)
{
return createFunctionNode("INPUT_PROJECTION",
(gcol));
}
private static ObjectNode createdNestedColumnNode(String gcol)
{
String[] nestedFields = gcol.split("\\.");
if (nestedFields.length < 2)
throw new RuntimeException("Too few arguments in nested column expression for column " + gcol + " split array len =" + nestedFields.length);
ObjectNode toplevelColumn = createSimpleColumnNode(nestedFields[0]);
ObjectNode childNode = toplevelColumn;
ObjectNode resultNode = toplevelColumn;
for (int i = 1; i < nestedFields.length; i++)
{
resultNode = JsonUtils.createObjectNode();
resultNode.put("function", "PROJECTION");
ArrayNode argsNode = JsonUtils.createArrayNode();
argsNode.add(childNode);
argsNode.add(nestedFields[i]);
resultNode.put("arguments", argsNode);
childNode = resultNode;
}
return resultNode;
}
public static ObjectNode createTupleInputNode()
{
return JsonUtils.createObjectNode("function", "TUPLE_INPUT");
}
public static ObjectNode createStringConstant(String value)
{
return createFunctionNode("CONSTANT", value);
}
public static ObjectNode createIntegerConstant(Integer value){
return createFunctionNode("CONSTANT", JsonNodeFactory.instance.numberNode(value.intValue()));
}
public static ObjectNode createBooleanConstant(boolean value)
{
return createFunctionNode("CONSTANT", JsonNodeFactory.instance.booleanNode(value));
}
public static ObjectNode createDoubleConstant(Double value)
{
return createFunctionNode("CONSTANT", JsonNodeFactory.instance.numberNode(value.doubleValue()));
}
public static JsonNode createFunctionExpressionNode(String outColName,
String funcName,
JsonNode... args)
{
return JsonUtils.createObjectNode("col_name", outColName,
"expression",
createFunctionNode(funcName, args));
}
public static JsonNode createFunctionExpressionNode(String outColName,
String funcName,
String... args)
{
return JsonUtils.createObjectNode("col_name",
outColName,
"expression",
createFunctionNode(funcName, args));
}
public static ObjectNode createFunctionNode(String funcName, JsonNode... args)
{
ArrayNode argsNode = JsonUtils.createArrayNode(args);
return JsonUtils.createObjectNode("function", funcName, "arguments", argsNode);
}
public static ObjectNode createFunctionNode(String funcName, String... args)
{
ArrayNode argsNode = JsonUtils.createArrayNode(args);
return JsonUtils.createObjectNode("function", funcName, "arguments", argsNode);
}
public static String[] getInputRelations(ObjectNode opNode)
{
String[] inputRelations;
if (opNode.get("input") instanceof ArrayNode)
inputRelations = JsonUtils.asArray(opNode.get("input"));
else
inputRelations = new String[]{opNode.get("input").getTextValue()};
return inputRelations;
}
public static boolean hasSummaryRewrite(ObjectNode programNode){
if (programNode.get("summaryRewrite") != null &&
programNode.get("summaryRewrite").getTextValue().equals("true"))
return true;
return false;
}
public static ObjectNode createObjectNode(Object... keyvals)
{
ObjectNode result = JsonUtils.createObjectNode(keyvals);
result.put("line", "summary rewriter generated");
return result;
}
public static ObjectNode createGenerateNode(String inputRelation, String outputRelation, Object... generateArgs){
ArrayNode funcsNode = JsonUtils.createArrayNode();
ObjectNode result = JsonUtils.createObjectNode("input", inputRelation, "output", outputRelation,
"operator", "GENERATE", "outputTuple", funcsNode);
for (int i=0; i < generateArgs.length/2; i++){
if (! (generateArgs[2*i] instanceof String))
throw new RuntimeException("Generated column " + generateArgs[2*i] + " not instance of String");
String outColumn = (String) generateArgs[2*i];
ObjectNode outExpr;
if (generateArgs[2*i+1] instanceof String)
outExpr = createProjection((String) generateArgs[2*i+1]);
else
outExpr = (ObjectNode) generateArgs[2*i+1];
funcsNode.add(JsonUtils.createObjectNode("col_name", outColumn, "expression", outExpr));
}
return result;
}
}