@Override protected EvalNode visitDefaultFunctionEval(Object context, Stack<EvalNode> stack, FunctionEval functionEval) { stack.push(functionEval); if (functionEval.getArgs() != null) { EvalNode [] args = functionEval.getArgs(); for (int i = 0; i < args.length; i++) { visit(context, args[i], stack); if (args[i].getType() == EvalType.AND || args[i].getType() == EvalType.OR) { functionEval.setArg(i, rewrite((BinaryEval) args[i])); } } } stack.pop(); return functionEval; }
@Override public EvalNode visitFuncCall(EvalCodeGenContext context, FunctionEval function, Stack<EvalNode> stack) { super.visitFuncCall(context, function, stack); if (!context.symbols.containsKey(function)) { String fieldName = function.getFuncDesc().getFunctionName() + "_" + context.seqId++; context.symbols.put(function, fieldName); context.classWriter.visitField(Opcodes.ACC_PRIVATE, fieldName, "L" + TajoGeneratorAdapter.getInternalName(function.getFuncDesc().getLegacyFuncClass()) + ";", null, null); } return function; } }
@Override protected EvalNode visitFuncCall(Context context, FunctionEval func, Stack<EvalNode> stack) { // TODO - TAJO-1837 should be resolved if we support RDBMS functions better. stack.push(func); context.sb.append(func.getName()).append("("); boolean first = true; for (EvalNode param : func.getArgs()) { if (first) { first = false; } else { context.sb.append(","); } visit(context, param, stack); } context.sb.append(")"); stack.pop(); return func; }
@Override public EvalNode visitFuncCall(Object context, FunctionEval evalNode, Stack<EvalNode> stack) { boolean constantOfAllDescendents = true; if ("sleep".equals(evalNode.funcDesc.getFunctionName())) { constantOfAllDescendents = false; } else { if (evalNode.getArgs() != null) { for (EvalNode arg : evalNode.getArgs()) { arg = visit(context, arg, stack); constantOfAllDescendents &= (arg.getType() == EvalType.CONST); } } } if (constantOfAllDescendents && evalNode.getType() == EvalType.FUNCTION) { return new ConstEval(evalNode.bind(null, null).eval(null)); } else { return evalNode; } } }
public static void emit(EvalCodeGenerator generator, EvalCodeGenContext context, FunctionEval func, Stack<EvalNode> stack) { int paramNum = func.getArgs().length; context.push(paramNum); context.newArray(Datum.class); // new Datum[paramNum] EvalNode [] params = func.getArgs(); for (int paramIdx = 0; paramIdx < func.getArgs().length; paramIdx++) { final int TUPLE = context.astore(); FunctionDesc desc = func.getFuncDesc(); context.invokeVirtual(desc.getLegacyFuncClass(), "eval", Datum.class, new Class[] {Tuple.class}); context.convertToPrimitive(func.getValueType());
boolean constantOfAllDescendents = true; if (NON_CONSTANT_FUNC_NAMES.contains(evalNode.getFuncDesc().getFunctionName())) { constantOfAllDescendents = false; } else { for (EvalNode arg : evalNode.getArgs()) { arg = visit(context, arg, stack); constantOfAllDescendents &= (arg.getType() == EvalType.CONST); if (constantOfAllDescendents && evalNode.getType() == EvalType.FUNCTION) { EvalContext evalContext = new EvalContext(); evalContext.setTimeZone(TimeZone.getTimeZone(timezoneId)); if (evalNode.getFuncDesc().getInvocation().hasPython()) { TajoScriptEngine executor = new PythonScriptEngine(evalNode.getFuncDesc()); try { executor.start(context.getQueryContext().getConf()); evalContext.addScriptEngine(evalNode, executor); evalNode.bind(evalContext, null); Datum funcRes = evalNode.eval(null); executor.shutdown(); return new ConstEval(funcRes); evalNode.bind(evalContext, null); return new ConstEval(evalNode.eval(null));
@Override public Object visit(Object context, EvalNode evalNode, Stack<EvalNode> stack) { super.visit(context, evalNode, stack); if (evalNode.type == EvalType.CASE) { evalNodes.add(evalNode); } else if (evalNode.type == EvalType.FUNCTION) { FunctionEval functionEval = (FunctionEval)evalNode; if ("coalesce".equals(functionEval.getName())) { evalNodes.add(evalNode); } } else if (evalNode.type == EvalType.IS_NULL) { evalNodes.add(evalNode); } return evalNode; } }
public Object clone() throws CloneNotSupportedException { AggregationFunctionCallEval clone = (AggregationFunctionCallEval)super.clone(); clone.lastPhase = lastPhase; clone.firstPhase = firstPhase; clone.alias = alias; clone.invokeContext = (FunctionInvokeContext) invokeContext.clone(); if (functionInvoke != null) { clone.functionInvoke = functionInvoke; } return clone; }
@Override public EvalNode bind(EvalContext evalContext, Schema schema) { super.bind(evalContext, schema); try { if (evalContext != null && evalContext.hasScriptEngine(this)) { this.invokeContext.setScriptEngine(evalContext.getScriptEngine(this)); this.invokeContext.getScriptEngine().setFirstPhase(firstPhase); this.invokeContext.getScriptEngine().setLastPhase(lastPhase); } this.functionInvoke.init(invokeContext); } catch (IOException e) { throw new RuntimeException(e); } return this; }
@Override @SuppressWarnings("unchecked") public Datum eval(Tuple tuple) { super.eval(tuple); Datum datum = funcInvoke.eval(evalParams(tuple)); if (datum == null) { return NullDatum.get(); } else { return datum; } }
@Override public boolean equals(Object obj) { if (obj instanceof AggregationFunctionCallEval) { AggregationFunctionCallEval other = (AggregationFunctionCallEval) obj; boolean eq = super.equals(other); eq &= firstPhase == other.firstPhase; eq &= lastPhase == other.lastPhase; eq &= TUtil.checkEquals(alias, other.alias); return eq; } return false; } }
public static void emit(EvalCodeGenerator generator, EvalCodeGenContext context, FunctionEval func, Stack<EvalNode> stack) { int paramNum = func.getArgs().length; context.push(paramNum); context.newArray(Datum.class); // new Datum[paramNum] EvalNode [] params = func.getArgs(); for (int paramIdx = 0; paramIdx < func.getArgs().length; paramIdx++) { final int TUPLE = context.astore(); FunctionDesc desc = func.getFuncDesc(); context.invokeVirtual(desc.getLegacyFuncClass(), "eval", Datum.class, new Class[] {Tuple.class}); context.convertToPrimitive(func.getValueType());
boolean constantOfAllDescendents = true; if (NON_CONSTANT_FUNC_NAMES.contains(evalNode.getFuncDesc().getFunctionName())) { constantOfAllDescendents = false; } else { for (EvalNode arg : evalNode.getArgs()) { arg = visit(context, arg, stack); constantOfAllDescendents &= (arg.getType() == EvalType.CONST); if (constantOfAllDescendents && evalNode.getType() == EvalType.FUNCTION) { EvalContext evalContext = new EvalContext(); evalContext.setTimeZone(TimeZone.getTimeZone(timezoneId)); if (evalNode.getFuncDesc().getInvocation().hasPython()) { TajoScriptEngine executor = new PythonScriptEngine(evalNode.getFuncDesc()); try { executor.start(context.getQueryContext().getConf()); evalContext.addScriptEngine(evalNode, executor); evalNode.bind(evalContext, null); Datum funcRes = evalNode.eval(null); executor.shutdown(); return new ConstEval(funcRes); evalNode.bind(evalContext, null); return new ConstEval(evalNode.eval(null));
@Override public EvalNode visitFuncCall(Object context, FunctionEval evalNode, Stack<EvalNode> stack) { boolean constantOfAllDescendents = true; if ("sleep".equals(evalNode.funcDesc.getFunctionName())) { constantOfAllDescendents = false; } else { if (evalNode.getArgs() != null) { for (EvalNode arg : evalNode.getArgs()) { arg = visit(context, arg, stack); constantOfAllDescendents &= (arg.getType() == EvalType.CONST); } } } if (constantOfAllDescendents && evalNode.getType() == EvalType.FUNCTION) { return new ConstEval(evalNode.bind(null, null).eval(null)); } else { return evalNode; } } }
private RESULT visitDefaultFunctionEval(CONTEXT context, FunctionEval functionEval, Stack<EvalNode> stack) { RESULT result = null; stack.push(functionEval); if (functionEval.getArgs() != null) { for (EvalNode arg : functionEval.getArgs()) { result = visit(context, arg, stack); } } stack.pop(); return result; }
@Override public Object visit(Object context, EvalNode evalNode, Stack<EvalNode> stack) { super.visit(context, evalNode, stack); if (evalNode.type == EvalType.CASE) { evalNodes.add(evalNode); } else if (evalNode.type == EvalType.FUNCTION) { FunctionEval functionEval = (FunctionEval)evalNode; if ("coalesce".equals(functionEval.getName())) { evalNodes.add(evalNode); } } else if (evalNode.type == EvalType.IS_NULL) { evalNodes.add(evalNode); } return evalNode; } }
@Override public Object clone() throws CloneNotSupportedException { GeneralFunctionEval eval = (GeneralFunctionEval) super.clone(); if (funcInvoke != null) { eval.funcInvoke = (FunctionInvoke) funcInvoke.clone(); } return eval; } }