/** * 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.lens.cube.parse.join; import static org.apache.hadoop.hive.ql.parse.HiveParser.TOK_INSERT; import static org.apache.hadoop.hive.ql.parse.HiveParser.TOK_SELECT; import static org.apache.hadoop.hive.ql.parse.HiveParser.TOK_WHERE; import static org.testng.Assert.*; import java.util.ArrayList; import java.util.List; import org.apache.lens.cube.parse.HQLParser; import org.apache.lens.cube.parse.join.BridgeTableJoinContext.BridgeTableSelectCtx; import org.apache.lens.server.api.error.LensException; import org.apache.hadoop.hive.conf.HiveConf; import org.apache.hadoop.hive.ql.parse.ASTNode; import org.apache.hadoop.hive.ql.parse.HiveParser; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; public class TestBridgeTableJoinCtx { @DataProvider(name = "filterReplace") public Object[][] filterReplace() { return new Object[][] { {"t1.c1 in ('XyZ', 'abc', 'PQR', 'lKg')", "myfilter((t1.c1), 'XyZ') or myfilter((t1.c1), 'abc')" + " or myfilter((t1.c1), 'PQR') or myfilter((t1.c1), 'lKg')", }, {"t1.c1 = ('XyZ')", "myfilter((t1.c1), 'XyZ')"}, {"t1.c1 != ('XyZ')", "not myfilter((t1.c1), 'XyZ')"}, {"t1.c1 != x", "not myfilter((t1.c1), x)"}, }; } @Test(dataProvider = "filterReplace") public void testReplaceDirectFiltersWithArrayFilter(String filter, String expected) throws LensException { ASTNode replaced = BridgeTableJoinContext.replaceDirectFiltersWithArrayFilter(HQLParser.parseExpr(filter), "myfilter"); String replacedFilter = HQLParser.getString(replaced); assertEquals(replacedFilter, expected); } @Test public void testBridgeTableSelectCtx() throws LensException { String aggregator = "test_aggr"; String arrayFilter = "test_filter"; String bridgeTableAlias = "bt"; // Initialization BridgeTableSelectCtx selectCtx = new BridgeTableSelectCtx(aggregator, arrayFilter, bridgeTableAlias); assertTrue(selectCtx.getSelectedBridgeExprs().isEmpty()); assertEquals(selectCtx.getTableAlias(), bridgeTableAlias); assertEquals(selectCtx.getBridgeTableFieldAggr(), aggregator); assertEquals(selectCtx.getArrayFilter(), arrayFilter); assertNotNull(selectCtx.getAliasDecider()); assertTrue(selectCtx.getExprToDotAST().isEmpty()); String query = "select t1.c1, t2.c2, bt.c3, f1(t1.c2), f2(bt.c4), f2(bt.c3), bt.c1 + bt.c2 from t1 where t1.c1 = x" + " and bt.c3 = y and bt.c6 = 5 and t2.c2 = 4 and rand(bt.c7) = 6 group by t1.c1, bt.c3, bt.c8, f2(bt.c4)" + " order by t2.c2, bt.c3 asc, f2(bt.c3), bt.c9, bt.c4 desc"; ASTNode queryAST = HQLParser.parseHQL(query, new HiveConf()); ASTNode select = HQLParser.findNodeByPath(queryAST, TOK_INSERT, TOK_SELECT); ASTNode where = HQLParser.findNodeByPath(queryAST, TOK_INSERT, TOK_WHERE); ASTNode groupBy = HQLParser.findNodeByPath(queryAST, TOK_INSERT, HiveParser.TOK_GROUPBY); ASTNode orderBy = HQLParser.findNodeByPath(queryAST, TOK_INSERT, HiveParser.TOK_ORDERBY); List<String> expectedBridgeExprs = new ArrayList<>(); expectedBridgeExprs.add(aggregator + "((bt.c3)) as balias0"); expectedBridgeExprs.add(aggregator + "(f2((bt.c4))) as balias1"); expectedBridgeExprs.add(aggregator + "(f2((bt.c3))) as balias2"); expectedBridgeExprs.add(aggregator + "(((bt.c1) + (bt.c2))) as balias3"); selectCtx.processSelectAST(select); String modifiedSelect = HQLParser.getString(select); assertEquals(modifiedSelect, "(t1.c1), (t2.c2), (bt.balias0), f1((t1.c2)), (bt.balias1)," + " (bt.balias2), (bt.balias3)"); assertEquals(selectCtx.getSelectedBridgeExprs(), expectedBridgeExprs); selectCtx.processWhereAST(where, null, 0); String modifiedWhere = HQLParser.getString(where); assertEquals(modifiedWhere, "(((t1.c1) = x) and test_filter((bt.balias0), y) and test_filter((bt.balias4), 5)" + " and ((t2.c2) = 4) and test_filter((bt.balias5), 6))"); expectedBridgeExprs.add(aggregator + "((bt.c6)) as balias4"); expectedBridgeExprs.add(aggregator + "(rand((bt.c7))) as balias5"); assertEquals(selectCtx.getSelectedBridgeExprs(), expectedBridgeExprs); selectCtx.processGroupbyAST(groupBy); String modifiedGroupby = HQLParser.getString(groupBy); assertEquals(modifiedGroupby, "(t1.c1), (bt.balias0), (bt.balias6), (bt.balias1)"); expectedBridgeExprs.add(aggregator + "((bt.c8)) as balias6"); assertEquals(selectCtx.getSelectedBridgeExprs(), expectedBridgeExprs); selectCtx.processOrderbyAST(orderBy); String modifiedOrderby = HQLParser.getString(orderBy); assertEquals(modifiedOrderby, "t2.c2 asc, bt.balias0 asc, bt.balias2 asc, bt.balias7 asc," + " bt.balias8 desc"); expectedBridgeExprs.add(aggregator + "((bt.c9)) as balias7"); expectedBridgeExprs.add(aggregator + "((bt.c4)) as balias8"); assertEquals(selectCtx.getSelectedBridgeExprs(), expectedBridgeExprs); } }