diff --git a/dbrepo-metadata-db/setup-schema.sql b/dbrepo-metadata-db/setup-schema.sql index ce9488685b8592ea9169c810b075087574fc2325..047ecfe77783440def1475fa227a2fc09956cf2b 100644 --- a/dbrepo-metadata-db/setup-schema.sql +++ b/dbrepo-metadata-db/setup-schema.sql @@ -153,7 +153,6 @@ dfID BIGINT, cName VARCHAR(100), internal_name VARCHAR(100) NOT NULL, - alias VARCHAR(100), Datatype ENUM ('CHAR','VARCHAR','BINARY','VARBINARY','TINYBLOB','TINYTEXT','TEXT','BLOB','MEDIUMTEXT','MEDIUMBLOB','LONGTEXT','LONGBLOB','ENUM','SET','BIT','TINYINT','BOOL','SMALLINT','MEDIUMINT','INT','BIGINT','FLOAT','DOUBLE','DECIMAL','DATE','DATETIME','TIMESTAMP','TIME','YEAR'), length BIGINT NULL, ordinal_position INTEGER NOT NULL, @@ -355,10 +354,11 @@ CREATE TABLE IF NOT EXISTS `mdb_view_columns` ( - id BIGINT NOT NULL AUTO_INCREMENT, - cid BIGINT NOT NULL, - vid BIGINT NOT NULL, - position INTEGER NULL, + id BIGINT NOT NULL AUTO_INCREMENT, + cid BIGINT NOT NULL, + vid BIGINT NOT NULL, + alias VARCHAR(100), + ordinal_position INTEGER, PRIMARY KEY (id), FOREIGN KEY (vid) REFERENCES mdb_view (id), FOREIGN KEY (cid) REFERENCES mdb_columns (ID) diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/View.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/View.java index 7888bb6fdde986f1e5c73213a811ac6c940fc9f6..46dbac13ca02f81f0df6df08146f5ec3c34a53b4 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/View.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/View.java @@ -111,20 +111,13 @@ public class View { return this.internalName.equals(table.getName().replace("`", "")); } - /** - * Cascade cannot be CascadeType.PERSIST since columns already exist - */ @ToString.Exclude - @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.MERGE) - @JoinTable(name = "mdb_view_columns", - inverseJoinColumns = { - @JoinColumn(name = "cid", referencedColumnName = "id"), - }, - joinColumns = { - @JoinColumn(name = "vid", referencedColumnName = "id"), - }) - @OrderColumn(name = "position") - private List<TableColumn> columns; + @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE, CascadeType.PERSIST}) + @JoinColumns({ + @JoinColumn(name = "vid", referencedColumnName = "id", updatable = false) + }) + @OrderColumn(name = "ordinalPosition") + private List<ViewColumn> columns; @CreatedDate @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP default NOW()") diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/ViewColumn.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/ViewColumn.java new file mode 100644 index 0000000000000000000000000000000000000000..10f13c3bd61c2eeac9c83fe2eff664eec4a99e46 --- /dev/null +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/ViewColumn.java @@ -0,0 +1,53 @@ +package at.tuwien.entities.database; + +import at.tuwien.entities.database.table.columns.TableColumn; +import lombok.*; +import org.hibernate.annotations.GenericGenerator; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import jakarta.persistence.*; + +@Data +@Entity +@Builder(toBuilder = true) +@ToString +@AllArgsConstructor +@NoArgsConstructor +@EntityListeners(AuditingEntityListener.class) +@jakarta.persistence.Table(name = "mdb_view_columns", uniqueConstraints = { + @UniqueConstraint(columnNames = {"cid", "vid"}) +}) +public class ViewColumn implements Comparable<ViewColumn> { + + @Id + @EqualsAndHashCode.Include + @GeneratedValue(generator = "view-columns-sequence") + @GenericGenerator(name = "view-columns-sequence", strategy = "increment") + @Column(updatable = false, nullable = false) + private Long id; + + @Column(updatable = false, nullable = false) + private String alias; + + @Column(nullable = false) + private Integer ordinalPosition; + + @ToString.Exclude + @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE}) + @JoinColumns({ + @JoinColumn(name = "vid", referencedColumnName = "id", updatable = false) + }) + private View view; + + @ToString.Exclude + @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE}) + @JoinColumns({ + @JoinColumn(name = "cid", referencedColumnName = "id", updatable = false) + }) + private TableColumn column; + + @Override + public int compareTo(ViewColumn tableColumn) { + return Integer.compare(this.ordinalPosition, tableColumn.getOrdinalPosition()); + } +} diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumn.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumn.java index aa7b2dcd6c1032e297969fd0408825158f06d20f..2c37b13a2de2f1134bf1733b22ffedc29d7d4ddc 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumn.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumn.java @@ -73,7 +73,7 @@ public class TableColumn implements Comparable<TableColumn> { @Column private Long indexLength; - @Column + @Transient private String alias; @Column(name = "datatype", nullable = false, columnDefinition = "ENUM('CHAR','VARCHAR','BINARY','VARBINARY','TINYBLOB','TINYTEXT','TEXT','BLOB','MEDIUMTEXT','MEDIUMBLOB','LONGTEXT','LONGBLOB','ENUM','SET','BIT','TINYINT','BOOL','SMALLINT','MEDIUMINT','INT','BIGINT','FLOAT','DOUBLE','DECIMAL','DATE','DATETIME','TIMESTAMP','TIME','YEAR')") diff --git a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/QueryMapper.java b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/QueryMapper.java index 9a9ee424fd315bfbe1c8e994ae073d78b445dea3..31bb6c0881a69fe524e3b83ae164b279efcbfef4 100644 --- a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/QueryMapper.java +++ b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/QueryMapper.java @@ -619,12 +619,6 @@ public interface QueryMapper { return columnsToRawFindAllQuery(table.getInternalName(), table.getColumns(), timestamp, size, page); } - default String viewToRawFindAllQuery(View view, Long size, Long page) { - log.trace("mapping view to find all query, view={}, size={}, page={}", view, size, page); - /* param check */ - return columnsToRawFindAllQuery(view.getInternalName(), view.getColumns(), null, size, page); - } - private String columnsToRawFindAllQuery(String tableName, List<TableColumn> columns, Instant timestamp, Long size, Long page) { final int[] idx = new int[]{0}; final StringBuilder statement = new StringBuilder("SELECT "); diff --git a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/ViewMapper.java b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/ViewMapper.java index 90e0ef07d1f111f10ef8d1d6f172ce27e5b92b33..d1fdb10b8f34de7a523505f98f1d95af7439f647 100644 --- a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/ViewMapper.java +++ b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/ViewMapper.java @@ -4,6 +4,8 @@ import at.tuwien.api.database.ViewBriefDto; import at.tuwien.api.database.ViewCreateDto; import at.tuwien.api.database.ViewDto; import at.tuwien.entities.database.View; +import at.tuwien.entities.database.ViewColumn; +import at.tuwien.entities.database.table.columns.TableColumn; import at.tuwien.exception.QueryMalformedException; import org.mapstruct.Mapper; import org.mapstruct.Mapping; @@ -14,6 +16,7 @@ import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.text.Normalizer; +import java.util.List; import java.util.Locale; import java.util.regex.Pattern; @@ -45,6 +48,19 @@ public interface ViewMapper { ViewBriefDto viewToViewBriefDto(View data); + TableColumn viewColumnToTableColumn(ViewColumn data); + + default List<ViewColumn> tableColumnsToViewColumns(View view, List<TableColumn> data) { + final int[] idx = new int[]{0}; + return data.stream() + .map(c -> ViewColumn.builder() + .ordinalPosition(idx[0]++) + .column(c) + .view(view) + .alias(c.getAlias()) + .build()) + .toList(); + } default PreparedStatement viewToSelectAll(Connection connection, View view, Long page, Long size) throws QueryMalformedException { log.debug("mapping view query, view.query={}, page={}, size={}", view.getQuery(), page, size); @@ -53,7 +69,7 @@ public interface ViewMapper { view.getColumns() .forEach(c -> statement.append(idx[0]++ > 0 ? "," : "") .append("`") - .append(c.getInternalName()) + .append(c.getColumn().getInternalName()) .append("`")); statement.append(" FROM `") .append(view.getInternalName()) diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java index c51f14874500e4763242c9e666d0321ea0dbd48c..89a87c5e260b9f4d4e671f9587d62f17045a54c6 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java @@ -400,8 +400,8 @@ public class DatabaseServiceIntegrationTest extends BaseUnitTest { assertEquals(DATABASE_1_OWNER, view1.getCreatedBy()); assertNotNull(view1.getQuery()); assertNotNull(view1.getQueryHash()); - assertColumn(view1.getColumns().get(0), 0, "id", TableColumnType.BIGINT, null, false, true, true); - assertColumn(view1.getColumns().get(1), 1, "date", TableColumnType.DATE, null, false, false, false); + assertColumn(view1.getColumns().get(0).getColumn(), 0, "id", TableColumnType.BIGINT, null, false, true, true); + assertColumn(view1.getColumns().get(1).getColumn(), 1, "date", TableColumnType.DATE, null, false, false, false); } /* ################################################################################################### */ diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ViewServiceIntegrationTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ViewServiceIntegrationTest.java index c1b225310ad8bdcac8495eb6fe9fd8fe9c138bd6..50fa955f82d056b32610d20437b58e15bcb6363a 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ViewServiceIntegrationTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ViewServiceIntegrationTest.java @@ -7,6 +7,7 @@ import at.tuwien.api.database.ViewCreateDto; import at.tuwien.config.MariaDbConfig; import at.tuwien.config.MariaDbContainerConfig; import at.tuwien.entities.database.View; +import at.tuwien.entities.database.ViewColumn; import at.tuwien.entities.database.table.columns.TableColumn; import at.tuwien.exception.*; import at.tuwien.repository.mdb.*; @@ -184,18 +185,18 @@ public class ViewServiceIntegrationTest extends BaseUnitTest { assertEquals(VIEW_2_NAME + "_with_alias", response.getName()); assertEquals(VIEW_2_INTERNAL_NAME + "_with_alias", response.getInternalName()); assertEquals(VIEW_2_QUERY, response.getQuery()); - final List<TableColumn> columns = response.getColumns(); + final List<ViewColumn> columns = response.getColumns(); assertEquals(4, columns.size()); - final TableColumn column0 = columns.get(0); + final TableColumn column0 = columns.get(0).getColumn(); assertEquals("date", column0.getInternalName()); assertNull(column0.getAlias()); - final TableColumn column1 = columns.get(1); + final TableColumn column1 = columns.get(1).getColumn(); assertEquals("location", column1.getInternalName()); assertEquals("loc", column1.getAlias()); - final TableColumn column2 = columns.get(2); + final TableColumn column2 = columns.get(2).getColumn(); assertEquals("rainfall", column2.getInternalName()); assertNull(column2.getAlias()); - final TableColumn column3 = columns.get(3); + final TableColumn column3 = columns.get(3).getColumn(); assertEquals("mintemp", column3.getInternalName()); assertNull(column3.getAlias()); } diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/MariaDbServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/MariaDbServiceImpl.java index 1b675b0fac3e2ebecf7eb8349ced51f8e8f3d15a..59ef1aa88e5fe765e28c135458e1ac2a30ea70b2 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/MariaDbServiceImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/MariaDbServiceImpl.java @@ -1,7 +1,6 @@ package at.tuwien.service.impl; import at.tuwien.api.database.DatabaseCreateDto; -import at.tuwien.api.database.DatabaseModifyImageDto; import at.tuwien.api.database.DatabaseModifyVisibilityDto; import at.tuwien.api.database.DatabaseTransferDto; import at.tuwien.config.QueryConfig; @@ -18,6 +17,7 @@ import at.tuwien.exception.*; import at.tuwien.mapper.DatabaseMapper; import at.tuwien.mapper.QueryMapper; import at.tuwien.mapper.TableMapper; +import at.tuwien.mapper.ViewMapper; import at.tuwien.repository.mdb.ContainerRepository; import at.tuwien.repository.mdb.DatabaseRepository; import at.tuwien.repository.sdb.DatabaseIdxRepository; @@ -42,6 +42,7 @@ import java.util.*; @Service public class MariaDbServiceImpl extends HibernateConnector implements DatabaseService { + private final ViewMapper viewMapper; private final QueryConfig queryConfig; private final QueryMapper queryMapper; private final TableMapper tableMapper; @@ -53,10 +54,11 @@ public class MariaDbServiceImpl extends HibernateConnector implements DatabaseSe private final DatabaseIdxRepository databaseIdxRepository; @Autowired - public MariaDbServiceImpl(QueryConfig queryConfig, QueryMapper queryMapper, TableMapper tableMapper, - UserService userService, DatabaseMapper databaseMapper, ContainerService containerService, - DatabaseRepository databaseRepository, ContainerRepository containerRepository, - DatabaseIdxRepository databaseIdxRepository) { + public MariaDbServiceImpl(ViewMapper viewMapper, QueryConfig queryConfig, QueryMapper queryMapper, + TableMapper tableMapper, UserService userService, DatabaseMapper databaseMapper, + ContainerService containerService, DatabaseRepository databaseRepository, + ContainerRepository containerRepository, DatabaseIdxRepository databaseIdxRepository) { + this.viewMapper = viewMapper; this.queryConfig = queryConfig; this.queryMapper = queryMapper; this.tableMapper = tableMapper; @@ -322,11 +324,15 @@ public class MariaDbServiceImpl extends HibernateConnector implements DatabaseSe log.debug("database with id {} misses view(s) in metadata database: {}", databaseId, diffViews.stream().map(View::getInternalName).toList()); for (View view : diffViews) { try { - view.setColumns(queryMapper.parseColumns(view.getQuery(), database)); + view.setColumns(viewMapper.tableColumnsToViewColumns(view, queryMapper.parseColumns(view.getQuery(), database))); } catch (JSQLParserException e) { log.error("Failed to map/parse columns: {}", e.getMessage()); throw new ColumnParseException("Failed to map/parse columns: " + e.getMessage(), e); } + if (view.getColumns().stream().anyMatch(c -> c.getColumn().getId() == null)) { + log.warn("Skipping creation of view {}: referenced columns does not exist in metadata database", view.getInternalName()); + continue; + } database.getViews() .add(view); } diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/QueryServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/QueryServiceImpl.java index 775df9e82dda9c5604114faeebd840b37c9284cb..2707d3d3579b33b220d3f94a900942e80fd6f17a 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/QueryServiceImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/QueryServiceImpl.java @@ -195,7 +195,11 @@ public class QueryServiceImpl extends HibernateConnector implements QueryService final Connection connection = dataSource.getConnection(); final PreparedStatement preparedStatement = viewMapper.viewToSelectAll(connection, view, page, size); final ResultSet resultSet = preparedStatement.executeQuery(); - return queryMapper.resultListToQueryResultDto(view.getColumns(), resultSet); + final List<TableColumn> columns = view.getColumns() + .stream() + .map(viewMapper::viewColumnToTableColumn) + .toList(); + return queryMapper.resultListToQueryResultDto(columns, resultSet); } catch (SQLException e) { log.error("Failed to map object: {}", e.getMessage()); throw new TableMalformedException("Failed to map object: " + e.getMessage(), e); diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/ViewServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/ViewServiceImpl.java index 2a57cadf190fa111233efb30c5fa13ba384411cb..5fadde3b28d8530c3c545763957daf1091756697 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/ViewServiceImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/ViewServiceImpl.java @@ -3,6 +3,7 @@ package at.tuwien.service.impl; import at.tuwien.api.database.ViewCreateDto; import at.tuwien.entities.database.Database; import at.tuwien.entities.database.View; +import at.tuwien.entities.database.ViewColumn; import at.tuwien.entities.database.table.columns.TableColumn; import at.tuwien.exception.*; import at.tuwien.mapper.DatabaseMapper; @@ -171,8 +172,8 @@ public class ViewServiceImpl extends HibernateConnector implements ViewService { .toString()) .isInitialView(false) .isPublic(data.getIsPublic()) - .columns(columns) .build(); + entity.setColumns(viewMapper.tableColumnsToViewColumns(entity, columns)); database.getViews() .add(entity); final Optional<View> optional = databaseRepository.save(database) diff --git a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java index 67a2711a98bc1b93492fdfb25102daf6f9c0037b..6d60d4219b4223816e76a9d452c8606d8c58cf05 100644 --- a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java +++ b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java @@ -4908,10 +4908,19 @@ public abstract class BaseTest { public final static String VIEW_1_QUERY = "select `location`, `lat`, `lng` from `weather_location`"; public final static String VIEW_1_QUERY_HASH = "dc81a6877c7c51a6a6f406e1fc2a255e44a0d49a20548596e0d583c3eb849c23"; - public final static List<TableColumn> VIEW_1_COLUMNS = List.of( - TABLE_2_COLUMNS.get(0), - TABLE_2_COLUMNS.get(1), - TABLE_2_COLUMNS.get(2) + public final static List<ViewColumn> VIEW_1_COLUMNS = List.of( + ViewColumn.builder() + .ordinalPosition(0) + .column(TABLE_2_COLUMNS.get(0)) + .build(), + ViewColumn.builder() + .ordinalPosition(1) + .column(TABLE_2_COLUMNS.get(1)) + .build(), + ViewColumn.builder() + .ordinalPosition(2) + .column(TABLE_2_COLUMNS.get(2)) + .build() ); public final static List<ColumnDto> VIEW_1_COLUMNS_DTO = List.of( @@ -4974,11 +4983,23 @@ public abstract class BaseTest { public final static String VIEW_2_QUERY = "select `date`, `location` as loc, `rainfall`, `mintemp` from `weather_aus` where `location` = 'Albury'"; public final static String VIEW_2_QUERY_HASH = "987fc946772ffb6d85060262dcb5df419692a1f6772ea995e3dedb53c191e984"; - public final static List<TableColumn> VIEW_2_COLUMNS = List.of( - TABLE_1_COLUMNS.get(1), - TABLE_1_COLUMNS.get(2), - TABLE_1_COLUMNS.get(4), - TABLE_1_COLUMNS.get(3) + public final static List<ViewColumn> VIEW_2_COLUMNS = List.of( + ViewColumn.builder() + .ordinalPosition(0) + .column(TABLE_1_COLUMNS.get(1)) + .build(), + ViewColumn.builder() + .ordinalPosition(1) + .column(TABLE_1_COLUMNS.get(2)) + .build(), + ViewColumn.builder() + .ordinalPosition(2) + .column(TABLE_1_COLUMNS.get(4)) + .build(), + ViewColumn.builder() + .ordinalPosition(3) + .column(TABLE_1_COLUMNS.get(3)) + .build() ); public final static List<ColumnDto> VIEW_2_COLUMNS_DTO = List.of( @@ -5036,11 +5057,23 @@ public abstract class BaseTest { public final static String VIEW_3_QUERY = "select w.`mintemp`, w.`rainfall`, w.`location`, m.`date` from `weather_aus` w join `junit2` m on m.`location` = w.`location` and m.`date` = w.`date`"; public final static String VIEW_3_QUERY_HASH = "bbbaa56a5206b3dc3e6cf9301b0db9344eb6f19b100c7b88550ffb597a0bd255"; - public final static List<TableColumn> VIEW_3_COLUMNS = List.of( - TABLE_1_COLUMNS.get(3), - TABLE_1_COLUMNS.get(4), - TABLE_1_COLUMNS.get(2), - TABLE_1_COLUMNS.get(1) + public final static List<ViewColumn> VIEW_3_COLUMNS = List.of( + ViewColumn.builder() + .ordinalPosition(0) + .column(TABLE_1_COLUMNS.get(3)) + .build(), + ViewColumn.builder() + .ordinalPosition(1) + .column(TABLE_1_COLUMNS.get(4)) + .build(), + ViewColumn.builder() + .ordinalPosition(2) + .column(TABLE_1_COLUMNS.get(2)) + .build(), + ViewColumn.builder() + .ordinalPosition(3) + .column(TABLE_1_COLUMNS.get(1)) + .build() ); public final static List<ColumnDto> VIEW_3_COLUMNS_DTO = List.of( @@ -5100,24 +5133,75 @@ public abstract class BaseTest { public final static String VIEW_4_QUERY = "SELECT `animal_name`, `hair`, `feathers`, `eggs`, `milk`, `airborne`, `aquatic`, `predator`, `backbone`, `breathes`, `venomous`, `fins`, `legs`, `tail`, `domestic`, `catsize`, `class_type` FROM `zoo` WHERE `class_type` = 1"; public final static String VIEW_4_QUERY_HASH = "3561cd0bb0b0e94d6f15ae602134252a5760d09d660a71a4fb015b6991c8ba0b"; - public final static List<TableColumn> VIEW_4_COLUMNS = List.of( - TABLE_5_COLUMNS.get(1), - TABLE_5_COLUMNS.get(2), - TABLE_5_COLUMNS.get(3), - TABLE_5_COLUMNS.get(5), - TABLE_5_COLUMNS.get(6), - TABLE_5_COLUMNS.get(8), - TABLE_5_COLUMNS.get(10), - TABLE_5_COLUMNS.get(11), - TABLE_5_COLUMNS.get(12), - TABLE_5_COLUMNS.get(13), - TABLE_5_COLUMNS.get(14), - TABLE_5_COLUMNS.get(15), - TABLE_5_COLUMNS.get(16), - TABLE_5_COLUMNS.get(17), - TABLE_5_COLUMNS.get(18), - TABLE_5_COLUMNS.get(19), - TABLE_5_COLUMNS.get(20) + public final static List<ViewColumn> VIEW_4_COLUMNS = List.of( + ViewColumn.builder() + .ordinalPosition(0) + .column(TABLE_5_COLUMNS.get(1)) + .build(), + ViewColumn.builder() + .ordinalPosition(1) + .column(TABLE_5_COLUMNS.get(2)) + .build(), + ViewColumn.builder() + .ordinalPosition(2) + .column(TABLE_5_COLUMNS.get(3)) + .build(), + ViewColumn.builder() + .ordinalPosition(3) + .column(TABLE_5_COLUMNS.get(5)) + .build(), + ViewColumn.builder() + .ordinalPosition(4) + .column(TABLE_5_COLUMNS.get(6)) + .build(), + ViewColumn.builder() + .ordinalPosition(5) + .column(TABLE_5_COLUMNS.get(8)) + .build(), + ViewColumn.builder() + .ordinalPosition(6) + .column(TABLE_5_COLUMNS.get(10)) + .build(), + ViewColumn.builder() + .ordinalPosition(7) + .column(TABLE_5_COLUMNS.get(11)) + .build(), + ViewColumn.builder() + .ordinalPosition(8) + .column(TABLE_5_COLUMNS.get(12)) + .build(), + ViewColumn.builder() + .ordinalPosition(9) + .column(TABLE_5_COLUMNS.get(13)) + .build(), + ViewColumn.builder() + .ordinalPosition(10) + .column(TABLE_5_COLUMNS.get(14)) + .build(), + ViewColumn.builder() + .ordinalPosition(11) + .column(TABLE_5_COLUMNS.get(15)) + .build(), + ViewColumn.builder() + .ordinalPosition(12) + .column(TABLE_5_COLUMNS.get(16)) + .build(), + ViewColumn.builder() + .ordinalPosition(13) + .column(TABLE_5_COLUMNS.get(17)) + .build(), + ViewColumn.builder() + .ordinalPosition(14) + .column(TABLE_5_COLUMNS.get(18)) + .build(), + ViewColumn.builder() + .ordinalPosition(15) + .column(TABLE_5_COLUMNS.get(19)) + .build(), + ViewColumn.builder() + .ordinalPosition(16) + .column(TABLE_5_COLUMNS.get(20)) + .build() ); public final static List<ColumnDto> VIEW_4_COLUMNS_DTO = List.of(