result = visitUnaryEval(context, (UnaryEval) evalNode, stack); } else if (evalNode instanceof BinaryEval) { result = visitBinaryEval(context, stack, (BinaryEval) evalNode); } else { result = visitConst(context, (ConstEval) evalNode, stack); break; case ROW_CONSTANT: result = visitRowConstant(context, (RowConstantEval) evalNode, stack); break; case FIELD: result = visitField(context, (FieldEval) evalNode, stack); break; result = visitBetween(context, (BetweenPredicateEval) evalNode, stack); break; case CASE: result = visitCaseWhen(context, (CaseWhenEval) evalNode, stack); break; case IF_THEN: result = visitIfThen(context, (CaseWhenEval.IfThenEval) evalNode, stack); break; result = visitFuncCall(context, (FunctionEval) evalNode, stack); break; case AGG_FUNCTION: result = visitFuncCall(context, (FunctionEval) evalNode, stack); break; case WINDOW_FUNCTION:
protected EvalNode visitFuncCall(CONTEXT context, FunctionEval evalNode, Stack<EvalNode> stack) { return visitDefaultFunctionEval(context, stack, evalNode); }
protected EvalNode visitCaseWhen(CONTEXT context, CaseWhenEval evalNode, Stack<EvalNode> stack) { stack.push(evalNode); for (CaseWhenEval.IfThenEval ifThenEval : evalNode.getIfThenEvals()) { visitIfThen(context, ifThenEval, stack); } if (evalNode.hasElse()) { visit(context, evalNode.getElse(), stack); } stack.pop(); return evalNode; }
@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; } }
public EvalNode visitBinaryEval(EvalCodeGenContext context, Stack<EvalNode> stack, BinaryEval binaryEval) { super.visitBinaryEval(context, stack, binaryEval); if (EvalType.isStringPatternMatchOperator(binaryEval.getType())) { if (!context.symbols.containsKey(binaryEval)) { String fieldName = binaryEval.getType().name() + "_" + context.seqId++; context.symbols.put(binaryEval, fieldName); Class clazz = EvalCodeGenerator.getStringPatternEvalClass(binaryEval.getType()); context.classWriter.visitField(Opcodes.ACC_PRIVATE, fieldName, "L" + TajoGeneratorAdapter.getInternalName(clazz) + ";", null, null); } } else if (binaryEval.getType() == EvalType.IN) { if (!context.symbols.containsKey(binaryEval)) { String fieldName = binaryEval.getType().name() + "_" + context.seqId++; context.symbols.put(binaryEval, fieldName); context.classWriter.visitField(Opcodes.ACC_PRIVATE, fieldName, "L" + TajoGeneratorAdapter.getInternalName(InEval.class) + ";", null, null); } } return binaryEval; }
@Override protected EvalNode visitUnaryEval(Context context, UnaryEval unary, Stack<EvalNode> stack) { switch (unary.getType()) { case NOT: context.sb.append("NOT "); super.visitUnaryEval(context, unary, stack); break; case SIGNED: SignedEval signed = (SignedEval) unary; if (signed.isNegative()) { context.sb.append("-"); } super.visitUnaryEval(context, unary, stack); break; case IS_NULL: super.visitUnaryEval(context, unary, stack); IsNullEval isNull = (IsNullEval) unary; if (isNull.isNot()) { context.sb.append("IS NOT NULL "); } else { context.sb.append("IS NULL "); } break; case CAST: super.visitUnaryEval(context, unary, stack); context.sb.append(" AS ").append(convertTajoTypeToSQLType(unary.getValueType())); } return unary; }
@Override public EvalNode visitIfThen(EvalTreeProtoBuilderContext context, CaseWhenEval.IfThenEval ifCond, Stack<EvalNode> stack) { // visiting and registering childs super.visitIfThen(context, ifCond, stack); int [] childIds = registerGetChildIds(context, ifCond); // building itself PlanProto.IfCondEval.Builder ifCondBuilder = PlanProto.IfCondEval.newBuilder(); ifCondBuilder.setCondition(childIds[0]); ifCondBuilder.setThen(childIds[1]); // registering itself and building EvalNode PlanProto.EvalNode.Builder builder = createEvalBuilder(context, ifCond); builder.setIfCond(ifCondBuilder); context.treeBuilder.addNodes(builder); return ifCond; }
@Override public EvalNode visitBetween(EvalTreeProtoBuilderContext context, BetweenPredicateEval between, Stack<EvalNode> stack) { // visiting and registering childs super.visitBetween(context, between, stack); int [] childIds = registerGetChildIds(context, between); Preconditions.checkState(childIds.length == 3, "Between must have three childs, but there are " + childIds.length + " child nodes"); // building itself PlanProto.BetweenEval.Builder betweenBuilder = PlanProto.BetweenEval.newBuilder(); betweenBuilder.setNegative(between.isNot()); betweenBuilder.setSymmetric(between.isSymmetric()); betweenBuilder.setPredicand(childIds[0]); betweenBuilder.setBegin(childIds[1]); betweenBuilder.setEnd(childIds[2]); // registering itself and building EvalNode PlanProto.EvalNode.Builder builder = createEvalBuilder(context, between); builder.setBetween(betweenBuilder); context.treeBuilder.addNodes(builder); return between; }
@Override public EvalNode visitCaseWhen(EvalTreeProtoBuilderContext context, CaseWhenEval caseWhen, Stack<EvalNode> stack) { // visiting and registering childs super.visitCaseWhen(context, caseWhen, stack); int [] childIds = registerGetChildIds(context, caseWhen); Preconditions.checkState(childIds.length > 0, "Case When must have at least one child, but there is no child"); // building itself PlanProto.CaseWhenEval.Builder caseWhenBuilder = PlanProto.CaseWhenEval.newBuilder(); int ifCondsNum = childIds.length - (caseWhen.hasElse() ? 1 : 0); for (int i = 0; i < ifCondsNum; i++) { caseWhenBuilder.addIfConds(childIds[i]); } if (caseWhen.hasElse()) { caseWhenBuilder.setElse(childIds[childIds.length - 1]); } // registering itself and building EvalNode PlanProto.EvalNode.Builder builder = createEvalBuilder(context, caseWhen); builder.setCasewhen(caseWhenBuilder); context.treeBuilder.addNodes(builder); return caseWhen; }
@Override protected EvalNode visitField(Object o, FieldEval evalNode, Stack<EvalNode> stack) { ColumnReferenceExpr expr = new ColumnReferenceExpr(tableName, evalNode.getColumnName()); exprs.push(expr); return super.visitField(o, evalNode, stack); }
@Override protected EvalNode visitConst(Object o, ConstEval evalNode, Stack<EvalNode> stack) { exprs.push(convertDatumToExpr(evalNode.getValueType().kind(), evalNode.getValue())); return super.visitConst(o, evalNode, stack); }
protected EvalNode visitCaseWhen(CONTEXT context, CaseWhenEval evalNode, Stack<EvalNode> stack) { stack.push(evalNode); for (CaseWhenEval.IfThenEval ifThenEval : evalNode.getIfThenEvals()) { visitIfThen(context, ifThenEval, stack); } if (evalNode.hasElse()) { visit(context, evalNode.getElse(), stack); } stack.pop(); return evalNode; }
@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; } }
public EvalNode visitBinaryEval(EvalCodeGenContext context, Stack<EvalNode> stack, BinaryEval binaryEval) { super.visitBinaryEval(context, stack, binaryEval); if (EvalType.isStringPatternMatchOperator(binaryEval.getType())) { if (!context.symbols.containsKey(binaryEval)) { String fieldName = binaryEval.getType().name() + "_" + context.seqId++; context.symbols.put(binaryEval, fieldName); Class clazz = EvalCodeGenerator.getStringPatternEvalClass(binaryEval.getType()); context.classWriter.visitField(Opcodes.ACC_PRIVATE, fieldName, "L" + TajoGeneratorAdapter.getInternalName(clazz) + ";", null, null); } } else if (binaryEval.getType() == EvalType.IN) { if (!context.symbols.containsKey(binaryEval)) { String fieldName = binaryEval.getType().name() + "_" + context.seqId++; context.symbols.put(binaryEval, fieldName); context.classWriter.visitField(Opcodes.ACC_PRIVATE, fieldName, "L" + TajoGeneratorAdapter.getInternalName(InEval.class) + ";", null, null); } } return binaryEval; }
@Override protected EvalNode visitUnaryEval(Context context, UnaryEval unary, Stack<EvalNode> stack) { switch (unary.getType()) { case NOT: context.sb.append("NOT "); super.visitUnaryEval(context, unary, stack); break; case SIGNED: SignedEval signed = (SignedEval) unary; if (signed.isNegative()) { context.sb.append("-"); } super.visitUnaryEval(context, unary, stack); break; case IS_NULL: super.visitUnaryEval(context, unary, stack); IsNullEval isNull = (IsNullEval) unary; if (isNull.isNot()) { context.sb.append("IS NOT NULL "); } else { context.sb.append("IS NULL "); } break; case CAST: super.visitUnaryEval(context, unary, stack); context.sb.append(" AS ").append(convertTajoTypeToSQLType(unary.getValueType())); } return unary; }
@Override public EvalNode visitIfThen(EvalTreeProtoBuilderContext context, CaseWhenEval.IfThenEval ifCond, Stack<EvalNode> stack) { // visiting and registering childs super.visitIfThen(context, ifCond, stack); int [] childIds = registerGetChildIds(context, ifCond); // building itself PlanProto.IfCondEval.Builder ifCondBuilder = PlanProto.IfCondEval.newBuilder(); ifCondBuilder.setCondition(childIds[0]); ifCondBuilder.setThen(childIds[1]); // registering itself and building EvalNode PlanProto.EvalNode.Builder builder = createEvalBuilder(context, ifCond); builder.setIfCond(ifCondBuilder); context.treeBuilder.addNodes(builder); return ifCond; }
@Override public EvalNode visitBetween(EvalTreeProtoBuilderContext context, BetweenPredicateEval between, Stack<EvalNode> stack) { // visiting and registering childs super.visitBetween(context, between, stack); int [] childIds = registerGetChildIds(context, between); Preconditions.checkState(childIds.length == 3, "Between must have three childs, but there are " + childIds.length + " child nodes"); // building itself PlanProto.BetweenEval.Builder betweenBuilder = PlanProto.BetweenEval.newBuilder(); betweenBuilder.setNegative(between.isNot()); betweenBuilder.setSymmetric(between.isSymmetric()); betweenBuilder.setPredicand(childIds[0]); betweenBuilder.setBegin(childIds[1]); betweenBuilder.setEnd(childIds[2]); // registering itself and building EvalNode PlanProto.EvalNode.Builder builder = createEvalBuilder(context, between); builder.setBetween(betweenBuilder); context.treeBuilder.addNodes(builder); return between; }
@Override public EvalNode visitCaseWhen(EvalTreeProtoBuilderContext context, CaseWhenEval caseWhen, Stack<EvalNode> stack) { // visiting and registering childs super.visitCaseWhen(context, caseWhen, stack); int [] childIds = registerGetChildIds(context, caseWhen); Preconditions.checkState(childIds.length > 0, "Case When must have at least one child, but there is no child"); // building itself PlanProto.CaseWhenEval.Builder caseWhenBuilder = PlanProto.CaseWhenEval.newBuilder(); int ifCondsNum = childIds.length - (caseWhen.hasElse() ? 1 : 0); for (int i = 0; i < ifCondsNum; i++) { caseWhenBuilder.addIfConds(childIds[i]); } if (caseWhen.hasElse()) { caseWhenBuilder.setElse(childIds[childIds.length - 1]); } // registering itself and building EvalNode PlanProto.EvalNode.Builder builder = createEvalBuilder(context, caseWhen); builder.setCasewhen(caseWhenBuilder); context.treeBuilder.addNodes(builder); return caseWhen; }
result = visitUnaryEval(context, (UnaryEval) evalNode, stack); } else if (evalNode instanceof BinaryEval) { result = visitBinaryEval(context, stack, (BinaryEval) evalNode); } else { result = visitConst(context, (ConstEval) evalNode, stack); break; case ROW_CONSTANT: result = visitRowConstant(context, (RowConstantEval) evalNode, stack); break; case FIELD: result = visitField(context, (FieldEval) evalNode, stack); break; result = visitBetween(context, (BetweenPredicateEval) evalNode, stack); break; case CASE: result = visitCaseWhen(context, (CaseWhenEval) evalNode, stack); break; case IF_THEN: result = visitIfThen(context, (CaseWhenEval.IfThenEval) evalNode, stack); break; result = visitFuncCall(context, (FunctionEval) evalNode, stack); break; case AGG_FUNCTION: result = visitFuncCall(context, (FunctionEval) evalNode, stack); break; case WINDOW_FUNCTION: