Skip to content

Commit f604920

Browse files
committed
PostgreSql parser for H2 db queries
Signed-off-by: BoykoAlex <alex.boyko@broadcom.com>
1 parent 62aa2b4 commit f604920

8 files changed

Lines changed: 526 additions & 0 deletions

File tree

headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/data/jpa/queries/JdtDataQuerySemanticTokensProvider.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,8 @@ private SemanticTokensDataProvider getSqlSemanticTokensProvider(IJavaProject pro
122122
return sqlTokenProviders.get(SqlType.MYSQL);
123123
} else if (SpringProjectUtil.hasDependencyStartingWith(project, "postgresql", null)) {
124124
return sqlTokenProviders.get(SqlType.POSTGRESQL);
125+
} else if (SpringProjectUtil.hasDependencyStartingWith(project, "h2", null)) {
126+
return sqlTokenProviders.get(SqlType.POSTGRESQL);
125127
}
126128
return sqlTokenProviders.get(SqlType.MYSQL);
127129
}

headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/data/jpa/queries/QueryJdtAstReconciler.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,8 @@ private Optional<Reconciler> getSqlReconciler(IJavaProject project) {
131131
return Optional.of(sqlReconcilers.get(SqlType.MYSQL));
132132
} else if (SpringProjectUtil.hasDependencyStartingWith(project, "postgresql", null)) {
133133
return Optional.of(sqlReconcilers.get(SqlType.POSTGRESQL));
134+
} else if (SpringProjectUtil.hasDependencyStartingWith(project, "h2", null)) {
135+
return Optional.of(sqlReconcilers.get(SqlType.POSTGRESQL));
134136
}
135137
return Optional.empty();
136138
}

headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/data/jpa/queries/JdtDataQuerySemanticTokensProviderTest.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -519,4 +519,35 @@ static class P {
519519
new ExpectedSemanticToken("st", "variable")
520520
);
521521
}
522+
523+
@Test
524+
void jdbcSqlQueryNormalAnnotationH2() throws Exception {
525+
jp = projects.mavenProject("boot-h2/");
526+
harness.useProject(jp);
527+
528+
String source = """
529+
package my.package
530+
531+
import org.springframework.data.jdbc.repository.query.Query;
532+
import org.springframework.data.repository.query.Param;
533+
534+
public interface EmployeeRepository {
535+
536+
@Query(value = "SELECT * from fn_module_candidates")
537+
void findByLastName(@Param("lastName") String lastName);
538+
}
539+
""";
540+
541+
String uri = Paths.get(jp.getLocationUri()).resolve("src/main/resource/my/package/EmployeeRepository.java").toUri().toASCIIString();
542+
Editor editor = harness.newEditor(LanguageId.JAVA, source, uri);
543+
544+
editor.assertSemanticTokensFull(
545+
new ExpectedSemanticToken("SELECT", "keyword"),
546+
new ExpectedSemanticToken("*", "operator"),
547+
new ExpectedSemanticToken("from", "keyword"),
548+
new ExpectedSemanticToken("fn_module_candidates", "variable")
549+
);
550+
}
551+
552+
522553
}

headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/data/jpa/queries/QueryReconcilerTest.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,32 @@ public interface OwnerRepository extends CrudRepository<Object, Integer> {
353353
editor.assertProblems("SELECTX|MySQL: mismatched input 'SELECTX' expecting {'ALTER',");
354354
}
355355

356+
@Test
357+
void jdbcQueryNormalAnnotationErrorReportedH2() throws Exception {
358+
directory = new File(ProjectsHarness.class.getResource("/test-projects/boot-h2/").toURI());
359+
String projectDir = directory.toURI().toString();
360+
// trigger project creation
361+
projectFinder.find(new TextDocumentIdentifier(projectDir)).get();
362+
363+
String source = """
364+
package example.demo;
365+
366+
import org.springframework.data.jdbc.repository.query.Query;
367+
import org.springframework.data.repository.CrudRepository;
368+
369+
public interface OwnerRepository extends CrudRepository<Object, Integer> {
370+
371+
@Query(value = "SELECTX * FROM owner WHERE last_name = :lastName")
372+
List<Object> findByLastName(String lastName);
373+
374+
}
375+
""";
376+
String docUri = directory.toPath().resolve("src/main/java/example/demo/OwnerRepository.java").toUri()
377+
.toString();
378+
Editor editor = harness.newEditor(LanguageId.JAVA, source, docUri);
379+
editor.assertProblems("SELECTX|PostgreSQL: mismatched input 'SELECTX' expecting {");
380+
}
381+
356382
@Test
357383
void jdbcOnlyProjectNoReconcilingWithoutDbConnector() throws Exception {
358384
directory = new File(ProjectsHarness.class.getResource("/test-projects/aot-data-repositories-jdbc/").toURI());
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Licensed to the Apache Software Foundation (ASF) under one
2+
# or more contributor license agreements. See the NOTICE file
3+
# distributed with this work for additional information
4+
# regarding copyright ownership. The ASF licenses this file
5+
# to you under the Apache License, Version 2.0 (the
6+
# "License"); you may not use this file except in compliance
7+
# with the License. You may obtain a copy of the License at
8+
#
9+
# https://www.apache.org/licenses/LICENSE-2.0
10+
#
11+
# Unless required by applicable law or agreed to in writing,
12+
# software distributed under the License is distributed on an
13+
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14+
# KIND, either express or implied. See the License for the
15+
# specific language governing permissions and limitations
16+
# under the License.
17+
wrapperVersion=3.3.2
18+
distributionType=only-script
19+
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip

headless-services/spring-boot-language-server/src/test/resources/test-projects/boot-h2/mvnw

Lines changed: 259 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)