Skip to content

Commit c16d9aa

Browse files
committed
Add test case support for optional parameters in SQL document generation and completion
1 parent d5333be commit c16d9aa

File tree

14 files changed

+171
-1
lines changed

14 files changed

+171
-1
lines changed

src/test/kotlin/org/domaframework/doma/intellij/complate/sql/SqlCompleteTest.kt

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@ class SqlCompleteTest : DomaSqlTest() {
5353
"$testDapName/completeCallStaticPropertyClass.sql",
5454
"$testDapName/completeForItemHasNext.sql",
5555
"$testDapName/completeForItemIndex.sql",
56+
"$testDapName/completeOptionalDaoParam.sql",
57+
"$testDapName/completeOptionalStaticProperty.sql",
58+
"$testDapName/completeOptionalByForItem.sql",
5659
)
5760
myFixture.enableInspections(SqlBindVariableValidInspector())
5861
}
@@ -329,6 +332,30 @@ class SqlCompleteTest : DomaSqlTest() {
329332
)
330333
}
331334

335+
fun testCompleteOptionalDaoParam() {
336+
innerDirectiveCompleteTest(
337+
"$testDapName/completeOptionalDaoParam.sql",
338+
listOf("manager", "projectNumber", "getFirstEmployee()"),
339+
listOf("get()", "orElseGet()", "isPresent()"),
340+
)
341+
}
342+
343+
fun testCompleteOptionalStaticProperty() {
344+
innerDirectiveCompleteTest(
345+
"$testDapName/completeOptionalStaticProperty.sql",
346+
listOf("userId", "userName", "email", "getUserNameFormat()"),
347+
listOf("get()", "orElseGet()", "isPresent()"),
348+
)
349+
}
350+
351+
fun testCompleteOptionalByForItem() {
352+
innerDirectiveCompleteTest(
353+
"$testDapName/completeOptionalByForItem.sql",
354+
listOf("manager", "projectNumber", "getFirstEmployee()"),
355+
listOf("get()", "orElseGet()", "isPresent()"),
356+
)
357+
}
358+
332359
private fun innerDirectiveCompleteTest(
333360
sqlFileName: String,
334361
expectedSuggestions: List<String>,

src/test/kotlin/org/domaframework/doma/intellij/document/SqlSymbolDocumentTestCase.kt

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,12 @@
1515
*/
1616
package org.domaframework.doma.intellij.document
1717

18+
import com.intellij.openapi.vfs.VirtualFile
1819
import com.intellij.psi.PsiElement
1920
import org.domaframework.doma.intellij.DomaSqlTest
21+
import org.domaframework.doma.intellij.psi.SqlBlockComment
22+
import org.domaframework.doma.intellij.psi.SqlElFieldAccessExpr
23+
import org.domaframework.doma.intellij.psi.SqlElForDirective
2024
import org.domaframework.doma.intellij.psi.SqlElIdExpr
2125

2226
class SqlSymbolDocumentTestCase : DomaSqlTest() {
@@ -37,6 +41,8 @@ class SqlSymbolDocumentTestCase : DomaSqlTest() {
3741
addSqlFile("$testPackage/$testDaoName/documentForItemStaticProperty.sql")
3842
addSqlFile("$testPackage/$testDaoName/documentForItemHasNext.sql")
3943
addSqlFile("$testPackage/$testDaoName/documentForItemIndex.sql")
44+
addSqlFile("$testPackage/$testDaoName/documentForItemOptionalForItem.sql")
45+
addSqlFile("$testPackage/$testDaoName/documentForItemOptionalProperty.sql")
4046
}
4147

4248
fun testDocumentForItemDaoParam() {
@@ -55,6 +61,22 @@ class SqlSymbolDocumentTestCase : DomaSqlTest() {
5561
documentationTest(sqlName, result)
5662
}
5763

64+
fun testDocumentForItemOptionalForItem() {
65+
val sqlName = "documentForItemOptionalForItem"
66+
val result =
67+
"<a href=\"psi_element://java.util.List\">List</a><<a href=\"psi_element://doma.example.entity.Project\">Project</a>> optionalProjects"
68+
69+
documentationTest(sqlName, result)
70+
}
71+
72+
fun testDocumentForItemOptionalForItemProperty() {
73+
val sqlName = "documentForItemOptionalProperty"
74+
val result =
75+
"<a href=\"psi_element://java.util.List\">List</a><<a href=\"psi_element://java.lang.Integer\">Integer</a>> optionalIds"
76+
77+
documentationFindTextTest(sqlName, "optionalIds", result)
78+
}
79+
5880
fun testDocumentForItemElement() {
5981
val sqlName = "documentForItemElement"
6082
val result =
@@ -146,8 +168,34 @@ class SqlSymbolDocumentTestCase : DomaSqlTest() {
146168
if (sqlFile == null) return
147169

148170
myFixture.configureFromExistingVirtualFile(sqlFile)
149-
var originalElement: PsiElement = myFixture.findElementByText(originalElementName, SqlElIdExpr::class.java)
171+
var originalElement: PsiElement? =
172+
myFixture.findElementByText(originalElementName, SqlElIdExpr::class.java)
173+
?: fundForDirectiveDeclarationElement(sqlFile, originalElementName)
174+
assertNotNull("Not Found Element [$originalElementName]", originalElement)
175+
if (originalElement == null) return
176+
150177
val resultDocument = myDocumentationProvider.generateDoc(originalElement, originalElement)
151178
assertEquals("Documentation should contain expected text", result, resultDocument)
152179
}
180+
181+
private fun fundForDirectiveDeclarationElement(
182+
sqlFile: VirtualFile,
183+
searchElementName: String,
184+
): PsiElement? {
185+
myFixture.configureFromExistingVirtualFile(sqlFile)
186+
val topElement = myFixture.findElementByText(searchElementName, PsiElement::class.java)
187+
val forDirectiveBlock =
188+
topElement.children
189+
.firstOrNull { it is SqlBlockComment && it.text.contains(searchElementName) }
190+
191+
val forDirective =
192+
forDirectiveBlock?.children?.find { it is SqlElForDirective } as? SqlElForDirective
193+
?: return null
194+
val fieldAccessExpr = forDirective.elExprList[1] as? SqlElFieldAccessExpr
195+
if (fieldAccessExpr == null) {
196+
return forDirective.elExprList.firstOrNull { it.text == searchElementName }
197+
}
198+
199+
return fieldAccessExpr.elExprList.firstOrNull { it.text == searchElementName }
200+
}
153201
}

src/test/kotlin/org/domaframework/doma/intellij/inspection/sql/ParameterDefinedTest.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ class ParameterDefinedTest : DomaSqlTest() {
3838
"$testDaoName/bindVariableInFunctionParameters.sql",
3939
"$testDaoName/callStaticPropertyPackageName.sql",
4040
"$testDaoName/bindVariableForItemHasNextAndIndex.sql",
41+
"$testDaoName/optionalDaoParameterFieldAccess.sql",
4142
)
4243
myFixture.enableInspections(SqlBindVariableValidInspector())
4344
}
@@ -70,6 +71,15 @@ class ParameterDefinedTest : DomaSqlTest() {
7071
myFixture.testHighlighting(false, false, false, sqlFile)
7172
}
7273

74+
fun testOptionalDaoParameterFieldAccess() {
75+
val sqlFile =
76+
findSqlFile("$testDaoName/optionalDaoParameterFieldAccess.sql")
77+
assertNotNull("Not Found SQL File", sqlFile)
78+
if (sqlFile == null) return
79+
80+
myFixture.testHighlighting(false, false, false, sqlFile)
81+
}
82+
7383
fun testAccessStaticProperty() {
7484
val sqlFile = findSqlFile("$testDaoName/accessStaticProperty.sql")
7585
assertNotNull("Not Found SQL File", sqlFile)

src/test/testData/src/main/java/doma/example/dao/EmployeeSummaryDao.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import org.seasar.doma.jdbc.Config;
66
import org.seasar.doma.jdbc.PreparedSql;
77
import org.seasar.doma.jdbc.SelectOptions;
8+
import java.util.*;
89

910
import java.util.List;
1011
import java.util.function.BiFunction;
@@ -35,4 +36,7 @@ interface EmployeeSummaryDao {
3536

3637
@Select
3738
List<Employee> bindVariableForItemHasNextAndIndex(List<Employee> employees);
39+
40+
@Select
41+
Project optionalDaoParameterFieldAccess(Optional<Project> project, OptionalInt id, OptionalLong longId, OptionalDouble doubleId);
3842
}

src/test/testData/src/main/java/doma/example/dao/SqlCompleteTestDao.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
import java.util.List;
1010
import java.util.function.BiFunction;
11+
import java.util.Optional;
1112

1213
@Dao
1314
interface SqlCompleteTestDao {
@@ -81,4 +82,13 @@ interface SqlCompleteTestDao {
8182
@Select
8283
Principal completeForItemIndex(Principal principal);
8384

85+
@Select
86+
Project completeOptionalDaoParam(Optional<Project> project);
87+
88+
@Select
89+
Project completeOptionalStaticProperty();
90+
91+
@Select
92+
Project completeOptionalByForItem(List<Project> projects);
93+
8494
}

src/test/testData/src/main/java/doma/example/dao/document/DocumentTestDao.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import java.util.HashSet;
55
import doma.example.entity.*;
66
import org.seasar.doma.*;
7+
import java.util.Optional;
78

89
@Dao
910
public interface DocumentTestDao {
@@ -35,4 +36,10 @@ public interface DocumentTestDao {
3536
@Select
3637
int documentForItemHasNext(Principal principal);
3738

39+
@Select
40+
Project documentForItemOptionalForItem(Optional<List<Optional<Project>>> optionalProjects);
41+
42+
@Select
43+
Project documentForItemOptionalProperty(Optional<List<Optional<Project>>> optionalProjects);
44+
3845
}

src/test/testData/src/main/java/doma/example/dao/inspection/TestDataCheckDao.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,5 @@ interface TestDataCheckDao {
2929

3030
@Insert(sqlFile=true)
3131
int invalidTestData(Employee employee);
32+
3233
}

src/test/testData/src/main/java/doma/example/entity/Project.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import org.seasar.doma.Id;
66
import java.util.ArrayList;
77
import java.util.List;
8+
import java.util.Optional;
89

910
@Entity
1011
public class Project {
@@ -15,6 +16,9 @@ public class Project {
1516
private static String status;
1617
private Integer rank;
1718

19+
public static Optional<List<Optional<Integer>>> optionalIds;
20+
public static Optional<User> manager;
21+
1822
// Accessible static fields
1923
public static Integr projectNumber;
2024
private static String projectCategory;
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
select * from projects
2+
-- project : Optional<Project> -> Project
3+
where id = /* project.projectId */0
4+
and project_name = /* project.<error descr="The field or method [flatMap] does not exist in the class [Project]">flatMap</error>() */'projectName'
5+
and sa_number = /* id.<error descr="The field or method [flatMap] does not exist in the class [Integer]">flatMap</error>() */0
6+
and number = /* id.MAX_VALUE */0
7+
and as_long = /* longId.<error descr="The field or method [getAsLong] does not exist in the class [Long]">getAsLong</error>() */0
8+
and long = /* longId.doubleValue() */0
9+
and as_double = /* doubleId.<error descr="The field or method [getAsDouble] does not exist in the class [Double]">getAsDouble</error>() */0
10+
and doubles = /* longId.doubleValue() */0
11+
-- optId : Optional<Integer> -> Integer
12+
/*%for optId : project.optionalIds */
13+
OR sub_id = /* optId.MAX_VALUE */0
14+
/*%end */
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
select * from project
2+
where
3+
/*%for project : projects */
4+
or user_id = /* project.<caret> */0
5+
/*%end */

0 commit comments

Comments
 (0)