diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/SchemaServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/SchemaServiceIntegrationTest.java index be1f6b5dae37db17ec5e90ad001a54ff77869886..540e17850a535b8776daf4a6a7bf53a5499f1838 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/SchemaServiceIntegrationTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/SchemaServiceIntegrationTest.java @@ -332,12 +332,39 @@ public class SchemaServiceIntegrationTest extends AbstractUnitTest { assertEquals("other_id", pk1.getColumn().getName()); assertEquals("other_id", pk1.getColumn().getInternalName()); assertEquals(ColumnTypeDto.BIGINT, pk1.getColumn().getColumnType()); + } + + @Test + public void inspectTable_exoticBoolean_succeeds() throws TableNotFoundException, SQLException { + /* test */ + final TableDto response = schemaService.inspectTable(DATABASE_1_PRIVILEGED_DTO, "exotic_boolean"); + final ConstraintsDto constraints = response.getConstraints(); + final List<PrimaryKeyDto> primaryKey = new LinkedList<>(constraints.getPrimaryKey()); + assertEquals(1, primaryKey.size()); + final PrimaryKeyDto pk0 = primaryKey.get(0); + assertNull(pk0.getId()); + assertNotNull(pk0.getTable()); + assertNull(pk0.getTable().getId()); + assertEquals("exotic_boolean", pk0.getTable().getName()); + assertEquals("exotic_boolean", pk0.getTable().getInternalName()); + assertNotNull(pk0.getColumn()); + assertNull(pk0.getColumn().getId()); + assertNull(pk0.getColumn().getTableId()); + assertEquals(DATABASE_1_ID, pk0.getColumn().getDatabaseId()); + assertNull(pk0.getColumn().getAlias()); + assertEquals("bool_default", pk0.getColumn().getName()); + assertEquals("bool_default", pk0.getColumn().getInternalName()); + assertEquals(ColumnTypeDto.BOOL, pk0.getColumn().getColumnType()); + final List<ColumnDto> columns = response.getColumns(); + assertEquals(3, columns.size()); + assertColumn(columns.get(0), null, null, DATABASE_1_ID, "bool_default", "bool_default", ColumnTypeDto.BOOL, null, 0L, false, null, null); + assertColumn(columns.get(1), null, null, DATABASE_1_ID, "bool_tinyint", "bool_tinyint", ColumnTypeDto.BOOL, null, 0L, false, null, null); + assertColumn(columns.get(2), null, null, DATABASE_1_ID, "bool_tinyint_unsigned", "bool_tinyint_unsigned", ColumnTypeDto.BOOL, null, 0L, false, null, null); } @Test - public void inspectView_succeeds() throws ViewMalformedException, SQLException, ViewNotFoundException, - ViewSchemaException { + public void inspectView_succeeds() throws SQLException, ViewNotFoundException { /* test */ final ViewDto response = schemaService.inspectView(DATABASE_1_PRIVILEGED_DTO, "not_in_metadata_db2"); diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java index 41fa4963fb26158f11060db383c4cb973e66e1c0..b8267e959e32f00545ec6670af98b420efb17c13 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java @@ -334,7 +334,7 @@ public class TableServiceIntegrationTest extends AbstractUnitTest { /* test */ final List<TableDto> response = tableService.getSchemas(DATABASE_1_PRIVILEGED_DTO); - assertEquals(3, response.size()); + assertEquals(4, response.size()); final TableDto table0 = response.get(0); Assertions.assertEquals("complex_foreign_keys", table0.getInternalName()); Assertions.assertEquals("complex_foreign_keys", table0.getName()); @@ -411,32 +411,53 @@ public class TableServiceIntegrationTest extends AbstractUnitTest { assertEquals(0, constraints1.getUniques().size()); /* table 2 */ final TableDto table2 = response.get(2); - Assertions.assertEquals("not_in_metadata_db", table2.getInternalName()); - Assertions.assertEquals("not_in_metadata_db", table2.getName()); + Assertions.assertEquals("exotic_boolean", table2.getInternalName()); + Assertions.assertEquals("exotic_boolean", table2.getName()); Assertions.assertEquals(DATABASE_1_ID, table2.getTdbid()); assertTrue(table2.getIsVersioned()); Assertions.assertEquals(DATABASE_1_PUBLIC, table2.getIsPublic()); final List<ColumnDto> columns2 = table2.getColumns(); assertNotNull(columns2); - Assertions.assertEquals(5, columns2.size()); - assertColumn(columns2.get(0), null, null, DATABASE_1_ID, "id", "id", ColumnTypeDto.BIGINT, 19L, 0L, false, null, null); - assertColumn(columns2.get(1), null, null, DATABASE_1_ID, "given_name", "given_name", ColumnTypeDto.VARCHAR, 255L, null, false, null, null); - assertColumn(columns2.get(2), null, null, DATABASE_1_ID, "middle_name", "middle_name", ColumnTypeDto.VARCHAR, 255L, null, true, null, null); - assertColumn(columns2.get(3), null, null, DATABASE_1_ID, "family_name", "family_name", ColumnTypeDto.VARCHAR, 255L, null, false, null, null); - assertColumn(columns2.get(4), null, null, DATABASE_1_ID, "age", "age", ColumnTypeDto.INT, 10L, 0L, false, null, null); + Assertions.assertEquals(3, columns2.size()); + assertColumn(columns2.get(0), null, null, DATABASE_1_ID, "bool_default", "bool_default", ColumnTypeDto.BOOL, null, 0L, false, null, null); + assertColumn(columns2.get(1), null, null, DATABASE_1_ID, "bool_tinyint", "bool_tinyint", ColumnTypeDto.BOOL, null, 0L, false, null, null); + assertColumn(columns2.get(2), null, null, DATABASE_1_ID, "bool_tinyint_unsigned", "bool_tinyint_unsigned", ColumnTypeDto.BOOL, null, 0L, false, null, null); final ConstraintsDto constraints2 = table2.getConstraints(); assertNotNull(constraints2); final Set<PrimaryKeyDto> primaryKey2 = constraints2.getPrimaryKey(); Assertions.assertEquals(1, primaryKey2.size()); final Set<String> checks2 = constraints2.getChecks(); - Assertions.assertEquals(1, checks2.size()); - Assertions.assertEquals(Set.of("`age` > 0 and `age` < 120"), checks2); + Assertions.assertEquals(0, checks2.size()); final List<UniqueDto> uniques2 = constraints2.getUniques(); - Assertions.assertEquals(1, uniques2.size()); - Assertions.assertEquals(2, uniques2.get(0).getColumns().size()); - Assertions.assertEquals("not_in_metadata_db", uniques2.get(0).getTable().getInternalName()); - Assertions.assertEquals("given_name", uniques2.get(0).getColumns().get(0).getInternalName()); - Assertions.assertEquals("family_name", uniques2.get(0).getColumns().get(1).getInternalName()); + Assertions.assertEquals(0, uniques2.size()); + /* table 3 */ + final TableDto table3 = response.get(3); + Assertions.assertEquals("not_in_metadata_db", table3.getInternalName()); + Assertions.assertEquals("not_in_metadata_db", table3.getName()); + Assertions.assertEquals(DATABASE_1_ID, table3.getTdbid()); + assertTrue(table3.getIsVersioned()); + Assertions.assertEquals(DATABASE_1_PUBLIC, table3.getIsPublic()); + final List<ColumnDto> columns3 = table3.getColumns(); + assertNotNull(columns3); + Assertions.assertEquals(5, columns3.size()); + assertColumn(columns3.get(0), null, null, DATABASE_1_ID, "id", "id", ColumnTypeDto.BIGINT, 19L, 0L, false, null, null); + assertColumn(columns3.get(1), null, null, DATABASE_1_ID, "given_name", "given_name", ColumnTypeDto.VARCHAR, 255L, null, false, null, null); + assertColumn(columns3.get(2), null, null, DATABASE_1_ID, "middle_name", "middle_name", ColumnTypeDto.VARCHAR, 255L, null, true, null, null); + assertColumn(columns3.get(3), null, null, DATABASE_1_ID, "family_name", "family_name", ColumnTypeDto.VARCHAR, 255L, null, false, null, null); + assertColumn(columns3.get(4), null, null, DATABASE_1_ID, "age", "age", ColumnTypeDto.INT, 10L, 0L, false, null, null); + final ConstraintsDto constraints3 = table3.getConstraints(); + assertNotNull(constraints3); + final Set<PrimaryKeyDto> primaryKey3 = constraints3.getPrimaryKey(); + Assertions.assertEquals(1, primaryKey3.size()); + final Set<String> checks3 = constraints3.getChecks(); + Assertions.assertEquals(1, checks3.size()); + Assertions.assertEquals(Set.of("`age` > 0 and `age` < 120"), checks3); + final List<UniqueDto> uniques3 = constraints3.getUniques(); + Assertions.assertEquals(1, uniques3.size()); + Assertions.assertEquals(2, uniques3.get(0).getColumns().size()); + Assertions.assertEquals("not_in_metadata_db", uniques3.get(0).getTable().getInternalName()); + Assertions.assertEquals("given_name", uniques3.get(0).getColumns().get(0).getInternalName()); + Assertions.assertEquals("family_name", uniques3.get(0).getColumns().get(1).getInternalName()); } @Test diff --git a/dbrepo-data-service/rest-service/src/test/resources/init/weather.sql b/dbrepo-data-service/rest-service/src/test/resources/init/weather.sql index 79755c97bf68fd822869277e3ad867c582f4e68c..7c3ca99ce39f61755752d2ecbb607ad6ed86e386 100644 --- a/dbrepo-data-service/rest-service/src/test/resources/init/weather.sql +++ b/dbrepo-data-service/rest-service/src/test/resources/init/weather.sql @@ -32,7 +32,7 @@ CREATE TABLE complex_foreign_keys ( id BIGINT NOT NULL PRIMARY KEY, weather_id BIGINT NOT NULL, - other_id BIGINT NOT NULL, + other_id BIGINT NOT NULL, FOREIGN KEY (weather_id, other_id) REFERENCES complex_primary_key (id, `other_id`) ) WITH SYSTEM VERSIONING; @@ -42,6 +42,13 @@ CREATE TABLE sensor `value` DECIMAL ) WITH SYSTEM VERSIONING; +CREATE TABLE exotic_boolean +( + `bool_default` BOOLEAN NOT NULL PRIMARY KEY, + `bool_tinyint` TINYINT(1) NOT NULL, + `bool_tinyint_unsigned` TINYINT(1) UNSIGNED NOT NULL +) WITH SYSTEM VERSIONING; + INSERT INTO weather_location (location, lat, lng) VALUES ('Albury', -36.0653583, 146.9112214), ('Sydney', -33.847927, 150.6517942), diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/DataMapper.java b/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/DataMapper.java index 796ef3edebc452471569dd6f04c81bb4731891cd..07394c765864671e1d286c242e3902be66a16767 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/DataMapper.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/DataMapper.java @@ -97,7 +97,8 @@ public interface DataMapper { /** * Map the inspected schema to either an existing view/table and append e.g. column or (if not existing) create a new view/table. - * @param database The database. + * + * @param database The database. * @param resultSet The inspected schema. * @return The database containing the updated view/table. * @throws SQLException @@ -152,31 +153,23 @@ public interface DataMapper { .databaseId(table.getTdbid()) .description(resultSet.getString(11)) .build(); + final String dataType = resultSet.getString(8); if (column.getColumnType().equals(ColumnTypeDto.ENUM)) { - column.setEnums(Arrays.stream(resultSet.getString(8) - .substring(0, resultSet.getString(8).length() - 1) + column.setEnums(Arrays.stream(dataType.substring(0, resultSet.getString(8).length() - 1) .replace("enum(", "") .split(",")) .map(value -> value.replace("'", "")) .toList()); } if (column.getColumnType().equals(ColumnTypeDto.SET)) { - column.setSets(Arrays.stream(resultSet.getString(8) - .substring(0, resultSet.getString(8).length() - 1) + column.setSets(Arrays.stream(dataType.substring(0, dataType.length() - 1) .replace("set(", "") .split(",")) .map(value -> value.replace("'", "")) .toList()); } - /* constraints */ - if (resultSet.getString(9) != null && resultSet.getString(9).equals("PRI")) { - table.getConstraints().getPrimaryKey().add(PrimaryKeyDto.builder() - .table(tableDtoToTableBriefDto(table)) - .column(columnDtoToColumnBriefDto(column)) - .build()); - } /* fix boolean and set size for others */ - if (resultSet.getString(8).equalsIgnoreCase("tinyint(1)")) { + if (dataType.startsWith("tinyint(1)")) { column.setColumnType(ColumnTypeDto.BOOL); } else if (resultSet.getString(5) != null) { column.setSize(resultSet.getLong(5)); @@ -196,6 +189,13 @@ public interface DataMapper { .id(queryConfig.getDefaultTimeFormatId()) .build()); } + /* constraints */ + if (resultSet.getString(9) != null && resultSet.getString(9).equals("PRI")) { + table.getConstraints().getPrimaryKey().add(PrimaryKeyDto.builder() + .table(tableDtoToTableBriefDto(table)) + .column(columnDtoToColumnBriefDto(column)) + .build()); + } table.getColumns() .add(column); return table; @@ -241,8 +241,9 @@ public interface DataMapper { /** * Parse columns from a SQL statement of a known database. + * * @param database The database. - * @param query The SQL statement. + * @param query The SQL statement. * @return The list of columns. * @throws JSQLParserException The table/view or column was not found in the database. */