You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pig.apache.org by ol...@apache.org on 2008/08/26 00:59:28 UTC
svn commit: r688915 - in /incubator/pig/branches/types: ./
src/org/apache/pig/impl/logicalLayer/parser/
src/org/apache/pig/tools/pigscript/parser/ test/org/apache/pig/test/
Author: olga
Date: Mon Aug 25 15:59:27 2008
New Revision: 688915
URL: http://svn.apache.org/viewvc?rev=688915&view=rev
Log:
PIG-353: parsing of complex types
Modified:
incubator/pig/branches/types/CHANGES.txt
incubator/pig/branches/types/src/org/apache/pig/impl/logicalLayer/parser/QueryParser.jjt
incubator/pig/branches/types/src/org/apache/pig/tools/pigscript/parser/PigScriptParser.jj
incubator/pig/branches/types/test/org/apache/pig/test/TestGrunt.java
incubator/pig/branches/types/test/org/apache/pig/test/TestTypeChecking.java
Modified: incubator/pig/branches/types/CHANGES.txt
URL: http://svn.apache.org/viewvc/incubator/pig/branches/types/CHANGES.txt?rev=688915&r1=688914&r2=688915&view=diff
==============================================================================
--- incubator/pig/branches/types/CHANGES.txt (original)
+++ incubator/pig/branches/types/CHANGES.txt Mon Aug 25 15:59:27 2008
@@ -169,3 +169,5 @@
PIG-352: java.lang.ClassCastException when invalid field is accessed
PIG-329: TestStoreOld, 2 unit tests were broken
+
+ PIG-353: parsing of complex types
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=688915&r1=688914&r2=688915&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 Mon Aug 25 15:59:27 2008
@@ -786,7 +786,7 @@
if (funcSpec == null){
funcSpec = new FuncSpec(PigStorage.class.getName());
}
-
+
lo = new LOLoad(lp, new OperatorKey(scope, getNextId()), new FileSpec(massageFilename(filename, pigContext), funcSpec), null);
lp.add(lo);
log.debug("Added operator " + lo.getClass().getName() + " to the logical plan");
@@ -1862,31 +1862,12 @@
}
)
)
- [ <AS> (LOOKAHEAD(2) "(" schema = TupleSchema() ")"
-
- { if (schema.size() > 1) {
- throw new ParseException("Schema mismatch");
- }
-
- fs = schema.getFields().get(0);
- }
- | fs = AtomSchema() )
- ]
+ [ <AS> (fs = FieldSchema()) ]
)
{
log.debug("item: " + item.getClass().getName());
if(null != fs) {
- // We're only interested in alias here
- // target type should be preserved
- Schema.FieldSchema tmpFs = item.getFieldSchema() ;
- if (tmpFs != null) {
- tmpFs.alias = fs.alias ;
- item.setFieldSchema(tmpFs);
- }
- else {
- tmpFs = new Schema.FieldSchema(fs.alias, DataType.BYTEARRAY) ;
- item.setFieldSchema(tmpFs);
- }
+ item.setFieldSchema(fs);
}
flattenList.add(flatten);
log.trace("Exiting FlattenedGenerateItem");
@@ -2356,7 +2337,7 @@
log.trace("Entering SchemaTuple");
}
{
- ( t1 = <IDENTIFIER> ) [":" <TUPLE>] "(" s = TupleSchema() ")"
+ ( t1 = <IDENTIFIER> ) [LOOKAHEAD(2) ":" <TUPLE> | ":"] "(" s = TupleSchema() ")"
{
if (null != t1) {
log.debug("TUPLE alias " + t1.image);
@@ -2377,7 +2358,7 @@
log.trace("Entering SchemaBag");
}
{
- ( t1 = <IDENTIFIER> ) [":" <BAG>] "{" (fs = SchemaTuple() | {} {fs = new Schema.FieldSchema(null, new Schema());}) "}"
+ ( t1 = <IDENTIFIER> ) [LOOKAHEAD(2) ":" <BAG> | ":"] "{" (fs = SchemaTuple() | {} {fs = new Schema.FieldSchema(null, new Schema());}) "}"
{
s = new Schema(fs);
if (null != t1) {
Modified: incubator/pig/branches/types/src/org/apache/pig/tools/pigscript/parser/PigScriptParser.jj
URL: http://svn.apache.org/viewvc/incubator/pig/branches/types/src/org/apache/pig/tools/pigscript/parser/PigScriptParser.jj?rev=688915&r1=688914&r2=688915&view=diff
==============================================================================
--- incubator/pig/branches/types/src/org/apache/pig/tools/pigscript/parser/PigScriptParser.jj (original)
+++ incubator/pig/branches/types/src/org/apache/pig/tools/pigscript/parser/PigScriptParser.jj Mon Aug 25 15:59:27 2008
@@ -30,6 +30,7 @@
import java.io.IOException;
import java.io.InputStream;
+import java.util.Stack;
import jline.ConsoleReader;
@@ -148,9 +149,13 @@
TOKEN_MGR_DECLS : {
int pigBlockLevel = 0;
int funcBlockLevel = 0;
+ int tupleSchemaLevel = 0;
+ int bagSchemaLevel = 0;
+ int bagConstantLevel = 0;
int prevState = DEFAULT;
boolean interactive = false;
ConsoleReader consoleReader = null;
+ Stack<Integer> stack = new Stack<Integer>();
public void secondary_prompt()
{
if (interactive)
@@ -161,6 +166,15 @@
}
}
+ public int getState(int state) {
+ if(!stack.empty()) return stack.pop();
+ return state;
+ }
+
+ public void saveState(int state) {
+ stack.push(state);
+ }
+
}
<DEFAULT> MORE :
@@ -174,13 +188,15 @@
<PIG_START> MORE :
{
<"'"> {prevState = PIG_START;} : IN_STRING
+| <["A","a"]["S","s"]> {prevState = PIG_START;} : SCHEMA_DEFINITION
+| <["G","g"]["E","e"]["N","n"]["E","e"]["R","r"]["A","a"]["T","t"]["E","e"]> {prevState = PIG_START;} : GENERATE
| <"{"> {pigBlockLevel = 1;} : IN_BLOCK
| <"}"> {if (true) throw new TokenMgrError("Unmatched '}'", TokenMgrError.LEXICAL_ERROR);}
| <";"> : PIG_END
| <"--"> {prevState = PIG_START;} : SINGLE_LINE_COMMENT
| <"/*"> {prevState = PIG_START;} : MULTI_LINE_COMMENT
| <("\n" | "\r" | "\r\n")> {secondary_prompt();}
-| <(~[])>
+| <(~[])>
}
<SINGLE_LINE_COMMENT> MORE :
@@ -204,9 +220,65 @@
| <(~[])>
}
+<GENERATE> MORE :
+{
+ <"{">
+ {
+ bagConstantLevel++;
+ prevState = getState(prevState);
+ saveState(prevState);
+ prevState = GENERATE;
+ } : BAG_CONSTANT
+| <["A","a"]["S","s"]>
+ {
+ prevState = getState(prevState);
+ saveState(prevState);
+ prevState = GENERATE;
+ } : SCHEMA_DEFINITION
+| <";">
+ {
+ prevState = getState(prevState);
+ if(prevState == PIG_START) {
+ input_stream.backup(1);
+ image.deleteCharAt(image.length()-1);
+ }
+ SwitchTo(prevState);
+ }
+| <("\n" | "\r" | "\r\n")> {secondary_prompt();}
+| <(~[])>
+}
+
+<SCHEMA_DEFINITION> MORE :
+{
+ <"("> {tupleSchemaLevel++;}
+| <")"> {tupleSchemaLevel--; if ((tupleSchemaLevel == 0) && (bagSchemaLevel == 0)) SwitchTo(prevState); }
+| <"{"> {bagSchemaLevel++;}
+| <"}"> {bagSchemaLevel--; if ((tupleSchemaLevel == 0) && (bagSchemaLevel == 0)) SwitchTo(prevState); }
+| <("," | ";" )>
+ {
+ if ((tupleSchemaLevel == 0) && (bagSchemaLevel == 0)) {
+ input_stream.backup(1);
+ image.deleteCharAt(image.length()-1);
+ SwitchTo(prevState);
+ }
+ }
+| <("\n" | "\r" | "\r\n")> {secondary_prompt();}
+| <(~[])>
+}
+
+<BAG_CONSTANT> MORE :
+{
+ <"{"> {bagConstantLevel++;}
+| <"}"> {bagConstantLevel--; if (bagConstantLevel == 0) SwitchTo(prevState);}
+| <("\n" | "\r" | "\r\n")> {secondary_prompt();}
+| <(~[])>
+}
+
<IN_BLOCK> MORE :
{
<"\""> {prevState = IN_BLOCK;} : IN_STRING
+| <["A","a"]["S","s"]> {prevState = IN_BLOCK;} : SCHEMA_DEFINITION
+| <["G","g"]["E","e"]["N","n"]["E","e"]["R","r"]["A","a"]["T","t"]["E","e"]> {prevState = IN_BLOCK;} : GENERATE
| <"{"> {pigBlockLevel++;}
| <"}"(";")?> {pigBlockLevel--; if (pigBlockLevel == 0) SwitchTo(PIG_END);}
| <"'"> {prevState = IN_BLOCK;} : IN_STRING
Modified: incubator/pig/branches/types/test/org/apache/pig/test/TestGrunt.java
URL: http://svn.apache.org/viewvc/incubator/pig/branches/types/test/org/apache/pig/test/TestGrunt.java?rev=688915&r1=688914&r2=688915&view=diff
==============================================================================
--- incubator/pig/branches/types/test/org/apache/pig/test/TestGrunt.java (original)
+++ incubator/pig/branches/types/test/org/apache/pig/test/TestGrunt.java Mon Aug 25 15:59:27 2008
@@ -71,4 +71,79 @@
}
assertTrue(null != context.getFuncSpecFromAlias("myudf"));
}
+
+ @Test
+ public void testBagSchema() throws Throwable {
+ PigServer server = new PigServer("MAPREDUCE");
+ PigContext context = server.getPigContext();
+
+ String strCmd = "a = load 'input1'as (b: bag{t(i: int, c:chararray, f: float)});\n";
+
+ ByteArrayInputStream cmd = new ByteArrayInputStream(strCmd.getBytes());
+ InputStreamReader reader = new InputStreamReader(cmd);
+
+ Grunt grunt = new Grunt(new BufferedReader(reader), context);
+
+ grunt.exec();
+ }
+
+ @Test
+ public void testBagConstant() throws Throwable {
+ PigServer server = new PigServer("MAPREDUCE");
+ PigContext context = server.getPigContext();
+
+ String strCmd = "a = load 'input1'; b = foreach a generate {(1, '1', 0.4f),(2, '2', 0.45)};\n";
+
+ ByteArrayInputStream cmd = new ByteArrayInputStream(strCmd.getBytes());
+ InputStreamReader reader = new InputStreamReader(cmd);
+
+ Grunt grunt = new Grunt(new BufferedReader(reader), context);
+
+ grunt.exec();
+ }
+
+ @Test
+ public void testBagConstantWithSchema() throws Throwable {
+ PigServer server = new PigServer("MAPREDUCE");
+ PigContext context = server.getPigContext();
+
+ String strCmd = "a = load 'input1'; b = foreach a generate {(1, '1', 0.4f),(2, '2', 0.45)} as b: bag{t(i: int, c:chararray, f: float)};\n";
+
+ ByteArrayInputStream cmd = new ByteArrayInputStream(strCmd.getBytes());
+ InputStreamReader reader = new InputStreamReader(cmd);
+
+ Grunt grunt = new Grunt(new BufferedReader(reader), context);
+
+ grunt.exec();
+ }
+
+ @Test
+ public void testBagConstantInForeachBlock() throws Throwable {
+ PigServer server = new PigServer("MAPREDUCE");
+ PigContext context = server.getPigContext();
+
+ String strCmd = "a = load 'input1'; b = foreach a {generate {(1, '1', 0.4f),(2, '2', 0.45)};};\n";
+
+ ByteArrayInputStream cmd = new ByteArrayInputStream(strCmd.getBytes());
+ InputStreamReader reader = new InputStreamReader(cmd);
+
+ Grunt grunt = new Grunt(new BufferedReader(reader), context);
+
+ grunt.exec();
+ }
+
+ @Test
+ public void testBagConstantWithSchemaInForeachBlock() throws Throwable {
+ PigServer server = new PigServer("MAPREDUCE");
+ PigContext context = server.getPigContext();
+
+ String strCmd = "a = load 'input1'; b = foreach a {generate {(1, '1', 0.4f),(2, '2', 0.45)} as b: bag{t(i: int, c:chararray, f: float)};};\n";
+
+ ByteArrayInputStream cmd = new ByteArrayInputStream(strCmd.getBytes());
+ InputStreamReader reader = new InputStreamReader(cmd);
+
+ Grunt grunt = new Grunt(new BufferedReader(reader), context);
+
+ grunt.exec();
+ }
}
Modified: incubator/pig/branches/types/test/org/apache/pig/test/TestTypeChecking.java
URL: http://svn.apache.org/viewvc/incubator/pig/branches/types/test/org/apache/pig/test/TestTypeChecking.java?rev=688915&r1=688914&r2=688915&view=diff
==============================================================================
--- incubator/pig/branches/types/test/org/apache/pig/test/TestTypeChecking.java (original)
+++ incubator/pig/branches/types/test/org/apache/pig/test/TestTypeChecking.java Mon Aug 25 15:59:27 2008
@@ -245,7 +245,7 @@
public void testSUM1() throws Throwable {
TypeCheckingTestUtil.printCurrentMethodName() ;
planTester.buildPlan("a = load ':INPATH:/singlefile/studenttab10k' as (name:chararray, age:int, gpa:double);") ;
- LogicalPlan plan1 = planTester.buildPlan("b = foreach a generate (long)age as age, (int)gpa as gpa;") ;
+ LogicalPlan plan1 = planTester.buildPlan("b = foreach a generate (long)age as age:long, (int)gpa as gpa:int;") ;
LogicalPlan plan2 = planTester.buildPlan("c = foreach b generate SUM(age), SUM(gpa);") ;
planTester.typeCheckPlan(plan2);
}