| // 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.doris.analysis; |
| |
| import org.apache.doris.catalog.AggregateType; |
| import org.apache.doris.catalog.Column; |
| import org.apache.doris.catalog.KeysType; |
| import org.apache.doris.catalog.PrimitiveType; |
| import org.apache.doris.catalog.ScalarType; |
| import org.apache.doris.catalog.Type; |
| import org.apache.doris.common.Config; |
| import org.apache.doris.common.UserException; |
| import org.apache.doris.common.jmockit.Deencapsulation; |
| import org.apache.doris.qe.ConnectContext; |
| |
| import com.google.common.collect.Lists; |
| |
| import org.junit.Assert; |
| import org.junit.Before; |
| import org.junit.Test; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| import mockit.Expectations; |
| import mockit.Injectable; |
| import mockit.Mocked; |
| |
| public class CreateMaterializedViewStmtTest { |
| |
| @Mocked |
| private Analyzer analyzer; |
| @Mocked |
| private ExprSubstitutionMap exprSubstitutionMap; |
| @Mocked |
| private ConnectContext connectContext; |
| @Mocked |
| private Config config; |
| |
| @Before |
| public void initTest() { |
| Deencapsulation.setField(Config.class, "enable_materialized_view", true); |
| } |
| |
| @Test |
| public void testFunctionColumnInSelectClause(@Injectable ArithmeticExpr arithmeticExpr) throws UserException { |
| SelectList selectList = new SelectList(); |
| SelectListItem selectListItem = new SelectListItem(arithmeticExpr, null); |
| selectList.addItem(selectListItem); |
| FromClause fromClause = new FromClause(); |
| SelectStmt selectStmt = new SelectStmt(selectList, fromClause, null, null, null, null, LimitElement.NO_LIMIT); |
| |
| new Expectations() { |
| { |
| analyzer.getClusterName(); |
| result = "default"; |
| } |
| }; |
| CreateMaterializedViewStmt createMaterializedViewStmt = new CreateMaterializedViewStmt("test", selectStmt, null); |
| try { |
| createMaterializedViewStmt.analyze(analyzer); |
| Assert.fail(); |
| } catch (UserException e) { |
| System.out.print(e.getMessage()); |
| } |
| } |
| |
| @Test |
| public void testAggregateWithFunctionColumnInSelectClause(@Injectable ArithmeticExpr arithmeticExpr, |
| @Injectable SelectStmt selectStmt) throws UserException { |
| FunctionCallExpr functionCallExpr = new FunctionCallExpr("sum", Lists.newArrayList(arithmeticExpr)); |
| SelectList selectList = new SelectList(); |
| SelectListItem selectListItem = new SelectListItem(functionCallExpr, null); |
| selectList.addItem(selectListItem); |
| new Expectations() { |
| { |
| analyzer.getClusterName(); |
| result = "default"; |
| selectStmt.analyze(analyzer); |
| selectStmt.getSelectList(); |
| result = selectList; |
| arithmeticExpr.toString(); |
| result = "a+b"; |
| } |
| }; |
| |
| CreateMaterializedViewStmt createMaterializedViewStmt = new CreateMaterializedViewStmt("test", selectStmt, null); |
| try { |
| createMaterializedViewStmt.analyze(analyzer); |
| Assert.fail(); |
| } catch (IllegalArgumentException e) { |
| System.out.print(e.getMessage()); |
| } |
| } |
| |
| @Test |
| public void testJoinSelectClause(@Injectable SlotRef slotRef, |
| @Injectable TableRef tableRef1, |
| @Injectable TableRef tableRef2, |
| @Injectable SelectStmt selectStmt) throws UserException { |
| SelectListItem selectListItem = new SelectListItem(slotRef, null); |
| SelectList selectList = new SelectList(); |
| selectList.addItem(selectListItem); |
| new Expectations() { |
| { |
| analyzer.getClusterName(); |
| result = "default"; |
| selectStmt.analyze(analyzer); |
| selectStmt.getTableRefs(); |
| result = Lists.newArrayList(tableRef1, tableRef2); |
| selectStmt.getSelectList(); |
| result = selectList; |
| slotRef.getColumnName(); |
| result = "k1"; |
| } |
| }; |
| |
| CreateMaterializedViewStmt createMaterializedViewStmt = new CreateMaterializedViewStmt("test", selectStmt, null); |
| try { |
| createMaterializedViewStmt.analyze(analyzer); |
| Assert.fail(); |
| } catch (UserException e) { |
| System.out.print(e.getMessage()); |
| } |
| } |
| |
| @Test |
| public void testSelectClauseWithWhereClause(@Injectable SlotRef slotRef, |
| @Injectable TableRef tableRef, |
| @Injectable Expr whereClause, |
| @Injectable SelectStmt selectStmt) throws UserException { |
| SelectList selectList = new SelectList(); |
| SelectListItem selectListItem = new SelectListItem(slotRef, null); |
| selectList.addItem(selectListItem); |
| new Expectations() { |
| { |
| analyzer.getClusterName(); |
| result = "default"; |
| selectStmt.analyze(analyzer); |
| selectStmt.getSelectList(); |
| result = selectList; |
| selectStmt.getTableRefs(); |
| result = Lists.newArrayList(tableRef); |
| selectStmt.getWhereClause(); |
| result = whereClause; |
| slotRef.getColumnName(); |
| result = "k1"; |
| } |
| }; |
| |
| CreateMaterializedViewStmt createMaterializedViewStmt = new CreateMaterializedViewStmt("test", selectStmt, null); |
| try { |
| createMaterializedViewStmt.analyze(analyzer); |
| Assert.fail(); |
| } catch (UserException e) { |
| System.out.print(e.getMessage()); |
| } |
| } |
| |
| @Test |
| public void testSelectClauseWithHavingClause(@Injectable SlotRef slotRef, |
| @Injectable TableRef tableRef, |
| @Injectable Expr havingClause, |
| @Injectable SelectStmt selectStmt) throws UserException { |
| SelectList selectList = new SelectList(); |
| SelectListItem selectListItem = new SelectListItem(slotRef, null); |
| selectList.addItem(selectListItem); |
| |
| new Expectations() { |
| { |
| analyzer.getClusterName(); |
| result = "default"; |
| selectStmt.analyze(analyzer); |
| selectStmt.getSelectList(); |
| result = selectList; |
| selectStmt.getTableRefs(); |
| result = Lists.newArrayList(tableRef); |
| selectStmt.getWhereClause(); |
| result = null; |
| selectStmt.getHavingPred(); |
| result = havingClause; |
| slotRef.getColumnName(); |
| result = "k1"; |
| } |
| }; |
| CreateMaterializedViewStmt createMaterializedViewStmt = new CreateMaterializedViewStmt("test", selectStmt, null); |
| try { |
| createMaterializedViewStmt.analyze(analyzer); |
| Assert.fail(); |
| } catch (UserException e) { |
| System.out.print(e.getMessage()); |
| } |
| } |
| |
| @Test |
| public void testOrderOfColumn(@Injectable SlotRef slotRef1, |
| @Injectable SlotRef slotRef2, |
| @Injectable TableRef tableRef, |
| @Injectable SelectStmt selectStmt) throws UserException { |
| SelectList selectList = new SelectList(); |
| SelectListItem selectListItem1 = new SelectListItem(slotRef1, null); |
| selectList.addItem(selectListItem1); |
| SelectListItem selectListItem2 = new SelectListItem(slotRef2, null); |
| selectList.addItem(selectListItem2); |
| OrderByElement orderByElement1 = new OrderByElement(slotRef2, false, false); |
| OrderByElement orderByElement2 = new OrderByElement(slotRef1, false, false); |
| ArrayList<OrderByElement> orderByElementList = Lists.newArrayList(orderByElement1, orderByElement2); |
| |
| new Expectations() { |
| { |
| analyzer.getClusterName(); |
| result = "default"; |
| selectStmt.analyze(analyzer); |
| selectStmt.getSelectList(); |
| result = selectList; |
| selectStmt.getTableRefs(); |
| result = Lists.newArrayList(tableRef); |
| selectStmt.getWhereClause(); |
| result = null; |
| selectStmt.getHavingPred(); |
| result = null; |
| selectStmt.getOrderByElements(); |
| result = orderByElementList; |
| slotRef1.getColumnName(); |
| result = "k1"; |
| slotRef2.getColumnName(); |
| result = "k2"; |
| } |
| }; |
| CreateMaterializedViewStmt createMaterializedViewStmt = new CreateMaterializedViewStmt("test", selectStmt, null); |
| try { |
| createMaterializedViewStmt.analyze(analyzer); |
| Assert.fail(); |
| } catch (UserException e) { |
| System.out.print(e.getMessage()); |
| } |
| } |
| |
| @Test |
| public void testOrderByAggregateColumn(@Injectable SlotRef slotRef1, |
| @Injectable TableRef tableRef, |
| @Injectable SelectStmt selectStmt, |
| @Injectable Column column2, |
| @Injectable SlotDescriptor slotDescriptor) throws UserException { |
| SelectList selectList = new SelectList(); |
| SelectListItem selectListItem1 = new SelectListItem(slotRef1, null); |
| selectList.addItem(selectListItem1); |
| TableName tableName = new TableName("db", "table"); |
| SlotRef slotRef2 = new SlotRef(tableName, "v1"); |
| Deencapsulation.setField(slotRef2, "desc", slotDescriptor); |
| List<Expr> fnChildren = Lists.newArrayList(slotRef2); |
| FunctionCallExpr functionCallExpr = new FunctionCallExpr("sum", fnChildren); |
| SelectListItem selectListItem2 = new SelectListItem(functionCallExpr, null); |
| selectList.addItem(selectListItem2); |
| OrderByElement orderByElement1 = new OrderByElement(functionCallExpr, false, false); |
| OrderByElement orderByElement2 = new OrderByElement(slotRef1, false, false); |
| ArrayList<OrderByElement> orderByElementList = Lists.newArrayList(orderByElement1, orderByElement2); |
| |
| new Expectations() { |
| { |
| analyzer.getClusterName(); |
| result = "default"; |
| selectStmt.analyze(analyzer); |
| selectStmt.getSelectList(); |
| result = selectList; |
| selectStmt.getTableRefs(); |
| result = Lists.newArrayList(tableRef); |
| selectStmt.getWhereClause(); |
| result = null; |
| selectStmt.getHavingPred(); |
| result = null; |
| selectStmt.getOrderByElements(); |
| result = orderByElementList; |
| slotRef1.getColumnName(); |
| result = "k1"; |
| slotDescriptor.getColumn(); |
| result = column2; |
| column2.getOriginType(); |
| result = Type.INT; |
| } |
| }; |
| CreateMaterializedViewStmt createMaterializedViewStmt = new CreateMaterializedViewStmt("test", selectStmt, null); |
| try { |
| createMaterializedViewStmt.analyze(analyzer); |
| Assert.fail(); |
| } catch (UserException e) { |
| System.out.print(e.getMessage()); |
| } |
| } |
| |
| @Test |
| public void testDuplicateColumn(@Injectable SelectStmt selectStmt) throws UserException { |
| SelectList selectList = new SelectList(); |
| TableName tableName = new TableName("db", "table"); |
| SlotRef slotRef1 = new SlotRef(tableName, "k1"); |
| SelectListItem selectListItem1 = new SelectListItem(slotRef1, null); |
| selectList.addItem(selectListItem1); |
| List<Expr> fnChildren = Lists.newArrayList(slotRef1); |
| FunctionCallExpr functionCallExpr = new FunctionCallExpr("sum", fnChildren); |
| SelectListItem selectListItem2 = new SelectListItem(functionCallExpr, null); |
| selectList.addItem(selectListItem2); |
| |
| new Expectations() { |
| { |
| analyzer.getClusterName(); |
| result = "default"; |
| selectStmt.analyze(analyzer); |
| selectStmt.getSelectList(); |
| result = selectList; |
| } |
| }; |
| CreateMaterializedViewStmt createMaterializedViewStmt = new CreateMaterializedViewStmt("test", selectStmt, null); |
| try { |
| createMaterializedViewStmt.analyze(analyzer); |
| Assert.fail(); |
| } catch (UserException e) { |
| System.out.print(e.getMessage()); |
| } |
| } |
| |
| @Test |
| public void testDuplicateColumn1(@Injectable SlotRef slotRef1, |
| @Injectable SelectStmt selectStmt, |
| @Injectable Column column2, |
| @Injectable SlotDescriptor slotDescriptor) throws UserException { |
| SelectList selectList = new SelectList(); |
| SelectListItem selectListItem1 = new SelectListItem(slotRef1, null); |
| selectList.addItem(selectListItem1); |
| TableName tableName = new TableName("db", "table"); |
| SlotRef slotRef2 = new SlotRef(tableName, "k2"); |
| Deencapsulation.setField(slotRef2, "desc", slotDescriptor); |
| List<Expr> fn1Children = Lists.newArrayList(slotRef2); |
| FunctionCallExpr functionCallExpr1 = new FunctionCallExpr("sum", fn1Children); |
| SelectListItem selectListItem2 = new SelectListItem(functionCallExpr1, null); |
| selectList.addItem(selectListItem2); |
| FunctionCallExpr functionCallExpr2 = new FunctionCallExpr("max", fn1Children); |
| SelectListItem selectListItem3 = new SelectListItem(functionCallExpr2, null); |
| selectList.addItem(selectListItem3); |
| |
| new Expectations() { |
| { |
| analyzer.getClusterName(); |
| result = "default"; |
| selectStmt.analyze(analyzer); |
| selectStmt.getSelectList(); |
| result = selectList; |
| slotRef1.getColumnName(); |
| result = "k1"; |
| slotDescriptor.getColumn(); |
| result = column2; |
| column2.getOriginType(); |
| result = Type.INT; |
| } |
| }; |
| CreateMaterializedViewStmt createMaterializedViewStmt = new CreateMaterializedViewStmt("test", selectStmt, null); |
| try { |
| createMaterializedViewStmt.analyze(analyzer); |
| Assert.fail(); |
| } catch (UserException e) { |
| System.out.print(e.getMessage()); |
| } |
| } |
| |
| @Test |
| public void testOrderByColumnsLessThenGroupByColumns(@Injectable SlotRef slotRef1, |
| @Injectable SlotRef slotRef2, |
| @Injectable TableRef tableRef, |
| @Injectable SelectStmt selectStmt, |
| @Injectable Column column3, |
| @Injectable SlotDescriptor slotDescriptor) throws UserException { |
| SelectList selectList = new SelectList(); |
| SelectListItem selectListItem1 = new SelectListItem(slotRef1, null); |
| selectList.addItem(selectListItem1); |
| SelectListItem selectListItem2 = new SelectListItem(slotRef2, null); |
| selectList.addItem(selectListItem2); |
| TableName tableName = new TableName("db", "table"); |
| SlotRef functionChild0 = new SlotRef(tableName, "v1"); |
| Deencapsulation.setField(functionChild0, "desc", slotDescriptor); |
| List<Expr> fn1Children = Lists.newArrayList(functionChild0); |
| FunctionCallExpr functionCallExpr = new FunctionCallExpr("sum", fn1Children); |
| SelectListItem selectListItem3 = new SelectListItem(functionCallExpr, null); |
| selectList.addItem(selectListItem3); |
| OrderByElement orderByElement1 = new OrderByElement(slotRef1, false, false); |
| ArrayList<OrderByElement> orderByElementList = Lists.newArrayList(orderByElement1); |
| |
| new Expectations() { |
| { |
| analyzer.getClusterName(); |
| result = "default"; |
| selectStmt.analyze(analyzer); |
| selectStmt.getSelectList(); |
| result = selectList; |
| selectStmt.getTableRefs(); |
| result = Lists.newArrayList(tableRef); |
| selectStmt.getWhereClause(); |
| result = null; |
| selectStmt.getHavingPred(); |
| result = null; |
| selectStmt.getOrderByElements(); |
| result = orderByElementList; |
| slotRef1.getColumnName(); |
| result = "k1"; |
| slotRef2.getColumnName(); |
| result = "non-k2"; |
| slotDescriptor.getColumn(); |
| result = column3; |
| column3.getOriginType(); |
| result = Type.INT; |
| } |
| }; |
| CreateMaterializedViewStmt createMaterializedViewStmt = new CreateMaterializedViewStmt("test", selectStmt, null); |
| try { |
| createMaterializedViewStmt.analyze(analyzer); |
| Assert.fail(); |
| } catch (UserException e) { |
| System.out.print(e.getMessage()); |
| } |
| } |
| |
| @Test |
| public void testMVColumnsWithoutOrderby(@Injectable SlotRef slotRef1, |
| @Injectable SlotRef slotRef2, |
| @Injectable SlotRef slotRef3, |
| @Injectable SlotRef slotRef4, |
| @Injectable TableRef tableRef, |
| @Injectable SelectStmt selectStmt, |
| @Injectable AggregateInfo aggregateInfo, |
| @Injectable Column column5, |
| @Injectable SlotDescriptor slotDescriptor) throws UserException { |
| SelectList selectList = new SelectList(); |
| SelectListItem selectListItem1 = new SelectListItem(slotRef1, null); |
| selectList.addItem(selectListItem1); |
| SelectListItem selectListItem2 = new SelectListItem(slotRef2, null); |
| selectList.addItem(selectListItem2); |
| SelectListItem selectListItem3 = new SelectListItem(slotRef3, null); |
| selectList.addItem(selectListItem3); |
| SelectListItem selectListItem4 = new SelectListItem(slotRef4, null); |
| selectList.addItem(selectListItem4); |
| TableName tableName = new TableName("db", "table"); |
| final String columnName5 = "sum_v2"; |
| SlotRef functionChild0 = new SlotRef(tableName, columnName5); |
| Deencapsulation.setField(functionChild0, "desc", slotDescriptor); |
| List<Expr> fn1Children = Lists.newArrayList(functionChild0); |
| FunctionCallExpr functionCallExpr = new FunctionCallExpr("sum", fn1Children); |
| SelectListItem selectListItem5 = new SelectListItem(functionCallExpr, null); |
| selectList.addItem(selectListItem5); |
| final String columnName1 = "k1"; |
| final String columnName2 = "k2"; |
| final String columnName3 = "k3"; |
| final String columnName4 = "v1"; |
| |
| new Expectations() { |
| { |
| analyzer.getClusterName(); |
| result = "default"; |
| selectStmt.getAggInfo(); |
| result = aggregateInfo; |
| selectStmt.getSelectList(); |
| result = selectList; |
| selectStmt.getTableRefs(); |
| result = Lists.newArrayList(tableRef); |
| selectStmt.getWhereClause(); |
| result = null; |
| selectStmt.getHavingPred(); |
| result = null; |
| selectStmt.getOrderByElements(); |
| result = null; |
| selectStmt.getLimit(); |
| result = -1; |
| selectStmt.analyze(analyzer); |
| slotRef1.getColumnName(); |
| result = columnName1; |
| slotRef2.getColumnName(); |
| result = columnName2; |
| slotRef3.getColumnName(); |
| result = columnName3; |
| slotRef4.getColumnName(); |
| result = columnName4; |
| functionChild0.getColumn(); |
| result = column5; |
| column5.getOriginType(); |
| result = Type.INT; |
| } |
| }; |
| |
| |
| CreateMaterializedViewStmt createMaterializedViewStmt = new CreateMaterializedViewStmt("test", selectStmt, null); |
| try { |
| createMaterializedViewStmt.analyze(analyzer); |
| Assert.assertEquals(KeysType.AGG_KEYS, createMaterializedViewStmt.getMVKeysType()); |
| List<MVColumnItem> mvColumns = createMaterializedViewStmt.getMVColumnItemList(); |
| Assert.assertEquals(5, mvColumns.size()); |
| MVColumnItem mvColumn0 = mvColumns.get(0); |
| Assert.assertTrue(mvColumn0.isKey()); |
| Assert.assertFalse(mvColumn0.isAggregationTypeImplicit()); |
| Assert.assertEquals(columnName1, mvColumn0.getName()); |
| Assert.assertEquals(null, mvColumn0.getAggregationType()); |
| MVColumnItem mvColumn1 = mvColumns.get(1); |
| Assert.assertTrue(mvColumn1.isKey()); |
| Assert.assertFalse(mvColumn1.isAggregationTypeImplicit()); |
| Assert.assertEquals(columnName2, mvColumn1.getName()); |
| Assert.assertEquals(null, mvColumn1.getAggregationType()); |
| MVColumnItem mvColumn2 = mvColumns.get(2); |
| Assert.assertTrue(mvColumn2.isKey()); |
| Assert.assertFalse(mvColumn2.isAggregationTypeImplicit()); |
| Assert.assertEquals(columnName3, mvColumn2.getName()); |
| Assert.assertEquals(null, mvColumn2.getAggregationType()); |
| MVColumnItem mvColumn3 = mvColumns.get(3); |
| Assert.assertTrue(mvColumn3.isKey()); |
| Assert.assertFalse(mvColumn3.isAggregationTypeImplicit()); |
| Assert.assertEquals(columnName4, mvColumn3.getName()); |
| Assert.assertEquals(null, mvColumn3.getAggregationType()); |
| MVColumnItem mvColumn4 = mvColumns.get(4); |
| Assert.assertFalse(mvColumn4.isKey()); |
| Assert.assertFalse(mvColumn4.isAggregationTypeImplicit()); |
| Assert.assertEquals(columnName5, mvColumn4.getName()); |
| Assert.assertEquals(AggregateType.SUM, mvColumn4.getAggregationType()); |
| } catch (UserException e) { |
| Assert.fail(e.getMessage()); |
| } |
| } |
| |
| @Test |
| public void testMVColumnsWithoutOrderbyWithoutAggregation(@Injectable SlotRef slotRef1, |
| @Injectable SlotRef slotRef2, @Injectable SlotRef slotRef3, @Injectable SlotRef slotRef4, |
| @Injectable TableRef tableRef, @Injectable SelectStmt selectStmt) throws UserException { |
| SelectList selectList = new SelectList(); |
| SelectListItem selectListItem1 = new SelectListItem(slotRef1, null); |
| selectList.addItem(selectListItem1); |
| SelectListItem selectListItem2 = new SelectListItem(slotRef2, null); |
| selectList.addItem(selectListItem2); |
| SelectListItem selectListItem3 = new SelectListItem(slotRef3, null); |
| selectList.addItem(selectListItem3); |
| SelectListItem selectListItem4 = new SelectListItem(slotRef4, null); |
| selectList.addItem(selectListItem4); |
| |
| final String columnName1 = "k1"; |
| final String columnName2 = "k2"; |
| final String columnName3 = "k3"; |
| final String columnName4 = "v1"; |
| |
| new Expectations() { |
| { |
| analyzer.getClusterName(); |
| result = "default"; |
| selectStmt.getAggInfo(); |
| result = null; |
| selectStmt.getSelectList(); |
| result = selectList; |
| selectStmt.getTableRefs(); |
| result = Lists.newArrayList(tableRef); |
| selectStmt.getWhereClause(); |
| result = null; |
| selectStmt.getHavingPred(); |
| result = null; |
| selectStmt.getOrderByElements(); |
| result = null; |
| selectStmt.getLimit(); |
| result = -1; |
| selectStmt.analyze(analyzer); |
| slotRef1.getColumnName(); |
| result = columnName1; |
| slotRef2.getColumnName(); |
| result = columnName2; |
| slotRef3.getColumnName(); |
| result = columnName3; |
| slotRef4.getColumnName(); |
| result = columnName4; |
| slotRef1.getType().getIndexSize(); |
| result = 34; |
| slotRef1.getType().getPrimitiveType(); |
| result = PrimitiveType.INT; |
| slotRef2.getType().getIndexSize(); |
| result = 1; |
| slotRef2.getType().getPrimitiveType(); |
| result = PrimitiveType.INT; |
| slotRef3.getType().getIndexSize(); |
| result = 1; |
| slotRef3.getType().getPrimitiveType(); |
| result = PrimitiveType.INT; |
| slotRef4.getType().getIndexSize(); |
| result = 4; |
| selectStmt.getAggInfo(); // return null, so that the mv can be a duplicate mv |
| result = null; |
| } |
| }; |
| |
| |
| CreateMaterializedViewStmt createMaterializedViewStmt = new CreateMaterializedViewStmt("test", selectStmt, null); |
| try { |
| createMaterializedViewStmt.analyze(analyzer); |
| Assert.assertEquals(KeysType.DUP_KEYS, createMaterializedViewStmt.getMVKeysType()); |
| List<MVColumnItem> mvColumns = createMaterializedViewStmt.getMVColumnItemList(); |
| Assert.assertEquals(4, mvColumns.size()); |
| MVColumnItem mvColumn0 = mvColumns.get(0); |
| Assert.assertTrue(mvColumn0.isKey()); |
| Assert.assertFalse(mvColumn0.isAggregationTypeImplicit()); |
| Assert.assertEquals(columnName1, mvColumn0.getName()); |
| Assert.assertEquals(null, mvColumn0.getAggregationType()); |
| MVColumnItem mvColumn1 = mvColumns.get(1); |
| Assert.assertTrue(mvColumn1.isKey()); |
| Assert.assertFalse(mvColumn1.isAggregationTypeImplicit()); |
| Assert.assertEquals(columnName2, mvColumn1.getName()); |
| Assert.assertEquals(null, mvColumn1.getAggregationType()); |
| MVColumnItem mvColumn2 = mvColumns.get(2); |
| Assert.assertTrue(mvColumn2.isKey()); |
| Assert.assertFalse(mvColumn2.isAggregationTypeImplicit()); |
| Assert.assertEquals(columnName3, mvColumn2.getName()); |
| Assert.assertEquals(null, mvColumn2.getAggregationType()); |
| MVColumnItem mvColumn3 = mvColumns.get(3); |
| Assert.assertFalse(mvColumn3.isKey()); |
| Assert.assertTrue(mvColumn3.isAggregationTypeImplicit()); |
| Assert.assertEquals(columnName4, mvColumn3.getName()); |
| Assert.assertEquals(AggregateType.NONE, mvColumn3.getAggregationType()); |
| } catch (UserException e) { |
| Assert.fail(e.getMessage()); |
| } |
| } |
| |
| /* |
| ISSUE: #3811 |
| */ |
| @Test |
| public void testMVColumnsWithoutOrderbyWithoutAggregationWithFloat(@Injectable SlotRef slotRef1, |
| @Injectable SlotRef slotRef2, @Injectable SlotRef slotRef3, @Injectable SlotRef slotRef4, |
| @Injectable TableRef tableRef, @Injectable SelectStmt selectStmt) throws UserException { |
| SelectList selectList = new SelectList(); |
| SelectListItem selectListItem1 = new SelectListItem(slotRef1, null); |
| selectList.addItem(selectListItem1); |
| SelectListItem selectListItem2 = new SelectListItem(slotRef2, null); |
| selectList.addItem(selectListItem2); |
| SelectListItem selectListItem3 = new SelectListItem(slotRef3, null); |
| selectList.addItem(selectListItem3); |
| SelectListItem selectListItem4 = new SelectListItem(slotRef4, null); |
| selectList.addItem(selectListItem4); |
| |
| final String columnName1 = "k1"; |
| final String columnName2 = "k2"; |
| final String columnName3 = "v1"; |
| final String columnName4 = "v2"; |
| |
| new Expectations() { |
| { |
| analyzer.getClusterName(); |
| result = "default"; |
| selectStmt.getAggInfo(); |
| result = null; |
| selectStmt.getSelectList(); |
| result = selectList; |
| selectStmt.getTableRefs(); |
| result = Lists.newArrayList(tableRef); |
| selectStmt.getWhereClause(); |
| result = null; |
| selectStmt.getHavingPred(); |
| result = null; |
| selectStmt.getOrderByElements(); |
| result = null; |
| selectStmt.getLimit(); |
| result = -1; |
| selectStmt.analyze(analyzer); |
| slotRef1.getColumnName(); |
| result = columnName1; |
| slotRef2.getColumnName(); |
| result = columnName2; |
| slotRef3.getColumnName(); |
| result = columnName3; |
| slotRef4.getColumnName(); |
| result = columnName4; |
| slotRef1.getType().getIndexSize(); |
| result = 1; |
| slotRef1.getType().getPrimitiveType(); |
| result = PrimitiveType.INT; |
| slotRef2.getType().getIndexSize(); |
| result = 2; |
| slotRef2.getType().getPrimitiveType(); |
| result = PrimitiveType.INT; |
| slotRef3.getType().getIndexSize(); |
| result = 3; |
| slotRef3.getType().isFloatingPointType(); |
| result = true; |
| selectStmt.getAggInfo(); // return null, so that the mv can be a duplicate mv |
| result = null; |
| } |
| }; |
| |
| |
| CreateMaterializedViewStmt createMaterializedViewStmt = new CreateMaterializedViewStmt("test", selectStmt, null); |
| try { |
| createMaterializedViewStmt.analyze(analyzer); |
| Assert.assertEquals(KeysType.DUP_KEYS, createMaterializedViewStmt.getMVKeysType()); |
| List<MVColumnItem> mvColumns = createMaterializedViewStmt.getMVColumnItemList(); |
| Assert.assertEquals(4, mvColumns.size()); |
| MVColumnItem mvColumn0 = mvColumns.get(0); |
| Assert.assertTrue(mvColumn0.isKey()); |
| Assert.assertFalse(mvColumn0.isAggregationTypeImplicit()); |
| Assert.assertEquals(columnName1, mvColumn0.getName()); |
| Assert.assertEquals(null, mvColumn0.getAggregationType()); |
| MVColumnItem mvColumn1 = mvColumns.get(1); |
| Assert.assertTrue(mvColumn1.isKey()); |
| Assert.assertFalse(mvColumn1.isAggregationTypeImplicit()); |
| Assert.assertEquals(columnName2, mvColumn1.getName()); |
| Assert.assertEquals(null, mvColumn1.getAggregationType()); |
| MVColumnItem mvColumn2 = mvColumns.get(2); |
| Assert.assertFalse(mvColumn2.isKey()); |
| Assert.assertTrue(mvColumn2.isAggregationTypeImplicit()); |
| Assert.assertEquals(columnName3, mvColumn2.getName()); |
| Assert.assertEquals(AggregateType.NONE, mvColumn2.getAggregationType()); |
| MVColumnItem mvColumn3 = mvColumns.get(3); |
| Assert.assertFalse(mvColumn3.isKey()); |
| Assert.assertTrue(mvColumn3.isAggregationTypeImplicit()); |
| Assert.assertEquals(columnName4, mvColumn3.getName()); |
| Assert.assertEquals(AggregateType.NONE, mvColumn3.getAggregationType()); |
| } catch (UserException e) { |
| Assert.fail(e.getMessage()); |
| } |
| } |
| |
| /* |
| ISSUE: #3811 |
| */ |
| @Test |
| public void testMVColumnsWithoutOrderbyWithoutAggregationWithVarchar(@Injectable SlotRef slotRef1, |
| @Injectable SlotRef slotRef2, @Injectable SlotRef slotRef3, @Injectable SlotRef slotRef4, |
| @Injectable TableRef tableRef, @Injectable SelectStmt selectStmt) throws UserException { |
| SelectList selectList = new SelectList(); |
| SelectListItem selectListItem1 = new SelectListItem(slotRef1, null); |
| selectList.addItem(selectListItem1); |
| SelectListItem selectListItem2 = new SelectListItem(slotRef2, null); |
| selectList.addItem(selectListItem2); |
| SelectListItem selectListItem3 = new SelectListItem(slotRef3, null); |
| selectList.addItem(selectListItem3); |
| SelectListItem selectListItem4 = new SelectListItem(slotRef4, null); |
| selectList.addItem(selectListItem4); |
| |
| final String columnName1 = "k1"; |
| final String columnName2 = "k2"; |
| final String columnName3 = "v1"; |
| final String columnName4 = "v2"; |
| |
| new Expectations() { |
| { |
| analyzer.getClusterName(); |
| result = "default"; |
| selectStmt.getAggInfo(); |
| result = null; |
| selectStmt.getSelectList(); |
| result = selectList; |
| selectStmt.getTableRefs(); |
| result = Lists.newArrayList(tableRef); |
| selectStmt.getWhereClause(); |
| result = null; |
| selectStmt.getHavingPred(); |
| result = null; |
| selectStmt.getOrderByElements(); |
| result = null; |
| selectStmt.getLimit(); |
| result = -1; |
| selectStmt.analyze(analyzer); |
| slotRef1.getColumnName(); |
| result = columnName1; |
| slotRef2.getColumnName(); |
| result = columnName2; |
| slotRef3.getColumnName(); |
| result = columnName3; |
| slotRef4.getColumnName(); |
| result = columnName4; |
| slotRef1.getType().getIndexSize(); |
| result = 1; |
| slotRef1.getType().getPrimitiveType(); |
| result = PrimitiveType.INT; |
| slotRef2.getType().getIndexSize(); |
| result = 2; |
| slotRef2.getType().getPrimitiveType(); |
| result = PrimitiveType.INT; |
| slotRef3.getType().getIndexSize(); |
| result = 3; |
| slotRef3.getType().getPrimitiveType(); |
| result = PrimitiveType.VARCHAR; |
| selectStmt.getAggInfo(); // return null, so that the mv can be a duplicate mv |
| result = null; |
| } |
| }; |
| |
| |
| CreateMaterializedViewStmt createMaterializedViewStmt = new CreateMaterializedViewStmt("test", selectStmt, null); |
| try { |
| createMaterializedViewStmt.analyze(analyzer); |
| Assert.assertEquals(KeysType.DUP_KEYS, createMaterializedViewStmt.getMVKeysType()); |
| List<MVColumnItem> mvColumns = createMaterializedViewStmt.getMVColumnItemList(); |
| Assert.assertEquals(4, mvColumns.size()); |
| MVColumnItem mvColumn0 = mvColumns.get(0); |
| Assert.assertTrue(mvColumn0.isKey()); |
| Assert.assertFalse(mvColumn0.isAggregationTypeImplicit()); |
| Assert.assertEquals(columnName1, mvColumn0.getName()); |
| Assert.assertEquals(null, mvColumn0.getAggregationType()); |
| MVColumnItem mvColumn1 = mvColumns.get(1); |
| Assert.assertTrue(mvColumn1.isKey()); |
| Assert.assertFalse(mvColumn1.isAggregationTypeImplicit()); |
| Assert.assertEquals(columnName2, mvColumn1.getName()); |
| Assert.assertEquals(null, mvColumn1.getAggregationType()); |
| MVColumnItem mvColumn2 = mvColumns.get(2); |
| Assert.assertTrue(mvColumn2.isKey()); |
| Assert.assertFalse(mvColumn2.isAggregationTypeImplicit()); |
| Assert.assertEquals(columnName3, mvColumn2.getName()); |
| Assert.assertEquals(null, mvColumn2.getAggregationType()); |
| MVColumnItem mvColumn3 = mvColumns.get(3); |
| Assert.assertFalse(mvColumn3.isKey()); |
| Assert.assertTrue(mvColumn3.isAggregationTypeImplicit()); |
| Assert.assertEquals(columnName4, mvColumn3.getName()); |
| Assert.assertEquals(AggregateType.NONE, mvColumn3.getAggregationType()); |
| } catch (UserException e) { |
| Assert.fail(e.getMessage()); |
| } |
| } |
| |
| /* |
| ISSUE: #3811 |
| */ |
| @Test |
| public void testMVColumnsWithFirstFloat(@Injectable SlotRef slotRef1, |
| @Injectable TableRef tableRef, @Injectable SelectStmt selectStmt) throws UserException { |
| SelectList selectList = new SelectList(); |
| SelectListItem selectListItem1 = new SelectListItem(slotRef1, null); |
| selectList.addItem(selectListItem1); |
| |
| final String columnName1 = "k1"; |
| |
| new Expectations() { |
| { |
| analyzer.getClusterName(); |
| result = "default"; |
| selectStmt.getAggInfo(); |
| result = null; |
| selectStmt.getSelectList(); |
| result = selectList; |
| selectStmt.getTableRefs(); |
| result = Lists.newArrayList(tableRef); |
| selectStmt.getWhereClause(); |
| result = null; |
| selectStmt.getHavingPred(); |
| result = null; |
| selectStmt.getOrderByElements(); |
| result = null; |
| selectStmt.analyze(analyzer); |
| slotRef1.getColumnName(); |
| result = columnName1; |
| slotRef1.getType().isFloatingPointType(); |
| result = true; |
| selectStmt.getAggInfo(); // return null, so that the mv can be a duplicate mv |
| result = null; |
| } |
| }; |
| |
| |
| CreateMaterializedViewStmt createMaterializedViewStmt = new CreateMaterializedViewStmt("test", selectStmt, null); |
| try { |
| createMaterializedViewStmt.analyze(analyzer); |
| Assert.fail("The first column could not be float or double, use decimal instead"); |
| } catch (UserException e) { |
| System.out.print(e.getMessage()); |
| } |
| } |
| |
| /* |
| ISSUE: #3811 |
| */ |
| @Test |
| public void testMVColumnsWithFirstVarchar(@Injectable SlotRef slotRef1, |
| @Injectable TableRef tableRef, @Injectable SelectStmt selectStmt) throws UserException { |
| SelectList selectList = new SelectList(); |
| SelectListItem selectListItem1 = new SelectListItem(slotRef1, null); |
| selectList.addItem(selectListItem1); |
| |
| final String columnName1 = "k1"; |
| |
| new Expectations() { |
| { |
| analyzer.getClusterName(); |
| result = "default"; |
| selectStmt.getAggInfo(); |
| result = null; |
| selectStmt.getSelectList(); |
| result = selectList; |
| selectStmt.getTableRefs(); |
| result = Lists.newArrayList(tableRef); |
| selectStmt.getWhereClause(); |
| result = null; |
| selectStmt.getHavingPred(); |
| result = null; |
| selectStmt.getOrderByElements(); |
| result = null; |
| selectStmt.getLimit(); |
| result = -1; |
| selectStmt.analyze(analyzer); |
| slotRef1.getColumnName(); |
| result = columnName1; |
| slotRef1.getType().getPrimitiveType(); |
| result = PrimitiveType.VARCHAR; |
| } |
| }; |
| |
| |
| CreateMaterializedViewStmt createMaterializedViewStmt = new CreateMaterializedViewStmt("test", selectStmt, null); |
| try { |
| createMaterializedViewStmt.analyze(analyzer); |
| Assert.assertEquals(KeysType.DUP_KEYS, createMaterializedViewStmt.getMVKeysType()); |
| List<MVColumnItem> mvColumns = createMaterializedViewStmt.getMVColumnItemList(); |
| Assert.assertEquals(1, mvColumns.size()); |
| MVColumnItem mvColumn0 = mvColumns.get(0); |
| Assert.assertTrue(mvColumn0.isKey()); |
| Assert.assertFalse(mvColumn0.isAggregationTypeImplicit()); |
| Assert.assertEquals(columnName1, mvColumn0.getName()); |
| Assert.assertEquals(null, mvColumn0.getAggregationType()); |
| } catch (UserException e) { |
| Assert.fail(e.getMessage()); |
| } |
| } |
| |
| |
| @Test |
| public void testMVColumns(@Injectable SlotRef slotRef1, |
| @Injectable SlotRef slotRef2, |
| @Injectable TableRef tableRef, |
| @Injectable SelectStmt selectStmt, |
| @Injectable AggregateInfo aggregateInfo, |
| @Injectable Column column1, |
| @Injectable SlotDescriptor slotDescriptor) throws UserException { |
| SelectList selectList = new SelectList(); |
| SelectListItem selectListItem1 = new SelectListItem(slotRef1, null); |
| selectList.addItem(selectListItem1); |
| SelectListItem selectListItem2 = new SelectListItem(slotRef2, null); |
| selectList.addItem(selectListItem2); |
| TableName tableName = new TableName("db", "table"); |
| final String columnName3 = "sum_v2"; |
| SlotRef slotRef = new SlotRef(tableName, columnName3); |
| Deencapsulation.setField(slotRef, "desc", slotDescriptor); |
| List<Expr> children = Lists.newArrayList(slotRef); |
| FunctionCallExpr functionCallExpr = new FunctionCallExpr("sum", children); |
| SelectListItem selectListItem3 = new SelectListItem(functionCallExpr, null); |
| selectList.addItem(selectListItem3); |
| OrderByElement orderByElement1 = new OrderByElement(slotRef1, false, false); |
| OrderByElement orderByElement2 = new OrderByElement(slotRef2, false, false); |
| ArrayList<OrderByElement> orderByElementList = Lists.newArrayList(orderByElement1, orderByElement2); |
| final String columnName1 = "k1"; |
| final String columnName2 = "v1"; |
| |
| new Expectations() { |
| { |
| analyzer.getClusterName(); |
| result = "default"; |
| selectStmt.getAggInfo(); |
| result = aggregateInfo; |
| selectStmt.getSelectList(); |
| result = selectList; |
| selectStmt.getTableRefs(); |
| result = Lists.newArrayList(tableRef); |
| selectStmt.getWhereClause(); |
| result = null; |
| selectStmt.getHavingPred(); |
| result = null; |
| selectStmt.getOrderByElements(); |
| result = orderByElementList; |
| selectStmt.getLimit(); |
| result = -1; |
| selectStmt.analyze(analyzer); |
| slotRef1.getColumnName(); |
| result = columnName1; |
| slotRef2.getColumnName(); |
| result = columnName2; |
| slotDescriptor.getColumn(); |
| result = column1; |
| column1.getOriginType(); |
| result = Type.INT; |
| } |
| }; |
| |
| CreateMaterializedViewStmt createMaterializedViewStmt = new CreateMaterializedViewStmt("test", selectStmt, null); |
| try { |
| createMaterializedViewStmt.analyze(analyzer); |
| Assert.assertEquals(KeysType.AGG_KEYS, createMaterializedViewStmt.getMVKeysType()); |
| List<MVColumnItem> mvColumns = createMaterializedViewStmt.getMVColumnItemList(); |
| Assert.assertEquals(3, mvColumns.size()); |
| MVColumnItem mvColumn0 = mvColumns.get(0); |
| Assert.assertTrue(mvColumn0.isKey()); |
| Assert.assertFalse(mvColumn0.isAggregationTypeImplicit()); |
| Assert.assertEquals(columnName1, mvColumn0.getName()); |
| Assert.assertEquals(null, mvColumn0.getAggregationType()); |
| MVColumnItem mvColumn1 = mvColumns.get(1); |
| Assert.assertTrue(mvColumn1.isKey()); |
| Assert.assertFalse(mvColumn1.isAggregationTypeImplicit()); |
| Assert.assertEquals(columnName2, mvColumn1.getName()); |
| Assert.assertEquals(null, mvColumn1.getAggregationType()); |
| MVColumnItem mvColumn2 = mvColumns.get(2); |
| Assert.assertFalse(mvColumn2.isKey()); |
| Assert.assertFalse(mvColumn2.isAggregationTypeImplicit()); |
| Assert.assertEquals(columnName3, mvColumn2.getName()); |
| Assert.assertEquals(AggregateType.SUM, mvColumn2.getAggregationType()); |
| Assert.assertEquals(KeysType.AGG_KEYS, createMaterializedViewStmt.getMVKeysType()); |
| } catch (UserException e) { |
| Assert.fail(e.getMessage()); |
| } |
| |
| } |
| |
| @Test |
| public void testDeduplicateMV(@Injectable SlotRef slotRef1, |
| @Injectable TableRef tableRef, |
| @Injectable SelectStmt selectStmt, |
| @Injectable AggregateInfo aggregateInfo) throws UserException { |
| SelectList selectList = new SelectList(); |
| SelectListItem selectListItem1 = new SelectListItem(slotRef1, null); |
| selectList.addItem(selectListItem1); |
| final String columnName1 = "k1"; |
| new Expectations() { |
| { |
| analyzer.getClusterName(); |
| result = "default"; |
| selectStmt.getAggInfo(); |
| result = aggregateInfo; |
| selectStmt.getSelectList(); |
| result = selectList; |
| selectStmt.analyze(analyzer); |
| selectStmt.getTableRefs(); |
| result = Lists.newArrayList(tableRef); |
| selectStmt.getWhereClause(); |
| result = null; |
| slotRef1.getColumnName(); |
| result = columnName1; |
| selectStmt.getHavingPred(); |
| result = null; |
| selectStmt.getLimit(); |
| result = -1; |
| } |
| }; |
| |
| CreateMaterializedViewStmt createMaterializedViewStmt = new CreateMaterializedViewStmt("test", selectStmt, null); |
| try { |
| createMaterializedViewStmt.analyze(analyzer); |
| Assert.assertEquals(KeysType.AGG_KEYS, createMaterializedViewStmt.getMVKeysType()); |
| List<MVColumnItem> mvSchema = createMaterializedViewStmt.getMVColumnItemList(); |
| Assert.assertEquals(1, mvSchema.size()); |
| Assert.assertTrue(mvSchema.get(0).isKey()); |
| } catch (UserException e) { |
| Assert.fail(e.getMessage()); |
| } |
| |
| } |
| |
| @Test |
| public void testBuildMVColumnItem(@Injectable SelectStmt selectStmt, |
| @Injectable Column column1, |
| @Injectable Column column2, |
| @Injectable Column column3, |
| @Injectable Column column4, |
| @Injectable SlotDescriptor slotDescriptor1, |
| @Injectable SlotDescriptor slotDescriptor2, |
| @Injectable SlotDescriptor slotDescriptor3, |
| @Injectable SlotDescriptor slotDescriptor4) { |
| CreateMaterializedViewStmt createMaterializedViewStmt = new CreateMaterializedViewStmt("test", selectStmt, null); |
| SlotRef slotRef = new SlotRef(new TableName("db", "table"), "a"); |
| List<Expr> params = Lists.newArrayList(); |
| params.add(slotRef); |
| FunctionCallExpr functionCallExpr = new FunctionCallExpr("sum", params); |
| Deencapsulation.setField(slotRef, "desc", slotDescriptor1); |
| new Expectations() { |
| { |
| slotDescriptor1.getColumn(); |
| result = column1; |
| column1.getOriginType(); |
| result = Type.LARGEINT; |
| } |
| }; |
| MVColumnItem mvColumnItem = Deencapsulation.invoke(createMaterializedViewStmt, "buildMVColumnItem", functionCallExpr); |
| Assert.assertEquals(Type.LARGEINT, mvColumnItem.getType()); |
| |
| SlotRef slotRef2 = new SlotRef(new TableName("db", "table"), "a"); |
| List<Expr> params2 = Lists.newArrayList(); |
| params2.add(slotRef2); |
| FunctionCallExpr functionCallExpr2 = new FunctionCallExpr("sum", params2); |
| Deencapsulation.setField(slotRef2, "desc", slotDescriptor2); |
| new Expectations() { |
| { |
| slotDescriptor2.getColumn(); |
| result = column2; |
| column2.getOriginType(); |
| result = Type.BIGINT; |
| } |
| }; |
| MVColumnItem mvColumnItem2 = Deencapsulation.invoke(createMaterializedViewStmt, "buildMVColumnItem", functionCallExpr2); |
| Assert.assertEquals(Type.BIGINT, mvColumnItem2.getType()); |
| |
| SlotRef slotRef3 = new SlotRef(new TableName("db", "table"), "a"); |
| List<Expr> params3 = Lists.newArrayList(); |
| params3.add(slotRef3); |
| FunctionCallExpr functionCallExpr3 = new FunctionCallExpr("min", params3); |
| Deencapsulation.setField(slotRef3, "desc", slotDescriptor3); |
| new Expectations() { |
| { |
| slotDescriptor3.getColumn(); |
| result = column3; |
| column3.getOriginType(); |
| result = Type.VARCHAR; |
| } |
| }; |
| MVColumnItem mvColumnItem3 = Deencapsulation.invoke(createMaterializedViewStmt, "buildMVColumnItem", functionCallExpr3); |
| Assert.assertEquals(Type.VARCHAR, mvColumnItem3.getType()); |
| |
| SlotRef slotRef4 = new SlotRef(new TableName("db", "table"), "a"); |
| List<Expr> params4 = Lists.newArrayList(); |
| params4.add(slotRef4); |
| FunctionCallExpr functionCallExpr4 = new FunctionCallExpr("sum", params4); |
| Deencapsulation.setField(slotRef4, "desc", slotDescriptor4); |
| new Expectations() { |
| { |
| slotDescriptor4.getColumn(); |
| result = column4; |
| column4.getOriginType(); |
| result = Type.DOUBLE; |
| } |
| }; |
| MVColumnItem mvColumnItem4 = Deencapsulation.invoke(createMaterializedViewStmt, "buildMVColumnItem", functionCallExpr4); |
| Assert.assertEquals(Type.DOUBLE, mvColumnItem4.getType()); |
| |
| } |
| |
| @Test |
| public void testKeepScaleAndPrecisionOfType(@Injectable SelectStmt selectStmt, |
| @Injectable SlotDescriptor slotDescriptor1, |
| @Injectable Column column1, |
| @Injectable SlotDescriptor slotDescriptor2, |
| @Injectable Column column2, |
| @Injectable SlotDescriptor slotDescriptor3, |
| @Injectable Column column3) { |
| CreateMaterializedViewStmt createMaterializedViewStmt = new CreateMaterializedViewStmt("test", selectStmt, null); |
| SlotRef slotRef = new SlotRef(new TableName("db", "table"), "a"); |
| List<Expr> params = Lists.newArrayList(); |
| params.add(slotRef); |
| FunctionCallExpr functionCallExpr = new FunctionCallExpr("min", params); |
| Deencapsulation.setField(slotRef, "desc", slotDescriptor1); |
| new Expectations() { |
| { |
| slotDescriptor1.getColumn(); |
| result = column1; |
| column1.getOriginType(); |
| result = ScalarType.createVarchar(50); |
| } |
| }; |
| MVColumnItem mvColumnItem = Deencapsulation.invoke(createMaterializedViewStmt, "buildMVColumnItem", functionCallExpr); |
| Assert.assertEquals(50, ((ScalarType)mvColumnItem.getType()).getLength()); |
| |
| SlotRef slotRef2 = new SlotRef(new TableName("db", "table"), "a"); |
| List<Expr> params2 = Lists.newArrayList(); |
| params2.add(slotRef2); |
| FunctionCallExpr functionCallExpr2 = new FunctionCallExpr("min", params2); |
| Deencapsulation.setField(slotRef2, "desc", slotDescriptor2); |
| new Expectations() { |
| { |
| slotDescriptor2.getColumn(); |
| result = column2; |
| column2.getOriginType(); |
| result = ScalarType.createDecimalV2Type(10,1); |
| } |
| }; |
| MVColumnItem mvColumnItem2 = Deencapsulation.invoke(createMaterializedViewStmt, "buildMVColumnItem", functionCallExpr2); |
| Assert.assertEquals(new Integer(10), ((ScalarType)mvColumnItem2.getType()).getPrecision()); |
| Assert.assertEquals(1, ((ScalarType)mvColumnItem2.getType()).getScalarScale()); |
| |
| SlotRef slotRef3 = new SlotRef(new TableName("db", "table"), "a"); |
| List<Expr> params3 = Lists.newArrayList(); |
| params3.add(slotRef3); |
| FunctionCallExpr functionCallExpr3 = new FunctionCallExpr("min", params3); |
| Deencapsulation.setField(slotRef3, "desc", slotDescriptor3); |
| new Expectations() { |
| { |
| slotDescriptor3.getColumn(); |
| result = column3; |
| column3.getOriginType(); |
| result = ScalarType.createChar(5); |
| } |
| }; |
| MVColumnItem mvColumnItem3 = Deencapsulation.invoke(createMaterializedViewStmt, "buildMVColumnItem", functionCallExpr3); |
| Assert.assertEquals(5, ((ScalarType)mvColumnItem3.getType()).getLength()); |
| } |
| } |
| |