blob: 117327e9e709485ebb4dcc16a251aaa8c274155d [file] [log] [blame]
/**
* 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.netbeans.modules.db.metadata.model.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import org.netbeans.modules.db.metadata.model.api.Catalog;
import org.netbeans.modules.db.metadata.model.api.Column;
import org.netbeans.modules.db.metadata.model.api.ForeignKey;
import org.netbeans.modules.db.metadata.model.api.Index;
import org.netbeans.modules.db.metadata.model.api.Index.IndexType;
import org.netbeans.modules.db.metadata.model.api.IndexColumn;
import org.netbeans.modules.db.metadata.model.api.Ordering;
import org.netbeans.modules.db.metadata.model.api.PrimaryKey;
import org.netbeans.modules.db.metadata.model.api.SQLType;
import org.netbeans.modules.db.metadata.model.api.Schema;
import org.netbeans.modules.db.metadata.model.api.Table;
import org.netbeans.modules.db.metadata.model.api.Tuple;
import org.netbeans.modules.db.metadata.model.api.View;
/**
*
* @author Andrei Badea
*/
public class JDBCMetadataDerbyTest extends JDBCMetadataTestBase {
private Connection conn;
private JDBCMetadata metadata;
private Statement stmt;
public JDBCMetadataDerbyTest(String testName) {
super(testName);
}
@Override
public void setUp() throws Exception {
clearWorkDir();
Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
conn = DriverManager.getConnection("jdbc:derby:" + getWorkDirPath() + "/test;create=true");
stmt = conn.createStatement();
stmt.executeUpdate("CREATE TABLE FOO (" +
"ID INT NOT NULL, " +
"FOO_NAME VARCHAR(16), " +
"CONSTRAINT FOO_PK PRIMARY KEY (ID, FOO_NAME))");
stmt.executeUpdate("CREATE TABLE BAR (" +
"\"i+d\" INT NOT NULL PRIMARY KEY, " +
"FOO_ID INT NOT NULL, " +
"FOO_NAME VARCHAR(16) NOT NULL, " +
"BAR_NAME VARCHAR(16) NOT NULL, " +
"DEC_COL DECIMAL(12,2), " +
"FOREIGN KEY (FOO_ID, FOO_NAME) REFERENCES FOO(ID, FOO_NAME))");
stmt.executeUpdate("CREATE VIEW BARVIEW AS SELECT * FROM BAR");
stmt.executeUpdate("CREATE INDEX BAR_INDEX ON BAR(FOO_ID ASC, FOO_NAME DESC)");
stmt.executeUpdate("CREATE UNIQUE INDEX DEC_COL_INDEX ON BAR(DEC_COL)");
metadata = new JDBCMetadata(conn, "APP");
}
public void testForeignKey() throws Exception {
Catalog defaultCatalog = metadata.getDefaultCatalog();
Schema appSchema = defaultCatalog.getSchema("APP");
Table table = appSchema.getTable("BAR");
ForeignKey[] keys = table.getForeignKeys().toArray(new ForeignKey[0]);
assertEquals(1, keys.length);
ForeignKey key = keys[0];
Table referredTable = appSchema.getTable("FOO");
checkForeignKeyColumn(key, referredTable, "FOO_ID", "ID", 1);
checkForeignKeyColumn(key, referredTable, "FOO_NAME", "FOO_NAME", 2);
}
public void testBasic() throws Exception {
Catalog defaultCatalog = metadata.getDefaultCatalog();
assertEquals(1, metadata.getCatalogs().size());
assertTrue(metadata.getCatalogs().contains(defaultCatalog));
assertNull(defaultCatalog.getName());
assertNotNull(defaultCatalog.getSchema("NULLID"));
assertNotNull(defaultCatalog.getSchema("SYSCAT"));
Schema appSchema = defaultCatalog.getSchema("APP");
assertSame(appSchema, metadata.getDefaultSchema());
assertEquals("APP", appSchema.getName());
assertFalse(appSchema.isSynthetic());
assertTrue(appSchema.isDefault());
Collection<Table> tables = appSchema.getTables();
assertEquals(2, tables.size());
Table fooTable = appSchema.getTable("FOO");
Table barTable = appSchema.getTable("BAR");
assertTrue(tables.contains(fooTable));
assertTrue(tables.contains(barTable));
assertEquals("FOO", fooTable.getName());
assertEquals("BAR", barTable.getName());
Collection<Column> columns = barTable.getColumns();
checkColumns(barTable, columns);
checkPrimaryKey(fooTable);
}
public void testIndexes() {
Schema schema = metadata.getDefaultSchema();
Table table = schema.getTable("BAR");
Collection<Index> indexes = table.getIndexes();
assertEquals(4, indexes.size());
Index index = table.getIndex("BAR_INDEX");
assertNotNull(index);
assertEquals(index.getParent(), table);
assertFalse(index.isUnique());
assertEquals(IndexType.OTHER, index.getIndexType());
assertEquals("JDBCIndex[name='BAR_INDEX', type=OTHER, unique=false]", index.toString());
Collection<IndexColumn> columns = index.getColumns();
assertNames(new HashSet<String>(Arrays.asList("FOO_ID", "FOO_NAME")), columns);
IndexColumn col = index.getColumn("FOO_ID");
assertNotNull(col);
assertEquals(index, col.getParent());
assertEquals(Ordering.ASCENDING, col.getOrdering());
assertEquals(1, col.getPosition());
col = index.getColumn("FOO_NAME");
assertNotNull(col);
assertEquals(index, col.getParent());
assertEquals(Ordering.DESCENDING, col.getOrdering());
assertEquals(2, col.getPosition());
assertEquals("JDBCIndexColumn[name='FOO_NAME', ordering=DESCENDING, position=2, " +
"column=JDBCColumn[name=FOO_NAME, type=VARCHAR, length=16, precision=0, radix=0, scale=0, " +
"nullable=NOT_NULLABLE, ordinal_position=3]]", col.toString());
index = table.getIndex("DEC_COL_INDEX");
assertNotNull(index);
assertEquals(index.getParent(), table);
assertTrue(index.isUnique());
assertEquals(IndexType.OTHER, index.getIndexType());
columns = index.getColumns();
assertEquals(1, columns.size());
assertNames(new HashSet<String>(Arrays.asList("DEC_COL")), columns);
col = index.getColumn("DEC_COL");
assertNotNull(col);
assertEquals(index, col.getParent());
assertEquals(Ordering.ASCENDING, col.getOrdering());
assertEquals(1, col.getPosition());
}
public void testRefreshCatalog() throws Exception {
Catalog catalog = metadata.getDefaultCatalog();
Collection<Schema> schemas = catalog.getSchemas();
int numSchemas = schemas.size();
stmt.executeUpdate("CREATE SCHEMA testRefreshCatalog");
catalog.refresh();
schemas = catalog.getSchemas();
assertEquals(numSchemas + 1, schemas.size());
Schema schema = catalog.getSchema("testRefreshCatalog");
assertNotNull(schema);
assertTrue(schemas.contains(schema));
stmt.executeUpdate("DROP SCHEMA testRefreshCatalog RESTRICT");
catalog.refresh();
schemas = catalog.getSchemas();
assertEquals(numSchemas, schemas.size());
schema = catalog.getSchema("testRefreshCatalog");
assertNull(schema);
}
public void testViews() throws Exception {
Schema schema = metadata.getDefaultSchema();
Collection<View> views = schema.getViews();
assertNames(new HashSet<String>(Arrays.asList("BARVIEW")), views);
View barView = schema.getView("BARVIEW");
assertTrue(views.contains(barView));
assertSame(schema, barView.getParent());
Collection<Column> columns = barView.getColumns();
checkColumns(barView, columns);
}
public void testRefresh() throws Exception {
assertNull(metadata.getDefaultCatalog().getSchema("FOOBAR"));
Statement stmt = conn.createStatement();
stmt.executeUpdate("CREATE SCHEMA FOOBAR");
stmt.close();
metadata.refresh();
assertNotNull(metadata.getDefaultCatalog().getSchema("FOOBAR"));
}
public void testRefreshTable() throws Exception {
Table fooTable = metadata.getDefaultSchema().getTable("FOO");
assertNames(Arrays.asList("ID", "FOO_NAME"), fooTable.getColumns());
Statement stmt = conn.createStatement();
stmt.executeUpdate("ALTER TABLE FOO ADD NEW_COLUMN VARCHAR(16)");
stmt.close();
fooTable.refresh();
assertNames(Arrays.asList("ID", "FOO_NAME", "NEW_COLUMN"), fooTable.getColumns());
}
private void checkColumns(Tuple parent, Collection<Column> columns) {
assertEquals(5, columns.size());
Column[] colarray = columns.toArray(new Column[4]);
Column col = colarray[0];
assertEquals("JDBCColumn[name=i+d, type=INTEGER, length=0, precision=10, radix=10, scale=0, nullable=NOT_NULLABLE, ordinal_position=1]", col.toString());
assertEquals("i+d", col.getName());
assertSame(parent, col.getParent());
assertEquals(SQLType.INTEGER, col.getType());
assertEquals(0, col.getLength());
assertEquals(10, col.getRadix());
assertEquals(10, col.getPrecision());
assertEquals(0, col.getScale());
assertEquals(1, col.getPosition());
col = colarray[1];
assertEquals("JDBCColumn[name=FOO_ID, type=INTEGER, length=0, precision=10, radix=10, scale=0, nullable=NOT_NULLABLE, ordinal_position=2]", col.toString());
col = colarray[2];
assertEquals("JDBCColumn[name=FOO_NAME, type=VARCHAR, length=16, precision=0, radix=0, scale=0, nullable=NOT_NULLABLE, ordinal_position=3]", col.toString());
col = colarray[3];
assertEquals("JDBCColumn[name=BAR_NAME, type=VARCHAR, length=16, precision=0, radix=0, scale=0, nullable=NOT_NULLABLE, ordinal_position=4]", col.toString());
col = colarray[4];
assertEquals("JDBCColumn[name=DEC_COL, type=DECIMAL, length=0, precision=12, radix=10, scale=2, nullable=NULLABLE, ordinal_position=5]", col.toString());
}
private void checkPrimaryKey(Table fooTable) {
PrimaryKey key = fooTable.getPrimaryKey();
assertEquals("FOO_PK", key.getName());
Column[] pkcols = key.getColumns().toArray(new Column[0]);
Column col1 = fooTable.getColumn("ID");
Column col2 = fooTable.getColumn("FOO_NAME");
assertEquals(pkcols.length, 2);
assertEquals(col1, pkcols[1]);
assertEquals(col2, pkcols[0]);
}
}