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);
}