Full Code of 9tigerio/db2rest for AI

master 68c8efac62ba cached
556 files
8.0 MB
2.1M tokens
1823 symbols
1 requests
Download .txt
Showing preview only (8,536K chars total). Download the full file or copy to clipboard to get everything.
Repository: 9tigerio/db2rest
Branch: master
Commit: 68c8efac62ba
Files: 556
Total size: 8.0 MB

Directory structure:
gitextract_rp34tsh_/

├── .gitattributes
├── .github/
│   ├── FUNDING.yml
│   ├── RELEASING.md
│   └── workflows/
│       ├── build-verify.yml
│       ├── dockerhub-publish.yml
│       ├── maven-central-publish.yml
│       ├── oracle9i-central-publish.yml
│       └── snapshot.yml
├── .gitignore
├── .mvn/
│   └── wrapper/
│       └── maven-wrapper.properties
├── CONTRIBUTING.md
├── Dockerfile
├── LICENSE
├── README.md
├── db2rest-api/
│   ├── api-rest/
│   │   ├── pom-oracle9i.xml
│   │   ├── pom.xml
│   │   ├── sample-config/
│   │   │   ├── application-db.yml
│   │   │   ├── application-local.yml
│   │   │   ├── application-mongo.yml
│   │   │   ├── application-pg15.yml
│   │   │   └── application-pg16.yml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── com/
│   │       │   │       └── homihq/
│   │       │   │           └── db2rest/
│   │       │   │               ├── Db2restApplication.java
│   │       │   │               ├── config/
│   │       │   │               │   ├── CorsFilterConfiguration.java
│   │       │   │               │   ├── DbServiceConfiguration.java
│   │       │   │               │   ├── RestApiConfiguration.java
│   │       │   │               │   ├── WebMvcConfiguration.java
│   │       │   │               │   └── jinjava/
│   │       │   │               │       └── DisabledExpressionTokenScannerSymbols.java
│   │       │   │               ├── interceptor/
│   │       │   │               │   └── DatabaseContextRequestInterceptor.java
│   │       │   │               └── rest/
│   │       │   │                   ├── RdbmsRestApi.java
│   │       │   │                   ├── admin/
│   │       │   │                   │   └── AdminController.java
│   │       │   │                   ├── create/
│   │       │   │                   │   ├── BulkCreateController.java
│   │       │   │                   │   ├── BulkCreateRestApi.java
│   │       │   │                   │   ├── CreateController.java
│   │       │   │                   │   └── CreateRestApi.java
│   │       │   │                   ├── delete/
│   │       │   │                   │   ├── DeleteController.java
│   │       │   │                   │   └── DeleteRestApi.java
│   │       │   │                   ├── meta/
│   │       │   │                   │   ├── db/
│   │       │   │                   │   │   ├── DbInfoController.java
│   │       │   │                   │   │   ├── DbInfoObject.java
│   │       │   │                   │   │   └── DbInfoRestApi.java
│   │       │   │                   │   └── schema/
│   │       │   │                   │       ├── ColumnObject.java
│   │       │   │                   │       ├── SchemaController.java
│   │       │   │                   │       ├── SchemaRestApi.java
│   │       │   │                   │       ├── TableObject.java
│   │       │   │                   │       └── TableWithColumnsObject.java
│   │       │   │                   ├── read/
│   │       │   │                   │   ├── CountQueryController.java
│   │       │   │                   │   ├── ExistsQueryController.java
│   │       │   │                   │   ├── FindOneController.java
│   │       │   │                   │   └── ReadController.java
│   │       │   │                   ├── rpc/
│   │       │   │                   │   ├── FunctionController.java
│   │       │   │                   │   └── ProcedureController.java
│   │       │   │                   ├── sql/
│   │       │   │                   │   └── SQLTemplateController.java
│   │       │   │                   └── update/
│   │       │   │                       └── UpdateController.java
│   │       │   └── resources/
│   │       │       ├── application.yml
│   │       │       ├── banner.txt
│   │       │       └── sql-templates/
│   │       │           ├── count.jte
│   │       │           ├── delete-mssql.jte
│   │       │           ├── delete.jte
│   │       │           ├── exists-mssql.jte
│   │       │           ├── exists.jte
│   │       │           ├── find-one.jte
│   │       │           ├── insert.jte
│   │       │           ├── read-mssql.jte
│   │       │           ├── read-ora-12.jte
│   │       │           ├── read-ora-9.jte
│   │       │           ├── read.jte
│   │       │           ├── update-mssql.jte
│   │       │           └── update.jte
│   │       └── test/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── homihq/
│   │           │           └── db2rest/
│   │           │               ├── BaseIntegrationTest.java
│   │           │               ├── DB2BaseIntegrationTest.java
│   │           │               ├── DB2ContainerConfiguration.java
│   │           │               ├── MariaDBBaseIntegrationTest.java
│   │           │               ├── MariaDBContainerConfiguration.java
│   │           │               ├── MsSQLServerContainerConfiguration.java
│   │           │               ├── MySQLBaseIntegrationTest.java
│   │           │               ├── MySQLContainerConfiguration.java
│   │           │               ├── OracleBaseIntegrationTest.java
│   │           │               ├── OracleContainerConfiguration.java
│   │           │               ├── PostgreSQLBaseIntegrationTest.java
│   │           │               ├── PostgreSQLContainerConfiguration.java
│   │           │               ├── SQLiteBaseIntegrationTest.java
│   │           │               ├── SQLiteContainerConfiguration.java
│   │           │               ├── jdbc/
│   │           │               │   └── rest/
│   │           │               │       └── meta/
│   │           │               │           ├── db/
│   │           │               │           │   ├── DbInfoControllerIntegrationTest.java
│   │           │               │           │   └── DbInfoControllerTest.java
│   │           │               │           └── schema/
│   │           │               │               ├── SchemaControllerIntegrationTest.java
│   │           │               │               └── SchemaControllerTest.java
│   │           │               └── rest/
│   │           │                   ├── DateTimeUtil.java
│   │           │                   ├── cors/
│   │           │                   │   └── CorsTest.java
│   │           │                   ├── db2/
│   │           │                   │   ├── Db2BulkCreateControllerTest.java
│   │           │                   │   ├── Db2CountControllerTest.java
│   │           │                   │   ├── Db2CreateControllerTest.java
│   │           │                   │   ├── Db2DeleteAllTest.java
│   │           │                   │   ├── Db2DeleteControllerTest.java
│   │           │                   │   ├── Db2JsonFileCreateControllerTest.java
│   │           │                   │   ├── Db2ProcedureControllerTest.java
│   │           │                   │   ├── Db2RSqlOperatorReadControllerTest.java
│   │           │                   │   ├── Db2ReadControllerDefaultFetchLimitTest.java
│   │           │                   │   ├── Db2ReadControllerTest.java
│   │           │                   │   ├── Db2TemplateControllerTest.java
│   │           │                   │   └── Db2UpdateControllerTest.java
│   │           │                   ├── docsSwagger/
│   │           │                   │   ├── OpenApiSpecificationNoSecurityTest.java
│   │           │                   │   └── OpenApiSpecificationWithSecurityTest.java
│   │           │                   ├── mariadb/
│   │           │                   │   ├── MariaDBBasicJoinControllerTest.java
│   │           │                   │   ├── MariaDBBulkCreateControllerTest.java
│   │           │                   │   ├── MariaDBCountControllerTest.java
│   │           │                   │   ├── MariaDBCreateControllerTest.java
│   │           │                   │   ├── MariaDBCrossJoinControllerTest.java
│   │           │                   │   ├── MariaDBDeleteAllTest.java
│   │           │                   │   ├── MariaDBDeleteControllerTest.java
│   │           │                   │   ├── MariaDBFunctionControllerTest.java
│   │           │                   │   ├── MariaDBInnerJoinControllerTest.java
│   │           │                   │   ├── MariaDBInnerJoinMultiTableControllerTest.java
│   │           │                   │   ├── MariaDBInnerSelfJoinControllerTest.java
│   │           │                   │   ├── MariaDBJsonFileCreateControllerTest.java
│   │           │                   │   ├── MariaDBProcedureControllerTest.java
│   │           │                   │   ├── MariaDBRSqlOperatorReadControllerTest.java
│   │           │                   │   ├── MariaDBReadControllerDefaultFetchLimitTest.java
│   │           │                   │   ├── MariaDBReadControllerTest.java
│   │           │                   │   ├── MariaDBTemplateControllerTest.java
│   │           │                   │   ├── MariaDBUpdateControllerTest.java
│   │           │                   │   └── MariadbDateTimeAllTest.java
│   │           │                   ├── mssql/
│   │           │                   │   ├── MsSQLBaseIntegrationTest.java
│   │           │                   │   ├── MsSQLBasicJoinControllerTest.java
│   │           │                   │   ├── MsSQLBulkCreateControllerTest.java
│   │           │                   │   ├── MsSQLCountControllerTest.java
│   │           │                   │   ├── MsSQLCreateControllerTest.java
│   │           │                   │   ├── MsSQLCrossJoinControllerTest.java
│   │           │                   │   ├── MsSQLDateTimeAllTest.java
│   │           │                   │   ├── MsSQLDeleteControllerTest.java
│   │           │                   │   ├── MsSQLDeleteWithNotAllowedSafeDeleteControllerTest.java
│   │           │                   │   ├── MsSQLExistsControllerTest.java
│   │           │                   │   ├── MsSQLFindOneControllerTest.java
│   │           │                   │   ├── MsSQLFunctionControllerTest.java
│   │           │                   │   ├── MsSQLInnerJoinControllerTest.java
│   │           │                   │   ├── MsSQLInnerJoinMultiTableControllerTest.java
│   │           │                   │   ├── MsSQLInnerSelfJoinControllerTest.java
│   │           │                   │   ├── MsSQLJsonFileCreateControllerTest.java
│   │           │                   │   ├── MsSQLProcedureControllerTest.java
│   │           │                   │   ├── MsSQLRSqlOperatorReadControllerTest.java
│   │           │                   │   ├── MsSQLReadControllerDefaultFetchLimitTest.java
│   │           │                   │   ├── MsSQLReadControllerTest.java
│   │           │                   │   └── MsSQLUpdateControllerTest.java
│   │           │                   ├── mysql/
│   │           │                   │   ├── CountTwoTablesSameNameDiffSchemaTest.java
│   │           │                   │   ├── CreateTwoTablesSameNameDiffSchemaTest.java
│   │           │                   │   ├── DeleteTwoTablesSameNameDiffSchemaTest.java
│   │           │                   │   ├── MySQLBasicJoinControllerTest.java
│   │           │                   │   ├── MySQLBulkCreateControllerTest.java
│   │           │                   │   ├── MySQLCountControllerTest.java
│   │           │                   │   ├── MySQLCreateControllerTest.java
│   │           │                   │   ├── MySQLCrossJoinControllerTest.java
│   │           │                   │   ├── MySQLDateTimeAllTest.java
│   │           │                   │   ├── MySQLDeleteAllTest.java
│   │           │                   │   ├── MySQLDeleteControllerTest.java
│   │           │                   │   ├── MySQLFunctionControllerTest.java
│   │           │                   │   ├── MySQLInnerJoinControllerTest.java
│   │           │                   │   ├── MySQLInnerJoinMultiTableControllerTest.java
│   │           │                   │   ├── MySQLInnerSelfJoinControllerTest.java
│   │           │                   │   ├── MySQLJsonFileCreateControllerTest.java
│   │           │                   │   ├── MySQLProcedureControllerTest.java
│   │           │                   │   ├── MySQLRSqlOperatorReadControllerTest.java
│   │           │                   │   ├── MySQLReadControllerDefaultFetchLimitTest.java
│   │           │                   │   ├── MySQLReadControllerTest.java
│   │           │                   │   ├── MySQLTemplateControllerTest.java
│   │           │                   │   ├── MySQLUpdateControllerTest.java
│   │           │                   │   ├── ReadTwoTablesSameNameDiffSchemaTest.java
│   │           │                   │   └── UpdateTwoTablesSameNameDiffSchemaTest.java
│   │           │                   ├── oracle/
│   │           │                   │   ├── OracleBasicJoinControllerTest.java
│   │           │                   │   ├── OracleBulkCreateControllerTest.java
│   │           │                   │   ├── OracleCountControllerTest.java
│   │           │                   │   ├── OracleCreateControllerTest.java
│   │           │                   │   ├── OracleCrossJoinControllerTest.java
│   │           │                   │   ├── OracleDateTimeAllTest.java
│   │           │                   │   ├── OracleDeleteAllTest.java
│   │           │                   │   ├── OracleDeleteControllerTest.java
│   │           │                   │   ├── OracleInnerJoinControllerTest.java
│   │           │                   │   ├── OracleInnerJoinMultiTableControllerTest.java
│   │           │                   │   ├── OracleInnerSelfJoinControllerTest.java
│   │           │                   │   ├── OracleJsonFileCreateControllerTest.java
│   │           │                   │   ├── OracleProcedureControllerTest.java
│   │           │                   │   ├── OracleRSqlOperatorReadControllerTest.java
│   │           │                   │   ├── OracleReadControllerDefaultFetchLimitTest.java
│   │           │                   │   ├── OracleReadControllerTest.java
│   │           │                   │   ├── OracleTemplateControllerTest.java
│   │           │                   │   └── OracleUpdateControllerTest.java
│   │           │                   ├── pg/
│   │           │                   │   ├── PGDateTimeAllTest.java
│   │           │                   │   ├── PgBasicJoinControllerTest.java
│   │           │                   │   ├── PgBulkCreateControllerTest.java
│   │           │                   │   ├── PgCountControllerTest.java
│   │           │                   │   ├── PgCreateControllerTest.java
│   │           │                   │   ├── PgCrossJoinControllerTest.java
│   │           │                   │   ├── PgDeleteAllTest.java
│   │           │                   │   ├── PgDeleteControllerTest.java
│   │           │                   │   ├── PgExtraFunctionControllerTest.java
│   │           │                   │   ├── PgFunctionControllerTest.java
│   │           │                   │   ├── PgInnerJoinControllerTest.java
│   │           │                   │   ├── PgInnerJoinMultiTableControllerTest.java
│   │           │                   │   ├── PgInnerSelfJoinControllerTest.java
│   │           │                   │   ├── PgJsonFileCreateControllerTest.java
│   │           │                   │   ├── PgMultiTenancyTest.java
│   │           │                   │   ├── PgProcedureControllerTest.java
│   │           │                   │   ├── PgRSqlOperatorReadControllerTest.java
│   │           │                   │   ├── PgReadControllerDefaultFetchLimitTest.java
│   │           │                   │   ├── PgReadControllerTest.java
│   │           │                   │   ├── PgTemplateControllerTest.java
│   │           │                   │   └── PgUpdateControllerTest.java
│   │           │                   └── sqlite/
│   │           │                       ├── SQLiteBulkCreateControllerTest.java
│   │           │                       ├── SQLiteCountControllerTest.java
│   │           │                       ├── SQLiteCreateControllerTest.java
│   │           │                       ├── SQLiteCrossJoinControllerTest.java
│   │           │                       ├── SQLiteDateTimeAllTest.java
│   │           │                       ├── SQLiteDeleteControllerTest.java
│   │           │                       ├── SQLiteInnerJoinControllerTest.java
│   │           │                       ├── SQLiteJsonFileCreateControllerTest.java
│   │           │                       ├── SQLiteRSqlOperatorReadControllerTest.java
│   │           │                       ├── SQLiteReadControllerTest.java
│   │           │                       ├── SQLiteTemplateControllerTest.java
│   │           │                       └── SQLiteUpdateControllerTest.java
│   │           └── resources/
│   │               ├── application-it-db2.yaml
│   │               ├── application-it-mariadb.yaml
│   │               ├── application-it-mssql.yaml
│   │               ├── application-it-mysql.yaml
│   │               ├── application-it-oracle.yaml
│   │               ├── application-it-pg-mutlitenancy.yaml
│   │               ├── application-it-pg.yaml
│   │               ├── application-it-sqlite.yaml
│   │               ├── auth-apiKey-test.yaml
│   │               ├── auth-basic.yaml
│   │               ├── db2/
│   │               │   ├── db2-sakila-data.sql
│   │               │   └── db2-sakila.sql
│   │               ├── junit-platform.properties
│   │               ├── mariadb/
│   │               │   ├── mariadb-sakila-data.sql
│   │               │   └── mariadb-sakila.sql
│   │               ├── mssql/
│   │               │   ├── mssql-sakila-data.sql
│   │               │   └── mssql-sakila.sql
│   │               ├── mysql/
│   │               │   ├── mysql-sakila-data.sql
│   │               │   ├── mysql-sakila.sql
│   │               │   └── mysql-wakila-all.sql
│   │               ├── oracle/
│   │               │   ├── oracle-sakila-data.sql
│   │               │   └── oracle-sakila.sql
│   │               ├── pg/
│   │               │   ├── pg-sakila-functions.sql
│   │               │   ├── postgres-sakila-data.sql
│   │               │   └── postgres-sakila.sql
│   │               ├── sqlite/
│   │               │   ├── sqlite-sakila-data.sql
│   │               │   └── sqlite-sakila.sql
│   │               └── testdata/
│   │                   ├── BULK_CREATE_ACTOR_REQUEST.json
│   │                   ├── BULK_CREATE_DIRECTOR_BAD_REQUEST.json
│   │                   ├── BULK_CREATE_DIRECTOR_REQUEST.json
│   │                   ├── BULK_CREATE_FILM_BAD_REQUEST.json
│   │                   ├── BULK_CREATE_FILM_REQUEST.json
│   │                   ├── BULK_CREATE_REVIEW_REQUEST.json
│   │                   ├── BULK_RESULT_ACTOR_QUERY.json
│   │                   ├── CREATE_ACTOR_REQUEST.json
│   │                   ├── CREATE_DIRECTOR_REQUEST.json
│   │                   ├── CREATE_EMP_REQUEST.json
│   │                   ├── CREATE_FILM_BAD_REQUEST_CSV.csv
│   │                   ├── CREATE_FILM_REQUEST.json
│   │                   ├── CREATE_FILM_REQUEST_CSV.csv
│   │                   ├── CREATE_FILM_REQUEST_ERROR.json
│   │                   ├── CREATE_FILM_REQUEST_MISSING_PAYLOAD.json
│   │                   ├── CREATE_USER_REQUEST.json
│   │                   ├── CREATE_VANITY_VAN_REQUEST.json
│   │                   ├── CROSS_JOIN_TOPS.json
│   │                   ├── CROSS_JOIN_TOPS_MSSQL.json
│   │                   ├── CROSS_JOIN_TOPS_ORACLE.json
│   │                   ├── CROSS_JOIN_TOPS_PG.json
│   │                   ├── CROSS_JOIN_USERS.json
│   │                   ├── CROSS_JOIN_USERS_MSSQL.json
│   │                   ├── CROSS_JOIN_USERS_ORACLE.json
│   │                   ├── CROSS_JOIN_USERS_PG.json
│   │                   ├── EMPTY_ACTOR_QUERY.json
│   │                   ├── INNER_JOIN.json
│   │                   ├── INNER_JOIN_MULTI_TABLE.json
│   │                   ├── INNER_JOIN_MULTI_TABLE_ORACLE.json
│   │                   ├── INNER_JOIN_ORACLE.json
│   │                   ├── INNER_SELF_JOIN.json
│   │                   ├── INNER_SELF_JOIN_ORACLE.json
│   │                   ├── LEFT_JOIN.json
│   │                   ├── LEFT_JOIN_ORACLE.json
│   │                   ├── RIGHT_JOIN.json
│   │                   ├── RIGHT_JOIN_ORACLE.json
│   │                   ├── SINGLE_RESULT_ACTOR_QUERY.json
│   │                   ├── UPDATE_ACTOR_REQUEST.json
│   │                   ├── UPDATE_EMPLOYEE_REQUEST.json
│   │                   ├── UPDATE_FILMS_REQUEST.json
│   │                   ├── UPDATE_FILM_REQUEST.json
│   │                   ├── UPDATE_NON_EXISTING_FILM_REQUEST.json
│   │                   ├── UPDATE_NON_EXISTING_TABLE.json
│   │                   ├── actor.json
│   │                   ├── actor5mb.json
│   │                   ├── director.json
│   │                   ├── sql-db2/
│   │                   │   ├── conditional_render_and_op.sql
│   │                   │   ├── conditional_render_join.sql
│   │                   │   ├── select_all.sql
│   │                   │   ├── select_by_id.sql
│   │                   │   └── select_by_id_is_required.sql
│   │                   ├── sql-mariadb/
│   │                   │   ├── conditional_render_and_op.sql
│   │                   │   ├── conditional_render_join.sql
│   │                   │   ├── select_all.sql
│   │                   │   ├── select_by_id.sql
│   │                   │   └── select_by_id_is_required.sql
│   │                   ├── sql-mysql/
│   │                   │   ├── conditional_render_and_op.sql
│   │                   │   ├── conditional_render_join.sql
│   │                   │   ├── select_all.sql
│   │                   │   ├── select_by_id.sql
│   │                   │   └── select_by_id_is_required.sql
│   │                   ├── sql-oracle/
│   │                   │   ├── conditional_render_and_op.sql
│   │                   │   ├── conditional_render_join.sql
│   │                   │   ├── select_all.sql
│   │                   │   ├── select_by_id.sql
│   │                   │   └── select_by_id_is_required.sql
│   │                   ├── sql-pg/
│   │                   │   ├── conditional_render_and_op.sql
│   │                   │   ├── conditional_render_join.sql
│   │                   │   ├── delete_from_content.sql
│   │                   │   ├── insert_from_content.sql
│   │                   │   ├── select_all.sql
│   │                   │   ├── select_by_id.sql
│   │                   │   ├── select_by_id_from_content.sql
│   │                   │   ├── select_by_id_is_required.sql
│   │                   │   └── update_by_id_from_content.sql
│   │                   └── sql-sqlite/
│   │                       ├── conditional_render_and_op.sql
│   │                       ├── conditional_render_join.sql
│   │                       ├── select_all.sql
│   │                       └── select_by_id.sql
│   ├── pom.xml
│   └── rest-common/
│       ├── pom.xml
│       └── src/
│           └── main/
│               └── java/
│                   └── com/
│                       └── homihq/
│                           └── db2rest/
│                               ├── bulk/
│                               │   ├── CSVDataProcessor.java
│                               │   ├── DataProcessor.java
│                               │   ├── FileStreamObserver.java
│                               │   ├── FileSubject.java
│                               │   ├── JSONDataProcessor.java
│                               │   └── JsonFileDataProcessor.java
│                               ├── config/
│                               │   ├── CorsConfigProperties.java
│                               │   ├── DateTimeConfigProperties.java
│                               │   ├── DateTimeConfiguration.java
│                               │   ├── Db2RestConfigProperties.java
│                               │   ├── MultiTenancy.java
│                               │   └── OpenAPIConfiguration.java
│                               ├── dtos/
│                               │   └── BulkContext.java
│                               ├── exception/
│                               │   └── GlobalExceptionHandler.java
│                               └── multidb/
│                                   ├── DatabaseConnectionDetail.java
│                                   ├── DatabaseProperties.java
│                                   └── EnvironmentProperties.java
├── db2rest-auth/
│   ├── pom.xml
│   └── src/
│       └── main/
│           ├── java/
│           │   └── com/
│           │       └── homihq/
│           │           └── db2rest/
│           │               └── auth/
│           │                   ├── AuthConfiguration.java
│           │                   ├── AuthFilter.java
│           │                   ├── data/
│           │                   │   ├── ApiExcludedResource.java
│           │                   │   ├── ApiKey.java
│           │                   │   ├── ApiResource.java
│           │                   │   ├── AuthData.java
│           │                   │   ├── ResourceRole.java
│           │                   │   ├── RoleDataFilter.java
│           │                   │   ├── User.java
│           │                   │   └── UserDetail.java
│           │                   ├── datalookup/
│           │                   │   ├── ApiAuthDataLookup.java
│           │                   │   ├── AuthDataLookup.java
│           │                   │   ├── AuthDataProperties.java
│           │                   │   ├── FileAuthDataLookup.java
│           │                   │   └── NoAuthdataLookup.java
│           │                   ├── exception/
│           │                   │   └── AuthException.java
│           │                   ├── provider/
│           │                   │   ├── AbstractAuthProvider.java
│           │                   │   ├── apikey/
│           │                   │   │   └── ApiKeyAuthProvider.java
│           │                   │   ├── basic/
│           │                   │   │   └── BasicAuthProvider.java
│           │                   │   └── jwt/
│           │                   │       ├── JwtAuthProvider.java
│           │                   │       └── JwtProperties.java
│           │                   └── unkey/
│           │                       ├── UnKeyAuthConfiguration.java
│           │                       ├── UnKeyAuthFilter.java
│           │                       ├── service/
│           │                       │   └── UnKeyAuthService.java
│           │                       └── to/
│           │                           ├── UnKeyVerifyRequest.java
│           │                           └── UnKeyVerifyResponse.java
│           └── resources/
│               ├── auth-sample-api-key.yml
│               ├── auth-sample.json
│               └── auth-sample.yml
├── db2rest-core/
│   ├── db2rest-common/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── com/
│   │                   └── homihq/
│   │                       └── db2rest/
│   │                           ├── core/
│   │                           │   ├── dto/
│   │                           │   │   ├── CountResponse.java
│   │                           │   │   ├── CreateBulkResponse.java
│   │                           │   │   ├── CreateResponse.java
│   │                           │   │   ├── DeleteResponse.java
│   │                           │   │   ├── ExistsResponse.java
│   │                           │   │   └── UpdateResponse.java
│   │                           │   └── exception/
│   │                           │       ├── AuthenticationFailedException.java
│   │                           │       ├── DeleteOpNotAllowedException.java
│   │                           │       ├── GenericDataAccessException.java
│   │                           │       ├── InvalidColumnException.java
│   │                           │       ├── InvalidOperatorException.java
│   │                           │       ├── InvalidTableException.java
│   │                           │       ├── PathVariableNamesMissingException.java
│   │                           │       ├── PathVariableValuesMissingException.java
│   │                           │       ├── PlaceholderConstraintException.java
│   │                           │       ├── RpcException.java
│   │                           │       ├── SqlTemplateNotFoundException.java
│   │                           │       ├── SqlTemplateReadException.java
│   │                           │       └── UnsupportedConstraintException.java
│   │                           └── multidb/
│   │                               └── DatabaseContextHolder.java
│   ├── pom.xml
│   ├── rdbms-common/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── com/
│   │                   └── db2rest/
│   │                       └── jdbc/
│   │                           └── dialect/
│   │                               ├── Dialect.java
│   │                               └── model/
│   │                                   ├── ArrayTypeValueHolder.java
│   │                                   ├── Database.java
│   │                                   ├── DbAlias.java
│   │                                   ├── DbColumn.java
│   │                                   ├── DbJoin.java
│   │                                   ├── DbSort.java
│   │                                   ├── DbTable.java
│   │                                   └── DbWhere.java
│   └── rdbms-support/
│       ├── pom.xml
│       └── src/
│           ├── main/
│           │   └── java/
│           │       └── com/
│           │           └── homihq/
│           │               └── db2rest/
│           │                   └── jdbc/
│           │                       ├── JdbcManager.java
│           │                       ├── JdbcOperationService.java
│           │                       ├── core/
│           │                       │   ├── DbOperationService.java
│           │                       │   ├── SimpleRowMapper.java
│           │                       │   └── service/
│           │                       │       ├── BulkCreateService.java
│           │                       │       ├── CountQueryService.java
│           │                       │       ├── CreateService.java
│           │                       │       ├── DeleteService.java
│           │                       │       ├── ExistsQueryService.java
│           │                       │       ├── FindOneService.java
│           │                       │       ├── FunctionService.java
│           │                       │       ├── JdbcBulkCreateService.java
│           │                       │       ├── JdbcCountQueryService.java
│           │                       │       ├── JdbcCreateService.java
│           │                       │       ├── JdbcDeleteService.java
│           │                       │       ├── JdbcExistsQueryService.java
│           │                       │       ├── JdbcFindOneService.java
│           │                       │       ├── JdbcFunctionService.java
│           │                       │       ├── JdbcProcedureService.java
│           │                       │       ├── JdbcReadService.java
│           │                       │       ├── JdbcUpdateService.java
│           │                       │       ├── JinJavaTemplateExecutorService.java
│           │                       │       ├── ProcedureService.java
│           │                       │       ├── ReadService.java
│           │                       │       ├── SQLTemplateExecutorService.java
│           │                       │       ├── SubRoutine.java
│           │                       │       └── UpdateService.java
│           │                       ├── dto/
│           │                       │   ├── BindVariable.java
│           │                       │   ├── CreateContext.java
│           │                       │   ├── DeleteContext.java
│           │                       │   ├── FnUtil.java
│           │                       │   ├── InsertableColumn.java
│           │                       │   ├── JoinDetail.java
│           │                       │   ├── Placeholder.java
│           │                       │   ├── QueryRequest.java
│           │                       │   ├── ReadContext.java
│           │                       │   └── UpdateContext.java
│           │                       ├── multidb/
│           │                       │   ├── DbDetailHolder.java
│           │                       │   └── RoutingDataSource.java
│           │                       ├── processor/
│           │                       │   ├── JoinProcessor.java
│           │                       │   ├── OrderByProcessor.java
│           │                       │   ├── ReadProcessor.java
│           │                       │   ├── RootTableFieldProcessor.java
│           │                       │   ├── RootTableProcessor.java
│           │                       │   └── RootWhereProcessor.java
│           │                       ├── rsql/
│           │                       │   ├── operator/
│           │                       │   │   ├── CustomRSQLOperators.java
│           │                       │   │   ├── OperatorHandler.java
│           │                       │   │   ├── OperatorMap.java
│           │                       │   │   ├── RSQLOperatorHandlers.java
│           │                       │   │   └── handler/
│           │                       │   │       ├── EndWithOperatorHandler.java
│           │                       │   │       ├── EqualToOperatorHandler.java
│           │                       │   │       ├── GreaterThanEqualToOperatorHandler.java
│           │                       │   │       ├── GreaterThanOperatorHandler.java
│           │                       │   │       ├── InOperatorHandler.java
│           │                       │   │       ├── IsNotNullOperatorHandler.java
│           │                       │   │       ├── IsNullOperatorHandler.java
│           │                       │   │       ├── JsonContainInArrayOperatorHandler.java
│           │                       │   │       ├── JsonContainOperatorHandler.java
│           │                       │   │       ├── JsonbContainOperatorHandler.java
│           │                       │   │       ├── JsonbEqualToOperatorHandler.java
│           │                       │   │       ├── JsonbKeyExistsOperatorHandler.java
│           │                       │   │       ├── LessThanEqualToOperatorHandler.java
│           │                       │   │       ├── LessThanOperatorHandler.java
│           │                       │   │       ├── LikeOperatorHandler.java
│           │                       │   │       ├── NotEqualToOperatorHandler.java
│           │                       │   │       ├── NotInOperatorHandler.java
│           │                       │   │       ├── NotLikeOperatorHandler.java
│           │                       │   │       └── StartWithOperatorHandler.java
│           │                       │   ├── parser/
│           │                       │   │   └── RSQLParserBuilder.java
│           │                       │   ├── resolver/
│           │                       │   │   └── CrossTableColumnResolver.java
│           │                       │   └── visitor/
│           │                       │       └── BaseRSQLVisitor.java
│           │                       ├── sql/
│           │                       │   ├── ColumnLabel.java
│           │                       │   ├── DB2DataExtraction.java
│           │                       │   ├── DbMeta.java
│           │                       │   ├── JdbcMetaDataProvider.java
│           │                       │   ├── JdbcTypeJavaClassMappings.java
│           │                       │   ├── MariaDBDataExtraction.java
│           │                       │   ├── MetaDataExtraction.java
│           │                       │   ├── MetaDataTable.java
│           │                       │   ├── MsSQLServerMetaDataExtraction.java
│           │                       │   ├── MySQLDataExtraction.java
│           │                       │   ├── OracleMetaDataExtraction.java
│           │                       │   ├── PostgreSQLDataExclusion.java
│           │                       │   ├── SQLiteDataExtraction.java
│           │                       │   ├── SqlCreatorTemplate.java
│           │                       │   └── SqlTypes.java
│           │                       ├── tsid/
│           │                       │   └── TSIDProcessor.java
│           │                       ├── util/
│           │                       │   └── AliasGenerator.java
│           │                       └── validator/
│           │                           ├── ConstraintValidator.java
│           │                           ├── CustomPlaceholderValidators.java
│           │                           └── impl/
│           │                               ├── IsRequiredValidator.java
│           │                               └── IsUUIDValidator.java
│           └── test/
│               └── java/
│                   └── com/
│                       └── homihq/
│                           └── db2rest/
│                               └── jdbc/
│                                   ├── core/
│                                   │   └── service/
│                                   │       └── JdbcCreateServiceTest.java
│                                   ├── dto/
│                                   │   └── FnUtilTest.java
│                                   ├── util/
│                                   │   └── AliasGeneratorTest.java
│                                   └── validator/
│                                       ├── CustomPlaceholderValidatorsTest.java
│                                       └── impl/
│                                           ├── IsRequiredValidatorTest.java
│                                           └── IsUUIDValidatorTest.java
├── db2rest-dialects/
│   ├── db2-dialect/
│   │   ├── README.md
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── db2rest/
│   │       │               └── jdbc/
│   │       │                   └── dialect/
│   │       │                       └── DB2RestDB2Dialect.java
│   │       └── test/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── db2rest/
│   │           │           └── jdbc/
│   │           │               └── dialect/
│   │           │                   ├── DB2RestDB2DialectTest.java
│   │           │                   └── TestConfiguration.java
│   │           └── resources/
│   │               └── application-test.yml
│   ├── mariadb-dialect/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── com/
│   │                   └── db2rest/
│   │                       └── jdbc/
│   │                           └── dialect/
│   │                               └── MariaDBDialect.java
│   ├── mssql-dialect/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── com/
│   │                   └── db2rest/
│   │                       └── jdbc/
│   │                           └── dialect/
│   │                               └── MsSQLServerDialect.java
│   ├── mysql-dialect/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── com/
│   │                   └── db2rest/
│   │                       └── jdbc/
│   │                           └── dialect/
│   │                               └── DB2RestMySQLDialect.java
│   ├── oracle-dialect/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── com/
│   │                   └── db2rest/
│   │                       └── jdbc/
│   │                           └── dialect/
│   │                               └── OracleDialect.java
│   ├── oracle9i-dialect/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── com/
│   │                   └── db2rest/
│   │                       └── jdbc/
│   │                           └── dialect/
│   │                               └── OracleDialect.java
│   ├── pg-dialect/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── com/
│   │                   └── db2rest/
│   │                       └── jdbc/
│   │                           └── dialect/
│   │                               ├── PostGreSQLDialect.java
│   │                               └── driver/
│   │                                   ├── EnvVarSSLSocketFactory.java
│   │                                   └── PgSingleCertValidatingFactory.java
│   ├── pom.xml
│   └── sqlite-dialect/
│       ├── pom.xml
│       └── src/
│           └── main/
│               └── java/
│                   └── com/
│                       └── db2rest/
│                           └── jdbc/
│                               └── dialect/
│                                   └── SQLiteDialect.java
├── db2rest-oas3.json
├── design/
│   └── insert.md
├── docker-compose/
│   ├── db2/
│   │   ├── README.md
│   │   ├── docker-compose.yml
│   │   └── init/
│   │       └── 01-create-schema.sql
│   ├── mariadb/
│   │   ├── api-interaction.sh
│   │   ├── docker-compose.yml
│   │   ├── init/
│   │   │   └── 01-init.sql
│   │   └── run.sh
│   ├── mysql/
│   │   ├── api-interaction.sh
│   │   ├── docker-compose.yml
│   │   ├── init/
│   │   │   └── 01-init.sql
│   │   └── run.sh
│   ├── oracle/
│   │   ├── api-interaction.sh
│   │   ├── docker-compose.yml
│   │   ├── init/
│   │   │   └── 01-init.sql
│   │   └── run.sh
│   ├── postgresql/
│   │   ├── api-interaction.sh
│   │   ├── docker-compose.yml
│   │   ├── init/
│   │   │   └── 01-init.sql
│   │   └── run.sh
│   └── sqlserver/
│       ├── api-interaction.sh
│       ├── docker-compose.yml
│       ├── init/
│       │   └── 01-init.sql
│       └── run.sh
├── fed/
│   └── federation.md
├── funding.json
├── integration-test-guideline.md
├── mvnw
├── mvnw.cmd
└── pom.xml

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitattributes
================================================
src/test/resources/mysql/mysql-sakila.sql linguist-generated=true
src/test/resources/mysql/mysql-sakila-insert-data.sql linguist-generated=true

src/test/resources/pg/postgres-sakila.sql linguist-generated=true

# Always keep shell files with LF endings to avoid issues with runnning scripts in Windows WSL
# that need them to stay with LF endings and not CRLF.  WSL is a Linux environment so needs LF endings.
.sh text eol=lf


================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms

github: [9tigerio]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
polar: # Replace with a single Polar username
buy_me_a_coffee: # Replace with a single Buy Me a Coffee username
thanks_dev: # Replace with a single thanks.dev username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']


================================================
FILE: .github/RELEASING.md
================================================
# General
We use [semantic versioning](https://semver.org).

We publish our snapshots on [GitHub Packages](https://github.com/orgs/9tigerio/packages?repo_name=db2rest).

We publish our releases on [Maven Central Portal](https://central.sonatype.com/) (Sonatype) under our namespace [io.9tiger](https://central.sonatype.com/namespace/io.9tiger)

We publish a **snapshot** `-SNAPSHOT` version at any time by using the corresponding GitHub Action.

We publish a **release** version to [Maven Central Portal](https://central.sonatype.com/namespace/io.9tiger) at any time by using the corresponding GitHub Action.

After a release, we can also build and publish a Docker container image to our DockerHub (working account for now: [kdhrubo](https://hub.docker.com/r/kdhrubo/db2rest)) via the corresponding GitHub Action.

# GPG Key signing steps
Follow the guide at [Maven Central Portal distributing your public key](https://central.sonatype.org/publish/requirements/gpg/#distributing-your-public-key)

# Snapshots

Using GitHub workflow `.github/workflows/snapshot.yml`

# Make a New Release

Using GitHub workflow `.github/workflows/maven-central-publish.yml`

# Make a Docker image

Using GitHub workflow `.github/workflows/dockerhub-publish.yml` which will download the Maven Central packaged released version and build a Docker image and publish to DockerHub


================================================
FILE: .github/workflows/build-verify.yml
================================================
name: Build & Verify

on:
  pull_request:
    branches:
      - master
  push:
    branches:
      - 'feature/**'
  workflow_dispatch:

env: 
  VERSION: '1.6.6-SNAPSHOT'

permissions: read-all

jobs:
  build:
    name: Maven Build & Test
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v5
      - name: Set up JDK 21
        uses: actions/setup-java@v5
        with:
          java-version: '21'
          distribution: 'liberica'
          cache: 'maven'

      - name: Build & Test
        run: ./mvnw --quiet -Drevision=$VERSION --no-transfer-progress -B verify --file pom.xml
      
      # Optional: Uploads the full dependency graph to GitHub to improve the quality of Dependabot alerts this repository can receive
      #- name: Update dependency graph
      #  uses: advanced-security/maven-dependency-submission-action@571e99aab1055c2e71a1e2309b9691de18d6b7d6


================================================
FILE: .github/workflows/dockerhub-publish.yml
================================================
# This workflow will download the Maven Central package and
# build Docker image and publish to DockerHub  

name: Publish to DockerHub

on:
  workflow_dispatch:
    inputs:
      DB2REST_VERSION:
        description: 'DB2REST version that is already published in Maven Central'
        required: true
        default: '1.3.0'
    
  # release:
  #   types: [created]

jobs:
  build_docker_image:

    runs-on: ubuntu-latest
    env:
      DB2REST_VERSION: ${{ github.event.inputs.DB2REST_VERSION }}
    permissions:
      contents: read
      packages: write

    steps:
      - name: Login to DockerHub
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      # In this following step, we use our Dockerfile
      # to build the image (which has a `ADD` line to automatically
      # download the versioned JAR file from Central Portal and
      # adds it into a layer of the image)
      - name: Build and push Docker images
        uses: docker/build-push-action@v6
        with:
      # We use default Git context to build the Docker image,
      # instead of PATH context `context: .`
          push: true
          tags: kdhrubo/db2rest:v${{ github.run_number }}, kdhrubo/db2rest:latest
          build-args: DB2REST_VERSION=${{ env.DB2REST_VERSION }}


================================================
FILE: .github/workflows/maven-central-publish.yml
================================================
# This workflow will build a package using Maven and then publish it to Central Portal (Sonatype)
# For more information see: https://github.com/actions/setup-java/blob/main/docs/advanced-usage.md#apache-maven-with-a-settings-path

name: Maven Default Publish

on:
  release:
    types: [created]

jobs:
  build_and_test:
    if: "!contains(github.event.head_commit.message, 'skip ci')"
    
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write

    steps:
    - uses: actions/checkout@v4
      name: Checkout code for Tag
      with:
        ref: ${{ github.event.release.tag_name }}
    - name: Echo Tag
      run: "echo 'CHECKED OUT TAG: ${{ github.event.release.tag_name }}'"
    - name: Set up JDK 21 and maven settings.xml
      uses: actions/setup-java@v4
      with:
        java-version: '21'
        distribution: 'liberica'
        cache: 'maven'
        server-username: MAVEN_USERNAME
        server-password: MAVEN_PASSWORD
        server-id: central
      
      # TROUBLESHOOTING: We can temporarily skip upload & publishing to Maven Central in here
      # by setting the `run: mvn` line's last -DskipPublishing property to true
    - name: Build & Publish package DB2Rest to Central
      run: mvn --quiet -Drevision=${{ github.event.release.tag_name }} --no-transfer-progress -B deploy -P release -DskipTests -DskipPublishing=false
      # below we use env for passing GPG stuff since the signing type is bouncy castle (bc)
      # set in parent pom's maven-gpg-plugin configuration and doesn't need gpg agent.
      env:
        MAVEN_USERNAME: ${{ secrets.MAVEN_CENTRAL_USERNAME }}
        MAVEN_PASSWORD: ${{ secrets.MAVEN_CENTRAL_PASSWORD }}
        MAVEN_GPG_PASSPHRASE: ${{ secrets.MAVEN_GPG_PASSPHRASE }}
        MAVEN_GPG_KEY: ${{ secrets.MAVEN_GPG_KEY }}

      # we unzip the central-bundle.zip so that we can access
      # the db2rest JAR file path easily for Docker image build
    - name: Unzip the central-bundle.zip & output JAR_FILE
      id: unzip
      run: |
        mkdir staging
        cp target/central-publishing/central-bundle.zip staging
        unzip staging/central-bundle.zip -d staging
        echo "JAR_FILE=staging/io/9tiger/api-rest/${{ github.event.release.tag_name }}/api-rest-${{ github.event.release.tag_name}}.jar" >> $GITHUB_ENV

    - run: ls staging/io/9tiger/db2rest/${{ github.event.release.tag_name }}    
    - run: ls ${{ env.JAR_FILE }}

    - name: Archive central-bundle JAR artifacts
      uses: actions/upload-artifact@v4
      with:
        path: staging/central-bundle.zip

    # - name: Build & Publish package Oracle9i to Central
    #   run: mvn -Drevision=${{ github.event.release.tag_name }} --no-transfer-progress -B deploy -P release --file api-rest/pom-oracle9i.xml -DskipTests
    #   env:
    #     MAVEN_USERNAME: ${{ secrets.MAVEN_CENTRAL_USERNAME }}
    #     MAVEN_PASSWORD: ${{ secrets.MAVEN_CENTRAL_PASSWORD }}
    #     MAVEN_GPG_PASSPHRASE: ${{ secrets.MAVEN_GPG_PASSPHRASE }}
    #     MAVEN_GPG_KEY: ${{ secrets.MAVEN_GPG_KEY }}
    
    - name: Login to DockerHub
      uses: docker/login-action@v3
      with:
        username: ${{ secrets.DOCKERHUB_USERNAME }}
        password: ${{ secrets.DOCKERHUB_TOKEN }}

    - name: Build and push Docker image
      uses: docker/build-push-action@v6
      with:
        context: "${{ github.workspace }}"
        push: true
        tags: kdhrubo/db2rest:v${{ github.event.release.tag_name }}, kdhrubo/db2rest:latest
        build-args: |
          JAR_FILE=${{ env.JAR_FILE }}


================================================
FILE: .github/workflows/oracle9i-central-publish.yml
================================================
# This workflow will build a package using Maven and then publish it to GitHub packages when a release is created
# For more information see: https://github.com/actions/setup-java/blob/main/docs/advanced-usage.md#apache-maven-with-a-settings-path

name: Oracle 9i Publish to Maven

on:
  workflow_dispatch:
    inputs:
      version:
        description: 'Version to publish, such as 1.3.0'
        required: true
      ref:
        description: 'The Branch, Tag or SHA to checkout & publish'
        required: true

jobs:
  build:

    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write

    steps:
    - uses: actions/checkout@v4
      name: Checkout code for Tag
      with:
        ref: ${{ github.event.inputs.ref }}
    - name: Echo Tag
      run: "echo 'CHECKED OUT TAG: ${{ github.event.inputs.ref }}'"
    - name: Set up JDK 21 and maven settings.xml
      uses: actions/setup-java@v4
      with:
        java-version: '21'
        distribution: 'liberica'
        cache: 'maven'
        server-username: MAVEN_USERNAME
        server-password: MAVEN_PASSWORD
        server-id: central

    - name: Publish package Oracle9i
      run: mvn -Drevision=${{ github.event.inputs.version }} --no-transfer-progress -B deploy -P release --file api-rest/pom-oracle9i.xml -DskipTests
      env:
        MAVEN_USERNAME: ${{ secrets.MAVEN_CENTRAL_USERNAME }}
        MAVEN_PASSWORD: ${{ secrets.MAVEN_CENTRAL_PASSWORD }}
        MAVEN_GPG_PASSPHRASE: ${{ secrets.MAVEN_GPG_PASSPHRASE }}
        MAVEN_GPG_KEY: ${{ secrets.MAVEN_GPG_KEY }}


================================================
FILE: .github/workflows/snapshot.yml
================================================
name: Publish Snapshot to GitHub

on:
  workflow_dispatch:
    inputs:
      version:
        description: 'Version to publish, such as 1.3.0-SNAPSHOT'
        required: true
        default: '1.3.1-SNAPSHOT'
      ref:
        description: 'The Branch, Tag or SHA to use to publish Snapshot'
        required: false
        default: 'master'

permissions:
  contents: write
  packages: write

jobs:
  build_snapshot:
    name: Build Snapshot
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v4
        with:
          ref: ${{ github.event.inputs.ref }}

      - name: Set up Java 21 and set GitHub for publishing in settings.xml
        uses: actions/setup-java@v4
        with:
          distribution: 'liberica'
          java-version: 21
          cache: 'maven'
          server-id: github

      - name: Compile & Deploy to GitHub Packages
        run: mvn -Drevision=${{ github.event.inputs.version }} --no-transfer-progress -B deploy -DdeployAtEnd --file pom.xml
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      - name: Update dependency graph
        uses: advanced-security/maven-dependency-submission-action@v4.1.1


================================================
FILE: .gitignore
================================================
HELP.md
target/
.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
.flattened-pom.xml
pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
pom.xml.next
release.properties
dependency-reduced-pom.xml
buildNumber.properties
.mvn/timing.properties
.flattened-pom.xml
db2rest.jar

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr

### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/

### VS Code ###
.vscode/

## jte ##
/api-rest/jte-classes/**
/jte-classes/**
/env/


================================================
FILE: .mvn/wrapper/maven-wrapper.properties
================================================
# 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.
wrapperVersion=3.3.2
distributionType=only-script
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip


================================================
FILE: CONTRIBUTING.md
================================================
Thanks for showing interest to contribute to DB2Rest 💖, you rock!

When it comes to open source, there are different ways you can contribute, all
of which are valuable. Here's a few guidelines that should help you as you
prepare your contribution.

## Setup the Project

The following steps will get you up and running to contribute to DB2Rest:

1. Fork the repo (click the <kbd>Fork</kbd> button at the top right of
   [this page on our GitHub](https://github.com/9tigerio/db2rest))

2. Clone your fork locally.
    
   Use your IDE's Git features, or a terminal like this:
    ```sh
    git clone https://github.com/<your_github_username>/db2rest.git
    cd db2rest
    ```

1. Setup all the dependencies and packages by running:
   ```sh
   mvnw compile
   ```
   This command will install dependencies using the [maven wrapper](https://maven.apache.org/wrapper/) script.

> If you run into any issues during this step, kindly reach out to the DB2Rest 
> team here: [![](https://dcbadge.vercel.app/api/server/kqeDatPGwU?theme=discord)](https://discord.gg/kqeDatPGwU)

## Development
DB2Rest uses a [monorepo](https://en.wikipedia.org/wiki/Monorepo) structure. To improve our development process, we've set up tooling and systems.
DB2Rest uses a [Maven modular project structure](https://maven.apache.org/guides/mini/guide-multiple-modules-4.html) with a parent `pom.xml` file, and child pom's in subfolders.

### Tooling

- [Maven](https://maven.apache.org/) to manage packages and dependencies.
- [Docker](https://docs.docker.com/) We use Docker for spinning up test containers used in testing.
  On Linux, ensure docker is installed.
  On Windows, [Docker Desktop](https://www.docker.com/products/docker-desktop/) is needed.  
- [Spring Test](https://docs.spring.io/spring-framework/reference/testing/integration.html) for integration testing of our Java components.

### Testing

Database test configurations are found under: `\db2rest\api-rest\src\test\java\com\homihq\db2rest`.

### Commands

**`mvnw build`**: builds and compiles all DB2Rest packages into `/target` folders.

**`mvnw test`**: run tests for all DB2Rest packages.

**`mvnw verify`**: builds and then starts integration testing using test containers on docker.

### Release Process

See [.github/RELEASING.md](https://github.com/9tigerio/db2rest/blob/master/.github/RELEASING.md)

## Think you found a bug?

Create a [New GitHub Issue](https://github.com/9tigerio/db2rest/issues/new/choose) and please conform to the issue template and provide a clear path to reproduction
with a code example. 

## Proposing new or changed API?

Please provide thoughtful comments and some sample API code. Proposals that
don't line up with our roadmap or don't have a thoughtful explanation will be
closed.

## Making a Pull Request?

Pull requests need only the :+1: of two or more collaborators to be merged; when
the PR author is a collaborator, that counts as one.

### Commit Convention

Before you create a Pull Request, please check whether your commits comply with
the commit conventions used in this repository.

When you create a commit we kindly ask you to follow the convention
`category(scope or module): message` in your commit message while using one of
the following categories:

- `feature`: all changes that introduce completely new code or new
  features
- `fix`: changes that fix a bug (ideally you will additionally reference an
  issue if present)
- `refactor`: any code related change that is not a fix nor a feature
- `docs`: changing existing or creating new documentation (i.e. README, Javadocs, code
  comments, etc.
- `build`: all changes regarding the build of the software, changes to
  dependencies or the addition of new dependencies
- `test`: all changes regarding tests (adding new tests or changing existing
  ones)
- `ci`: all changes regarding the configuration of continuous integration (i.e.
  github actions, ci system)
- `chore`: all changes to the repository that do not fit into any of the above
  categories

If you are interested in the detailed specification you can visit
https://www.conventionalcommits.org/ or check out the
[Angular Commit Message Guidelines](https://github.com/angular/angular/blob/22b96b9/CONTRIBUTING.md#-commit-message-guidelines).

### Steps to PR

1. Fork of the DB2Rest repository and clone your fork

2. Create a new branch out of the `master` branch. We follow the branch name convention
   `[type/scope]`. For example `fix/rest-common` or `docs/api-rest`. `type`
   can be either `docs`, `fix`, `feat`, `build`, or any other conventional
   commit type. `scope` is just a short id that describes the scope of work.

3. Make and commit your changes following the
   [commit convention](https://github.com/9tigerio/db2rest/blob/master/CONTRIBUTING.md#commit-convention).
   As you develop, you can run `mvnw <module> compile` and
   `mvnw <module> test` to make sure everything works as expected. Please
   note that you might have to run `mvnw compile` first in order to build all
   dependencies for testing.

### Tests

All commits that fix bugs or add features SHOULD add a test.

## Want to write a blog post or tutorial

That would be amazing! Reach out to the core team here:
https://discord.gg/kqeDatPGwU. We would love to support you any way we can.

## Want to help improve the docs?

Our docsite lives in a
[separate repo](https://github.com/9tigerio/db2rest-web). If you're
interested in contributing to the documentation, check out the
[docsite contribution guide](https://github.com/9tigerio/db2rest-web/blob/master/CONTRIBUTING.md).

## License

By contributing your code to the DB2Rest GitHub repository, you agree to
license your contribution under the [Apache-2.0 license](https://github.com/9tigerio/db2rest/blob/master/LICENSE).


================================================
FILE: Dockerfile
================================================
FROM bellsoft/liberica-runtime-container:jre-21-cds-slim-musl

ARG JAR_FILE=db2rest.jar

COPY ${JAR_FILE} /opt/app/db2rest.jar

# cd /opt/app
WORKDIR /opt/app

# uncomment EXPOSE if you wish to automatically expose
# port 8080 (default service port) upon container start
# otherwise you can map the port on docker run with `-p 1234:8080`

# EXPOSE 8080

# java -jar /opt/app/db2rest.jar
ENTRYPOINT ["java","-jar","db2rest.jar"]


================================================
FILE: LICENSE
================================================
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed 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.


================================================
FILE: README.md
================================================
DB2Rest is a modern low code REST DATA API platform that automatically creates a secure REST API endpoint
for your databases making it easy to build intelligent applications 30x faster.  No ORM, no code generation = FAST!
 
It combines existing/new databases and data-sources with language models (LM/LLMs) and vector stores to rapidly 
deliver context-aware, reasoning applications without any vendor lock-in. :bulb:

:star: If you find DB2Rest useful, please consider adding a star on GitHub! Your support motivates us to add new exciting features.


![Number of GitHub contributors](https://img.shields.io/github/contributors/kdhrubo/db2rest)
[![Number of GitHub issues that are open](https://img.shields.io/github/issues/kdhrubo/db2rest)](https://github.com/kdhrubo/db2rest/issues)
[![Number of GitHub stars](https://img.shields.io/github/stars/kdhrubo/db2rest)](https://github.com/kdhrubo/db2rest/stargazers)
![Number of GitHub closed issues](https://img.shields.io/github/issues-closed/kdhrubo/db2rest)
![Number of GitHub pull requests that are open](https://img.shields.io/github/issues-pr-raw/kdhrubo/db2rest)
![GitHub release; latest by date](https://img.shields.io/github/v/release/kdhrubo/db2rest)
![GitHub commit activity](https://img.shields.io/github/commit-activity/m/kdhrubo/db2rest)
[![GitHub license](https://img.shields.io/github/license/kdhrubo/db2rest)](https://github.com/kdhrubo/db2rest)
![GitHub top language](https://img.shields.io/github/languages/top/kdhrubo/db2rest)
![Docker Pulls](https://img.shields.io/docker/pulls/kdhrubo/db2rest)
[![Follow us on X, formerly Twitter](https://img.shields.io/twitter/follow/db2rest?style=social)](https://twitter.com/db2rest)

# Website

[https://db2rest.com](https://db2rest.com)

# Latest Release

| Release              | Download/Docker Pull                                                             |
|----------------------|----------------------------------------------------------------------------------|
| 1.6.8                | [DB2Rest-1.6.8](https://download.db2rest.com/db2rest-1.6.8.jar)                  |
| 1.6.8 (Docker Image) | ` docker pull kdhrubo/db2rest:v1.6.8 ` or ` docker pull kdhrubo/db2rest:latest ` |



# Last Stable Oracle 9i Release

| Release                                    | Download/Docker Pull                                                              |
|--------------------------------------------|-----------------------------------------------------------------------------------|
| Oracle9i - 1.2.3 <b><mark>Final</mark></b> | [DB2Rest-Oracle9i-1.2.3](https://download.db2rest.com/db2rest-oracle9i-1.2.3.jar) |

# Quick start guides

[On premise / On Virtual Machines installation guide](https://db2rest.com/docs/intro).

[Docker based installation guide](https://db2rest.com/docs/run-db2rest-on-docker).


# Use Cases 

## Accelerate Application Delivery

DB2Rest provides instant REST API(no code generation) to boost development by 30x. No need to write any code and best practices are built-in saving engineering teams
months of effort and cost. 

## Faster innovation with Gen AI

DB2Rest works hand in glove with modern vector databases and LLM implementations to provide consistent Web APIs to deliver smart applications.

## Secure Database Gateway

DB2Rest works as a secure database gateway. This helps enterprises to open up data to internal developers and partners in a safe and agile way which was not possible earlier.

## Simplify Integration, Secure data exchange

Often enterprises export data from databases and share large files using SFTP, S3 etc. This process is slow, complex, error-prone and often very costly.
It requires heavy maintenance cost and it is not possible to share data in realtime. 

Using DB2Rest, it is possible to simplify the process and allow secure data exchange with other parts of the organization without 
writing a single line of code. There is no direct database based point to point integration and data is available to query anytime. 


# Supported Databases

- **PostgreSQL**
- **MySQL**
- **SQLLite**
- **MS SQL Server**
- **Oracle**  (Including 9i, 10g)
- **IBM DB2** (11.5.8.0+)
- **DigitalOcean PostgreSQL**
- **DigitalOcean MySQL**
- **AWS RDS Postgres**
- **AWS RDS MySQL**
- **MariaDB**
- **CockroachDB**
- **Neon**
- **Amazon Lightsail PostgreSQL**
- **Amazon Lightsail MySQL**

# Planned Database Support

- **Yugabyte**
- **PlanetScale**
- **CrunchyData**
- **MindsDB**
- DuckDB


# Contributing
Feel like contributing? That's awesome! We have a [contributing guide](https://github.com/9tigerio/db2rest/blob/master/CONTRIBUTING.md) to help guide you.

Our docsite lives in a [separate repo](https://github.com/9tigerio/db2rest-web). If you're interested in contributing to the documentation, check out the docsite contribution guide.

# Building
Use `mvn verify` or `mvn clean package` , etc. from repo root folder, and pass in a value for `revision` to override the current default version in POMs:
`mvn -Drevision="1.5.4-SNAPSHOT" clean package -DskipTests`

# Testing
Running tests simply requires a Docker daemon running, where the build will automatically pull and run testcontainers for the database tests.


# Support

*Connect on Discord*

https://discord.gg/kqeDatPGwU

[![](https://dcbadge.vercel.app/api/server/kqeDatPGwU?theme=discord)](https://discord.gg/kqeDatPGwU)

# Contact

<help@db2rest.com>


# Roadmap

Refer to [open roadmap](https://db2rest.com/roadmap/) items.

# IDE Sponsor

![JetBrains logo](https://resources.jetbrains.com/storage/products/company/brand/logos/jetbrains.svg)




================================================
FILE: db2rest-api/api-rest/pom-oracle9i.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>io.9tiger</groupId>
        <artifactId>db2rest-parent</artifactId>
        <version>${revision}</version>
        <relativePath>../pom.xml</relativePath>

        <!-- lookup parent from repository -->
    </parent>

    <groupId>io.9tiger</groupId>
    <artifactId>db2rest-oracle9i</artifactId>
    <name>db2rest-oracle9i</name>
    <description>db2rest-oracle9i</description>
    <packaging>jar</packaging>
    <properties>
        <java.version>21</java.version>
        <spring-restdocs.version>3.0.1</spring-restdocs.version>
    </properties>

    <dependencies>

        <dependency>
            <groupId>io.9tiger</groupId>
            <artifactId>auth</artifactId>
            <version>${project.version}</version>
        </dependency>

        <dependency>
            <groupId>io.9tiger</groupId>
            <artifactId>rest-common</artifactId>
            <version>${project.version}</version>
        </dependency>

        <dependency>
            <groupId>io.9tiger</groupId>
            <artifactId>mongo-support</artifactId>
            <version>${project.version}</version>
        </dependency>

        <dependency>
            <groupId>io.9tiger</groupId>
            <artifactId>rdbms-support</artifactId>
            <version>${project.version}</version>
        </dependency>

        <!--TODO - Remove -->
        <dependency>
            <groupId>io.9tiger</groupId>
            <artifactId>pg-dialect</artifactId>
            <version>${project.version}</version>
        </dependency>

        <dependency>
            <groupId>io.9tiger</groupId>
            <artifactId>mysql-dialect</artifactId>
            <version>${project.version}</version>
        </dependency>

        <dependency>
            <groupId>io.9tiger</groupId>
            <artifactId>mariadb-dialect</artifactId>
            <version>${project.version}</version>
        </dependency>

        <dependency>
            <groupId>io.9tiger</groupId>
            <artifactId>mssql-dialect</artifactId>
            <version>${project.version}</version>        
        </dependency>

        <dependency>
            <groupId>io.9tiger</groupId>
            <artifactId>oracle9i-dialect</artifactId>
            <version>${project.version}</version>
        </dependency>

        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.15.1</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-testcontainers</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.testcontainers</groupId>
            <artifactId>junit-jupiter</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.testcontainers</groupId>
            <artifactId>postgresql</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.testcontainers</groupId>
            <artifactId>mysql</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.testcontainers</groupId>
            <artifactId>oracle-xe</artifactId>
            <version>1.19.7</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.testcontainers</groupId>
            <artifactId>mariadb</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.testcontainers</groupId>
            <artifactId>mssqlserver</artifactId>
            <scope>test</scope>
        </dependency>


        <dependency>
            <groupId>org.springframework.restdocs</groupId>
            <artifactId>spring-restdocs-mockmvc</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-test-autoconfigure</artifactId>
            <scope>test</scope>
        </dependency>


        <dependency>
            <groupId>io.hosuaby</groupId>
            <artifactId>inject-resources-junit-jupiter</artifactId>
            <version>0.3.3</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-registry-datadog</artifactId>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-registry-prometheus</artifactId>
            <scope>runtime</scope>
        </dependency>

    </dependencies>

    <build>
        <finalName>db2rest-oracle9i</finalName>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <groupId>org.asciidoctor</groupId>
                <artifactId>asciidoctor-maven-plugin</artifactId>
                <version>2.2.4</version>
                <executions>
                    <execution>
                        <id>generate-docs</id>
                        <phase>prepare-package</phase>
                        <goals>
                            <goal>process-asciidoc</goal>
                        </goals>
                        <configuration>
                            <backend>html</backend>
                            <doctype>book</doctype>
                        </configuration>
                    </execution>
                </executions>
                <dependencies>
                    <dependency>
                        <groupId>org.springframework.restdocs</groupId>
                        <artifactId>spring-restdocs-asciidoctor</artifactId>
                        <version>${spring-restdocs.version}</version>
                    </dependency>
                </dependencies>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>


================================================
FILE: db2rest-api/api-rest/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>io.9tiger</groupId>
        <artifactId>db2rest-api</artifactId>
        <version>${revision}</version>
        <relativePath>../</relativePath>
    </parent>

    <artifactId>api-rest</artifactId>
    <packaging>jar</packaging>
    <name>db2rest</name>
    <description>db2rest</description>

    <dependencies>


        <dependency>
            <groupId>io.9tiger</groupId>
            <artifactId>db2rest-auth</artifactId>
            <version>${project.version}</version>
        </dependency>


        <dependency>
            <groupId>io.9tiger</groupId>
            <artifactId>db2rest-common</artifactId>
            <version>${project.version}</version>
        </dependency>


        <dependency>
            <groupId>io.9tiger</groupId>
            <artifactId>rest-common</artifactId>
            <version>${project.version}</version>
        </dependency>


        <dependency>
            <groupId>io.9tiger</groupId>
            <artifactId>rdbms-support</artifactId>
            <version>${project.version}</version>
        </dependency>

        <dependency>
            <groupId>io.9tiger</groupId>
            <artifactId>pg-dialect</artifactId>
            <version>${project.version}</version>
        </dependency>

        <dependency>
            <groupId>io.9tiger</groupId>
            <artifactId>mysql-dialect</artifactId>
            <version>${project.version}</version>
        </dependency>

        <dependency>
            <groupId>io.9tiger</groupId>
            <artifactId>mariadb-dialect</artifactId>
            <version>${project.version}</version>
        </dependency>

        <dependency>
            <groupId>io.9tiger</groupId>
            <artifactId>oracle-dialect</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>io.9tiger</groupId>
            <artifactId>mssql-dialect</artifactId>
            <version>${project.version}</version>
        </dependency>

        <dependency>
            <groupId>io.9tiger</groupId>
            <artifactId>sqlite-dialect</artifactId>
            <version>${project.version}</version>
        </dependency>

        <dependency>
            <groupId>io.9tiger</groupId>
            <artifactId>db2-dialect</artifactId>
            <version>${project.version}</version>
        </dependency>

        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.15.1</version>
        </dependency>


        <dependency>
            <groupId>com.hubspot.jinjava</groupId>
            <artifactId>jinjava</artifactId>
            <version>2.7.3</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>

        <!--
        <dependency>
            <groupId>com.ibm.db2</groupId>
            <artifactId>jcc</artifactId>
            <scope>runtime</scope>
        </dependency>
        -->

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-testcontainers</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.testcontainers</groupId>
            <artifactId>junit-jupiter</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.testcontainers</groupId>
            <artifactId>postgresql</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.testcontainers</groupId>
            <artifactId>mysql</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.testcontainers</groupId>
            <artifactId>oracle-xe</artifactId>
            <version>1.19.7</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.testcontainers</groupId>
            <artifactId>testcontainers-db2</artifactId>
            <version>2.0.2</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.testcontainers</groupId>
            <artifactId>mariadb</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.testcontainers</groupId>
            <artifactId>mssqlserver</artifactId>
            <scope>test</scope>
        </dependency>


        <dependency>
            <groupId>org.springframework.restdocs</groupId>
            <artifactId>spring-restdocs-mockmvc</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-test-autoconfigure</artifactId>
            <scope>test</scope>
        </dependency>


        <dependency>
            <groupId>io.hosuaby</groupId>
            <artifactId>inject-resources-junit-jupiter</artifactId>
            <version>1.0.0</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-registry-datadog</artifactId>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-registry-prometheus</artifactId>
            <scope>runtime</scope>
        </dependency>
    </dependencies>

    <build>
        <finalName>db2rest</finalName>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
        <plugins>

            <plugin>
                <groupId>gg.jte</groupId>
                <artifactId>jte-maven-plugin</artifactId>
                <version>${jte.version}</version>
                <configuration>
                    <!-- This is the directory where your .jte files are located. -->
                    <sourceDirectory>${project.basedir}/src/main/resources/sql-templates</sourceDirectory>
                    <contentType>Plain</contentType>
                </configuration>
                <executions>
                    <execution>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <groupId>org.asciidoctor</groupId>
                <artifactId>asciidoctor-maven-plugin</artifactId>
                <version>2.2.4</version>
                <executions>
                    <execution>
                        <id>generate-docs</id>
                        <phase>prepare-package</phase>
                        <goals>
                            <goal>process-asciidoc</goal>
                        </goals>
                        <configuration>
                            <backend>html</backend>
                            <doctype>book</doctype>
                        </configuration>
                    </execution>
                </executions>
                <dependencies>
                    <dependency>
                        <groupId>org.springframework.restdocs</groupId>
                        <artifactId>spring-restdocs-asciidoctor</artifactId>
                        <version>${spring-restdocs.version}</version>
                    </dependency>
                </dependencies>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>


================================================
FILE: db2rest-api/api-rest/sample-config/application-db.yml
================================================
app:
  databases:
    - id: ${DB_NAME:pgdb}
      type: POSTGRESQL
      url: jdbc:postgresql://localhost:5432/homidb
      username: homi2022
      password: homi2022
      schemas:
        - public
        - joinplay
      connectionProperties:
        ssl: false
      envProperties: # Not used yet
          enableDatetimeFormatting: ${ENABLE_DATETIME_FORMATTING:false}
          timeFormat: ${TIME_FORMAT:HH:mm:ss}
          dateFormat: ${DATE_FORMAT:yyyy-MM-dd}
          dateTimeFormat: ${DATE_TIME_FORMAT:yyyy-MM-dd HH:mm:ss}
          defaultFetchLimit : ${DEFAULT_FETCH_LIMIT:100}


================================================
FILE: db2rest-api/api-rest/sample-config/application-local.yml
================================================
app:
  databases:
    - id: DB1
      type: POSTGRESQL
      url: jdbc:postgresql://localhost:5432/homidb
      username: homi2022
      password: homi2022

    - id: DB2
      type: MYSQL
      url: jdbc:mysql://localhost:3306/sakila
      username: root
      password: "@Kolkata84"







================================================
FILE: db2rest-api/api-rest/sample-config/application-mongo.yml
================================================
app:
  databases:
    - id: DB1
      type: POSTGRESQL
      url: jdbc:postgresql://localhost:5432/homidb
      username: homi2022
      password: homi2022
      connectionProperties:
        ssl: false
      envProperties: # Not used yet
          enableDatetimeFormatting: true
          timeFormat: 'HH:mm:ss'
          dateFormat: 'dd-MM-yyyy'
          dateTimeFormat: 'dd-MM-yyyy HH:mm:ss'
          defaultFetchLimit : 100





================================================
FILE: db2rest-api/api-rest/sample-config/application-pg15.yml
================================================
app:
  databases:
    - id: ${DB_NAME:pgdb}
      type: POSTGRESQL
      url: jdbc:postgresql://localhost:5432/postgres
      username: postgres
      password:


================================================
FILE: db2rest-api/api-rest/sample-config/application-pg16.yml
================================================
app:
  databases:
    - id: ${DB_NAME:pgdb}
      type: POSTGRESQL
      url: jdbc:postgresql://localhost:5432/postgres
      username: postgres
      password:


================================================
FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/Db2restApplication.java
================================================
package com.homihq.db2rest;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, MongoAutoConfiguration.class})
@ComponentScan(excludeFilters = @ComponentScan.Filter(RestController.class))
public class Db2restApplication {

    public static void main(String[] args) {
        SpringApplication.run(Db2restApplication.class, args);
    }
}


================================================
FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/config/CorsFilterConfiguration.java
================================================
package com.homihq.db2rest.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

@Slf4j
@Configuration
public class CorsFilterConfiguration {

    @Bean
    @Order(Ordered.HIGHEST_PRECEDENCE)
    @ConditionalOnProperty(name = "cors.enabled", havingValue = "true")
    public CorsFilter corsFilter(CorsConfigProperties properties) {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();

        for (CorsConfigProperties.CorsMapping mapping : properties.getMappings()) {
            CorsConfiguration config = new CorsConfiguration();

            // Process allowed origins (trim, remove duplicates)
            List<String> allowedOrigins = Arrays.stream(mapping.getAllowedOrigins().split(","))
                    .map(String::trim)
                    .distinct()
                    .collect(Collectors.toList());
            config.setAllowedOrigins(allowedOrigins);

            // Process allowed headers (trim, remove duplicates)
            List<String> allowedHeaders = Arrays.stream(mapping.getAllowedHeaders().split(","))
                    .map(String::trim)
                    .distinct()
                    .collect(Collectors.toList());
            config.setAllowedHeaders(allowedHeaders);

            // Process allowed methods (trim, remove duplicates)
            List<String> allowedMethods = Arrays.stream(mapping.getAllowedMethods().split(","))
                    .map(String::trim)
                    .distinct()
                    .collect(Collectors.toList());
            config.setAllowedMethods(allowedMethods);

            log.info("CORS Config -> Path: {}, Origins: {} , Headers: {}, Methods: {}" ,
                    mapping.getMapping() , allowedOrigins, allowedHeaders ,  allowedMethods);

            source.registerCorsConfiguration(mapping.getMapping(), config);
        }

        return new CorsFilter(source);
    }

}


================================================
FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/config/DbServiceConfiguration.java
================================================
package com.homihq.db2rest.config;

import com.db2rest.jdbc.dialect.*;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.homihq.db2rest.bulk.DataProcessor;
import com.homihq.db2rest.bulk.FileSubject;
import com.homihq.db2rest.jdbc.JdbcManager;
import com.homihq.db2rest.jdbc.JdbcOperationService;
import com.homihq.db2rest.config.jinjava.DisabledExpressionTokenScannerSymbols;
import com.homihq.db2rest.jdbc.core.DbOperationService;
import com.homihq.db2rest.jdbc.core.service.*;
import com.homihq.db2rest.jdbc.multidb.RoutingDataSource;
import com.homihq.db2rest.jdbc.processor.*;
import com.homihq.db2rest.jdbc.sql.SqlCreatorTemplate;
import com.homihq.db2rest.jdbc.tsid.TSIDProcessor;
import com.homihq.db2rest.jdbc.validator.CustomPlaceholderValidators;
import com.homihq.db2rest.multidb.DatabaseConnectionDetail;
import com.homihq.db2rest.multidb.DatabaseProperties;
import com.hubspot.jinjava.Jinjava;
import com.hubspot.jinjava.JinjavaConfig;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import gg.jte.CodeResolver;
import gg.jte.ContentType;
import gg.jte.TemplateEngine;
import gg.jte.resolve.ResourceCodeResolver;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Slf4j
@Configuration
@RequiredArgsConstructor
public class DbServiceConfiguration {

    private final DatabaseProperties databaseProperties;
    private final ObjectMapper objectMapper;

    @Bean
    @ConditionalOnMissingBean(DataSource.class)
    public DataSource dataSource() {

        final Map<Object, Object> dataSources = this.buildDataSources();

        final RoutingDataSource routingDataSource = new RoutingDataSource();
        routingDataSource.setTargetDataSources(dataSources);

        return routingDataSource;
    }

    private Map<Object, Object> buildDataSources() {
        final Map<Object, Object> result = new HashMap<>();

        log.debug("Databases - {}", databaseProperties.getDatabases());

        if (!databaseProperties.isRdbmsConfigured()) {
            log.info("*** No RDBMS configured.");
            return result;
        }


        for (DatabaseConnectionDetail connectionDetail : databaseProperties.getDatabases()) {

            if (connectionDetail.isJdbcPresent())
                result.put(connectionDetail.id(), this.buildDataSource(connectionDetail));
        }

        return result;
    }


    private DataSource buildDataSource(DatabaseConnectionDetail connectionDetail) {
        final HikariConfig config = new HikariConfig();

        config.setJdbcUrl(connectionDetail.url());
        config.setUsername(connectionDetail.username());
        config.setPassword(connectionDetail.password());
        config.setMaximumPoolSize(connectionDetail.maxConnections());

        config.setAutoCommit(false);
        return new HikariDataSource(config);
    }

    @Bean
    public JdbcManager jdbcManager() {

        List<Dialect> dialects = List.of(
                new PostGreSQLDialect(objectMapper),
                new DB2RestMySQLDialect(objectMapper),
                new MariaDBDialect(objectMapper),
                new OracleDialect(objectMapper),
                new MsSQLServerDialect(objectMapper),
                new SQLiteDialect(objectMapper),
                new DB2RestDB2Dialect(objectMapper)
        );

        return new JdbcManager(dataSource(), dialects, databaseProperties);
    }

    @Bean
    public JdbcOperationService operationService() {
        return new JdbcOperationService();
    }


    @Bean
    public SqlCreatorTemplate sqlCreatorTemplate(TemplateEngine templateEngine, JdbcManager jdbcManager) {
        return new SqlCreatorTemplate(templateEngine, jdbcManager);
    }

    @Bean
    public TemplateEngine templateEngine() {
        CodeResolver codeResolver =
                new ResourceCodeResolver("sql-templates");
        return TemplateEngine
                .createPrecompiled(ContentType.Plain);
    }

    @Bean
    public Jinjava jinjava() {
        JinjavaConfig config = JinjavaConfig
                .newBuilder()
                .withTokenScannerSymbols(new DisabledExpressionTokenScannerSymbols())
                .build();

        return new Jinjava(config);
    }

    //START ::: Processors
    @Bean
    public TSIDProcessor tsidProcessor() {
        return new TSIDProcessor();
    }

    @Bean
    public JoinProcessor joinProcessor(JdbcManager jdbcManager) {
        return new JoinProcessor(jdbcManager);
    }

    @Bean
    public OrderByProcessor orderByProcessor() {
        return new OrderByProcessor();
    }

    @Bean
    public RootTableFieldProcessor rootTableFieldProcessor() {
        return new RootTableFieldProcessor();
    }

    @Bean
    public RootTableProcessor rootTableProcessor(JdbcManager jdbcManager) {
        return new RootTableProcessor(jdbcManager);
    }

    @Bean
    public RootWhereProcessor rootWhereProcessor(JdbcManager jdbcManager) {
        return new RootWhereProcessor(jdbcManager);
    }

    //END ::: Processors

    //START ::: Validator
    @Bean
    public CustomPlaceholderValidators customPlaceholderValidators() {
        return new CustomPlaceholderValidators();
    }

    //END ::: Validator

    //START ::: Service
    //CREATE SERVICE

    @Bean
    public BulkCreateService bulkCreateService(TSIDProcessor tsidProcessor,
                                               SqlCreatorTemplate sqlCreatorTemplate,
                                               JdbcManager jdbcManager,
                                               DbOperationService dbOperationService,
                                               List<DataProcessor> dataProcessors,
                                               FileSubject fileSubject) {
        return new JdbcBulkCreateService(tsidProcessor, sqlCreatorTemplate, jdbcManager, dbOperationService, fileSubject);
    }

    @Bean
    public CreateService createService(TSIDProcessor tsidProcessor,
                                       SqlCreatorTemplate sqlCreatorTemplate,
                                       JdbcManager jdbcManager,
                                       DbOperationService dbOperationService) {
        return new JdbcCreateService(tsidProcessor, sqlCreatorTemplate, jdbcManager, dbOperationService);
    }

    //QUERY SERVICE
    @Bean
    public CountQueryService countQueryService(
            JdbcManager jdbcManager,
            SqlCreatorTemplate sqlCreatorTemplate,
            List<ReadProcessor> processorList,
            DbOperationService dbOperationService) {
        return new JdbcCountQueryService(
                jdbcManager,
                dbOperationService, processorList, sqlCreatorTemplate);
    }

    @Bean
    public ExistsQueryService existsQueryService(
            JdbcManager jdbcManager,
            SqlCreatorTemplate sqlCreatorTemplate,
            List<ReadProcessor> processorList,
            DbOperationService dbOperationService) {
        return new JdbcExistsQueryService(jdbcManager, dbOperationService, processorList, sqlCreatorTemplate);
    }

    @Bean
    public FindOneService findOneService(
            JdbcManager jdbcManager,
            SqlCreatorTemplate sqlCreatorTemplate,
            List<ReadProcessor> processorList,
            DbOperationService dbOperationService) {
        return new JdbcFindOneService(jdbcManager, sqlCreatorTemplate, processorList, dbOperationService);
    }

    @Bean
    public ReadService readService(
            JdbcManager jdbcManager,
            SqlCreatorTemplate sqlCreatorTemplate,
            List<ReadProcessor> processorList,
            DbOperationService dbOperationService) {
        return new JdbcReadService(jdbcManager, dbOperationService, processorList, sqlCreatorTemplate);
    }

    //UPDATE SERVICE
    @Bean
    public UpdateService updateService(
            JdbcManager jdbcManager,
            SqlCreatorTemplate sqlCreatorTemplate,
            DbOperationService dbOperationService) {
        return new JdbcUpdateService(jdbcManager, sqlCreatorTemplate, dbOperationService);
    }


    //DELETE SERVICE
    @Bean
    public DeleteService deleteService(
            JdbcManager jdbcManager,
            SqlCreatorTemplate sqlCreatorTemplate,
            DbOperationService dbOperationService) {
        return new JdbcDeleteService(jdbcManager, sqlCreatorTemplate, dbOperationService);
    }

    //RPC
    @Bean
    public FunctionService functionService(JdbcManager jdbcManager) {
        return new JdbcFunctionService(jdbcManager);
    }

    @Bean
    public ProcedureService procedureService(JdbcManager jdbcManager) {
        return new JdbcProcedureService(jdbcManager);
    }

    @Bean
    public SQLTemplateExecutorService templateService(
            Jinjava jinjava,
            Db2RestConfigProperties db2RestConfigProperties,
            DbOperationService dbOperationService,
            JdbcManager jdbcManager,
            CustomPlaceholderValidators customPlaceholderValidators
    ) {
        return new JinJavaTemplateExecutorService(
                jinjava,
                db2RestConfigProperties,
                dbOperationService,
                jdbcManager,
                customPlaceholderValidators
        );
    }

    //END ::: Services


}


================================================
FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/config/RestApiConfiguration.java
================================================
package com.homihq.db2rest.config;

import com.homihq.db2rest.bulk.DataProcessor;
import com.homihq.db2rest.jdbc.JdbcManager;
import com.homihq.db2rest.jdbc.core.service.*;
import com.homihq.db2rest.rest.admin.AdminController;
import com.homihq.db2rest.rest.create.BulkCreateController;
import com.homihq.db2rest.rest.create.CreateController;
import com.homihq.db2rest.rest.delete.DeleteController;
import com.homihq.db2rest.rest.meta.db.DbInfoController;
import com.homihq.db2rest.rest.meta.schema.SchemaController;
import com.homihq.db2rest.rest.read.CountQueryController;
import com.homihq.db2rest.rest.read.ExistsQueryController;
import com.homihq.db2rest.rest.read.FindOneController;
import com.homihq.db2rest.rest.read.ReadController;
import com.homihq.db2rest.rest.rpc.FunctionController;
import com.homihq.db2rest.rest.rpc.ProcedureController;
import com.homihq.db2rest.rest.sql.SQLTemplateController;
import com.homihq.db2rest.rest.update.UpdateController;

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.List;


@Slf4j
@Configuration
public class RestApiConfiguration {


    //START ::: API

    //CREATE API


    @Bean
    @ConditionalOnBean(BulkCreateService.class)
    public BulkCreateController bulkCreateController(BulkCreateService bulkCreateService, List<DataProcessor> dataProcessors) {
        return new BulkCreateController(bulkCreateService, dataProcessors);
    }


    @Bean
    @ConditionalOnBean(CreateService.class)
    public CreateController createController(CreateService createService) {
        return new CreateController(createService);
    }

    //READ API
    @Bean
    @ConditionalOnBean(CountQueryService.class)
    public CountQueryController countQueryController(CountQueryService countQueryService) {
        return new CountQueryController(countQueryService);
    }

    @Bean
    @ConditionalOnBean(ExistsQueryService.class)
    public ExistsQueryController existsQueryController(ExistsQueryService existsQueryService) {
        return new ExistsQueryController(existsQueryService);
    }

    @Bean
    @ConditionalOnBean(FindOneService.class)
    public FindOneController findOneController(FindOneService findOneService) {
        return new FindOneController(findOneService);
    }

    @Bean
    @ConditionalOnBean(ReadService.class)
    public ReadController readController(ReadService readService, Db2RestConfigProperties configProperties) {
        return new ReadController(readService, configProperties);
    }


    //UPDATE API
    @Bean
    @ConditionalOnBean(UpdateService.class)
    public UpdateController updateController(UpdateService updateService) {
        return new UpdateController(updateService);
    }

    //DELETE API
    @Bean
    @ConditionalOnBean(DeleteService.class)
    public DeleteController deleteController(DeleteService deleteService, Db2RestConfigProperties configProperties) {
        return new DeleteController(deleteService, configProperties);
    }

    //RPC
    @Bean
    @ConditionalOnBean(FunctionService.class)
    public FunctionController functionController(FunctionService functionService) {
        return new FunctionController(functionService);
    }

    @Bean
    @ConditionalOnBean(ProcedureService.class)
    public ProcedureController procedureController(ProcedureService procedureService) {
        return new ProcedureController(procedureService);
    }

    @Bean
    @ConditionalOnBean(JdbcManager.class)
    public SchemaController schemaController(JdbcManager jdbcManager) {
        return new SchemaController(jdbcManager);
    }

    @Bean
    @ConditionalOnBean(SQLTemplateExecutorService.class)
    public SQLTemplateController sqlTemplateController(
            SQLTemplateExecutorService sqlTemplateExecutorService
    ) {
        return new SQLTemplateController(sqlTemplateExecutorService);
    }

    @Bean
    @ConditionalOnBean(JdbcManager.class)
    public DbInfoController dbInfoController(JdbcManager jdbcManager) {
        return new DbInfoController(jdbcManager);
    }


    @Bean
    @ConditionalOnBean(JdbcManager.class)
    public AdminController adminController(JdbcManager jdbcManager) {
        return new AdminController(jdbcManager);
    }
    //END ::: API

}


================================================
FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/config/WebMvcConfiguration.java
================================================
package com.homihq.db2rest.config;

import com.homihq.db2rest.interceptor.DatabaseContextRequestInterceptor;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;


import org.springframework.context.annotation.Configuration;

import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
@RequiredArgsConstructor
@Slf4j
public class WebMvcConfiguration implements WebMvcConfigurer {


    private final DatabaseContextRequestInterceptor databaseContextRequestInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(databaseContextRequestInterceptor);
    }


}


================================================
FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/config/jinjava/DisabledExpressionTokenScannerSymbols.java
================================================
package com.homihq.db2rest.config.jinjava;

import com.hubspot.jinjava.tree.parse.DefaultTokenScannerSymbols;

public class DisabledExpressionTokenScannerSymbols extends DefaultTokenScannerSymbols {
    @Override
    public int getExprStart() {
        return 0;
    }

    @Override
    public int getExprEnd() {
        return 0;
    }
}


================================================
FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/interceptor/DatabaseContextRequestInterceptor.java
================================================
package com.homihq.db2rest.interceptor;

import com.homihq.db2rest.core.exception.GenericDataAccessException;
import com.homihq.db2rest.multidb.DatabaseContextHolder;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import org.springframework.util.AntPathMatcher;
import org.springframework.web.servlet.AsyncHandlerInterceptor;
import org.springframework.web.servlet.HandlerMapping;
import org.springframework.web.servlet.ModelAndView;

import java.util.List;
import java.util.Map;
import java.util.Objects;

import static com.homihq.db2rest.rest.RdbmsRestApi.VERSION;

@Slf4j
@Component
public class DatabaseContextRequestInterceptor implements AsyncHandlerInterceptor {

    private final List<String> whiteList = List.of(
            "/error", "/swagger-ui/**", "/v3/api-docs/**", "/actuator/**", "/admin/**",
            VERSION + "/$dbs");

    private final AntPathMatcher antPathMatcher = new AntPathMatcher();

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        log.info("Pre handle - {}", request.getRequestURI());


        if (!isWhileListed(request.getRequestURI())) {
            final Map<String, String> pathVariables = (Map<String, String>) request
                    .getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);

            log.info("pathVariables - {}", pathVariables);

            if (Objects.isNull(pathVariables)) {
                throw new GenericDataAccessException("Database ID not found.");
            }

            String dbId = pathVariables.get("dbId");

            log.debug("Db identifier : {}", dbId);

            if (StringUtils.isNotBlank(dbId)) {
                this.setTenantContext(dbId);
            } else {
                log.info("DB could not be determined.");
                throw new GenericDataAccessException("Database ID not found.");
            }
        }


        return true;
    }

    private boolean isWhileListed(String uri) {
        return whiteList.stream().anyMatch(w -> antPathMatcher.match(w, uri));
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
        DatabaseContextHolder.clear();
    }

    private void setTenantContext(String tenant) {
        DatabaseContextHolder.setCurrentDbId(tenant);
    }
}


================================================
FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/RdbmsRestApi.java
================================================
package com.homihq.db2rest.rest;

public interface RdbmsRestApi {

    String VERSION = "/v1/rdbms";
}


================================================
FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/admin/AdminController.java
================================================
package com.homihq.db2rest.rest.admin;

import com.homihq.db2rest.jdbc.JdbcManager;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/admin")
@Slf4j
@RequiredArgsConstructor
public class AdminController {

    private final JdbcManager jdbcManager;


    @PostMapping("/reloadCache")
    public void reloadCache(){
        log.info("Reload cache request received.");
        this.jdbcManager.reload();
    }

}


================================================
FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/create/BulkCreateController.java
================================================
package com.homihq.db2rest.rest.create;

import com.homihq.db2rest.auth.data.RoleDataFilter;
import com.homihq.db2rest.bulk.DataProcessor;
import com.homihq.db2rest.core.dto.CreateBulkResponse;
import com.homihq.db2rest.core.dto.CreateResponse;
import com.homihq.db2rest.core.exception.GenericDataAccessException;
import com.homihq.db2rest.dtos.BulkContext;
import com.homihq.db2rest.jdbc.core.service.BulkCreateService;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;

@RestController
@Slf4j
@RequiredArgsConstructor
@EnableAsync
public class BulkCreateController implements BulkCreateRestApi {
    private final BulkCreateService bulkCreateService;
    private final List<DataProcessor> dataProcessors;

    public CreateBulkResponse save(
            List<RoleDataFilter> roleBasedDataFilters,
            String dbId,
            String tableName,
            String schemaName,
            List<String> includeColumns,
            List<String> sequences,
            boolean tsIdEnabled,
            HttpServletRequest request) throws Exception {

        DataProcessor dataProcessor = dataProcessors.stream()
                .filter(d -> d.handle(request.getContentType()))
                .findFirst().orElseThrow(() -> new GenericDataAccessException("Unable to process content type : "
                        + request.getContentType()));

        List<Map<String, Object>> data = dataProcessor.getData(request.getInputStream());

        BulkContext context = new BulkContext(dbId, schemaName, tableName, includeColumns, tsIdEnabled, sequences, 0, roleBasedDataFilters);
        return bulkCreateService.saveBulk(context, data);
    }

    @Override
    public CompletableFuture<CreateResponse> saveMultipartFile(
            List<RoleDataFilter> roleBasedDataFilters,
            String dbId,
            String tableName,
            String schemaName,
            List<String> includeColumns,
            List<String> sequences,
            boolean tsIdEnabled,
            MultipartFile file) {

        BulkContext context = new BulkContext(dbId, schemaName, tableName, includeColumns, tsIdEnabled, sequences, 0, roleBasedDataFilters);
        return bulkCreateService.saveMultipartFile(context, file);
    }
}


================================================
FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/create/BulkCreateRestApi.java
================================================
package com.homihq.db2rest.rest.create;

import com.homihq.db2rest.auth.data.RoleDataFilter;
import com.homihq.db2rest.core.dto.CreateBulkResponse;
import com.homihq.db2rest.core.dto.CreateResponse;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestAttribute;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.concurrent.CompletableFuture;

import static com.homihq.db2rest.config.MultiTenancy.ROLEBASEDDATAFILTERS;
import static com.homihq.db2rest.rest.RdbmsRestApi.VERSION;

public interface BulkCreateRestApi {
    @ResponseStatus(HttpStatus.CREATED)
    @PostMapping(value = VERSION + "/{dbId}/{tableName}/bulk", consumes = {"application/json", "text/csv"})
    CreateBulkResponse save(
            @RequestAttribute(name = ROLEBASEDDATAFILTERS, required = false) List<RoleDataFilter> roleBasedDataFilters,
            @PathVariable String dbId,
            @PathVariable String tableName,
            @RequestHeader(name = "Content-Profile", required = false) String schemaName,
            @RequestParam(name = "columns", required = false) List<String> includeColumns,
            @RequestParam(name = "sequences", required = false) List<String> sequences,
            @RequestParam(name = "tsIdEnabled", required = false, defaultValue = "false") boolean tsIdEnabled,
            HttpServletRequest request) throws Exception;


    @ResponseStatus(HttpStatus.CREATED)
    @PostMapping(value = VERSION + "/{dbId}/{tableName}/upload", consumes = {"multipart/form-data", "application/json"})
    CompletableFuture<CreateResponse> saveMultipartFile(
            @RequestAttribute(name = ROLEBASEDDATAFILTERS, required = false) List<RoleDataFilter> roleBasedDataFilters,
            @PathVariable String dbId,
            @PathVariable String tableName,
            @RequestHeader(name = "Content-Profile", required = false) String schemaName,
            @RequestParam(name = "columns", required = false) List<String> includeColumns,
            @RequestParam(name = "sequences", required = false) List<String> sequences,
            @RequestParam(name = "tsIdEnabled", required = false, defaultValue = "false") boolean tsIdEnabled,
            @RequestParam("file") MultipartFile file) throws Exception;
}


================================================
FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/create/CreateController.java
================================================
package com.homihq.db2rest.rest.create;

import java.util.List;
import java.util.Map;

import org.springframework.web.bind.annotation.RestController;

import com.homihq.db2rest.auth.data.RoleDataFilter;
import com.homihq.db2rest.config.MultiTenancy;
import com.homihq.db2rest.core.dto.CreateResponse;
import com.homihq.db2rest.jdbc.core.service.CreateService;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@RestController
@Slf4j
@RequiredArgsConstructor
public class CreateController implements CreateRestApi {

    private final CreateService createService;

    @Override
    public CreateResponse save(
            List<RoleDataFilter> roleBasedDataFilters,
            String dbId, String schemaName,
            String tableName,
            List<String> includeColumns,
            List<String> sequences,
            Map<String, Object> data,
            boolean tsIdEnabled) {

        MultiTenancy.addTenantColumns(data, dbId, tableName, roleBasedDataFilters);
        return createService.save(dbId, schemaName, tableName, includeColumns, data, tsIdEnabled, sequences);
    }
}


================================================
FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/create/CreateRestApi.java
================================================
package com.homihq.db2rest.rest.create;

import static com.homihq.db2rest.config.MultiTenancy.ROLEBASEDDATAFILTERS;
import static com.homihq.db2rest.rest.RdbmsRestApi.VERSION;

import java.util.List;
import java.util.Map;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestAttribute;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseStatus;

import com.homihq.db2rest.auth.data.RoleDataFilter;
import com.homihq.db2rest.core.dto.CreateResponse;
public interface CreateRestApi {
    @ResponseStatus(HttpStatus.CREATED)
    @PostMapping(VERSION + "/{dbId}/{tableName}")
    CreateResponse save(
            @RequestAttribute(name = ROLEBASEDDATAFILTERS, required = false) List<RoleDataFilter> roleBasedDataFilters,
            @PathVariable String dbId,
            @RequestHeader(name = "Content-Profile", required = false) String schemaName,
            @PathVariable String tableName,
            @RequestParam(name = "columns", required = false) List<String> includeColumns,
            @RequestParam(name = "sequences", required = false) List<String> sequences,
            @RequestBody Map<String, Object> data,
            @RequestParam(name = "tsIdEnabled", required = false, defaultValue = "false") boolean tsIdEnabled);
}


================================================
FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/delete/DeleteController.java
================================================
package com.homihq.db2rest.rest.delete;

import java.util.List;

import com.homihq.db2rest.auth.data.RoleDataFilter;
import com.homihq.db2rest.config.Db2RestConfigProperties;
import com.homihq.db2rest.config.MultiTenancy;
import com.homihq.db2rest.core.dto.DeleteResponse;
import com.homihq.db2rest.jdbc.core.service.DeleteService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Slf4j
@RequiredArgsConstructor
public class DeleteController implements DeleteRestApi {

    private final DeleteService deleteService;
    private final Db2RestConfigProperties db2RestConfigProperties;

    @Override
    public DeleteResponse delete(
            List<RoleDataFilter> roleBasedDataFilters,
            String dbId,
            String schemaName,
            String tableName,
            String filter
    ) {

        db2RestConfigProperties.checkDeleteAllowed(filter);

        int rows = deleteService.delete(dbId, schemaName, tableName,
                MultiTenancy.joinFilters(filter, dbId, tableName, roleBasedDataFilters));
        log.debug("Number of rows deleted - {}", rows);
        return DeleteResponse.builder().rows(rows).build();
    }
}


================================================
FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/delete/DeleteRestApi.java
================================================
package com.homihq.db2rest.rest.delete;

import com.homihq.db2rest.auth.data.RoleDataFilter;
import com.homihq.db2rest.core.dto.DeleteResponse;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestAttribute;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseStatus;

import static com.homihq.db2rest.config.MultiTenancy.ROLEBASEDDATAFILTERS;
import static com.homihq.db2rest.rest.RdbmsRestApi.VERSION;

import java.util.List;

public interface DeleteRestApi {
    @ResponseStatus(HttpStatus.OK)
    @DeleteMapping(VERSION + "/{dbId}/{tableName}")
    DeleteResponse delete(
            @RequestAttribute(name = ROLEBASEDDATAFILTERS, required = false) List<RoleDataFilter> roleBasedDataFilters,
            @PathVariable String dbId,
            @RequestHeader(name = "Content-Profile", required = false) String schemaName,
            @PathVariable String tableName,
            @RequestParam(required = false, defaultValue = "") String filter);
}


================================================
FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/meta/db/DbInfoController.java
================================================
package com.homihq.db2rest.rest.meta.db;


import com.homihq.db2rest.jdbc.JdbcManager;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;


@RestController
@Slf4j
@RequiredArgsConstructor
public class DbInfoController implements DbInfoRestApi {

    private final JdbcManager jdbcManager;

    @Override
    public List<DbInfoObject> getObjects() {
        List<DbInfoObject> dbInfoObjects = new ArrayList<>();
        jdbcManager.getDbMetaMap().forEach(
                (k, v) -> dbInfoObjects.add(new DbInfoObject(k, v.productName(), v.majorVersion(), v.driverName(), v.driverVersion()))
        );

        return dbInfoObjects;
    }



}


================================================
FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/meta/db/DbInfoObject.java
================================================
package com.homihq.db2rest.rest.meta.db;

public record DbInfoObject(
        String dbId,
        String productName,
        int majorVersion,
        String driverName,
        String driverVersion
) {}


================================================
FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/meta/db/DbInfoRestApi.java
================================================
package com.homihq.db2rest.rest.meta.db;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.List;

import static com.homihq.db2rest.rest.RdbmsRestApi.VERSION;

@RequestMapping(VERSION + "/$dbs")
@Tag(name = "DB Info Objects", description = "Details the databases being managed by this instance of DB2Rest")
public interface DbInfoRestApi {


    @Operation(summary = "Get all database info details",
            description = "Get all database info details",
            tags = {"DB Info Objects"}
    )
    @GetMapping()
    List<DbInfoObject> getObjects();


}


================================================
FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/meta/schema/ColumnObject.java
================================================
package com.homihq.db2rest.rest.meta.schema;

import com.db2rest.jdbc.dialect.model.DbColumn;

public record ColumnObject(String name, Boolean pk, String dataType) {
    public ColumnObject(DbColumn dbColumn) {
        this(
                dbColumn.name(),
                dbColumn.pk(),
                dbColumn.columnDataTypeName()
        );
    }
}



================================================
FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/meta/schema/SchemaController.java
================================================
package com.homihq.db2rest.rest.meta.schema;

import com.homihq.db2rest.core.exception.GenericDataAccessException;
import com.homihq.db2rest.jdbc.JdbcManager;
import com.db2rest.jdbc.dialect.model.DbTable;
import com.homihq.db2rest.jdbc.sql.DbMeta;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.Objects;
import java.util.function.Function;

/**
 * provides methods to filter and retrieve schema objects from a database
 */
@RestController
@Slf4j
@RequiredArgsConstructor
public class SchemaController implements SchemaRestApi {

    private final JdbcManager jdbcManager;

    /**
     * @param dbId    database id from which to retrieve the schema objects
     * @param filter  filter conditions to match against a schema, name, or type
     * @param columns include the column information for a table
     * @return list of schema objects (schema, name, type) that match the filter conditions
     */
    @Override
    public List<? extends TableObject> getObjects(String dbId, String filter, Boolean columns) {

        log.debug("Filter - {}", filter);

        DbMeta dbMeta = jdbcManager.getDbMetaByDbId(dbId);



        if (Objects.isNull(dbMeta)) {
            return List.of();
        }

        SchemaFilter schemaFilter = getSchemaFilter(filter);

        List<DbTable> dbTables = dbMeta.dbTables();
        Function<DbTable, ? extends TableObject> tableMapper = columns
                ? TableWithColumnsObject::new
                : TableObject::new;

        if (Objects.isNull(schemaFilter)) {
            return dbTables.stream().map(tableMapper).toList();
        } else {
            log.info("schemaFilter - {}", schemaFilter);
            return dbTables.stream()
                    .filter(dbTable -> {

                        if (StringUtils.equals(schemaFilter.field, "schema")
                                && StringUtils.containsIgnoreCase(dbTable.schema(), schemaFilter.value)) {
                            return true;
                        } else if (StringUtils.equals(schemaFilter.field, "name")
                                && StringUtils.containsIgnoreCase(dbTable.name(), schemaFilter.value)) {
                            return true;
                        } else {
                            return StringUtils.equals(schemaFilter.field, "type")
                                    && StringUtils.containsIgnoreCase(dbTable.type(), schemaFilter.value);
                        }

                    })
                    .map(tableMapper).toList();
        }
    }

    private SchemaFilter getSchemaFilter(String filter) {
        if (StringUtils.isBlank(filter)) {
            return null;
        }

        String[] fragments = filter.split("==");

        if (fragments.length != 2) {
            throw new GenericDataAccessException("Invalid filter condition. Only == supported for schema filter using a single value only.");
        }

        return new SchemaFilter(fragments[0], fragments[1]);
    }


    private record SchemaFilter(String field, String value) {
    }

}


================================================
FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/meta/schema/SchemaRestApi.java
================================================
package com.homihq.db2rest.rest.meta.schema;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;

import static com.homihq.db2rest.rest.RdbmsRestApi.VERSION;

@RequestMapping(VERSION + "/{dbId}/$schemas")
@Tag(name = "Schema Objects", description = "Details about schemas and tables")
public interface SchemaRestApi {
    @Operation(
            summary = "Get all database objects for a given dbId",
            description = "Get all database objects from all schemas/catalogs, tables, columns",
            tags = {"Schema Objects"}
    )
    @ApiResponses(value = {
            @ApiResponse(
                    responseCode = "200",
                    description = "Successful operation",
                    content = {
                            @Content(mediaType = "application/json",
                            schema = @Schema(oneOf = {TableObject.class, TableWithColumnsObject.class}))
                    }
            )
    })
    @GetMapping()
    List<? extends TableObject> getObjects(
            @PathVariable String dbId,
            @RequestParam(name = "filter", required = false, defaultValue = "") String filter,
            @RequestParam(name = "columns", required = false, defaultValue = "false") Boolean columns
    );
}


================================================
FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/meta/schema/TableObject.java
================================================
package com.homihq.db2rest.rest.meta.schema;

import com.db2rest.jdbc.dialect.model.DbTable;
import lombok.EqualsAndHashCode;
import lombok.Getter;

@EqualsAndHashCode
@Getter
public class TableObject {
    private final String schema;
    private final String name;
    private final String type;

    public TableObject(DbTable dbTable) {
        this.schema = dbTable.schema();
        this.name = dbTable.name();
        this.type = dbTable.type();
    }

}


================================================
FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/meta/schema/TableWithColumnsObject.java
================================================
package com.homihq.db2rest.rest.meta.schema;

import com.db2rest.jdbc.dialect.model.DbTable;
import lombok.EqualsAndHashCode;
import lombok.Getter;

import java.util.List;

@EqualsAndHashCode(callSuper = true)
@Getter
public class TableWithColumnsObject extends TableObject {
    private final List<ColumnObject> columns;

    public TableWithColumnsObject(DbTable dbTable) {
        super(dbTable);
        this.columns = dbTable.dbColumns().stream().map(ColumnObject::new).toList();
    }
}


================================================
FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/read/CountQueryController.java
================================================
package com.homihq.db2rest.rest.read;

import com.homihq.db2rest.auth.data.RoleDataFilter;
import com.homihq.db2rest.config.MultiTenancy;
import com.homihq.db2rest.core.dto.CountResponse;
import com.homihq.db2rest.jdbc.core.service.CountQueryService;
import com.homihq.db2rest.jdbc.dto.ReadContext;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestAttribute;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import static com.homihq.db2rest.config.MultiTenancy.ROLEBASEDDATAFILTERS;
import static com.homihq.db2rest.rest.RdbmsRestApi.VERSION;

import java.util.List;

@RestController
@Slf4j
@RequiredArgsConstructor
public class CountQueryController {

    private final CountQueryService countQueryService;

    @GetMapping(VERSION + "/{dbId}/{tableName}/count")
    public CountResponse count(
            @RequestAttribute(name = ROLEBASEDDATAFILTERS, required = false) List<RoleDataFilter> roleBasedDataFilters,
            @PathVariable String dbId,
            @PathVariable String tableName,
            @RequestHeader(name = "Accept-Profile", required = false) String schemaName,
            @RequestParam(name = "filter", required = false, defaultValue = "") String filter) {

        log.debug("tableName - {}", tableName);
        log.debug("filter - {}", filter);

        ReadContext readContext = ReadContext.builder()
                .dbId(dbId)
                .schemaName(schemaName)
                .tableName(tableName)
                .filter(MultiTenancy.joinFilters(filter, dbId, tableName, roleBasedDataFilters))
                .build();

        return countQueryService.count(readContext);
    }
}


================================================
FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/read/ExistsQueryController.java
================================================
package com.homihq.db2rest.rest.read;

import com.homihq.db2rest.auth.data.RoleDataFilter;
import com.homihq.db2rest.config.MultiTenancy;
import com.homihq.db2rest.core.dto.ExistsResponse;
import com.homihq.db2rest.jdbc.core.service.ExistsQueryService;
import com.homihq.db2rest.jdbc.dto.JoinDetail;
import com.homihq.db2rest.jdbc.dto.ReadContext;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestAttribute;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

import static com.homihq.db2rest.config.MultiTenancy.ROLEBASEDDATAFILTERS;
import static com.homihq.db2rest.rest.RdbmsRestApi.VERSION;

@Slf4j
@RestController
@RequiredArgsConstructor
public class ExistsQueryController {

    private final ExistsQueryService existsQueryService;

    @GetMapping(value = VERSION + "/{dbId}/{tableName}/exists", produces = "application/json")
    public ExistsResponse exists(
            @RequestAttribute(name = ROLEBASEDDATAFILTERS, required = false) List<RoleDataFilter> roleBasedDataFilters,
            @PathVariable String dbId,
            @PathVariable String tableName,
            @RequestHeader(name = "Accept-Profile", required = false) String schemaName,
            @RequestParam(name = "filter", required = false, defaultValue = "") String filter) {

        log.debug("tableName - {}", tableName);
        log.debug("filter - {}", filter);

        ReadContext readContext = ReadContext.builder()
                .dbId(dbId)
                .schemaName(schemaName)
                .tableName(tableName)
                .filter(MultiTenancy.joinFilters(filter, dbId, tableName, roleBasedDataFilters))
                .build();

        return existsQueryService.exists(readContext);
    }

	@PostMapping(value = VERSION + "/{dbId}/{tableName}/exists/_expand", produces = "application/json")
	public ExistsResponse exists(
            @RequestAttribute(name = ROLEBASEDDATAFILTERS, required = false) List<RoleDataFilter> roleBasedDataFilters,
            @PathVariable String dbId,
            @PathVariable String tableName,
            @RequestHeader(name="Accept-Profile", required = false) String schemaName,
            @RequestParam(name = "filter", required = false, defaultValue = "") String filter,
            @RequestBody List<JoinDetail> joins
	) {

        ReadContext readContext = ReadContext.builder()
                .dbId(dbId)
                .schemaName(schemaName)
                .tableName(tableName)
                .fields("*")
                .filter(MultiTenancy.joinFilters(filter, dbId, tableName, roleBasedDataFilters))
                .joins(joins)
                .build();

        return existsQueryService.exists(readContext);
    }
}


================================================
FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/read/FindOneController.java
================================================
package com.homihq.db2rest.rest.read;

import com.homihq.db2rest.auth.data.RoleDataFilter;
import com.homihq.db2rest.config.MultiTenancy;
import com.homihq.db2rest.jdbc.core.service.FindOneService;
import com.homihq.db2rest.jdbc.dto.ReadContext;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestAttribute;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.Map;

import static com.homihq.db2rest.config.MultiTenancy.ROLEBASEDDATAFILTERS;
import static com.homihq.db2rest.rest.RdbmsRestApi.VERSION;

@RestController
@Slf4j
@RequiredArgsConstructor
public class FindOneController {

    private final FindOneService findOneService;

    @GetMapping(VERSION + "/{dbId}/{tableName}/one")
    public Map<String, Object> findOne(
            @RequestAttribute(name = ROLEBASEDDATAFILTERS, required = false) List<RoleDataFilter> roleBasedDataFilters,
            @PathVariable String dbId,
            @PathVariable String tableName,
            @RequestHeader(name = "Accept-Profile", required = false) String schemaName,
            @RequestParam(name = "fields", required = false, defaultValue = "*") String fields,
            @RequestParam(name = "filter", required = false, defaultValue = "") String filter) {


        log.debug("tableName - {}", tableName);
        log.debug("fields - {}", fields);
        log.debug("filter - {}", filter);

        ReadContext readContext = ReadContext.builder()
                .dbId(dbId)
                .defaultFetchLimit(100) //todo update with config
                .schemaName(schemaName)
                .tableName(tableName)
                .filter(MultiTenancy.joinFilters(filter, dbId, tableName, roleBasedDataFilters))
                .fields(fields)
                .build();

        return this.findOneService.findOne(readContext);
    }


}


================================================
FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/read/ReadController.java
================================================
package com.homihq.db2rest.rest.read;

import com.homihq.db2rest.auth.data.RoleDataFilter;
import com.homihq.db2rest.config.Db2RestConfigProperties;
import com.homihq.db2rest.config.MultiTenancy;
import com.homihq.db2rest.jdbc.core.service.ReadService;
import com.homihq.db2rest.jdbc.dto.JoinDetail;
import com.homihq.db2rest.jdbc.dto.ReadContext;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestAttribute;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

import static com.homihq.db2rest.config.MultiTenancy.ROLEBASEDDATAFILTERS;
import static com.homihq.db2rest.rest.RdbmsRestApi.VERSION;

@RestController
@Slf4j
@RequiredArgsConstructor
public class ReadController {

    private final ReadService readService;
    private final Db2RestConfigProperties db2RestConfigProperties;

    @GetMapping(value = VERSION + "/{dbId}/{tableName}", produces = "application/json")
    public Object findAll(
            @RequestAttribute(name = ROLEBASEDDATAFILTERS, required = false) List<RoleDataFilter> roleBasedDataFilters,
            @PathVariable String dbId,
            @PathVariable String tableName,
            @RequestHeader(name = "Accept-Profile", required = false) String schemaName,
            @RequestParam(required = false, defaultValue = "*") String fields,
            @RequestParam(required = false, defaultValue = "") String filter,
            @RequestParam(name = "sort", required = false, defaultValue = "") List<String> sorts,
            @RequestParam(required = false, defaultValue = "-1") int limit,
            @RequestParam(required = false, defaultValue = "-1") long offset) {

        log.debug("filter - {}", filter);

        ReadContext readContext = ReadContext.builder()
                .dbId(dbId)
                .schemaName(schemaName)
                .tableName(tableName)
                .fields(fields)
                .filter(MultiTenancy.joinFilters(filter, dbId, tableName, roleBasedDataFilters))
                .sorts(sorts)
                .limit(limit)
                .defaultFetchLimit(db2RestConfigProperties.getDefaultFetchLimit())
                .offset(offset)
                .build();


        return readService.findAll(readContext);
    }

    @PostMapping(value = VERSION + "/{dbId}/{tableName}/_expand", produces = "application/json")
    public Object find(
            @RequestAttribute(name = ROLEBASEDDATAFILTERS, required = false) List<RoleDataFilter> roleBasedDataFilters,
            @PathVariable String dbId,
            @PathVariable String tableName,
            @RequestHeader(name = "Accept-Profile", required = false) String schemaName,
            @RequestParam(required = false, defaultValue = "*") String fields,
            @RequestParam(required = false, defaultValue = "") String filter,
            @RequestParam(name = "sort", required = false, defaultValue = "") List<String> sorts,
            @RequestParam(required = false, defaultValue = "-1") int limit,
            @RequestParam(required = false, defaultValue = "-1") long offset,
            @RequestBody List<JoinDetail> joins
    ) {
        ReadContext readContext = ReadContext.builder()
                .dbId(dbId)
                .schemaName(schemaName)
                .tableName(tableName)
                .fields(fields)
                .filter(MultiTenancy.joinFilters(filter, dbId, tableName, roleBasedDataFilters))
                .sorts(sorts)
                .limit(limit)
                .defaultFetchLimit(db2RestConfigProperties.getDefaultFetchLimit())
                .offset(offset)
                .joins(joins)
                .build();

        return readService.findAll(readContext);
    }

}


================================================
FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/rpc/FunctionController.java
================================================
package com.homihq.db2rest.rest.rpc;

import com.homihq.db2rest.jdbc.core.service.FunctionService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

import static com.homihq.db2rest.rest.RdbmsRestApi.VERSION;

@RestController
@RequestMapping(VERSION + "/{dbId}/function")
@Slf4j
@RequiredArgsConstructor
public class FunctionController {

    private final FunctionService functionService;

    @PostMapping("/{funcName}")
    public ResponseEntity<Map<String, Object>> execute(
            @PathVariable String dbId,
            @PathVariable String funcName,
            @RequestBody Map<String, Object> inParams) {

        log.debug("Execute function {} with IN params {}", funcName, inParams.entrySet());

        return ResponseEntity.ok(functionService.execute(dbId, funcName, inParams));
    }
}


================================================
FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/rpc/ProcedureController.java
================================================
package com.homihq.db2rest.rest.rpc;

import com.homihq.db2rest.jdbc.core.service.ProcedureService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

import static com.homihq.db2rest.rest.RdbmsRestApi.VERSION;

@RestController
@RequestMapping(VERSION + "/{dbId}/procedure")
@Slf4j
@RequiredArgsConstructor
public class ProcedureController {

    private final ProcedureService procedureService;

    @PostMapping("/{procName}")
    public ResponseEntity<Map<String, Object>> execute(
            @PathVariable String dbId,
            @PathVariable String procName,
            @RequestBody Map<String, Object> inParams,
            @RequestParam(name = "resultSetKeys", required = false) List<String> resultSetKeys) {
        log.debug("Execute stored procedure {} with IN params {}", procName, inParams.entrySet());
        log.info("ResultSetKeys: {}", resultSetKeys);
        return ResponseEntity.ok(procedureService.execute(dbId, procName, inParams,resultSetKeys));
    }
}


================================================
FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/sql/SQLTemplateController.java
================================================
package com.homihq.db2rest.rest.sql;

import com.homihq.db2rest.core.exception.PathVariableNamesMissingException;
import com.homihq.db2rest.core.exception.PathVariableValuesMissingException;
import com.homihq.db2rest.jdbc.core.service.SQLTemplateExecutorService;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.*;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static com.homihq.db2rest.rest.RdbmsRestApi.VERSION;

@Slf4j
@RestController
@RequestMapping(VERSION + "/{dbId}/sql")
@RequiredArgsConstructor
@Tag(name = "Parameterized SQL Template  ", description = "Details about schemas and tables")
public class SQLTemplateController {
    private final SQLTemplateExecutorService sqlTemplateExecutorService;

    @GetMapping("/{fileName}/{*userPathVariable}")
    public Object sqlTemplate(@PathVariable String dbId,
                              @PathVariable String fileName,
                              @PathVariable(name = "userPathVariable") String userPathVariable,
                              @RequestParam Map<String, String> requestParams,
                              @RequestHeader Map<String, String> requestHeaders,
                              @MatrixVariable Map<String, String> matrixVariables
    ) {
        final Map<String, Object> context = createContext(requestParams, requestHeaders, matrixVariables);
        Map<String, Object> paths = createPaths(userPathVariable, requestHeaders);
        context.put("paths", paths);

        log.debug("context - {}", context);

        return sqlTemplateExecutorService.execute(dbId, fileName, context);
    }

    @PostMapping("/{fileName}")
    public Object sqlTemplate(@PathVariable String dbId,
                                @PathVariable String fileName,
                                @RequestBody Map<String, Object> content,
                                @RequestParam Map<String, String> requestParams,
                                @RequestHeader Map<String, String> requestHeaders,
                                @MatrixVariable Map<String, String> matrixVariables) {

        final Map<String, Object> context = createContext(requestParams, requestHeaders, matrixVariables);
        context.put("content", content);

        log.debug("context - {}", context);

        return sqlTemplateExecutorService.execute(dbId, fileName, context);
    }

    private Map<String, Object> createContext(
            Map<String, String> requestParams,
            Map<String, String> requestHeaders,
            Map<String, String> matrixVariables
    ) {
        final Map<String, Object> context = new HashMap<>();
        context.put("params", requestParams);
        context.put("headers", requestHeaders);
        context.put("matrix", matrixVariables);
        return context;
    }

    private static Map<String, Object> createPaths(String userPathVariable, Map<String, String> requestHeaders) {
        final List<String> userPathVariables = Arrays.stream(userPathVariable.split("/"))
                .filter(StringUtils::isNotEmpty)
                .toList();

        final String headerPaths = requestHeaders.get("paths");

        if (!userPathVariables.isEmpty() && StringUtils.isBlank(headerPaths)) {
            throw new PathVariableNamesMissingException();
        }

        Map<String, Object> pathVariables = new HashMap<>();
        if (StringUtils.isNotBlank(headerPaths)) {
            String[] pathKeys = headerPaths.split(",");

            if (pathKeys.length != userPathVariables.size()) {
                throw new PathVariableValuesMissingException();
            }

            for (int i = 0; i < pathKeys.length; i++) {
                final String key = pathKeys[i];
                final String pathValue = userPathVariables.get(i);
                if (StringUtils.isBlank(pathValue)) {
                    throw new PathVariableValuesMissingException(key);
                }
                pathVariables.put(key, pathValue);
            }
        }
        return pathVariables;
    }
}


================================================
FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/update/UpdateController.java
================================================
package com.homihq.db2rest.rest.update;

import com.homihq.db2rest.auth.data.RoleDataFilter;
import com.homihq.db2rest.config.MultiTenancy;
import com.homihq.db2rest.core.dto.UpdateResponse;
import com.homihq.db2rest.jdbc.core.service.UpdateService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestAttribute;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.Map;

import static com.homihq.db2rest.config.MultiTenancy.ROLEBASEDDATAFILTERS;
import static com.homihq.db2rest.rest.RdbmsRestApi.VERSION;

@RestController
@Slf4j
@RequiredArgsConstructor
public class UpdateController {

    private final UpdateService updateService;

    @PatchMapping(VERSION + "/{dbId}/{tableName}")
    public UpdateResponse save(
            @RequestAttribute(name = ROLEBASEDDATAFILTERS, required = false) List<RoleDataFilter> roleBasedDataFilters,
            @PathVariable String dbId,
            @PathVariable String tableName,
            @RequestHeader(name = "Content-Profile", required = false) String schemaName,
            @RequestBody Map<String, Object> data,
            @RequestParam(name = "filter", required = false, defaultValue = "") String filter) {

        MultiTenancy.addTenantColumns(data, dbId, tableName, roleBasedDataFilters);
        int rows = updateService.patch(dbId, schemaName, tableName, data,
                MultiTenancy.joinFilters(filter, dbId, tableName, roleBasedDataFilters));
        return new UpdateResponse(rows);
    }
}


================================================
FILE: db2rest-api/api-rest/src/main/resources/application.yml
================================================
app:
  version: @project.version@
  name: @project.name@

  databases:
    - id: ${DB_ID:db}
      url: ${DB_URL:}
      username: ${DB_USER}
      password: ${DB_PASSWORD}
      schemas: ${INCLUDED_SCHEMAS:}
      maxConnections: ${MAX_POOL_SIZE:5}

server:
  port: ${SERVER_PORT:8080}
  forward-headers-strategy: framework

  compression:
    enabled: ${GZIP_ENABLED:false}
    mime-types: application/json
    min-response-size: ${GZIP_MIN_RESPONSE_SIZE:1024}
    # excluded-user-agents: MSIE 6.0,UCBrowser


spring:

  threads:
    virtual:
      enabled: true

  banner:
    location: classpath:banner.txt

  servlet:
    multipart:
      enabled: true
      max-file-size: 5MB
      max-request-size: 5MB

cors:
  enabled: ${ENABLE_CORS:false}
  mappings: ${CORS_MAPPING:[{}]}


db2rest:

  auth:
    enabled: ${ENABLE_AUTH:false}
    provider: ${AUTH_PROVIDER:basic}
    data:
      source: ${AUTH_DATA_SOURCE}

  dateTime:
    enableDataTimeFormatting: ${ENABLE_DATETIME_FORMATTING:false}
    timeFormat: ${TIME_FORMAT:HH:mm:ss}
    dateFormat: ${DATE_FORMAT:yyyy-MM-dd}
    dateTimeFormat: ${DATE_TIME_FORMAT:yyyy-MM-dd HH:mm:ss}

  defaultFetchLimit: ${DEFAULT_FETCH_LIMIT:100}

  allowSafeDelete : ${ALLOW_SAFE_DELETE:true}

  templates: ${SQL_TEMPLATE_PATH}

logging:
  level:
    com: 
      homihq: 
       db2rest: 
         rest: INFO
         jdbc:
           core:
             service: INFO

    org:
      springframework:
        web: INFO
        beans: INFO
        jdbc: DEBUG


management:
  endpoints:
    web:
      exposure:
        include: "health,info,httpexchanges,prometheus,metrics"
  datadog:
    metrics:
      export:
        enabled: ${DATADOG_EXPORT_ENABLED:false}
        api-key: ${DATADOG_API_KEY}
        application-key: ${DATADOG_APPLICATION_KEY}
        uri: ${DATADOG_EXPORT_URI}
        step: ${DATADOG_EXPORT_INTERVAL:30s}

  prometheus:
    metrics:
      export:
        enabled: ${PROMETHEUS_EXPORT_ENABLED:false}




================================================
FILE: db2rest-api/api-rest/src/main/resources/banner.txt
================================================

${AnsiColor.RED}    ____  ____  ____ ____  ____  _____ ____ _____  ____
${AnsiColor.BLUE}   / / / |  _ \| __ )___ \|  _ \| ____/ ___|_   _| \ \ \
${AnsiColor.YELLOW}  | | |  | | | |  _ \ __) | |_) |  _| \___ \ | |    | | |
${AnsiColor.GREEN} < < <   | |_| | |_) / __/|  _ <| |___ ___) || |     > > >
${AnsiColor.MAGENTA}  | | |  |____/|____/_____|_| \_\_____|____/ |_|    | | |
${AnsiColor.BRIGHT_GREEN}   \_\_\ ========================================= /_/_/
   ${AnsiColor.DEFAULT}+---------------------------------------------------+
   |${AnsiColor.GREEN}:: ${app.name} version ::     ${AnsiColor.DEFAULT}v${app.version}               |
   |${AnsiColor.GREEN}:: Spring-Boot version ::     ${AnsiColor.DEFAULT}v${spring-boot.version}               |
   |${AnsiColor.GREEN}:: Visit ${app.name} website :: ${AnsiColor.DEFAULT}[https://db2rest.com/] |
   ${AnsiColor.DEFAULT}+---------------------------------------------------+

================================================
FILE: db2rest-api/api-rest/src/main/resources/sql-templates/count.jte
================================================
@param String rootTable
@param String rootWhere

SELECT
    COUNT(*)
FROM
    ${rootTable}
@if(rootWhere != null)
    WHERE ${rootWhere}
@endif


================================================
FILE: db2rest-api/api-rest/src/main/resources/sql-templates/delete-mssql.jte
================================================
@param String rootTable
@param String rootWhere
@param String rootTableAlias

DELETE FROM ${rootTableAlias}
FROM ${rootTable}

@if(rootWhere != null)
    WHERE ${rootWhere}
@endif


================================================
FILE: db2rest-api/api-rest/src/main/resources/sql-templates/delete.jte
================================================
@param String rootTable
@param String rootWhere

DELETE FROM
    ${rootTable}
@if(rootWhere != null)
    WHERE ${rootWhere}
@endif


================================================
FILE: db2rest-api/api-rest/src/main/resources/sql-templates/exists-mssql.jte
================================================
@import com.db2rest.jdbc.dialect.model.DbJoin
@import java.util.List

@param String rootTable
@param String rootWhere
@param List<DbJoin> joins

SELECT TOP 1 1
FROM ${rootTable}
@if(joins != null)
    @for(DbJoin join : joins)
        ${join.render()}
    @endfor
@endif
@if(rootWhere != null)
    WHERE ${rootWhere}
@endif


================================================
FILE: db2rest-api/api-rest/src/main/resources/sql-templates/exists.jte
================================================
@import com.db2rest.jdbc.dialect.model.DbJoin
@import java.util.List

@param String rootTable
@param String rootWhere
@param List<DbJoin> joins

SELECT
    1
FROM ${rootTable}
@if(joins != null)
    @for(DbJoin join : joins)
        ${join.render()}
    @endfor
@endif
@if(rootWhere != null)
    WHERE ${rootWhere}
@endif
LIMIT 1


================================================
FILE: db2rest-api/api-rest/src/main/resources/sql-templates/find-one.jte
================================================
@param String rootTable
@param String rootWhere
@param String columns

SELECT
    ${columns}
FROM
    ${rootTable}
@if(rootWhere != null)
    WHERE ${rootWhere}
@endif


================================================
FILE: db2rest-api/api-rest/src/main/resources/sql-templates/insert.jte
================================================
@param String columns
@param String table
@param String parameters

INSERT INTO ${table}
    (${columns})
VALUES
    (${parameters})


================================================
FILE: db2rest-api/api-rest/src/main/resources/sql-templates/read-mssql.jte
================================================
@import com.db2rest.jdbc.dialect.model.DbJoin
@import java.util.List

@param List<DbJoin> joins
@param String rootTable
@param String columns
@param String rootWhere
@param String sorts
@param Integer limit
@param Long offset

@if(sorts != null)
    SELECT
        ${columns}
    FROM ${rootTable}
    @if(joins != null)
        @for(DbJoin join : joins)
            ${join.render()}
        @endfor
    @endif
    @if(rootWhere != null)
        WHERE ${rootWhere}
    @endif
    ORDER BY ${sorts}
    @if(limit != null)
        OFFSET ${(offset == null ? 0 : offset)} ROWS FETCH NEXT ${limit} ROWS ONLY
    @endif
@elseif(limit != null)
    @if(offset != null)
        SELECT T.* FROM
        (
            SELECT
                ${columns},
                ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS rowIndex
            FROM ${rootTable}
            @if(joins != null)
                @for(DbJoin join : joins)
                    ${join.render()}
                @endfor
            @endif
            @if(rootWhere != null)
                WHERE ${rootWhere}
            @endif
        ) AS T
        WHERE rowIndex > ${offset} AND rowIndex <= ${offset + limit}
    @else
        SELECT TOP ${limit} ${columns}
        FROM ${rootTable}
        @if(joins != null)
            @for(DbJoin join : joins)
                ${join.render()}
            @endfor
        @endif
        @if(rootWhere != null)
            WHERE ${rootWhere}
        @endif
    @endif
@else
    SELECT
        ${columns}
    FROM ${rootTable}
    @if(joins != null)
        @for(DbJoin join : joins)
            ${join.render()}
        @endfor
    @endif
    @if(rootWhere != null)
        WHERE ${rootWhere}
    @endif
@endif


================================================
FILE: db2rest-api/api-rest/src/main/resources/sql-templates/read-ora-12.jte
================================================
@import com.db2rest.jdbc.dialect.model.DbJoin
@import java.util.List

@param List<DbJoin> joins
@param String rootTable
@param String columns
@param String rootWhere
@param String sorts
@param Integer limit
@param Long offset

SELECT
    ${columns}
FROM
    ${rootTable}
@if(joins != null)
    @for(DbJoin join : joins)
        ${join.render()}
    @endfor
@endif
@if(rootWhere != null)
    WHERE ${rootWhere}
@endif
@if(sorts != null)
    ORDER BY ${sorts}
@endif
@if(limit != null)
    @if(offset != null)
        OFFSET ${offset} ROWS
        FETCH NEXT ${limit} ROWS ONLY
    @else
        FETCH FIRST ${limit} ROWS ONLY
    @endif
@endif


================================================
FILE: db2rest-api/api-rest/src/main/resources/sql-templates/read-ora-9.jte
================================================
@import com.db2rest.jdbc.dialect.model.DbJoin
@import java.util.List

@param List<DbJoin> joins
@param String rootTable
@param String columns
@param String rootWhere
@param String sorts
@param Integer limit
@param Long offset

@if(limit != null)
    @if(offset != null)
        SELECT T.* FROM
        (
            SELECT T.*, rownum as rowIndex FROM
            (
                SELECT
                    ${columns}
                FROM
                    ${rootTable}
                @if(joins != null)
                    @for(DbJoin join : joins)
                        ${join.render()}
                    @endfor
                @endif
                @if(rootWhere != null)
                    WHERE ${rootWhere}
                @endif
                @if(sorts != null)
                    ORDER BY ${sorts}
                @endif
            ) T
        ) T
        WHERE rowIndex > ${offset} AND rowIndex <= ${offset + limit}
    @else
        SELECT * FROM (
            SELECT
                ${columns}
            FROM
                ${rootTable}
            @if(joins != null)
                @for(DbJoin join : joins)
                    ${join.render()}
                @endfor
            @endif
            @if(rootWhere != null)
                WHERE ${rootWhere}
            @endif
            @if(sorts != null)
                ORDER BY ${sorts}
            @endif
        )
        WHERE ROWNUM <= ${limit}
    @endif
@else
    SELECT
        ${columns}
    FROM
        ${rootTable}
    @if(joins != null)
        @for(DbJoin join : joins)
            ${join.render()}
        @endfor
    @endif
    @if(rootWhere != null)
        WHERE ${rootWhere}
    @endif
    @if(sorts != null)
        ORDER BY ${sorts}
    @endif
@endif


================================================
FILE: db2rest-api/api-rest/src/main/resources/sql-templates/read.jte
================================================
@import com.db2rest.jdbc.dialect.model.DbJoin
@import java.util.List

@param List<DbJoin> joins
@param String rootTable
@param String columns
@param String rootWhere
@param String sorts
@param Integer limit
@param Long offset

SELECT
    ${columns}
FROM
    ${rootTable}
@if(joins != null)
    @for(DbJoin join : joins)
        ${join.render()}
    @endfor
@endif
@if(rootWhere != null)
    WHERE ${rootWhere}
@endif
@if(sorts != null)
    ORDER BY ${sorts}
@endif
@if(limit != null)
    LIMIT ${limit}
    @if(offset != null)
        OFFSET ${offset}
    @endif
@endif


================================================
FILE: db2rest-api/api-rest/src/main/resources/sql-templates/update-mssql.jte
================================================
@param String rootTable
@param String rootWhere
@param String columnSets
@param String rootTableAlias

UPDATE ${rootTableAlias}
SET ${columnSets}
FROM ${rootTable}
@if(rootWhere != null)
    WHERE ${rootWhere}
@endif


================================================
FILE: db2rest-api/api-rest/src/main/resources/sql-templates/update.jte
================================================
@param String rootTable
@param String rootWhere
@param String columnSets

UPDATE ${rootTable}
SET ${columnSets}
@if(rootWhere != null)
    WHERE ${rootWhere}
@endif


================================================
FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/BaseIntegrationTest.java
================================================
package com.homihq.db2rest;

import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.documentationConfiguration;

import java.io.IOException;
import java.nio.file.Paths;
import java.util.List;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.params.provider.Arguments;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.restdocs.RestDocumentationContextProvider;
import org.springframework.restdocs.RestDocumentationExtension;
import org.springframework.restdocs.templates.TemplateFormats;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;

import com.homihq.db2rest.config.Db2RestConfigProperties;

import lombok.extern.slf4j.Slf4j;

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
@ExtendWith({RestDocumentationExtension.class})
@Slf4j
public abstract class BaseIntegrationTest {

    @Autowired
    protected MockMvc mockMvc;

    @Autowired
    protected ApplicationContext applicationContext;

    @Autowired
    protected Db2RestConfigProperties db2RestConfigProperties;

    @BeforeEach
    void setUp(WebApplicationContext webApplicationContext, RestDocumentationContextProvider restDocumentation) {
        createMockMvc(webApplicationContext, restDocumentation);
        setupEnv();
    }

    protected void createMockMvc(WebApplicationContext webApplicationContext, RestDocumentationContextProvider restDocumentation) {
        mockMvc = MockMvcBuilders
                .webAppContextSetup(webApplicationContext)
                .apply(documentationConfiguration(restDocumentation).snippets().withTemplateFormat(TemplateFormats.markdown()))
                .build();
    }

    void setupEnv() {
        var templatesLocation = db2RestConfigProperties.getTemplates();
        if (templatesLocation.startsWith(ResourceLoader.CLASSPATH_URL_PREFIX)) {
            try {
                Resource resource = applicationContext.getResource(templatesLocation);
                var resolvedTemplatesLocation = String.valueOf(Paths.get(resource.getFile().getAbsolutePath()));
                db2RestConfigProperties.setTemplates(resolvedTemplatesLocation);
            } catch (IOException ioe) {
                log.debug("Error while resolve _sql templates location for testing", ioe);
            }
        }
    }

    static List<Arguments> isoDateTimeFormats() {
        return List.of(Arguments.of("2011-12-03T10:15:30"),
                Arguments.of("2011-12-03T10:15:30.123"),
                Arguments.of("2011-12-03T10:15:30+01:00"),
                Arguments.of("2011-12-03T10:15:30-05:00"),
                Arguments.of("2011-12-03T10:15:30Z"),
                Arguments.of("2011-12-03T10:15:30.123Z"),
                Arguments.of("2011-12-03T10:15:30.123+05:30"),
                Arguments.of("2011-12-03T10:15:30+01:00[Europe/Paris]"),
                Arguments.of("2011-12-03T10:15:30.123+01:00[Europe/Paris]"));
    }
}


================================================
FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/DB2BaseIntegrationTest.java
================================================
package com.homihq.db2rest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Import;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.ActiveProfiles;

@Import(DB2ContainerConfiguration.class)
@ActiveProfiles("it-db2")
public class DB2BaseIntegrationTest extends BaseIntegrationTest {
    @Autowired
    private JdbcTemplate jdbcTemplate;

    protected boolean deleteRow(String table, String column, int id) {
        var query = "DELETE FROM " + table + " WHERE " + column + " = ?";
        return jdbcTemplate.update(query, id) == 1;
    }
}


================================================
FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/DB2ContainerConfiguration.java
================================================
package com.homihq.db2rest;

import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Profile;
import org.testcontainers.db2.Db2Container;
import org.testcontainers.ext.ScriptUtils;
import org.testcontainers.jdbc.JdbcDatabaseDelegate;

import com.homihq.db2rest.jdbc.multidb.RoutingDataSource;

@TestConfiguration(proxyBeanMethods = false)
@Profile("it-db2")
public class DB2ContainerConfiguration {

    private static final List<String> db2Scripts = List.of("db2/db2-sakila.sql"
            , "db2/db2-sakila-data.sql");

    private static final Db2Container db2 = new Db2Container("icr.io/db2_community/db2:11.5.8.0").acceptLicense()
            .withDatabaseName("BLUDB")
            .withUsername("db2inst1")
            .withPassword("password")
            .withReuse(true);

    static {
        db2.start();
        var containerDelegate = new JdbcDatabaseDelegate(db2, "");
        db2Scripts.forEach(initScript -> ScriptUtils.runInitScript(containerDelegate, initScript));
    }

    @Bean
    public DataSource dataSource() {

        var dataSourceBuilder = DataSourceBuilder.create();
        dataSourceBuilder.driverClassName("com.ibm.db2.jcc.DB2Driver");
        dataSourceBuilder.url(db2.getJdbcUrl());
        dataSourceBuilder.username(db2.getUsername());
        dataSourceBuilder.password(db2.getPassword());
        DataSource dataSource = dataSourceBuilder.build();

        final RoutingDataSource routingDataSource = new RoutingDataSource();
        routingDataSource.setTargetDataSources(Map.of("db2b", dataSource));
        routingDataSource.setDefaultTargetDataSource(dataSource);

        return routingDataSource;
    }
    
}


================================================
FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/MariaDBBaseIntegrationTest.java
================================================
package com.homihq.db2rest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Import;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.ActiveProfiles;

@Import(MariaDBContainerConfiguration.class)
@ActiveProfiles("it-mariadb")
public class MariaDBBaseIntegrationTest extends BaseIntegrationTest {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    protected boolean deleteRow(String table, String column, int id) {
        var query = "DELETE FROM " + table + " WHERE " + column + " = ?";
        return jdbcTemplate.update(query, id) == 1;
    }
}


================================================
FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/MariaDBContainerConfiguration.java
================================================
package com.homihq.db2rest;


import com.homihq.db2rest.jdbc.multidb.RoutingDataSource;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Profile;
import org.testcontainers.containers.MariaDBContainer;
import org.testcontainers.ext.ScriptUtils;
import org.testcontainers.jdbc.JdbcDatabaseDelegate;

import javax.sql.DataSource;
import java.util.List;
import java.util.Map;

@TestConfiguration(proxyBeanMethods = false)
@Profile("it-mariadb")
public class MariaDBContainerConfiguration {

    private static final List<String> mariaDbScripts = List.of("mariadb/mariadb-sakila.sql",
            "mariadb/mariadb-sakila-data.sql");

    private static final MariaDBContainer mariaDbContainer =
            (MariaDBContainer) new MariaDBContainer("mariadb:11.0")
                    .withDatabaseName("sakila")
                    .withUsername("maria")
                    .withPassword("test")
                    .withReuse(true);

    static {
        mariaDbContainer.start();
        var containerDelegate = new JdbcDatabaseDelegate(mariaDbContainer, "");
        mariaDbScripts.forEach(initScript -> ScriptUtils.runInitScript(containerDelegate, initScript));
    }


    @Bean
    public DataSource dataSource() {
        var dataSourceBuilder = DataSourceBuilder.create();
        dataSourceBuilder.driverClassName("org.mariadb.jdbc.Driver");
        dataSourceBuilder.url(mariaDbContainer.getJdbcUrl());
        dataSourceBuilder.username(mariaDbContainer.getUsername());
        dataSourceBuilder.password(mariaDbContainer.getPassword());
        DataSource dataSource = dataSourceBuilder.build();

        final RoutingDataSource routingDataSource = new RoutingDataSource();
        routingDataSource.setTargetDataSources(Map.of("mariadb", dataSource));
        routingDataSource.setDefaultTargetDataSource(dataSource);

        return routingDataSource;
    }
}


================================================
FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/MsSQLServerContainerConfiguration.java
================================================
package com.homihq.db2rest;

import com.homihq.db2rest.jdbc.multidb.RoutingDataSource;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Profile;
import org.testcontainers.containers.MSSQLServerContainer;
import org.testcontainers.ext.ScriptUtils;
import org.testcontainers.jdbc.JdbcDatabaseDelegate;

import javax.sql.DataSource;
import java.util.List;
import java.util.Map;

@TestConfiguration(proxyBeanMethods = false)
@Profile("it-mssql")
public class MsSQLServerContainerConfiguration {

    private static final MSSQLServerContainer<?> MSSQL_SERVER_CONTAINER =
            new MSSQLServerContainer<>("mcr.microsoft.com/mssql/server:2022-latest")
                    .acceptLicense();

    private static final List<String> SCRIPTS = List.of(
            "mssql/mssql-sakila.sql",
            "mssql/mssql-sakila-data.sql"
    );

    static {
        MSSQL_SERVER_CONTAINER.start();
        var containerDelegate = new JdbcDatabaseDelegate(MSSQL_SERVER_CONTAINER, "");
        SCRIPTS.forEach(script -> ScriptUtils.runInitScript(containerDelegate, script));
    }

    @Bean
    public DataSource dataSource() {
        var dataSourceBuilder = DataSourceBuilder.create();
        dataSourceBuilder.url(MSSQL_SERVER_CONTAINER.getJdbcUrl());
        dataSourceBuilder.username(MSSQL_SERVER_CONTAINER.getUsername());
        dataSourceBuilder.password(MSSQL_SERVER_CONTAINER.getPassword());
        DataSource dataSource = dataSourceBuilder.build();

        var routingDataSource = new RoutingDataSource();
        routingDataSource.setTargetDataSources(Map.of("mssql", dataSource));
        routingDataSource.setDefaultTargetDataSource(dataSource);

        return routingDataSource;
    }

}


================================================
FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/MySQLBaseIntegrationTest.java
================================================
package com.homihq.db2rest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Import;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.ActiveProfiles;

@Import(MySQLContainerConfiguration.class)
@ActiveProfiles("it-mysql")
public class MySQLBaseIntegrationTest extends BaseIntegrationTest {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    protected boolean deleteRow(String table, String column, int id) {
        var query = "DELETE FROM " + table + " WHERE " + column + " = ?";
        return jdbcTemplate.update(query, id) == 1;
    }
}


================================================
FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/MySQLContainerConfiguration.java
================================================
package com.homihq.db2rest;

import com.homihq.db2rest.jdbc.multidb.RoutingDataSource;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Profile;
import org.testcontainers.containers.MySQLContainer;
import org.testcontainers.ext.ScriptUtils;
import org.testcontainers.jdbc.JdbcDatabaseDelegate;

import javax.sql.DataSource;
import java.util.List;
import java.util.Map;

@TestConfiguration(proxyBeanMethods = false)
@Profile("it-mysql")
public class MySQLContainerConfiguration {

    private static final List<String> mySqlScripts = List.of("mysql/mysql-sakila.sql",
            "mysql/mysql-sakila-data.sql", "mysql/mysql-wakila-all.sql");

    private static final MySQLContainer mySQLContainer =
            (MySQLContainer) new MySQLContainer("mysql:8.2")
                    .withDatabaseName("sakila")
                    .withUsername("root")
                    //.withPassword("mysql")
                    .withReuse(true);

    static {
        mySQLContainer.start();
        var containerDelegate = new JdbcDatabaseDelegate(mySQLContainer, "");
        mySqlScripts.forEach(initScript -> ScriptUtils.runInitScript(containerDelegate, initScript));
    }


    @Bean
    public DataSource dataSource() {
        var dataSourceBuilder = DataSourceBuilder.create();
        dataSourceBuilder.driverClassName("com.mysql.cj.jdbc.Driver");
        dataSourceBuilder.url(mySQLContainer.getJdbcUrl());
        dataSourceBuilder.username(mySQLContainer.getUsername());
        dataSourceBuilder.password(mySQLContainer.getPassword());
        DataSource dataSource = dataSourceBuilder.build();

        final RoutingDataSource routingDataSource = new RoutingDataSource();
        routingDataSource.setTargetDataSources(Map.of("mysqldb", dataSource));
        routingDataSource.setDefaultTargetDataSource(dataSource);

        return routingDataSource;
    }
}


================================================
FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/OracleBaseIntegrationTest.java
================================================
package com.homihq.db2rest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Import;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.ActiveProfiles;

@Import(OracleContainerConfiguration.class)
@ActiveProfiles("it-oracle")
public class OracleBaseIntegrationTest extends BaseIntegrationTest {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    protected boolean deleteRow(String table, String column, int id) {
        var query = "DELETE FROM " + table + " WHERE " + column + " = ?";
        return jdbcTemplate.update(query, id) == 1;
    }

}


================================================
FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/OracleContainerConfiguration.java
================================================
package com.homihq.db2rest;

import com.homihq.db2rest.jdbc.multidb.RoutingDataSource;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Profile;
import org.testcontainers.containers.OracleContainer;
import org.testcontainers.ext.ScriptUtils;
import org.testcontainers.jdbc.JdbcDatabaseDelegate;

import javax.sql.DataSource;
import java.util.List;
import java.util.Map;

@TestConfiguration(proxyBeanMethods = false)
@Profile("it-oracle")
public class OracleContainerConfiguration {

    private static final List<String> oracleScripts = List.of("oracle/oracle-sakila.sql"
            , "oracle/oracle-sakila-data.sql");

    private static final OracleContainer testOracle10g =
            new OracleContainer("gvenzl/oracle-xe:21-slim-faststart")
                    .withDatabaseName("testDB")
                    .withUsername("testUser")
                    .withPassword("testPassword")
                    .withReuse(true);

    static {
        testOracle10g.start();
        var containerDelegate = new JdbcDatabaseDelegate(testOracle10g, "");
        oracleScripts.forEach(initScript -> ScriptUtils.runInitScript(containerDelegate, initScript));
    }

    @Bean
    public DataSource dataSource() {

        var dataSourceBuilder = DataSourceBuilder.create();
        dataSourceBuilder.driverClassName("oracle.jdbc.OracleDriver");
        dataSourceBuilder.url(testOracle10g.getJdbcUrl());
        dataSourceBuilder.username(testOracle10g.getUsername());
        dataSourceBuilder.password(testOracle10g.getPassword());
        DataSource dataSource = dataSourceBuilder.build();

        final RoutingDataSource routingDataSource = new RoutingDataSource();
        routingDataSource.setTargetDataSources(Map.of("oradb", dataSource));
        routingDataSource.setDefaultTargetDataSource(dataSource);

        return routingDataSource;
    }

}


================================================
FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/PostgreSQLBaseIntegrationTest.java
================================================
package com.homihq.db2rest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Import;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.ActiveProfiles;

@Import(PostgreSQLContainerConfiguration.class)
@ActiveProfiles("it-pg")
public class PostgreSQLBaseIntegrationTest extends BaseIntegrationTest {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    protected boolean deleteRow(String table, String column, int id) {
        var query = "DELETE FROM " + table + " WHERE " + column + " = ?";
        return jdbcTemplate.update(query, id) == 1;
    }
}


================================================
FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/PostgreSQLContainerConfiguration.java
================================================
package com.homihq.db2rest;


import com.homihq.db2rest.jdbc.multidb.RoutingDataSource;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Profile;
import org.testcontainers.containers.PostgreSQLContainer;
import org.testcontainers.ext.ScriptUtils;
import org.testcontainers.jdbc.JdbcDatabaseDelegate;

import javax.sql.DataSource;
import java.util.List;
import java.util.Map;

@TestConfiguration(proxyBeanMethods = false)
@Profile("it-pg")
public class PostgreSQLContainerConfiguration {

    private static final List<String> postgresScripts = List.of("pg/postgres-sakila.sql",
            "pg/postgres-sakila-data.sql", "pg/pg-sakila-functions.sql");

    private static final PostgreSQLContainer testPostgres =
            (PostgreSQLContainer) new PostgreSQLContainer("postgres:15.2-alpine")
                    .withDatabaseName("postgres")
                    .withUsername("postgres")
                    .withPassword("postgres")
                    .withReuse(true);

    static {
        testPostgres.start();
        var containerDelegate = new JdbcDatabaseDelegate(testPostgres, "");
        postgresScripts.forEach(initScript -> ScriptUtils.runInitScript(containerDelegate, initScript));
    }

    @Bean
    public DataSource dataSource() {
        var dataSourceBuilder = DataSourceBuilder.create();
        dataSourceBuilder.driverClassName("org.postgresql.Driver");
        dataSourceBuilder.url(testPostgres.getJdbcUrl() + "&escapeSyntaxCallMode=callIfNoReturn");
        dataSourceBuilder.username(testPostgres.getUsername());
        dataSourceBuilder.password(testPostgres.getPassword());
        DataSource dataSource = dataSourceBuilder.build();

        final RoutingDataSource routingDataSource = new RoutingDataSource();
        routingDataSource.setTargetDataSources(Map.of("pgsqldb", dataSource));
        routingDataSource.setDefaultTargetDataSource(dataSource);

        return routingDataSource;
    }

}


================================================
FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/SQLiteBaseIntegrationTest.java
================================================
package com.homihq.db2rest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Import;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.ActiveProfiles;

@Import(SQLiteContainerConfiguration.class)
@ActiveProfiles("it-sqlite")
public class SQLiteBaseIntegrationTest extends BaseIntegrationTest {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    protected boolean deleteRow(String table, String column, int id) {
        var query = "DELETE FROM " + table + " WHERE " + column + " = ?";
        return jdbcTemplate.update(query, id) == 1;
    }
}

================================================
FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/SQLiteContainerConfiguration.java
================================================
package com.homihq.db2rest;

import com.homihq.db2rest.jdbc.multidb.RoutingDataSource;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Profile;
import org.springframework.core.io.ClassPathResource;
import org.springframework.jdbc.datasource.init.ScriptUtils;

import javax.sql.DataSource;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

@TestConfiguration(proxyBeanMethods = false)
@Profile("it-sqlite")
public class SQLiteContainerConfiguration {

    private static final List<String> sqliteScripts = List.of("sqlite/sqlite-sakila.sql",
            "sqlite/sqlite-sakila-data.sql");

    private static final String SQLITE_DB_FILE;

    static {
        try {
            File tempFile = Files.createTempFile("sqlite-test", ".db").toFile();
            tempFile.deleteOnExit();
            SQLITE_DB_FILE = tempFile.getAbsolutePath();
            
            // Initialize database with scripts
            var dataSourceBuilder = DataSourceBuilder.create();
            dataSourceBuilder.driverClassName("org.sqlite.JDBC");
            dataSourceBuilder.url("jdbc:sqlite:" + SQLITE_DB_FILE);
            DataSource initDataSource = dataSourceBuilder.build();
            
            try (Connection connection = initDataSource.getConnection()) {
                for (String script : sqliteScripts) {
                    ScriptUtils.executeSqlScript(connection, new ClassPathResource(script));
                }
            }
        } catch (IOException | SQLException e) {
            throw new RuntimeException("Failed to initialize SQLite test database", e);
        }
    }

    @Bean
    public DataSource dataSource() {
        var dataSourceBuilder = DataSourceBuilder.create();
        dataSourceBuilder.driverClassName("org.sqlite.JDBC");
        dataSourceBuilder.url("jdbc:sqlite:" + SQLITE_DB_FILE);
        DataSource dataSource = dataSourceBuilder.build();

        final RoutingDataSource routingDataSource = new RoutingDataSource();
        routingDataSource.setTargetDataSources(Map.of("sqlitedb", dataSource));
        routingDataSource.setDefaultTargetDataSource(dataSource);

        return routingDataSource;
    }
}

================================================
FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/jdbc/rest/meta/db/DbInfoControllerIntegrationTest.java
================================================
package com.homihq.db2rest.jdbc.rest.meta.db;

import com.homihq.db2rest.BaseIntegrationTest;
import com.homihq.db2rest.jdbc.JdbcManager;
import com.db2rest.jdbc.dialect.model.DbColumn;
import com.db2rest.jdbc.dialect.model.DbTable;
import com.homihq.db2rest.jdbc.sql.DbMeta;
import com.homihq.db2rest.rest.meta.db.DbInfoController;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.springframework.boot.test.mock.mockito.MockBean;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static com.homihq.db2rest.rest.RdbmsRestApi.VERSION;
import static org.mockito.Mockito.when;
import static org.springframework.http.MediaType.APPLICATION_JSON;
import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@Disabled
class DbInfoControllerIntegrationTest extends BaseIntegrationTest {

    Map<String, DbMeta> metadataMap;
    @MockBean
    JdbcManager jdbcManager;

    DbInfoController dbInfoController;

    @BeforeEach
    void setUp() {
        List<DbTable> dbTableList = new ArrayList<>();
        List<DbColumn> dbColumns = new ArrayList<>();
        dbColumns.add(new DbColumn("tableName", "name", "alias",
                "tableAlias", true, "columnDataType", false, false,
                null, "coverChar", "jsonParts"));

        dbTableList.add(new DbTable("schema", "name", "fullName",
                "alias", dbColumns, "type", "coverChar"));

        metadataMap = new HashMap<>();
        metadataMap.put("1", new DbMeta("productName", 2, "driverName",
                "driverVersion", dbTableList));
        dbInfoController = new DbInfoController(jdbcManager);
        when(jdbcManager.getDbMetaMap()).thenReturn(metadataMap);
    }


    //@Test
    void getObjects() throws Exception {
        mockMvc.perform(get(VERSION + "/$dbs")
                        .contentType(APPLICATION_JSON).accept(APPLICATION_JSON))
                .andDo(print())
                .andExpect(status().isOk())
                .andExpect(jsonPath("$").isArray())
                .andExpect(jsonPath("$[0].dbId").value("1"))  // Validate dbId field of the first object
                .andExpect(jsonPath("$[0].productName").value("productName"))  // Validate productName field
                .andExpect(jsonPath("$[0].majorVersion").value(2))  // Validate majorVersion field
                .andExpect(jsonPath("$[0].driverName").value("driverName"))  // Validate driverName field
                .andExpect(jsonPath("$[0].driverVersion").value("driverVersion"));
    }
}


================================================
FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/jdbc/rest/meta/db/DbInfoControllerTest.java
================================================
package com.homihq.db2rest.jdbc.rest.meta.db;

import com.homihq.db2rest.jdbc.JdbcManager;
import com.db2rest.jdbc.dialect.model.DbColumn;
import com.db2rest.jdbc.dialect.model.DbTable;
import com.homihq.db2rest.jdbc.sql.DbMeta;
import com.homihq.db2rest.rest.meta.db.DbInfoController;
import com.homihq.db2rest.rest.meta.db.DbInfoObject;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.when;

class DbInfoControllerTest {

    Map<String, DbMeta> metadataMap;

    @BeforeEach
    void setUp() {
        List<DbTable> dbTableList = new ArrayList<>();
        List<DbColumn> dbColumns = new ArrayList<>();
        dbColumns.add(new DbColumn("tableName", "name", "alias",
                "tableAlias", true, "columnDataType", false, false,
                null, "coverChar", "jsonParts"));

        dbTableList.add(new DbTable("schema", "name", "fullName",
                "alias", dbColumns, "type", "coverChar"));

        metadataMap = new HashMap<>();
        metadataMap.put("key", new DbMeta("productName", 2, "driverName",
                "driverVersion", dbTableList));
    }

    @Test
    void testGetObjects() {

        JdbcManager jdbcManagerMock = Mockito.mock(JdbcManager.class);
        when(jdbcManagerMock.getDbMetaMap()).thenReturn(metadataMap);
        DbInfoController dbInfoController = new DbInfoController(jdbcManagerMock);
        List<DbInfoObject> actualDbInfoList = dbInfoController.getObjects();
        List<DbInfoObject> expectedDbInfoList = new ArrayList<>();
        metadataMap.forEach(
                (k, v) -> expectedDbInfoList.add(new DbInfoObject(k, v.productName(), v.majorVersion(), v.driverName(), v.driverVersion()))
        );

        assertEquals(expectedDbInfoList, actualDbInfoList);
    }
}


================================================
FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/jdbc/rest/meta/schema/SchemaControllerIntegrationTest.java
================================================
package com.homihq.db2rest.jdbc.rest.meta.schema;

import com.homihq.db2rest.BaseIntegrationTest;
import com.homihq.db2rest.jdbc.JdbcManager;
import com.db2rest.jdbc.dialect.model.DbColumn;
import com.db2rest.jdbc.dialect.model.DbTable;
import com.homihq.db2rest.jdbc.sql.DbMeta;
import com.homihq.db2rest.rest.meta.schema.SchemaController;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.mock.mockito.MockBean;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static com.homihq.db2rest.rest.RdbmsRestApi.VERSION;
import static org.hamcrest.Matchers.hasSize;
import static org.hamcrest.core.AnyOf.anyOf;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.when;
import static org.springframework.http.MediaType.APPLICATION_JSON;
import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document;
import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

class SchemaControllerIntegrationTest extends BaseIntegrationTest {

    Map<String, DbMeta> metadataMap;
    @MockBean
    JdbcManager jdbcManager;
    SchemaController schemaController;

    @BeforeEach
    void setUp() {
        List<DbTable> dbTableList = new ArrayList<>();
        List<DbColumn> dbColumns = new ArrayList<>();
        dbColumns.add(new DbColumn("tableName", "name", "alias",
                "tableAlias", true, "columnDataType", false, false,
                null, "coverChar", "jsonParts"));

        dbTableList.add(new DbTable("schema", "name", "fullName",
                "alias", dbColumns, "type", "coverChar"));

        metadataMap = new HashMap<>();
        metadataMap.put("key", new DbMeta("productName", 2, "driverName",
                "driverVersion", dbTableList));
        schemaController = new SchemaController(jdbcManager);
        when(jdbcManager.getDbMetaByDbId(anyString())).thenReturn(metadataMap.get("key"));
    }

    /**
     * This test tests the use case where we request for all schemas without
     * providing any filter.
     *
     * @throws Exception
     */
    @Test
    void testGetObjects() throws Exception {
        mockMvc.perform(get(VERSION + "/1/$schemas")
                        .contentType(APPLICATION_JSON).accept(APPLICATION_JSON))
                .andDo(print())
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.*").isArray())
                //.andExpect(jsonPath("$.*", hasSize(4)))
                .andExpect(jsonPath("$.*", anyOf(hasSize(1))))
                .andExpect(jsonPath("$[0].*", hasSize(3)))
                .andDo(document("schema-no-filter"));
    }

    /**
     * This test tests the use case where we request for schema's columns
     *
     * @throws Exception
     */
    @Test
    void testGetColumnObjects() throws Exception {
        mockMvc.perform(get(VERSION + "/1/$schemas")
                        .param("columns", "true")
                        .contentType(APPLICATION_JSON).accept(APPLICATION_JSON))
                .andDo(print())
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.*").isArray())
                //.andExpect(jsonPath("$.*", hasSize(4)))
                .andExpect(jsonPath("$.*", anyOf(hasSize(1))))
                .andExpect(jsonPath("$[0].*", hasSize(4)))
                .andExpect(jsonPath("$[0].columns.*", hasSize(1)))
                .andExpect(jsonPath("$[0].columns[0].*", hasSize(3)))
                .andExpect(jsonPath("$[0].columns[0].name").value("name"))
                .andExpect(jsonPath("$[0].columns[0].pk").value(true))
                .andExpect(jsonPath("$[0].columns[0].dataType").value("columnDataType"))
                .andDo(document("schema-no-filter"));
    }

    /**
     * This test tests the use case where we are sending an invalid filter
     * i.e, we are sending a filter which is not valid.
     *
     * @throws Exception
     */
    @Test
    void testGetObjectsInvalidFilter() throws Exception {
        mockMvc.perform(get(VERSION + "/1/$schemas")
                        .param("filter", "name=employee")
                        .contentType(APPLICATION_JSON).accept(APPLICATION_JSON))
                .andDo(print())
                .andExpect(jsonPath("$.type").value("https://db2rest.com/error/generic-error"))
                .andExpect(jsonPath("$.title").value("Generic Data Access Error"))
                .andExpect(jsonPath("$.status").value(400))
                .andExpect(jsonPath("$.detail").value("Invalid filter condition. Only == supported for schema filter using a single value only."))
                .andExpect(jsonPath("$.instance").value("/v1/rdbms/1/$schemas"))
                .andExpect(jsonPath("$.errorCategory").value("Data-access-error"))
                .andExpect(jsonPath("$.timestamp").exists())
                .andDo(document("schema-invalid-filter"));
    }

    /**
     * Tests response if there is a filter, and it is a valid filter.
     * Valid filters include
     * 1. == sign in between filter field and filter value
     * 2. A string to the left of == and a string value to the right of it.
     *
     * @throws Exception
     */
    @Test
    void testGetObjectsValidFilter() throws Exception {
        mockMvc.perform(get(VERSION + "/1/$schemas")
                        .param("filter", "schema==schema")
                        .contentType("application/json"))
                .andExpect(status().isOk())  // Expect 200 OK
                .andExpect(jsonPath("$").isArray())  // Ensure it's an array
                .andExpect(jsonPath("$[0].schema").value("schema"))  // Validate the first object's schema field
                .andExpect(jsonPath("$[0].name").value("name"))  // Validate the name field
                .andExpect(jsonPath("$[0].type").value("type"))
                .andDo(document("schema-valid-filter"));
    }

    /**
     * This test checks for the use case where we send a request to /$schemas,
     * but we do not have a valid filter field.
     * NOTE: In this use case, the filter in itself is valid because it contains ==.
     * Currently, we have filters based on schema, type and name.
     * This test checks the response and ensures it is empty if the filter argument
     * is not in (schema,type, name)
     *
     * @throws Exception
     */
    @Test
    void testGetObjectsInvalidFilterField() throws Exception {
        mockMvc.perform(get(VERSION + "/1/$schemas")
                        .param("filter", "someUnknownFilter==schema")
                        .contentType("application/json"))
                .andExpect(status().isOk())  // Expect 200 OK
                .andExpect(jsonPath("$").isArray())  // Ensure it's an array
                .andExpect(jsonPath("$").isEmpty()) //Ensure it is empty
                .andDo(document("schema-unknown-filter"));
    }
}


================================================
FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/jdbc/rest/meta/schema/SchemaControllerTest.java
================================================
package com.homihq.db2rest.jdbc.rest.meta.schema;

import com.homihq.db2rest.core.exception.GenericDataAccessException;
import com.homihq.db2rest.jdbc.JdbcManager;
import com.db2rest.jdbc.dialect.model.DbColumn;
import com.db2rest.jdbc.dialect.model.DbTable;
import com.homihq.db2rest.jdbc.sql.DbMeta;
import com.homihq.db2rest.rest.meta.schema.SchemaController;
import com.homihq.db2rest.rest.meta.schema.TableObject;
import com.homihq.db2rest.rest.meta.schema.TableWithColumnsObject;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.Mockito.when;

class SchemaControllerTest {
    Map<String, DbMeta> metadataMap;
    JdbcManager jdbcManager;
    SchemaController schemaController;

    @BeforeEach
    void setUp() {
        List<DbTable> dbTableList = new ArrayList<>();
        List<DbColumn> dbColumns = new ArrayList<>();
        dbColumns.add(new DbColumn("tableName", "name", "alias",
                "tableAlias", true, "columnDataType", false, false,
                null, "coverChar", "jsonParts"));

        dbTableList.add(new DbTable("schema", "name", "fullName",
                "alias", dbColumns, "type", "coverChar"));

        metadataMap = new HashMap<>();
        metadataMap.put("key", new DbMeta("productName", 2, "driverName",
                "driverVersion", dbTableList));
        jdbcManager = Mockito.mock(JdbcManager.class);
        schemaController = new SchemaController(jdbcManager);
    }

    private List<TableObject> getActualTableObject(String filter) {
        List<TableObject> actualTableObject = (List<TableObject>) schemaController.getObjects("key", filter, Boolean.FALSE);
        return actualTableObject;
    }

    private void testFilter(String goodFilter, String badFilter) {
        when(jdbcManager.getDbMetaByDbId("key")).thenReturn(metadataMap.get("key"));
        List<TableObject> expectedTableObject = metadataMap.get("key").dbTables().stream().map(TableObject::new).toList();
        List<TableObject> actualTableObject = getActualTableObject(goodFilter);
        assertEquals(expectedTableObject, actualTableObject);

        actualTableObject = getActualTableObject(badFilter);
        assertEquals(0, actualTableObject.size());
    }

    @Test
    void getObjectsNoFilter() {
        when(jdbcManager.getDbMetaByDbId("key")).thenReturn(metadataMap.get("key"));
        List<TableObject> actualTableObject = getActualTableObject(null);
        List<TableObject> expectedTableObject = metadataMap.get("key").dbTables().stream().map(TableObject::new).toList();
        assertEquals(expectedTableObject, actualTableObject);
    }

    @Test
    void testGetObjectsFilterInvalid() {
        when(jdbcManager.getDbMetaByDbId("key")).thenReturn(metadataMap.get("key"));
        Throwable exception = assertThrows(GenericDataAccessException.class, () -> schemaController.getObjects("key", "invalidFilter", Boolean.FALSE));
        assertEquals("Invalid filter condition. Only == supported for schema filter using a single value only.", exception.getMessage());
    }

    @Test
    void testGetObjectsValidFilter_schema() {
        testFilter("schema==schema", "schema==notPresentInList");
    }

    @Test
    void testGetObjectsValidFilter_name() {
        testFilter("name==name", "name==notPresentInList");
    }

    @Test
    void testGetObjectsValidFilter_type() {
        testFilter("type==type", "type==notPresentInList");
    }

    @Test
    void testGetObjectsValidFilter_invalidFieldFilter() {
        when(jdbcManager.getDbMetaByDbId("key")).thenReturn(metadataMap.get("key"));
        List<TableObject> actualTableObject = getActualTableObject("invalidFilterField==notPresentInList");
        assertEquals(0, actualTableObject.size());
    }

    @Test
    void testGetObjectsDbIDInvalid() {
        when(jdbcManager.getDbMetaByDbId("key")).thenReturn(null);
        assertEquals(0, schemaController.getObjects("key", "filter", Boolean.FALSE).size());
    }

    @Test
    void testGetObjectsWithColumns() {
        when(jdbcManager.getDbMetaByDbId("key")).thenReturn(metadataMap.get("key"));
        List<TableWithColumnsObject> expectedTableObject = metadataMap.get("key").dbTables().stream().map(TableWithColumnsObject::new).toList();
        List<TableWithColumnsObject> actualTableObject = (List<TableWithColumnsObject>) schemaController.getObjects("key", null, Boolean.TRUE);
        assertEquals(expectedTableObject, actualTableObject);
    }
}


================================================
FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/DateTimeUtil.java
================================================
package com.homihq.db2rest.rest;

import com.jayway.jsonpath.JsonPath;
import org.springframework.test.web.servlet.MvcResult;

import java.io.UnsupportedEncodingException;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;

public class DateTimeUtil {

    // Convert UTC time to LocalDateTime string
    public static String utcToLocalTimestampString(MvcResult result) throws UnsupportedEncodingException {
        String lastUpdateStr = result.getResponse().getContentAsString();

        String lastUpdateValue = JsonPath.read(lastUpdateStr, "$[0].last_update");
        OffsetDateTime offsetDateTime = OffsetDateTime.parse(lastUpdateValue);

        // Convert OffsetDateTime to LocalDateTime in the system's default time zone
        LocalDateTime localDateTime = offsetDateTime.toInstant()
                .atZone(ZoneId.systemDefault()).toLocalDateTime();

        // Format the LocalDateTime into the expected format
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS");
        return formatter.format(localDateTime);
    }

    // Convert UTC To LocalDateTime Format, Oracle jsonPath format
    public static String utcToLocalTimestampStringOracle(MvcResult result) throws UnsupportedEncodingException {
        String lastUpdateStr = result.getResponse().getContentAsString();

        String lastUpdateValue = JsonPath.read(lastUpdateStr, "$[0].LAST_UPDATE");
        OffsetDateTime offsetDateTime = OffsetDateTime.parse(lastUpdateValue);

        LocalDateTime localDateTime = offsetDateTime.toInstant()
                .atZone(ZoneId.systemDefault()).toLocalDateTime();

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS");
        return formatter.format(localDateTime);
    }


}


================================================
FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/cors/CorsTest.java
================================================
package com.homihq.db2rest.rest.cors;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Profile;
import org.springframework.restdocs.RestDocumentationExtension;
import org.springframework.test.context.DynamicPropertyRegistry;
import org.springframework.test.context.DynamicPropertySource;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
import org.testcontainers.containers.PostgreSQLContainer;
import org.testcontainers.ext.ScriptUtils;
import org.testcontainers.jdbc.JdbcDatabaseDelegate;

import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

import java.util.List;

import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header;
import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.options;

import com.homihq.db2rest.config.Db2RestConfigProperties;

import lombok.extern.slf4j.Slf4j;

@SpringBootTest
@AutoConfigureMockMvc
@ExtendWith(RestDocumentationExtension.class)
@Slf4j
public class CorsTest {

    @Autowired
    private MockMvc mockMvc;

    @Autowired
    protected WebApplicationContext context;

    @Autowired
    protected ApplicationContext applicationContext;

    @Autowired
    protected Db2RestConfigProperties db2RestConfigProperties;

    private static final List<String> postgresScripts = List.of("pg/postgres-sakila.sql",
            "pg/postgres-sakila-data.sql", "pg/pg-sakila-functions.sql");

    private static final PostgreSQLContainer testPostgres =
            (PostgreSQLContainer) new PostgreSQLContainer("postgres:15.2-alpine")
                    .withDatabaseName("postgres")
                    .withUsername("postgres")
                    .withPassword("postgres")
                    .withReuse(true);
    
    static {
        testPostgres.start();
        var containerDelegate = new JdbcDatabaseDelegate(testPostgres, "");
        postgresScripts.forEach(initScript -> ScriptUtils.runInitScript(containerDelegate, initScript));
    }

    // private final String testOrigin = "http://example.com";

    @DynamicPropertySource
    static void setProperties(DynamicPropertyRegistry registry) {
        registry.add("DB_URL", () -> testPostgres.getJdbcUrl());
        registry.add("DB_USER", () -> testPostgres.getUsername());
        registry.add("DB_PASSWORD", () -> testPostgres.getPassword());
        registry.add("ENABLE_CORS", () -> "true");

        /*

            - mapping: "/actor/**"
              allowedOrigin: "http://localhost:3000"
              allowedHeader: "*"
              allowedMethod: "*"
            - mapping: "/v1/rdbms/db/**"
              allowedOrigin: "http://localhost:4200, http://localhost:3000"
              allowedHeader: "*"
              allowedMethod: "GET,POST"

         */

        registry.add("cors.mappings[0].mapping", () -> "/actor/**");
        registry.add("cors.mappings[0].allowedOrigins", () -> "http://localhost:3000");
        registry.add("cors.mappings[0].allowedHeaders", () -> "*");
        registry.add("cors.mappings[0].allowedMethods", () -> "*");


        registry.add("cors.mappings[1].mapping", () -> "/v1/rdbms/db/**");
        registry.add("cors.mappings[1].allowedOrigins", () -> "http://localhost:4200, http://localhost:3000");
        registry.add("cors.mappings[1].allowedHeaders", () -> "*");
        registry.add("cors.mappings[1].allowedMethods", () -> "GET,POST");
    }

    @BeforeEach
    void setup() {
        this.mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
    }

    @Test
    public void shouldBeSuccessfullForCorrectCORSOrigin() throws Exception {
        mockMvc.perform(options("/v2/rdbms/db/employee")
                .header("Origin", "http://localhost:4200")
                .header("Access-Control-Request-Method", "GET"))
                .andExpect(status().isForbidden());
    }
    @Test
    public void shouldBeFaliureForWrongCORSOrigin() throws Exception {
        mockMvc.perform(options("/v1/rdbms/db/employee")
                .header("Origin", "http://example.com/aws")
                .header("Access-Control-Request-Method", "GET"))
                .andExpect(status().isForbidden());
    }
    @Test
    public void shouldBeFaliureForWrongCORSMethod() throws Exception {
        mockMvc.perform(options("/v1/rdbms/db/employee")
                .header("Origin", "http://example.com/aws")
                .header("Access-Control-Request-Method", "PATCH"))
                .andExpect(status().isForbidden());
    }  
}


================================================
FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/db2/Db2BulkCreateControllerTest.java
================================================
package com.homihq.db2rest.rest.db2;


import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.homihq.db2rest.DB2BaseIntegrationTest;
import io.hosuaby.inject.resources.junit.jupiter.GivenJsonResource;
import io.hosuaby.inject.resources.junit.jupiter.GivenTextResource;
import io.hosuaby.inject.resources.junit.jupiter.TestWithResources;
import io.hosuaby.inject.resources.junit.jupiter.WithJacksonMapper;
import org.junit.jupiter.api.ClassOrderer;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestClassOrder;

import java.util.List;
import java.util.Map;

import static com.homihq.db2rest.rest.RdbmsRestApi.VERSION;
import static java.nio.charset.StandardCharsets.UTF_8;
import static org.hamcrest.Matchers.hasItem;
import static org.hamcrest.Matchers.hasSize;
import static org.springframework.http.MediaType.APPLICATION_JSON;
import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document;
import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@TestClassOrder(ClassOrderer.OrderAnnotation.class)
@Order(281)
@TestWithResources
class Db2BulkCreateControllerTest extends DB2BaseIntegrationTest {

    @WithJacksonMapper
    ObjectMapper objectMapper = new ObjectMapper()
            .registerModule(new JavaTimeModule());

    @GivenJsonResource("/testdata/BULK_CREATE_FILM_REQUEST.json")
    List<Map<String, Object>> BULK_CREATE_FILM_REQUEST;

    @GivenJsonResource("/testdata/BULK_CREATE_FILM_BAD_REQUEST.json")
    List<Map<String, Object>> BULK_CREATE_FILM_BAD_REQUEST;

    @GivenTextResource("/testdata/CREATE_FILM_REQUEST_CSV.csv")
    String CREATE_FILM_REQUEST_CSV;

    @GivenTextResource("/testdata/CREATE_FILM_BAD_REQUEST_CSV.csv")
    String CREATE_FILM_BAD_REQUEST_CSV;

    @GivenJsonResource("/testdata/BULK_CREATE_DIRECTOR_REQUEST.json")
    List<Map<String, Object>> BULK_CREATE_DIRECTOR_REQUEST;

    @GivenJsonResource("/testdata/BULK_CREATE_DIRECTOR_BAD_REQUEST.json")
    List<Map<String, Object>> BULK_CREATE_DIRECTOR_BAD_REQUEST;

    @GivenJsonResource("/testdata/BULK_CREATE_REVIEW_REQUEST.json")
    List<Map<String, Object>> BULK_CREATE_REVIEW_REQUEST;

    @Test
    @DisplayName("Create many films.")
    void create() throws Exception {
        mockMvc.perform(post(VERSION + "/db2b/FILM/bulk")
                        .queryParam("sequences", "film_id:film_sequence")
                        .contentType(APPLICATION_JSON).accept(APPLICATION_JSON)
                        .content(objectMapper.writeValueAsString(BULK_CREATE_FILM_REQUEST))
                )
                .andExpect(status().isCreated())
                .andExpect(jsonPath("$.rows").isArray())
                .andExpect(jsonPath("$.rows", hasSize(2)))
                .andExpect(jsonPath("$.rows", hasItem(1)))
                .andExpect(jsonPath("$.rows", hasItem(1)))
                //.andExpect(jsonPath("$.generated_keys").isArray()) //TODO - push TSID columns
                //.andExpect(jsonPath("$.generated_keys", hasSize(2)))
                //.andExpect(jsonPath("$.generated_keys", allOf(notNullValue())))
                //.andDo(print())
                .andDo(document("db2-bulk-create-films"));
    }

    @Test
    @DisplayName("Create many films with CSV type.")
    void createCSV() throws Exception {

        mockMvc.perform(post(VERSION + "/db2b/FILM/bulk")
                        .queryParam("sequences", "film_id:film_sequence")
                        .contentType("text/csv").accept(APPLICATION_JSON)
                        .content(CREATE_FILM_REQUEST_CSV))
                .andExpect(status().isCreated())
                .andExpect(jsonPath("$.rows", hasSize(2)))
                .andExpect(jsonPath("$.rows", hasItem(1)))
                //.andExpect(jsonPath("$.generated_keys", hasSize(2)))
                //.andExpect(jsonPath("$.generated_keys", allOf(notNullValue())))
                //.andDo(print())
                .andDo(document("db2-bulk-create-films-csv"));

    }

    @Test
    @DisplayName("Create many films with CSV type resulting error.")
    void createCSVWithError() throws Exception {

        mockMvc.perform(post(VERSION + "/db2b/FILM/bulk")
                        .queryParam("sequences", "film_id:film_sequence")
                        .contentType("text/csv")
                        .accept(APPLICATION_JSON)
                        .content(CREATE_FILM_BAD_REQUEST_CSV))
                .andExpect(status().isBadRequest())
                //.andDo(print())
                .andDo(document("db2-bulk-create-films-csv-error"));

    }

    @Test
    @DisplayName("Create many films with failure.")
    void createError() throws Exception {

        mockMvc.perform(post(VERSION + "/db2b/FILM/bulk")
                        .queryParam("sequences", "film_id:film_sequence")
                        .contentType(APPLICATION_JSON)
                        .accept(APPLICATION_JSON)
                        .content(objectMapper.writeValueAsString(BULK_CREATE_FILM_BAD_REQUEST)))
                .andExpect(status().isBadRequest())
                // .andDo(print())
                .andDo(document("db2-bulk-create-films-error"));

    }

    @Test
    @DisplayName("Create many directors.")
    @Disabled
    void createDirector() throws Exception {

        mockMvc.perform(post(VERSION + "/db2b/DIRECTOR/bulk")
                        .contentType(APPLICATION_JSON).accept(APPLICATION_JSON)
                        .param("tsIdEnabled", "true")
                        .content(objectMapper.writeValueAsString(BULK_CREATE_DIRECTOR_REQUEST))
                )
                .andExpect(status().isCreated())
                //.andDo(print())
                .andDo(document("db2-bulk-create-directors"));

    }

    @Test
    @DisplayName("Create many directors with wrong tsid type.")
    void createDirectorWithWrongTsidType() throws Exception {

        mockMvc.perform(post(VERSION + "/db2b/DIRECTOR/bulk")
                        .characterEncoding(UTF_8)
                        .contentType(APPLICATION_JSON)
                        .accept(APPLICATION_JSON)
                        .param("tsid", "director_id")
                        .param("tsidType", "string")
                        .header("Content-Profile", "sakila")
                        .content(objectMapper.writeValueAsString(BULK_CREATE_DIRECTOR_BAD_REQUEST))
                )
                .andExpect(status().isBadRequest())
                //.andDo(print())
                .andDo(document("db2-bulk-create-directors-with-wrong-tsid-type"));
    }

    @Test
    @DisplayName("Create reviews with default tsid type.")
    @Disabled
    void createReviewWithDefaultTsidType() throws Exception {
        mockMvc.perform(post(VERSION + "/db2b/REVIEW/bulk")
                        .contentType(APPLICATION_JSON).accept(APPLICATION_JSON)
                        .param("tsIdEnabled", "true")
                        .content(objectMapper.writeValueAsString(BULK_CREATE_REVIEW_REQUEST))
                )
                .andExpect(status().isCreated())
                //.andDo(print())
                .andDo(document("db2-bulk-create-reviews-with-default-tsid-type"));
    }

}


================================================
FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/db2/Db2CountControllerTest.java
================================================
package com.homihq.db2rest.rest.db2;

import com.homihq.db2rest.DB2BaseIntegrationTest;
import org.junit.jupiter.api.ClassOrderer;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestClassOrder;
import org.springframework.http.MediaType;

import static com.homihq.db2rest.rest.RdbmsRestApi.VERSION;
import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document;
import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@TestClassOrder(ClassOrderer.OrderAnnotation.class)
@Order(202)
class Db2CountControllerTest extends DB2BaseIntegrationTest {

    @Test
    @DisplayName("Get count")
    void findFilmCount() throws Exception {
        mockMvc.perform(get(VERSION + "/db2b/FILM/count")
                        .accept(MediaType.APPLICATION_JSON))
                .andExpect(status().isOk())
                //.andDo(print())
                .andDo(document("db2-get-film-count"));
    }
}


================================================
FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/db2/Db2CreateControllerTest.java
================================================
package com.homihq.db2rest.rest.db2;


import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.homihq.db2rest.DB2BaseIntegrationTest;
import com.jayway.jsonpath.JsonPath;
import io.hosuaby.inject.resources.junit.jupiter.GivenJsonResource;
import io.hosuaby.inject.resources.junit.jupiter.TestWithResources;
import io.hosuaby.inject.resources.junit.jupiter.WithJacksonMapper;
import org.junit.jupiter.api.ClassOrderer;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestClassOrder;

import java.util.Map;

import static com.homihq.db2rest.rest.RdbmsRestApi.VERSION;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.equalTo;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.springframework.http.MediaType.APPLICATION_JSON;
import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document;
import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get;
import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@TestClassOrder(ClassOrderer.OrderAnnotation.class)
@Order(280)
@TestWithResources
class Db2CreateControllerTest extends DB2BaseIntegrationTest {
    @WithJacksonMapper
    ObjectMapper objectMapper = new ObjectMapper()
            .registerModule(new JavaTimeModule());

    @GivenJsonResource("/testdata/CREATE_FILM_REQUEST.json")
    Map<String, Object> CREATE_FILM_REQUEST;

    @GivenJsonResource("/testdata/CREATE_FILM_REQUEST_ERROR.json")
    Map<String, Object> CREATE_FILM_REQUEST_ERROR;

    @GivenJsonResource("/testdata/CREATE_VANITY_VAN_REQUEST.json")
    Map<String, Object> CREATE_VANITY_VAN_REQUEST;

    @GivenJsonResource("/testdata/CREATE_DIRECTOR_REQUEST.json")
    Map<String, Object> CREATE_DIRECTOR_REQUEST;

    @GivenJsonResource("/testdata/CREATE_FILM_REQUEST_MISSING_PAYLOAD.json")
    Map<String, Object> CREATE_FILM_REQUEST_MISSING_PAYLOAD;

    @Test
    @DisplayName("Create a film.")
    void create() throws Exception {

        mockMvc.perform(post(VERSION + "/db2b/FILM")
                        .queryParam("sequences", "film_id:film_sequence")
                        .contentType(APPLICATION_JSON).accept(APPLICATION_JSON)
                        .content(objectMapper.writeValueAsString(CREATE_FILM_REQUEST))
                )
                //.andDo(print())
                .andExpect(status().isCreated())
                .andExpect(jsonPath("$.row", equalTo(1)))
                //.andExpect(jsonPath("$.keys.GENERATED_KEY").exists())
                //.andExpect(jsonPath("$.keys.GENERATED_KEY", equalTo(5)))
                .andDo(document("db2-create-a-film"));

    }

    @Test
    @DisplayName("Test Create a film with error.")
    void createError() throws Exception {
        mockMvc.perform(post(VERSION + "/db2b/FILM")
                        .queryParam("sequences", "film_id:film_sequence")
                        .contentType(APPLICATION_JSON).accept(APPLICATION_JSON)
                        .content(objectMapper.writeValueAsString(CREATE_FILM_REQUEST_ERROR)))
                //.andDo(print())
                .andExpect(status().isBadRequest())
                .andDo(document("db2-create-a-film-error"));

    }

    @Test
    @DisplayName("Test create a film - non existent table.")
    void createNonExistentTable() throws Exception {
        mockMvc.perform(post(VERSION + "/db2b/FILMS")
                        .queryParam("sequences", "film_id:film_sequence")
                        .contentType(APPLICATION_JSON).accept(APPLICATION_JSON)
                        .content(objectMapper.writeValueAsString(CREATE_FILM_REQUEST)))
                .andExpect(status().isNotFound())
                //.andDo(print())
                .andDo(document("db2-create-a-film-no-table"));

    }

    @Test
    @DisplayName("Test Create a director - TSID enabled")
    @Disabled
    void createDirectorWithTSIDEnabled() throws Exception {
        mockMvc.perform(post(VERSION + "/db2b/DIRECTOR")
                        .contentType(APPLICATION_JSON).accept(APPLICATION_JSON)
                        .param("tsIdEnabled", "true")
                        .content(objectMapper.writeValueAsString(CREATE_DIRECTOR_REQUEST)))
                .andDo(print())
                .andExpect(status().isCreated())
                .andExpect(jsonPath("$.row", equalTo(1)))
                //.andExpect(jsonPath("$.keys.director_id").exists())
                // .andExpect(jsonPath("$.keys.director_id").isNumber())
                .andDo(document("db2-create-a-director-tsid-enabled"));

    }

    @Test
    @DisplayName("Create a director - with TSID explicitly OFF")
    void createDirectorWithTSIDOff() throws Exception {

        mockMvc.perform(post(VERSION + "/db2b/DIRECTOR")
                        .contentType(APPLICATION_JSON).accept(APPLICATION_JSON)
                        .param("tsIdEnabled", "false")
                        .content(objectMapper.writeValueAsString(CREATE_DIRECTOR_REQUEST)))
                .andExpect(status().isBadRequest())
                //.andDo(print())
                .andDo(document("db2-create-a-director-with-tsid-O
Download .txt
gitextract_rp34tsh_/

├── .gitattributes
├── .github/
│   ├── FUNDING.yml
│   ├── RELEASING.md
│   └── workflows/
│       ├── build-verify.yml
│       ├── dockerhub-publish.yml
│       ├── maven-central-publish.yml
│       ├── oracle9i-central-publish.yml
│       └── snapshot.yml
├── .gitignore
├── .mvn/
│   └── wrapper/
│       └── maven-wrapper.properties
├── CONTRIBUTING.md
├── Dockerfile
├── LICENSE
├── README.md
├── db2rest-api/
│   ├── api-rest/
│   │   ├── pom-oracle9i.xml
│   │   ├── pom.xml
│   │   ├── sample-config/
│   │   │   ├── application-db.yml
│   │   │   ├── application-local.yml
│   │   │   ├── application-mongo.yml
│   │   │   ├── application-pg15.yml
│   │   │   └── application-pg16.yml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── com/
│   │       │   │       └── homihq/
│   │       │   │           └── db2rest/
│   │       │   │               ├── Db2restApplication.java
│   │       │   │               ├── config/
│   │       │   │               │   ├── CorsFilterConfiguration.java
│   │       │   │               │   ├── DbServiceConfiguration.java
│   │       │   │               │   ├── RestApiConfiguration.java
│   │       │   │               │   ├── WebMvcConfiguration.java
│   │       │   │               │   └── jinjava/
│   │       │   │               │       └── DisabledExpressionTokenScannerSymbols.java
│   │       │   │               ├── interceptor/
│   │       │   │               │   └── DatabaseContextRequestInterceptor.java
│   │       │   │               └── rest/
│   │       │   │                   ├── RdbmsRestApi.java
│   │       │   │                   ├── admin/
│   │       │   │                   │   └── AdminController.java
│   │       │   │                   ├── create/
│   │       │   │                   │   ├── BulkCreateController.java
│   │       │   │                   │   ├── BulkCreateRestApi.java
│   │       │   │                   │   ├── CreateController.java
│   │       │   │                   │   └── CreateRestApi.java
│   │       │   │                   ├── delete/
│   │       │   │                   │   ├── DeleteController.java
│   │       │   │                   │   └── DeleteRestApi.java
│   │       │   │                   ├── meta/
│   │       │   │                   │   ├── db/
│   │       │   │                   │   │   ├── DbInfoController.java
│   │       │   │                   │   │   ├── DbInfoObject.java
│   │       │   │                   │   │   └── DbInfoRestApi.java
│   │       │   │                   │   └── schema/
│   │       │   │                   │       ├── ColumnObject.java
│   │       │   │                   │       ├── SchemaController.java
│   │       │   │                   │       ├── SchemaRestApi.java
│   │       │   │                   │       ├── TableObject.java
│   │       │   │                   │       └── TableWithColumnsObject.java
│   │       │   │                   ├── read/
│   │       │   │                   │   ├── CountQueryController.java
│   │       │   │                   │   ├── ExistsQueryController.java
│   │       │   │                   │   ├── FindOneController.java
│   │       │   │                   │   └── ReadController.java
│   │       │   │                   ├── rpc/
│   │       │   │                   │   ├── FunctionController.java
│   │       │   │                   │   └── ProcedureController.java
│   │       │   │                   ├── sql/
│   │       │   │                   │   └── SQLTemplateController.java
│   │       │   │                   └── update/
│   │       │   │                       └── UpdateController.java
│   │       │   └── resources/
│   │       │       ├── application.yml
│   │       │       ├── banner.txt
│   │       │       └── sql-templates/
│   │       │           ├── count.jte
│   │       │           ├── delete-mssql.jte
│   │       │           ├── delete.jte
│   │       │           ├── exists-mssql.jte
│   │       │           ├── exists.jte
│   │       │           ├── find-one.jte
│   │       │           ├── insert.jte
│   │       │           ├── read-mssql.jte
│   │       │           ├── read-ora-12.jte
│   │       │           ├── read-ora-9.jte
│   │       │           ├── read.jte
│   │       │           ├── update-mssql.jte
│   │       │           └── update.jte
│   │       └── test/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── homihq/
│   │           │           └── db2rest/
│   │           │               ├── BaseIntegrationTest.java
│   │           │               ├── DB2BaseIntegrationTest.java
│   │           │               ├── DB2ContainerConfiguration.java
│   │           │               ├── MariaDBBaseIntegrationTest.java
│   │           │               ├── MariaDBContainerConfiguration.java
│   │           │               ├── MsSQLServerContainerConfiguration.java
│   │           │               ├── MySQLBaseIntegrationTest.java
│   │           │               ├── MySQLContainerConfiguration.java
│   │           │               ├── OracleBaseIntegrationTest.java
│   │           │               ├── OracleContainerConfiguration.java
│   │           │               ├── PostgreSQLBaseIntegrationTest.java
│   │           │               ├── PostgreSQLContainerConfiguration.java
│   │           │               ├── SQLiteBaseIntegrationTest.java
│   │           │               ├── SQLiteContainerConfiguration.java
│   │           │               ├── jdbc/
│   │           │               │   └── rest/
│   │           │               │       └── meta/
│   │           │               │           ├── db/
│   │           │               │           │   ├── DbInfoControllerIntegrationTest.java
│   │           │               │           │   └── DbInfoControllerTest.java
│   │           │               │           └── schema/
│   │           │               │               ├── SchemaControllerIntegrationTest.java
│   │           │               │               └── SchemaControllerTest.java
│   │           │               └── rest/
│   │           │                   ├── DateTimeUtil.java
│   │           │                   ├── cors/
│   │           │                   │   └── CorsTest.java
│   │           │                   ├── db2/
│   │           │                   │   ├── Db2BulkCreateControllerTest.java
│   │           │                   │   ├── Db2CountControllerTest.java
│   │           │                   │   ├── Db2CreateControllerTest.java
│   │           │                   │   ├── Db2DeleteAllTest.java
│   │           │                   │   ├── Db2DeleteControllerTest.java
│   │           │                   │   ├── Db2JsonFileCreateControllerTest.java
│   │           │                   │   ├── Db2ProcedureControllerTest.java
│   │           │                   │   ├── Db2RSqlOperatorReadControllerTest.java
│   │           │                   │   ├── Db2ReadControllerDefaultFetchLimitTest.java
│   │           │                   │   ├── Db2ReadControllerTest.java
│   │           │                   │   ├── Db2TemplateControllerTest.java
│   │           │                   │   └── Db2UpdateControllerTest.java
│   │           │                   ├── docsSwagger/
│   │           │                   │   ├── OpenApiSpecificationNoSecurityTest.java
│   │           │                   │   └── OpenApiSpecificationWithSecurityTest.java
│   │           │                   ├── mariadb/
│   │           │                   │   ├── MariaDBBasicJoinControllerTest.java
│   │           │                   │   ├── MariaDBBulkCreateControllerTest.java
│   │           │                   │   ├── MariaDBCountControllerTest.java
│   │           │                   │   ├── MariaDBCreateControllerTest.java
│   │           │                   │   ├── MariaDBCrossJoinControllerTest.java
│   │           │                   │   ├── MariaDBDeleteAllTest.java
│   │           │                   │   ├── MariaDBDeleteControllerTest.java
│   │           │                   │   ├── MariaDBFunctionControllerTest.java
│   │           │                   │   ├── MariaDBInnerJoinControllerTest.java
│   │           │                   │   ├── MariaDBInnerJoinMultiTableControllerTest.java
│   │           │                   │   ├── MariaDBInnerSelfJoinControllerTest.java
│   │           │                   │   ├── MariaDBJsonFileCreateControllerTest.java
│   │           │                   │   ├── MariaDBProcedureControllerTest.java
│   │           │                   │   ├── MariaDBRSqlOperatorReadControllerTest.java
│   │           │                   │   ├── MariaDBReadControllerDefaultFetchLimitTest.java
│   │           │                   │   ├── MariaDBReadControllerTest.java
│   │           │                   │   ├── MariaDBTemplateControllerTest.java
│   │           │                   │   ├── MariaDBUpdateControllerTest.java
│   │           │                   │   └── MariadbDateTimeAllTest.java
│   │           │                   ├── mssql/
│   │           │                   │   ├── MsSQLBaseIntegrationTest.java
│   │           │                   │   ├── MsSQLBasicJoinControllerTest.java
│   │           │                   │   ├── MsSQLBulkCreateControllerTest.java
│   │           │                   │   ├── MsSQLCountControllerTest.java
│   │           │                   │   ├── MsSQLCreateControllerTest.java
│   │           │                   │   ├── MsSQLCrossJoinControllerTest.java
│   │           │                   │   ├── MsSQLDateTimeAllTest.java
│   │           │                   │   ├── MsSQLDeleteControllerTest.java
│   │           │                   │   ├── MsSQLDeleteWithNotAllowedSafeDeleteControllerTest.java
│   │           │                   │   ├── MsSQLExistsControllerTest.java
│   │           │                   │   ├── MsSQLFindOneControllerTest.java
│   │           │                   │   ├── MsSQLFunctionControllerTest.java
│   │           │                   │   ├── MsSQLInnerJoinControllerTest.java
│   │           │                   │   ├── MsSQLInnerJoinMultiTableControllerTest.java
│   │           │                   │   ├── MsSQLInnerSelfJoinControllerTest.java
│   │           │                   │   ├── MsSQLJsonFileCreateControllerTest.java
│   │           │                   │   ├── MsSQLProcedureControllerTest.java
│   │           │                   │   ├── MsSQLRSqlOperatorReadControllerTest.java
│   │           │                   │   ├── MsSQLReadControllerDefaultFetchLimitTest.java
│   │           │                   │   ├── MsSQLReadControllerTest.java
│   │           │                   │   └── MsSQLUpdateControllerTest.java
│   │           │                   ├── mysql/
│   │           │                   │   ├── CountTwoTablesSameNameDiffSchemaTest.java
│   │           │                   │   ├── CreateTwoTablesSameNameDiffSchemaTest.java
│   │           │                   │   ├── DeleteTwoTablesSameNameDiffSchemaTest.java
│   │           │                   │   ├── MySQLBasicJoinControllerTest.java
│   │           │                   │   ├── MySQLBulkCreateControllerTest.java
│   │           │                   │   ├── MySQLCountControllerTest.java
│   │           │                   │   ├── MySQLCreateControllerTest.java
│   │           │                   │   ├── MySQLCrossJoinControllerTest.java
│   │           │                   │   ├── MySQLDateTimeAllTest.java
│   │           │                   │   ├── MySQLDeleteAllTest.java
│   │           │                   │   ├── MySQLDeleteControllerTest.java
│   │           │                   │   ├── MySQLFunctionControllerTest.java
│   │           │                   │   ├── MySQLInnerJoinControllerTest.java
│   │           │                   │   ├── MySQLInnerJoinMultiTableControllerTest.java
│   │           │                   │   ├── MySQLInnerSelfJoinControllerTest.java
│   │           │                   │   ├── MySQLJsonFileCreateControllerTest.java
│   │           │                   │   ├── MySQLProcedureControllerTest.java
│   │           │                   │   ├── MySQLRSqlOperatorReadControllerTest.java
│   │           │                   │   ├── MySQLReadControllerDefaultFetchLimitTest.java
│   │           │                   │   ├── MySQLReadControllerTest.java
│   │           │                   │   ├── MySQLTemplateControllerTest.java
│   │           │                   │   ├── MySQLUpdateControllerTest.java
│   │           │                   │   ├── ReadTwoTablesSameNameDiffSchemaTest.java
│   │           │                   │   └── UpdateTwoTablesSameNameDiffSchemaTest.java
│   │           │                   ├── oracle/
│   │           │                   │   ├── OracleBasicJoinControllerTest.java
│   │           │                   │   ├── OracleBulkCreateControllerTest.java
│   │           │                   │   ├── OracleCountControllerTest.java
│   │           │                   │   ├── OracleCreateControllerTest.java
│   │           │                   │   ├── OracleCrossJoinControllerTest.java
│   │           │                   │   ├── OracleDateTimeAllTest.java
│   │           │                   │   ├── OracleDeleteAllTest.java
│   │           │                   │   ├── OracleDeleteControllerTest.java
│   │           │                   │   ├── OracleInnerJoinControllerTest.java
│   │           │                   │   ├── OracleInnerJoinMultiTableControllerTest.java
│   │           │                   │   ├── OracleInnerSelfJoinControllerTest.java
│   │           │                   │   ├── OracleJsonFileCreateControllerTest.java
│   │           │                   │   ├── OracleProcedureControllerTest.java
│   │           │                   │   ├── OracleRSqlOperatorReadControllerTest.java
│   │           │                   │   ├── OracleReadControllerDefaultFetchLimitTest.java
│   │           │                   │   ├── OracleReadControllerTest.java
│   │           │                   │   ├── OracleTemplateControllerTest.java
│   │           │                   │   └── OracleUpdateControllerTest.java
│   │           │                   ├── pg/
│   │           │                   │   ├── PGDateTimeAllTest.java
│   │           │                   │   ├── PgBasicJoinControllerTest.java
│   │           │                   │   ├── PgBulkCreateControllerTest.java
│   │           │                   │   ├── PgCountControllerTest.java
│   │           │                   │   ├── PgCreateControllerTest.java
│   │           │                   │   ├── PgCrossJoinControllerTest.java
│   │           │                   │   ├── PgDeleteAllTest.java
│   │           │                   │   ├── PgDeleteControllerTest.java
│   │           │                   │   ├── PgExtraFunctionControllerTest.java
│   │           │                   │   ├── PgFunctionControllerTest.java
│   │           │                   │   ├── PgInnerJoinControllerTest.java
│   │           │                   │   ├── PgInnerJoinMultiTableControllerTest.java
│   │           │                   │   ├── PgInnerSelfJoinControllerTest.java
│   │           │                   │   ├── PgJsonFileCreateControllerTest.java
│   │           │                   │   ├── PgMultiTenancyTest.java
│   │           │                   │   ├── PgProcedureControllerTest.java
│   │           │                   │   ├── PgRSqlOperatorReadControllerTest.java
│   │           │                   │   ├── PgReadControllerDefaultFetchLimitTest.java
│   │           │                   │   ├── PgReadControllerTest.java
│   │           │                   │   ├── PgTemplateControllerTest.java
│   │           │                   │   └── PgUpdateControllerTest.java
│   │           │                   └── sqlite/
│   │           │                       ├── SQLiteBulkCreateControllerTest.java
│   │           │                       ├── SQLiteCountControllerTest.java
│   │           │                       ├── SQLiteCreateControllerTest.java
│   │           │                       ├── SQLiteCrossJoinControllerTest.java
│   │           │                       ├── SQLiteDateTimeAllTest.java
│   │           │                       ├── SQLiteDeleteControllerTest.java
│   │           │                       ├── SQLiteInnerJoinControllerTest.java
│   │           │                       ├── SQLiteJsonFileCreateControllerTest.java
│   │           │                       ├── SQLiteRSqlOperatorReadControllerTest.java
│   │           │                       ├── SQLiteReadControllerTest.java
│   │           │                       ├── SQLiteTemplateControllerTest.java
│   │           │                       └── SQLiteUpdateControllerTest.java
│   │           └── resources/
│   │               ├── application-it-db2.yaml
│   │               ├── application-it-mariadb.yaml
│   │               ├── application-it-mssql.yaml
│   │               ├── application-it-mysql.yaml
│   │               ├── application-it-oracle.yaml
│   │               ├── application-it-pg-mutlitenancy.yaml
│   │               ├── application-it-pg.yaml
│   │               ├── application-it-sqlite.yaml
│   │               ├── auth-apiKey-test.yaml
│   │               ├── auth-basic.yaml
│   │               ├── db2/
│   │               │   ├── db2-sakila-data.sql
│   │               │   └── db2-sakila.sql
│   │               ├── junit-platform.properties
│   │               ├── mariadb/
│   │               │   ├── mariadb-sakila-data.sql
│   │               │   └── mariadb-sakila.sql
│   │               ├── mssql/
│   │               │   ├── mssql-sakila-data.sql
│   │               │   └── mssql-sakila.sql
│   │               ├── mysql/
│   │               │   ├── mysql-sakila-data.sql
│   │               │   ├── mysql-sakila.sql
│   │               │   └── mysql-wakila-all.sql
│   │               ├── oracle/
│   │               │   ├── oracle-sakila-data.sql
│   │               │   └── oracle-sakila.sql
│   │               ├── pg/
│   │               │   ├── pg-sakila-functions.sql
│   │               │   ├── postgres-sakila-data.sql
│   │               │   └── postgres-sakila.sql
│   │               ├── sqlite/
│   │               │   ├── sqlite-sakila-data.sql
│   │               │   └── sqlite-sakila.sql
│   │               └── testdata/
│   │                   ├── BULK_CREATE_ACTOR_REQUEST.json
│   │                   ├── BULK_CREATE_DIRECTOR_BAD_REQUEST.json
│   │                   ├── BULK_CREATE_DIRECTOR_REQUEST.json
│   │                   ├── BULK_CREATE_FILM_BAD_REQUEST.json
│   │                   ├── BULK_CREATE_FILM_REQUEST.json
│   │                   ├── BULK_CREATE_REVIEW_REQUEST.json
│   │                   ├── BULK_RESULT_ACTOR_QUERY.json
│   │                   ├── CREATE_ACTOR_REQUEST.json
│   │                   ├── CREATE_DIRECTOR_REQUEST.json
│   │                   ├── CREATE_EMP_REQUEST.json
│   │                   ├── CREATE_FILM_BAD_REQUEST_CSV.csv
│   │                   ├── CREATE_FILM_REQUEST.json
│   │                   ├── CREATE_FILM_REQUEST_CSV.csv
│   │                   ├── CREATE_FILM_REQUEST_ERROR.json
│   │                   ├── CREATE_FILM_REQUEST_MISSING_PAYLOAD.json
│   │                   ├── CREATE_USER_REQUEST.json
│   │                   ├── CREATE_VANITY_VAN_REQUEST.json
│   │                   ├── CROSS_JOIN_TOPS.json
│   │                   ├── CROSS_JOIN_TOPS_MSSQL.json
│   │                   ├── CROSS_JOIN_TOPS_ORACLE.json
│   │                   ├── CROSS_JOIN_TOPS_PG.json
│   │                   ├── CROSS_JOIN_USERS.json
│   │                   ├── CROSS_JOIN_USERS_MSSQL.json
│   │                   ├── CROSS_JOIN_USERS_ORACLE.json
│   │                   ├── CROSS_JOIN_USERS_PG.json
│   │                   ├── EMPTY_ACTOR_QUERY.json
│   │                   ├── INNER_JOIN.json
│   │                   ├── INNER_JOIN_MULTI_TABLE.json
│   │                   ├── INNER_JOIN_MULTI_TABLE_ORACLE.json
│   │                   ├── INNER_JOIN_ORACLE.json
│   │                   ├── INNER_SELF_JOIN.json
│   │                   ├── INNER_SELF_JOIN_ORACLE.json
│   │                   ├── LEFT_JOIN.json
│   │                   ├── LEFT_JOIN_ORACLE.json
│   │                   ├── RIGHT_JOIN.json
│   │                   ├── RIGHT_JOIN_ORACLE.json
│   │                   ├── SINGLE_RESULT_ACTOR_QUERY.json
│   │                   ├── UPDATE_ACTOR_REQUEST.json
│   │                   ├── UPDATE_EMPLOYEE_REQUEST.json
│   │                   ├── UPDATE_FILMS_REQUEST.json
│   │                   ├── UPDATE_FILM_REQUEST.json
│   │                   ├── UPDATE_NON_EXISTING_FILM_REQUEST.json
│   │                   ├── UPDATE_NON_EXISTING_TABLE.json
│   │                   ├── actor.json
│   │                   ├── actor5mb.json
│   │                   ├── director.json
│   │                   ├── sql-db2/
│   │                   │   ├── conditional_render_and_op.sql
│   │                   │   ├── conditional_render_join.sql
│   │                   │   ├── select_all.sql
│   │                   │   ├── select_by_id.sql
│   │                   │   └── select_by_id_is_required.sql
│   │                   ├── sql-mariadb/
│   │                   │   ├── conditional_render_and_op.sql
│   │                   │   ├── conditional_render_join.sql
│   │                   │   ├── select_all.sql
│   │                   │   ├── select_by_id.sql
│   │                   │   └── select_by_id_is_required.sql
│   │                   ├── sql-mysql/
│   │                   │   ├── conditional_render_and_op.sql
│   │                   │   ├── conditional_render_join.sql
│   │                   │   ├── select_all.sql
│   │                   │   ├── select_by_id.sql
│   │                   │   └── select_by_id_is_required.sql
│   │                   ├── sql-oracle/
│   │                   │   ├── conditional_render_and_op.sql
│   │                   │   ├── conditional_render_join.sql
│   │                   │   ├── select_all.sql
│   │                   │   ├── select_by_id.sql
│   │                   │   └── select_by_id_is_required.sql
│   │                   ├── sql-pg/
│   │                   │   ├── conditional_render_and_op.sql
│   │                   │   ├── conditional_render_join.sql
│   │                   │   ├── delete_from_content.sql
│   │                   │   ├── insert_from_content.sql
│   │                   │   ├── select_all.sql
│   │                   │   ├── select_by_id.sql
│   │                   │   ├── select_by_id_from_content.sql
│   │                   │   ├── select_by_id_is_required.sql
│   │                   │   └── update_by_id_from_content.sql
│   │                   └── sql-sqlite/
│   │                       ├── conditional_render_and_op.sql
│   │                       ├── conditional_render_join.sql
│   │                       ├── select_all.sql
│   │                       └── select_by_id.sql
│   ├── pom.xml
│   └── rest-common/
│       ├── pom.xml
│       └── src/
│           └── main/
│               └── java/
│                   └── com/
│                       └── homihq/
│                           └── db2rest/
│                               ├── bulk/
│                               │   ├── CSVDataProcessor.java
│                               │   ├── DataProcessor.java
│                               │   ├── FileStreamObserver.java
│                               │   ├── FileSubject.java
│                               │   ├── JSONDataProcessor.java
│                               │   └── JsonFileDataProcessor.java
│                               ├── config/
│                               │   ├── CorsConfigProperties.java
│                               │   ├── DateTimeConfigProperties.java
│                               │   ├── DateTimeConfiguration.java
│                               │   ├── Db2RestConfigProperties.java
│                               │   ├── MultiTenancy.java
│                               │   └── OpenAPIConfiguration.java
│                               ├── dtos/
│                               │   └── BulkContext.java
│                               ├── exception/
│                               │   └── GlobalExceptionHandler.java
│                               └── multidb/
│                                   ├── DatabaseConnectionDetail.java
│                                   ├── DatabaseProperties.java
│                                   └── EnvironmentProperties.java
├── db2rest-auth/
│   ├── pom.xml
│   └── src/
│       └── main/
│           ├── java/
│           │   └── com/
│           │       └── homihq/
│           │           └── db2rest/
│           │               └── auth/
│           │                   ├── AuthConfiguration.java
│           │                   ├── AuthFilter.java
│           │                   ├── data/
│           │                   │   ├── ApiExcludedResource.java
│           │                   │   ├── ApiKey.java
│           │                   │   ├── ApiResource.java
│           │                   │   ├── AuthData.java
│           │                   │   ├── ResourceRole.java
│           │                   │   ├── RoleDataFilter.java
│           │                   │   ├── User.java
│           │                   │   └── UserDetail.java
│           │                   ├── datalookup/
│           │                   │   ├── ApiAuthDataLookup.java
│           │                   │   ├── AuthDataLookup.java
│           │                   │   ├── AuthDataProperties.java
│           │                   │   ├── FileAuthDataLookup.java
│           │                   │   └── NoAuthdataLookup.java
│           │                   ├── exception/
│           │                   │   └── AuthException.java
│           │                   ├── provider/
│           │                   │   ├── AbstractAuthProvider.java
│           │                   │   ├── apikey/
│           │                   │   │   └── ApiKeyAuthProvider.java
│           │                   │   ├── basic/
│           │                   │   │   └── BasicAuthProvider.java
│           │                   │   └── jwt/
│           │                   │       ├── JwtAuthProvider.java
│           │                   │       └── JwtProperties.java
│           │                   └── unkey/
│           │                       ├── UnKeyAuthConfiguration.java
│           │                       ├── UnKeyAuthFilter.java
│           │                       ├── service/
│           │                       │   └── UnKeyAuthService.java
│           │                       └── to/
│           │                           ├── UnKeyVerifyRequest.java
│           │                           └── UnKeyVerifyResponse.java
│           └── resources/
│               ├── auth-sample-api-key.yml
│               ├── auth-sample.json
│               └── auth-sample.yml
├── db2rest-core/
│   ├── db2rest-common/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── com/
│   │                   └── homihq/
│   │                       └── db2rest/
│   │                           ├── core/
│   │                           │   ├── dto/
│   │                           │   │   ├── CountResponse.java
│   │                           │   │   ├── CreateBulkResponse.java
│   │                           │   │   ├── CreateResponse.java
│   │                           │   │   ├── DeleteResponse.java
│   │                           │   │   ├── ExistsResponse.java
│   │                           │   │   └── UpdateResponse.java
│   │                           │   └── exception/
│   │                           │       ├── AuthenticationFailedException.java
│   │                           │       ├── DeleteOpNotAllowedException.java
│   │                           │       ├── GenericDataAccessException.java
│   │                           │       ├── InvalidColumnException.java
│   │                           │       ├── InvalidOperatorException.java
│   │                           │       ├── InvalidTableException.java
│   │                           │       ├── PathVariableNamesMissingException.java
│   │                           │       ├── PathVariableValuesMissingException.java
│   │                           │       ├── PlaceholderConstraintException.java
│   │                           │       ├── RpcException.java
│   │                           │       ├── SqlTemplateNotFoundException.java
│   │                           │       ├── SqlTemplateReadException.java
│   │                           │       └── UnsupportedConstraintException.java
│   │                           └── multidb/
│   │                               └── DatabaseContextHolder.java
│   ├── pom.xml
│   ├── rdbms-common/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── com/
│   │                   └── db2rest/
│   │                       └── jdbc/
│   │                           └── dialect/
│   │                               ├── Dialect.java
│   │                               └── model/
│   │                                   ├── ArrayTypeValueHolder.java
│   │                                   ├── Database.java
│   │                                   ├── DbAlias.java
│   │                                   ├── DbColumn.java
│   │                                   ├── DbJoin.java
│   │                                   ├── DbSort.java
│   │                                   ├── DbTable.java
│   │                                   └── DbWhere.java
│   └── rdbms-support/
│       ├── pom.xml
│       └── src/
│           ├── main/
│           │   └── java/
│           │       └── com/
│           │           └── homihq/
│           │               └── db2rest/
│           │                   └── jdbc/
│           │                       ├── JdbcManager.java
│           │                       ├── JdbcOperationService.java
│           │                       ├── core/
│           │                       │   ├── DbOperationService.java
│           │                       │   ├── SimpleRowMapper.java
│           │                       │   └── service/
│           │                       │       ├── BulkCreateService.java
│           │                       │       ├── CountQueryService.java
│           │                       │       ├── CreateService.java
│           │                       │       ├── DeleteService.java
│           │                       │       ├── ExistsQueryService.java
│           │                       │       ├── FindOneService.java
│           │                       │       ├── FunctionService.java
│           │                       │       ├── JdbcBulkCreateService.java
│           │                       │       ├── JdbcCountQueryService.java
│           │                       │       ├── JdbcCreateService.java
│           │                       │       ├── JdbcDeleteService.java
│           │                       │       ├── JdbcExistsQueryService.java
│           │                       │       ├── JdbcFindOneService.java
│           │                       │       ├── JdbcFunctionService.java
│           │                       │       ├── JdbcProcedureService.java
│           │                       │       ├── JdbcReadService.java
│           │                       │       ├── JdbcUpdateService.java
│           │                       │       ├── JinJavaTemplateExecutorService.java
│           │                       │       ├── ProcedureService.java
│           │                       │       ├── ReadService.java
│           │                       │       ├── SQLTemplateExecutorService.java
│           │                       │       ├── SubRoutine.java
│           │                       │       └── UpdateService.java
│           │                       ├── dto/
│           │                       │   ├── BindVariable.java
│           │                       │   ├── CreateContext.java
│           │                       │   ├── DeleteContext.java
│           │                       │   ├── FnUtil.java
│           │                       │   ├── InsertableColumn.java
│           │                       │   ├── JoinDetail.java
│           │                       │   ├── Placeholder.java
│           │                       │   ├── QueryRequest.java
│           │                       │   ├── ReadContext.java
│           │                       │   └── UpdateContext.java
│           │                       ├── multidb/
│           │                       │   ├── DbDetailHolder.java
│           │                       │   └── RoutingDataSource.java
│           │                       ├── processor/
│           │                       │   ├── JoinProcessor.java
│           │                       │   ├── OrderByProcessor.java
│           │                       │   ├── ReadProcessor.java
│           │                       │   ├── RootTableFieldProcessor.java
│           │                       │   ├── RootTableProcessor.java
│           │                       │   └── RootWhereProcessor.java
│           │                       ├── rsql/
│           │                       │   ├── operator/
│           │                       │   │   ├── CustomRSQLOperators.java
│           │                       │   │   ├── OperatorHandler.java
│           │                       │   │   ├── OperatorMap.java
│           │                       │   │   ├── RSQLOperatorHandlers.java
│           │                       │   │   └── handler/
│           │                       │   │       ├── EndWithOperatorHandler.java
│           │                       │   │       ├── EqualToOperatorHandler.java
│           │                       │   │       ├── GreaterThanEqualToOperatorHandler.java
│           │                       │   │       ├── GreaterThanOperatorHandler.java
│           │                       │   │       ├── InOperatorHandler.java
│           │                       │   │       ├── IsNotNullOperatorHandler.java
│           │                       │   │       ├── IsNullOperatorHandler.java
│           │                       │   │       ├── JsonContainInArrayOperatorHandler.java
│           │                       │   │       ├── JsonContainOperatorHandler.java
│           │                       │   │       ├── JsonbContainOperatorHandler.java
│           │                       │   │       ├── JsonbEqualToOperatorHandler.java
│           │                       │   │       ├── JsonbKeyExistsOperatorHandler.java
│           │                       │   │       ├── LessThanEqualToOperatorHandler.java
│           │                       │   │       ├── LessThanOperatorHandler.java
│           │                       │   │       ├── LikeOperatorHandler.java
│           │                       │   │       ├── NotEqualToOperatorHandler.java
│           │                       │   │       ├── NotInOperatorHandler.java
│           │                       │   │       ├── NotLikeOperatorHandler.java
│           │                       │   │       └── StartWithOperatorHandler.java
│           │                       │   ├── parser/
│           │                       │   │   └── RSQLParserBuilder.java
│           │                       │   ├── resolver/
│           │                       │   │   └── CrossTableColumnResolver.java
│           │                       │   └── visitor/
│           │                       │       └── BaseRSQLVisitor.java
│           │                       ├── sql/
│           │                       │   ├── ColumnLabel.java
│           │                       │   ├── DB2DataExtraction.java
│           │                       │   ├── DbMeta.java
│           │                       │   ├── JdbcMetaDataProvider.java
│           │                       │   ├── JdbcTypeJavaClassMappings.java
│           │                       │   ├── MariaDBDataExtraction.java
│           │                       │   ├── MetaDataExtraction.java
│           │                       │   ├── MetaDataTable.java
│           │                       │   ├── MsSQLServerMetaDataExtraction.java
│           │                       │   ├── MySQLDataExtraction.java
│           │                       │   ├── OracleMetaDataExtraction.java
│           │                       │   ├── PostgreSQLDataExclusion.java
│           │                       │   ├── SQLiteDataExtraction.java
│           │                       │   ├── SqlCreatorTemplate.java
│           │                       │   └── SqlTypes.java
│           │                       ├── tsid/
│           │                       │   └── TSIDProcessor.java
│           │                       ├── util/
│           │                       │   └── AliasGenerator.java
│           │                       └── validator/
│           │                           ├── ConstraintValidator.java
│           │                           ├── CustomPlaceholderValidators.java
│           │                           └── impl/
│           │                               ├── IsRequiredValidator.java
│           │                               └── IsUUIDValidator.java
│           └── test/
│               └── java/
│                   └── com/
│                       └── homihq/
│                           └── db2rest/
│                               └── jdbc/
│                                   ├── core/
│                                   │   └── service/
│                                   │       └── JdbcCreateServiceTest.java
│                                   ├── dto/
│                                   │   └── FnUtilTest.java
│                                   ├── util/
│                                   │   └── AliasGeneratorTest.java
│                                   └── validator/
│                                       ├── CustomPlaceholderValidatorsTest.java
│                                       └── impl/
│                                           ├── IsRequiredValidatorTest.java
│                                           └── IsUUIDValidatorTest.java
├── db2rest-dialects/
│   ├── db2-dialect/
│   │   ├── README.md
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── db2rest/
│   │       │               └── jdbc/
│   │       │                   └── dialect/
│   │       │                       └── DB2RestDB2Dialect.java
│   │       └── test/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── db2rest/
│   │           │           └── jdbc/
│   │           │               └── dialect/
│   │           │                   ├── DB2RestDB2DialectTest.java
│   │           │                   └── TestConfiguration.java
│   │           └── resources/
│   │               └── application-test.yml
│   ├── mariadb-dialect/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── com/
│   │                   └── db2rest/
│   │                       └── jdbc/
│   │                           └── dialect/
│   │                               └── MariaDBDialect.java
│   ├── mssql-dialect/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── com/
│   │                   └── db2rest/
│   │                       └── jdbc/
│   │                           └── dialect/
│   │                               └── MsSQLServerDialect.java
│   ├── mysql-dialect/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── com/
│   │                   └── db2rest/
│   │                       └── jdbc/
│   │                           └── dialect/
│   │                               └── DB2RestMySQLDialect.java
│   ├── oracle-dialect/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── com/
│   │                   └── db2rest/
│   │                       └── jdbc/
│   │                           └── dialect/
│   │                               └── OracleDialect.java
│   ├── oracle9i-dialect/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── com/
│   │                   └── db2rest/
│   │                       └── jdbc/
│   │                           └── dialect/
│   │                               └── OracleDialect.java
│   ├── pg-dialect/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── com/
│   │                   └── db2rest/
│   │                       └── jdbc/
│   │                           └── dialect/
│   │                               ├── PostGreSQLDialect.java
│   │                               └── driver/
│   │                                   ├── EnvVarSSLSocketFactory.java
│   │                                   └── PgSingleCertValidatingFactory.java
│   ├── pom.xml
│   └── sqlite-dialect/
│       ├── pom.xml
│       └── src/
│           └── main/
│               └── java/
│                   └── com/
│                       └── db2rest/
│                           └── jdbc/
│                               └── dialect/
│                                   └── SQLiteDialect.java
├── db2rest-oas3.json
├── design/
│   └── insert.md
├── docker-compose/
│   ├── db2/
│   │   ├── README.md
│   │   ├── docker-compose.yml
│   │   └── init/
│   │       └── 01-create-schema.sql
│   ├── mariadb/
│   │   ├── api-interaction.sh
│   │   ├── docker-compose.yml
│   │   ├── init/
│   │   │   └── 01-init.sql
│   │   └── run.sh
│   ├── mysql/
│   │   ├── api-interaction.sh
│   │   ├── docker-compose.yml
│   │   ├── init/
│   │   │   └── 01-init.sql
│   │   └── run.sh
│   ├── oracle/
│   │   ├── api-interaction.sh
│   │   ├── docker-compose.yml
│   │   ├── init/
│   │   │   └── 01-init.sql
│   │   └── run.sh
│   ├── postgresql/
│   │   ├── api-interaction.sh
│   │   ├── docker-compose.yml
│   │   ├── init/
│   │   │   └── 01-init.sql
│   │   └── run.sh
│   └── sqlserver/
│       ├── api-interaction.sh
│       ├── docker-compose.yml
│       ├── init/
│       │   └── 01-init.sql
│       └── run.sh
├── fed/
│   └── federation.md
├── funding.json
├── integration-test-guideline.md
├── mvnw
├── mvnw.cmd
└── pom.xml
Download .txt
SYMBOL INDEX (1823 symbols across 353 files)

FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/Db2restApplication.java
  class Db2restApplication (line 10) | @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, Mon...
    method main (line 14) | public static void main(String[] args) {

FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/config/CorsFilterConfiguration.java
  class CorsFilterConfiguration (line 17) | @Slf4j
    method corsFilter (line 21) | @Bean

FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/config/DbServiceConfiguration.java
  class DbServiceConfiguration (line 38) | @Slf4j
    method dataSource (line 46) | @Bean
    method buildDataSources (line 58) | private Map<Object, Object> buildDataSources() {
    method buildDataSource (line 79) | private DataSource buildDataSource(DatabaseConnectionDetail connection...
    method jdbcManager (line 91) | @Bean
    method operationService (line 107) | @Bean
    method sqlCreatorTemplate (line 113) | @Bean
    method templateEngine (line 118) | @Bean
    method jinjava (line 126) | @Bean
    method tsidProcessor (line 137) | @Bean
    method joinProcessor (line 142) | @Bean
    method orderByProcessor (line 147) | @Bean
    method rootTableFieldProcessor (line 152) | @Bean
    method rootTableProcessor (line 157) | @Bean
    method rootWhereProcessor (line 162) | @Bean
    method customPlaceholderValidators (line 170) | @Bean
    method bulkCreateService (line 180) | @Bean
    method createService (line 190) | @Bean
    method countQueryService (line 199) | @Bean
    method existsQueryService (line 210) | @Bean
    method findOneService (line 219) | @Bean
    method readService (line 228) | @Bean
    method updateService (line 238) | @Bean
    method deleteService (line 248) | @Bean
    method functionService (line 257) | @Bean
    method procedureService (line 262) | @Bean
    method templateService (line 267) | @Bean

FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/config/RestApiConfiguration.java
  class RestApiConfiguration (line 29) | @Slf4j
    method bulkCreateController (line 39) | @Bean
    method createController (line 46) | @Bean
    method countQueryController (line 53) | @Bean
    method existsQueryController (line 59) | @Bean
    method findOneController (line 65) | @Bean
    method readController (line 71) | @Bean
    method updateController (line 79) | @Bean
    method deleteController (line 86) | @Bean
    method functionController (line 93) | @Bean
    method procedureController (line 99) | @Bean
    method schemaController (line 105) | @Bean
    method sqlTemplateController (line 111) | @Bean
    method dbInfoController (line 119) | @Bean
    method adminController (line 126) | @Bean

FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/config/WebMvcConfiguration.java
  class WebMvcConfiguration (line 13) | @Configuration
    method addInterceptors (line 21) | @Override

FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/config/jinjava/DisabledExpressionTokenScannerSymbols.java
  class DisabledExpressionTokenScannerSymbols (line 5) | public class DisabledExpressionTokenScannerSymbols extends DefaultTokenS...
    method getExprStart (line 6) | @Override
    method getExprEnd (line 11) | @Override

FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/interceptor/DatabaseContextRequestInterceptor.java
  class DatabaseContextRequestInterceptor (line 21) | @Slf4j
    method preHandle (line 31) | @Override
    method isWhileListed (line 62) | private boolean isWhileListed(String uri) {
    method postHandle (line 66) | @Override
    method setTenantContext (line 71) | private void setTenantContext(String tenant) {

FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/RdbmsRestApi.java
  type RdbmsRestApi (line 3) | public interface RdbmsRestApi {

FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/admin/AdminController.java
  class AdminController (line 10) | @RestController
    method reloadCache (line 19) | @PostMapping("/reloadCache")

FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/create/BulkCreateController.java
  class BulkCreateController (line 21) | @RestController
    method save (line 29) | public CreateBulkResponse save(
    method saveMultipartFile (line 50) | @Override

FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/create/BulkCreateRestApi.java
  type BulkCreateRestApi (line 22) | public interface BulkCreateRestApi {
    method save (line 23) | @ResponseStatus(HttpStatus.CREATED)
    method saveMultipartFile (line 36) | @ResponseStatus(HttpStatus.CREATED)

FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/create/CreateController.java
  class CreateController (line 16) | @RestController
    method save (line 23) | @Override

FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/create/CreateRestApi.java
  type CreateRestApi (line 20) | public interface CreateRestApi {
    method save (line 21) | @ResponseStatus(HttpStatus.CREATED)

FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/delete/DeleteController.java
  class DeleteController (line 14) | @RestController
    method delete (line 22) | @Override

FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/delete/DeleteRestApi.java
  type DeleteRestApi (line 18) | public interface DeleteRestApi {
    method delete (line 19) | @ResponseStatus(HttpStatus.OK)

FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/meta/db/DbInfoController.java
  class DbInfoController (line 13) | @RestController
    method getObjects (line 20) | @Override

FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/meta/db/DbInfoRestApi.java
  type DbInfoRestApi (line 12) | @RequestMapping(VERSION + "/$dbs")
    method getObjects (line 17) | @Operation(summary = "Get all database info details",

FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/meta/schema/ColumnObject.java
  method ColumnObject (line 6) | public ColumnObject(DbColumn dbColumn) {

FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/meta/schema/SchemaController.java
  class SchemaController (line 19) | @RestController
    method getObjects (line 32) | @Override
    method getSchemaFilter (line 75) | private SchemaFilter getSchemaFilter(String filter) {

FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/meta/schema/SchemaRestApi.java
  type SchemaRestApi (line 18) | @RequestMapping(VERSION + "/{dbId}/$schemas")
    method getObjects (line 21) | @Operation(

FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/meta/schema/TableObject.java
  class TableObject (line 7) | @EqualsAndHashCode
    method TableObject (line 14) | public TableObject(DbTable dbTable) {

FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/meta/schema/TableWithColumnsObject.java
  class TableWithColumnsObject (line 9) | @EqualsAndHashCode(callSuper = true)
    method TableWithColumnsObject (line 14) | public TableWithColumnsObject(DbTable dbTable) {

FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/read/CountQueryController.java
  class CountQueryController (line 22) | @RestController
    method count (line 29) | @GetMapping(VERSION + "/{dbId}/{tableName}/count")

FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/read/ExistsQueryController.java
  class ExistsQueryController (line 25) | @Slf4j
    method exists (line 32) | @GetMapping(value = VERSION + "/{dbId}/{tableName}/exists", produces =...
    method exists (line 53) | @PostMapping(value = VERSION + "/{dbId}/{tableName}/exists/_expand", p...

FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/read/FindOneController.java
  class FindOneController (line 22) | @RestController
    method findOne (line 29) | @GetMapping(VERSION + "/{dbId}/{tableName}/one")

FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/read/ReadController.java
  class ReadController (line 25) | @RestController
    method findAll (line 33) | @GetMapping(value = VERSION + "/{dbId}/{tableName}", produces = "appli...
    method find (line 63) | @PostMapping(value = VERSION + "/{dbId}/{tableName}/_expand", produces...

FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/rpc/FunctionController.java
  class FunctionController (line 17) | @RestController
    method execute (line 25) | @PostMapping("/{funcName}")

FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/rpc/ProcedureController.java
  class ProcedureController (line 14) | @RestController
    method execute (line 22) | @PostMapping("/{procName}")

FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/sql/SQLTemplateController.java
  class SQLTemplateController (line 19) | @Slf4j
    method sqlTemplate (line 27) | @GetMapping("/{fileName}/{*userPathVariable}")
    method sqlTemplate (line 44) | @PostMapping("/{fileName}")
    method createContext (line 60) | private Map<String, Object> createContext(
    method createPaths (line 72) | private static Map<String, Object> createPaths(String userPathVariable...

FILE: db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/update/UpdateController.java
  class UpdateController (line 23) | @RestController
    method save (line 30) | @PatchMapping(VERSION + "/{dbId}/{tableName}")

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/BaseIntegrationTest.java
  class BaseIntegrationTest (line 29) | @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
    method setUp (line 44) | @BeforeEach
    method createMockMvc (line 50) | protected void createMockMvc(WebApplicationContext webApplicationConte...
    method setupEnv (line 57) | void setupEnv() {
    method isoDateTimeFormats (line 70) | static List<Arguments> isoDateTimeFormats() {

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/DB2BaseIntegrationTest.java
  class DB2BaseIntegrationTest (line 8) | @Import(DB2ContainerConfiguration.class)
    method deleteRow (line 14) | protected boolean deleteRow(String table, String column, int id) {

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/DB2ContainerConfiguration.java
  class DB2ContainerConfiguration (line 18) | @TestConfiguration(proxyBeanMethods = false)
    method dataSource (line 37) | @Bean

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/MariaDBBaseIntegrationTest.java
  class MariaDBBaseIntegrationTest (line 8) | @Import(MariaDBContainerConfiguration.class)
    method deleteRow (line 15) | protected boolean deleteRow(String table, String column, int id) {

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/MariaDBContainerConfiguration.java
  class MariaDBContainerConfiguration (line 17) | @TestConfiguration(proxyBeanMethods = false)
    method dataSource (line 38) | @Bean

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/MsSQLServerContainerConfiguration.java
  class MsSQLServerContainerConfiguration (line 16) | @TestConfiguration(proxyBeanMethods = false)
    method dataSource (line 35) | @Bean

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/MySQLBaseIntegrationTest.java
  class MySQLBaseIntegrationTest (line 8) | @Import(MySQLContainerConfiguration.class)
    method deleteRow (line 15) | protected boolean deleteRow(String table, String column, int id) {

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/MySQLContainerConfiguration.java
  class MySQLContainerConfiguration (line 16) | @TestConfiguration(proxyBeanMethods = false)
    method dataSource (line 37) | @Bean

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/OracleBaseIntegrationTest.java
  class OracleBaseIntegrationTest (line 8) | @Import(OracleContainerConfiguration.class)
    method deleteRow (line 15) | protected boolean deleteRow(String table, String column, int id) {

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/OracleContainerConfiguration.java
  class OracleContainerConfiguration (line 16) | @TestConfiguration(proxyBeanMethods = false)
    method dataSource (line 36) | @Bean

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/PostgreSQLBaseIntegrationTest.java
  class PostgreSQLBaseIntegrationTest (line 8) | @Import(PostgreSQLContainerConfiguration.class)
    method deleteRow (line 15) | protected boolean deleteRow(String table, String column, int id) {

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/PostgreSQLContainerConfiguration.java
  class PostgreSQLContainerConfiguration (line 17) | @TestConfiguration(proxyBeanMethods = false)
    method dataSource (line 37) | @Bean

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/SQLiteBaseIntegrationTest.java
  class SQLiteBaseIntegrationTest (line 8) | @Import(SQLiteContainerConfiguration.class)
    method deleteRow (line 15) | protected boolean deleteRow(String table, String column, int id) {

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/SQLiteContainerConfiguration.java
  class SQLiteContainerConfiguration (line 20) | @TestConfiguration(proxyBeanMethods = false)
    method dataSource (line 51) | @Bean

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/jdbc/rest/meta/db/DbInfoControllerIntegrationTest.java
  class DbInfoControllerIntegrationTest (line 26) | @Disabled
    method setUp (line 35) | @BeforeEach
    method getObjects (line 55) | void getObjects() throws Exception {

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/jdbc/rest/meta/db/DbInfoControllerTest.java
  class DbInfoControllerTest (line 21) | class DbInfoControllerTest {
    method setUp (line 25) | @BeforeEach
    method testGetObjects (line 41) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/jdbc/rest/meta/schema/SchemaControllerIntegrationTest.java
  class SchemaControllerIntegrationTest (line 30) | class SchemaControllerIntegrationTest extends BaseIntegrationTest {
    method setUp (line 37) | @BeforeEach
    method testGetObjects (line 61) | @Test
    method testGetColumnObjects (line 79) | @Test
    method testGetObjectsInvalidFilter (line 104) | @Test
    method testGetObjectsValidFilter (line 128) | @Test
    method testGetObjectsInvalidFilterField (line 151) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/jdbc/rest/meta/schema/SchemaControllerTest.java
  class SchemaControllerTest (line 24) | class SchemaControllerTest {
    method setUp (line 29) | @BeforeEach
    method getActualTableObject (line 47) | private List<TableObject> getActualTableObject(String filter) {
    method testFilter (line 52) | private void testFilter(String goodFilter, String badFilter) {
    method getObjectsNoFilter (line 62) | @Test
    method testGetObjectsFilterInvalid (line 70) | @Test
    method testGetObjectsValidFilter_schema (line 77) | @Test
    method testGetObjectsValidFilter_name (line 82) | @Test
    method testGetObjectsValidFilter_type (line 87) | @Test
    method testGetObjectsValidFilter_invalidFieldFilter (line 92) | @Test
    method testGetObjectsDbIDInvalid (line 99) | @Test
    method testGetObjectsWithColumns (line 105) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/DateTimeUtil.java
  class DateTimeUtil (line 13) | public class DateTimeUtil {
    method utcToLocalTimestampString (line 16) | public static String utcToLocalTimestampString(MvcResult result) throw...
    method utcToLocalTimestampStringOracle (line 32) | public static String utcToLocalTimestampStringOracle(MvcResult result)...

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/cors/CorsTest.java
  class CorsTest (line 33) | @SpringBootTest
    method setProperties (line 69) | @DynamicPropertySource
    method setup (line 101) | @BeforeEach
    method shouldBeSuccessfullForCorrectCORSOrigin (line 106) | @Test
    method shouldBeFaliureForWrongCORSOrigin (line 113) | @Test
    method shouldBeFaliureForWrongCORSMethod (line 120) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/db2/Db2BulkCreateControllerTest.java
  class Db2BulkCreateControllerTest (line 31) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method create (line 61) | @Test
    method createCSV (line 81) | @Test
    method createCSVWithError (line 99) | @Test
    method createError (line 114) | @Test
    method createDirector (line 129) | @Test
    method createDirectorWithWrongTsidType (line 145) | @Test
    method createReviewWithDefaultTsidType (line 163) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/db2/Db2CountControllerTest.java
  class Db2CountControllerTest (line 16) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method findFilmCount (line 20) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/db2/Db2CreateControllerTest.java
  class Db2CreateControllerTest (line 32) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method create (line 55) | @Test
    method createError (line 73) | @Test
    method createNonExistentTable (line 86) | @Test
    method createDirectorWithTSIDEnabled (line 99) | @Test
    method createDirectorWithTSIDOff (line 116) | @Test
    method createVanityVanWithVarcharTsIdType (line 130) | @Test
    method createFilmWithSubsetOfColumns (line 146) | @Test
    method shouldIgnoreWhenColumnsQueryParamIsEmpty (line 178) | @Test
    method columnIsPresentInColumnsQueryParamButNotInPayload (line 211) | @Test
    method column_violates_not_null_constraint (line 224) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/db2/Db2DeleteAllTest.java
  class Db2DeleteAllTest (line 21) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method deleteAllWithAllowSafeDeleteFalse (line 26) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/db2/Db2DeleteControllerTest.java
  class Db2DeleteControllerTest (line 22) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method delete_single_record (line 26) | @Test
    method delete_all_records_with_allow_safe_delete_true (line 39) | @Test
    method column_does_not_exist (line 51) | @Test
    method foreign_key_constraint_violation (line 64) | @Disabled

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/db2/Db2JsonFileCreateControllerTest.java
  class Db2JsonFileCreateControllerTest (line 27) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method uploadActorsFile (line 39) | @Test
    method uploadActorFileNonJsonArray (line 59) | @Test
    method createDirectorViaUpload (line 74) | @Test
    method createFilmsViaUpload (line 94) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/db2/Db2ProcedureControllerTest.java
  class Db2ProcedureControllerTest (line 23) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method execute (line 28) | @DisplayName("Execute stored procedure on db2 db")
    method executeUpdateUserProc (line 50) | @DisplayName("Execute stored procedure UpdateUserProc on db2 db ")

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/db2/Db2RSqlOperatorReadControllerTest.java
  class Db2RSqlOperatorReadControllerTest (line 25) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method findWithEqualsOperator (line 30) | @Test
    method findWithNotEqualsOperator (line 48) | @Test
    method findWithGreaterThanOperator (line 66) | @Test
    method findWithGreaterThanEqualsOperator (line 83) | @Test
    method findWithLessThanOperator (line 101) | @Test
    method findWithLessThanEqualsOperator (line 116) | @Test
    method findWithInOperator (line 132) | @Test
    method findWithNotInOperator (line 148) | @Test
    method findWithNotInOperatorExt (line 164) | @Test
    method findWithLikeOperator (line 180) | @Test
    method findWithStartsWithOperator (line 195) | @Test
    method findWithEndsWithOperator (line 210) | @Test
    method findWithEqualsOperator_givenInvalidColumn_shouldReturn4xx (line 225) | @Test
    method findWithNotLikeOperator (line 238) | @Test
    method findWithEqualsAndStartWithCombinationalOperator (line 258) | @Test
    method findWithEqualsAndLikeCombinationalOperator (line 276) | @Test
    method findWithEqualsAndLikeAndInCombinationalOperator (line 292) | @Test
    method findWithEqualsOrLikeOrInCombinationalOperator (line 308) | @Test
    method findWithEqualsAndLikeAndNotInCombinationalOperator (line 330) | @Test
    method findWithEqualsOrLikeOrNotInCombinationalOperator (line 343) | @Test
    method findWithEqualsAndLikeAndInAbdGreaterThanEqualsCombinationalOperator (line 366) | @Test
    method findWithEqualsAndLikeAndInAbdGreaterThanCombinationalOperator (line 382) | @Test
    method findWithEqualsAndLikeAndInAndLessThanEqualsCombinationalOperator (line 395) | @Test
    method findWithEqualsAndLikeAndInAndLessThanCombinationalOperator (line 411) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/db2/Db2ReadControllerDefaultFetchLimitTest.java
  class Db2ReadControllerDefaultFetchLimitTest (line 19) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method findAllPersonsWithDefaultFetchLimit5 (line 24) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/db2/Db2ReadControllerTest.java
  class Db2ReadControllerTest (line 22) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method findAllFilms (line 25) | @Test
    method findAllFilmsWithThreeCols (line 40) | @Test
    method findAllFilmsWithColumnAlias (line 55) | @Test
    method findOneFilm (line 73) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/db2/Db2TemplateControllerTest.java
  class Db2TemplateControllerTest (line 20) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method findAllFilms (line 27) | @Test
    method findFilmByID (line 39) | @Test
    method findFilmByIDWithHeader (line 52) | @Test
    method findFilmByIDWithPath (line 65) | @Test
    method findFilmByIDWithRequiredConstraint (line 78) | @Test
    method selectWithConditionalRenderNoRequestParams (line 87) | @Test
    method selectWithConditionalRenderWithID (line 99) | @Test
    method selectWithConditionalRenderWithField (line 113) | @Test
    method selectWithConditionalRenderJoinWithoutInput (line 131) | @Test
    method selectWithConditionalRenderJoin (line 145) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/db2/Db2UpdateControllerTest.java
  class Db2UpdateControllerTest (line 27) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method updateExistingFilm (line 48) | @Test
    method updateNonExistingFilm (line 63) | @Test
    method updateNonExistingTable (line 78) | @Test
    method updateMultipleColumns (line 92) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/docsSwagger/OpenApiSpecificationNoSecurityTest.java
  class OpenApiSpecificationNoSecurityTest (line 33) | @SpringBootTest
    method setProperties (line 69) | @DynamicPropertySource
    method setup (line 78) | @BeforeEach
    method shouldBeSuccessfullForOpeningDocs (line 83) | @Test
    method shouldBeSuccessfullForDocsJsonData (line 88) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/docsSwagger/OpenApiSpecificationWithSecurityTest.java
  class OpenApiSpecificationWithSecurityTest (line 33) | @SpringBootTest
    method setProperties (line 69) | @DynamicPropertySource
    method setup (line 106) | @BeforeEach
    method shouldBeSuccessfullForOpeningDocs (line 111) | @Test
    method shouldBeSuccessfullForDocsJsonData (line 116) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mariadb/MariaDBBasicJoinControllerTest.java
  class MariaDBBasicJoinControllerTest (line 23) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method testLeftJoin (line 38) | @Test
    method testRightJoin (line 60) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mariadb/MariaDBBulkCreateControllerTest.java
  class MariaDBBulkCreateControllerTest (line 27) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method create (line 56) | @Test
    method createCSV (line 76) | @Test
    method createCSVWithError (line 91) | @Test
    method createError (line 104) | @Test
    method createDirector (line 117) | @Test
    method createDirectorWithWrongTsidType (line 130) | @Test
    method createReviewWithDefaultTsidType (line 147) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mariadb/MariaDBCountControllerTest.java
  class MariaDBCountControllerTest (line 16) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method testFilmCount (line 19) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mariadb/MariaDBCreateControllerTest.java
  class MariaDBCreateControllerTest (line 31) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method create (line 54) | @Test
    method createError (line 69) | @Test
    method createNonExistentTable (line 81) | @Test
    method createDirectorWithTSIDEnabled (line 92) | @Test
    method createDirectorWithTSIDOff (line 108) | @Test
    method createVanityVanWithVarcharTsIdType (line 121) | @Test
    method createFilmWithSubsetOfColumns (line 137) | @Test
    method shouldIgnoreWhenColumnsQueryParamIsEmpty (line 168) | @Test
    method columnIsPresentInColumnsQueryParamButNotInPayload (line 200) | @Test
    method column_violates_not_null_constraint (line 215) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mariadb/MariaDBCrossJoinControllerTest.java
  class MariaDBCrossJoinControllerTest (line 24) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method testCrossJoin (line 39) | @Test
    method testCrossJoinTops (line 62) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mariadb/MariaDBDeleteAllTest.java
  class MariaDBDeleteAllTest (line 20) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method deleteAllWithAllowSafeDeleteFalse (line 25) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mariadb/MariaDBDeleteControllerTest.java
  class MariaDBDeleteControllerTest (line 20) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method delete_single_record (line 24) | @Test
    method delete_all_records_with_allow_safe_delete_true (line 36) | @Test
    method column_does_not_exist (line 49) | @Test
    method foreign_key_constraint_violation (line 62) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mariadb/MariaDBFunctionControllerTest.java
  class MariaDBFunctionControllerTest (line 24) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method execute (line 27) | @Test
    method updateUser (line 49) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mariadb/MariaDBInnerJoinControllerTest.java
  class MariaDBInnerJoinControllerTest (line 23) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method testInnerJoin (line 35) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mariadb/MariaDBInnerJoinMultiTableControllerTest.java
  class MariaDBInnerJoinMultiTableControllerTest (line 23) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method testInnerMultiTable (line 35) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mariadb/MariaDBInnerSelfJoinControllerTest.java
  class MariaDBInnerSelfJoinControllerTest (line 22) | @TestWithResources
    method testInnerSelfJoin (line 34) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mariadb/MariaDBJsonFileCreateControllerTest.java
  class MariaDBJsonFileCreateControllerTest (line 23) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method uploadActorsFile (line 35) | @Test
    method uploadActorFileNonJsonArray (line 55) | @Test
    method createDirectorViaUpload (line 70) | @Test
    method createFilmsViaUpload (line 90) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mariadb/MariaDBProcedureControllerTest.java
  class MariaDBProcedureControllerTest (line 18) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method execute (line 22) | @Test
    method updateUser (line 44) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mariadb/MariaDBRSqlOperatorReadControllerTest.java
  class MariaDBRSqlOperatorReadControllerTest (line 26) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method findWithEqualsOperator (line 31) | @Test
    method findWithNotEqualsOperator (line 49) | @Test
    method findWithGreaterThanOperator (line 67) | @Test
    method findWithGreaterThanEqualsOperator (line 84) | @Test
    method findWithLessThanOperator (line 102) | @Test
    method findWithLessThanEqualsOperator (line 117) | @Test
    method findWithInOperator (line 133) | @Test
    method findWithNotInOperator (line 149) | @Test
    method findWithNotInOperatorExt (line 165) | @Test
    method findWithLikeOperator (line 181) | @Test
    method findWithStartsWithOperator (line 196) | @Test
    method findWithEndsWithOperator (line 211) | @Test
    method findWithEqualsOperator_givenInvalidColumn_shouldReturn4xx (line 228) | @Test
    method findWithNotLikeOperator (line 242) | @Test
    method findWithEqualsAndStartWithCombinationalOperator (line 262) | @Test
    method findWithEqualsAndLikeCombinationalOperator (line 280) | @Test
    method findWithEqualsAndLikeAndInCombinationalOperator (line 296) | @Test
    method findWithEqualsOrLikeOrInCombinationalOperator (line 312) | @Test
    method findWithEqualsAndLikeAndNotInCombinationalOperator (line 334) | @Test
    method findWithEqualsOrLikeOrNotInCombinationalOperator (line 347) | @Test
    method findWithEqualsAndLikeAndInAbdGreaterThanEualsCombinationalOperator (line 370) | @Test
    method findWithEqualsAndLikeAndInAbdGreaterThanCombinationalOperator (line 386) | @Test
    method findWithEqualsAndLikeAndInAndLessThanEqualsCombinationalOperator (line 399) | @Test
    method findWithEqualsAndLikeAndInAndLessThanCombinationalOperator (line 415) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mariadb/MariaDBReadControllerDefaultFetchLimitTest.java
  class MariaDBReadControllerDefaultFetchLimitTest (line 17) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method findAllPersonsWithDefaultFetchLimit5 (line 23) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mariadb/MariaDBReadControllerTest.java
  class MariaDBReadControllerTest (line 21) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method findAllFilms (line 24) | @Test
    method findAllFilmsWithThreeCols (line 39) | @Test
    method findAllFilmsWithColumnAlias (line 54) | @Test
    method findOneFilm (line 72) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mariadb/MariaDBTemplateControllerTest.java
  class MariaDBTemplateControllerTest (line 20) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method findAllFilms (line 27) | @Test
    method findFilmByID (line 39) | @Test
    method findFilmByIDWithHeader (line 52) | @Test
    method findFilmByIDWithPath (line 65) | @Test
    method findFilmByIDWithRequiredConstraint (line 78) | @Test
    method selectWithConditionalRenderNoRequestParams (line 87) | @Test
    method selectWithConditionalRenderWithID (line 99) | @Test
    method selectWithConditionalRenderWithField (line 113) | @Test
    method selectWithConditionalRenderJoinWithoutInput (line 131) | @Test
    method selectWithConditionalRenderJoin (line 145) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mariadb/MariaDBUpdateControllerTest.java
  class MariaDBUpdateControllerTest (line 26) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method updateExistingFilm (line 47) | @Test
    method updateNonExistingFilm (line 61) | @Test
    method updateNonExistingTable (line 75) | @Test
    method updateMultipleColumns (line 88) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mariadb/MariadbDateTimeAllTest.java
  class MariadbDateTimeAllTest (line 37) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method createActorWithDateTimeFields (line 47) | @Test
    method createActorWithErrorDateTimeField (line 67) | @Test
    method updateActorWithDateTimeField (line 85) | @Test
    method getActorWithDateTimeFields (line 104) | @Test
    method getActorFilterByTimeStamp (line 120) | @Test
    method deleteActorByTimeStamp (line 136) | @Test
    method createActorWithIsoDateTimeFormats (line 151) | @ParameterizedTest

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mssql/MsSQLBaseIntegrationTest.java
  class MsSQLBaseIntegrationTest (line 16) | @Import(MsSQLServerContainerConfiguration.class)
    method getPrefixApiUrl (line 29) | protected String getPrefixApiUrl() {
    method deleteRow (line 33) | protected boolean deleteRow(String table, String column, int id) {

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mssql/MsSQLBasicJoinControllerTest.java
  class MsSQLBasicJoinControllerTest (line 23) | @Order(501)
    method leftJoin (line 33) | @Test
    method rightJoin (line 59) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mssql/MsSQLBulkCreateControllerTest.java
  class MsSQLBulkCreateControllerTest (line 24) | @Order(503)
    method bulkCreateFilmsWithJsonType (line 49) | @Test
    method bulkCreateFilmsWithCsvType (line 64) | @Test
    method bulkCreateFilmsWithCsvTypeError (line 78) | @Test
    method bulkCreateFilmsWithJsonTypeError (line 90) | @Test
    method bulkCreateDirectors (line 103) | @Test
    method bulkCreateDirectorWithWrongTsidType (line 116) | @Test
    method bulkCreateReviewWithDefaultTsidType (line 131) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mssql/MsSQLCountControllerTest.java
  class MsSQLCountControllerTest (line 15) | @Order(501)
    method employeesCount (line 18) | @Test
    method filmsCount (line 29) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mssql/MsSQLCreateControllerTest.java
  class MsSQLCreateControllerTest (line 26) | @Order(502)
    method createFilm (line 48) | @Test
    method createFilmError (line 64) | @Test
    method createItemNonExistentTable (line 75) | @Test
    method createDirectorWithTSIDEnabled (line 87) | @Test
    method createDirectorWithTSIDOff (line 101) | @Test
    method createVanityVanWithVarcharTsIdType (line 114) | @Test
    method createFilmWithSubsetOfColumns (line 128) | @Test
    method shouldIgnoreWhenColumnsQueryParamIsEmpty (line 158) | @Test
    method columnIsPresentInColumnsQueryParamButNotInPayload (line 188) | @Test
    method columnViolatesNotNullConstraint (line 202) | @Test
    method deleteRow (line 217) | private boolean deleteRow(int id) {

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mssql/MsSQLCrossJoinControllerTest.java
  class MsSQLCrossJoinControllerTest (line 22) | @Order(501)
    method crossJoinUsers (line 32) | @Test
    method crossJoinTops (line 56) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mssql/MsSQLDateTimeAllTest.java
  class MsSQLDateTimeAllTest (line 25) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method createActorWithIsoDateTimeFormats (line 30) | @ParameterizedTest

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mssql/MsSQLDeleteControllerTest.java
  class MsSQLDeleteControllerTest (line 16) | @Order(505)
    method deleteSingleRecord (line 19) | @Test
    method failedDeleteAllRecordsWithAllowSafeDeleteTrue (line 31) | @Test
    method failedDeleteWithInvalidColumnName (line 43) | @Test
    method failedDeleteWithForeignKeyConstraintViolation (line 56) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mssql/MsSQLDeleteWithNotAllowedSafeDeleteControllerTest.java
  class MsSQLDeleteWithNotAllowedSafeDeleteControllerTest (line 16) | @Order(505)
    method deleteAllWithAllowSafeDeleteFalse (line 20) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mssql/MsSQLExistsControllerTest.java
  class MsSQLExistsControllerTest (line 22) | @Order(501)
    method existsActorByFirstName (line 29) | @Test
    method existsByUnknownName (line 42) | @Test
    method existsInnerJoin (line 54) | @Test
    method existsInnerJoinWithFilter (line 68) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mssql/MsSQLFindOneControllerTest.java
  class MsSQLFindOneControllerTest (line 17) | @Order(501)
    method findOneFilm (line 21) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mssql/MsSQLFunctionControllerTest.java
  class MsSQLFunctionControllerTest (line 20) | @Order(501)
    method execute (line 23) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mssql/MsSQLInnerJoinControllerTest.java
  class MsSQLInnerJoinControllerTest (line 22) | @Order(501)
    method testInnerJoin (line 29) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mssql/MsSQLInnerJoinMultiTableControllerTest.java
  class MsSQLInnerJoinMultiTableControllerTest (line 22) | @Order(501)
    method innerMultiTable (line 29) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mssql/MsSQLInnerSelfJoinControllerTest.java
  class MsSQLInnerSelfJoinControllerTest (line 22) | @Order(501)
    method innerSelfJoin (line 29) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mssql/MsSQLJsonFileCreateControllerTest.java
  class MsSQLJsonFileCreateControllerTest (line 28) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method uploadActorsFile (line 43) | @Test
    method uploadActorFileNonJsonArray (line 67) | @Test
    method createDirectorViaUpload (line 82) | @Test
    method createFilmsViaUpload (line 102) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mssql/MsSQLProcedureControllerTest.java
  class MsSQLProcedureControllerTest (line 19) | @Order(501)
    method execute (line 22) | @Test
    method executeGetActorByIdProc (line 43) | @Test
    method executeGetActorByIdProcWithResultSetKeys (line 64) | @Test
    method executeGetActorsAndFilmsProcWithoutResultSetKeys (line 85) | @Test
    method executeGetActorsAndFilmsProcWithResultSetKeys (line 100) | @Test
    method updateUser (line 115) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mssql/MsSQLRSqlOperatorReadControllerTest.java
  class MsSQLRSqlOperatorReadControllerTest (line 23) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method findWithEqualsOperator (line 28) | @Test
    method findWithNotEqualsOperator (line 46) | @Test
    method findWithGreaterThanOperator (line 64) | @Test
    method findWithGreaterThanEqualsOperator (line 81) | @Test
    method findWithLessThanOperator (line 99) | @Test
    method findWithLessThanEqualsOperator (line 114) | @Test
    method findWithInOperator (line 130) | @Test
    method findWithNotInOperator (line 146) | @Test
    method findWithNotInOperatorExt (line 162) | @Test
    method findWithLikeOperator (line 178) | @Test
    method findWithStartsWithOperator (line 194) | @Test
    method findWithEndsWithOperator (line 209) | @Test
    method findWithEqualsOperator_givenInvalidColumn_shouldReturn4xx (line 224) | @Test
    method findWithNotLikeOperator (line 236) | @Test
    method findWithEqualsAndStartWithCombinationalOperator (line 256) | @Test
    method findWithEqualsAndLikeCombinationalOperator (line 274) | @Test
    method findWithEqualsAndLikeAndInCombinationalOperator (line 290) | @Test
    method findWithEqualsOrLikeOrInCombinationalOperator (line 306) | @Test
    method findWithEqualsAndLikeAndNotInCombinationalOperator (line 328) | @Test
    method findWithEqualsOrLikeOrNotInCombinationalOperator (line 341) | @Test
    method findWithEqualsAndLikeAndInAbdGreaterThanEualsCombinationalOperator (line 364) | @Test
    method findWithEqualsAndLikeAndInAbdGreaterThanCombinationalOperator (line 380) | @Test
    method findWithEqualsAndLikeAndInAndLessThanEqualsCombinationalOperator (line 393) | @Test
    method findWithEqualsAndLikeAndInAndLessThanCombinationalOperator (line 409) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mssql/MsSQLReadControllerDefaultFetchLimitTest.java
  class MsSQLReadControllerDefaultFetchLimitTest (line 17) | @Order(306)
    method findAllPersonsWithDefaultFetchLimit5 (line 21) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mssql/MsSQLReadControllerTest.java
  class MsSQLReadControllerTest (line 18) | @Order(501)
    method findAllFilmsWithAllColumns (line 21) | @Test
    method findAllFilmsWithThreeCols (line 34) | @Test
    method findAllFilmsWithColumnAlias (line 50) | @Test
    method findAllFilmsWithSorting (line 68) | @Test
    method findAllFilmsWithSortingAndPagination (line 87) | @Test
    method findAllFilmsWithPagination (line 107) | @Test
    method findAllFilmsByFilter (line 126) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mssql/MsSQLUpdateControllerTest.java
  class MsSQLUpdateControllerTest (line 19) | @Order(503)
    method updateExistingFilm (line 35) | @Test
    method updateNonExistingFilm (line 49) | @Test
    method updateNonExistingTable (line 64) | @Test
    method updateMultipleColumns (line 77) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mysql/CountTwoTablesSameNameDiffSchemaTest.java
  class MySQLCountTwoTablesSameNameDiffSchemaTest (line 19) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method empCount (line 24) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mysql/CreateTwoTablesSameNameDiffSchemaTest.java
  class MySQLCreateTwoTablesSameNameDiffSchemaTest (line 27) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method create (line 38) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mysql/DeleteTwoTablesSameNameDiffSchemaTest.java
  class MySQLDeleteTwoTablesSameNameDiffSchemaTest (line 19) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method deleteFromTableWithSameNameDifferentSchema (line 23) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mysql/MySQLBasicJoinControllerTest.java
  class MySQLBasicJoinControllerTest (line 31) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method testLeftJoin (line 46) | @Disabled
    method testRightJoin (line 71) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mysql/MySQLBulkCreateControllerTest.java
  class MySQLBulkCreateControllerTest (line 31) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method create (line 60) | @Test
    method createCSV (line 81) | @Test
    method createCSVWithError (line 97) | @Test
    method createError (line 110) | @Test
    method createDirector (line 124) | @Test
    method createDirectorWithWrongTsidType (line 137) | @Test
    method createReviewWithDefaultTsidType (line 154) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mysql/MySQLCountControllerTest.java
  class MySQLCountControllerTest (line 16) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method findFilmCount (line 20) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mysql/MySQLCreateControllerTest.java
  class MySQLCreateControllerTest (line 31) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method create (line 55) | @Test
    method createError (line 72) | @Test
    method createNonExistentTable (line 85) | @Test
    method createDirectorWithTSIDEnabled (line 98) | @Test
    method createDirectorWithTSIDOff (line 114) | @Test
    method createVanityVanWithVarcharTsIdType (line 126) | @Test
    method createFilmWithSubsetOfColumns (line 142) | @Test
    method shouldIgnoreWhenColumnsQueryParamIsEmpty (line 173) | @Test
    method columnIsPresentInColumnsQueryParamButNotInPayload (line 205) | @Test
    method column_violates_not_null_constraint (line 218) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mysql/MySQLCrossJoinControllerTest.java
  class MySQLCrossJoinControllerTest (line 28) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method testCrossJoin (line 43) | @Test
    method testCrossJoinTops (line 66) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mysql/MySQLDateTimeAllTest.java
  class MySQLDateTimeAllTest (line 37) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method createActorWithDateTimeFields (line 47) | @Test
    method createActorWithErrorDateTimeField (line 66) | @Test
    method updateActorWithDateTimeField (line 84) | @Test
    method getActorWithDateTimeFields (line 103) | @Test
    method getActorFilterByTimeStamp (line 118) | @Test
    method deleteActorByTimeStamp (line 134) | @Test
    method createActorWithIsoDateTimeFormats (line 149) | @ParameterizedTest

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mysql/MySQLDeleteAllTest.java
  class MySQLDeleteAllTest (line 20) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method deleteAllWithAllowSafeDeleteFalse (line 25) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mysql/MySQLDeleteControllerTest.java
  class MySQLDeleteControllerTest (line 19) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method delete_single_record (line 23) | @Test
    method delete_all_records_with_allow_safe_delete_true (line 35) | @Test
    method column_does_not_exist (line 47) | @Test
    method foreign_key_constraint_violation (line 60) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mysql/MySQLFunctionControllerTest.java
  class MySQLFunctionControllerTest (line 24) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method execute (line 28) | @Test
    method updateUser (line 50) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mysql/MySQLInnerJoinControllerTest.java
  class MySQLInnerJoinControllerTest (line 28) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method testInnerJoin (line 40) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mysql/MySQLInnerJoinMultiTableControllerTest.java
  class MySQLInnerJoinMultiTableControllerTest (line 28) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method testInnerMultiTable (line 40) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mysql/MySQLInnerSelfJoinControllerTest.java
  class MySQLInnerSelfJoinControllerTest (line 26) | @TestWithResources
    method testInnerSelfJoin (line 38) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mysql/MySQLJsonFileCreateControllerTest.java
  class MySQLJsonFileCreateControllerTest (line 27) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method uploadActorsFile (line 39) | @Test
    method uploadActorFileNonJsonArray (line 59) | @Test
    method createDirectorViaUpload (line 74) | @Test
    method createFilmsViaUpload (line 94) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mysql/MySQLProcedureControllerTest.java
  class MySQLProcedureControllerTest (line 24) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method execute (line 28) | @Test
    method updateUser (line 50) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mysql/MySQLRSqlOperatorReadControllerTest.java
  class MySQLRSqlOperatorReadControllerTest (line 25) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method findWithEqualsOperator (line 30) | @Test
    method findWithNotEqualsOperator (line 48) | @Test
    method findWithGreaterThanOperator (line 66) | @Test
    method findWithGreaterThanEqualsOperator (line 83) | @Test
    method findWithLessThanOperator (line 101) | @Test
    method findWithLessThanEqualsOperator (line 116) | @Test
    method findWithInOperator (line 132) | @Test
    method findWithNotInOperator (line 148) | @Test
    method findWithNotInOperatorExt (line 164) | @Test
    method findWithLikeOperator (line 180) | @Test
    method findWithStartsWithOperator (line 195) | @Test
    method findWithEndsWithOperator (line 210) | @Test
    method findWithEqualsOperator_givenInvalidColumn_shouldReturn4xx (line 225) | @Test
    method findWithNotLikeOperator (line 237) | @Test
    method findWithEqualsAndStartWithCombinationalOperator (line 257) | @Test
    method findWithEqualsAndLikeCombinationalOperator (line 275) | @Test
    method findWithEqualsAndLikeAndInCombinationalOperator (line 291) | @Test
    method findWithEqualsOrLikeOrInCombinationalOperator (line 307) | @Test
    method findWithEqualsAndLikeAndNotInCombinationalOperator (line 329) | @Test
    method findWithEqualsOrLikeOrNotInCombinationalOperator (line 342) | @Test
    method findWithEqualsAndLikeAndInAbdGreaterThanEualsCombinationalOperator (line 365) | @Test
    method findWithEqualsAndLikeAndInAbdGreaterThanCombinationalOperator (line 381) | @Test
    method findWithEqualsAndLikeAndInAndLessThanEqualsCombinationalOperator (line 394) | @Test
    method findWithEqualsAndLikeAndInAndLessThanCombinationalOperator (line 410) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mysql/MySQLReadControllerDefaultFetchLimitTest.java
  class MySQLReadControllerDefaultFetchLimitTest (line 20) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method findAllPersonsWithDefaultFetchLimit5 (line 25) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mysql/MySQLReadControllerTest.java
  class MySQLReadControllerTest (line 22) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method findAllFilms (line 25) | @Test
    method findAllFilmsWithThreeCols (line 40) | @Test
    method findAllFilmsWithColumnAlias (line 55) | @Test
    method findOneFilm (line 73) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mysql/MySQLTemplateControllerTest.java
  class MySQLTemplateControllerTest (line 20) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method findAllFilms (line 27) | @Test
    method findFilmByID (line 39) | @Test
    method findFilmByIDWithHeader (line 52) | @Test
    method findFilmByIDWithPath (line 65) | @Test
    method findFilmByIDWithRequiredConstraint (line 78) | @Test
    method selectWithConditionalRenderNoRequestParams (line 87) | @Test
    method selectWithConditionalRenderWithID (line 99) | @Test
    method selectWithConditionalRenderWithField (line 113) | @Test
    method selectWithConditionalRenderJoinWithoutInput (line 131) | @Test
    method selectWithConditionalRenderJoin (line 145) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mysql/MySQLUpdateControllerTest.java
  class MySQLUpdateControllerTest (line 26) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method updateExistingFilm (line 47) | @Test
    method updateNonExistingFilm (line 61) | @Test
    method updateNonExistingTable (line 75) | @Test
    method updateMultipleColumns (line 88) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mysql/ReadTwoTablesSameNameDiffSchemaTest.java
  class MySQLReadTwoTablesSameNameDiffSchemaTest (line 19) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method findUsersInTwoSchemas (line 23) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mysql/UpdateTwoTablesSameNameDiffSchemaTest.java
  class MySQLUpdateTwoTablesSameNameDiffSchemaTest (line 26) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method updateEmployee (line 39) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/oracle/OracleBasicJoinControllerTest.java
  class OracleBasicJoinControllerTest (line 31) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method testLeftJoin (line 47) | @Test
    method testRightJoin (line 69) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/oracle/OracleBulkCreateControllerTest.java
  class OracleBulkCreateControllerTest (line 30) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method create (line 60) | @Test
    method createCSV (line 80) | @Test
    method createCSVWithError (line 98) | @Test
    method createError (line 113) | @Test
    method createDirector (line 128) | @Test
    method createDirectorWithWrongTsidType (line 143) | @Test
    method createReviewWithDefaultTsidType (line 161) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/oracle/OracleCountControllerTest.java
  class OracleCountControllerTest (line 16) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method findFilmCount (line 20) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/oracle/OracleCreateControllerTest.java
  class OracleCreateControllerTest (line 31) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method create (line 54) | @Test
    method createError (line 72) | @Test
    method createNonExistentTable (line 85) | @Test
    method createDirectorWithTSIDEnabled (line 98) | @Test
    method createDirectorWithTSIDOff (line 114) | @Test
    method createVanityVanWithVarcharTsIdType (line 128) | @Test
    method createFilmWithSubsetOfColumns (line 144) | @Test
    method shouldIgnoreWhenColumnsQueryParamIsEmpty (line 176) | @Test
    method columnIsPresentInColumnsQueryParamButNotInPayload (line 209) | @Test
    method column_violates_not_null_constraint (line 222) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/oracle/OracleCrossJoinControllerTest.java
  class OracleCrossJoinControllerTest (line 30) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method testCrossJoin (line 47) | @Test
    method testCrossJoinTops (line 71) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/oracle/OracleDateTimeAllTest.java
  class OracleDateTimeAllTest (line 37) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method createActorWithDateTimeFields (line 47) | @Test
    method createActorWithErrorDateTimeField (line 67) | @Test
    method updateActorWithDateTimeField (line 86) | @Test
    method getActorWithDateTimeFields (line 105) | @Test
    method getActorFilterByTimeStamp (line 122) | @Order(3)
    method deleteActorByTimeStamp (line 139) | @Order(4)
    method createActorWithIsoDateTimeFormats (line 153) | @ParameterizedTest

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/oracle/OracleDeleteAllTest.java
  class OracleDeleteAllTest (line 21) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method deleteAllWithAllowSafeDeleteFalse (line 26) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/oracle/OracleDeleteControllerTest.java
  class OracleDeleteControllerTest (line 22) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method delete_single_record (line 26) | @Test
    method delete_all_records_with_allow_safe_delete_true (line 38) | @Test
    method column_does_not_exist (line 50) | @Test
    method foreign_key_constraint_violation (line 63) | @Disabled

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/oracle/OracleInnerJoinControllerTest.java
  class OracleInnerJoinControllerTest (line 30) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method testInnerJoin (line 43) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/oracle/OracleInnerJoinMultiTableControllerTest.java
  class OracleInnerJoinMultiTableControllerTest (line 30) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method testInnerMultiTable (line 43) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/oracle/OracleInnerSelfJoinControllerTest.java
  class OracleInnerSelfJoinControllerTest (line 28) | @TestWithResources
    method testInnerSelfJoin (line 41) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/oracle/OracleJsonFileCreateControllerTest.java
  class OracleJsonFileCreateControllerTest (line 27) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method uploadActorsFile (line 39) | @Test
    method uploadActorFileNonJsonArray (line 59) | @Test
    method createDirectorViaUpload (line 74) | @Test
    method createFilmsViaUpload (line 94) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/oracle/OracleProcedureControllerTest.java
  class OracleProcedureControllerTest (line 24) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method execute (line 29) | @DisplayName("Execute stored procedure on oracle db")
    method executeUpdateUserProc (line 51) | @DisplayName("Execute stored procedure UpdateUserProc on oracle db ")

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/oracle/OracleRSqlOperatorReadControllerTest.java
  class OracleRSqlOperatorReadControllerTest (line 25) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method findWithEqualsOperator (line 30) | @Test
    method findWithNotEqualsOperator (line 48) | @Test
    method findWithGreaterThanOperator (line 66) | @Test
    method findWithGreaterThanEqualsOperator (line 83) | @Test
    method findWithLessThanOperator (line 101) | @Test
    method findWithLessThanEqualsOperator (line 116) | @Test
    method findWithInOperator (line 132) | @Test
    method findWithNotInOperator (line 148) | @Test
    method findWithNotInOperatorExt (line 164) | @Test
    method findWithLikeOperator (line 180) | @Test
    method findWithStartsWithOperator (line 195) | @Test
    method findWithEndsWithOperator (line 210) | @Test
    method findWithEqualsOperator_givenInvalidColumn_shouldReturn4xx (line 225) | @Test
    method findWithNotLikeOperator (line 238) | @Test
    method findWithEqualsAndStartWithCombinationalOperator (line 258) | @Test
    method findWithEqualsAndLikeCombinationalOperator (line 276) | @Test
    method findWithEqualsAndLikeAndInCombinationalOperator (line 292) | @Test
    method findWithEqualsOrLikeOrInCombinationalOperator (line 308) | @Test
    method findWithEqualsAndLikeAndNotInCombinationalOperator (line 330) | @Test
    method findWithEqualsOrLikeOrNotInCombinationalOperator (line 343) | @Test
    method findWithEqualsAndLikeAndInAbdGreaterThanEqualsCombinationalOperator (line 366) | @Test
    method findWithEqualsAndLikeAndInAbdGreaterThanCombinationalOperator (line 382) | @Test
    method findWithEqualsAndLikeAndInAndLessThanEqualsCombinationalOperator (line 395) | @Test
    method findWithEqualsAndLikeAndInAndLessThanCombinationalOperator (line 411) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/oracle/OracleReadControllerDefaultFetchLimitTest.java
  class OracleReadControllerDefaultFetchLimitTest (line 19) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method findAllPersonsWithDefaultFetchLimit5 (line 24) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/oracle/OracleReadControllerTest.java
  class OracleReadControllerTest (line 22) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method findAllFilms (line 25) | @Test
    method findAllFilmsWithThreeCols (line 40) | @Test
    method findAllFilmsWithColumnAlias (line 55) | @Test
    method findOneFilm (line 73) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/oracle/OracleTemplateControllerTest.java
  class OracleTemplateControllerTest (line 20) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method findAllFilms (line 27) | @Test
    method findFilmByID (line 39) | @Test
    method findFilmByIDWithHeader (line 52) | @Test
    method findFilmByIDWithPath (line 65) | @Test
    method findFilmByIDWithRequiredConstraint (line 78) | @Test
    method selectWithConditionalRenderNoRequestParams (line 87) | @Test
    method selectWithConditionalRenderWithID (line 99) | @Test
    method selectWithConditionalRenderWithField (line 113) | @Test
    method selectWithConditionalRenderJoinWithoutInput (line 131) | @Test
    method selectWithConditionalRenderJoin (line 145) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/oracle/OracleUpdateControllerTest.java
  class OracleUpdateControllerTest (line 27) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method updateExistingFilm (line 48) | @Test
    method updateNonExistingFilm (line 63) | @Test
    method updateNonExistingTable (line 78) | @Test
    method updateMultipleColumns (line 92) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/pg/PGDateTimeAllTest.java
  class PGDateTimeAllTest (line 37) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method createActorWithDateTimeFields (line 47) | @Test
    method createActorWithErrorDateTimeField (line 67) | @Test
    method updateActorWithDateTimeField (line 85) | @Test
    method getActorWithDateTimeFields (line 104) | @Test
    method getActorFilterByTimeStamp (line 118) | @Test
    method deleteActorByTimeStamp (line 133) | @Test
    method createActorWithIsoDateTimeFormats (line 147) | @ParameterizedTest

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/pg/PgBasicJoinControllerTest.java
  class PgBasicJoinControllerTest (line 30) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method testLeftJoin (line 45) | @Test
    method testRightJoin (line 67) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/pg/PgBulkCreateControllerTest.java
  class PgBulkCreateControllerTest (line 30) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method create (line 60) | @Test
    method createCSV (line 80) | @Test
    method createCSVWithError (line 96) | @Test
    method createError (line 109) | @Test
    method createDirector (line 123) | @Test
    method createDirectorWithIntTsIdType (line 136) | @Test
    method createReviewWithDefaultTsIdType (line 149) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/pg/PgCountControllerTest.java
  class PgCountControllerTest (line 18) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method countAll (line 23) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/pg/PgCreateControllerTest.java
  class PgCreateControllerTest (line 30) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method create (line 54) | @Test
    method createError (line 70) | @Test
    method createNonExistentTable (line 81) | @Test
    method createDirectorWithTSIDEnabled (line 92) | @Test
    method createDirectorWithTSIDOff (line 107) | @Test
    method createVanityVanWithVarcharTsIdType (line 119) | @Test
    method createFilmWithSubsetOfColumns (line 134) | @Test
    method shouldIgnoreWhenColumnsQueryParamIsEmpty (line 165) | @Test
    method columnIsPresentInColumnsQueryParamButNotInPayload (line 195) | @Test
    method column_violates_not_null_constraint (line 208) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/pg/PgCrossJoinControllerTest.java
  class PgCrossJoinControllerTest (line 29) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method testCrossJoinUsers (line 44) | @Test
    method testCrossJoinTops (line 67) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/pg/PgDeleteAllTest.java
  class PgDeleteAllTest (line 21) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method deleteAllWithAllowSafeDeleteFalse (line 26) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/pg/PgDeleteControllerTest.java
  class PgDeleteControllerTest (line 19) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method delete_single_record (line 23) | @Test
    method delete_all_records_with_allow_safe_delete_true (line 35) | @Test
    method column_does_not_exist (line 47) | @Test
    method foreign_key_constraint_violation (line 60) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/pg/PgExtraFunctionControllerTest.java
  class PgExtraFunctionControllerTest (line 20) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method execute (line 24) | @Test
    method execute_table_output (line 48) | @Disabled
    method execute_update (line 71) | @Test
    method execute_io (line 93) | @Disabled
    method execute_multiply_numbers (line 114) | @Disabled
    method execute_multiply_numbers_no_default (line 134) | @Test
    method execute_fn_out_params (line 156) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/pg/PgFunctionControllerTest.java
  class PgFunctionControllerTest (line 24) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method execute (line 28) | @Test
    method executeUpdateUserFunc (line 50) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/pg/PgInnerJoinControllerTest.java
  class PgInnerJoinControllerTest (line 28) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method testInnerJoin (line 40) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/pg/PgInnerJoinMultiTableControllerTest.java
  class PgInnerJoinMultiTableControllerTest (line 28) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method testInnerMultiTable (line 40) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/pg/PgInnerSelfJoinControllerTest.java
  class PgInnerSelfJoinControllerTest (line 26) | @TestWithResources
    method testInnerSelfJoin (line 38) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/pg/PgJsonFileCreateControllerTest.java
  class PgJsonFileCreateControllerTest (line 27) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method uploadActorsFile (line 39) | @Test
    method uploadActorFileNonJsonArray (line 59) | @Test
    method createDirectorViaUpload (line 74) | @Test
    method createFilmsViaUpload (line 94) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/pg/PgMultiTenancyTest.java
  class PgMultiTenancyTest (line 38) | @Order(200)
    method createMockMvc (line 52) | protected void createMockMvc(WebApplicationContext webApplicationConte...
    method create (line 60) | @Test
    method findAllUsers (line 76) | @Test
    method countAllUsers (line 93) | @Test
    method updateUsers (line 109) | @Test
    method deleteAllUsersFromTenant (line 140) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/pg/PgProcedureControllerTest.java
  class PgProcedureControllerTest (line 24) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method execute (line 28) | @Test
    method executeUpdateUserProc (line 50) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/pg/PgRSqlOperatorReadControllerTest.java
  class PgRSqlOperatorReadControllerTest (line 24) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method findWithEqualsOperator (line 29) | @Test
    method findWithNotEqualsOperator (line 47) | @Test
    method findWithGreaterThanOperator (line 65) | @Test
    method findWithGreaterThanEqualsOperator (line 82) | @Test
    method findWithLessThanOperator (line 100) | @Test
    method findWithLessThanEqualsOperator (line 115) | @Test
    method findWithInOperator (line 131) | @Test
    method findWithNotInOperator (line 147) | @Test
    method findWithNotInOperatorExt (line 163) | @Test
    method findWithLikeOperator (line 179) | @Test
    method findWithStartsWithOperator (line 195) | @Test
    method findWithEndsWithOperator (line 210) | @Test
    method findWithEqualsOperator_givenInvalidColumn_shouldReturn4xx (line 225) | @Test
    method findWithNotLikeOperator (line 237) | @Test
    method findWithEqualsAndStartWithCombinationalOperator (line 257) | @Test
    method findWithEqualsAndLikeCombinationalOperator (line 275) | @Test
    method findWithEqualsAndLikeAndInCombinationalOperator (line 291) | @Test
    method findWithEqualsOrLikeOrInCombinationalOperator (line 307) | @Test
    method findWithEqualsAndLikeAndNotInCombinationalOperator (line 329) | @Test
    method findWithEqualsOrLikeOrNotInCombinationalOperator (line 342) | @Test
    method findWithEqualsAndLikeAndInAbdGreaterThanEualsCombinationalOperator (line 365) | @Test
    method findWithEqualsAndLikeAndInAbdGreaterThanCombinationalOperator (line 381) | @Test
    method findWithEqualsAndLikeAndInAndLessThanEqualsCombinationalOperator (line 394) | @Test
    method findWithEqualsAndLikeAndInAndLessThanCombinationalOperator (line 410) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/pg/PgReadControllerDefaultFetchLimitTest.java
  class PgReadControllerDefaultFetchLimitTest (line 20) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method findAllPersonsWithDefaultFetchLimit5 (line 25) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/pg/PgReadControllerTest.java
  class PgReadControllerTest (line 29) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method findAllFilms (line 47) | @Test
    method findAllFilmsWithThreeCols (line 62) | @Test
    method findAllFilmsWithColumnAlias (line 77) | @Test
    method findOneFilm (line 94) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/pg/PgTemplateControllerTest.java
  class PgTemplateControllerTest (line 20) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method findAllFilms (line 27) | @Test
    method findFilmByID (line 39) | @Test
    method findFilmByIDWithHeader (line 52) | @Test
    method findFilmByIDWithPath (line 65) | @Test
    method findFilmByIDFromContent (line 78) | @Test
    method updateFilmByIDFromContent (line 93) | @Test
    method insertAndDeleteCategoryFromContent (line 108) | @Test
    method findFilmByIDWithRequiredConstraint (line 133) | @Test
    method selectWithConditionalRenderNoRequestParams (line 142) | @Test
    method selectWithConditionalRenderWithID (line 154) | @Test
    method selectWithConditionalRenderWithField (line 168) | @Test
    method selectWithConditionalRenderJoinWithoutInput (line 186) | @Test
    method selectWithConditionalRenderJoin (line 200) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/pg/PgUpdateControllerTest.java
  class PgUpdateControllerTest (line 27) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method updateExistingFilm (line 48) | @Test
    method updateNonExistingFilm (line 64) | @Test
    method updateNonExistingTable (line 80) | @Test
    method updateMultipleColumns (line 94) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/sqlite/SQLiteBulkCreateControllerTest.java
  class SQLiteBulkCreateControllerTest (line 29) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method bulkCreateActors (line 44) | @Test
    method bulkCreateDirectorsWithTSID (line 68) | @Test
    method bulkCreateWithSubsetOfColumns (line 94) | @Test
    method bulkCreateWithInvalidPayload (line 124) | @Test
    method bulkCreateEmptyList (line 141) | @Test
    method bulkCreateToNonExistentTable (line 155) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/sqlite/SQLiteCountControllerTest.java
  class SQLiteCountControllerTest (line 19) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method countAllFilms (line 23) | @Test
    method countAllActors (line 35) | @Test
    method countAllEmployees (line 47) | @Test
    method countFilmsWithFilter (line 59) | @Test
    method countActorsWithFilter (line 72) | @Test
    method countEmployeesWithBooleanFilter (line 85) | @Test
    method countWithMultipleFilters (line 98) | @Test
    method countWithNonExistentFilter (line 111) | @Test
    method countFromNonExistentTable (line 124) | @Test
    method countWithInvalidFilter (line 135) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/sqlite/SQLiteCreateControllerTest.java
  class SQLiteCreateControllerTest (line 30) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method createFilm (line 51) | @Test
    method createFilmWithSubsetOfColumns (line 77) | @Test
    method createFilmInvalidPayload (line 92) | @Test
    method createVanityVanWithTSID (line 105) | @Test
    method createDirectorWithTSID (line 119) | @Test
    method createActor (line 133) | @Test
    method createEmployee (line 152) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/sqlite/SQLiteCrossJoinControllerTest.java
  class SQLiteCrossJoinControllerTest (line 28) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method crossJoinTopsWithBottoms (line 40) | @DisplayName("Cross join tops with bottoms")
    method crossJoinUsersWithUserProfile (line 56) | @DisplayName("Cross join users with userprofile")
    method crossJoinWithFilter (line 72) | @DisplayName("Cross join with filter")
    method crossJoinWithSorting (line 88) | @DisplayName("Cross join with sorting")
    method crossJoinWithPagination (line 105) | @DisplayName("Cross join with pagination")
    method crossJoinWithColorMatching (line 121) | @DisplayName("Cross join with color matching")
    method crossJoinWithSizeFilter (line 149) | @DisplayName("Cross join with size filter")
    method crossJoinWithNonExistentTable (line 174) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/sqlite/SQLiteDateTimeAllTest.java
  class SQLiteDateTimeAllTest (line 29) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method createActorWithTimestamp (line 36) | @Test
    method readActorWithTimestamp (line 59) | @Test
    method updateActorWithTimestamp (line 74) | @Test
    method createEmployeeWithCreateDate (line 106) | @Test
    method filterByDatetime (line 130) | @Test
    method sortByDatetime (line 163) | @Test
    method createFilmWithReleaseYear (line 178) | @DisplayName("Create film with release_year")
    method filterByYearRange (line 212) | @Test
    method bulkCreateWithTimestamps (line 226) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/sqlite/SQLiteDeleteControllerTest.java
  class SQLiteDeleteControllerTest (line 20) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method deleteFilmById (line 24) | @Test
    method deleteActorById (line 45) | @Test
    method deleteWithFilter (line 67) | @Test
    method deleteNonExistentRecord (line 89) | @Test
    method deleteFromNonExistentTable (line 102) | @Test
    method deleteWithInvalidFilter (line 114) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/sqlite/SQLiteInnerJoinControllerTest.java
  class SQLiteInnerJoinControllerTest (line 27) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method innerJoinFilmWithActor (line 35) | @Test
    method innerJoinFilmWithCategory (line 69) | @Test
    method innerJoinWithFilter (line 103) | @Test
    method innerJoinWithSorting (line 137) | @Test
    method innerJoinWithPagination (line 171) | @Test
    method innerJoinWithLanguage (line 204) | @Test
    method innerJoinWithMultipleTables (line 232) | @Test
    method innerJoinWithNonExistentTable (line 267) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/sqlite/SQLiteJsonFileCreateControllerTest.java
  class SQLiteJsonFileCreateControllerTest (line 27) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method createActorsFromJsonFile (line 31) | @Test
    method createDirectorsFromJsonFile (line 60) | @Test
    method createWithCsvFile (line 89) | @DisplayName("Create with CSV file")
    method uploadInvalidJsonFile (line 115) | @Test
    method uploadEmptyFile (line 133) | @Test
    method uploadFileWithInvalidContentType (line 151) | @Test
    method uploadToNonExistentTable (line 169) | @Test
    method uploadFileWithConstraintViolation (line 187) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/sqlite/SQLiteRSqlOperatorReadControllerTest.java
  class SQLiteRSqlOperatorReadControllerTest (line 20) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method testEqualOperator (line 24) | @Test
    method testNotEqualOperator (line 39) | @Test
    method testGreaterThanOperator (line 53) | @Test
    method testLessThanOperator (line 67) | @Test
    method testGreaterThanOrEqualOperator (line 81) | @Test
    method testLessThanOrEqualOperator (line 95) | @Test
    method testInOperator (line 109) | @Test
    method testNotInOperator (line 123) | @Test
    method testNotInOperatorExt (line 137) | @Test
    method testLikeOperator (line 151) | @Test
    method testAndOperator (line 166) | @Test
    method testOrOperator (line 180) | @Test
    method testComplexQueryWithParentheses (line 194) | @Test
    method testBooleanFieldQuery (line 208) | @Test
    method testStringFieldWithWildcards (line 222) | @Test
    method testNullValueQuery (line 237) | @Test
    method testInvalidSyntax (line 251) | @Test
    method testNonExistentField (line 263) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/sqlite/SQLiteReadControllerTest.java
  class SQLiteReadControllerTest (line 20) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method getAllFilms (line 24) | @Test
    method getFilmById (line 39) | @DisplayName("Get film by ID")
    method getFilmsWithFieldSelection (line 52) | @Test
    method getFilmsWithPagination (line 69) | @Test
    method getFilmsWithSorting (line 85) | @Test
    method getFilmsWithFilter (line 100) | @Test
    method getAllActors (line 115) | @Test
    method getActorById (line 130) | @DisplayName("Get actor by ID")
    method getAllEmployees (line 143) | @Test
    method getEmployeesWithBooleanFilter (line 157) | @Test
    method getNonExistentTable (line 171) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/sqlite/SQLiteTemplateControllerTest.java
  class SQLiteTemplateControllerTest (line 20) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method executeSelectAllTemplate (line 25) | @DisplayName("Execute SQL template - select all")
    method executeSelectByIdTemplate (line 38) | @DisplayName("Execute SQL template - select by id")
    method executeConditionalRenderAndOpTemplate (line 53) | @DisplayName("Execute SQL template - conditional render with AND opera...
    method executeConditionalRenderWithTitleFilter (line 69) | @DisplayName("Execute SQL template - conditional render with title fil...
    method executeConditionalRenderJoinTemplate (line 83) | @DisplayName("Execute SQL template - conditional render with join")
    method executeConditionalRenderMultipleFilters (line 97) | @DisplayName("Execute SQL template - conditional render with multiple ...
    method executeTemplateWithoutParameters (line 113) | @DisplayName("Execute SQL template - no parameters")
    method executeTemplateWithHeaderParameters (line 125) | @DisplayName("Execute SQL template - with header parameters")
    method executeNonExistentTemplate (line 140) | @DisplayName("Execute non-existent template")
    method executeTemplateWithInvalidSyntax (line 150) | @Test

FILE: db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/sqlite/SQLiteUpdateControllerTest.java
  class SQLiteUpdateControllerTest (line 27) | @TestClassOrder(ClassOrderer.OrderAnnotation.class)
    method updateFilm (line 45) | @Test
    method updateActor (line 68) | @Test
    method updateEmployee (line 90) | @Test
    method updateWithSubsetOfColumns (line 113) | @Test
    method updateWithFilter (line 141) | @Test
    method updateNonExistentRecord (line 169) | @Test
    method updateWithInvalidPayload (line 183) | @Test

FILE: db2rest-api/api-rest/src/test/resources/db2/db2-sakila.sql
  type tops (line 4) | CREATE TABLE tops (
  type bottoms (line 13) | CREATE TABLE bottoms (
  type users (line 22) | CREATE TABLE users (
  type userprofile (line 34) | CREATE TABLE userprofile (
  type actor (line 47) | CREATE TABLE actor (
  type idx_actor_last_name (line 55) | CREATE INDEX idx_actor_last_name ON actor(last_name)
  type country (line 64) | CREATE TABLE country (

FILE: db2rest-api/api-rest/src/test/resources/mariadb/mariadb-sakila.sql
  type tops (line 28) | CREATE TABLE tops (
  type bottoms (line 38) | CREATE TABLE bottoms (
  type users (line 50) | CREATE TABLE users (
  type userprofile (line 62) | CREATE TABLE userprofile (
  type actor (line 76) | CREATE TABLE actor (
  type director (line 90) | CREATE TABLE director (
  type vanity_van (line 104) | CREATE TABLE vanity_van (
  type review (line 116) | CREATE TABLE review (
  type category (line 129) | CREATE TABLE category (
  type film (line 140) | CREATE TABLE film (
  type film_actor (line 168) | CREATE TABLE film_actor (
  type film_category (line 182) | CREATE TABLE film_category (
  type language (line 196) | CREATE TABLE language (
  type country (line 207) | CREATE TABLE country (
  type person (line 218) | CREATE TABLE person (
  function GetMovieRentalRateFunc (line 245) | CREATE FUNCTION GetMovieRentalRateFunc(movieTitle varchar(100))
  function UpdateUserFunc (line 255) | CREATE FUNCTION UpdateUserFunc(user_id INT)
  type user (line 268) | CREATE TABLE user (

FILE: db2rest-api/api-rest/src/test/resources/mssql/mssql-sakila.sql
  type employee (line 1) | CREATE TABLE employee
  type tops (line 10) | CREATE TABLE tops
  type bottoms (line 17) | CREATE TABLE bottoms
  type users (line 24) | CREATE TABLE users
  type userprofile (line 33) | CREATE TABLE userprofile
  type user_test (line 42) | CREATE TABLE user_test
  type actor (line 53) | CREATE TABLE actor
  type director (line 62) | CREATE TABLE director
  type vanity_van (line 71) | CREATE TABLE vanity_van
  type category (line 79) | CREATE TABLE category
  type language (line 86) | CREATE TABLE language
  type film (line 93) | CREATE TABLE film
  type review (line 118) | CREATE TABLE review
  type film_actor (line 127) | CREATE TABLE film_actor
  type film_category (line 137) | CREATE TABLE film_category
  type country (line 149) | CREATE TABLE country
  type person (line 156) | CREATE TABLE person
  function GetMovieRentalRateFunc (line 164) | CREATE FUNCTION GetMovieRentalRateFunc(@movieTitle VARCHAR(100))

FILE: db2rest-api/api-rest/src/test/resources/mysql/mysql-sakila.sql
  type employee (line 29) | CREATE TABLE employee (
  type department (line 43) | CREATE TABLE department (
  type tops (line 57) | CREATE TABLE tops (
  type bottoms (line 67) | CREATE TABLE bottoms (
  type users (line 79) | CREATE TABLE users (
  type userprofile (line 91) | CREATE TABLE userprofile (
  type actor (line 105) | CREATE TABLE actor (
  type director (line 119) | CREATE TABLE director (
  type vanity_van (line 133) | CREATE TABLE vanity_van (
  type review (line 145) | CREATE TABLE review (
  type category (line 158) | CREATE TABLE category (
  type film (line 169) | CREATE TABLE film (
  type film_actor (line 197) | CREATE TABLE film_actor (
  type film_category (line 211) | CREATE TABLE film_category (
  type language (line 225) | CREATE TABLE language (
  type country (line 236) | CREATE TABLE country (
  type person (line 247) | CREATE TABLE person (
  function GetMovieRentalRateFunc (line 273) | CREATE FUNCTION GetMovieRentalRateFunc(movieTitle varchar(100))
  function UpdateUserFunc (line 283) | CREATE FUNCTION UpdateUserFunc(user_id INT)
  type user (line 296) | CREATE TABLE user (

FILE: db2rest-api/api-rest/src/test/resources/mysql/mysql-wakila-all.sql
  type users (line 15) | CREATE TABLE users (
  type userprofile (line 27) | CREATE TABLE userprofile (
  type employee (line 86) | CREATE TABLE employee (
  type department (line 104) | CREATE TABLE department (

FILE: db2rest-api/api-rest/src/test/resources/oracle/oracle-sakila.sql
  type tops (line 6) | CREATE TABLE tops (
  type bottoms (line 15) | CREATE TABLE bottoms (
  type users (line 29) | CREATE TABLE users (
  type userprofile (line 39) | CREATE TABLE userprofile (
  type actor (line 54) | CREATE TABLE actor (
  type idx_actor_last_name (line 62) | CREATE  INDEX idx_actor_last_name ON actor(last_name)
  type country (line 96) | CREATE TABLE country (
  type person (line 112) | CREATE TABLE person (
  type city (line 143) | CREATE TABLE city (
  type idx_fk_country_id (line 152) | CREATE  INDEX idx_fk_country_id ON city(country_id)

FILE: db2rest-api/api-rest/src/test/resources/pg/pg-sakila-functions.sql
  type employees (line 1) | CREATE TABLE employees (
  function add_numbers (line 14) | CREATE OR REPLACE FUNCTION add_numbers(a INT, b INT)
  function get_employee_details (line 24) | CREATE OR REPLACE FUNCTION get_employee_details(dept_id INT)
  function multiply_numbers (line 54) | CREATE OR REPLACE FUNCTION multiply_numbers(a INT, b INT DEFAULT 10)
  function sum_variadic (line 100) | CREATE OR REPLACE FUNCTION sum_variadic(VARIADIC numbers INT[])
  function get_employees_cursor (line 130) | CREATE OR REPLACE FUNCTION get_employees_cursor()

FILE: db2rest-api/api-rest/src/test/resources/pg/postgres-sakila.sql
  type actor (line 62) | CREATE TABLE actor (
  type director (line 77) | CREATE TABLE director (
  type vanity_van (line 95) | CREATE TABLE vanity_van (
  type review (line 118) | CREATE TABLE review (
  type category (line 158) | CREATE TABLE category (
  type film (line 184) | CREATE TABLE film (
  type film_actor (line 209) | CREATE TABLE film_actor (
  type users (line 223) | CREATE TABLE users (
  type student (line 232) | CREATE TABLE student (
  type userprofile (line 250) | CREATE TABLE userprofile (
  type tops (line 266) | CREATE TABLE tops (
  type bottoms (line 278) | CREATE TABLE bottoms (
  type film_category (line 290) | CREATE TABLE film_category (
  type language (line 316) | CREATE TABLE language (
  type country (line 329) | CREATE TABLE country (
  type person (line 340) | CREATE TABLE person (
  type film_fulltext_idx (line 406) | CREATE INDEX film_fulltext_idx ON film USING gist (fulltext)
  type idx_actor_last_name (line 413) | CREATE INDEX idx_actor_last_name ON actor USING btree (last_name)
  type idx_fk_film_id (line 419) | CREATE INDEX idx_fk_film_id ON film_actor USING btree (film_id)
  type idx_fk_language_id (line 425) | CREATE INDEX idx_fk_language_id ON film USING btree (language_id)
  type idx_fk_original_language_id (line 432) | CREATE INDEX idx_fk_original_language_id ON film USING btree (original_l...
  type idx_title (line 438) | CREATE INDEX idx_title ON film USING btree (title)
  function GetMovieRentalRateFunc (line 556) | CREATE OR REPLACE FUNCTION GetMovieRentalRateFunc(movieTitle varchar)
  function UpdateUserFunc (line 578) | CREATE OR REPLACE FUNCTION UpdateUserFunc(user_id int)

FILE: db2rest-api/api-rest/src/test/resources/sqlite/sqlite-sakila.sql
  type employee (line 10) | CREATE TABLE employee (
  type department (line 21) | CREATE TABLE department (
  type tops (line 31) | CREATE TABLE tops (
  type bottoms (line 40) | CREATE TABLE bottoms (
  type users (line 49) | CREATE TABLE users (
  type userprofile (line 60) | CREATE TABLE userprofile (
  type actor (line 72) | CREATE TABLE actor (
  type idx_actor_last_name (line 79) | CREATE INDEX idx_actor_last_name ON actor(last_name)
  type director (line 84) | CREATE TABLE director (
  type idx_director_last_name (line 91) | CREATE INDEX idx_director_last_name ON director(last_name)
  type vanity_van (line 96) | CREATE TABLE vanity_van (
  type idx_vanity_van_name (line 102) | CREATE INDEX idx_vanity_van_name ON vanity_van(name)
  type review (line 107) | CREATE TABLE review (
  type category (line 118) | CREATE TABLE category (
  type language (line 127) | CREATE TABLE language (
  type film (line 136) | CREATE TABLE film (
  type idx_title (line 155) | CREATE INDEX idx_title ON film(title)
  type idx_fk_language_id (line 156) | CREATE INDEX idx_fk_language_id ON film(language_id)
  type idx_fk_original_language_id (line 157) | CREATE INDEX idx_fk_original_language_id ON film(original_language_id)
  type film_actor (line 162) | CREATE TABLE film_actor (
  type idx_fk_film_id (line 171) | CREATE INDEX idx_fk_film_id ON film_actor(film_id)
  type film_category (line 176) | CREATE TABLE film_category (
  type country (line 188) | CREATE TABLE country (
  type person (line 197) | CREATE TABLE person (

FILE: db2rest-api/rest-common/src/main/java/com/homihq/db2rest/bulk/CSVDataProcessor.java
  class CSVDataProcessor (line 21) | @Component
    method getData (line 27) | @Override
    method handle (line 48) | @Override
    method transform (line 54) | private Map<String, Object> transform(Map<String, String> data) {

FILE: db2rest-api/rest-common/src/main/java/com/homihq/db2rest/bulk/DataProcessor.java
  type DataProcessor (line 7) | public interface DataProcessor {
    method handle (line 9) | boolean handle(String contentType);
    method getData (line 11) | List<Map<String, Object>> getData(InputStream inputStream) throws Exce...

FILE: db2rest-api/rest-common/src/main/java/com/homihq/db2rest/bulk/FileStreamObserver.java
  type FileStreamObserver (line 6) | public interface FileStreamObserver {
    method update (line 7) | void update(List<Map<String, Object>> data);

FILE: db2rest-api/rest-common/src/main/java/com/homihq/db2rest/bulk/FileSubject.java
  type FileSubject (line 5) | public interface FileSubject {
    method register (line 6) | void register(FileStreamObserver observer);
    method startStreaming (line 8) | void startStreaming(InputStream inputStream);
    method unregister (line 10) | void unregister();

FILE: db2rest-api/rest-common/src/main/java/com/homihq/db2rest/bulk/JSONDataProcessor.java
  class JSONDataProcessor (line 13) | @Component
    method getData (line 19) | @Override
    method handle (line 24) | @Override

FILE: db2rest-api/rest-common/src/main/java/com/homihq/db2rest/bulk/JsonFileDataProcessor.java
  class JsonFileDataProcessor (line 21) | @Component
    method register (line 31) | @Override
    method unregister (line 36) | @Override
    method startStreaming (line 51) | @Override
    method getData (line 67) | private List<Map<String, Object>> getData() throws IOException {
    method notifyObserver (line 82) | private void notifyObserver(List<Map<String, Object>> dataChunk) {
    method initializeParser (line 90) | private void initializeParser(InputStream inputStream) throws IOExcept...

FILE: db2rest-api/rest-common/src/main/java/com/homihq/db2rest/config/CorsConfigProperties.java
  class CorsConfigProperties (line 9) | @Configuration
    class CorsMapping (line 17) | @Data

FILE: db2rest-api/rest-common/src/main/java/com/homihq/db2rest/config/DateTimeConfigProperties.java
  class DateTimeConfigProperties (line 5) | @Data

FILE: db2rest-api/rest-common/src/main/java/com/homihq/db2rest/config/DateTimeConfiguration.java
  class DateTimeConfiguration (line 16) | @Configuration
    method jsonCustomizer (line 20) | @Bean

FILE: db2rest-api/rest-common/src/main/java/com/homihq/db2rest/config/Db2RestConfigProperties.java
  class Db2RestConfigProperties (line 15) | @Getter
    method isAllSchema (line 34) | public boolean isAllSchema() {
    method checkDeleteAllowed (line 44) | public void checkDeleteAllowed(String filter) {

FILE: db2rest-api/rest-common/src/main/java/com/homihq/db2rest/config/MultiTenancy.java
  class MultiTenancy (line 11) | @NoArgsConstructor(access = AccessLevel.PRIVATE)
    method joinFilters (line 15) | public static String joinFilters(String filter, String dbId, String ta...
    method addTenantColumns (line 30) | public static void addTenantColumns(List<Map<String, Object>> data, St...
    method addTenantColumns (line 36) | public static void addTenantColumns(Map<String, Object> data, String d...

FILE: db2rest-api/rest-common/src/main/java/com/homihq/db2rest/config/OpenAPIConfiguration.java
  class OpenAPIConfiguration (line 8) | @OpenAPIDefinition(

FILE: db2rest-api/rest-common/src/main/java/com/homihq/db2rest/exception/GlobalExceptionHandler.java
  class GlobalExceptionHandler (line 18) | @RestControllerAdvice
    method handleDeleteOpNotAllowedException (line 21) | @ExceptionHandler(DeleteOpNotAllowedException.class)
    method handleAuthenticationFailedException (line 33) | @ExceptionHandler(AuthenticationFailedException.class)
    method handleTemplateException (line 44) | @ExceptionHandler({SqlTemplateNotFoundException.class})
    method handleTemplateException (line 55) | @ExceptionHandler({SqlTemplateReadException.class})
    method handleTemplateException (line 66) | @ExceptionHandler({PathVariableNamesMissingException.class})
    method handleTemplateException (line 77) | @ExceptionHandler({PathVariableValuesMissingException.class})
    method handleCustomPlaceholderException (line 88) | @ExceptionHandler({PlaceholderConstraintException.class})
    method handleUnsupportedConstraintException (line 98) | @ExceptionHandler({UnsupportedConstraintException.class})
    method handleRpcException (line 108) | @ExceptionHandler(RpcException.class)
    method handleInvalidTableException (line 119) | @ExceptionHandler(InvalidTableException.class)
    method handleInvalidOperatorException (line 131) | @ExceptionHandler(InvalidOperatorException.class)
    method handleGenericDataAccessException (line 142) | @ExceptionHandler({GenericDataAccessException.class, RuntimeException....
    method handleInvalidColumnException (line 153) | @ExceptionHandler(InvalidColumnException.class)
    method handleMethodArgumentNotValid (line 166) | @Override

FILE: db2rest-api/rest-common/src/main/java/com/homihq/db2rest/multidb/DatabaseConnectionDetail.java
  method isMongo (line 14) | public boolean isMongo() {
  method isJdbcPresent (line 18) | public boolean isJdbcPresent() {
  method includeAllSchemas (line 22) | public boolean includeAllSchemas() {

FILE: db2rest-api/rest-common/src/main/java/com/homihq/db2rest/multidb/DatabaseProperties.java
  class DatabaseProperties (line 13) | @Data
    method getDatabase (line 22) | public Optional<DatabaseConnectionDetail> getDatabase(String dbId) {
    method isRdbmsConfigured (line 28) | public boolean isRdbmsConfigured() {

FILE: db2rest-auth/src/main/java/com/homihq/db2rest/auth/AuthConfiguration.java
  class AuthConfiguration (line 34) | @Slf4j
    method authAntPathMatcher (line 40) | @Bean("authAntPathMatcher")
    method authFilter (line 45) | @Bean
    method apiKeyAuthProvider (line 55) | @Bean
    method basicAuthProvider (line 61) | @Bean
    method jwtAuthProvider (line 67) | @Bean
    method jwtProcessor (line 76) | @Bean
    method authDataProvider (line 99) | @Bean

FILE: db2rest-auth/src/main/java/com/homihq/db2rest/auth/AuthFilter.java
  class AuthFilter (line 21) | @RequiredArgsConstructor
    method doFilterInternal (line 29) | @Override
    method addError (line 73) | private void addError(

FILE: db2rest-auth/src/main/java/com/homihq/db2rest/auth/data/AuthData.java
  method excludedResources (line 13) | @Override

FILE: db2rest-auth/src/main/java/com/homihq/db2rest/auth/data/UserDetail.java
  method getRoles (line 8) | public String[] getRoles() {

FILE: db2rest-auth/src/main/java/com/homihq/db2rest/auth/datalookup/ApiAuthDataLookup.java
  class ApiAuthDataLookup (line 12) | @Slf4j
    method ApiAuthDataLookup (line 17) | public ApiAuthDataLookup(String apiEndPoint, String apiKey) {
    method getApiResourceRoles (line 32) | @Override
    method getApiKeys (line 37) | @Override
    method getUsers (line 42) | @Override
    method getExcludedResources (line 47) | @Override
    method getUserByUsername (line 52) | @Override
    method getRoleDataFilters (line 57) | @Override

FILE: db2rest-auth/src/main/java/com/homihq/db2rest/auth/datalookup/AuthDataLookup.java
  type AuthDataLookup (line 8) | public interface AuthDataLookup {
    method getApiResourceRoles (line 10) | List<ResourceRole> getApiResourceRoles();
    method getUsers (line 12) | List<User> getUsers();
    method getExcludedResources (line 14) | List<ApiExcludedResource> getExcludedResources();
    method getApiKeys (line 16) | List<ApiKey> getApiKeys();
    method getUserByUsername (line 18) | Optional<User> getUserByUsername(String username);
    method getRoleDataFilters (line 20) | List<RoleDataFilter> getRoleDataFilters(String role);

FILE: db2rest-auth/src/main/java/com/homihq/db2rest/auth/datalookup/AuthDataProperties.java
  class AuthDataProperties (line 11) | @Configuration
    method isFileProvider (line 25) | public boolean isFileProvider() {
    method isApiDataProvider (line 29) | public boolean isApiDataProvider() {

FILE: db2rest-auth/src/main/java/com/homihq/db2rest/auth/datalookup/FileAuthDataLookup.java
  class FileAuthDataLookup (line 14) | @Slf4j
    method FileAuthDataLookup (line 19) | public FileAuthDataLookup(String authFileFullPath) {
    method getApiResourceRoles (line 35) | @Override
    method getApiKeys (line 40) | @Override
    method getUsers (line 45) | @Override
    method getExcludedResources (line 50) | @Override
    method getUserByUsername (line 55) | @Override
    method getRoleDataFilters (line 61) | @Override

FILE: db2rest-auth/src/main/java/com/homihq/db2rest/auth/datalookup/NoAuthdataLookup.java
  class NoAuthdataLookup (line 9) | public class NoAuthdataLookup implements AuthDataLookup {
    method getApiResourceRoles (line 10) | @Override
    method getExcludedResources (line 15) | @Override
    method getApiKeys (line 20) | @Override
    method getUserByUsername (line 25) | @Override
    method getRoleDataFilters (line 30) | @Override
    method getUsers (line 35) | @Override

FILE: db2rest-auth/src/main/java/com/homihq/db2rest/auth/exception/AuthException.java
  class AuthException (line 5) | public class AuthException extends NestedRuntimeException {
    method AuthException (line 6) | public AuthException(String msg) {

FILE: db2rest-auth/src/main/java/com/homihq/db2rest/auth/provider/AbstractAuthProvider.java
  class AbstractAuthProvider (line 19) | @RequiredArgsConstructor
    method canHandle (line 29) | public abstract boolean canHandle(HttpServletRequest request);
    method authenticate (line 31) | public abstract UserDetail authenticate(HttpServletRequest request);
    method authorize (line 33) | public abstract boolean authorize(UserDetail userDetail, String resour...
    method isExcluded (line 35) | public abstract boolean isExcluded(String requestUri, String method);
    method isExcludedInternal (line 37) | protected boolean isExcludedInternal(
    method getAuthHeader (line 64) | protected String getAuthHeader(HttpServletRequest request) {
    method authorizeInternal (line 68) | protected boolean authorizeInternal(
    method getRoleBasedDataFilters (line 103) | public List<RoleDataFilter> getRoleBasedDataFilters(UserDetail userDet...

FILE: db2rest-auth/src/main/java/com/homihq/db2rest/auth/provider/apikey/ApiKeyAuthProvider.java
  class ApiKeyAuthProvider (line 11) | public class ApiKeyAuthProvider extends AbstractAuthProvider {
    method ApiKeyAuthProvider (line 14) | public ApiKeyAuthProvider(AuthDataLookup authDataLookup, AntPathMatche...
    method canHandle (line 18) | @Override
    method authenticate (line 24) | @Override
    method authorize (line 36) | @Override
    method isExcluded (line 41) | @Override

FILE: db2rest-auth/src/main/java/com/homihq/db2rest/auth/provider/basic/BasicAuthProvider.java
  class BasicAuthProvider (line 17) | @Slf4j
    method BasicAuthProvider (line 21) | public BasicAuthProvider(AuthDataLookup authDataLookup, AntPathMatcher...
    method canHandle (line 25) | @Override
    method authenticate (line 31) | @Override
    method authorize (line 57) | @Override
    method isExcluded (line 63) | @Override

FILE: db2rest-auth/src/main/java/com/homihq/db2rest/auth/provider/jwt/JwtAuthProvider.java
  class JwtAuthProvider (line 19) | @Slf4j
    method JwtAuthProvider (line 24) | public JwtAuthProvider(AuthDataLookup authDataLookup, AntPathMatcher a...
    method canHandle (line 30) | @Override
    method authenticate (line 36) | @Override
    method authorize (line 51) | @Override
    method isExcluded (line 56) | @Override

FILE: db2rest-auth/src/main/java/com/homihq/db2rest/auth/provider/jwt/JwtProperties.java
  class JwtProperties (line 15) | @Configuration
    method isKeyOrJwksUrlPresent (line 27) | @AssertTrue(message = "Key or jwksUrl must be present!")
    method setAlgorithm (line 32) | public void setAlgorithm(String algorithm) {
    method setKey (line 36) | public void setKey(String secret) {

FILE: db2rest-auth/src/main/java/com/homihq/db2rest/auth/unkey/UnKeyAuthConfiguration.java
  class UnKeyAuthConfiguration (line 11) | @ConditionalOnProperty(prefix = "db2rest.auth", name = "type", havingVal...
    method unKeyAuthService (line 15) | @Bean
    method unKeyAuthFilter (line 20) | @Bean

FILE: db2rest-auth/src/main/java/com/homihq/db2rest/auth/unkey/UnKeyAuthFilter.java
  class UnKeyAuthFilter (line 21) | @RequiredArgsConstructor
    method doFilterInternal (line 29) | @Override
    method addAuthenticationError (line 61) | private void addAuthenticationError(HttpServletRequest request, HttpSe...
    method addMissingApiKeyError (line 78) | private void addMissingApiKeyError(HttpServletRequest request, HttpSer...

FILE: db2rest-auth/src/main/java/com/homihq/db2rest/auth/unkey/service/UnKeyAuthService.java
  class UnKeyAuthService (line 18) | @Slf4j
    method verify (line 30) | public Optional<UnKeyVerifyResponse> verify(String apiKey) {

FILE: db2rest-auth/src/main/java/com/homihq/db2rest/auth/unkey/to/UnKeyVerifyResponse.java
  method isValidKey (line 15) | public boolean isValidKey() {

FILE: db2rest-core/db2rest-common/src/main/java/com/homihq/db2rest/core/exception/AuthenticationFailedException.java
  class AuthenticationFailedException (line 3) | public class AuthenticationFailedException extends RuntimeException {
    method AuthenticationFailedException (line 5) | public AuthenticationFailedException(String message) {

FILE: db2rest-core/db2rest-common/src/main/java/com/homihq/db2rest/core/exception/DeleteOpNotAllowedException.java
  class DeleteOpNotAllowedException (line 3) | public class DeleteOpNotAllowedException extends RuntimeException {
    method DeleteOpNotAllowedException (line 6) | public DeleteOpNotAllowedException(boolean safe) {

FILE: db2rest-core/db2rest-common/src/main/java/com/homihq/db2rest/core/exception/GenericDataAccessException.java
  class GenericDataAccessException (line 3) | public class GenericDataAccessException extends RuntimeException {
    method GenericDataAccessException (line 5) | public GenericDataAccessException(String msg) {

FILE: db2rest-core/db2rest-common/src/main/java/com/homihq/db2rest/core/exception/InvalidColumnException.java
  class InvalidColumnException (line 3) | public class InvalidColumnException extends RuntimeException {
    method InvalidColumnException (line 5) | public InvalidColumnException(String tableName, String columnName) {

FILE: db2rest-core/db2rest-common/src/main/java/com/homihq/db2rest/core/exception/InvalidOperatorException.java
  class InvalidOperatorException (line 3) | public class InvalidOperatorException extends RuntimeException {
    method InvalidOperatorException (line 6) | public InvalidOperatorException(String message, String operator) {

FILE: db2rest-core/db2rest-common/src/main/java/com/homihq/db2rest/core/exception/InvalidTableException.java
  class InvalidTableException (line 3) | public class InvalidTableException extends RuntimeException {
    method InvalidTableException (line 6) | public InvalidTableException(String tableName) {

FILE: db2rest-core/db2rest-common/src/main/java/com/homihq/db2rest/core/exception/PathVariableNamesMissingException.java
  class PathVariableNamesMissingException (line 3) | public class PathVariableNamesMissingException extends RuntimeException {
    method PathVariableNamesMissingException (line 5) | public PathVariableNamesMissingException() {

FILE: db2rest-core/db2rest-common/src/main/java/com/homihq/db2rest/core/exception/PathVariableValuesMissingException.java
  class PathVariableValuesMissingException (line 3) | public class PathVariableValuesMissingException extends RuntimeException {
    method PathVariableValuesMissingException (line 4) | public PathVariableValuesMissingException() {
    method PathVariableValuesMissingException (line 8) | public PathVariableValuesMissingException(String key) {

FILE: db2rest-core/db2rest-common/src/main/java/com/homihq/db2rest/core/exception/PlaceholderConstraintException.java
  class PlaceholderConstraintException (line 3) | public class PlaceholderConstraintException extends RuntimeException {
    method PlaceholderConstraintException (line 5) | public PlaceholderConstraintException(String namedParam, String msg) {

FILE: db2rest-core/db2rest-common/src/main/java/com/homihq/db2rest/core/exception/RpcException.java
  class RpcException (line 5) | public class RpcException extends RuntimeException {
    method RpcException (line 7) | public RpcException(String subRoutineName, Map<String, Object> inParam...

FILE: db2rest-core/db2rest-common/src/main/java/com/homihq/db2rest/core/exception/SqlTemplateNotFoundException.java
  class SqlTemplateNotFoundException (line 3) | public class SqlTemplateNotFoundException extends RuntimeException {
    method SqlTemplateNotFoundException (line 5) | public SqlTemplateNotFoundException(String templateName) {

FILE: db2rest-core/db2rest-common/src/main/java/com/homihq/db2rest/core/exception/SqlTemplateReadException.java
  class SqlTemplateReadException (line 3) | public class SqlTemplateReadException extends RuntimeException {
    method SqlTemplateReadException (line 5) | public SqlTemplateReadException(String templateName) {

FILE: db2rest-core/db2rest-common/src/main/java/com/homihq/db2rest/core/exception/UnsupportedConstraintException.java
  class UnsupportedConstraintException (line 3) | public class UnsupportedConstraintException extends RuntimeException {
    method UnsupportedConstraintException (line 4) | public UnsupportedConstraintException(String constraint) {

FILE: db2rest-core/db2rest-common/src/main/java/com/homihq/db2rest/multidb/DatabaseContextHolder.java
  class DatabaseContextHolder (line 3) | public abstract class DatabaseContextHolder {
    method getCurrentDbId (line 8) | public static String getCurrentDbId() {
    method setCurrentDbId (line 12) | public static void setCurrentDbId(String tenant) {
    method clear (line 16) | public static void clear() {

FILE: db2rest-core/rdbms-common/src/main/java/com/db2rest/jdbc/dialect/Dialect.java
  class Dialect (line 15) | public abstract class Dialect {
    method Dialect (line 19) | protected Dialect(ObjectMapper objectMapper, String coverChar) {
    method isSupportedDb (line 24) | public abstract boolean isSupportedDb(String productName, int majorVer...
    method processTypes (line 26) | public abstract void processTypes(DbTable table, List<String> insertab...
    method renderTableName (line 28) | public abstract String renderTableName(DbTable table, boolean contains...
    method renderTableNameWithoutAlias (line 30) | public abstract String renderTableNameWithoutAlias(DbTable table);
    method getObjectMapper (line 32) | protected ObjectMapper getObjectMapper() {
    method getCoverChar (line 36) | protected String getCoverChar() {
    method supportBatchReturnKeys (line 40) | public boolean supportBatchReturnKeys() {
    method supportAlias (line 44) | public boolean supportAlias() {
    method getMajorVersion (line 48) | public int getMajorVersion() {
    method getAliasedName (line 52) | public String getAliasedName(DbColumn dbColumn, boolean deleteOp) {
    method getAliasedNameParam (line 56) | public String getAliasedNameParam(DbColumn dbColumn, boolean deleteOp) {
    method parseListValues (line 60) | public List<Object> parseListValues(List<String> values, Class type, S...
    method processValue (line 68) | @Deprecated
    method convertToStringArray (line 98) | public List<String> convertToStringArray(Object object) {
    method convertJsonToVO (line 102) | public Object convertJsonToVO(Object object) {
    method getCountSqlTemplate (line 106) | public String getCountSqlTemplate() {
    method getDeleteSqlTemplate (line 110) | public String getDeleteSqlTemplate() {
    method getExistSqlTemplate (line 114) | public String getExistSqlTemplate() {
    method getFindOneSqlTemplate (line 118) | public String getFindOneSqlTemplate() {
    method getInsertSqlTemplate (line 122) | public String getInsertSqlTemplate() {
    method getReadSqlTemplate (line 126) | public String getReadSqlTemplate() {
    method getUpdateSqlTemplate (line 130) | public String getUpdateSqlTemplate() {
    method convertTimestamp (line 134) | public Object convertTimestamp(String value){

FILE: db2rest-core/rdbms-common/src/main/java/com/db2rest/jdbc/dialect/model/Database.java
  type Database (line 6) | @RequiredArgsConstructor

FILE: db2rest-core/rdbms-common/src/main/java/com/db2rest/jdbc/dialect/model/DbColumn.java
  method getQuotedName (line 21) | @Deprecated
  method getQuotedAlias (line 30) | @Deprecated
  method render (line 35) | @Deprecated
  method renderWithAlias (line 40) | @Deprecated
  method getAliasedName (line 54) | @Deprecated
  method getAliasedNameParam (line 59) | @Deprecated
  method isDateTimeFamily (line 64) | @Deprecated
  method isIntFamily (line 70) | @Deprecated
  method isStringFamily (line 76) | @Deprecated
  method copyWithAlias (line 82) | public DbColumn copyWithAlias(DbAlias columnAlias) {
  method copyWithTableAlias (line 91) | public DbColumn copyWithTableAlias(String tableAlias) {

FILE: db2rest-core/rdbms-common/src/main/java/com/db2rest/jdbc/dialect/model/DbJoin.java
  class DbJoin (line 10) | @Data
    method render (line 24) | public String render() {
    method addOn (line 49) | public void addOn(DbColumn leftColumn, String operator, DbColumn right...
    method addAndCondition (line 55) | public void addAndCondition(DbColumn leftColumn, String operator, DbCo...
    method addAdditionalWhere (line 64) | public void addAdditionalWhere(String where) {

FILE: db2rest-core/rdbms-common/src/main/java/com/db2rest/jdbc/dialect/model/DbSort.java
  method render (line 5) | public String render() {

FILE: db2rest-core/rdbms-common/src/main/java/com/db2rest/jdbc/dialect/model/DbTable.java
  method render (line 14) | public String render() {
  method copyWithAlias (line 18) | public DbTable copyWithAlias(String tableAlias) {
  method buildColumn (line 27) | public DbColumn buildColumn(String columnName) {
  method getDbColumn (line 32) | private DbColumn getDbColumn(DbAlias dbAlias) {
  method getAlias (line 40) | private DbAlias getAlias(String name) {
  method buildColumns (line 78) | public List<DbColumn> buildColumns() {
  method buildPkColumns (line 82) | public List<DbColumn> buildPkColumns() {
  method getKeyColumnNames (line 89) | public String[] getKeyColumnNames() {
  method getColumnDataTypeName (line 96) | public String getColumnDataTypeName(String columnName) {
  method lookupColumn (line 100) | private DbColumn lookupColumn(String columnName) {

FILE: db2rest-core/rdbms-common/src/main/java/com/db2rest/jdbc/dialect/model/DbWhere.java
  method isDelete (line 17) | public boolean isDelete() {

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/JdbcManager.java
  class JdbcManager (line 31) | @Slf4j
    method reload (line 46) | @PostConstruct
    method getDbMetaByDbId (line 53) | public DbMeta getDbMetaByDbId(String dbId) {
    method getDbMetaMap (line 61) | public Map<String, DbMeta> getDbMetaMap() {
    method getTables (line 69) | public List<DbTable> getTables() {
    method loadAllMetaData (line 74) | public void loadAllMetaData() {
    method loadMetaData (line 111) | private void loadMetaData(String dbId, DataSource ds, DatabaseConnecti...
    method getTable (line 150) | public DbTable getTable(String dbId, String schemaName, String tableNa...
    method getBySchemaAndTableName (line 173) | private DbTable getBySchemaAndTableName(String dbId, String schemaName...
    method getNamedParameterJdbcTemplate (line 197) | public NamedParameterJdbcTemplate getNamedParameterJdbcTemplate(String...
    method getTxnTemplate (line 201) | public TransactionTemplate getTxnTemplate(String dbId) {
    method getDialect (line 205) | public Dialect getDialect(String dbId) {

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/JdbcOperationService.java
  class JdbcOperationService (line 28) | @RequiredArgsConstructor
    method update (line 33) | @Override
    method read (line 38) | @Override
    method findOne (line 45) | @Override
    method exists (line 50) | @Override
    method count (line 62) | @Override
    method queryCustom (line 68) | @Override
    method delete (line 75) | @Override
    method create (line 83) | @Override
    method processArrayValue (line 124) | private Array processArrayValue(NamedParameterJdbcTemplate namedParame...
    method batchUpdate (line 139) | @Override
    method batchUpdate (line 155) | public CreateBulkResponse batchUpdate(

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/core/DbOperationService.java
  type DbOperationService (line 14) | public interface DbOperationService {
    method update (line 15) | int update(NamedParameterJdbcTemplate namedParameterJdbcTemplate, Map<...
    method read (line 17) | List<Map<String, Object>> read(NamedParameterJdbcTemplate namedParamet...
    method findOne (line 21) | Map<String, Object> findOne(NamedParameterJdbcTemplate namedParameterJ...
    method exists (line 23) | ExistsResponse exists(NamedParameterJdbcTemplate namedParameterJdbcTem...
    method count (line 25) | CountResponse count(NamedParameterJdbcTemplate namedParameterJdbcTempl...
    method queryCustom (line 27) | Object queryCustom(NamedParameterJdbcTemplate namedParameterJdbcTempla...
    method delete (line 29) | int delete(NamedParameterJdbcTemplate namedParameterJdbcTemplate, Map<...
    method create (line 31) | CreateResponse create(NamedParameterJdbcTemplate namedParameterJdbcTem...
    method batchUpdate (line 33) | CreateBulkResponse batchUpdate(NamedParameterJdbcTemplate namedParamet...
    method batchUpdate (line 35) | CreateBulkResponse batchUpdate(NamedParameterJdbcTemplate namedParamet...

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/core/SimpleRowMapper.java
  class SimpleRowMapper (line 12) | @Slf4j
    method getColumnValue (line 18) | @Override

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/core/service/BulkCreateService.java
  type BulkCreateService (line 13) | public interface BulkCreateService {
    method saveBulk (line 14) | CreateBulkResponse saveBulk(
    method saveMultipartFile (line 18) | @Async

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/core/service/CountQueryService.java
  type CountQueryService (line 6) | public interface CountQueryService {
    method count (line 7) | CountResponse count(ReadContext readContext);

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/core/service/CreateService.java
  type CreateService (line 8) | public interface CreateService {
    method save (line 10) | CreateResponse save(String dbId, String schemaName, String tableName, ...

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/core/service/DeleteService.java
  type DeleteService (line 4) | public interface DeleteService {
    method delete (line 6) | int delete(

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/core/service/ExistsQueryService.java
  type ExistsQueryService (line 6) | public interface ExistsQueryService {
    method exists (line 7) | ExistsResponse exists(ReadContext readContext);

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/core/service/FindOneService.java
  type FindOneService (line 7) | public interface FindOneService {
    method findOne (line 8) | Map<String, Object> findOne(ReadContext readContext);

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/core/service/FunctionService.java
  type FunctionService (line 8) | public interface FunctionService extends SubRoutine {
    method getSimpleJdbcCall (line 9) | SimpleJdbcCall getSimpleJdbcCall(String dbId, String subRoutineName);
    method execute (line 11) | Map<String, Object> execute(String dbId, String subRoutineName, Map<St...

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/core/service/JdbcBulkCreateService.java
  class JdbcBulkCreateService (line 36) | @Slf4j
    method saveBulk (line 51) | public CreateBulkResponse saveBulk(BulkContext bulkContext, List<Map<S...
    method saveMultipartFile (line 95) | @Async
    method update (line 121) | @Override
    method determineInsertableColumns (line 157) | private List<String> determineInsertableColumns(
    method handleTsId (line 173) | private List<Map<String, Object>> handleTsId(
    method convertToInsertableColumnList (line 201) | private List<InsertableColumn> convertToInsertableColumnList(
    method processTypes (line 229) | private void processTypes(
    method executeBatchUpdate (line 246) | private CreateBulkResponse executeBatchUpdate(

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/core/service/JdbcCountQueryService.java
  class JdbcCountQueryService (line 16) | @Slf4j
    method count (line 24) | @Override

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/core/service/JdbcCreateService.java
  class JdbcCreateService (line 24) | @Slf4j
    method save (line 33) | @Override
    method buildInsertableColumns (line 79) | private List<String> buildInsertableColumns(
    method processTsId (line 86) | private Map<String, Object> processTsId(
    method toInsertableColumnList (line 96) | private List<InsertableColumn> toInsertableColumnList(
    method processSequences (line 105) | private void processSequences(
    method executeCreate (line 129) | private CreateResponse executeCreate(
    method updateOrAddInsertableColumn (line 145) | private void updateOrAddInsertableColumn(

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/core/service/JdbcDeleteService.java
  class JdbcDeleteService (line 21) | @Slf4j
    method delete (line 30) | @Override
    method executeDelete (line 44) | private int executeDelete(String dbId, String filter, DbTable table, D...
    method addWhere (line 70) | private void addWhere(String dbId, String filter, DbTable table, Delet...

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/core/service/JdbcExistsQueryService.java
  class JdbcExistsQueryService (line 16) | @Slf4j
    method exists (line 24) | @Override

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/core/service/JdbcFindOneService.java
  class JdbcFindOneService (line 16) | @Slf4j
    method findOne (line 25) | @Override

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/core/service/JdbcFunctionService.java
  class JdbcFunctionService (line 13) | @Slf4j
    method getSimpleJdbcCall (line 20) | @Override
    method execute (line 27) | @Override

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/core/service/JdbcProcedureService.java
  class JdbcProcedureService (line 19) | @Slf4j
    method execute (line 27) | @Override
    method doExecuteInternal (line 51) | private Map<String, Object> doExecuteInternal(JdbcTemplate jdbcTemplate,

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/core/service/JdbcReadService.java
  class JdbcReadService (line 16) | @Slf4j
    method findAll (line 24) | @Override

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/core/service/JdbcUpdateService.java
  class JdbcUpdateService (line 23) | @Slf4j
    method patch (line 31) | @Override
    method executeUpdate (line 54) | private int executeUpdate(String dbId, String filter, DbTable table, U...
    method addWhere (line 82) | private void addWhere(String filter, DbTable table, UpdateContext cont...

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/core/service/JinJavaTemplateExecutorService.java
  class JinJavaTemplateExecutorService (line 33) | @Slf4j
    method buildNamedParameterQuery (line 47) | private static String buildNamedParameterQuery(String template) {
    method buildParamMap (line 54) | private static Map<String, Object> buildParamMap(Map<String, Object> c...
    method execute (line 72) | @Override
    method execute (line 81) | private Object execute(String dbId, Map<String, Object> paramMap, Stri...
    method executeQuery (line 96) | private Object executeQuery(String dbId, Map<String, Object> paramMap,...
    method executeUpdate (line 106) | private UpdateResponse executeUpdate(String dbId, Map<String, Object> ...
    method executeDelete (line 115) | private DeleteResponse executeDelete(String dbId, Map<String, Object> ...
    method executeCreate (line 124) | private Object executeCreate(String dbId, Map<String, Object> paramMap...
    method executeInternal (line 134) | private Pair<String, Map<String, Object>> executeInternal(String templ...
    method renderJinJavaTemplate (line 144) | private String renderJinJavaTemplate(String templateFile, Map<String, ...
    method extractPlaceHolder (line 169) | private Map<String, Placeholder> extractPlaceHolder(final String rende...
    method validatePlaceholder (line 195) | private void validatePlaceholder(final Map<String, Placeholder> placeh...

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/core/service/ProcedureService.java
  type ProcedureService (line 7) | public interface ProcedureService {
    method execute (line 9) | Map<String, Object> execute(String dbId, String subRoutineName, Map<St...

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/core/service/ReadService.java
  type ReadService (line 5) | public interface ReadService {
    method findAll (line 6) | Object findAll(ReadContext readContext);

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/core/service/SQLTemplateExecutorService.java
  type SQLTemplateExecutorService (line 6) | public interface SQLTemplateExecutorService {
    method execute (line 8) | Object execute(String dbId, String templateFile, Map<String, Object> c...

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/core/service/SubRoutine.java
  type SubRoutine (line 13) | public interface SubRoutine {
    method doExecute (line 15) | default Map<String, Object> doExecute(JdbcTemplate jdbcTemplate,
    method getSimpleJdbcCall (line 28) | SimpleJdbcCall getSimpleJdbcCall(String dbId, String subRoutineName);

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/core/service/UpdateService.java
  type UpdateService (line 6) | public interface UpdateService {
    method patch (line 8) | int patch(String dbId, String schemaName, String tableName, Map<String...

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/dto/CreateContext.java
  method getColumnNames (line 15) | private List<String> getColumnNames() {
  method getParamNames (line 21) | private List<String> getParamNames() {
  method renderColumns (line 53) | public String renderColumns() {
  method renderParams (line 57) | public String renderParams() {

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/dto/DeleteContext.java
  class DeleteContext (line 15) | @Builder
    method createParamMap (line 28) | public void createParamMap() {

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/dto/FnUtil.java
  class FnUtil (line 3) | public final class FnUtil {
    method FnUtil (line 5) | private FnUtil() {}
    method extractFn (line 12) | public static String extractFn(String text) {
    method substituteColumnPlaceholder (line 49) | public static String substituteColumnPlaceholder(String fragment, Stri...
    method isSafe (line 62) | public static boolean isSafe(String fragment) {

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/dto/InsertableColumn.java
  class InsertableColumn (line 6) | @Data

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/dto/JoinDetail.java
  method getJoinType (line 19) | public String getJoinType() {
  method hasWith (line 25) | public boolean hasWith() {
  method hasOn (line 29) | public boolean hasOn() {
  method hasFilter (line 33) | public boolean hasFilter() {

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/dto/ReadContext.java
  class ReadContext (line 20) | @Builder
    method createParamMap (line 49) | public void createParamMap() {
    method addColumns (line 55) | public void addColumns(List<DbColumn> columnList) {
    method addJoin (line 59) | public void addJoin(DbJoin join) {
    method addTable (line 65) | public void addTable(DbTable table) {

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/dto/UpdateContext.java
  class UpdateContext (line 17) | @Builder
    method renderSetColumns (line 32) | public String renderSetColumns() {
    method createParamMap (line 39) | public void createParamMap(Map<String, Object> data) {

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/multidb/RoutingDataSource.java
  class RoutingDataSource (line 8) | @Slf4j
    method determineCurrentLookupKey (line 12) | @Override

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/processor/JoinProcessor.java
  class JoinProcessor (line 28) | @Slf4j
    method process (line 35) | @Override
    method reviewRootTable (line 75) | private DbTable reviewRootTable(String dbId, List<DbTable> allJoinTabl...
    method addJoin (line 94) | private void addJoin(DbTable table, DbTable rootTable, JoinDetail join...
    method processFilter (line 107) | private void processFilter(DbTable table, JoinDetail joinDetail, DbJoi...
    method addCondition (line 129) | private void addCondition(DbTable table, DbTable rootTable, JoinDetail...
    method processOn (line 141) | private void processOn(String onExpression, int onIdx, DbTable table, ...
    method addColumns (line 161) | private List<DbColumn> addColumns(DbTable table, List<String> fields) {

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/processor/OrderByProcessor.java
  class OrderByProcessor (line 13) | @RequiredArgsConstructor
    method process (line 17) | @Override

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/processor/ReadProcessor.java
  type ReadProcessor (line 5) | public interface ReadProcessor {
    method process (line 7) | void process(ReadContext readContext);

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/processor/RootTableFieldProcessor.java
  class RootTableFieldProcessor (line 17) | @Slf4j
    method process (line 20) | @Override

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/processor/RootTableProcessor.java
  class RootTableProcessor (line 11) | @Slf4j
    method process (line 18) | @Override

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/processor/RootWhereProcessor.java
  class RootWhereProcessor (line 16) | @Slf4j
    method process (line 22) | @Override

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/rsql/operator/CustomRSQLOperators.java
  class CustomRSQLOperators (line 9) | public class CustomRSQLOperators extends RSQLOperators {
    method customOperators (line 54) | public static Set<ComparisonOperator> customOperators() {

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/rsql/operator/OperatorHandler.java
  type OperatorHandler (line 12) | public interface OperatorHandler {
    method handle (line 16) | String handle(Dialect dialect, DbColumn column, DbWhere dbWhere, Strin...
    method reviewAndSetParam (line 18) | default String reviewAndSetParam(String key, Object value, Map<String,...
    method handle (line 32) | default String handle(Dialect dialect, DbColumn column, DbWhere dbWher...

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/rsql/operator/OperatorMap.java
  class OperatorMap (line 9) | public class OperatorMap {
    method getSQLOperator (line 21) | public static String getSQLOperator(String rSQLOperator) {
    method getRSQLOperator (line 25) | public static String getRSQLOperator(String expression) {

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/rsql/operator/RSQLOperatorHandlers.java
  class RSQLOperatorHandlers (line 10) | public class RSQLOperatorHandlers {
    method getOperatorHandler (line 44) | public static OperatorHandler getOperatorHandler(String symbol) {

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/rsql/operator/handler/EndWithOperatorHandler.java
  class EndWithOperatorHandler (line 10) | public class EndWithOperatorHandler implements OperatorHandler {
    method handle (line 14) | @Override

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/rsql/operator/handler/EqualToOperatorHandler.java
  class EqualToOperatorHandler (line 10) | public class EqualToOperatorHandler implements OperatorHandler {
    method handle (line 14) | @Override

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/rsql/operator/handler/GreaterThanEqualToOperatorHandler.java
  class GreaterThanEqualToOperatorHandler (line 10) | public class GreaterThanEqualToOperatorHandler implements OperatorHandler {
    method handle (line 14) | @Override

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/rsql/operator/handler/GreaterThanOperatorHandler.java
  class GreaterThanOperatorHandler (line 11) | @Slf4j
    method handle (line 16) | @Override

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/rsql/operator/handler/InOperatorHandler.java
  class InOperatorHandler (line 13) | @Slf4j
    method handle (line 18) | @Override
    method handle (line 23) | @Override

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/rsql/operator/handler/IsNotNullOperatorHandler.java
  class IsNotNullOperatorHandler (line 10) | public class IsNotNullOperatorHandler implements OperatorHandler {
    method handle (line 14) | @Override

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/rsql/operator/handler/IsNullOperatorHandler.java
  class IsNullOperatorHandler (line 10) | public class IsNullOperatorHandler implements OperatorHandler {
    method handle (line 14) | @Override

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/rsql/operator/handler/JsonContainInArrayOperatorHandler.java
  class JsonContainInArrayOperatorHandler (line 10) | public class JsonContainInArrayOperatorHandler implements OperatorHandler {
    method handle (line 14) | @Override

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/rsql/operator/handler/JsonContainOperatorHandler.java
  class JsonContainOperatorHandler (line 10) | public class JsonContainOperatorHandler implements OperatorHandler {
    method handle (line 14) | @Override

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/rsql/operator/handler/JsonbContainOperatorHandler.java
  class JsonbContainOperatorHandler (line 10) | public class JsonbContainOperatorHandler implements OperatorHandler {
    method handle (line 14) | @Override

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/rsql/operator/handler/JsonbEqualToOperatorHandler.java
  class JsonbEqualToOperatorHandler (line 10) | public class JsonbEqualToOperatorHandler implements OperatorHandler {
    method handle (line 14) | @Override

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/rsql/operator/handler/JsonbKeyExistsOperatorHandler.java
  class JsonbKeyExistsOperatorHandler (line 10) | public class JsonbKeyExistsOperatorHandler implements OperatorHandler {
    method handle (line 14) | @Override

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/rsql/operator/handler/LessThanEqualToOperatorHandler.java
  class LessThanEqualToOperatorHandler (line 10) | public class LessThanEqualToOperatorHandler implements OperatorHandler {
    method handle (line 14) | @Override

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/rsql/operator/handler/LessThanOperatorHandler.java
  class LessThanOperatorHandler (line 10) | public class LessThanOperatorHandler implements OperatorHandler {
    method handle (line 14) | @Override

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/rsql/operator/handler/LikeOperatorHandler.java
  class LikeOperatorHandler (line 10) | public class LikeOperatorHandler implements OperatorHandler {
    method handle (line 14) | @Override

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/rsql/operator/handler/NotEqualToOperatorHandler.java
  class NotEqualToOperatorHandler (line 10) | public class NotEqualToOperatorHandler implements OperatorHandler {
    method handle (line 14) | @Override

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/rsql/operator/handler/NotInOperatorHandler.java
  class NotInOperatorHandler (line 14) | @Slf4j
    method handle (line 19) | @Override
    method handle (line 24) | @Override

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/rsql/operator/handler/NotLikeOperatorHandler.java
  class NotLikeOperatorHandler (line 10) | public class NotLikeOperatorHandler implements OperatorHandler {
    method handle (line 14) | @Override

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/rsql/operator/handler/StartWithOperatorHandler.java
  class StartWithOperatorHandler (line 10) | public class StartWithOperatorHandler implements OperatorHandler {
    method handle (line 14) | @Override

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/rsql/parser/RSQLParserBuilder.java
  class RSQLParserBuilder (line 6) | public class RSQLParserBuilder {
    method newRSQLParser (line 8) | public static RSQLParser newRSQLParser() {

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/rsql/resolver/CrossTableColumnResolver.java
  class CrossTableColumnResolver (line 17) | @Slf4j
    method resolveColumn (line 29) | public static DbColumn resolveColumn(String columnSelector, List<DbTab...
    method findTableByPrefix (line 76) | private static DbTable findTableByPrefix(String prefix, List<DbTable> ...

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/rsql/visitor/BaseRSQLVisitor.java
  class BaseRSQLVisitor (line 20) | @RequiredArgsConstructor
    method visit (line 27) | @Override
    method visit (line 33) | @Override
    method visit (line 41) | @Override

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/sql/ColumnLabel.java
  type ColumnLabel (line 3) | public enum ColumnLabel {

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/sql/DB2DataExtraction.java
  class DB2DataExtraction (line 16) | @Slf4j
    method canHandle (line 28) | @Override
    method getTables (line 35) | @Override
    method getAllColumns (line 71) | private List<DbColumn> getAllColumns(DatabaseMetaData databaseMetaData...
    method getDbTable (line 108) | private DbTable getDbTable(DatabaseMetaData databaseMetaData, MetaData...

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/sql/JdbcMetaDataProvider.java
  class JdbcMetaDataProvider (line 13) | @Slf4j
    method processMetaData (line 30) | @Override
    method getMetaDataExtraction (line 66) | private Optional<MetaDataExtraction> getMetaDataExtraction(String prod...

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/sql/JdbcTypeJavaClassMappings.java
  class JdbcTypeJavaClassMappings (line 31) | @Slf4j
    method JdbcTypeJavaClassMappings (line 39) | private JdbcTypeJavaClassMappings() {
    method buildJavaClassToJdbcTypeCodeMappings (line 44) | private static ConcurrentHashMap<Class<?>, Integer> buildJavaClassToJd...
    method buildJdbcTypeCodeToJavaClassMappings (line 95) | private static ConcurrentHashMap<Integer, Class<?>> buildJdbcTypeCodeT...
    method determineJdbcTypeCodeForJavaClass (line 148) | public int determineJdbcTypeCodeForJavaClass(Class<?> cls) {
    method determineJavaClassForJdbcTypeCode (line 170) | public Class<?> determineJavaClassForJdbcTypeCode(Integer typeCode) {
    method determineJavaClassForJdbcTypeCode (line 186) | public Class<?> determineJavaClassForJdbcTypeCode(int typeCode) {

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/sql/MariaDBDataExtraction.java
  class MariaDBDataExtraction (line 16) | @Slf4j
    method canHandle (line 22) | @Override
    method getTables (line 28) | @Override
    method getAllColumns (line 66) | private List<DbColumn> getAllColumns(DatabaseMetaData databaseMetaData...
    method getDbTable (line 103) | private DbTable getDbTable(DatabaseMetaData databaseMetaData, MetaData...

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/sql/MetaDataExtraction.java
  type MetaDataExtraction (line 15) | public interface MetaDataExtraction {
    method canHandle (line 16) | boolean canHandle(String database);
    method getTables (line 19) | List<DbTable> getTables(DatabaseMetaData databaseMetaData, boolean inc...
    method include (line 21) | default boolean include(String schemaOrCatalog, List<String> excludedS...
    method getAllCatalogs (line 25) | default List<String> getAllCatalogs(DatabaseMetaData databaseMetaData,...
    method getAllSchemas (line 43) | default List<String> getAllSchemas(DatabaseMetaData databaseMetaData, ...
    method getMetaTables (line 61) | default List<MetaDataTable>
    method getAllPrimaryKeys (line 87) | default List<String> getAllPrimaryKeys(DatabaseMetaData databaseMetaDa...

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/sql/MsSQLServerMetaDataExtraction.java
  class MsSQLServerMetaDataExtraction (line 17) | @Slf4j
    method canHandle (line 44) | @Override
    method getTables (line 49) | @Override
    method getAllColumns (line 84) | private List<DbColumn> getAllColumns(
    method getDbTable (line 135) | private DbTable getDbTable(DatabaseMetaData databaseMetaData, MetaData...

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/sql/MySQLDataExtraction.java
  class MySQLDataExtraction (line 16) | @Slf4j
    method canHandle (line 22) | @Override
    method getTables (line 28) | @Override
    method getAllColumns (line 66) | private List<DbColumn> getAllColumns(DatabaseMetaData databaseMetaData...
    method getDbTable (line 102) | private DbTable getDbTable(DatabaseMetaData databaseMetaData, MetaData...

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/sql/OracleMetaDataExtraction.java
  class OracleMetaDataExtraction (line 16) | @Slf4j
    method canHandle (line 33) | @Override
    method getTables (line 40) | @Override
    method getDbTable (line 84) | private DbTable getDbTable(DatabaseMetaData databaseMetaData, MetaData...
    method getAllColumns (line 103) | private List<DbColumn> getAllColumns(DatabaseMetaData databaseMetaData...

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/sql/PostgreSQLDataExclusion.java
  class PostgreSQLDataExclusion (line 17) | @Slf4j
    method canHandle (line 23) | @Override
    method getTables (line 29) | @Override
    method getAllColumns (line 65) | private List<DbColumn> getAllColumns(DatabaseMetaData databaseMetaData...
    method getDbTable (line 103) | private DbTable getDbTable(DatabaseMetaData databaseMetaData, MetaData...

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/sql/SQLiteDataExtraction.java
  class SQLiteDataExtraction (line 16) | @Slf4j
    method canHandle (line 21) | @Override
    method getTables (line 26) | @Override
    method getAllColumns (line 69) | private List<DbColumn> getAllColumns(DatabaseMetaData databaseMetaData...
    method getDbTable (line 113) | private DbTable getDbTable(DatabaseMetaData databaseMetaData, MetaData...

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/sql/SqlCreatorTemplate.java
  class SqlCreatorTemplate (line 25) | @Slf4j
    method updateQuery (line 32) | public String updateQuery(UpdateContext updateContext) {
    method deleteQuery (line 51) | public String deleteQuery(DeleteContext deleteContext) {
    method create (line 70) | public String create(CreateContext createContext) {
    method findOne (line 83) | public String findOne(ReadContext readContext) {
    method count (line 94) | public String count(ReadContext readContext) {
    method exists (line 105) | public String exists(ReadContext readContext) {
    method query (line 117) | public String query(ReadContext readContext) {
    method renderSqlTemplate (line 156) | private String renderSqlTemplate(String template, Map<String, Object> ...
    method projections (line 164) | private String projections(List<DbColumn> columns) {
    method orderBy (line 170) | private String orderBy(List<DbSort> sorts) {

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/sql/SqlTypes.java
  class SqlTypes (line 7) | public class SqlTypes {
    method SqlTypes (line 318) | private SqlTypes() {
    method isNumericType (line 327) | public static boolean isNumericType(int typeCode) {
    method isStringType (line 351) | public static boolean isStringType(int typeCode) {
    method isCharacterOrClobType (line 373) | public static boolean isCharacterOrClobType(int typeCode) {
    method isCharacterType (line 395) | public static boolean isCharacterType(int typeCode) {
    method isVarcharType (line 415) | public static boolean isVarcharType(int typeCode) {
    method isVarbinaryType (line 433) | public static boolean isVarbinaryType(int typeCode) {
    method isBinaryType (line 449) | public static boolean isBinaryType(int typeCode) {
    method isNumericOrDecimal (line 466) | public static boolean isNumericOrDecimal(int typeCode) {
    method isFloatOrRealOrDouble (line 481) | public static boolean isFloatOrRealOrDouble(int typeCode) {
    method isIntegral (line 497) | public static boolean isIntegral(int typeCode) {
    method isSmallOrTinyInt (line 509) | public static boolean isSmallOrTinyInt(int typeCode) {
    method isTemporalType (line 524) | public static boolean isTemporalType(int typeCode) {
    method isIntervalType (line 543) | public static boolean isIntervalType(int typeCode) {
    method isDurationType (line 550) | public static boolean isDurationType(int typeCode) {
    method hasDatePart (line 559) | public static boolean hasDatePart(int typeCode) {
    method hasTimePart (line 576) | public static boolean hasTimePart(int typeCode) {
    method isSpatialType (line 595) | public static boolean isSpatialType(int typeCode) {
    method isEnumType (line 606) | public static boolean isEnumType(int typeCode) {

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/tsid/TSIDProcessor.java
  class TSIDProcessor (line 12) | @Slf4j
    method processTsId (line 15) | public Map<String, Object> processTsId(Map<String, Object> data, List<...

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/util/AliasGenerator.java
  class AliasGenerator (line 5) | public class
    method getAlias (line 12) | public static String getAlias(String sqlIdentifier) {
    method generateUUID (line 20) | private static String generateUUID (){

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/validator/ConstraintValidator.java
  type ConstraintValidator (line 5) | public interface ConstraintValidator {
    method validate (line 6) | void validate(Object value, String placeholderName) throws Placeholder...
    method throwConstraintViolation (line 8) | default void throwConstraintViolation(String placeholderName, String m...

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/validator/CustomPlaceholderValidators.java
  class CustomPlaceholderValidators (line 10) | public class CustomPlaceholderValidators {
    method CustomPlaceholderValidators (line 16) | public CustomPlaceholderValidators() {
    method getValidator (line 23) | public ConstraintValidator getValidator(String constraint) {
    method getValidators (line 27) | public Map<String, ConstraintValidator> getValidators() {

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/validator/impl/IsRequiredValidator.java
  class IsRequiredValidator (line 6) | public class IsRequiredValidator implements ConstraintValidator {
    method validate (line 8) | @Override
    method isMissingValue (line 15) | private boolean isMissingValue(Object value){
    method isNullValue (line 19) | private boolean isNullValue(Object value) {
    method isEmptyString (line 23) | private boolean isEmptyString(Object value) {

FILE: db2rest-core/rdbms-support/src/main/java/com/homihq/db2rest/jdbc/validator/impl/IsUUIDValidator.java
  class IsUUIDValidator (line 9) | public class IsUUIDValidator implements ConstraintValidator {
    method validate (line 11) | @Override
    method isValidUUIDFormat (line 18) | private boolean isValidUUIDFormat(String value) {

FILE: db2rest-core/rdbms-support/src/test/java/com/homihq/db2rest/jdbc/core/service/JdbcCreateServiceTest.java
  class JdbcCreateServiceTest (line 29) | @ExtendWith(MockitoExtension.class)
    method setUp (line 59) | @BeforeEach
    method shouldBuildInsertableColumnsFromDataWhenNoColumnsSpecified (line 65) | @Test
    method shouldUseProvidedColumnsWhenSpecified (line 93) | @Test

FILE: db2rest-core/rdbms-support/src/test/java/com/homihq/db2rest/jdbc/dto/FnUtilTest.java
  class FnUtilTest (line 6) | class FnUtilTest {
    method shouldExtractContentFromFnBlock (line 8) | @Test
    method shouldReturnNullWhenNoFnBlock (line 14) | @Test
    method shouldReturnNullForNullInput (line 20) | @Test
    method shouldHandleNestedBrackets (line 26) | @Test
    method shouldSubstituteColumnPlaceholder (line 32) | @Test
    method shouldSubstituteUpperCasePlaceholder (line 39) | @Test
    method shouldSubstituteDollarPlaceholder (line 46) | @Test
    method shouldReturnNullForNullSubstitution (line 53) | @Test
    method shouldReturnTrueForSafeFragment (line 59) | @Test
    method shouldReturnFalseForUnsafeFragmentWithDrop (line 66) | @Test
    method shouldReturnFalseForUnsafeFragmentWithComment (line 71) | @Test
    method shouldReturnFalseForUnsafeFragmentWithAlter (line 76) | @Test

FILE: db2rest-core/rdbms-support/src/test/java/com/homihq/db2rest/jdbc/util/AliasGeneratorTest.java
  class AliasGeneratorTest (line 6) | class AliasGeneratorTest {
    method shouldTruncateIdentifierLongerThanPrefixLength (line 8) | @Test
    method shouldKeepIdentifierShorterThanPrefixLength (line 17) | @Test
    method shouldKeepIdentifierEqualToPrefixLength (line 25) | @Test
    method shouldGenerateUniqueAliasesForSameIdentifier (line 33) | @Test
    method shouldAlwaysContainUnderseparator (line 42) | @Test

FILE: db2rest-core/rdbms-support/src/test/java/com/homihq/db2rest/jdbc/validator/CustomPlaceholderValidatorsTest.java
  class CustomPlaceholderValidatorsTest (line 8) | class CustomPlaceholderValidatorsTest {
    method setUp (line 12) | @BeforeEach
    method shouldReturnIsRequiredValidator (line 17) | @Test
    method shouldReturnIsUUIDValidator (line 24) | @Test
    method shouldReturnNullForUnknownConstraint (line 31) | @Test
    method shouldReturnUnmodifiableValidatorsMap (line 38) | @Test
    method isRequiredConstantShouldBeCorrect (line 45) | @Test
    method isUUIDConstantShouldBeCorrect (line 51) | @Test

FILE: db2rest-core/rdbms-support/src/test/java/com/homihq/db2rest/jdbc/validator/impl/IsRequiredValidatorTest.java
  class IsRequiredValidatorTest (line 10) | class IsRequiredValidatorTest {
    method setUp (line 14) | @BeforeEach
    method shouldThrowExceptionWhenValueIsNull (line 19) | @Test
    method shouldThrowExceptionWhenValueIsEmptyString (line 25) | @Test
    method shouldThrowExceptionWhenValueIsBlankString (line 31) | @Test
    method shouldNotThrowExceptionWhenValueIsValidString (line 37) | @Test
    method shouldNotThrowExceptionWhenValueIsNumber (line 43) | @Test
    method shouldNotThrowExceptionWhenValueIsObject (line 49) | @Test

FILE: db2rest-core/rdbms-support/src/test/java/com/homihq/db2rest/jdbc/validator/impl/IsUUIDValidatorTest.java
  class IsUUIDValidatorTest (line 9) | class IsUUIDValidatorTest {
    method setUp (line 13) | @BeforeEach
    method shouldNotThrowForValidUUID (line 18) | @Test
    method shouldThrowForInvalidUUID (line 25) | @Test
    method shouldThrowForNull (line 31) | @Test
    method shouldThrowForNonStringValue (line 37) | @Test
    method shouldThrowForEmptyString (line 43) | @Test

FILE: db2rest-dialects/db2-dialect/src/main/java/com/db2rest/jdbc/dialect/DB2RestDB2Dialect.java
  class DB2RestDB2Dialect (line 15) | @Slf4j
    method DB2RestDB2Dialect (line 18) | public DB2RestDB2Dialect(ObjectMapper objectMapper) {
    method isSupportedDb (line 22) | @Override
    method processTypes (line 29) | @Override
    method renderTableName (line 60) | @Override
    method renderTableNameWithoutAlias (line 69) | @Override
    method getQuotedName (line 74) | private String getQuotedName(String name) {
    method convertToLocalDateTime (line 78) | private LocalDateTime convertToLocalDateTime(String value) {
    method convertTimestamp (line 86) | @Override
    method supportBatchReturnKeys (line 91) | @Override
    method getReadSqlTemplate (line 97) | @Override
    method getDeleteSqlTemplate (line 102) | @Override
    method getUpdateSqlTemplate (line 107) | @Override
    method getInsertSqlTemplate (line 112) | @Override
    method getCountSqlTemplate (line 117) | @Override
    method getExistSqlTemplate (line 122) | @Override
    method getFindOneSqlTemplate (line 127) | @Override

FILE: db2rest-dialects/db2-dialect/src/test/java/com/db2rest/jdbc/dialect/DB2RestDB2DialectTest.java
  class DB2RestDB2DialectTest (line 20) | class DB2RestDB2DialectTest {
    method setUp (line 25) | @BeforeEach
    method testIsSupportedDb (line 31) | @Test
    method testRenderTableName (line 41) | @Test
    method testRenderTableNameForDelete (line 53) | @Test
    method testRenderTableNameWithoutAlias (line 64) | @Test
    method testProcessTypesWithTimestamp (line 75) | @Test
    method testProcessTypesWithJson (line 90) | @Test
    method testConvertTimestamp (line 108) | @Test
    method testSupportBatchReturnKeys (line 121) | @Test
    method testSqlTemplates (line 127) | @Test

FILE: db2rest-dialects/db2-dialect/src/test/java/com/db2rest/jdbc/dialect/TestConfiguration.java
  class TestConfiguration (line 8) | @SpringBootApplication
    method main (line 11) | public static void main(String[] args) {
    method objectMapper (line 15) | @Bean
    method db2RestDB2Dialect (line 20) | @Bean

FILE: db2rest-dialects/mariadb-dialect/src/main/java/com/db2rest/jdbc/dialect/MariaDBDialect.java
  class MariaDBDialect (line 17) | @Slf4j
    method MariaDBDialect (line 19) | public MariaDBDialect(ObjectMapper objectMapper) {
    method isSupportedDb (line 23) | @Override
    method processTypes (line 28) | @Override
    method getQuotedName (line 52) | private String getQuotedName(String name) {
    method renderTableName (line 56) | @Override
    method renderTableNameWithoutAlias (line 67) | @Override
    method getAliasedName (line 72) | @Override
    method convertToLocalDateTime (line 81) | private LocalDateTime convertToLocalDateTime(String value) {
    method convertTimestamp (line 89) | @Override

FILE: db2rest-dialects/mssql-dialect/src/main/java/com/db2rest/jdbc/dialect/MsSQLServerDialect.java
  class MsSQLServerDialect (line 15) | @Slf4j
    method MsSQLServerDialect (line 17) | public MsSQLServerDialect(ObjectMapper objectMapper) {
    method supportBatchReturnKeys (line 22) | @Override
    method isSupportedDb (line 27) | @Override
    method processTypes (line 32) | @Override
    method renderTableName (line 53) | @Override
    method renderTableNameWithoutAlias (line 60) | @Override
    method getQuotedName (line 65) | private String getQuotedName(String name) {
    method getDeleteSqlTemplate (line 69) | @Override
    method getExistSqlTemplate (line 74) | @Override
    method getReadSqlTemplate (line 79) | @Override
    method getUpdateSqlTemplate (line 84) | @Override
    method convertToLocalDateTime (line 89) | private LocalDateTime convertToLocalDateTime(String value) {

FILE: db2rest-dialects/mysql-dialect/src/main/java/com/db2rest/jdbc/dialect/DB2RestMySQLDialect.java
  class DB2RestMySQLDialect (line 17) | @Slf4j
    method DB2RestMySQLDialect (line 21) | public DB2RestMySQLDialect(ObjectMapper objectMapper) {
    method isSupportedDb (line 26) | @Override
    method processTypes (line 31) | @Override
    method getQuotedName (line 56) | private String getQuotedName(String name) {
    method renderTableName (line 60) | @Override
    method renderTableNameWithoutAlias (line 65) | @Override
    method convertToLocalDateTime (line 70) | private LocalDateTime convertToLocalDateTime(String value) {
    method convertTimestamp (line 78) | @Override

FILE: db2rest-dialects/oracle-dialect/src/main/java/com/db2rest/jdbc/dialect/OracleDialect.java
  class OracleDialect (line 15) | @Slf4j
    method OracleDialect (line 17) | public OracleDialect(ObjectMapper objectMapper) {
    method isSupportedDb (line 21) | @Override
    method getReadSqlTemplate (line 26) | @Override
    method supportBatchReturnKeys (line 31) | @Override
    method processTypes (line 36) | @Override
    method convertToLocalDateTime (line 60) | private LocalDateTime convertToLocalDateTime(String value) {
    method getQuotedName (line 68) | private String getQuotedName(String name) {
    method renderTableName (line 72) | @Override
    method renderTableNameWithoutAlias (line 77) | @Override

FILE: db2rest-dialects/oracle9i-dialect/src/main/java/com/db2rest/jdbc/dialect/OracleDialect.java
  class OracleDialect (line 13) | @Slf4j
    method OracleDialect (line 15) | public OracleDialect(ObjectMapper objectMapper) {
    method isSupportedDb (line 19) | @Override
    method getReadSqlTemplate (line 25) | @Override
    method supportBatchReturnKeys (line 30) | @Override
    method processTypes (line 35) | @Override
    method getQuotedName (line 57) | private String getQuotedName(String name) {
    method renderTableName (line 61) | @Override
    method renderTableNameWithoutAlias (line 66) | @Override

FILE: db2rest-dialects/pg-dialect/src/main/java/com/db2rest/jdbc/dialect/PostGreSQLDialect.java
  class PostGreSQLDialect (line 25) | @Slf4j
    method PostGreSQLDialect (line 27) | public PostGreSQLDialect(ObjectMapper objectMapper) {
    method processTypes (line 32) | @Override
    method convertToOffsetTime (line 76) | private OffsetTime convertToOffsetTime(String value) {
    method convertToLocalDateTime (line 84) | private LocalDateTime convertToLocalDateTime(String value) {
    method convertToOffsetDateTime (line 92) | private OffsetDateTime convertToOffsetDateTime(String value) {
    method convertToJson (line 100) | private Object convertToJson(Object value, String columnDataTypeName) {
    method convertJsonToVO (line 112) | @Override
    method getQuotedName (line 132) | private String getQuotedName(String name) {
    method renderTableName (line 136) | @Override
    method renderTableNameWithoutAlias (line 141) | @Override
    method isSupportedDb (line 146) | @Override
    method convertToStringArray (line 151) | @Override
    method convertTimestamp (line 168) | @Override

FILE: db2rest-dialects/pg-dialect/src/main/java/com/db2rest/jdbc/dialect/driver/EnvVarSSLSocketFactory.java
  class EnvVarSSLSocketFactory (line 25) | @Slf4j
    method EnvVarSSLSocketFactory (line 30) | public EnvVarSSLSocketFactory() throws Exception {
    method validateCertificate (line 75) | private void validateCertificate(X509Certificate cert) throws Certific...
    method createTrustManagersWithHostnameVerification (line 107) | private TrustManager[] createTrustManagersWithHostnameVerification(Tru...
    method createSocket (line 147) | @Override
    method createSocket (line 161) | @Override
    method createSocket (line 170) | @Override
    method createSocket (line 180) | @Override
    method createSocket (line 189) | @Override
    method getDefaultCipherSuites (line 200) | @Override
    method getSupportedCipherSuites (line 205) | @Override

FILE: db2rest-dialects/pg-dialect/src/main/java/com/db2rest/jdbc/dialect/driver/PgSingleCertValidatingFactory.java
  class PgSingleCertValidatingFactory (line 48) | public class PgSingleCertValidatingFactory extends WrappedFactory {
    method PgSingleCertValidatingFactory (line 62) | public PgSingleCertValidatingFactory(Properties info) throws Exception {
    method getCallbackHandler (line 135) | private CallbackHandler getCallbackHandler(
    method initPk8 (line 157) | private void initPk8(
    method initP12 (line 173) | private void initP12(
    method getKeyStoreInstance (line 179) | private KeyStore getKeyStoreInstance() throws Exception {
    method getCertFis (line 188) | private FileInputStream getCertFis(String sslrootcertfile) throws Exce...
    method initTrustManagerFactory (line 198) | private TrustManagerFactory initTrustManagerFactory(InputStream fis, S...
    method initContext (line 225) | private SSLContext initContext(TrustManager[] tm) throws Exception {
    method base64Encode (line 238) | public String base64Encode(String p10) throws Exception {
    method throwKeyManagerException (line 247) | public void throwKeyManagerException() throws PSQLException {
    class ConsoleCallbackHandler (line 262) | public static class ConsoleCallbackHandler implements CallbackHandler {
      method ConsoleCallbackHandler (line 266) | ConsoleCallbackHandler(@Nullable String password) {
      method handle (line 279) | @Override

FILE: db2rest-dialects/sqlite-dialect/src/main/java/com/db2rest/jdbc/dialect/SQLiteDialect.java
  class SQLiteDialect (line 15) | @Slf4j
    method SQLiteDialect (line 18) | public SQLiteDialect(ObjectMapper objectMapper) {
    method isSupportedDb (line 22) | @Override
    method supportAlias (line 27) | @Override
    method processTypes (line 32) | @Override
    method getQuotedName (line 52) | private String getQuotedName(String name) {
    method renderTableName (line 56) | @Override
    method renderTableNameWithoutAlias (line 64) | @Override
    method convertToLocalDateTime (line 69) | private LocalDateTime convertToLocalDateTime(String value) {
    method convertTimestamp (line 77) | @Override
    method supportBatchReturnKeys (line 82) | @Override

FILE: docker-compose/db2/init/01-create-schema.sql
  type EMP (line 5) | CREATE TABLE EMP.EMPLOYEE (
  type EMP (line 20) | CREATE TABLE EMP.DEPARTMENT (
  type IDX_EMP_DEPT (line 49) | CREATE INDEX IDX_EMP_DEPT ON EMP.EMPLOYEE(DEPARTMENT_ID)
  type IDX_EMP_EMAIL (line 50) | CREATE INDEX IDX_EMP_EMAIL ON EMP.EMPLOYEE(EMAIL)

FILE: docker-compose/mariadb/init/01-init.sql
  type employee (line 2) | CREATE TABLE employee (

FILE: docker-compose/mysql/init/01-init.sql
  type employee (line 2) | CREATE TABLE employee (

FILE: docker-compose/oracle/init/01-init.sql
  type employee (line 2) | CREATE TABLE employee (

FILE: docker-compose/postgresql/init/01-init.sql
  type employee (line 2) | CREATE TABLE employee (

FILE: docker-compose/sqlserver/init/01-init.sql
  type employee (line 2) | CREATE TABLE employee (
Condensed preview — 556 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (9,711K chars).
[
  {
    "path": ".gitattributes",
    "chars": 427,
    "preview": "src/test/resources/mysql/mysql-sakila.sql linguist-generated=true\nsrc/test/resources/mysql/mysql-sakila-insert-data.sql "
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 854,
    "preview": "# These are supported funding model platforms\n\ngithub: [9tigerio]\npatreon: # Replace with a single Patreon username\nopen"
  },
  {
    "path": ".github/RELEASING.md",
    "chars": 1359,
    "preview": "# General\nWe use [semantic versioning](https://semver.org).\n\nWe publish our snapshots on [GitHub Packages](https://githu"
  },
  {
    "path": ".github/workflows/build-verify.yml",
    "chars": 890,
    "preview": "name: Build & Verify\n\non:\n  pull_request:\n    branches:\n      - master\n  push:\n    branches:\n      - 'feature/**'\n  work"
  },
  {
    "path": ".github/workflows/dockerhub-publish.yml",
    "chars": 1365,
    "preview": "# This workflow will download the Maven Central package and\n# build Docker image and publish to DockerHub  \n\nname: Publi"
  },
  {
    "path": ".github/workflows/maven-central-publish.yml",
    "chars": 3548,
    "preview": "# This workflow will build a package using Maven and then publish it to Central Portal (Sonatype)\n# For more information"
  },
  {
    "path": ".github/workflows/oracle9i-central-publish.yml",
    "chars": 1569,
    "preview": "# This workflow will build a package using Maven and then publish it to GitHub packages when a release is created\n# For "
  },
  {
    "path": ".github/workflows/snapshot.yml",
    "chars": 1198,
    "preview": "name: Publish Snapshot to GitHub\n\non:\n  workflow_dispatch:\n    inputs:\n      version:\n        description: 'Version to p"
  },
  {
    "path": ".gitignore",
    "chars": 664,
    "preview": "HELP.md\ntarget/\n.mvn/wrapper/maven-wrapper.jar\n!**/src/main/**/target/\n!**/src/test/**/target/\n.flattened-pom.xml\npom.xm"
  },
  {
    "path": ".mvn/wrapper/maven-wrapper.properties",
    "chars": 951,
    "preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements.  See the NOTICE f"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 5781,
    "preview": "Thanks for showing interest to contribute to DB2Rest 💖, you rock!\n\nWhen it comes to open source, there are different way"
  },
  {
    "path": "Dockerfile",
    "chars": 428,
    "preview": "FROM bellsoft/liberica-runtime-container:jre-21-cds-slim-musl\n\nARG JAR_FILE=db2rest.jar\n\nCOPY ${JAR_FILE} /opt/app/db2re"
  },
  {
    "path": "LICENSE",
    "chars": 11357,
    "preview": "                                 Apache License\n                           Version 2.0, January 2004\n                   "
  },
  {
    "path": "README.md",
    "chars": 5581,
    "preview": "DB2Rest is a modern low code REST DATA API platform that automatically creates a secure REST API endpoint\nfor your datab"
  },
  {
    "path": "db2rest-api/api-rest/pom-oracle9i.xml",
    "chars": 7854,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "db2rest-api/api-rest/pom.xml",
    "chars": 9315,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "db2rest-api/api-rest/sample-config/application-db.yml",
    "chars": 591,
    "preview": "app:\n  databases:\n    - id: ${DB_NAME:pgdb}\n      type: POSTGRESQL\n      url: jdbc:postgresql://localhost:5432/homidb\n  "
  },
  {
    "path": "db2rest-api/api-rest/sample-config/application-local.yml",
    "chars": 290,
    "preview": "app:\n  databases:\n    - id: DB1\n      type: POSTGRESQL\n      url: jdbc:postgresql://localhost:5432/homidb\n      username"
  },
  {
    "path": "db2rest-api/api-rest/sample-config/application-mongo.yml",
    "chars": 433,
    "preview": "app:\n  databases:\n    - id: DB1\n      type: POSTGRESQL\n      url: jdbc:postgresql://localhost:5432/homidb\n      username"
  },
  {
    "path": "db2rest-api/api-rest/sample-config/application-pg15.yml",
    "chars": 161,
    "preview": "app:\n  databases:\n    - id: ${DB_NAME:pgdb}\n      type: POSTGRESQL\n      url: jdbc:postgresql://localhost:5432/postgres\n"
  },
  {
    "path": "db2rest-api/api-rest/sample-config/application-pg16.yml",
    "chars": 161,
    "preview": "app:\n  databases:\n    - id: ${DB_NAME:pgdb}\n      type: POSTGRESQL\n      url: jdbc:postgresql://localhost:5432/postgres\n"
  },
  {
    "path": "db2rest-api/api-rest/src/main/java/com/homihq/db2rest/Db2restApplication.java",
    "chars": 758,
    "preview": "package com.homihq.db2rest;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconf"
  },
  {
    "path": "db2rest-api/api-rest/src/main/java/com/homihq/db2rest/config/CorsFilterConfiguration.java",
    "chars": 2435,
    "preview": "package com.homihq.db2rest.config;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.boot.autoconfigure.cond"
  },
  {
    "path": "db2rest-api/api-rest/src/main/java/com/homihq/db2rest/config/DbServiceConfiguration.java",
    "chars": 9577,
    "preview": "package com.homihq.db2rest.config;\n\nimport com.db2rest.jdbc.dialect.*;\nimport com.fasterxml.jackson.databind.ObjectMappe"
  },
  {
    "path": "db2rest-api/api-rest/src/main/java/com/homihq/db2rest/config/RestApiConfiguration.java",
    "chars": 4392,
    "preview": "package com.homihq.db2rest.config;\n\nimport com.homihq.db2rest.bulk.DataProcessor;\nimport com.homihq.db2rest.jdbc.JdbcMan"
  },
  {
    "path": "db2rest-api/api-rest/src/main/java/com/homihq/db2rest/config/WebMvcConfiguration.java",
    "chars": 756,
    "preview": "package com.homihq.db2rest.config;\n\nimport com.homihq.db2rest.interceptor.DatabaseContextRequestInterceptor;\nimport lomb"
  },
  {
    "path": "db2rest-api/api-rest/src/main/java/com/homihq/db2rest/config/jinjava/DisabledExpressionTokenScannerSymbols.java",
    "chars": 340,
    "preview": "package com.homihq.db2rest.config.jinjava;\n\nimport com.hubspot.jinjava.tree.parse.DefaultTokenScannerSymbols;\n\npublic cl"
  },
  {
    "path": "db2rest-api/api-rest/src/main/java/com/homihq/db2rest/interceptor/DatabaseContextRequestInterceptor.java",
    "chars": 2554,
    "preview": "package com.homihq.db2rest.interceptor;\n\nimport com.homihq.db2rest.core.exception.GenericDataAccessException;\nimport com"
  },
  {
    "path": "db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/RdbmsRestApi.java",
    "chars": 103,
    "preview": "package com.homihq.db2rest.rest;\n\npublic interface RdbmsRestApi {\n\n    String VERSION = \"/v1/rdbms\";\n}\n"
  },
  {
    "path": "db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/admin/AdminController.java",
    "chars": 655,
    "preview": "package com.homihq.db2rest.rest.admin;\n\nimport com.homihq.db2rest.jdbc.JdbcManager;\nimport lombok.RequiredArgsConstructo"
  },
  {
    "path": "db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/create/BulkCreateController.java",
    "chars": 2573,
    "preview": "package com.homihq.db2rest.rest.create;\n\nimport com.homihq.db2rest.auth.data.RoleDataFilter;\nimport com.homihq.db2rest.b"
  },
  {
    "path": "db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/create/BulkCreateRestApi.java",
    "chars": 2659,
    "preview": "package com.homihq.db2rest.rest.create;\n\nimport com.homihq.db2rest.auth.data.RoleDataFilter;\nimport com.homihq.db2rest.c"
  },
  {
    "path": "db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/create/CreateController.java",
    "chars": 1117,
    "preview": "package com.homihq.db2rest.rest.create;\n\nimport java.util.List;\nimport java.util.Map;\n\nimport org.springframework.web.bi"
  },
  {
    "path": "db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/create/CreateRestApi.java",
    "chars": 1588,
    "preview": "package com.homihq.db2rest.rest.create;\n\nimport static com.homihq.db2rest.config.MultiTenancy.ROLEBASEDDATAFILTERS;\nimpo"
  },
  {
    "path": "db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/delete/DeleteController.java",
    "chars": 1258,
    "preview": "package com.homihq.db2rest.rest.delete;\n\nimport java.util.List;\n\nimport com.homihq.db2rest.auth.data.RoleDataFilter;\nimp"
  },
  {
    "path": "db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/delete/DeleteRestApi.java",
    "chars": 1244,
    "preview": "package com.homihq.db2rest.rest.delete;\n\nimport com.homihq.db2rest.auth.data.RoleDataFilter;\nimport com.homihq.db2rest.c"
  },
  {
    "path": "db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/meta/db/DbInfoController.java",
    "chars": 780,
    "preview": "package com.homihq.db2rest.rest.meta.db;\n\n\nimport com.homihq.db2rest.jdbc.JdbcManager;\nimport lombok.RequiredArgsConstru"
  },
  {
    "path": "db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/meta/db/DbInfoObject.java",
    "chars": 206,
    "preview": "package com.homihq.db2rest.rest.meta.db;\n\npublic record DbInfoObject(\n        String dbId,\n        String productName,\n "
  },
  {
    "path": "db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/meta/db/DbInfoRestApi.java",
    "chars": 748,
    "preview": "package com.homihq.db2rest.rest.meta.db;\n\nimport io.swagger.v3.oas.annotations.Operation;\nimport io.swagger.v3.oas.annot"
  },
  {
    "path": "db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/meta/schema/ColumnObject.java",
    "chars": 355,
    "preview": "package com.homihq.db2rest.rest.meta.schema;\n\nimport com.db2rest.jdbc.dialect.model.DbColumn;\n\npublic record ColumnObjec"
  },
  {
    "path": "db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/meta/schema/SchemaController.java",
    "chars": 3211,
    "preview": "package com.homihq.db2rest.rest.meta.schema;\n\nimport com.homihq.db2rest.core.exception.GenericDataAccessException;\nimpor"
  },
  {
    "path": "db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/meta/schema/SchemaRestApi.java",
    "chars": 1788,
    "preview": "package com.homihq.db2rest.rest.meta.schema;\n\nimport io.swagger.v3.oas.annotations.Operation;\nimport io.swagger.v3.oas.a"
  },
  {
    "path": "db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/meta/schema/TableObject.java",
    "chars": 462,
    "preview": "package com.homihq.db2rest.rest.meta.schema;\n\nimport com.db2rest.jdbc.dialect.model.DbTable;\nimport lombok.EqualsAndHash"
  },
  {
    "path": "db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/meta/schema/TableWithColumnsObject.java",
    "chars": 493,
    "preview": "package com.homihq.db2rest.rest.meta.schema;\n\nimport com.db2rest.jdbc.dialect.model.DbTable;\nimport lombok.EqualsAndHash"
  },
  {
    "path": "db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/read/CountQueryController.java",
    "chars": 1960,
    "preview": "package com.homihq.db2rest.rest.read;\n\nimport com.homihq.db2rest.auth.data.RoleDataFilter;\nimport com.homihq.db2rest.con"
  },
  {
    "path": "db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/read/ExistsQueryController.java",
    "chars": 3154,
    "preview": "package com.homihq.db2rest.rest.read;\n\nimport com.homihq.db2rest.auth.data.RoleDataFilter;\nimport com.homihq.db2rest.con"
  },
  {
    "path": "db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/read/FindOneController.java",
    "chars": 2169,
    "preview": "package com.homihq.db2rest.rest.read;\n\nimport com.homihq.db2rest.auth.data.RoleDataFilter;\nimport com.homihq.db2rest.con"
  },
  {
    "path": "db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/read/ReadController.java",
    "chars": 4134,
    "preview": "package com.homihq.db2rest.rest.read;\n\nimport com.homihq.db2rest.auth.data.RoleDataFilter;\nimport com.homihq.db2rest.con"
  },
  {
    "path": "db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/rpc/FunctionController.java",
    "chars": 1206,
    "preview": "package com.homihq.db2rest.rest.rpc;\n\nimport com.homihq.db2rest.jdbc.core.service.FunctionService;\nimport lombok.Require"
  },
  {
    "path": "db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/rpc/ProcedureController.java",
    "chars": 1148,
    "preview": "package com.homihq.db2rest.rest.rpc;\n\nimport com.homihq.db2rest.jdbc.core.service.ProcedureService;\nimport lombok.Requir"
  },
  {
    "path": "db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/sql/SQLTemplateController.java",
    "chars": 4223,
    "preview": "package com.homihq.db2rest.rest.sql;\n\nimport com.homihq.db2rest.core.exception.PathVariableNamesMissingException;\nimport"
  },
  {
    "path": "db2rest-api/api-rest/src/main/java/com/homihq/db2rest/rest/update/UpdateController.java",
    "chars": 1890,
    "preview": "package com.homihq.db2rest.rest.update;\n\nimport com.homihq.db2rest.auth.data.RoleDataFilter;\nimport com.homihq.db2rest.c"
  },
  {
    "path": "db2rest-api/api-rest/src/main/resources/application.yml",
    "chars": 1968,
    "preview": "app:\n  version: @project.version@\n  name: @project.name@\n\n  databases:\n    - id: ${DB_ID:db}\n      url: ${DB_URL:}\n     "
  },
  {
    "path": "db2rest-api/api-rest/src/main/resources/banner.txt",
    "chars": 929,
    "preview": "\n${AnsiColor.RED}    ____  ____  ____ ____  ____  _____ ____ _____  ____\n${AnsiColor.BLUE}   / / / |  _ \\| __ )___ \\|  _"
  },
  {
    "path": "db2rest-api/api-rest/src/main/resources/sql-templates/count.jte",
    "chars": 144,
    "preview": "@param String rootTable\n@param String rootWhere\n\nSELECT\n    COUNT(*)\nFROM\n    ${rootTable}\n@if(rootWhere != null)\n    WH"
  },
  {
    "path": "db2rest-api/api-rest/src/main/resources/sql-templates/delete-mssql.jte",
    "chars": 180,
    "preview": "@param String rootTable\n@param String rootWhere\n@param String rootTableAlias\n\nDELETE FROM ${rootTableAlias}\nFROM ${rootT"
  },
  {
    "path": "db2rest-api/api-rest/src/main/resources/sql-templates/delete.jte",
    "chars": 131,
    "preview": "@param String rootTable\n@param String rootWhere\n\nDELETE FROM\n    ${rootTable}\n@if(rootWhere != null)\n    WHERE ${rootWhe"
  },
  {
    "path": "db2rest-api/api-rest/src/main/resources/sql-templates/exists-mssql.jte",
    "chars": 324,
    "preview": "@import com.db2rest.jdbc.dialect.model.DbJoin\n@import java.util.List\n\n@param String rootTable\n@param String rootWhere\n@p"
  },
  {
    "path": "db2rest-api/api-rest/src/main/resources/sql-templates/exists.jte",
    "chars": 330,
    "preview": "@import com.db2rest.jdbc.dialect.model.DbJoin\n@import java.util.List\n\n@param String rootTable\n@param String rootWhere\n@p"
  },
  {
    "path": "db2rest-api/api-rest/src/main/resources/sql-templates/find-one.jte",
    "chars": 168,
    "preview": "@param String rootTable\n@param String rootWhere\n@param String columns\n\nSELECT\n    ${columns}\nFROM\n    ${rootTable}\n@if(r"
  },
  {
    "path": "db2rest-api/api-rest/src/main/resources/sql-templates/insert.jte",
    "chars": 133,
    "preview": "@param String columns\n@param String table\n@param String parameters\n\nINSERT INTO ${table}\n    (${columns})\nVALUES\n    (${"
  },
  {
    "path": "db2rest-api/api-rest/src/main/resources/sql-templates/read-mssql.jte",
    "chars": 1705,
    "preview": "@import com.db2rest.jdbc.dialect.model.DbJoin\n@import java.util.List\n\n@param List<DbJoin> joins\n@param String rootTable\n"
  },
  {
    "path": "db2rest-api/api-rest/src/main/resources/sql-templates/read-ora-12.jte",
    "chars": 643,
    "preview": "@import com.db2rest.jdbc.dialect.model.DbJoin\n@import java.util.List\n\n@param List<DbJoin> joins\n@param String rootTable\n"
  },
  {
    "path": "db2rest-api/api-rest/src/main/resources/sql-templates/read-ora-9.jte",
    "chars": 1758,
    "preview": "@import com.db2rest.jdbc.dialect.model.DbJoin\n@import java.util.List\n\n@param List<DbJoin> joins\n@param String rootTable\n"
  },
  {
    "path": "db2rest-api/api-rest/src/main/resources/sql-templates/read.jte",
    "chars": 570,
    "preview": "@import com.db2rest.jdbc.dialect.model.DbJoin\n@import java.util.List\n\n@param List<DbJoin> joins\n@param String rootTable\n"
  },
  {
    "path": "db2rest-api/api-rest/src/main/resources/sql-templates/update-mssql.jte",
    "chars": 217,
    "preview": "@param String rootTable\n@param String rootWhere\n@param String columnSets\n@param String rootTableAlias\n\nUPDATE ${rootTabl"
  },
  {
    "path": "db2rest-api/api-rest/src/main/resources/sql-templates/update.jte",
    "chars": 165,
    "preview": "@param String rootTable\n@param String rootWhere\n@param String columnSets\n\nUPDATE ${rootTable}\nSET ${columnSets}\n@if(root"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/BaseIntegrationTest.java",
    "chars": 3448,
    "preview": "package com.homihq.db2rest;\n\nimport static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.documentationCo"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/DB2BaseIntegrationTest.java",
    "chars": 647,
    "preview": "package com.homihq.db2rest;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.c"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/DB2ContainerConfiguration.java",
    "chars": 1895,
    "preview": "package com.homihq.db2rest;\n\nimport java.util.List;\nimport java.util.Map;\n\nimport javax.sql.DataSource;\n\nimport org.spri"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/MariaDBBaseIntegrationTest.java",
    "chars": 660,
    "preview": "package com.homihq.db2rest;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.c"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/MariaDBContainerConfiguration.java",
    "chars": 2038,
    "preview": "package com.homihq.db2rest;\n\n\nimport com.homihq.db2rest.jdbc.multidb.RoutingDataSource;\nimport org.springframework.boot."
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/MsSQLServerContainerConfiguration.java",
    "chars": 1866,
    "preview": "package com.homihq.db2rest;\n\nimport com.homihq.db2rest.jdbc.multidb.RoutingDataSource;\nimport org.springframework.boot.j"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/MySQLBaseIntegrationTest.java",
    "chars": 654,
    "preview": "package com.homihq.db2rest;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.c"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/MySQLContainerConfiguration.java",
    "chars": 2031,
    "preview": "package com.homihq.db2rest;\n\nimport com.homihq.db2rest.jdbc.multidb.RoutingDataSource;\nimport org.springframework.boot.j"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/OracleBaseIntegrationTest.java",
    "chars": 658,
    "preview": "package com.homihq.db2rest;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.c"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/OracleContainerConfiguration.java",
    "chars": 2023,
    "preview": "package com.homihq.db2rest;\n\nimport com.homihq.db2rest.jdbc.multidb.RoutingDataSource;\nimport org.springframework.boot.j"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/PostgreSQLBaseIntegrationTest.java",
    "chars": 661,
    "preview": "package com.homihq.db2rest;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.c"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/PostgreSQLContainerConfiguration.java",
    "chars": 2104,
    "preview": "package com.homihq.db2rest;\n\n\nimport com.homihq.db2rest.jdbc.multidb.RoutingDataSource;\nimport org.springframework.boot."
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/SQLiteBaseIntegrationTest.java",
    "chars": 656,
    "preview": "package com.homihq.db2rest;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.c"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/SQLiteContainerConfiguration.java",
    "chars": 2445,
    "preview": "package com.homihq.db2rest;\n\nimport com.homihq.db2rest.jdbc.multidb.RoutingDataSource;\nimport org.springframework.boot.j"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/jdbc/rest/meta/db/DbInfoControllerIntegrationTest.java",
    "chars": 2864,
    "preview": "package com.homihq.db2rest.jdbc.rest.meta.db;\n\nimport com.homihq.db2rest.BaseIntegrationTest;\nimport com.homihq.db2rest."
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/jdbc/rest/meta/db/DbInfoControllerTest.java",
    "chars": 1992,
    "preview": "package com.homihq.db2rest.jdbc.rest.meta.db;\n\nimport com.homihq.db2rest.jdbc.JdbcManager;\nimport com.db2rest.jdbc.diale"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/jdbc/rest/meta/schema/SchemaControllerIntegrationTest.java",
    "chars": 7236,
    "preview": "package com.homihq.db2rest.jdbc.rest.meta.schema;\n\nimport com.homihq.db2rest.BaseIntegrationTest;\nimport com.homihq.db2r"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/jdbc/rest/meta/schema/SchemaControllerTest.java",
    "chars": 4724,
    "preview": "package com.homihq.db2rest.jdbc.rest.meta.schema;\n\nimport com.homihq.db2rest.core.exception.GenericDataAccessException;\n"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/DateTimeUtil.java",
    "chars": 1889,
    "preview": "package com.homihq.db2rest.rest;\n\nimport com.jayway.jsonpath.JsonPath;\nimport org.springframework.test.web.servlet.MvcRe"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/cors/CorsTest.java",
    "chars": 5065,
    "preview": "package com.homihq.db2rest.rest.cors;\n\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.Test;\nimpor"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/db2/Db2BulkCreateControllerTest.java",
    "chars": 7566,
    "preview": "package com.homihq.db2rest.rest.db2;\n\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jackson."
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/db2/Db2CountControllerTest.java",
    "chars": 1129,
    "preview": "package com.homihq.db2rest.rest.db2;\n\nimport com.homihq.db2rest.DB2BaseIntegrationTest;\nimport org.junit.jupiter.api.Cla"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/db2/Db2CreateControllerTest.java",
    "chars": 10937,
    "preview": "package com.homihq.db2rest.rest.db2;\n\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jackson."
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/db2/Db2DeleteAllTest.java",
    "chars": 1595,
    "preview": "package com.homihq.db2rest.rest.db2;\n\n\nimport com.homihq.db2rest.DB2BaseIntegrationTest;\nimport org.hamcrest.Matchers;\ni"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/db2/Db2DeleteControllerTest.java",
    "chars": 3338,
    "preview": "package com.homihq.db2rest.rest.db2;\n\n\nimport com.homihq.db2rest.DB2BaseIntegrationTest;\nimport org.junit.jupiter.api.Cl"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/db2/Db2JsonFileCreateControllerTest.java",
    "chars": 5291,
    "preview": "package com.homihq.db2rest.rest.db2;\n\n\nimport com.homihq.db2rest.DB2BaseIntegrationTest;\nimport io.hosuaby.inject.resour"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/db2/Db2ProcedureControllerTest.java",
    "chars": 2866,
    "preview": "package com.homihq.db2rest.rest.db2;\n\nimport com.homihq.db2rest.DB2BaseIntegrationTest;\nimport org.junit.jupiter.api.Cla"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/db2/Db2RSqlOperatorReadControllerTest.java",
    "chars": 20235,
    "preview": "package com.homihq.db2rest.rest.db2;\n\n\n\nimport com.homihq.db2rest.DB2BaseIntegrationTest;\nimport io.hosuaby.inject.resou"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/db2/Db2ReadControllerDefaultFetchLimitTest.java",
    "chars": 1541,
    "preview": "package com.homihq.db2rest.rest.db2;\n\nimport com.homihq.db2rest.DB2BaseIntegrationTest;\nimport org.junit.jupiter.api.Cla"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/db2/Db2ReadControllerTest.java",
    "chars": 3847,
    "preview": "package com.homihq.db2rest.rest.db2;\n\nimport com.homihq.db2rest.DB2BaseIntegrationTest;\nimport org.junit.jupiter.api.Cla"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/db2/Db2TemplateControllerTest.java",
    "chars": 7816,
    "preview": "package com.homihq.db2rest.rest.db2;\n\nimport com.homihq.db2rest.DB2BaseIntegrationTest;\nimport org.junit.jupiter.api.Cla"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/db2/Db2UpdateControllerTest.java",
    "chars": 4577,
    "preview": "package com.homihq.db2rest.rest.db2;\n\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jackson."
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/docsSwagger/OpenApiSpecificationNoSecurityTest.java",
    "chars": 3471,
    "preview": "package com.homihq.db2rest.rest.docsSwagger;\n\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.Test"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/docsSwagger/OpenApiSpecificationWithSecurityTest.java",
    "chars": 4660,
    "preview": "package com.homihq.db2rest.rest.docsSwagger;\n\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.Test"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mariadb/MariaDBBasicJoinControllerTest.java",
    "chars": 3996,
    "preview": "package com.homihq.db2rest.rest.mariadb;\n\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jack"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mariadb/MariaDBBulkCreateControllerTest.java",
    "chars": 7109,
    "preview": "package com.homihq.db2rest.rest.mariadb;\n\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jack"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mariadb/MariaDBCountControllerTest.java",
    "chars": 1158,
    "preview": "package com.homihq.db2rest.rest.mariadb;\n\nimport com.homihq.db2rest.MariaDBBaseIntegrationTest;\nimport org.junit.jupiter"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mariadb/MariaDBCreateControllerTest.java",
    "chars": 10737,
    "preview": "package com.homihq.db2rest.rest.mariadb;\n\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jack"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mariadb/MariaDBCrossJoinControllerTest.java",
    "chars": 3558,
    "preview": "package com.homihq.db2rest.rest.mariadb;\n\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jack"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mariadb/MariaDBDeleteAllTest.java",
    "chars": 1624,
    "preview": "package com.homihq.db2rest.rest.mariadb;\n\nimport com.homihq.db2rest.MariaDBBaseIntegrationTest;\nimport org.hamcrest.Matc"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mariadb/MariaDBDeleteControllerTest.java",
    "chars": 3368,
    "preview": "package com.homihq.db2rest.rest.mariadb;\n\nimport com.homihq.db2rest.MariaDBBaseIntegrationTest;\nimport org.junit.jupiter"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mariadb/MariaDBFunctionControllerTest.java",
    "chars": 2784,
    "preview": "package com.homihq.db2rest.rest.mariadb;\n\nimport com.homihq.db2rest.MariaDBBaseIntegrationTest;\nimport org.junit.jupiter"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mariadb/MariaDBInnerJoinControllerTest.java",
    "chars": 2329,
    "preview": "package com.homihq.db2rest.rest.mariadb;\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jacks"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mariadb/MariaDBInnerJoinMultiTableControllerTest.java",
    "chars": 2513,
    "preview": "package com.homihq.db2rest.rest.mariadb;\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jacks"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mariadb/MariaDBInnerSelfJoinControllerTest.java",
    "chars": 2402,
    "preview": "package com.homihq.db2rest.rest.mariadb;\n\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jack"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mariadb/MariaDBJsonFileCreateControllerTest.java",
    "chars": 5092,
    "preview": "package com.homihq.db2rest.rest.mariadb;\n\n\nimport com.homihq.db2rest.MariaDBBaseIntegrationTest;\nimport io.hosuaby.injec"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mariadb/MariaDBProcedureControllerTest.java",
    "chars": 2538,
    "preview": "package com.homihq.db2rest.rest.mariadb;\n\nimport com.homihq.db2rest.MariaDBBaseIntegrationTest;\nimport org.junit.jupiter"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mariadb/MariaDBRSqlOperatorReadControllerTest.java",
    "chars": 20606,
    "preview": "package com.homihq.db2rest.rest.mariadb;\n\n\n\nimport com.homihq.db2rest.MariaDBBaseIntegrationTest;\nimport io.hosuaby.inje"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mariadb/MariaDBReadControllerDefaultFetchLimitTest.java",
    "chars": 1438,
    "preview": "package com.homihq.db2rest.rest.mariadb;\n\n\nimport com.homihq.db2rest.MariaDBBaseIntegrationTest;\nimport org.junit.jupite"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mariadb/MariaDBReadControllerTest.java",
    "chars": 3810,
    "preview": "package com.homihq.db2rest.rest.mariadb;\n\nimport com.homihq.db2rest.MariaDBBaseIntegrationTest;\nimport org.junit.jupiter"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mariadb/MariaDBTemplateControllerTest.java",
    "chars": 7887,
    "preview": "package com.homihq.db2rest.rest.mariadb;\n\nimport com.homihq.db2rest.MariaDBBaseIntegrationTest;\nimport org.junit.jupiter"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mariadb/MariaDBUpdateControllerTest.java",
    "chars": 4527,
    "preview": "package com.homihq.db2rest.rest.mariadb;\n\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jack"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mariadb/MariadbDateTimeAllTest.java",
    "chars": 8281,
    "preview": "package com.homihq.db2rest.rest.mariadb;\n\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jack"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mssql/MsSQLBaseIntegrationTest.java",
    "chars": 1346,
    "preview": "package com.homihq.db2rest.rest.mssql;\n\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jackso"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mssql/MsSQLBasicJoinControllerTest.java",
    "chars": 3805,
    "preview": "package com.homihq.db2rest.rest.mssql;\n\n\nimport io.hosuaby.inject.resources.junit.jupiter.GivenJsonResource;\nimport io.h"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mssql/MsSQLBulkCreateControllerTest.java",
    "chars": 6567,
    "preview": "package com.homihq.db2rest.rest.mssql;\n\n\nimport io.hosuaby.inject.resources.junit.jupiter.GivenJsonResource;\nimport io.h"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mssql/MsSQLCountControllerTest.java",
    "chars": 1613,
    "preview": "package com.homihq.db2rest.rest.mssql;\n\nimport org.junit.jupiter.api.DisplayName;\nimport org.junit.jupiter.api.Order;\nim"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mssql/MsSQLCreateControllerTest.java",
    "chars": 10286,
    "preview": "package com.homihq.db2rest.rest.mssql;\n\n\nimport com.jayway.jsonpath.JsonPath;\nimport io.hosuaby.inject.resources.junit.j"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mssql/MsSQLCrossJoinControllerTest.java",
    "chars": 3330,
    "preview": "package com.homihq.db2rest.rest.mssql;\n\n\nimport io.hosuaby.inject.resources.junit.jupiter.GivenJsonResource;\nimport io.h"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mssql/MsSQLDateTimeAllTest.java",
    "chars": 2421,
    "preview": "package com.homihq.db2rest.rest.mssql;\n\nimport com.jayway.jsonpath.JsonPath;\nimport org.junit.jupiter.api.ClassOrderer;\n"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mssql/MsSQLDeleteControllerTest.java",
    "chars": 3145,
    "preview": "package com.homihq.db2rest.rest.mssql;\n\nimport org.junit.jupiter.api.DisplayName;\nimport org.junit.jupiter.api.Order;\nim"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mssql/MsSQLDeleteWithNotAllowedSafeDeleteControllerTest.java",
    "chars": 1400,
    "preview": "package com.homihq.db2rest.rest.mssql;\n\nimport org.hamcrest.Matchers;\nimport org.junit.jupiter.api.DisplayName;\nimport o"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mssql/MsSQLExistsControllerTest.java",
    "chars": 3580,
    "preview": "package com.homihq.db2rest.rest.mssql;\n\n\nimport io.hosuaby.inject.resources.junit.jupiter.GivenJsonResource;\nimport io.h"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mssql/MsSQLFindOneControllerTest.java",
    "chars": 1456,
    "preview": "package com.homihq.db2rest.rest.mssql;\n\n\nimport io.hosuaby.inject.resources.junit.jupiter.TestWithResources;\nimport org."
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mssql/MsSQLFunctionControllerTest.java",
    "chars": 1843,
    "preview": "package com.homihq.db2rest.rest.mssql;\n\nimport org.junit.jupiter.api.DisplayName;\nimport org.junit.jupiter.api.Order;\nim"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mssql/MsSQLInnerJoinControllerTest.java",
    "chars": 1833,
    "preview": "package com.homihq.db2rest.rest.mssql;\n\n\nimport io.hosuaby.inject.resources.junit.jupiter.GivenJsonResource;\nimport io.h"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mssql/MsSQLInnerJoinMultiTableControllerTest.java",
    "chars": 2234,
    "preview": "package com.homihq.db2rest.rest.mssql;\n\n\nimport io.hosuaby.inject.resources.junit.jupiter.GivenJsonResource;\nimport io.h"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mssql/MsSQLInnerSelfJoinControllerTest.java",
    "chars": 1953,
    "preview": "package com.homihq.db2rest.rest.mssql;\n\n\nimport io.hosuaby.inject.resources.junit.jupiter.GivenJsonResource;\nimport io.h"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mssql/MsSQLJsonFileCreateControllerTest.java",
    "chars": 5481,
    "preview": "package com.homihq.db2rest.rest.mssql;\n\n\nimport io.hosuaby.inject.resources.junit.jupiter.TestWithResources;\nimport org."
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mssql/MsSQLProcedureControllerTest.java",
    "chars": 5615,
    "preview": "package com.homihq.db2rest.rest.mssql;\n\nimport org.junit.jupiter.api.DisplayName;\nimport org.junit.jupiter.api.Order;\nim"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mssql/MsSQLRSqlOperatorReadControllerTest.java",
    "chars": 20312,
    "preview": "package com.homihq.db2rest.rest.mssql;\n\n\nimport io.hosuaby.inject.resources.junit.jupiter.TestWithResources;\nimport org."
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mssql/MsSQLReadControllerDefaultFetchLimitTest.java",
    "chars": 1351,
    "preview": "package com.homihq.db2rest.rest.mssql;\n\n\nimport org.junit.jupiter.api.DisplayName;\nimport org.junit.jupiter.api.Order;\ni"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mssql/MsSQLReadControllerTest.java",
    "chars": 6541,
    "preview": "package com.homihq.db2rest.rest.mssql;\n\nimport org.junit.jupiter.api.DisplayName;\nimport org.junit.jupiter.api.Order;\nim"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mssql/MsSQLUpdateControllerTest.java",
    "chars": 4005,
    "preview": "package com.homihq.db2rest.rest.mssql;\n\nimport io.hosuaby.inject.resources.junit.jupiter.GivenJsonResource;\nimport io.ho"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mysql/CountTwoTablesSameNameDiffSchemaTest.java",
    "chars": 1925,
    "preview": "package com.homihq.db2rest.rest.mysql;\n\nimport com.homihq.db2rest.MySQLBaseIntegrationTest;\nimport org.junit.jupiter.api"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mysql/CreateTwoTablesSameNameDiffSchemaTest.java",
    "chars": 3091,
    "preview": "package com.homihq.db2rest.rest.mysql;\n\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jackso"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mysql/DeleteTwoTablesSameNameDiffSchemaTest.java",
    "chars": 2064,
    "preview": "package com.homihq.db2rest.rest.mysql;\n\nimport com.homihq.db2rest.MySQLBaseIntegrationTest;\nimport org.junit.jupiter.api"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mysql/MySQLBasicJoinControllerTest.java",
    "chars": 4390,
    "preview": "package com.homihq.db2rest.rest.mysql;\n\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jackso"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mysql/MySQLBulkCreateControllerTest.java",
    "chars": 7342,
    "preview": "package com.homihq.db2rest.rest.mysql;\n\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jackso"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mysql/MySQLCountControllerTest.java",
    "chars": 1141,
    "preview": "package com.homihq.db2rest.rest.mysql;\n\nimport com.homihq.db2rest.MySQLBaseIntegrationTest;\nimport org.junit.jupiter.api"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mysql/MySQLCreateControllerTest.java",
    "chars": 10708,
    "preview": "package com.homihq.db2rest.rest.mysql;\n\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jackso"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mysql/MySQLCrossJoinControllerTest.java",
    "chars": 3719,
    "preview": "package com.homihq.db2rest.rest.mysql;\n\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jackso"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mysql/MySQLDateTimeAllTest.java",
    "chars": 8152,
    "preview": "package com.homihq.db2rest.rest.mysql;\n\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jackso"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mysql/MySQLDeleteAllTest.java",
    "chars": 1613,
    "preview": "package com.homihq.db2rest.rest.mysql;\n\nimport com.homihq.db2rest.MySQLBaseIntegrationTest;\nimport org.hamcrest.Matchers"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mysql/MySQLDeleteControllerTest.java",
    "chars": 3214,
    "preview": "package com.homihq.db2rest.rest.mysql;\n\nimport com.homihq.db2rest.MySQLBaseIntegrationTest;\nimport org.junit.jupiter.api"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mysql/MySQLFunctionControllerTest.java",
    "chars": 2769,
    "preview": "package com.homihq.db2rest.rest.mysql;\n\nimport com.homihq.db2rest.MySQLBaseIntegrationTest;\nimport org.junit.jupiter.api"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mysql/MySQLInnerJoinControllerTest.java",
    "chars": 2489,
    "preview": "package com.homihq.db2rest.rest.mysql;\n\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jackso"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mysql/MySQLInnerJoinMultiTableControllerTest.java",
    "chars": 2672,
    "preview": "package com.homihq.db2rest.rest.mysql;\n\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jackso"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mysql/MySQLInnerSelfJoinControllerTest.java",
    "chars": 2644,
    "preview": "package com.homihq.db2rest.rest.mysql;\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jackson"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mysql/MySQLJsonFileCreateControllerTest.java",
    "chars": 5244,
    "preview": "package com.homihq.db2rest.rest.mysql;\n\n\nimport com.homihq.db2rest.MySQLBaseIntegrationTest;\nimport io.hosuaby.inject.re"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mysql/MySQLProcedureControllerTest.java",
    "chars": 2794,
    "preview": "package com.homihq.db2rest.rest.mysql;\n\nimport com.homihq.db2rest.MySQLBaseIntegrationTest;\nimport org.junit.jupiter.api"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mysql/MySQLRSqlOperatorReadControllerTest.java",
    "chars": 20434,
    "preview": "package com.homihq.db2rest.rest.mysql;\n\n\n\nimport com.homihq.db2rest.MySQLBaseIntegrationTest;\nimport io.hosuaby.inject.r"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mysql/MySQLReadControllerDefaultFetchLimitTest.java",
    "chars": 1595,
    "preview": "package com.homihq.db2rest.rest.mysql;\n\nimport com.homihq.db2rest.MySQLBaseIntegrationTest;\nimport org.junit.jupiter.api"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mysql/MySQLReadControllerTest.java",
    "chars": 3877,
    "preview": "package com.homihq.db2rest.rest.mysql;\n\nimport com.homihq.db2rest.MySQLBaseIntegrationTest;\nimport org.junit.jupiter.api"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mysql/MySQLTemplateControllerTest.java",
    "chars": 7857,
    "preview": "package com.homihq.db2rest.rest.mysql;\n\nimport com.homihq.db2rest.MySQLBaseIntegrationTest;\nimport org.junit.jupiter.api"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mysql/MySQLUpdateControllerTest.java",
    "chars": 4510,
    "preview": "package com.homihq.db2rest.rest.mysql;\n\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jackso"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mysql/ReadTwoTablesSameNameDiffSchemaTest.java",
    "chars": 2271,
    "preview": "package com.homihq.db2rest.rest.mysql;\n\nimport com.homihq.db2rest.MySQLBaseIntegrationTest;\nimport org.junit.jupiter.api"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/mysql/UpdateTwoTablesSameNameDiffSchemaTest.java",
    "chars": 2860,
    "preview": "package com.homihq.db2rest.rest.mysql;\n\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jackso"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/oracle/OracleBasicJoinControllerTest.java",
    "chars": 4408,
    "preview": "package com.homihq.db2rest.rest.oracle;\n\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jacks"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/oracle/OracleBulkCreateControllerTest.java",
    "chars": 7539,
    "preview": "package com.homihq.db2rest.rest.oracle;\n\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jacks"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/oracle/OracleCountControllerTest.java",
    "chars": 1146,
    "preview": "package com.homihq.db2rest.rest.oracle;\n\nimport com.homihq.db2rest.OracleBaseIntegrationTest;\nimport org.junit.jupiter.a"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/oracle/OracleCreateControllerTest.java",
    "chars": 10955,
    "preview": "package com.homihq.db2rest.rest.oracle;\n\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jacks"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/oracle/OracleCrossJoinControllerTest.java",
    "chars": 3865,
    "preview": "package com.homihq.db2rest.rest.oracle;\n\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jacks"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/oracle/OracleDateTimeAllTest.java",
    "chars": 8535,
    "preview": "package com.homihq.db2rest.rest.oracle;\n\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jacks"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/oracle/OracleDeleteAllTest.java",
    "chars": 1611,
    "preview": "package com.homihq.db2rest.rest.oracle;\n\n\nimport com.homihq.db2rest.OracleBaseIntegrationTest;\nimport org.hamcrest.Match"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/oracle/OracleDeleteControllerTest.java",
    "chars": 3352,
    "preview": "package com.homihq.db2rest.rest.oracle;\n\n\nimport com.homihq.db2rest.OracleBaseIntegrationTest;\nimport org.junit.jupiter."
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/oracle/OracleInnerJoinControllerTest.java",
    "chars": 2634,
    "preview": "package com.homihq.db2rest.rest.oracle;\n\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jacks"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/oracle/OracleInnerJoinMultiTableControllerTest.java",
    "chars": 2818,
    "preview": "package com.homihq.db2rest.rest.oracle;\n\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jacks"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/oracle/OracleInnerSelfJoinControllerTest.java",
    "chars": 2705,
    "preview": "package com.homihq.db2rest.rest.oracle;\n\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jacks"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/oracle/OracleJsonFileCreateControllerTest.java",
    "chars": 5319,
    "preview": "package com.homihq.db2rest.rest.oracle;\n\n\nimport com.homihq.db2rest.OracleBaseIntegrationTest;\nimport io.hosuaby.inject."
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/oracle/OracleProcedureControllerTest.java",
    "chars": 2927,
    "preview": "package com.homihq.db2rest.rest.oracle;\n\nimport com.homihq.db2rest.OracleBaseIntegrationTest;\nimport org.junit.jupiter.a"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/oracle/OracleRSqlOperatorReadControllerTest.java",
    "chars": 20343,
    "preview": "package com.homihq.db2rest.rest.oracle;\n\n\n\nimport com.homihq.db2rest.OracleBaseIntegrationTest;\nimport io.hosuaby.inject"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/oracle/OracleReadControllerDefaultFetchLimitTest.java",
    "chars": 1557,
    "preview": "package com.homihq.db2rest.rest.oracle;\n\nimport com.homihq.db2rest.OracleBaseIntegrationTest;\nimport org.junit.jupiter.a"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/oracle/OracleReadControllerTest.java",
    "chars": 3879,
    "preview": "package com.homihq.db2rest.rest.oracle;\n\nimport com.homihq.db2rest.OracleBaseIntegrationTest;\nimport org.junit.jupiter.a"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/oracle/OracleTemplateControllerTest.java",
    "chars": 7838,
    "preview": "package com.homihq.db2rest.rest.oracle;\n\nimport com.homihq.db2rest.OracleBaseIntegrationTest;\nimport org.junit.jupiter.a"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/oracle/OracleUpdateControllerTest.java",
    "chars": 4599,
    "preview": "package com.homihq.db2rest.rest.oracle;\n\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jacks"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/pg/PGDateTimeAllTest.java",
    "chars": 8121,
    "preview": "package com.homihq.db2rest.rest.pg;\n\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jackson.d"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/pg/PgBasicJoinControllerTest.java",
    "chars": 4337,
    "preview": "package com.homihq.db2rest.rest.pg;\n\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jackson.d"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/pg/PgBulkCreateControllerTest.java",
    "chars": 6978,
    "preview": "package com.homihq.db2rest.rest.pg;\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jackson.da"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/pg/PgCountControllerTest.java",
    "chars": 1242,
    "preview": "package com.homihq.db2rest.rest.pg;\n\n\nimport com.homihq.db2rest.PostgreSQLBaseIntegrationTest;\nimport io.hosuaby.inject."
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/pg/PgCreateControllerTest.java",
    "chars": 10488,
    "preview": "package com.homihq.db2rest.rest.pg;\n\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jackson.d"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/pg/PgCrossJoinControllerTest.java",
    "chars": 3806,
    "preview": "package com.homihq.db2rest.rest.pg;\n\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jackson.d"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/pg/PgDeleteAllTest.java",
    "chars": 1619,
    "preview": "package com.homihq.db2rest.rest.pg;\n\n\nimport com.homihq.db2rest.PostgreSQLBaseIntegrationTest;\nimport org.hamcrest.Match"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/pg/PgDeleteControllerTest.java",
    "chars": 3289,
    "preview": "package com.homihq.db2rest.rest.pg;\n\nimport com.homihq.db2rest.PostgreSQLBaseIntegrationTest;\nimport org.hamcrest.Matche"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/pg/PgExtraFunctionControllerTest.java",
    "chars": 7040,
    "preview": "package com.homihq.db2rest.rest.pg;\n\nimport com.homihq.db2rest.PostgreSQLBaseIntegrationTest;\nimport org.junit.jupiter.a"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/pg/PgFunctionControllerTest.java",
    "chars": 2973,
    "preview": "package com.homihq.db2rest.rest.pg;\n\nimport com.homihq.db2rest.PostgreSQLBaseIntegrationTest;\nimport org.junit.jupiter.a"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/pg/PgInnerJoinControllerTest.java",
    "chars": 2491,
    "preview": "package com.homihq.db2rest.rest.pg;\n\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jackson.d"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/pg/PgInnerJoinMultiTableControllerTest.java",
    "chars": 2674,
    "preview": "package com.homihq.db2rest.rest.pg;\n\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jackson.d"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/pg/PgInnerSelfJoinControllerTest.java",
    "chars": 2646,
    "preview": "package com.homihq.db2rest.rest.pg;\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jackson.da"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/pg/PgJsonFileCreateControllerTest.java",
    "chars": 5277,
    "preview": "package com.homihq.db2rest.rest.pg;\n\n\nimport com.homihq.db2rest.PostgreSQLBaseIntegrationTest;\nimport io.hosuaby.inject."
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/pg/PgMultiTenancyTest.java",
    "chars": 6948,
    "preview": "package com.homihq.db2rest.rest.pg;\n\nimport static com.homihq.db2rest.rest.RdbmsRestApi.VERSION;\nimport static org.hamcr"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/pg/PgProcedureControllerTest.java",
    "chars": 2990,
    "preview": "package com.homihq.db2rest.rest.pg;\n\nimport com.homihq.db2rest.PostgreSQLBaseIntegrationTest;\nimport org.junit.jupiter.a"
  },
  {
    "path": "db2rest-api/api-rest/src/test/java/com/homihq/db2rest/rest/pg/PgRSqlOperatorReadControllerTest.java",
    "chars": 20323,
    "preview": "package com.homihq.db2rest.rest.pg;\n\n\nimport com.homihq.db2rest.PostgreSQLBaseIntegrationTest;\nimport io.hosuaby.inject."
  }
]

// ... and 356 more files (download for full content)

About this extraction

This page contains the full source code of the 9tigerio/db2rest GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 556 files (8.0 MB), approximately 2.1M tokens, and a symbol index with 1823 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!