Author: gates Date: Tue Jun 17 17:39:00 2008 New Revision: 668885 URL: http://svn.apache.org/viewvc?rev=668885&view=rev Log: PIG-158 Santhosh's cast_fix patch.
Modified: incubator/pig/branches/types/build.xml incubator/pig/branches/types/src/org/apache/pig/impl/logicalLayer/LODistinct.java incubator/pig/branches/types/src/org/apache/pig/impl/logicalLayer/LOFilter.java incubator/pig/branches/types/src/org/apache/pig/impl/logicalLayer/LOPrinter.java incubator/pig/branches/types/src/org/apache/pig/impl/logicalLayer/LOProject.java incubator/pig/branches/types/src/org/apache/pig/impl/logicalLayer/LOSort.java incubator/pig/branches/types/src/org/apache/pig/impl/logicalLayer/LogicalPlan.java incubator/pig/branches/types/src/org/apache/pig/impl/logicalLayer/parser/QueryParser.jjt incubator/pig/branches/types/src/org/apache/pig/impl/logicalLayer/validators/TypeCheckingVisitor.java incubator/pig/branches/types/test/org/apache/pig/test/TestLogicalPlanBuilder.java Modified: incubator/pig/branches/types/build.xml URL: http://svn.apache.org/viewvc/incubator/pig/branches/types/build.xml?rev=668885&r1=668884&r2=668885&view=diff ============================================================================== --- incubator/pig/branches/types/build.xml (original) +++ incubator/pig/branches/types/build.xml Tue Jun 17 17:39:00 2008 @@ -234,11 +234,7 @@ <exclude name="**/TestCompressedFiles.java" /> <exclude name="**/TestEvalPipeline.java" /> <exclude name="**/TestFilterOpNumeric.java" /> - <exclude name="**/TestFilterOpString.java" /> - <exclude name="**/TestInfixArithmetic.java" /> - <!-- <exclude name="**/TestMapReduce.java" /> --> <exclude name="**/TestPigFile.java" /> - <exclude name="**/TestPigSplit.java" /> <exclude name="**/TestStoreOld.java" /> <!-- Excluced because we don't want to run them --> <exclude name="**/TypeCheckingTestUtil.java" /> Modified: incubator/pig/branches/types/src/org/apache/pig/impl/logicalLayer/LODistinct.java URL: http://svn.apache.org/viewvc/incubator/pig/branches/types/src/org/apache/pig/impl/logicalLayer/LODistinct.java?rev=668885&r1=668884&r2=668885&view=diff ============================================================================== --- incubator/pig/branches/types/src/org/apache/pig/impl/logicalLayer/LODistinct.java (original) +++ incubator/pig/branches/types/src/org/apache/pig/impl/logicalLayer/LODistinct.java Tue Jun 17 17:39:00 2008 @@ -19,6 +19,7 @@ import java.util.Collection; import java.util.List; +import java.util.ArrayList; import java.io.IOException; import org.apache.pig.impl.logicalLayer.FrontendException; @@ -60,13 +61,18 @@ if (!mIsSchemaComputed && (null == mSchema)) { // Get the schema of the parent Collection<LogicalOperator> s = mPlan.getPredecessors(this); + ArrayList<Schema.FieldSchema> fss = new ArrayList<Schema.FieldSchema>(); try { LogicalOperator op = s.iterator().next(); if (null == op) { - log.debug("getSchema: Operator not in plan"); throw new FrontendException("Could not find operator in plan"); } - mSchema = s.iterator().next().getSchema(); + if(op instanceof ExpressionOperator) { + fss.add(((ExpressionOperator)op).getFieldSchema()); + mSchema = new Schema(fss); + } else { + mSchema = op.getSchema(); + } mIsSchemaComputed = true; } catch (FrontendException ioe) { mSchema = null; Modified: incubator/pig/branches/types/src/org/apache/pig/impl/logicalLayer/LOFilter.java URL: http://svn.apache.org/viewvc/incubator/pig/branches/types/src/org/apache/pig/impl/logicalLayer/LOFilter.java?rev=668885&r1=668884&r2=668885&view=diff ============================================================================== --- incubator/pig/branches/types/src/org/apache/pig/impl/logicalLayer/LOFilter.java (original) +++ incubator/pig/branches/types/src/org/apache/pig/impl/logicalLayer/LOFilter.java Tue Jun 17 17:39:00 2008 @@ -18,6 +18,7 @@ package org.apache.pig.impl.logicalLayer; import java.util.List; +import java.util.ArrayList; import org.apache.pig.impl.logicalLayer.FrontendException; import org.apache.pig.impl.logicalLayer.schema.Schema; import org.apache.pig.impl.plan.OperatorKey; @@ -64,8 +65,14 @@ @Override public Schema getSchema() throws FrontendException { if (!mIsSchemaComputed && (null == mSchema)) { + ArrayList<Schema.FieldSchema> fss = new ArrayList<Schema.FieldSchema>(); try { - mSchema = mInput.getSchema(); + if(mInput instanceof ExpressionOperator) { + fss.add(((ExpressionOperator)mInput).getFieldSchema()); + mSchema = new Schema(fss); + } else { + mSchema = mInput.getSchema(); + } mIsSchemaComputed = true; } catch (FrontendException ioe) { mSchema = null; Modified: incubator/pig/branches/types/src/org/apache/pig/impl/logicalLayer/LOPrinter.java URL: http://svn.apache.org/viewvc/incubator/pig/branches/types/src/org/apache/pig/impl/logicalLayer/LOPrinter.java?rev=668885&r1=668884&r2=668885&view=diff ============================================================================== --- incubator/pig/branches/types/src/org/apache/pig/impl/logicalLayer/LOPrinter.java (original) +++ incubator/pig/branches/types/src/org/apache/pig/impl/logicalLayer/LOPrinter.java Tue Jun 17 17:39:00 2008 @@ -21,11 +21,17 @@ import java.util.Iterator; import java.util.List; import java.io.PrintStream; +import java.io.OutputStream; +import java.io.IOException; +import java.io.ByteArrayOutputStream; +import java.util.Collection; +import java.util.Collections; import org.apache.pig.data.DataType; import org.apache.pig.impl.logicalLayer.FrontendException; import org.apache.pig.impl.logicalLayer.schema.Schema; import org.apache.pig.impl.plan.DepthFirstWalker; +import org.apache.pig.impl.plan.DependencyOrderWalker; import org.apache.pig.impl.plan.MultiMap; import org.apache.pig.impl.plan.VisitorException; @@ -35,299 +41,163 @@ public class LOPrinter extends LOVisitor { private PrintStream mStream = null; - private int mIndent = 0; + private String TAB1 = " "; + private String TABMore = "| "; + private String LSep = "|\n|---"; + private String USep = "| |\n| "; + private int levelCntr = -1; + private OutputStream printer; /** * @param ps PrintStream to output plan information to * @param plan Logical plan to print */ public LOPrinter(PrintStream ps, LogicalPlan plan) { + //super(plan, new DependencyOrderWalker(plan)); super(plan, new DepthFirstWalker(plan)); + mStream = ps; } - public void visit(LOAdd a) throws VisitorException { - visitBinary(a, "+"); - } - - public void visit(LOAnd a) throws VisitorException { - visitBinary(a, "AND"); - } - - public void visit(LOBinCond bc) throws VisitorException { - print(bc); - mStream.print(" COND: ("); - bc.getCond().visit(this); - mStream.print(") TRUE: ("); - bc.getLhsOp().visit(this); - mStream.print(") FALSE ("); - bc.getRhsOp().visit(this); - mStream.print(")"); - } - - public void visit(LOCogroup g) throws VisitorException { - print(g); - mStream.print("GROUP BY PLANS:"); - MultiMap<LogicalOperator, LogicalPlan> plans = g.getGroupByPlans(); - for (LogicalOperator lo : plans.keySet()) { - // Visit the associated plans - for (LogicalPlan plan : plans.get(lo)) { - mIndent++; - pushWalker(new DepthFirstWalker(plan)); - visit(); - popWalker(); - mIndent--; - } - mStream.println(); - } - // Visit input operators - for (LogicalOperator lo : plans.keySet()) { - // Visit the operator - lo.visit(this); + @Override + public void visit() throws VisitorException { + try { + mStream.write(depthFirstLP().getBytes()); + } catch (IOException e) { + throw new VisitorException(e.getMessage()); } } - - public void visit(LOConst c) throws VisitorException { - print(c); - mStream.print(" VALUE (" + c.getValue() + ")"); - } - public void visit(LOCross c) throws VisitorException { - print(c); - mStream.println(); - super.visit(c); + public void print(OutputStream printer) throws VisitorException, IOException { + this.printer = printer; + printer.write(depthFirstLP().getBytes()); } - public void visit(LODistinct d) throws VisitorException { - print(d); - mStream.println(); - super.visit(d); - } - - public void visit(LODivide d) throws VisitorException { - visitBinary(d, "/"); - } - public void visit(LOEqual e) throws VisitorException { - visitBinary(e, "=="); - } - - public void visit(LOFilter f) throws VisitorException { - print(f); - mStream.print(" COMP: "); - mIndent++; - pushWalker(new DepthFirstWalker(f.getComparisonPlan())); - visit(); - mIndent--; - mStream.println(); - f.getInput().visit(this); - } - - public void visit(LOForEach f) throws VisitorException { - print(f); - mStream.print(" PLAN: "); - mIndent++; - pushWalker(new DepthFirstWalker(f.getForEachPlan())); - visit(); - mIndent--; - mStream.println(); - // Visit our input - mPlan.getPredecessors((LogicalOperator)f).get(0).visit(this); - } - - public void visit(LOGreaterThan gt) throws VisitorException { - visitBinary(gt, ">"); - } - - public void visit(LOGreaterThanEqual gte) throws VisitorException { - visitBinary(gte, ">="); - } - - public void visit(LOLesserThan lt) throws VisitorException { - visitBinary(lt, "<"); - } - - public void visit(LOLesserThanEqual lte) throws VisitorException { - visitBinary(lte, "<="); - } - - public void visit(LOLoad load) throws VisitorException { - print(load); - mStream.print(" FILE: " + load.getInputFile().getFileName()); - mStream.print(" FUNC: " + load.getLoadFunc().getClass().getName()); - mStream.println(); - } - - public void visit(LOMapLookup mlu) throws VisitorException { - print(mlu); - mStream.print("("); - mlu.getMap().visit(this); - mStream.print(")# " + mlu.getOperatorKey()); - } - - public void visit(LOMod m) throws VisitorException { - visitBinary(m, "MOD"); - } - - public void visit(LOMultiply m) throws VisitorException { - visitBinary(m, "*"); - } - - public void visit(LONegative n) throws VisitorException { - visitUnary(n, "-"); - } - - public void visit(LONot n) throws VisitorException { - visitUnary(n, "NOT"); + protected String depthFirstLP() throws VisitorException { + StringBuilder sb = new StringBuilder(); + List<LogicalOperator> leaves = mPlan.getLeaves(); + Collections.sort(leaves); + for (LogicalOperator leaf : leaves) { + sb.append(depthFirst(leaf)); + sb.append("\n"); + } + sb.delete(sb.length() - "\n".length(), sb.length()); + sb.delete(sb.length() - "\n".length(), sb.length()); + return sb.toString(); } - - public void visit(LONotEqual ne) throws VisitorException { - visitBinary(ne, "!="); + + private String planString(LogicalPlan lp){ + StringBuilder sb = new StringBuilder(); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + if(lp!=null) + lp.explain(baos, mStream); + else + return ""; + sb.append(USep); + sb.append(shiftStringByTabs(baos.toString(), 2)); + return sb.toString(); } - - public void visit(LOOr or) throws VisitorException { - visitBinary(or, "OR"); + + private String planString(List<LogicalPlan> logicalPlanList){ + StringBuilder sb = new StringBuilder(); + if(logicalPlanList!=null) + for (LogicalPlan lp : logicalPlanList) { + sb.append(planString(lp)); + } + return sb.toString(); } - public void visit(LOProject p) throws VisitorException { - print(p); - if (p.isStar()) { - mStream.print(" ALL "); + private String depthFirst(LogicalOperator node) throws VisitorException { + StringBuilder sb = new StringBuilder(node.name()); + if(node instanceof ExpressionOperator) { + sb.append(" FieldSchema: "); + try { + sb.append(((ExpressionOperator)node).getFieldSchema()); + } catch (Exception e) { + //sb.append("Caught Exception: " + e.getMessage()); + } } else { - List<Integer> cols = p.getProjection(); - mStream.print(" COL"); - if (cols.size() > 1) mStream.print("S"); - mStream.print(" ("); - for (int i = 0; i < cols.size(); i++) { - if (i > 0) mStream.print(", "); - mStream.print(cols.get(i)); + sb.append(" Schema: "); + try { + sb.append(node.getSchema()); + } catch (Exception e) { + //sb.append("Caught exception: " + e.getMessage()); } - mStream.print(")"); } - mStream.print(" FROM "); - if (p.getSentinel()) { - // This project is connected to some other relation, don't follow - // that path or we'll cycle in the graph. - p.getExpression().name(); - } else { - mIndent++; - p.getExpression().visit(this); - mIndent--; + sb.append(" Type: " + DataType.findTypeName(node.getType())); + sb.append("\n"); + if(node instanceof LOFilter){ + sb.append(planString(((LOFilter)node).getComparisonPlan())); + } + else if(node instanceof LOForEach){ + sb.append(planString(((LOForEach)node).getForEachPlan())); + } + else if(node instanceof LOGenerate){ + sb.append(planString(((LOGenerate)node).getGeneratePlans())); + + } + else if(node instanceof LOCogroup){ + MultiMap<LogicalOperator, LogicalPlan> plans = ((LOCogroup)node).getGroupByPlans(); + for (LogicalOperator lo : plans.keySet()) { + // Visit the associated plans + for (LogicalPlan plan : plans.get(lo)) { + sb.append(planString(plan)); + } + } + } + else if(node instanceof LOSort){ + sb.append(planString(((LOSort)node).getSortColPlans())); + } + else if(node instanceof LOSplitOutput){ + sb.append(planString(((LOSplitOutput)node).getConditionPlan())); } - } - - public void visit(LORegexp r) throws VisitorException { - print(r); - mStream.print(" REGEX (" + r.getRegexp() + ") LOOKING IN ("); - r.getOperand().visit(this); - mStream.print(")"); - } - - /** - * Only LOUnion.visit() should ever call this method. - */ - /* - @Override - public void visitUnion(LOUnion u) { - print(u, u.name()); - super.visitUnion(u); - } - /** - * Only LOSort.visit() should ever call this method. - */ - /* - @Override - public void visitSort(LOSort s) { - List<EvalSpec> ls = new ArrayList<EvalSpec>(); - ls.add(s.getSpec()); - print(s, s.name()); - super.visitSort(s); - } + List<LogicalOperator> predecessors = mPlan.getPredecessors(node); + if(node instanceof LOProject) { + System.err.println("LOProject " + node + " predecessors: " + predecessors + " in plan " + mPlan); + System.err.println("mPlan size: " + mPlan.size()); + } else if(node instanceof LOSort) { + System.err.println("LOSort : " + node + " predecessors: " + predecessors + " in plan " + mPlan); + System.err.println("mPlan size: " + mPlan.size()); + } - /** - * Only LOSplit.visit() should ever call this method. - */ - /* - @Override - public void visitSplit(LOSplit s) { - print(s, s.name()); - super.visitSplit(s); - } + if (predecessors == null) + return sb.toString(); - /** - * Only LOStore.visit() should ever call this method. - */ - /* - @Override - public void visitStore(LOStore s) { - print(s, s.name()); - super.visitStore(s); - } - - private void print(LogicalOperator lo, String name) { - List<EvalSpec> empty = new ArrayList<EvalSpec>(); - print(lo, name, empty); - } - */ - - private void visitBinary( - BinaryExpressionOperator b, - String op) throws VisitorException { - print(b); - mStream.print(" ("); - b.getLhsOperand().visit(this); - mStream.print(") " + op + " ("); - b.getRhsOperand().visit(this); - mStream.print(") "); - } - - private void visitUnary( - UnaryExpressionOperator e, - String op) throws VisitorException { - print(e); - mStream.print(op + " ("); - e.getOperand().visit(this); - mStream.print(") "); + Collections.sort(predecessors); + int i = 0; + for (LogicalOperator pred : predecessors) { + i++; + String DFStr = depthFirst(pred); + if (DFStr != null) { + sb.append(LSep); + if (i < predecessors.size()) + sb.append(shiftStringByTabs(DFStr, 2)); + else + sb.append(shiftStringByTabs(DFStr, 1)); + } + } + return sb.toString(); } - private void print(LogicalOperator lo) { - for (int i = 0; i < mIndent; i++) mStream.print(" "); + private String shiftStringByTabs(String DFStr, int TabType) { + StringBuilder sb = new StringBuilder(); + String[] spl = DFStr.split("\n"); - printName(lo); + String tab = (TabType == 1) ? TAB1 : TABMore; - if (!(lo instanceof ExpressionOperator)) { - mStream.print("Inputs: "); - for (LogicalOperator predecessor : mPlan.getPredecessors(lo)) { - printName(predecessor); - } - mStream.print("Schema: "); - try { - printSchema(lo.getSchema()); - } catch (FrontendException fe) { - // ignore it, nothing we can do - mStream.print("()"); - } + sb.append(spl[0] + "\n"); + for (int i = 1; i < spl.length; i++) { + sb.append(tab); + sb.append(spl[i]); + sb.append("\n"); } - mStream.print(" : "); - } - - private void printName(LogicalOperator lo) { - mStream.println(lo.name() + " key(" + lo.getOperatorKey().scope + - ", " + lo.getOperatorKey().id + ") "); + return sb.toString(); } - private void printSchema(Schema schema) { - mStream.print("("); - for (Schema.FieldSchema fs : schema.getFields()) { - if (fs.alias != null) mStream.print(fs.alias + ": "); - mStream.print(DataType.findTypeName(fs.type)); - if (fs.schema != null) { - if (fs.type == DataType.BAG) mStream.print("{"); - printSchema(fs.schema); - if (fs.type == DataType.BAG) mStream.print("}"); - } - } - mStream.print(")"); + private void dispTabs() { + for (int i = 0; i < levelCntr; i++) + System.out.print(TAB1); } } Modified: incubator/pig/branches/types/src/org/apache/pig/impl/logicalLayer/LOProject.java URL: http://svn.apache.org/viewvc/incubator/pig/branches/types/src/org/apache/pig/impl/logicalLayer/LOProject.java?rev=668885&r1=668884&r2=668885&view=diff ============================================================================== --- incubator/pig/branches/types/src/org/apache/pig/impl/logicalLayer/LOProject.java (original) +++ incubator/pig/branches/types/src/org/apache/pig/impl/logicalLayer/LOProject.java Tue Jun 17 17:39:00 2008 @@ -148,7 +148,7 @@ @Override public String name() { - return "Project " + mKey.scope + "-" + mKey.id; + return "Project " + mKey.scope + "-" + mKey.id + " Projections: " + (mIsStar? " [*] ": mProjection); } @Override @@ -184,10 +184,10 @@ log.debug("expression operator schema: " + expressionOperator.getSchema()); log.debug("expression operator type: " + expressionOperator.getType()); //TODO - //the type of the operator will be unkown. when type checking is in place + //the type of the operator will be unknown. when type checking is in place //add the type of the operator as a parameter to the fieldschema creation - //mFieldSchema = new Schema.FieldSchema(expressionOperator.getAlias(), expressionOperator.getSchema(), expressionOperator.getType()); - mFieldSchema = new Schema.FieldSchema(expressionOperator.getAlias(), expressionOperator.getSchema()); + mFieldSchema = new Schema.FieldSchema(expressionOperator.getAlias(), expressionOperator.getSchema(), expressionOperator.getType()); + //mFieldSchema = new Schema.FieldSchema(expressionOperator.getAlias(), expressionOperator.getSchema()); } } else { log.warn("The input for a projection operator cannot be null"); @@ -246,8 +246,13 @@ Schema.FieldSchema expOpFs = ((ExpressionOperator)expressionOperator).getFieldSchema(); if(null != expOpFs) { Schema s = expOpFs.schema; + log.debug("Schema s: " + s); if(null != s) { - fss.add(s.getField(colNum)); + if(colNum < s.size()) { + fss.add(s.getField(colNum)); + } else { + fss.add(new Schema.FieldSchema(null, DataType.BYTEARRAY)); + } } else { fss.add(new Schema.FieldSchema(null, DataType.BYTEARRAY)); } Modified: incubator/pig/branches/types/src/org/apache/pig/impl/logicalLayer/LOSort.java URL: http://svn.apache.org/viewvc/incubator/pig/branches/types/src/org/apache/pig/impl/logicalLayer/LOSort.java?rev=668885&r1=668884&r2=668885&view=diff ============================================================================== --- incubator/pig/branches/types/src/org/apache/pig/impl/logicalLayer/LOSort.java (original) +++ incubator/pig/branches/types/src/org/apache/pig/impl/logicalLayer/LOSort.java Tue Jun 17 17:39:00 2008 @@ -100,12 +100,18 @@ if (!mIsSchemaComputed && (null == mSchema)) { // get our parent's schema Collection<LogicalOperator> s = mPlan.getPredecessors(this); + ArrayList<Schema.FieldSchema> fss = new ArrayList<Schema.FieldSchema>(); try { LogicalOperator op = s.iterator().next(); if (null == op) { throw new FrontendException("Could not find operator in plan"); } - mSchema = op.getSchema(); + if(op instanceof ExpressionOperator) { + fss.add(((ExpressionOperator)op).getFieldSchema()); + mSchema = new Schema(fss); + } else { + mSchema = op.getSchema(); + } mIsSchemaComputed = true; } catch (FrontendException ioe) { mSchema = null; Modified: incubator/pig/branches/types/src/org/apache/pig/impl/logicalLayer/LogicalPlan.java URL: http://svn.apache.org/viewvc/incubator/pig/branches/types/src/org/apache/pig/impl/logicalLayer/LogicalPlan.java?rev=668885&r1=668884&r2=668885&view=diff ============================================================================== --- incubator/pig/branches/types/src/org/apache/pig/impl/logicalLayer/LogicalPlan.java (original) +++ incubator/pig/branches/types/src/org/apache/pig/impl/logicalLayer/LogicalPlan.java Tue Jun 17 17:39:00 2008 @@ -19,6 +19,7 @@ import java.io.IOException; import java.io.OutputStream; +import java.io.PrintStream; import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; @@ -27,6 +28,7 @@ import java.util.Map; import org.apache.pig.impl.plan.OperatorPlan; +import org.apache.pig.impl.plan.VisitorException; public class LogicalPlan extends OperatorPlan<LogicalOperator> { private static final long serialVersionUID = 2L; @@ -46,4 +48,17 @@ return getSingleLeafPlanOutputOp().getType() ; } + public void explain(OutputStream out, PrintStream ps){ + LOPrinter lpp = new LOPrinter(ps, this); + + try { + lpp.print(out); + } catch (VisitorException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } } Modified: incubator/pig/branches/types/src/org/apache/pig/impl/logicalLayer/parser/QueryParser.jjt URL: http://svn.apache.org/viewvc/incubator/pig/branches/types/src/org/apache/pig/impl/logicalLayer/parser/QueryParser.jjt?rev=668885&r1=668884&r2=668885&view=diff ============================================================================== --- incubator/pig/branches/types/src/org/apache/pig/impl/logicalLayer/parser/QueryParser.jjt (original) +++ incubator/pig/branches/types/src/org/apache/pig/impl/logicalLayer/parser/QueryParser.jjt Tue Jun 17 17:39:00 2008 @@ -236,6 +236,10 @@ flattenedColumns.add(column); (gis.get(i)).isInner = true; projectPlan.add(column); + if(projectInput instanceof ExpressionOperator) { + projectPlan.add(projectInput); + projectPlan.connect(projectInput, column); + } log.debug("parseCogroup: Added operator " + column.getClass().getName() + " " + column + " to logical plan " + projectPlan); generatePlans.add(projectPlan); } @@ -647,6 +651,7 @@ log.debug("Added operator: " + distinct.getClass().getName() + " to the logical plan"); lp.connect(op, distinct); log.debug("Connected alias: " + op.getAlias() + " operator " + op.getClass().getName() + " to operator " + distinct.getClass().getName()); + op = distinct; }) | (<CROSS> op = CrossClause(lp)) | (<JOIN> op = JoinClause(lp)) @@ -1521,6 +1526,10 @@ project.setStar(true); item = project; lp.add(project); + if(input instanceof ExpressionOperator) { + lp.add(input); + lp.connect(input, project); + } log.debug("FGItem: Added operator " + project.getClass().getName() + " " + project + " to logical plan " + lp); } ) @@ -1728,7 +1737,6 @@ "." projection = BracketedSimpleProj(subSchema,lp,item) { assertAtomic(item,false); - lp.remove(item); item = projection; } ) @@ -1892,6 +1900,10 @@ project.setStar(true); item = project; lp.add(project); + if(input instanceof ExpressionOperator) { + lp.add(input); + lp.connect(input, project); + } log.debug("EvalArgsItem: Added operator " + project.getClass().getName() + " " + project + " to logical plan " + lp); } ) @@ -2215,6 +2227,10 @@ ExpressionOperator project = new LOProject(lp, new OperatorKey(scope, getNextId()), eOp, colList); lp.add(project); log.debug("SimpleProj: Added operator " + project.getClass().getName() + " " + project + " to logical plan " + lp); + if(eOp instanceof ExpressionOperator) { + lp.add(eOp); + lp.connect(eOp, project); + } log.trace("Exiting SimpleProj"); return project; } @@ -2389,6 +2405,10 @@ log.debug("eOp: " + eOp.getClass().getName() + " " + eOp); lp.add(project); log.debug("DollarVar: Added operator " + project.getClass().getName() + " " + project + " to logical plan " + lp); + if(eOp instanceof ExpressionOperator) { + lp.add(eOp); + lp.connect(eOp, project); + } } catch (Exception planException) { ParseException parseException = new ParseException(planException.getMessage()); throw parseException; @@ -2429,6 +2449,10 @@ try { lp.add(item); log.debug("AliasFieldOrSpec: Added operator " + item.getClass().getName() + " " + item + " to logical plan " + lp); + if(op instanceof ExpressionOperator) { + lp.add(op); + lp.connect(op, item); + } } catch (Exception planException) { ParseException parseException = new ParseException(planException.getMessage()); throw parseException; @@ -2457,6 +2481,10 @@ try { lp.add(item); log.debug("AliasFieldOrSpec: Added operator " + item.getClass().getName() + " " + item + " to logical plan " + lp); + if(eOp instanceof ExpressionOperator) { + lp.add(eOp); + lp.connect(eOp, item); + } } catch (Exception planException) { ParseException parseException = new ParseException(planException.getMessage()); throw parseException; Modified: incubator/pig/branches/types/src/org/apache/pig/impl/logicalLayer/validators/TypeCheckingVisitor.java URL: http://svn.apache.org/viewvc/incubator/pig/branches/types/src/org/apache/pig/impl/logicalLayer/validators/TypeCheckingVisitor.java?rev=668885&r1=668884&r2=668885&view=diff ============================================================================== --- incubator/pig/branches/types/src/org/apache/pig/impl/logicalLayer/validators/TypeCheckingVisitor.java (original) +++ incubator/pig/branches/types/src/org/apache/pig/impl/logicalLayer/validators/TypeCheckingVisitor.java Tue Jun 17 17:39:00 2008 @@ -93,6 +93,9 @@ else if (eOp instanceof LONot) { visit((LONot) eOp) ; } + else if (eOp instanceof LOMapLookup) { + visit((LOMapLookup) eOp) ; + } // TODO: Check that all operators are included here } @@ -275,6 +278,19 @@ } + @Override + public void visit(LOMapLookup map) + throws VisitorException { + if(!DataType.isAtomic(DataType.findType(map.getLookUpKey()))) { + String msg = "Map key should be a basic type" ; + msgCollector.collect(msg, MessageType.Error); + throw new VisitorException(msg) ; + } + + map.setType(map.getValueType()); + + } + /** * LORegexp expects CharArray as input * Itself always returns Boolean @@ -957,6 +973,11 @@ } } + @Override + public void visit(LOIsNull uniOp) throws VisitorException { + uniOp.setType(DataType.BOOLEAN) ; + } + private void insertLeftCastForBinaryOp(BinaryExpressionOperator binOp, byte toType ) { LogicalPlan currentPlan = (LogicalPlan) mCurrentWalker.getPlan() ; @@ -1983,8 +2004,8 @@ outputSchemaIdx++ ; } } else { - schema.getField(outputSchemaIdx).type = leaf.getType() ; - schema.getField(outputSchemaIdx).schema = leaf.getSchema() ; + schema.getField(outputSchemaIdx).type = DataType.BYTEARRAY; + schema.getField(outputSchemaIdx).schema = null; outputSchemaIdx++ ; } } @@ -1996,8 +2017,8 @@ } } else { - throw new AssertionError("Unsupported inner plan type" - + " in LOGenerate" ) ; + throw new AssertionError("Unsupported inner plan type: " + + DataType.findTypeName(leaf.getType()) + " in LOGenerate" ) ; } } Modified: incubator/pig/branches/types/test/org/apache/pig/test/TestLogicalPlanBuilder.java URL: http://svn.apache.org/viewvc/incubator/pig/branches/types/test/org/apache/pig/test/TestLogicalPlanBuilder.java?rev=668885&r1=668884&r2=668885&view=diff ============================================================================== --- incubator/pig/branches/types/test/org/apache/pig/test/TestLogicalPlanBuilder.java (original) +++ incubator/pig/branches/types/test/org/apache/pig/test/TestLogicalPlanBuilder.java Tue Jun 17 17:39:00 2008 @@ -53,6 +53,7 @@ import org.apache.pig.impl.logicalLayer.ExpressionOperator; import org.apache.pig.impl.logicalLayer.LogicalPlan; import org.apache.pig.impl.logicalLayer.LogicalPlanBuilder; +import org.apache.pig.impl.logicalLayer.LOPrinter; import org.apache.pig.impl.logicalLayer.schema.Schema; @@ -881,6 +882,16 @@ buildPlan("e = foreach c generate $0, ($1 IS NOT NULL ? $1 - 5 : 0);"); } + private void printPlan(LogicalPlan lp) { + LOPrinter graphPrinter = new LOPrinter(System.err, lp); + System.err.println("Printing the logical plan"); + try { + graphPrinter.visit(); + } catch (Exception e) { + System.err.println(e.getMessage()); + } + } + // Helper Functions // Helper Functions