diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index bce2637..f25ee26 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -14,9 +14,13 @@ concurrency: jobs: test: - name: Maven test and release verification + name: Maven test and release verification on Java ${{ matrix.java-version }} runs-on: ubuntu-latest timeout-minutes: 20 + strategy: + fail-fast: false + matrix: + java-version: ["17", "21"] services: postgres: image: postgres:16-alpine @@ -37,11 +41,11 @@ jobs: with: persist-credentials: false - - name: Set up Java 21 + - name: Set up Java ${{ matrix.java-version }} uses: actions/setup-java@de7274f081f381c8f8158605e0321c36c376e2e6 with: distribution: temurin - java-version: "21" + java-version: ${{ matrix.java-version }} cache: maven cache-dependency-path: pom.xml diff --git a/README.md b/README.md index 4d3fd19..ad734a6 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,7 @@ or release procedure yet either. ## Requirements -- Java 21 for the CLI and for applications that use the generated code. +- Java 17 or later for the CLI and for applications that use the generated code. - Maven, to build sqlcj and to build a consuming project. - PostgreSQL, reached through the application's own PostgreSQL JDBC driver. sqlcj does not ship a driver. Behavior is verified against PostgreSQL 16. diff --git a/docs/quickstart.md b/docs/quickstart.md index 5ae8c1f..ce38c82 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -10,7 +10,7 @@ on the application's classpath. ## 1. Prerequisites -- A full JDK 21 on the `PATH` (`java -version` reports 21). +- A full JDK 17 or later on the `PATH`. - Maven (verified with 3.8.7). - Docker, or another way to reach a PostgreSQL 16 server. @@ -80,7 +80,7 @@ mkdir -p sql/migrations src/main/java/com/example/app 1.0.0-SNAPSHOT - 21 + 17 UTF-8 0.1.0-SNAPSHOT ${project.build.directory}/generated-sources/sqlcj diff --git a/examples/maven-postgresql/pom.xml b/examples/maven-postgresql/pom.xml index 2e3c0cd..dbfaf3c 100644 --- a/examples/maven-postgresql/pom.xml +++ b/examples/maven-postgresql/pom.xml @@ -16,7 +16,7 @@ --> - 21 + 17 UTF-8 0.1.0-SNAPSHOT ${project.build.directory}/generated-sources/sqlcj diff --git a/pom.xml b/pom.xml index 9776f4a..bda0487 100644 --- a/pom.xml +++ b/pom.xml @@ -18,7 +18,7 @@ - 21 + 17 UTF-8 3.10.2 4.40 @@ -157,7 +157,7 @@ maven-compiler-plugin 3.15.0 - 21 + 17 diff --git a/scripts/verify-release.sh b/scripts/verify-release.sh index 19eab9c..1860bbf 100755 --- a/scripts/verify-release.sh +++ b/scripts/verify-release.sh @@ -27,7 +27,8 @@ # parameter filter, the 'now()' rename, the grouped book count, the upsert, and # the id-list read. # -# Requirements: JDK 21, Maven, psql, and a reachable PostgreSQL server. +# Requirements: JDK 17 or later, Maven, psql, and a reachable PostgreSQL +# server. # # Connection settings, defaulting to the values used by docs/quickstart.md: # diff --git a/sqlcj-cli/src/main/java/dev/sqlcj/analysis/QueryAnalyzer.java b/sqlcj-cli/src/main/java/dev/sqlcj/analysis/QueryAnalyzer.java index 7eac070..64f6c44 100644 --- a/sqlcj-cli/src/main/java/dev/sqlcj/analysis/QueryAnalyzer.java +++ b/sqlcj-cli/src/main/java/dev/sqlcj/analysis/QueryAnalyzer.java @@ -500,7 +500,7 @@ private String resolveReturningRowTable(ReturningClause returningClause, Source return null; } - return returningClause.getFirst().getExpression() instanceof AllColumns + return returningClause.get(0).getExpression() instanceof AllColumns ? source.table().name() : null; } @@ -1659,7 +1659,7 @@ private Expression anyListArgument(Expression expression, Placeholders placehold List name = function.getMultipartName(); - if (name == null || name.size() != 1 || !name.getFirst().equalsIgnoreCase("any")) { + if (name == null || name.size() != 1 || !name.get(0).equalsIgnoreCase("any")) { return null; } @@ -1673,7 +1673,7 @@ private Expression anyListArgument(Expression expression, Placeholders placehold return null; } - Expression argument = arguments.getFirst(); + Expression argument = arguments.get(0); return bindsValue(argument, placeholders) ? argument @@ -1919,7 +1919,7 @@ private void requireSupportedPlaceholders(ParsedSql parsedSql) { if (!uncompiled.isEmpty()) { throw new UnsupportedOperationException( - NAMED_PLACEHOLDER_REJECTION.formatted(uncompiled.getFirst()) + NAMED_PLACEHOLDER_REJECTION.formatted(uncompiled.get(0)) ); } @@ -2029,7 +2029,7 @@ private List resolveColumns( private boolean isScalarCount(Function function) { List name = function.getMultipartName(); - if (name == null || name.size() != 1 || !name.getFirst().equalsIgnoreCase("count")) { + if (name == null || name.size() != 1 || !name.get(0).equalsIgnoreCase("count")) { return false; } @@ -2041,7 +2041,7 @@ private boolean isScalarCount(Function function) { return arguments != null && arguments.size() == 1 - && arguments.getFirst().getClass() == AllColumns.class; + && arguments.get(0).getClass() == AllColumns.class; } /** @@ -2107,8 +2107,8 @@ private String resolveSelectRowTable(PlainSelect plainSelect, List sourc return null; } - return selectItems.getFirst().getExpression() instanceof AllColumns - ? sources.getFirst().table().name() + return selectItems.get(0).getExpression() instanceof AllColumns + ? sources.get(0).table().name() : null; } @@ -2157,7 +2157,7 @@ private ResolvedColumn resolveColumn(net.sf.jsqlparser.schema.Column column, Lis ); } - Source source = matches.getFirst(); + Source source = matches.get(0); return new ResolvedColumn(source, findColumn(source.table(), columnName)); } diff --git a/sqlcj-cli/src/main/java/dev/sqlcj/config/ConfigValidator.java b/sqlcj-cli/src/main/java/dev/sqlcj/config/ConfigValidator.java index 08df996..61c0511 100644 --- a/sqlcj-cli/src/main/java/dev/sqlcj/config/ConfigValidator.java +++ b/sqlcj-cli/src/main/java/dev/sqlcj/config/ConfigValidator.java @@ -11,10 +11,10 @@ */ final class ConfigValidator { - private static final SourceVersion SOURCE_VERSION = SourceVersion.RELEASE_21; + private static final SourceVersion SOURCE_VERSION = SourceVersion.RELEASE_17; /** - * Java 21 restricted identifiers. They are rejected as a group name so that + * Java 17 restricted identifiers. They are rejected as a group name so that * the configured value can be used unchanged as a generated type-name * prefix. */ @@ -97,7 +97,7 @@ private void validateSchema(List schema, int index, Path configFile) { } if (schema.size() == 1) { - requireValue(schema.getFirst(), field, configFile); + requireValue(schema.get(0), field, configFile); return; } diff --git a/sqlcj-cli/src/main/java/dev/sqlcj/generator/JavaNames.java b/sqlcj-cli/src/main/java/dev/sqlcj/generator/JavaNames.java index 91ea2c4..db3cefd 100644 --- a/sqlcj-cli/src/main/java/dev/sqlcj/generator/JavaNames.java +++ b/sqlcj-cli/src/main/java/dev/sqlcj/generator/JavaNames.java @@ -47,7 +47,7 @@ */ final class JavaNames { - private static final SourceVersion SOURCE_VERSION = SourceVersion.RELEASE_21; + private static final SourceVersion SOURCE_VERSION = SourceVersion.RELEASE_17; private static final String REPOSITORY_SUFFIX = "Repository"; diff --git a/sqlcj-cli/src/main/java/dev/sqlcj/sql/SqlParameterCompiler.java b/sqlcj-cli/src/main/java/dev/sqlcj/sql/SqlParameterCompiler.java index 2e2e917..409bd07 100644 --- a/sqlcj-cli/src/main/java/dev/sqlcj/sql/SqlParameterCompiler.java +++ b/sqlcj-cli/src/main/java/dev/sqlcj/sql/SqlParameterCompiler.java @@ -67,12 +67,12 @@ final class SqlParameterCompiler { private static final int SOURCE_OFFSET = 1; SqlParameters compile(String sql, Node astRoot) { - if (!(astRoot instanceof Node node)) { + if (astRoot == null) { throw new SqlParseException("SQL parse tree is unavailable."); } - Token firstToken = node.jjtGetFirstToken(); - Token lastToken = node.jjtGetLastToken(); + Token firstToken = astRoot.jjtGetFirstToken(); + Token lastToken = astRoot.jjtGetLastToken(); if (firstToken == null || lastToken == null) { throw new SqlParseException("SQL parse tree has no tokens."); @@ -140,7 +140,7 @@ SqlParameters compile(String sql, Node astRoot) { List uncompiled = new ArrayList<>(); - collectUncompiledPlaceholders(node, names, uncompiled); + collectUncompiledPlaceholders(astRoot, names, uncompiled); return new SqlParameters( executableSql.toString(), diff --git a/sqlcj-cli/src/test/java/dev/sqlcj/analysis/QueryAnalyzerTest.java b/sqlcj-cli/src/test/java/dev/sqlcj/analysis/QueryAnalyzerTest.java index 4137a8f..aa2f76d 100644 --- a/sqlcj-cli/src/test/java/dev/sqlcj/analysis/QueryAnalyzerTest.java +++ b/sqlcj-cli/src/test/java/dev/sqlcj/analysis/QueryAnalyzerTest.java @@ -638,7 +638,7 @@ void shouldResolveQueryParameterFromReferencedColumn() { assertEquals(1, model.parameters().size()); - QueryParameter parameter = model.parameters().getFirst(); + QueryParameter parameter = model.parameters().get(0); assertEquals(1, parameter.index()); assertEquals("id", parameter.name()); @@ -663,7 +663,7 @@ void shouldResolveMultipleQueryParameters() { assertEquals(2, model.parameters().size()); - QueryParameter first = model.parameters().getFirst(); + QueryParameter first = model.parameters().get(0); assertEquals(1, first.index()); assertEquals("id", first.name()); assertEquals(ColumnType.BIGINT, first.type()); @@ -692,7 +692,7 @@ void shouldResolveMultipleParametersForSameColumn() { assertEquals(2, model.parameters().size()); - QueryParameter first = model.parameters().getFirst(); + QueryParameter first = model.parameters().get(0); assertEquals(1, first.index()); assertEquals("id", first.name()); assertEquals(ColumnType.BIGINT, first.type()); @@ -721,7 +721,7 @@ void shouldResolveQueryParametersInIndexOrder() { assertEquals(2, model.parameters().size()); - QueryParameter first = model.parameters().getFirst(); + QueryParameter first = model.parameters().get(0); assertEquals(1, first.index()); assertEquals("id", first.name()); assertEquals(ColumnType.BIGINT, first.type()); @@ -750,7 +750,7 @@ void shouldResolveQueryParametersInsideOrExpression() { assertEquals(2, model.parameters().size()); - QueryParameter first = model.parameters().getFirst(); + QueryParameter first = model.parameters().get(0); assertEquals(1, first.index()); assertEquals("id", first.name()); assertEquals(ColumnType.BIGINT, first.type()); @@ -784,7 +784,7 @@ void shouldResolveQueryParametersInsideNestedAndOrExpressions() { assertEquals(3, model.parameters().size()); - QueryParameter first = model.parameters().getFirst(); + QueryParameter first = model.parameters().get(0); assertEquals(1, first.index()); assertEquals("id", first.name()); assertEquals(ColumnType.BIGINT, first.type()); @@ -823,7 +823,7 @@ void shouldResolveQueryParametersForComparisonOperators() { assertEquals(2, model.parameters().size()); - QueryParameter first = model.parameters().getFirst(); + QueryParameter first = model.parameters().get(0); assertEquals(1, first.index()); assertEquals("id", first.name()); assertEquals(ColumnType.BIGINT, first.type()); @@ -869,7 +869,7 @@ void shouldResolveQueryParameterForComparisonOperator( assertEquals(1, model.parameters().size()); - QueryParameter parameter = model.parameters().getFirst(); + QueryParameter parameter = model.parameters().get(0); assertEquals(1, parameter.index()); assertEquals("id", parameter.name()); @@ -894,7 +894,7 @@ void shouldResolveQueryParameterWhenParameterIsOnLeftSide() { assertEquals(1, model.parameters().size()); - QueryParameter parameter = model.parameters().getFirst(); + QueryParameter parameter = model.parameters().get(0); assertEquals(1, parameter.index()); assertEquals("id", parameter.name()); @@ -1657,7 +1657,7 @@ void shouldResolveQueryParametersInsideInExpression() { assertEquals(3, model.parameters().size()); - QueryParameter first = model.parameters().getFirst(); + QueryParameter first = model.parameters().get(0); assertEquals(1, first.index()); assertEquals("id", first.name()); assertEquals(ColumnType.BIGINT, first.type()); @@ -1691,7 +1691,7 @@ void shouldResolveQueryParametersInsideInExpressionInIndexOrder() { assertEquals(3, model.parameters().size()); - QueryParameter first = model.parameters().getFirst(); + QueryParameter first = model.parameters().get(0); assertEquals(1, first.index()); assertEquals("id", first.name()); assertEquals(ColumnType.BIGINT, first.type()); @@ -1730,7 +1730,7 @@ WHERE id IN ($1, $2) assertEquals(4, model.parameters().size()); - QueryParameter first = model.parameters().getFirst(); + QueryParameter first = model.parameters().get(0); assertEquals(1, first.index()); assertEquals("id", first.name()); assertEquals(ColumnType.BIGINT, first.type()); diff --git a/sqlcj-cli/src/test/java/dev/sqlcj/compiler/DefaultSourceLoaderTest.java b/sqlcj-cli/src/test/java/dev/sqlcj/compiler/DefaultSourceLoaderTest.java index 871b987..87dfd0b 100644 --- a/sqlcj-cli/src/test/java/dev/sqlcj/compiler/DefaultSourceLoaderTest.java +++ b/sqlcj-cli/src/test/java/dev/sqlcj/compiler/DefaultSourceLoaderTest.java @@ -68,12 +68,12 @@ void shouldLoadEntriesInDeclaredOrder() throws IOException { assertEquals(2, sources.size()); - assertTrue(schemaOf(sources.getFirst()).contains("CREATE TABLE users")); + assertTrue(schemaOf(sources.get(0)).contains("CREATE TABLE users")); assertTrue(schemaOf(sources.get(1)).contains("CREATE TABLE orders")); assertEquals( List.of("GetUser", "ListUsers"), - names(sources.getFirst()) + names(sources.get(0)) ); assertEquals( @@ -111,10 +111,10 @@ void shouldLoadTheSameQueryNameInTwoEntries() throws IOException { ) ); - assertEquals(List.of("GetUser"), names(sources.getFirst())); + assertEquals(List.of("GetUser"), names(sources.get(0))); assertEquals(List.of("GetUser"), names(sources.get(1))); - assertEquals("Users", sources.getFirst().name()); + assertEquals("Users", sources.get(0).name()); assertEquals("Orders", sources.get(1).name()); } @@ -251,12 +251,12 @@ void shouldCarrySourcePathsAndQueryLines() throws IOException { ) ); - Source source = sources.getFirst(); + Source source = sources.get(0); assertEquals("Users", source.name()); assertEquals(List.of(schema), schemaPaths(source)); assertEquals(queries, source.queriesPath()); - assertEquals(1, source.queries().getFirst().line()); + assertEquals(1, source.queries().get(0).line()); assertEquals(6, source.queries().get(1).line()); } @@ -297,7 +297,7 @@ void shouldLoadListedFilesAndDirectoryMigrationsInOrder() throws IOException { ) ); - Source source = sources.getFirst(); + Source source = sources.get(0); assertEquals( List.of( @@ -434,7 +434,7 @@ void shouldRejectUnlistableSchemaDirectory() throws IOException { } private String schemaOf(Source source) { - return source.schemaFiles().getFirst().sql(); + return source.schemaFiles().get(0).sql(); } private List schemaPaths(Source source) { diff --git a/sqlcj-cli/src/test/java/dev/sqlcj/compiler/PostgresIntegrationTest.java b/sqlcj-cli/src/test/java/dev/sqlcj/compiler/PostgresIntegrationTest.java index d98ec52..270b268 100644 --- a/sqlcj-cli/src/test/java/dev/sqlcj/compiler/PostgresIntegrationTest.java +++ b/sqlcj-cli/src/test/java/dev/sqlcj/compiler/PostgresIntegrationTest.java @@ -619,7 +619,7 @@ INSERT INTO users (id, code, name, active) assertEquals(3, users.size()); - assertEquals(List.of("id", "name"), recordComponentNames(users.getFirst())); + assertEquals(List.of("id", "name"), recordComponentNames(users.get(0))); assertEquals(1L, component(users.get(0), "id")); assertEquals("Alice", component(users.get(0), "name")); @@ -1130,12 +1130,12 @@ INSERT INTO users (id, code, name, active) assertEquals( List.of("active", "users"), - recordComponentNames(groups.getFirst()) + recordComponentNames(groups.get(0)) ); assertEquals( List.of(Boolean.class, Long.class), - recordComponentTypes(groups.getFirst()) + recordComponentTypes(groups.get(0)) ); assertEquals(Boolean.FALSE, component(groups.get(0), "active")); @@ -2151,7 +2151,10 @@ INSERT INTO array_values ( assertEquals( 1L, - component(findByMarks.invoke(repository, values.getLast()), "id") + component( + findByMarks.invoke(repository, values.get(values.size() - 1)), + "id" + ) ); Object empty = queryMethod.invoke(repository, 2L); @@ -2624,7 +2627,7 @@ void shouldExecuteGeneratedLeftJoinAgainstPostgres() throws Exception { assertEquals( List.of("id", "name", "orderId", "quantity"), - recordComponentNames(rows.getFirst()) + recordComponentNames(rows.get(0)) ); assertEquals(1L, component(rows.get(0), "id")); @@ -2820,10 +2823,10 @@ INSERT INTO users (id, code, name) assertTrue(rowType.getSimpleName().endsWith("Row"), rowType.getSimpleName()); assertEquals(rowType, read.getClass()); - assertEquals(rowType, listed.getFirst().getClass()); + assertEquals(rowType, listed.get(0).getClass()); assertEquals("Alice", component(read, "name")); - assertEquals(42, component(listed.getFirst(), "code")); + assertEquals(42, component(listed.get(0), "code")); } } @@ -2867,7 +2870,7 @@ INSERT INTO users (id, code, name, active) assertEquals( List.of("id", "name"), - recordComponentNames(deleted.getFirst()) + recordComponentNames(deleted.get(0)) ); List> rows = new ArrayList<>(); diff --git a/sqlcj-cli/src/test/java/dev/sqlcj/compiler/SqlcjCompilerIntegrationTest.java b/sqlcj-cli/src/test/java/dev/sqlcj/compiler/SqlcjCompilerIntegrationTest.java index 20847a1..f738d59 100644 --- a/sqlcj-cli/src/test/java/dev/sqlcj/compiler/SqlcjCompilerIntegrationTest.java +++ b/sqlcj-cli/src/test/java/dev/sqlcj/compiler/SqlcjCompilerIntegrationTest.java @@ -1095,7 +1095,7 @@ void shouldExecuteGeneratedJoinQueryWithDuplicateColumnNames() throws Exception assertEquals(1, rows.size()); - Object row = rows.getFirst(); + Object row = rows.get(0); assertEquals(1L, getRecordComponent(row, "id1")); assertEquals(10L, getRecordComponent(row, "id2")); @@ -1159,7 +1159,7 @@ void shouldExecuteGeneratedJoinQueryWithProjectionAliases() throws Exception { assertEquals(1, rows.size()); - Object row = rows.getFirst(); + Object row = rows.get(0); assertEquals(1L, getRecordComponent(row, "userId")); assertEquals(10L, getRecordComponent(row, "profileId")); diff --git a/sqlcj-cli/src/test/java/dev/sqlcj/config/YamlConfigLoaderTest.java b/sqlcj-cli/src/test/java/dev/sqlcj/config/YamlConfigLoaderTest.java index ff112db..8a096da 100644 --- a/sqlcj-cli/src/test/java/dev/sqlcj/config/YamlConfigLoaderTest.java +++ b/sqlcj-cli/src/test/java/dev/sqlcj/config/YamlConfigLoaderTest.java @@ -37,14 +37,14 @@ void shouldMapVersionOneFields() throws IOException { assertEquals("1", config.version()); assertEquals(1, config.sql().size()); - assertEquals("Users", config.sql().getFirst().name()); + assertEquals("Users", config.sql().get(0).name()); assertEquals( List.of(tempDir.resolve("schema.sql").toString()), - config.sql().getFirst().schema() + config.sql().get(0).schema() ); assertEquals( tempDir.resolve("queries.sql").toString(), - config.sql().getFirst().queries() + config.sql().get(0).queries() ); assertEquals( "dev.example.generated", @@ -78,7 +78,7 @@ void shouldResolveEveryListedSchemaPath() throws IOException { tempDir.resolve("sql/baseline.sql").toString(), tempDir.resolve("sql/migrations").toString() ), - config.sql().getFirst().schema() + config.sql().get(0).schema() ); } @@ -214,12 +214,12 @@ void shouldResolveRelativePathsAgainstConfigurationDirectory() throws IOExceptio assertEquals( List.of(tempDir.resolve("project/sql/schema.sql").toString()), - config.sql().getFirst().schema() + config.sql().get(0).schema() ); assertEquals( configDirectory.resolve("queries.sql").toString(), - config.sql().getFirst().queries() + config.sql().get(0).queries() ); assertEquals( @@ -252,12 +252,12 @@ void shouldKeepAbsolutePathsAbsolute() throws IOException { assertEquals( List.of(schemaFile.toString()), - config.sql().getFirst().schema() + config.sql().get(0).schema() ); assertEquals( queriesFile.toString(), - config.sql().getFirst().queries() + config.sql().get(0).queries() ); assertEquals( @@ -585,11 +585,11 @@ void shouldPreserveSqlEntryNameWhileResolvingPaths() throws IOException { Config config = configLoader.load(configFile); - assertEquals("Author", config.sql().getFirst().name()); + assertEquals("Author", config.sql().get(0).name()); assertEquals( List.of(tempDir.resolve("sql/schema.sql").toString()), - config.sql().getFirst().schema() + config.sql().get(0).schema() ); } diff --git a/sqlcj-cli/src/test/java/dev/sqlcj/generator/JavaCodeGeneratorTest.java b/sqlcj-cli/src/test/java/dev/sqlcj/generator/JavaCodeGeneratorTest.java index e12b797..3e4c3fa 100644 --- a/sqlcj-cli/src/test/java/dev/sqlcj/generator/JavaCodeGeneratorTest.java +++ b/sqlcj-cli/src/test/java/dev/sqlcj/generator/JavaCodeGeneratorTest.java @@ -2021,7 +2021,7 @@ void shouldShareOneRowRecordAcrossFullRowQueriesOfOneTable() throws IOException assertEquals(1, rows.size()); - GeneratedFile row = rows.getFirst(); + GeneratedFile row = rows.get(0); assertEquals(Path.of("generated", "UsersRow.java"), row.path()); @@ -2334,7 +2334,7 @@ void shouldGenerateOneRowRecordPerRowTable() throws IOException { rows.stream().map(GeneratedFile::path).toList() ); - assertTrue(rows.getFirst().content().contains("public record UsersRow(")); + assertTrue(rows.get(0).content().contains("public record UsersRow(")); assertTrue(rows.get(1).content().contains("public record OrdersRow(")); assertCompilesWithRows(file); @@ -2468,7 +2468,7 @@ void shouldGenerateOneRowRecordForTwoGroupsReturningTheSameRow() throws IOExcept List rows = codeGenerator.generateRows(); assertEquals(1, rows.size()); - assertEquals(Path.of("generated", "UsersRow.java"), rows.getFirst().path()); + assertEquals(Path.of("generated", "UsersRow.java"), rows.get(0).path()); assertTrue(users.content().contains("public UsersRow getUser(Long id)")); assertTrue(admins.content().contains("public UsersRow getAdmin(Long id)")); @@ -2476,7 +2476,7 @@ void shouldGenerateOneRowRecordForTwoGroupsReturningTheSameRow() throws IOExcept assertFalse(users.content().contains("public record")); assertFalse(admins.content().contains("public record")); - assertCompiles(users, admins, rows.getFirst()); + assertCompiles(users, admins, rows.get(0)); } /** @@ -2667,7 +2667,7 @@ void shouldBindEnumLabelsAndReadEnumColumnsByLabel() throws IOException { assertFalse(source.contains("import generated.StageSetting;")); - assertCompiles(repository, codeGenerator.generateEnums().getFirst()); + assertCompiles(repository, codeGenerator.generateEnums().get(0)); } /** @@ -2690,9 +2690,9 @@ void shouldGenerateCompilableEnumWithLabelLookups() throws Exception { List enums = codeGenerator.generateEnums(); assertEquals(1, enums.size()); - assertEquals(Path.of("generated", "StageSetting.java"), enums.getFirst().path()); + assertEquals(Path.of("generated", "StageSetting.java"), enums.get(0).path()); - assertCompiles(repository, enums.getFirst()); + assertCompiles(repository, enums.get(0)); try (URLClassLoader classLoader = classLoader()) { Class type = Class.forName("generated.StageSetting", true, classLoader); @@ -2784,7 +2784,7 @@ void shouldNameTheGeneratedEnumAndItsConstants( ) ); - GeneratedFile file = codeGenerator.generateEnums().getFirst(); + GeneratedFile file = codeGenerator.generateEnums().get(0); assertEquals(Path.of("generated", typeName + ".java"), file.path()); assertTrue(file.content().contains("public enum " + typeName + " {")); @@ -3117,9 +3117,9 @@ void shouldBindEnumArrayLabelsAndReadEnumArrayColumnsByLabel() throws IOExceptio List enums = codeGenerator.generateEnums(); assertEquals(1, enums.size()); - assertEquals(Path.of("generated", "StageSetting.java"), enums.getFirst().path()); + assertEquals(Path.of("generated", "StageSetting.java"), enums.get(0).path()); - assertCompiles(repository, enums.getFirst()); + assertCompiles(repository, enums.get(0)); } /** @@ -3145,7 +3145,7 @@ void shouldImportListForAnArrayRowComponent() throws IOException { GeneratedFile repository = generate(query); - GeneratedFile row = codeGenerator.generateRows().getFirst(); + GeneratedFile row = codeGenerator.generateRows().get(0); assertEquals( """ diff --git a/sqlcj-cli/src/test/java/dev/sqlcj/generator/JavaNamesTest.java b/sqlcj-cli/src/test/java/dev/sqlcj/generator/JavaNamesTest.java index 9a6942a..1d87f57 100644 --- a/sqlcj-cli/src/test/java/dev/sqlcj/generator/JavaNamesTest.java +++ b/sqlcj-cli/src/test/java/dev/sqlcj/generator/JavaNamesTest.java @@ -193,12 +193,12 @@ void shouldRejectQueriesOfOneGroupWhoseResultTypesDifferOnlyByCase() { void shouldKeepTheSameQueryNameInTwoRepositoriesIndependent() { assertEquals( "getUser", - names("Author", "GetUser").queries().getFirst().methodName() + names("Author", "GetUser").queries().get(0).methodName() ); assertEquals( "getUser", - names("Book", "GetUser").queries().getFirst().methodName() + names("Book", "GetUser").queries().get(0).methodName() ); } @@ -273,7 +273,7 @@ void shouldResolveParameterNameReservedByAnotherQueryRowMapper() { assertEquals( List.of("listUsersRowMapper1"), - names.queries().getFirst().parameterNames() + names.queries().get(0).parameterNames() ); } @@ -316,7 +316,7 @@ private JavaNames.QueryNames queryNames( ) ) .queries() - .getFirst(); + .get(0); } private QueryModel query( diff --git a/sqlcj-cli/src/test/java/dev/sqlcj/parser/DefaultQueryParserTest.java b/sqlcj-cli/src/test/java/dev/sqlcj/parser/DefaultQueryParserTest.java index b347a17..aea67f5 100644 --- a/sqlcj-cli/src/test/java/dev/sqlcj/parser/DefaultQueryParserTest.java +++ b/sqlcj-cli/src/test/java/dev/sqlcj/parser/DefaultQueryParserTest.java @@ -25,7 +25,7 @@ void parsesSingleQuery() { assertEquals(1, queries.size()); - Query query = queries.getFirst(); + Query query = queries.get(0); assertEquals("GetUser", query.name()); assertEquals(QueryType.ONE, query.type()); @@ -53,8 +53,8 @@ void parsesMultipleQueries() { assertEquals(2, queries.size()); - assertEquals("GetUser", queries.getFirst().name()); - assertEquals(QueryType.ONE, queries.getFirst().type()); + assertEquals("GetUser", queries.get(0).name()); + assertEquals(QueryType.ONE, queries.get(0).type()); Query second = queries.get(1); @@ -74,8 +74,8 @@ void parsesOptionalQueryType() { List queries = parser.parse(source); assertEquals(1, queries.size()); - assertEquals("FindUser", queries.getFirst().name()); - assertEquals(QueryType.OPTIONAL, queries.getFirst().type()); + assertEquals("FindUser", queries.get(0).name()); + assertEquals(QueryType.OPTIONAL, queries.get(0).type()); } @Test @@ -89,7 +89,7 @@ void parsesExecQueryType() { List queries = parser.parse(source); assertEquals(1, queries.size()); - assertEquals(QueryType.EXEC, queries.getFirst().type()); + assertEquals(QueryType.EXEC, queries.get(0).type()); } @Test @@ -222,7 +222,7 @@ void parsesHeaderLineOfEachQuery() { List queries = parser.parse(source); - assertEquals(3, queries.getFirst().line()); + assertEquals(3, queries.get(0).line()); assertEquals(8, queries.get(1).line()); } } diff --git a/sqlcj-cli/src/test/java/dev/sqlcj/schema/parser/DefaultSchemaParserTest.java b/sqlcj-cli/src/test/java/dev/sqlcj/schema/parser/DefaultSchemaParserTest.java index 741780d..f09c37a 100644 --- a/sqlcj-cli/src/test/java/dev/sqlcj/schema/parser/DefaultSchemaParserTest.java +++ b/sqlcj-cli/src/test/java/dev/sqlcj/schema/parser/DefaultSchemaParserTest.java @@ -126,7 +126,7 @@ name VARCHAR(255), assertEquals(1, schema.tables().size()); - Table table = schema.tables().getFirst(); + Table table = schema.tables().get(0); assertEquals("users", table.name()); assertEquals(3, table.columns().size()); @@ -144,7 +144,7 @@ name VARCHAR(255), Schema schema = parser.parse(sql); - Table table = schema.tables().getFirst(); + Table table = schema.tables().get(0); assertEquals( new Column("id", ColumnType.BIGINT, false), @@ -175,7 +175,7 @@ PRIMARY KEY (id), Schema schema = parser.parse(sql); - Table table = schema.tables().getFirst(); + Table table = schema.tables().get(0); assertEquals( List.of( @@ -203,7 +203,7 @@ name VARCHAR(255) Schema schema = parser.parse(sql); - Table table = schema.tables().getFirst(); + Table table = schema.tables().get(0); assertTrue(table.constraints().isEmpty()); } @@ -220,7 +220,7 @@ PRIMARY KEY ("user id") Schema schema = parser.parse(sql); - Table table = schema.tables().getFirst(); + Table table = schema.tables().get(0); assertEquals("user data", table.name()); @@ -276,7 +276,7 @@ CREATE TABLE users ( assertEquals( expectedType, - schema.tables().getFirst().columns().getFirst().type() + schema.tables().get(0).columns().get(0).type() ); } @@ -309,7 +309,7 @@ CREATE TABLE users ( assertEquals( expectedType, - schema.tables().getFirst().columns().getFirst().type() + schema.tables().get(0).columns().get(0).type() ); } @@ -378,7 +378,7 @@ CREATE TABLE users ( assertEquals( expectedType, - schema.tables().getFirst().columns().getFirst().type() + schema.tables().get(0).columns().get(0).type() ); } @@ -403,7 +403,7 @@ CREATE TABLE users ( Schema schema = parser.parse(sql); - assertFalse(schema.tables().getFirst().columns().getFirst().nullable()); + assertFalse(schema.tables().get(0).columns().get(0).nullable()); } @Test @@ -417,7 +417,7 @@ CREATE TABLE users ( Schema schema = parser.parse(sql); - Table table = schema.tables().getFirst(); + Table table = schema.tables().get(0); assertEquals( new Column("external_id", ColumnType.UUID, true), @@ -446,7 +446,7 @@ CREATE TABLE users ( Schema schema = parser.parse(sql); - Table table = schema.tables().getFirst(); + Table table = schema.tables().get(0); assertEquals( List.of( @@ -496,7 +496,7 @@ CREATE TABLE users ( """ .formatted(sqlType); - Table table = parser.parse(sql).tables().getFirst(); + Table table = parser.parse(sql).tables().get(0); assertEquals( List.of( @@ -520,7 +520,7 @@ CREATE TABLE users ( ); """; - Table table = parser.parse(sql).tables().getFirst(); + Table table = parser.parse(sql).tables().get(0); assertEquals( List.of( @@ -570,7 +570,7 @@ CREATE TABLE users ( """ .formatted(sqlType, sqlType, sqlType); - Table table = parser.parse(sql).tables().getFirst(); + Table table = parser.parse(sql).tables().get(0); assertEquals( List.of( @@ -616,7 +616,7 @@ CREATE TABLE users ( """ .formatted(sqlType, sqlType, sqlType); - Table table = parser.parse(sql).tables().getFirst(); + Table table = parser.parse(sql).tables().get(0); assertEquals( List.of( @@ -682,7 +682,7 @@ owner_id BIGINT REFERENCES users (id) ON DELETE CASCADE Schema schema = parser.parse(sql); - Table table = schema.tables().getFirst(); + Table table = schema.tables().get(0); assertEquals( List.of( @@ -729,7 +729,7 @@ CREATE TABLE orders ( Schema schema = parser.parse(sql); - Table table = schema.tables().getFirst(); + Table table = schema.tables().get(0); assertEquals( List.of( @@ -762,7 +762,7 @@ FOREIGN KEY (code) REFERENCES codes (code), Schema schema = parser.parse(sql); - Table table = schema.tables().getFirst(); + Table table = schema.tables().get(0); assertEquals( List.of( @@ -1103,14 +1103,14 @@ CREATE TABLE users ( new Column("id", ColumnType.BIGINT, false), new Column("name", ColumnType.VARCHAR, true) ), - third.tables().getFirst().columns() + third.tables().get(0).columns() ); assertEquals(List.of("users"), tableNames(first)); assertEquals( List.of(new Column("id", ColumnType.BIGINT, false)), - first.tables().getFirst().columns() + first.tables().get(0).columns() ); } diff --git a/sqlcj-runtime/src/main/java/dev/sqlcj/runtime/JdbcQueryExecutor.java b/sqlcj-runtime/src/main/java/dev/sqlcj/runtime/JdbcQueryExecutor.java index 4b1eda3..dd1809e 100644 --- a/sqlcj-runtime/src/main/java/dev/sqlcj/runtime/JdbcQueryExecutor.java +++ b/sqlcj-runtime/src/main/java/dev/sqlcj/runtime/JdbcQueryExecutor.java @@ -247,10 +247,10 @@ private void bindParameters( for (int i = 0; i < parameters.size(); i++) { Object parameter = parameters.get(i); - if (parameter instanceof UntypedText(String value)) { - statement.setObject(i + 1, value, Types.OTHER); - } else if (parameter instanceof SqlArray(String elementType, List elements)) { - bindArray(target, statement, i + 1, elementType, elements); + if (parameter instanceof UntypedText text) { + statement.setObject(i + 1, text.value(), Types.OTHER); + } else if (parameter instanceof SqlArray array) { + bindArray(target, statement, i + 1, array.elementType(), array.elements()); } else { statement.setObject(i + 1, parameter); }