/* This file is part of VoltDB. * Copyright (C) 2008-2017 VoltDB Inc. * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. */ package org.voltdb; import java.util.Random; import junit.framework.TestCase; public class TestTableHelper extends TestCase { public void testShorthand() { VoltTable t = TableHelper.quickTable("FOO (BIGINT-N, BAR:TINYINT, A:VARCHAR12-U/'foo') PK(2,BAR)"); assertEquals("C0", t.getColumnName(0)); assertEquals("BAR", t.getColumnName(1)); assertEquals("A", t.getColumnName(2)); assertEquals(VoltType.BIGINT, t.getColumnType(0)); assertEquals(VoltType.TINYINT, t.getColumnType(1)); assertEquals(VoltType.STRING, t.getColumnType(2)); assertEquals(false, t.getColumnUniqueness(0)); assertEquals(false, t.getColumnUniqueness(1)); assertEquals(true, t.getColumnUniqueness(2)); assertEquals(VoltTable.ColumnInfo.NO_DEFAULT_VALUE, t.getColumnDefaultValue(0)); assertEquals(VoltTable.ColumnInfo.NO_DEFAULT_VALUE, t.getColumnDefaultValue(1)); assertEquals("foo", t.getColumnDefaultValue(2)); assertEquals(false, t.getColumnNullable(0)); assertEquals(true, t.getColumnNullable(1)); assertEquals(true, t.getColumnNullable(2)); assertEquals(12, t.getColumnMaxSize(2)); assertEquals(-1, t.m_extraMetadata.partitionColIndex); System.out.println(TableHelper.ddlForTable(t, false)); // try the same thing, but partitioned t = TableHelper.quickTable("FOO (BIGINT-N, BAR:TINYINT, A:VARCHAR12-U/'foo') P(A) PK(2,BAR)"); assertEquals("C0", t.getColumnName(0)); assertEquals("BAR", t.getColumnName(1)); assertEquals("A", t.getColumnName(2)); assertEquals(VoltType.BIGINT, t.getColumnType(0)); assertEquals(VoltType.TINYINT, t.getColumnType(1)); assertEquals(VoltType.STRING, t.getColumnType(2)); assertEquals(false, t.getColumnUniqueness(0)); assertEquals(false, t.getColumnUniqueness(1)); assertEquals(true, t.getColumnUniqueness(2)); assertEquals(VoltTable.ColumnInfo.NO_DEFAULT_VALUE, t.getColumnDefaultValue(0)); assertEquals(VoltTable.ColumnInfo.NO_DEFAULT_VALUE, t.getColumnDefaultValue(1)); assertEquals("foo", t.getColumnDefaultValue(2)); assertEquals(false, t.getColumnNullable(0)); assertEquals(true, t.getColumnNullable(1)); assertEquals(true, t.getColumnNullable(2)); assertEquals(12, t.getColumnMaxSize(2)); assertEquals(2, t.m_extraMetadata.partitionColIndex); t = TableHelper.quickTable("Ryan (likes:smallint, TINYINT/'8', A:VARBINARY/'ABCD')"); assertEquals("likes", t.getColumnName(0)); assertEquals("C1", t.getColumnName(1)); assertEquals("A", t.getColumnName(2)); assertEquals(VoltType.SMALLINT, t.getColumnType(0)); assertEquals(VoltType.TINYINT, t.getColumnType(1)); assertEquals(VoltType.VARBINARY, t.getColumnType(2)); assertEquals(false, t.getColumnUniqueness(0)); assertEquals(false, t.getColumnUniqueness(1)); assertEquals(false, t.getColumnUniqueness(2)); assertEquals(VoltTable.ColumnInfo.NO_DEFAULT_VALUE, t.getColumnDefaultValue(0)); assertEquals("8", t.getColumnDefaultValue(1)); assertEquals("ABCD", t.getColumnDefaultValue(2)); assertEquals(true, t.getColumnNullable(0)); assertEquals(true, t.getColumnNullable(1)); assertEquals(true, t.getColumnNullable(2)); assertEquals(255, t.getColumnMaxSize(2)); assertEquals(-1, t.m_extraMetadata.partitionColIndex); System.out.println(TableHelper.ddlForTable(t, false)); // try the same thing, but partitioned t = TableHelper.quickTable("Ryan (likes:smallint, TINYINT/'8', A:VARBINARY/'ABCD') P(0)"); assertEquals("likes", t.getColumnName(0)); assertEquals("C1", t.getColumnName(1)); assertEquals("A", t.getColumnName(2)); assertEquals(VoltType.SMALLINT, t.getColumnType(0)); assertEquals(VoltType.TINYINT, t.getColumnType(1)); assertEquals(VoltType.VARBINARY, t.getColumnType(2)); assertEquals(false, t.getColumnUniqueness(0)); assertEquals(false, t.getColumnUniqueness(1)); assertEquals(false, t.getColumnUniqueness(2)); assertEquals(VoltTable.ColumnInfo.NO_DEFAULT_VALUE, t.getColumnDefaultValue(0)); assertEquals("8", t.getColumnDefaultValue(1)); assertEquals("ABCD", t.getColumnDefaultValue(2)); assertEquals(true, t.getColumnNullable(0)); assertEquals(true, t.getColumnNullable(1)); assertEquals(true, t.getColumnNullable(2)); assertEquals(255, t.getColumnMaxSize(2)); assertEquals(0, t.m_extraMetadata.partitionColIndex); System.out.println(TableHelper.ddlForTable(t, false)); } /** * Since this is test code for test code, some of this is verified manually. Should * be more automated. * @throws Exception */ public void testDataGeneration() throws Exception { TableHelper.Configuration helperConfig = new TableHelper.Configuration(); helperConfig.rand = new Random(); TableHelper helper = new TableHelper(helperConfig); VoltTable t = TableHelper.quickTable("Ryan (likes:smallint, TINYINT/'8', A:VARBINARY/'ABCD')"); helper.randomFill(t, 10, 128); t = TableHelper.quickTable("FOO (BIGINT-N, BAR:TINYINT, A:VARCHAR12-U/'foo') PK(2,BAR)"); helper.randomFill(t, 10, 128); System.out.println(t.toString()); VoltTable t2 = TableHelper.quickTable("FOO (BAR:DOUBLE, C0:BIGINT-N, A:VARCHAR14/'foo') PK(2,BAR)"); TableHelper.migrateTable(t, t2); System.out.println(t2.toString()); } /** * Create and mutate random tables. Just try to not crash here. * TestLiveTableSchemaMigration does more *real* stuff. * @throws Exception */ public void testRandomTables() throws Exception { TableHelper helper = new TableHelper(); for (int i = 0; i < 1000; i++) { TableHelper.RandomTable trt = helper.getTotallyRandomTable("foo"); VoltTable t1 = trt.table; VoltTable t2 = helper.mutateTable(t1, true); TableHelper.getAlterTableDDLToMigrate(t1, t2); helper.randomFill(t1, 50, 32); TableHelper.migrateTable(t1, t2); } } }