You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pig.apache.org by xu...@apache.org on 2011/04/04 20:31:29 UTC
svn commit: r1088700 [2/2] - in /pig/trunk: ./ src/org/apache/pig/
src/org/apache/pig/impl/logicalLayer/validators/
src/org/apache/pig/impl/plan/ src/org/apache/pig/newplan/
src/org/apache/pig/newplan/logical/expression/
src/org/apache/pig/newplan/logi...
Modified: pig/trunk/src/org/apache/pig/newplan/logical/visitor/TypeCheckingRelVisitor.java
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/newplan/logical/visitor/TypeCheckingRelVisitor.java?rev=1088700&r1=1088699&r2=1088700&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/newplan/logical/visitor/TypeCheckingRelVisitor.java (original)
+++ pig/trunk/src/org/apache/pig/newplan/logical/visitor/TypeCheckingRelVisitor.java Mon Apr 4 18:31:28 2011
@@ -103,7 +103,7 @@ public class TypeCheckingRelVisitor exte
int errCode = 1057;
String msg = "Filter's cond plan can only have one output" ;
msgCollector.collect(msg, MessageType.Error) ;
- throw new TypeCheckerException(msg, errCode, PigException.INPUT) ;
+ throwTypeCheckerException(filter, msg, errCode, PigException.INPUT, null) ;
}
// visit the filter expression
@@ -114,12 +114,12 @@ public class TypeCheckingRelVisitor exte
byte innerCondType = ((LogicalExpression)comparisonPlan.getSources().get(0)).getType();
if (innerCondType != DataType.BOOLEAN) {
int errCode = 1058;
- String msg = "Filter's condition must evaluate to boolean. Found: " + DataType.findTypeName(innerCondType);
+ String msg = "Filter's condition must evaluate to boolean. Found: " +
+ DataType.findTypeName(innerCondType);
msgCollector.collect(msg, MessageType.Error) ;
- throw new TypeCheckerException(msg, errCode, PigException.INPUT) ;
+ throwTypeCheckerException(filter, msg, errCode, PigException.INPUT, null) ;
}
-
try {
// re-compute the schema
filter.resetSchema();
@@ -129,11 +129,20 @@ public class TypeCheckingRelVisitor exte
int errCode = 1059;
String msg = "Problem while reconciling output schema of Filter" ;
msgCollector.collect(msg, MessageType.Error);
- throw new TypeCheckerException(msg, errCode, PigException.INPUT, fe) ;
+ throwTypeCheckerException(filter, msg, errCode, PigException.INPUT, fe) ;
}
}
- @Override
+ private void throwTypeCheckerException(Operator op, String msg,
+ int errCode, byte input, FrontendException fe) throws TypeCheckerException {
+ if( fe == null ) {
+ throw new TypeCheckerException(op, msg, errCode, PigException.INPUT);
+ }
+ throw new TypeCheckerException(op, msg, errCode, PigException.INPUT, fe);
+
+ }
+
+ @Override
public void visit(LOGenerate gen) throws FrontendException {
for(int i=0; i < gen.getOutputPlans().size(); i++) {
LogicalExpressionPlan expPlan = gen.getOutputPlans().get(i);
@@ -142,7 +151,7 @@ public class TypeCheckingRelVisitor exte
int errCode = 1057;
String msg = "LOGenerate expression plan can only have one output" ;
msgCollector.collect(msg, MessageType.Error) ;
- throw new TypeCheckerException( msg, errCode, PigException.BUG ) ;
+ throwTypeCheckerException( gen, msg, errCode, PigException.BUG, null) ;
}
// visit the filter expression
visitExpressionPlan( expPlan, gen );
@@ -170,7 +179,7 @@ public class TypeCheckingRelVisitor exte
int errCode = 1059;
String msg = "Problem while reconciling output schema of ForEach" ;
msgCollector.collect(msg, MessageType.Error);
- throw new TypeCheckerException(msg, errCode, PigException.INPUT, fe) ;
+ throwTypeCheckerException(forEach, msg, errCode, PigException.INPUT, fe) ;
}
}
@@ -212,7 +221,7 @@ public class TypeCheckingRelVisitor exte
int errCode = 1055;
String msg = "Problem while reading schemas from inputs of Union" ;
msgCollector.collect(msg, MessageType.Error) ;
- throw new TypeCheckerException(msg, errCode, PigException.INPUT, fee) ;
+ throwTypeCheckerException(u, msg, errCode, PigException.INPUT, fee) ;
}
// Do cast insertion only if we are typed
@@ -237,7 +246,7 @@ public class TypeCheckingRelVisitor exte
int errCode = 1056;
String msg = "Problem while casting inputs of Union" ;
msgCollector.collect(msg, MessageType.Error) ;
- throw new TypeCheckerException(msg, errCode, PigException.INPUT, fee) ;
+ throwTypeCheckerException(u, msg, errCode, PigException.INPUT, fee) ;
}
}
}
@@ -276,7 +285,7 @@ public class TypeCheckingRelVisitor exte
if (!found) {
int errCode = 1077;
String msg = "Two operators that require a cast in between are not adjacent.";
- throw new TypeCheckerException(msg, errCode, PigException.INPUT);
+ throwTypeCheckerException(fromOp, msg, errCode, PigException.INPUT, null);
}
// retrieve input schema to be casted
@@ -291,7 +300,7 @@ public class TypeCheckingRelVisitor exte
int errCode = 1055;
String msg = "Problem while reading schema from input of "
+ fromOp.getClass().getSimpleName();
- throw new TypeCheckerException(msg, errCode, PigException.BUG, fe);
+ throwTypeCheckerException(fromOp, msg, errCode, PigException.BUG, fe);
}
// make sure the supplied targetSchema has the same number of members
@@ -300,7 +309,7 @@ public class TypeCheckingRelVisitor exte
int errCode = 1078;
String msg = "Schema size mismatch for casting. Input schema size: "
+ fromSchema.size() + ". Target schema size: " + toSchema.size();
- throw new TypeCheckerException(msg, errCode, PigException.INPUT);
+ throwTypeCheckerException(toOp, msg, errCode, PigException.INPUT, null);
}
// Plans inside Generate. Fields that do not need casting will only
@@ -379,7 +388,7 @@ public class TypeCheckingRelVisitor exte
if (list.size() != 1) {
int errCode = 2008;
String msg = "LOSplitOutput cannot have more than one input. Found: " + list.size() + " input(s).";
- throw new TypeCheckerException(msg, errCode, PigException.BUG) ;
+ throwTypeCheckerException(op, msg, errCode, PigException.BUG, null) ;
}
LogicalExpressionPlan condPlan = op.getFilterPlan() ;
@@ -389,7 +398,7 @@ public class TypeCheckingRelVisitor exte
int errCode = 1057;
String msg = "Split's inner plan can only have one output (leaf)" ;
msgCollector.collect(msg, MessageType.Error) ;
- throw new TypeCheckerException(msg, errCode, PigException.INPUT) ;
+ throwTypeCheckerException(op, msg, errCode, PigException.INPUT, null) ;
}
visitExpressionPlan(condPlan, op);
@@ -399,7 +408,7 @@ public class TypeCheckingRelVisitor exte
int errCode = 1058;
String msg = "Split's condition must evaluate to boolean. Found: " + DataType.findTypeName(innerCondType) ;
msgCollector.collect(msg, MessageType.Error) ;
- throw new TypeCheckerException(msg, errCode, PigException.INPUT) ;
+ throwTypeCheckerException(op, msg, errCode, PigException.INPUT, null) ;
}
try {
@@ -411,7 +420,7 @@ public class TypeCheckingRelVisitor exte
String msg = "Problem while reading"
+ " schemas from inputs of SplitOutput" ;
msgCollector.collect(msg, MessageType.Error) ;
- throw new TypeCheckerException(msg, errCode, PigException.INPUT, fe) ;
+ throwTypeCheckerException(op, msg, errCode, PigException.INPUT, fe) ;
}
}
@@ -434,7 +443,7 @@ public class TypeCheckingRelVisitor exte
String msg = "Problem while reading"
+ " schemas from inputs of Distinct" ;
msgCollector.collect(msg, MessageType.Error) ;
- throw new TypeCheckerException(msg, errCode, PigException.INPUT, fe) ;
+ throwTypeCheckerException(op, msg, errCode, PigException.INPUT, fe) ;
}
}
@@ -450,7 +459,7 @@ public class TypeCheckingRelVisitor exte
String msg = "Problem while reading"
+ " schemas from inputs of Limit" ;
msgCollector.collect(msg, MessageType.Error) ;
- throw new TypeCheckerException(msg, errCode, PigException.INPUT, fe) ;
+ throwTypeCheckerException(op, msg, errCode, PigException.INPUT, fe) ;
}
}
@@ -473,7 +482,7 @@ public class TypeCheckingRelVisitor exte
String msg = "Problem while reading"
+ " schemas from inputs of Cross" ;
msgCollector.collect(msg, MessageType.Error) ;
- throw new TypeCheckerException(msg, errCode, PigException.INPUT, fe) ;
+ throwTypeCheckerException(cs, msg, errCode, PigException.INPUT, fe) ;
}
}
@@ -494,7 +503,7 @@ public class TypeCheckingRelVisitor exte
int errCode = 1057;
String msg = "Sort's inner plan can only have one output (leaf)" ;
msgCollector.collect(msg, MessageType.Error) ;
- throw new TypeCheckerException(msg, errCode, PigException.INPUT) ;
+ throwTypeCheckerException(sort, msg, errCode, PigException.INPUT, null) ;
}
visitExpressionPlan(sortColPlan, sort);
@@ -508,7 +517,7 @@ public class TypeCheckingRelVisitor exte
int errCode = 1059;
String msg = "Problem while reconciling output schema of Sort" ;
msgCollector.collect(msg, MessageType.Error);
- throw new TypeCheckerException(msg, errCode, PigException.INPUT, fee) ;
+ throwTypeCheckerException(sort, msg, errCode, PigException.INPUT, fee) ;
}
}
@@ -523,7 +532,7 @@ public class TypeCheckingRelVisitor exte
if (inputList.size() != 1) {
int errCode = 2008;
String msg = "LOSplit cannot have more than one input. Found: " + inputList.size() + " input(s).";
- throw new TypeCheckerException(msg, errCode, PigException.BUG) ;
+ throwTypeCheckerException(split, msg, errCode, PigException.BUG, null) ;
}
split.resetSchema();
@@ -535,7 +544,7 @@ public class TypeCheckingRelVisitor exte
int errCode = 1059;
String msg = "Problem while reconciling output schema of Split" ;
msgCollector.collect(msg, MessageType.Error);
- throw new TypeCheckerException(msg, errCode, PigException.INPUT, fe) ;
+ throwTypeCheckerException(split, msg, errCode, PigException.INPUT, fe) ;
}
}
@@ -551,7 +560,7 @@ public class TypeCheckingRelVisitor exte
int errCode = 1060;
String msg = "Cannot resolve Join output schema" ;
msgCollector.collect(msg, MessageType.Error) ;
- throw new TypeCheckerException(msg, errCode, PigException.INPUT, fe) ;
+ throwTypeCheckerException(join, msg, errCode, PigException.INPUT, fe) ;
}
MultiMap<Integer, LogicalExpressionPlan> joinColPlans
@@ -573,7 +582,7 @@ public class TypeCheckingRelVisitor exte
String msg = "Join's inner plans can only"
+ " have one output (leaf)" ;
msgCollector.collect(msg, MessageType.Error) ;
- throw new TypeCheckerException(msg, errCode, PigException.INPUT) ;
+ throwTypeCheckerException(join, msg, errCode, PigException.INPUT, null) ;
}
visitExpressionPlan(innerPlan, join);
}
@@ -623,7 +632,7 @@ public class TypeCheckingRelVisitor exte
String msg = "Join's inner plans can only"
+ "have one output (leaf)" ;
msgCollector.collect(msg, MessageType.Error) ;
- throw new TypeCheckerException(msg, errCode, PigException.INPUT) ;
+ throwTypeCheckerException(join, msg, errCode, PigException.INPUT, null) ;
}
if (innerType != expectedType) {
insertAtomicCastForInnerPlan(
@@ -638,7 +647,7 @@ public class TypeCheckingRelVisitor exte
int errCode = 1060;
String msg = "Cannot resolve Join output schema" ;
msgCollector.collect(msg, MessageType.Error) ;
- throw new TypeCheckerException(msg, errCode, PigException.INPUT, fe) ;
+ throwTypeCheckerException(join, msg, errCode, PigException.INPUT, fe) ;
}
try {
@@ -649,7 +658,7 @@ public class TypeCheckingRelVisitor exte
int errCode = 1060;
String msg = "Cannot resolve Join output schema" ;
msgCollector.collect(msg, MessageType.Error) ;
- throw new TypeCheckerException(msg, errCode, PigException.INPUT, fe) ;
+ throwTypeCheckerException(join, msg, errCode, PigException.INPUT, fe) ;
}
}
@@ -768,14 +777,14 @@ public class TypeCheckingRelVisitor exte
int errCode = 1051;
String msg = "Cannot cast to "
+ DataType.findTypeName(toType);
- throw new TypeCheckerException(msg, errCode, PigException.INPUT);
+ throwTypeCheckerException(relOp, msg, errCode, PigException.INPUT, null);
}
List<Operator> outputs = innerPlan.getSources();
if (outputs.size() > 1) {
int errCode = 2060;
String msg = "Expected one output. Found " + outputs.size() + " outputs.";
- throw new TypeCheckerException(msg, errCode, PigException.BUG);
+ throwTypeCheckerException(relOp, msg, errCode, PigException.BUG, null);
}
LogicalExpression currentOutput = (LogicalExpression) outputs.get(0);
TypeCheckingExpVisitor.collectCastWarning(
@@ -866,7 +875,7 @@ public class TypeCheckingRelVisitor exte
int errCode = 1060;
String msg = "Cannot resolve COGroup output schema" ;
msgCollector.collect(msg, MessageType.Error) ;
- throw new TypeCheckerException(msg, errCode, PigException.INPUT, fe) ;
+ throwTypeCheckerException(cg, msg, errCode, PigException.INPUT, fe) ;
}
MultiMap<Integer, LogicalExpressionPlan> groupByPlans =
@@ -889,7 +898,7 @@ public class TypeCheckingRelVisitor exte
String msg = "COGroup's inner plans can only"
+ "have one output (leaf)" ;
msgCollector.collect(msg, MessageType.Error) ;
- throw new TypeCheckerException(msg, errCode, PigException.INPUT) ;
+ throwTypeCheckerException(cg, msg, errCode, PigException.INPUT, null) ;
}
visitExpressionPlan(innerPlan, cg);
}
@@ -935,7 +944,7 @@ public class TypeCheckingRelVisitor exte
String msg = "Sorry, group by complex types"
+ " will be supported soon" ;
msgCollector.collect(msg, MessageType.Error) ;
- throw new TypeCheckerException(msg, errCode, PigException.INPUT) ;
+ throwTypeCheckerException(cg, msg, errCode, PigException.INPUT, null) ;
}
expectedType = groupBySchema.getField(j).type ;
@@ -953,7 +962,7 @@ public class TypeCheckingRelVisitor exte
int errCode = 1060;
String msg = "Cannot resolve COGroup output schema" ;
msgCollector.collect(msg, MessageType.Error) ;
- throw new TypeCheckerException(msg, errCode, PigException.INPUT, fe) ;
+ throwTypeCheckerException(cg, msg, errCode, PigException.INPUT, fe) ;
}
try {
@@ -964,7 +973,7 @@ public class TypeCheckingRelVisitor exte
int errCode = 1060;
String msg = "Cannot resolve COGroup output schema" ;
msgCollector.collect(msg, MessageType.Error) ;
- throw new TypeCheckerException(msg, errCode, PigException.INPUT, fe) ;
+ throwTypeCheckerException(cg, msg, errCode, PigException.INPUT, fe) ;
}
}
Modified: pig/trunk/src/org/apache/pig/parser/AstValidator.g
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/parser/AstValidator.g?rev=1088700&r1=1088699&r2=1088700&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/parser/AstValidator.g (original)
+++ pig/trunk/src/org/apache/pig/parser/AstValidator.g Mon Apr 4 18:31:28 2011
@@ -76,21 +76,20 @@ public String getErrorHeader(Recognition
return QueryParserUtils.generateErrorHeader( ex );
}
-private void validateSchemaAliasName(Set<String> fieldNames, Token t)
+private void validateSchemaAliasName(Set<String> fieldNames, CommonTree node, String name)
throws DuplicatedSchemaAliasException {
- String name = t.getText();
if( fieldNames.contains( name ) ) {
- throw new DuplicatedSchemaAliasException( input, t, name );
+ throw new DuplicatedSchemaAliasException( input,
+ new SourceLocation( (PigParserNode)node ), name );
} else {
fieldNames.add( name );
}
}
-private void validateAliasRef(Set<String> aliases, Token t)
+private void validateAliasRef(Set<String> aliases, CommonTree node, String alias)
throws UndefinedAliasException {
- String alias = t.getText();
if( !aliases.contains( alias ) ) {
- throw new UndefinedAliasException( input, t, alias );
+ throw new UndefinedAliasException( input, new SourceLocation( (PigParserNode)node ), alias );
}
}
@@ -120,11 +119,11 @@ general_statement : ^( STATEMENT ( alias
parallel_clause : ^( PARALLEL INTEGER )
;
-alias returns[String name, Token token]
+alias returns[String name, CommonTree node]
: IDENTIFIER
{
$name = $IDENTIFIER.text;
- $token = $IDENTIFIER.token;
+ $node = $IDENTIFIER;
}
;
@@ -185,7 +184,7 @@ as_clause: ^( AS field_def_list )
;
field_def[Set<String> fieldNames] throws Exception
- : ^( FIELD_DEF IDENTIFIER { validateSchemaAliasName( fieldNames, $IDENTIFIER.token ); } type? )
+ : ^( FIELD_DEF IDENTIFIER { validateSchemaAliasName( fieldNames, $IDENTIFIER, $IDENTIFIER.text ); } type? )
;
field_def_list
@@ -243,13 +242,13 @@ group_item
// For the first input
$group_clause::arity = $join_group_by_clause.exprCount;
} else if( $join_group_by_clause.exprCount != $group_clause::arity ) {
- throw new ParserValidationException( input, new SourceLocation( (CommonTree)$group_item.start ),
+ throw new ParserValidationException( input, new SourceLocation( (PigParserNode)$group_item.start ),
"The arity of the group by columns do not match." );
}
}
;
-rel : alias { validateAliasRef( aliases, $alias.token ); }
+rel : alias { validateAliasRef( aliases, $alias.node, $alias.name ); }
| op_clause
;
@@ -386,7 +385,7 @@ join_item
// For the first input
$join_clause::arity = $join_group_by_clause.exprCount;
} else if( $join_group_by_clause.exprCount != $join_clause::arity ) {
- throw new ParserValidationException( input, new SourceLocation( (CommonTree)$join_item.start ),
+ throw new ParserValidationException( input, new SourceLocation( (PigParserNode)$join_item.start ),
"The arity of the join columns do not match." );
}
}
Modified: pig/trunk/src/org/apache/pig/parser/DuplicatedSchemaAliasException.java
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/parser/DuplicatedSchemaAliasException.java?rev=1088700&r1=1088699&r2=1088700&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/parser/DuplicatedSchemaAliasException.java (original)
+++ pig/trunk/src/org/apache/pig/parser/DuplicatedSchemaAliasException.java Mon Apr 4 18:31:28 2011
@@ -19,15 +19,14 @@
package org.apache.pig.parser;
import org.antlr.runtime.IntStream;
-import org.antlr.runtime.Token;
public class DuplicatedSchemaAliasException extends PigRecognitionException {
private static final long serialVersionUID = 1L;
private String alias;
- public DuplicatedSchemaAliasException(IntStream input, Token t, String alias) {
- super( input, new SourceLocation( t ) );
+ public DuplicatedSchemaAliasException(IntStream input, SourceLocation loc, String alias) {
+ super( input, loc );
this.alias = alias;
}
Modified: pig/trunk/src/org/apache/pig/parser/LogicalPlanBuilder.java
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/parser/LogicalPlanBuilder.java?rev=1088700&r1=1088699&r2=1088700&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/parser/LogicalPlanBuilder.java (original)
+++ pig/trunk/src/org/apache/pig/parser/LogicalPlanBuilder.java Mon Apr 4 18:31:28 2011
@@ -28,10 +28,8 @@ import java.util.List;
import java.util.Map;
import java.util.Properties;
-import org.antlr.grammar.v3.ANTLRv3Parser.range_return;
import org.antlr.runtime.IntStream;
import org.antlr.runtime.RecognitionException;
-import org.apache.jute.InputArchive;
import org.apache.pig.ExecType;
import org.apache.pig.FuncSpec;
import org.apache.pig.LoadFunc;
@@ -151,53 +149,56 @@ public class LogicalPlanBuilder {
return new LOFilter( plan );
}
- String buildFilterOp(LOFilter op, String alias, String inputAlias, LogicalExpressionPlan expr) {
+ String buildFilterOp(SourceLocation loc, LOFilter op, String alias, String inputAlias, LogicalExpressionPlan expr) {
op.setFilterPlan( expr );
- return buildOp( op, alias, inputAlias, null );
+ return buildOp( loc, op, alias, inputAlias, null );
}
- String buildDistinctOp(String alias, String inputAlias, String partitioner) {
+ String buildDistinctOp(SourceLocation loc, String alias, String inputAlias, String partitioner) {
LODistinct op = new LODistinct( plan );
- return buildOp( op, alias, inputAlias, partitioner );
+ return buildOp( loc, op, alias, inputAlias, partitioner );
}
- String buildLimitOp(String alias, String inputAlias, long limit) {
+ String buildLimitOp(SourceLocation loc, String alias, String inputAlias, long limit) {
LOLimit op = new LOLimit( plan, limit );
- return buildOp( op, alias, inputAlias, null );
+ return buildOp( loc, op, alias, inputAlias, null );
}
- String buildSampleOp(String alias, String inputAlias, double value) {
+ String buildSampleOp(SourceLocation loc, String alias, String inputAlias, double value,
+ SourceLocation valLoc) {
LogicalExpressionPlan filterPlan = new LogicalExpressionPlan();
// Generate a filter condition.
LogicalExpression konst = new ConstantExpression( filterPlan, value);
+ konst.setLocation( valLoc );
UserFuncExpression udf = new UserFuncExpression( filterPlan, new FuncSpec( RANDOM.class.getName() ) );
new LessThanEqualExpression( filterPlan, udf, konst );
- return buildFilterOp( new LOFilter( plan ), alias, inputAlias, filterPlan );
+ LOFilter filter = new LOFilter( plan );
+ return buildFilterOp( loc, filter, alias, inputAlias, filterPlan );
}
- String buildUnionOp(String alias, List<String> inputAliases, boolean onSchema) {
+ String buildUnionOp(SourceLocation loc, String alias, List<String> inputAliases, boolean onSchema) {
LOUnion op = new LOUnion( plan, onSchema );
- return buildOp( op, alias, inputAliases, null );
+ return buildOp( loc, op, alias, inputAliases, null );
}
- String buildSplitOp(String inputAlias) {
+ String buildSplitOp(SourceLocation loc, String inputAlias) {
LOSplit op = new LOSplit( plan );
- return buildOp( op, null, inputAlias, null );
+ return buildOp( loc, op, null, inputAlias, null );
}
LOSplitOutput createSplitOutputOp() {
return new LOSplitOutput( plan );
}
- String buildSplitOutputOp(LOSplitOutput op, String alias, String inputAlias,
+ String buildSplitOutputOp(SourceLocation loc, LOSplitOutput op, String alias, String inputAlias,
LogicalExpressionPlan filterPlan) {
op.setFilterPlan( filterPlan );
- return buildOp ( op, alias, inputAlias, null );
+ return buildOp ( loc, op, alias, inputAlias, null );
}
- String buildCrossOp(String alias, List<String> inputAliases, String partitioner) {
+ String buildCrossOp(SourceLocation loc, String alias, List<String> inputAliases, String partitioner) {
LOCross op = new LOCross( plan );
- return buildOp ( op, alias, inputAliases, partitioner );
+ return buildOp ( loc, op, alias, inputAliases, partitioner );
}
LOSort createSortOp() {
@@ -213,7 +214,7 @@ public class LogicalPlanBuilder {
ascFlags.add(true);
}
sort.setAscendingCols( ascFlags );
- alias = buildOp( sort, alias, inputAlias, null );
+ alias = buildOp( loc, sort, alias, inputAlias, null );
try {
(new ProjectStarExpander(sort.getPlan())).visit(sort);
} catch (FrontendException e) {
@@ -272,7 +273,7 @@ public class LogicalPlanBuilder {
op.setJoinType( jt );
op.setInnerFlags( flags );
op.setJoinPlans( joinPlans );
- alias = buildOp( op, alias, inputAliases, partitioner );
+ alias = buildOp( loc, op, alias, inputAliases, partitioner );
try {
(new ProjectStarExpander(op.getPlan())).visit(op);
} catch (FrontendException e) {
@@ -313,7 +314,7 @@ public class LogicalPlanBuilder {
op.setExpressionPlans( expressionPlans );
op.setGroupType( gt );
op.setInnerFlags( flags );
- alias = buildOp( op, alias, inputAliases, partitioner );
+ alias = buildOp( loc, op, alias, inputAliases, partitioner );
try {
(new ProjectStarExpander(op.getPlan())).visit(op);
} catch (FrontendException e) {
@@ -354,19 +355,22 @@ public class LogicalPlanBuilder {
FileSpec loader = new FileSpec( absolutePath, funcSpec );
LOLoad op = new LOLoad( loader, schema, plan, ConfigurationUtil.toConfiguration( pigContext.getProperties() ) );
- return buildOp( op, alias, new ArrayList<String>(), null );
+ return buildOp( loc, op, alias, new ArrayList<String>(), null );
}
- private String buildOp(LogicalRelationalOperator op, String alias, String inputAlias, String partitioner) {
+ private String buildOp(SourceLocation loc, LogicalRelationalOperator op, String alias,
+ String inputAlias, String partitioner) {
List<String> inputAliases = new ArrayList<String>();
if( inputAlias != null )
inputAliases.add( inputAlias );
- return buildOp( op, alias, inputAliases, partitioner );
+ return buildOp( loc, op, alias, inputAliases, partitioner );
}
- private String buildOp(LogicalRelationalOperator op, String alias, List<String> inputAliases, String partitioner) {
+ private String buildOp(SourceLocation loc, LogicalRelationalOperator op, String alias,
+ List<String> inputAliases, String partitioner) {
setAlias( op, alias );
setPartitioner( op, partitioner );
+ op.setLocation( loc );
plan.add( op );
for( String a : inputAliases ) {
Operator pred = operators.get( a );
@@ -410,7 +414,7 @@ public class LogicalPlanBuilder {
FileSpec fileSpec = new FileSpec( absPath, funcSpec );
LOStore op = new LOStore( plan, fileSpec );
- return buildOp( op, alias, inputAlias, null );
+ return buildOp( loc, op, alias, inputAlias, null );
}
LOForEach createForeachOp() {
@@ -420,7 +424,7 @@ public class LogicalPlanBuilder {
String buildForeachOp(SourceLocation loc, LOForEach op, String alias, String inputAlias, LogicalPlan innerPlan)
throws ParserValidationException {
op.setInnerPlan( innerPlan );
- alias = buildOp( op, alias, inputAlias, null );
+ alias = buildOp( loc, op, alias, inputAlias, null );
try {
(new ProjectStarExpander(op.getPlan())).visit(op);
} catch (FrontendException e) {
@@ -456,6 +460,7 @@ public class LogicalPlanBuilder {
gen.setFlattenFlags( flags );
gen.setUserDefinedSchema( schemas );
innerPlan.add( gen );
+ gen.setLocation( loc );
for( Operator input : inputs ) {
innerPlan.connect( input, gen );
}
@@ -526,7 +531,7 @@ public class LogicalPlanBuilder {
private static void setupInnerLoadAndProj(LOInnerLoad innerLoad,
ProjectExpression projExpr, LogicalPlan lp,
ArrayList<Operator> inputs) {
-
+ innerLoad.setLocation( projExpr.getLocation() );
projExpr.setInputNum( inputs.size() );
projExpr.setColNum( -1 ); // Projection Expression on InnerLoad is always (*).
lp.add( innerLoad );
@@ -549,10 +554,12 @@ public class LogicalPlanBuilder {
op = operators.get( colAlias );
if( op == null ) {
op = createInnerLoad(loc, innerPlan, foreach, colAlias );
+ op.setLocation( projExpr.getLocation() );
innerPlan.add( op );
}
} else {
op = new LOInnerLoad( innerPlan, foreach, projExpr.getColNum() );
+ op.setLocation( projExpr.getLocation() );
innerPlan.add( op );
}
return op;
@@ -631,7 +638,7 @@ public class LogicalPlanBuilder {
throws RecognitionException {
try {
LOStream op = new LOStream( plan, pigContext.createExecutableManager(), command, schema );
- return buildOp( op, alias, inputAlias, null );
+ return buildOp( loc, op, alias, inputAlias, null );
} catch (ExecException ex) {
throw new PlanGenerationFailureException( input, loc, ex );
}
@@ -646,7 +653,7 @@ public class LogicalPlanBuilder {
pigContext.addJar( inputJar );
for( String path : paths )
pigContext.addJar( path );
- buildOp( op, null, new ArrayList<String>(), null );
+ buildOp( loc, op, null, new ArrayList<String>(), null );
((LOStore)operators.get( storeAlias )).setTmpStore(true);
plan.connect( operators.get( storeAlias ), op );
LOLoad load = (LOLoad)operators.get( loadAlias );
@@ -734,6 +741,8 @@ public class LogicalPlanBuilder {
LogicalExpression buildProjectExpr(SourceLocation loc, LogicalExpressionPlan plan, LogicalRelationalOperator op,
Map<String, LogicalExpressionPlan> exprPlans, String colAlias, int col)
throws RecognitionException {
+ ProjectExpression result = null;
+
if( colAlias != null ) {
LogicalExpressionPlan exprPlan = exprPlans.get( colAlias );
if( exprPlan != null ) {
@@ -759,14 +768,14 @@ public class LogicalPlanBuilder {
}
return (LogicalExpression)planCopy.getSources().get( 0 );// get the root of the plan
} else {
- try {
- return new ProjectExpression( plan, 0, colAlias, op );
- } catch (FrontendException e) {
- throw new ParserValidationException(intStream, loc, e);
- }
+ result = new ProjectExpression( plan, 0, colAlias, op );
+ result.setLocation( loc );
+ return result;
}
}
- return new ProjectExpression( plan, 0, col, op );
+ result = new ProjectExpression( plan, 0, col, op );
+ result.setLocation( loc );
+ return result;
}
/**
@@ -777,14 +786,12 @@ public class LogicalPlanBuilder {
LogicalExpressionPlan plan, LogicalRelationalOperator relOp,
int input, String colAlias, int col)
throws ParserValidationException {
-
- if( colAlias != null )
- try {
- return new ProjectExpression( plan, input, colAlias, relOp );
- } catch (FrontendException e) {
- throw new ParserValidationException(intStream, loc, e);
- }
- return new ProjectExpression( plan, input, col, relOp );
+ ProjectExpression result = null;
+ result = colAlias != null ?
+ new ProjectExpression( plan, input, colAlias, relOp ) :
+ new ProjectExpression( plan, input, col, relOp );
+ result.setLocation( loc );
+ return result;
}
/**
@@ -888,7 +895,9 @@ public class LogicalPlanBuilder {
funcSpec = new FuncSpec( funcName );
}
- return new UserFuncExpression( plan, funcSpec, args );
+ LogicalExpression le = new UserFuncExpression( plan, funcSpec, args );
+ le.setLocation( loc );
+ return le;
}
private long getNextId() {
@@ -900,27 +909,28 @@ public class LogicalPlanBuilder {
}
// Build operator for foreach inner plan.
- Operator buildNestedFilterOp(LOFilter op, LogicalPlan plan, String alias,
+ Operator buildNestedFilterOp(SourceLocation loc, LOFilter op, LogicalPlan plan, String alias,
Operator inputOp, LogicalExpressionPlan expr) {
op.setFilterPlan( expr );
- buildNestedOp( plan, op, alias, inputOp );
+ buildNestedOp( loc, plan, op, alias, inputOp );
return op;
}
- Operator buildNestedDistinctOp(LogicalPlan plan, String alias, Operator inputOp) {
+ Operator buildNestedDistinctOp(SourceLocation loc, LogicalPlan plan, String alias, Operator inputOp) {
LODistinct op = new LODistinct( plan );
- buildNestedOp( plan, op, alias, inputOp );
+ buildNestedOp( loc, plan, op, alias, inputOp );
return op;
}
- Operator buildNestedLimitOp(LogicalPlan plan, String alias, Operator inputOp, long limit) {
+ Operator buildNestedLimitOp(SourceLocation loc, LogicalPlan plan, String alias, Operator inputOp, long limit) {
LOLimit op = new LOLimit( plan, limit );
- buildNestedOp( plan, op, alias, inputOp );
+ buildNestedOp( loc, plan, op, alias, inputOp );
return op;
}
- private void buildNestedOp(LogicalPlan plan, LogicalRelationalOperator op,
+ private void buildNestedOp(SourceLocation loc, LogicalPlan plan, LogicalRelationalOperator op,
String alias, Operator inputOp) {
+ op.setLocation( loc );
setAlias( op, alias );
plan.add( op );
plan.connect( inputOp, op );
@@ -945,7 +955,7 @@ public class LogicalPlanBuilder {
}
}
- Operator buildNestedSortOp(LOSort op, LogicalPlan plan, String alias, Operator inputOp,
+ Operator buildNestedSortOp(SourceLocation loc, LOSort op, LogicalPlan plan, String alias, Operator inputOp,
List<LogicalExpressionPlan> plans,
List<Boolean> ascFlags, FuncSpec fs) {
op.setSortColPlans( plans );
@@ -955,14 +965,11 @@ public class LogicalPlanBuilder {
}
op.setAscendingCols( ascFlags );
op.setUserFunc( fs );
- buildNestedOp( plan, op, alias, inputOp );
+ buildNestedOp( loc, plan, op, alias, inputOp );
return op;
}
- Operator buildNestedProjectOp(
- SourceLocation loc,
- LogicalPlan innerPlan,
- LOForEach foreach,
+ Operator buildNestedProjectOp(SourceLocation loc, LogicalPlan innerPlan, LOForEach foreach,
Map<String, Operator> operators,
String alias,
ProjectExpression projExpr,
@@ -979,15 +986,18 @@ public class LogicalPlanBuilder {
} else {
// Assuming that ProjExpr refers to a column by name. Create an LOInnerLoad
input = createInnerLoad( loc, innerPlan, foreach, colAlias );
+ input.setLocation( projExpr.getLocation() );
}
} else {
// ProjExpr refers to a column by number.
input = new LOInnerLoad( innerPlan, foreach, projExpr.getColNum() );
+ input.setLocation( projExpr.getLocation() );
}
LogicalPlan lp = new LogicalPlan(); // f's inner plan
LOForEach f = new LOForEach( innerPlan );
f.setInnerPlan( lp );
+ f.setLocation( loc );
LOGenerate gen = new LOGenerate( lp );
boolean[] flatten = new boolean[exprPlans.size()];
@@ -997,6 +1007,7 @@ public class LogicalPlanBuilder {
String al = pe.getColAlias();
LOInnerLoad iload = ( al == null ) ?
new LOInnerLoad( lp, f, pe.getColNum() ) : createInnerLoad(loc, lp, f, al );
+ iload.setLocation( pe.getLocation() );
pe.setColNum( -1 );
pe.setInputNum( innerLoads.size() );
pe.setAttachedRelationalOp( gen );
Modified: pig/trunk/src/org/apache/pig/parser/LogicalPlanGenerator.g
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/parser/LogicalPlanGenerator.g?rev=1088700&r1=1088699&r2=1088700&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/parser/LogicalPlanGenerator.g (original)
+++ pig/trunk/src/org/apache/pig/parser/LogicalPlanGenerator.g Mon Apr 4 18:31:28 2011
@@ -233,7 +233,7 @@ cmd[String alias] returns[StreamingComma
@init {
List<String> shipPaths = new ArrayList<String>();
List<String> cachePaths = new ArrayList<String>();
- SourceLocation loc = new SourceLocation( (CommonTree)$cmd.start );
+ SourceLocation loc = new SourceLocation( (PigParserNode)$cmd.start );
}
: ^( EXECCOMMAND ( ship_clause[shipPaths] | cache_caluse[cachePaths] | input_clause | output_clause | error_clause )* )
{
@@ -310,7 +310,7 @@ error_clause returns[String dir, Integer
load_clause returns[String alias]
: ^( LOAD filename func_clause[FunctionType.LOADFUNC]? as_clause? )
{
- SourceLocation loc = new SourceLocation( (CommonTree)$load_clause.start );
+ SourceLocation loc = new SourceLocation( (PigParserNode)$load_clause.start );
$alias = builder.buildLoadOp( loc, $statement::alias,
$filename.filename, $func_clause.funcSpec, $as_clause.logicalSchema );
}
@@ -419,7 +419,7 @@ map_type returns[LogicalSchema logicalSc
func_clause[byte ft] returns[FuncSpec funcSpec]
@init {
- SourceLocation loc = new SourceLocation( (CommonTree)$func_clause.start );
+ SourceLocation loc = new SourceLocation( (PigParserNode)$func_clause.start );
}
: ^( FUNC_REF func_name )
{
@@ -468,7 +468,7 @@ scope GScope;
$group_clause::inputAliases = new ArrayList<String>();
$group_clause::innerFlags = new ArrayList<Boolean>();
GROUPTYPE groupType = GROUPTYPE.REGULAR;
- SourceLocation loc = new SourceLocation( (CommonTree)$group_clause.start );
+ SourceLocation loc = new SourceLocation( (PigParserNode)$group_clause.start );
}
: ^( GROUP group_item+ ( group_type { groupType = $group_type.type; ((LOCogroup)$GScope::currentOp).pinOption(LOCogroup.OPTION_GROUPTYPE); } )? partition_clause? )
{
@@ -487,7 +487,7 @@ scope GScope;
group_type returns[GROUPTYPE type]
: QUOTEDSTRING
{
- $type =builder.parseGroupType( $QUOTEDSTRING.text, new SourceLocation( $QUOTEDSTRING.token ) );
+ $type =builder.parseGroupType( $QUOTEDSTRING.text, new SourceLocation( (PigParserNode)$QUOTEDSTRING ) );
}
;
@@ -500,7 +500,8 @@ group_item
| ALL
{
LogicalExpressionPlan plan = new LogicalExpressionPlan();
- new ConstantExpression( plan, "all");
+ ConstantExpression ce = new ConstantExpression( plan, "all");
+ ce.setLocation( new SourceLocation( (PigParserNode)$ALL ) );
List<LogicalExpressionPlan> plans = new ArrayList<LogicalExpressionPlan>( 1 );
plans.add( plan );
$group_clause::groupPlans.put( $group_clause::inputIndex, plans );
@@ -508,7 +509,8 @@ group_item
| ANY
{
LogicalExpressionPlan plan = new LogicalExpressionPlan();
- new UserFuncExpression( plan, new FuncSpec( GFAny.class.getName() ) );
+ UserFuncExpression udf = new UserFuncExpression( plan, new FuncSpec( GFAny.class.getName() ) );
+ udf.setLocation( new SourceLocation( (PigParserNode)$ANY ) );
List<LogicalExpressionPlan> plans = new ArrayList<LogicalExpressionPlan>( 1 );
plans.add( plan );
$group_clause::groupPlans.put( $group_clause::inputIndex, plans );
@@ -553,8 +555,8 @@ flatten_generated_item returns[LogicalEx
| expr[$plan]
| STAR
{
- SourceLocation loc = new SourceLocation( $STAR.token );
- builder.buildProjectExpr(loc, $plan, $GScope::currentOp, $statement::inputIndex, null, -1 );
+ builder.buildProjectExpr( new SourceLocation( (PigParserNode)$STAR ), $plan, $GScope::currentOp,
+ $statement::inputIndex, null, -1 );
}
)
( field_def_list { $schema = $field_def_list.schema; } )?
@@ -567,7 +569,7 @@ flatten_clause[LogicalExpressionPlan pla
store_clause returns[String alias]
: ^( STORE rel filename func_clause[FunctionType.STOREFUNC]? )
{
- SourceLocation loc = new SourceLocation( $STORE.token );
+ SourceLocation loc = new SourceLocation( (PigParserNode)$STORE );
$alias= builder.buildStoreOp( loc, $statement::alias,
$statement::inputAlias, $filename.filename, $func_clause.funcSpec );
}
@@ -581,8 +583,9 @@ scope GScope;
}
: ^( FILTER rel cond[exprPlan] )
{
- $alias = builder.buildFilterOp( (LOFilter)$GScope::currentOp, $statement::alias,
- $statement::inputAlias, exprPlan );
+ $alias = builder.buildFilterOp( new SourceLocation( (PigParserNode)$FILTER ),
+ (LOFilter)$GScope::currentOp, $statement::alias,
+ $statement::inputAlias, exprPlan );
}
;
@@ -590,48 +593,61 @@ cond[LogicalExpressionPlan exprPlan] ret
: ^( OR left = cond[exprPlan] right = cond[exprPlan] )
{
$expr = new OrExpression( $exprPlan, $left.expr, $right.expr );
+ $expr.setLocation( new SourceLocation( (PigParserNode)$OR ) );
}
| ^( AND left = cond[exprPlan] right = cond[exprPlan] )
{
$expr = new AndExpression( $exprPlan, $left.expr, $right.expr );
+ $expr.setLocation( new SourceLocation( (PigParserNode)$AND ) );
}
| ^( NOT c = cond[exprPlan] )
{
$expr = new NotExpression( $exprPlan, $c.expr );
+ $expr.setLocation( new SourceLocation( (PigParserNode)$NOT ) );
}
| ^( NULL expr[$exprPlan] NOT? )
{
$expr = new IsNullExpression( $exprPlan, $expr.expr );
- if( $NOT != null )
+ $expr.setLocation( new SourceLocation( (PigParserNode)$NULL ) );
+ if( $NOT != null ) {
$expr = new NotExpression( $exprPlan, $expr );
+ $expr.setLocation( new SourceLocation( (PigParserNode)$NOT ) );
+ }
}
| ^( rel_op_eq e1 = expr[$exprPlan] e2 = expr[$exprPlan] )
{
$expr = new EqualExpression( $exprPlan, $e1.expr, $e2.expr );
+ $expr.setLocation( new SourceLocation( (PigParserNode)$rel_op_eq.start ) );
}
| ^( rel_op_ne e1 = expr[$exprPlan] e2 = expr[$exprPlan] )
{
$expr = new NotEqualExpression( $exprPlan, $e1.expr, $e2.expr );
+ $expr.setLocation( new SourceLocation( (PigParserNode)$rel_op_ne.start ) );
}
| ^( rel_op_lt e1 = expr[$exprPlan] e2 = expr[$exprPlan] )
{
$expr = new LessThanExpression( $exprPlan, $e1.expr, $e2.expr );
+ $expr.setLocation( new SourceLocation( (PigParserNode)$rel_op_lt.start ) );
}
| ^( rel_op_lte e1 = expr[$exprPlan] e2 = expr[$exprPlan] )
{
$expr = new LessThanEqualExpression( $exprPlan, $e1.expr, $e2.expr );
+ $expr.setLocation( new SourceLocation( (PigParserNode)$rel_op_lte.start ) );
}
| ^( rel_op_gt e1 = expr[$exprPlan] e2 = expr[$exprPlan] )
{
$expr = new GreaterThanExpression( $exprPlan, $e1.expr, $e2.expr );
+ $expr.setLocation( new SourceLocation( (PigParserNode)$rel_op_gt.start ) );
}
| ^( rel_op_gte e1 = expr[$exprPlan] e2 = expr[$exprPlan] )
{
$expr = new GreaterThanEqualExpression( $exprPlan, $e1.expr, $e2.expr );
+ $expr.setLocation( new SourceLocation( (PigParserNode)$rel_op_gte.start ) );
}
| ^( STR_OP_MATCHES e1 = expr[$exprPlan] e2 = expr[$exprPlan] )
{
$expr = new RegexExpression( $exprPlan, $e1.expr, $e2.expr );
+ $expr.setLocation( new SourceLocation( (PigParserNode)$STR_OP_MATCHES ) );
}
| func_eval[$exprPlan]
{
@@ -645,7 +661,7 @@ func_eval[LogicalExpressionPlan plan] re
}
: ^( FUNC_EVAL func_name ( real_arg[$plan] { args.add( $real_arg.expr ); } )* )
{
- SourceLocation loc = new SourceLocation( (CommonTree)$func_eval.start );
+ SourceLocation loc = new SourceLocation( (PigParserNode)$func_name.start );
$expr = builder.buildUDF( loc, $plan, $func_name.funcName, args );
}
;
@@ -654,8 +670,8 @@ real_arg [LogicalExpressionPlan plan] re
: e = expr[$plan] { $expr = $e.expr; }
| STAR
{
- SourceLocation loc = new SourceLocation( $STAR.token );
- $expr = builder.buildProjectExpr(loc, $plan, $GScope::currentOp, $statement::inputIndex, null, -1 );
+ $expr = builder.buildProjectExpr( new SourceLocation( (PigParserNode)$STAR ), $plan, $GScope::currentOp,
+ $statement::inputIndex, null, -1 );
}
;
@@ -663,22 +679,27 @@ expr[LogicalExpressionPlan plan] returns
: ^( PLUS left = expr[$plan] right = expr[$plan] )
{
$expr = new AddExpression( $plan, $left.expr, $right.expr );
+ $expr.setLocation( new SourceLocation( (PigParserNode)$PLUS ) );
}
| ^( MINUS left = expr[$plan] right = expr[$plan] )
{
$expr = new SubtractExpression( $plan, $left.expr, $right.expr );
+ $expr.setLocation( new SourceLocation( (PigParserNode)$MINUS ) );
}
| ^( STAR left = expr[$plan] right = expr[$plan] )
{
$expr = new MultiplyExpression( $plan, $left.expr, $right.expr );
+ $expr.setLocation( new SourceLocation( (PigParserNode)$STAR ) );
}
| ^( DIV left = expr[$plan] right = expr[$plan] )
{
$expr = new DivideExpression( $plan, $left.expr, $right.expr );
+ $expr.setLocation( new SourceLocation( (PigParserNode)$DIV ) );
}
| ^( PERCENT left = expr[$plan] right = expr[$plan] )
{
$expr = new ModExpression( $plan, $left.expr, $right.expr );
+ $expr.setLocation( new SourceLocation( (PigParserNode)$PERCENT ) );
}
| const_expr[$plan]
{
@@ -691,10 +712,12 @@ expr[LogicalExpressionPlan plan] returns
| ^( NEG e = expr[$plan] )
{
$expr = new NegativeExpression( $plan, $e.expr );
+ $expr.setLocation( new SourceLocation( (PigParserNode)$e.start ) );
}
| ^( CAST_EXPR type_cast e = expr[$plan] ) // cast expr
{
$expr = new CastExpression( $plan, $e.expr, $type_cast.fieldSchema );
+ $expr.setLocation( new SourceLocation( (PigParserNode)$type_cast.start ) );
}
| ^( EXPR_IN_PAREN e = expr[$plan] ) // unary expr
{
@@ -741,7 +764,7 @@ bag_type_cast returns[LogicalSchema logi
var_expr[LogicalExpressionPlan plan] returns[LogicalExpression expr]
@init {
List<Object> columns = null;
- SourceLocation loc = new SourceLocation( (CommonTree)$var_expr.start );
+ SourceLocation loc = new SourceLocation( (PigParserNode)$var_expr.start );
}
: projectable_expr[$plan] { $expr = $projectable_expr.expr; }
( dot_proj
@@ -782,6 +805,7 @@ var_expr[LogicalExpressionPlan plan] ret
} else {
DereferenceExpression e = new DereferenceExpression( $plan );
e.setRawColumns( $dot_proj.cols );
+ e.setLocation( new SourceLocation( (PigParserNode)$dot_proj.start ) );
$plan.connect( e, $expr );
$expr = e;
}
@@ -789,6 +813,7 @@ var_expr[LogicalExpressionPlan plan] ret
| pound_proj
{
MapLookupExpression e = new MapLookupExpression( $plan, $pound_proj.key );
+ e.setLocation( new SourceLocation( (PigParserNode)$pound_proj.start ) );
$plan.connect( e, $expr );
$expr = e;
}
@@ -852,7 +877,7 @@ col_index returns[Integer col]
col_range[LogicalExpressionPlan plan] returns[LogicalExpression expr]
: ^(COL_RANGE (startExpr = col_ref[$plan])? DOUBLE_PERIOD (endExpr = col_ref[$plan])? )
{
- SourceLocation loc = new SourceLocation( (CommonTree)$col_range.start );
+ SourceLocation loc = new SourceLocation( (PigParserNode)$col_range.start );
$expr = builder.buildRangeProjectExpr(
loc, plan, $GScope::currentOp,
$statement::inputIndex,
@@ -870,18 +895,19 @@ bin_expr[LogicalExpressionPlan plan] ret
: ^( BIN_EXPR cond[$plan] e1 = expr[$plan] e2 = expr[$plan] )
{
$expr = new BinCondExpression( $plan, $cond.expr, $e1.expr, $e2.expr );
+ $expr.setLocation( new SourceLocation( (PigParserNode)$bin_expr.start ) );
}
;
limit_clause returns[String alias]
: ^( LIMIT rel INTEGER )
{
- $alias = builder.buildLimitOp( $statement::alias,
+ $alias = builder.buildLimitOp( new SourceLocation( (PigParserNode)$LIMIT ), $statement::alias,
$statement::inputAlias, Long.valueOf( $INTEGER.text ) );
}
| ^( LIMIT rel LONGINTEGER )
{
- $alias = builder.buildLimitOp( $statement::alias,
+ $alias = builder.buildLimitOp( new SourceLocation( (PigParserNode)$LIMIT ), $statement::alias,
$statement::inputAlias, builder.parseLong( $LONGINTEGER.text ) );
}
;
@@ -889,8 +915,9 @@ limit_clause returns[String alias]
sample_clause returns[String alias]
: ^( SAMPLE rel DOUBLENUMBER )
{
- $alias = builder.buildSampleOp( $statement::alias,
- $statement::inputAlias, Double.valueOf( $DOUBLENUMBER.text ) );
+ $alias = builder.buildSampleOp( new SourceLocation( (PigParserNode)$SAMPLE ), $statement::alias,
+ $statement::inputAlias, Double.valueOf( $DOUBLENUMBER.text ),
+ new SourceLocation( (PigParserNode)$DOUBLENUMBER ) );
}
;
@@ -901,7 +928,7 @@ scope GScope;
}
: ^( ORDER rel order_by_clause func_clause[FunctionType.COMPARISONFUNC]? )
{
- SourceLocation loc = new SourceLocation( $ORDER.token );
+ SourceLocation loc = new SourceLocation( (PigParserNode)$ORDER );
$alias = builder.buildSortOp( loc, (LOSort)$GScope::currentOp, $statement::alias,
$statement::inputAlias, $order_by_clause.plans,
$order_by_clause.ascFlags, $func_clause.funcSpec );
@@ -915,8 +942,8 @@ order_by_clause returns[List<LogicalExpr
}
: STAR {
LogicalExpressionPlan plan = new LogicalExpressionPlan();
- SourceLocation loc = new SourceLocation( $STAR.token );
- builder.buildProjectExpr(loc, plan, $GScope::currentOp, $statement::inputIndex, null, -1 );
+ builder.buildProjectExpr( new SourceLocation( (PigParserNode)$STAR ), plan, $GScope::currentOp,
+ $statement::inputIndex, null, -1 );
$plans.add( plan );
}
( ASC { $ascFlags.add( true ); } | DESC { $ascFlags.add( false ); } )?
@@ -939,7 +966,7 @@ order_col returns[LogicalExpressionPlan
distinct_clause returns[String alias]
: ^( DISTINCT rel partition_clause? )
{
- $alias = builder.buildDistinctOp( $statement::alias,
+ $alias = builder.buildDistinctOp( new SourceLocation( (PigParserNode)$DISTINCT ), $statement::alias,
$statement::inputAlias, $partition_clause.partitioner );
}
;
@@ -954,7 +981,7 @@ partition_clause returns[String partitio
cross_clause returns[String alias]
: ^( CROSS rel_list partition_clause? )
{
- $alias = builder.buildCrossOp( $statement::alias,
+ $alias = builder.buildCrossOp( new SourceLocation( (PigParserNode)$CROSS ), $statement::alias,
$rel_list.aliasList, $partition_clause.partitioner );
}
;
@@ -980,7 +1007,7 @@ scope GScope;
}
: ^( JOIN join_sub_clause join_type? partition_clause? )
{
- SourceLocation loc = new SourceLocation( $JOIN.token );
+ SourceLocation loc = new SourceLocation( (PigParserNode)$JOIN );
$alias = builder.buildJoinOp( loc, (LOJoin)$GScope::currentOp, $statement::alias,
$join_clause::inputAliases, $join_clause::joinPlans,
$join_type.type, $join_clause::innerFlags, $partition_clause.partitioner );
@@ -990,7 +1017,7 @@ scope GScope;
join_type returns[JOINTYPE type]
: QUOTEDSTRING
{
- $type = builder.parseJoinType( $QUOTEDSTRING.text, new SourceLocation( $QUOTEDSTRING.token ) );
+ $type = builder.parseJoinType( $QUOTEDSTRING.text, new SourceLocation( (PigParserNode)$QUOTEDSTRING ) );
}
;
@@ -1031,8 +1058,8 @@ join_group_by_expr returns[LogicalExpres
| expr[$plan]
| STAR
{
- SourceLocation loc = new SourceLocation( $STAR.token );
- builder.buildProjectExpr(loc, $plan, $GScope::currentOp, $statement::inputIndex, null, -1 );
+ builder.buildProjectExpr( new SourceLocation( (PigParserNode)$STAR ), $plan, $GScope::currentOp,
+ $statement::inputIndex, null, -1 );
}
;
@@ -1042,7 +1069,8 @@ union_clause returns[String alias]
}
: ^( UNION ( ONSCHEMA { onSchema = true; } )? rel_list )
{
- $alias = builder.buildUnionOp( $statement::alias, $rel_list.aliasList, onSchema );
+ $alias = builder.buildUnionOp( new SourceLocation( (PigParserNode)$UNION ), $statement::alias,
+ $rel_list.aliasList, onSchema );
}
;
@@ -1057,7 +1085,7 @@ scope GScope;
}
: ^( FOREACH rel foreach_plan )
{
- SourceLocation loc = new SourceLocation( $FOREACH.token );
+ SourceLocation loc = new SourceLocation( (PigParserNode)$FOREACH );
$alias = builder.buildForeachOp( loc, $foreach_clause::foreachOp, $statement::alias,
$statement::inputAlias, $foreach_plan.plan );
}
@@ -1102,9 +1130,9 @@ scope GScope;
}
)+
)
- { SourceLocation loc = new SourceLocation( $GENERATE.token );
- builder.buildGenerateOp(loc, $foreach_clause::foreachOp, (LOGenerate)$GScope::currentOp,
- $foreach_plan::operators,
+ {
+ builder.buildGenerateOp( new SourceLocation( (PigParserNode)$GENERATE ), $foreach_clause::foreachOp,
+ (LOGenerate)$GScope::currentOp, $foreach_plan::operators,
plans, flattenFlags, schemas );
}
;
@@ -1145,8 +1173,8 @@ nested_proj[String alias] returns[Operat
}
)+ )
{
- SourceLocation loc = new SourceLocation( (CommonTree)$nested_proj.start);
- $op = builder.buildNestedProjectOp(loc, $foreach_plan::innerPlan, $foreach_clause::foreachOp,
+ SourceLocation loc = new SourceLocation( (PigParserNode)$cr0.start );
+ $op = builder.buildNestedProjectOp( loc, $foreach_plan::innerPlan, $foreach_clause::foreachOp,
$foreach_plan::operators, $alias, (ProjectExpression)$cr0.expr, plans );
}
;
@@ -1160,7 +1188,8 @@ scope GScope;
}
: ^( FILTER nested_op_input cond[plan] )
{
- $op = builder.buildNestedFilterOp( (LOFilter)$GScope::currentOp, $foreach_plan::innerPlan, $alias,
+ SourceLocation loc = new SourceLocation( (PigParserNode)$FILTER );
+ $op = builder.buildNestedFilterOp( loc, (LOFilter)$GScope::currentOp, $foreach_plan::innerPlan, $alias,
$nested_op_input.op, plan );
}
;
@@ -1173,7 +1202,8 @@ scope GScope;
}
: ^( ORDER nested_op_input order_by_clause func_clause[FunctionType.COMPARISONFUNC]? )
{
- $op = builder.buildNestedSortOp( (LOSort)$GScope::currentOp, $foreach_plan::innerPlan, $alias,
+ SourceLocation loc = new SourceLocation( (PigParserNode)$ORDER );
+ $op = builder.buildNestedSortOp( loc, (LOSort)$GScope::currentOp, $foreach_plan::innerPlan, $alias,
$nested_op_input.op,
$order_by_clause.plans, $order_by_clause.ascFlags, $func_clause.funcSpec );
}
@@ -1185,7 +1215,8 @@ nested_distinct[String alias] returns[Op
}
: ^( DISTINCT nested_op_input )
{
- $op = builder.buildNestedDistinctOp( $foreach_plan::innerPlan, $alias, $nested_op_input.op );
+ SourceLocation loc = new SourceLocation( (PigParserNode)$DISTINCT );
+ $op = builder.buildNestedDistinctOp( loc, $foreach_plan::innerPlan, $alias, $nested_op_input.op );
}
;
@@ -1195,7 +1226,8 @@ nested_limit[String alias] returns[Opera
}
: ^( LIMIT nested_op_input INTEGER )
{
- $op = builder.buildNestedLimitOp( $foreach_plan::innerPlan, $alias, $nested_op_input.op,
+ SourceLocation loc = new SourceLocation( (PigParserNode)$LIMIT );
+ $op = builder.buildNestedLimitOp( loc, $foreach_plan::innerPlan, $alias, $nested_op_input.op,
Integer.valueOf( $INTEGER.text ) );
}
;
@@ -1206,7 +1238,7 @@ nested_op_input returns[Operator op]
}
: col_ref[plan]
{
- SourceLocation loc = new SourceLocation( (CommonTree)$col_ref.start );
+ SourceLocation loc = new SourceLocation( (PigParserNode)$col_ref.start );
$op = builder.buildNestedOperatorInput( loc, $foreach_plan::innerPlan,
$foreach_clause::foreachOp, $foreach_plan::operators, $col_ref.expr );
}
@@ -1219,7 +1251,7 @@ nested_op_input returns[Operator op]
stream_clause returns[String alias]
@init {
StreamingCommand cmd = null;
- SourceLocation loc = new SourceLocation( (CommonTree)$stream_clause.start );
+ SourceLocation loc = new SourceLocation( (PigParserNode)$stream_clause.start );
}
: ^( STREAM rel ( EXECCOMMAND { cmd = builder.buildCommand( loc, builder.unquote( $EXECCOMMAND.text ) ); }
| IDENTIFIER
@@ -1228,7 +1260,7 @@ stream_clause returns[String alias]
if( cmd == null ) {
String msg = "Undefined command-alias [" + $IDENTIFIER.text + "]";
throw new ParserValidationException( input,
- new SourceLocation( $IDENTIFIER.token ), msg );
+ new SourceLocation( (PigParserNode)$IDENTIFIER ), msg );
}
}
) as_clause? )
@@ -1242,7 +1274,7 @@ mr_clause returns[String alias]
@init {
List<String> paths = new ArrayList<String>();
String alias = $statement::alias;
- SourceLocation loc = new SourceLocation( (CommonTree)$mr_clause.start );
+ SourceLocation loc = new SourceLocation( (PigParserNode)$mr_clause.start );
}
: ^( MAPREDUCE QUOTEDSTRING path_list[paths]?
{ $statement::alias = null; } store_clause
@@ -1256,8 +1288,14 @@ mr_clause returns[String alias]
;
split_clause
- : ^( SPLIT rel { $statement::inputAlias = builder.buildSplitOp( $statement::inputAlias ); }
- split_branch+ )
+ : ^( SPLIT
+ rel
+ {
+ SourceLocation loc = new SourceLocation( (PigParserNode)$SPLIT );
+ $statement::inputAlias = builder.buildSplitOp( loc, $statement::inputAlias );
+ }
+ split_branch+
+ )
;
split_branch
@@ -1268,7 +1306,8 @@ scope GScope;
}
: ^( SPLIT_BRANCH alias cond[splitPlan] )
{
- builder.buildSplitOutputOp( (LOSplitOutput)$GScope::currentOp, $alias.name,
+ SourceLocation loc = new SourceLocation( (PigParserNode)$alias.start );
+ builder.buildSplitOutputOp( loc, (LOSplitOutput)$GScope::currentOp, $alias.name,
$statement::inputAlias, splitPlan );
}
;
@@ -1281,13 +1320,12 @@ col_ref[LogicalExpressionPlan plan] retu
alias_col_ref[LogicalExpressionPlan plan] returns[LogicalExpression expr]
: GROUP
{
- SourceLocation loc = new SourceLocation( $GROUP.token );
- $expr = builder.buildProjectExpr(loc, $plan, $GScope::currentOp,
+ $expr = builder.buildProjectExpr( new SourceLocation( (PigParserNode)$GROUP ), $plan, $GScope::currentOp,
$statement::inputIndex, $GROUP.text, 0 );
}
| scoped_alias_col_ref
{
- SourceLocation loc = new SourceLocation( (CommonTree)$scoped_alias_col_ref.start );
+ SourceLocation loc = new SourceLocation( (PigParserNode)$scoped_alias_col_ref.start );
String alias = $scoped_alias_col_ref.alias;
Operator inOp = builder.lookupOperator( $statement::inputAlias );
LogicalSchema schema;
@@ -1301,6 +1339,7 @@ alias_col_ref[LogicalExpressionPlan plan
if( op != null && ( schema == null || schema.getFieldPosition( alias ) == -1 ) ) {
$expr = new ScalarExpression( plan, op,
inForeachPlan ? $foreach_clause::foreachOp : $GScope::currentOp );
+ $expr.setLocation( loc );
} else {
if( inForeachPlan ) {
$expr = builder.buildProjectExpr( loc, $plan, $GScope::currentOp,
@@ -1330,8 +1369,7 @@ dollar_col_ref[LogicalExpressionPlan pla
: DOLLARVAR
{
int col = builder.undollar( $DOLLARVAR.text );
- SourceLocation loc = new SourceLocation( $DOLLARVAR.token );
- $expr = builder.buildProjectExpr(loc, $plan, $GScope::currentOp,
+ $expr = builder.buildProjectExpr( new SourceLocation( (PigParserNode)$DOLLARVAR ), $plan, $GScope::currentOp,
$statement::inputIndex, null, col );
}
;
@@ -1340,6 +1378,7 @@ const_expr[LogicalExpressionPlan plan] r
: literal
{
$expr = new ConstantExpression( $plan, $literal.value);
+ $expr.setLocation( new SourceLocation( (PigParserNode)$const_expr.start ) );
}
;
Modified: pig/trunk/src/org/apache/pig/parser/PigRecognitionException.java
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/parser/PigRecognitionException.java?rev=1088700&r1=1088699&r2=1088700&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/parser/PigRecognitionException.java (original)
+++ pig/trunk/src/org/apache/pig/parser/PigRecognitionException.java Mon Apr 4 18:31:28 2011
@@ -31,19 +31,17 @@ import org.antlr.runtime.RecognitionExce
public abstract class PigRecognitionException extends RecognitionException {
private static final long serialVersionUID = 1L;
+ private SourceLocation location;
+
public PigRecognitionException(IntStream input, SourceLocation loc) {
super( input );
this.line = loc.line();
this.charPositionInLine = loc.offset();
+ this.location = loc;
}
protected String msgHeader() {
- StringBuilder sb = new StringBuilder();
- sb.append( "<line " + line );
- if( charPositionInLine >= 0 )
- sb.append( ", column " + charPositionInLine );
- sb.append( "> " );
- return sb.toString();
+ return location.toString();
}
}
Modified: pig/trunk/src/org/apache/pig/parser/SourceLocation.java
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/parser/SourceLocation.java?rev=1088700&r1=1088699&r2=1088700&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/parser/SourceLocation.java (original)
+++ pig/trunk/src/org/apache/pig/parser/SourceLocation.java Mon Apr 4 18:31:28 2011
@@ -18,32 +18,30 @@
package org.apache.pig.parser;
-import org.antlr.runtime.Token;
-import org.antlr.runtime.tree.CommonTree;
-
public class SourceLocation {
+ private String file = null; // Name of the source, null if unknown.
private int line = -1; // line number, -1 if unknown.
private int offset = -1; // offset, -f if unknown.
- public SourceLocation(int line, int offset) {
- this.line = line;
- this.offset = offset;
+ public SourceLocation() {
}
- public SourceLocation(int line) {
- this.line = line;
+ public SourceLocation(PigParserNode tree) {
+ this.file = tree.getFileName();
+ this.line = tree.getLine();
+ this.offset = tree.getCharPositionInLine();
}
- public SourceLocation(Token token) {
- this.line = token.getLine();
- this.offset = token.getCharPositionInLine();
+ public SourceLocation(SourceLocation location) {
+ this.file = location.file;
+ this.line = location.line;
+ this.offset = location.offset;
}
- public SourceLocation(CommonTree tree) {
- this.line = tree.getLine();
- this.offset = tree.getCharPositionInLine();
+ public String file() {
+ return file;
}
-
+
public int line() {
return line;
}
@@ -52,4 +50,17 @@ public class SourceLocation {
return offset;
}
+ @Override
+ public String toString() {
+ if( line == -1 )
+ return "";
+
+ StringBuilder sb = new StringBuilder( "<" );
+ if( file != null )
+ sb.append( "file " + file + ", " );
+ sb.append( "line " + line +", column " + offset + "> " );
+
+ return sb.toString();
+ }
+
}
Modified: pig/trunk/src/org/apache/pig/parser/UndefinedAliasException.java
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/parser/UndefinedAliasException.java?rev=1088700&r1=1088699&r2=1088700&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/parser/UndefinedAliasException.java (original)
+++ pig/trunk/src/org/apache/pig/parser/UndefinedAliasException.java Mon Apr 4 18:31:28 2011
@@ -19,15 +19,14 @@
package org.apache.pig.parser;
import org.antlr.runtime.IntStream;
-import org.antlr.runtime.Token;
public class UndefinedAliasException extends PigRecognitionException {
private static final long serialVersionUID = 1L;
private String alias;
- public UndefinedAliasException(IntStream input, Token t, String alias) {
- super( input, new SourceLocation( t ) );
+ public UndefinedAliasException(IntStream input, SourceLocation loc, String alias) {
+ super( input, loc );
this.alias = alias;
}
Modified: pig/trunk/test/org/apache/pig/parser/TestLogicalPlanGenerator.java
URL: http://svn.apache.org/viewvc/pig/trunk/test/org/apache/pig/parser/TestLogicalPlanGenerator.java?rev=1088700&r1=1088699&r2=1088700&view=diff
==============================================================================
--- pig/trunk/test/org/apache/pig/parser/TestLogicalPlanGenerator.java (original)
+++ pig/trunk/test/org/apache/pig/parser/TestLogicalPlanGenerator.java Mon Apr 4 18:31:28 2011
@@ -24,7 +24,6 @@ import java.io.IOException;
import junit.framework.Assert;
-import org.antlr.runtime.RecognitionException;
import org.apache.pig.test.Util;
import org.junit.BeforeClass;
import org.junit.Test;