/* * 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.ambari.view.hive20.internal.query.generators; import com.google.common.base.Optional; import com.google.gson.Gson; import org.apache.ambari.view.hive20.internal.dto.ColumnInfo; import org.apache.ambari.view.hive20.internal.dto.TableMeta; import org.junit.Assert; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Arrays; import java.util.List; public class AlterTableQueryGeneratorTest { private static final Logger LOG = LoggerFactory.getLogger(AlterTableQueryGeneratorTest.class); @Test public void createColumnQueriesForSuccessfulChangeColumn() throws Exception { ColumnInfo colInfo1 = new ColumnInfo("col1", "CHAR(1)", "COMMENT 1"); // with comment ColumnInfo colInfo2 = new ColumnInfo("col2", "DECIMAL(10,5)"); // no comment ColumnInfo colInfo3 = new ColumnInfo("col3", "STRING", "COMMENT-3"); ColumnInfo colInfo4 = new ColumnInfo("col4", "VARCHAR(10)", "COMMENT 4"); ColumnInfo colInfo5 = new ColumnInfo("col5", "STRING", "COMMENT 5"); ColumnInfo colInfo6 = new ColumnInfo("col6", "INT"); List<ColumnInfo> oldColumns = Arrays.asList(colInfo1, colInfo2, colInfo3); List<ColumnInfo> newColumns = Arrays.asList(colInfo4, colInfo5, colInfo6); // all changed Optional<List<String>> query = AlterTableQueryGenerator.createColumnQueries(oldColumns, newColumns, false); Assert.assertTrue(query.isPresent()); List<String> queries = query.get(); Assert.assertEquals("Expected number of column update queries were different.", 3, queries.size()); String[] expectedQueries = new String[]{" CHANGE COLUMN `col1` `col4` VARCHAR(10) COMMENT \'COMMENT 4\'", " CHANGE COLUMN `col2` `col5` STRING COMMENT \'COMMENT 5\'", " CHANGE COLUMN `col3` `col6` INT"}; Assert.assertArrayEquals("Column change queries were not equal ", expectedQueries, queries.toArray()); } @Test public void createColumnQueriesForSuccessfulChangeAndAddColumn() throws Exception { TableMeta oldMeta = new TableMeta(); TableMeta newMeta = new TableMeta(); ColumnInfo colInfo1 = new ColumnInfo("col1", "CHAR(1)", "COMMENT 1"); // with comment ColumnInfo colInfo2 = new ColumnInfo("col2", "DECIMAL(10,5)"); // no comment ColumnInfo colInfo3 = new ColumnInfo("col3", "STRING", "COMMENT-3"); ColumnInfo colInfo4 = new ColumnInfo("col4", "VARCHAR(10)", "COMMENT 4"); ColumnInfo colInfo5 = new ColumnInfo("col5", "STRING", "COMMENT 5"); ColumnInfo colInfo6 = new ColumnInfo("col6", "INT"); ColumnInfo colInfo7 = new ColumnInfo("col7", "DATE"); ColumnInfo colInfo8 = new ColumnInfo("col8", "BOOLEAN", "COMMENT 8"); List<ColumnInfo> oldColumns = Arrays.asList(colInfo1, colInfo2, colInfo3); oldMeta.setColumns(oldColumns); List<ColumnInfo> newColumns = Arrays.asList(colInfo4, colInfo5, colInfo6, colInfo7, colInfo8); // all changed oldMeta.setColumns(newColumns); Optional<List<String>> query = AlterTableQueryGenerator.createColumnQueries(oldColumns, newColumns, false); Assert.assertTrue(query.isPresent()); List<String> queries = query.get(); Assert.assertEquals("Expected number of column update queries were different.", 4, queries.size()); String[] expectedQueries = new String[]{" CHANGE COLUMN `col1` `col4` VARCHAR(10) COMMENT \'COMMENT 4\'", " CHANGE COLUMN `col2` `col5` STRING COMMENT \'COMMENT 5\'", " CHANGE COLUMN `col3` `col6` INT"," ADD COLUMNS ( `col7` DATE, `col8` BOOLEAN COMMENT \'COMMENT 8\' )" }; Assert.assertArrayEquals("Column change queries were not equal ", expectedQueries, queries.toArray()); } @Test public void createColumnQueriesForSuccessfulChangeSomeColumns() throws Exception { TableMeta oldMeta = new TableMeta(); TableMeta newMeta = new TableMeta(); ColumnInfo colInfo1 = new ColumnInfo("col1", "CHAR(1)", "COMMENT 1"); // with comment ColumnInfo colInfo2 = new ColumnInfo("col2", "DECIMAL(10,5)"); // no comment ColumnInfo colInfo3 = new ColumnInfo("col3", "STRING", "COMMENT-3"); ColumnInfo colInfo4 = new ColumnInfo("col4", "VARCHAR(10)", "COMMENT 4"); ColumnInfo colInfo5 = new ColumnInfo("col5", "STRING", "COMMENT 5"); ColumnInfo colInfo6 = new ColumnInfo("col6", "INT"); ColumnInfo colInfo7 = new ColumnInfo("col7", "DATE"); ColumnInfo colInfo8 = new ColumnInfo("col8", "BOOLEAN", "COMMENT 8"); List<ColumnInfo> oldColumns = Arrays.asList(colInfo1, colInfo2, colInfo3); oldMeta.setColumns(oldColumns); List<ColumnInfo> newColumns = Arrays.asList(colInfo1, colInfo5, colInfo6); // all changed oldMeta.setColumns(newColumns); Optional<List<String>> query = AlterTableQueryGenerator.createColumnQueries(oldColumns, newColumns, false); Assert.assertTrue(query.isPresent()); List<String> queries = query.get(); Assert.assertEquals("Expected number of column update queries were different.", 2, queries.size()); String[] expectedQueries = new String[]{" CHANGE COLUMN `col2` `col5` STRING COMMENT 'COMMENT 5'", " CHANGE COLUMN `col3` `col6` INT"}; Assert.assertArrayEquals("Column change queries were not equal ", expectedQueries, queries.toArray()); } @Test public void createColumnQueriesForSuccessfulAddColumns() throws Exception { TableMeta oldMeta = new TableMeta(); TableMeta newMeta = new TableMeta(); ColumnInfo colInfo1 = new ColumnInfo("col1", "CHAR(1)", "COMMENT 1"); // with comment ColumnInfo colInfo2 = new ColumnInfo("col2", "DECIMAL(10,5)"); // no comment ColumnInfo colInfo3 = new ColumnInfo("col3", "STRING", "COMMENT-3"); ColumnInfo colInfo4 = new ColumnInfo("col4", "VARCHAR(10)", "COMMENT 4"); ColumnInfo colInfo5 = new ColumnInfo("col5", "STRING", "COMMENT 5"); ColumnInfo colInfo6 = new ColumnInfo("col6", "INT"); ColumnInfo colInfo7 = new ColumnInfo("col7", "DATE"); ColumnInfo colInfo8 = new ColumnInfo("col8", "BOOLEAN", "COMMENT 8"); List<ColumnInfo> oldColumns = Arrays.asList(colInfo1, colInfo2, colInfo3); oldMeta.setColumns(oldColumns); List<ColumnInfo> newColumns = Arrays.asList(colInfo1, colInfo2, colInfo3, colInfo5, colInfo6); // all changed oldMeta.setColumns(newColumns); Optional<List<String>> query = AlterTableQueryGenerator.createColumnQueries(oldColumns, newColumns, false); Assert.assertTrue(query.isPresent()); List<String> queries = query.get(); Assert.assertEquals("Expected number of column update queries were different.", 1, queries.size()); String[] expectedQueries = new String[]{" ADD COLUMNS ( `col5` STRING COMMENT 'COMMENT 5', `col6` INT )"}; Assert.assertArrayEquals("Column change queries were not equal ", expectedQueries, queries.toArray()); } @Test public void getQueryWithAlterColumn(){ String origMetaString = "{ " + " \"database\": \"default\", " + " \"table\": \"table2\", " + " \"columns\": [{ " + " \"name\": \"COL1\", " + " \"type\": \"TINYINT\", " + " \"comment\": \"\", " + " \"precision\": null, " + " \"scale\": null " + " }, { " + " \"name\": \"col2\", " + " \"type\": \"VARCHAR\", " + " \"comment\": \"\", " + " \"precision\": \"333\", " + " \"scale\": null " + " }, { " + " \"name\": \"col3\", " + " \"type\": \"DECIMAL\", " + " \"comment\": \"\", " + " \"precision\": \"33\", " + " \"scale\": \"3\" " + " }], " + " \"partitionInfo\": { " + " \"columns\": [] " + " }, " + " \"detailedInfo\": { " + " \"parameters\": {} " + " }, " + " \"storageInfo\": {} " + " }"; String newMetaString = "{ " + " \"database\": \"default\", " + " \"table\": \"table2\", " + " \"columns\": [{ " + " \"name\": \"col1\", " + " \"type\": \"TINYINT\", " + " \"comment\": \"\", " + " \"precision\": null, " + " \"scale\": null " + " }, { " + " \"name\": \"col3\", " + " \"type\": \"STRING\", " + " \"comment\": \"\", " + " \"precision\": \"333\", " + " \"scale\": null " + " }, { " + " \"name\": \"col4\", " + " \"type\": \"TINYINT\", " + " \"comment\": \"\", " + " \"precision\": null, " + " \"scale\": null " + " }], " + " \"partitionInfo\": { " + " \"columns\": [] " + " }, " + " \"detailedInfo\": { " + " \"parameters\": {} " + " }, " + " \"storageInfo\": {} " + " }"; Gson gson = new Gson(); TableMeta origTableMeta = gson.fromJson(origMetaString, TableMeta.class); TableMeta updatedTableMeta = gson.fromJson(newMetaString, TableMeta.class); LOG.info("origTableMeta : {},\n\nupdatedTableMeta : {}", origMetaString, updatedTableMeta); AlterTableQueryGenerator generator = new AlterTableQueryGenerator(origTableMeta, updatedTableMeta); Optional<String> query = generator.getQuery(); Assert.assertTrue(query.isPresent()); String hqlQuery = query.get(); LOG.info("hqlQuery : {}", hqlQuery); String expectedQuery = " ALTER TABLE `default`.`table2` CHANGE COLUMN `col2` `col3` STRING(333);\n" + " ALTER TABLE `default`.`table2` CHANGE COLUMN `col3` `col4` TINYINT"; Assert.assertEquals("Alter Edit table query did not match ", expectedQuery, hqlQuery); } }