/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.hadoop.hive.ql.parse;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
public class TestParseDriver {
ParseDriver parseDriver = new ParseDriver();
@Test
public void testParse() throws Exception {
String selectStr = "select field1, field2, sum(field3+field4)";
String whereStr = "field5=1 and field6 in ('a', 'b')";
String havingStr = "sum(field7) > 11";
ASTNode tree = parseDriver.parse(selectStr + " from table1 where " + whereStr
+ " group by field1, field2 having " + havingStr);
assertEquals(tree.getType(), 0);
assertEquals(tree.getChildCount(), 2);
ASTNode queryTree = (ASTNode) tree.getChild(0);
assertEquals(tree.getChild(1).getType(), HiveParser.EOF);
assertEquals(queryTree.getChildCount(), 2);
ASTNode fromAST = (ASTNode) queryTree.getChild(0);
ASTNode insertAST = (ASTNode) queryTree.getChild(1);
assertEquals(fromAST.getType(), HiveParser.TOK_FROM);
assertEquals(fromAST.getChildCount(), 1);
assertEquals(fromAST.getChild(0).getType(), HiveParser.TOK_TABREF);
assertEquals(fromAST.getChild(0).getChildCount(), 1);
assertEquals(fromAST.getChild(0).getChild(0).getType(), HiveParser.TOK_TABNAME);
assertEquals(fromAST.getChild(0).getChild(0).getChildCount(), 1);
assertEquals(fromAST.getChild(0).getChild(0).getChild(0).getType(), HiveParser.Identifier);
assertEquals(fromAST.getChild(0).getChild(0).getChild(0).getText(), "table1");
assertEquals(insertAST.getChildCount(), 5);
assertEquals(insertAST.getChild(0).getType(), HiveParser.TOK_DESTINATION);
assertTree((ASTNode) insertAST.getChild(1), parseDriver.parseSelect(selectStr, null));
assertEquals(insertAST.getChild(2).getType(), HiveParser.TOK_WHERE);
assertTree((ASTNode) insertAST.getChild(2).getChild(0), parseDriver.parseExpression(whereStr));
assertEquals(insertAST.getChild(3).getType(), HiveParser.TOK_GROUPBY);
assertEquals(insertAST.getChild(3).getChildCount(), 2);
for (int i = 0; i < 2; i++) {
assertEquals(insertAST.getChild(3).getChild(i).getType(), HiveParser.TOK_TABLE_OR_COL);
assertEquals(insertAST.getChild(3).getChild(i).getChild(0).getType(), HiveParser.Identifier);
assertEquals(insertAST.getChild(3).getChild(i).getChild(0).getText(), "field" + (i + 1));
}
assertEquals(insertAST.getChild(4).getType(), HiveParser.TOK_HAVING);
assertEquals(insertAST.getChild(4).getChildCount(), 1);
assertTree((ASTNode) insertAST.getChild(4).getChild(0), parseDriver.parseExpression(havingStr));
}
@Test
public void testParseSelect() throws Exception {
ASTNode tree = parseDriver.parseSelect("select field1, field2, sum(field3+field4)", null);
assertEquals(tree.getType(), HiveParser.TOK_SELECT);
assertEquals(tree.getChildCount(), 3);
for (int i = 0; i < 3; i++) {
assertEquals(((ASTNode) tree.getChild(i)).getType(), HiveParser.TOK_SELEXPR);
}
assertTree((ASTNode) tree.getChild(0).getChild(0), parseDriver.parseExpression("field1"));
assertTree((ASTNode) tree.getChild(1).getChild(0), parseDriver.parseExpression("field2"));
assertTree((ASTNode) tree.getChild(2).getChild(0), parseDriver.parseExpression("sum(field3+field4)"));
}
@Test
public void testParseExpression() throws Exception {
ASTNode plusNode = parseDriver.parseExpression("field3 + field4");
assertEquals(plusNode.getType(), HiveParser.PLUS);
assertEquals(plusNode.getChildCount(), 2);
for (int i = 0; i < 2; i++) {
assertEquals(plusNode.getChild(i).getType(), HiveParser.TOK_TABLE_OR_COL);
assertEquals(plusNode.getChild(i).getChildCount(), 1);
assertEquals(plusNode.getChild(i).getChild(0).getType(), HiveParser.Identifier);
assertEquals(plusNode.getChild(i).getChild(0).getText(), "field" + (i + 3));
}
ASTNode sumNode = parseDriver.parseExpression("sum(field3 + field4)");
assertEquals(sumNode.getType(), HiveParser.TOK_FUNCTION);
assertEquals(sumNode.getChildCount(), 2);
assertEquals(sumNode.getChild(0).getType(), HiveParser.Identifier);
assertEquals(sumNode.getChild(0).getText(), "sum");
assertTree((ASTNode) sumNode.getChild(1), plusNode);
ASTNode tree = parseDriver.parseExpression("case when field1 = 1 then sum(field3 + field4) when field1 != 2 then " +
"sum(field3-field4) else sum(field3 * field4) end");
assertEquals(tree.getChildCount(), 6);
assertEquals(tree.getChild(0).getType(), HiveParser.KW_WHEN);
assertEquals(tree.getChild(1).getType(), HiveParser.EQUAL);
assertTree((ASTNode) tree.getChild(2), sumNode);
assertEquals(tree.getChild(3).getType(), HiveParser.NOTEQUAL);
assertTree((ASTNode) tree.getChild(4), parseDriver.parseExpression("sum(field3-field4)"));
assertTree((ASTNode) tree.getChild(5), parseDriver.parseExpression("sum(field3*field4)"));
}
private void assertTree(ASTNode astNode1, ASTNode astNode2) {
assertEquals(astNode1.getType(), astNode2.getType());
assertEquals(astNode1.getChildCount(), astNode2.getChildCount());
for (int i = 0; i < astNode1.getChildCount(); i++) {
assertTree((ASTNode) astNode1.getChild(i), (ASTNode) astNode2.getChild(i));
}
}
}