Skip to content

Commit 77daacb

Browse files
committed
Refactor SQL block creation logic for improved readability and maintainability
1 parent a77df00 commit 77daacb

File tree

3 files changed

+120
-146
lines changed

3 files changed

+120
-146
lines changed

src/main/kotlin/org/domaframework/doma/intellij/formatter/block/group/keyword/condition/SqlConditionKeywordGroupBlock.kt

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@ class SqlConditionKeywordGroupBlock(
3131
node: ASTNode,
3232
context: SqlBlockFormattingContext,
3333
) : SqlSecondOptionKeywordGroupBlock(
34-
node,
35-
context,
36-
) {
34+
node,
35+
context,
36+
) {
3737
var conditionalExpressionGroupBlock: SqlConditionalExpressionGroupBlock? = null
3838

3939
override fun setParentGroupBlock(lastGroup: SqlBlock?) {
@@ -50,22 +50,23 @@ class SqlConditionKeywordGroupBlock(
5050

5151
// If AND appears after OR, change it so that it is right-justified.
5252
override fun createBlockIndentLen(): Int {
53-
parentBlock?.let { parent ->
54-
val groupLen = parent.indent.groupIndentLen
55-
return if (parent is SqlElConditionLoopCommentBlock) {
56-
parent.indent.groupIndentLen
57-
} else if (parent is SqlSubGroupBlock) {
58-
if (getNodeText() == "and") {
59-
groupLen
60-
} else {
61-
groupLen.plus(1)
62-
}
63-
} else {
64-
return parent.indent.groupIndentLen.minus(getNodeText().length)
65-
}
66-
} ?: return 1
53+
val parent = parentBlock ?: return 1
54+
val groupLen = parent.indent.groupIndentLen
55+
56+
return when (parent) {
57+
is SqlElConditionLoopCommentBlock -> parent.indent.groupIndentLen
58+
is SqlSubGroupBlock -> calculateSubGroupIndent(groupLen)
59+
else -> parent.indent.groupIndentLen - getNodeText().length
60+
}
6761
}
6862

63+
private fun calculateSubGroupIndent(groupLen: Int): Int =
64+
if (getNodeText() == "and") {
65+
groupLen
66+
} else {
67+
groupLen + 1
68+
}
69+
6970
override fun createGroupIndentLen(): Int {
7071
parentBlock?.let { parent ->
7172
if (parent is SqlWhereGroupBlock) {

src/main/kotlin/org/domaframework/doma/intellij/formatter/util/SqlBlockGenerator.kt

Lines changed: 73 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -199,21 +199,7 @@ class SqlBlockGenerator(
199199
sqlBlockFormattingCtx,
200200
)
201201

202-
else -> {
203-
if (lastGroupBlock !is SqlColumnRawGroupBlock &&
204-
lastGroupBlock !is SqlTableModificationKeyword
205-
) {
206-
SqlTableModificationKeyword(
207-
child,
208-
sqlBlockFormattingCtx,
209-
)
210-
} else {
211-
SqlTableModifySecondGroupBlock(
212-
child,
213-
sqlBlockFormattingCtx,
214-
)
215-
}
216-
}
202+
else -> createTableModificationBlock(lastGroupBlock, child)
217203
}
218204
}
219205

@@ -294,55 +280,7 @@ class SqlBlockGenerator(
294280
}
295281

296282
IndentType.SECOND_OPTION -> {
297-
return if (keywordText == "on" &&
298-
lastGroupBlock !is SqlJoinGroupBlock &&
299-
lastGroupBlock?.parentBlock !is SqlJoinGroupBlock
300-
) {
301-
val rootBlock =
302-
if (lastGroupBlock is SqlElConditionLoopCommentBlock) {
303-
lastGroupBlock.tempParentBlock
304-
} else {
305-
lastGroupBlock
306-
}
307-
if (rootBlock is SqlTableModifySecondGroupBlock ||
308-
rootBlock is SqlTableModificationKeyword
309-
) {
310-
SqlTableModifySecondGroupBlock(
311-
child,
312-
sqlBlockFormattingCtx,
313-
)
314-
} else if ( rootBlock is SqlExistsGroupBlock){
315-
SqlKeywordBlock(
316-
child,
317-
IndentType.ATTACHED,
318-
sqlBlockFormattingCtx,
319-
)
320-
}
321-
else {
322-
SqlConflictClauseBlock(
323-
child,
324-
sqlBlockFormattingCtx,
325-
)
326-
}
327-
} else if (SqlKeywordUtil.isConditionKeyword(keywordText)) {
328-
if(lastGroupBlock is SqlCreateKeywordGroupBlock){
329-
SqlKeywordBlock(
330-
child,
331-
IndentType.ATTACHED,
332-
sqlBlockFormattingCtx,
333-
)
334-
}else {
335-
SqlConditionKeywordGroupBlock(
336-
child,
337-
sqlBlockFormattingCtx,
338-
)
339-
}
340-
} else {
341-
SqlSecondOptionKeywordGroupBlock(
342-
child,
343-
sqlBlockFormattingCtx,
344-
)
345-
}
283+
return createSecondOptionBlock(keywordText, child, lastGroupBlock)
346284
}
347285

348286
IndentType.CONFLICT -> {
@@ -538,6 +476,77 @@ class SqlBlockGenerator(
538476
return SqlWordBlock(child, sqlBlockFormattingCtx)
539477
}
540478

479+
private fun createTableModificationBlock(
480+
lastGroupBlock: SqlBlock?,
481+
child: ASTNode,
482+
): SqlBlock =
483+
if (shouldCreateTableModificationKeyword(lastGroupBlock)) {
484+
SqlTableModificationKeyword(child, sqlBlockFormattingCtx)
485+
} else {
486+
SqlTableModifySecondGroupBlock(child, sqlBlockFormattingCtx)
487+
}
488+
489+
private fun shouldCreateTableModificationKeyword(lastGroupBlock: SqlBlock?): Boolean =
490+
lastGroupBlock !is SqlColumnRawGroupBlock &&
491+
lastGroupBlock !is SqlTableModificationKeyword
492+
493+
private fun createSecondOptionBlock(
494+
keywordText: String,
495+
child: ASTNode,
496+
lastGroupBlock: SqlBlock?,
497+
): SqlBlock =
498+
when {
499+
isOnKeywordForNonJoin(keywordText, lastGroupBlock) -> {
500+
handleOnKeyword(child, lastGroupBlock)
501+
}
502+
SqlKeywordUtil.isConditionKeyword(keywordText) -> {
503+
createConditionBlock(child, lastGroupBlock)
504+
}
505+
else -> SqlSecondOptionKeywordGroupBlock(child, sqlBlockFormattingCtx)
506+
}
507+
508+
private fun isOnKeywordForNonJoin(
509+
keywordText: String,
510+
lastGroupBlock: SqlBlock?,
511+
): Boolean =
512+
keywordText == "on" &&
513+
lastGroupBlock !is SqlJoinGroupBlock &&
514+
lastGroupBlock?.parentBlock !is SqlJoinGroupBlock
515+
516+
private fun handleOnKeyword(
517+
child: ASTNode,
518+
lastGroupBlock: SqlBlock?,
519+
): SqlBlock {
520+
val rootBlock = getRootBlock(lastGroupBlock)
521+
return when {
522+
rootBlock is SqlTableModifySecondGroupBlock ||
523+
rootBlock is SqlTableModificationKeyword -> {
524+
SqlTableModifySecondGroupBlock(child, sqlBlockFormattingCtx)
525+
}
526+
rootBlock is SqlExistsGroupBlock -> {
527+
SqlKeywordBlock(child, IndentType.ATTACHED, sqlBlockFormattingCtx)
528+
}
529+
else -> SqlConflictClauseBlock(child, sqlBlockFormattingCtx)
530+
}
531+
}
532+
533+
private fun getRootBlock(lastGroupBlock: SqlBlock?): SqlBlock? =
534+
if (lastGroupBlock is SqlElConditionLoopCommentBlock) {
535+
lastGroupBlock.tempParentBlock
536+
} else {
537+
lastGroupBlock
538+
}
539+
540+
private fun createConditionBlock(
541+
child: ASTNode,
542+
lastGroupBlock: SqlBlock?,
543+
): SqlBlock =
544+
if (lastGroupBlock is SqlCreateKeywordGroupBlock) {
545+
SqlKeywordBlock(child, IndentType.ATTACHED, sqlBlockFormattingCtx)
546+
} else {
547+
SqlConditionKeywordGroupBlock(child, sqlBlockFormattingCtx)
548+
}
549+
541550
fun getBlockCommentBlock(
542551
child: ASTNode,
543552
blockCommentSpacingBuilder: SqlCustomSpacingBuilder?,

src/main/kotlin/org/domaframework/doma/intellij/formatter/util/SqlKeywordUtil.kt

Lines changed: 29 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,7 @@ class SqlKeywordUtil {
8282
"do",
8383
)
8484

85-
fun isTopKeyword(keyword: String): Boolean = TOP_KEYWORDS.contains(keyword.lowercase())
86-
87-
private val SECOND_KEYWORD =
85+
private val SECOND_KEYWORDS: Set<String> =
8886
setOf(
8987
"set",
9088
"from",
@@ -97,9 +95,7 @@ class SqlKeywordUtil {
9795
"returning",
9896
)
9997

100-
fun isSecondKeyword(keyword: String): Boolean = SECOND_KEYWORD.contains(keyword.lowercase())
101-
102-
private val TABLE_MODIFY_KEYWORD =
98+
private val TABLE_MODIFY_KEYWORDS: Set<String> =
10399
setOf(
104100
"add",
105101
"drop",
@@ -108,78 +104,46 @@ class SqlKeywordUtil {
108104
"references",
109105
)
110106

111-
fun isTableModifyKeyword(keyword: String): Boolean = TABLE_MODIFY_KEYWORD.contains(keyword.lowercase())
107+
fun isTopKeyword(keyword: String): Boolean = TOP_KEYWORDS.contains(keyword.lowercase())
112108

113-
private val SECOND_OPTION_KEYWORD =
114-
setOf(
115-
"and",
116-
"or",
117-
"on",
118-
)
109+
fun isSecondKeyword(keyword: String): Boolean = SECOND_KEYWORDS.contains(keyword.lowercase())
119110

120-
private val CONDITION_KEYWORD =
121-
setOf(
122-
"and",
123-
"or",
124-
)
111+
fun isTableModifyKeyword(keyword: String): Boolean = TABLE_MODIFY_KEYWORDS.contains(keyword.lowercase())
125112

126-
fun isConditionKeyword(keyword: String): Boolean = CONDITION_KEYWORD.contains(keyword.lowercase())
113+
private val SECOND_OPTION_KEYWORDS: Set<String> =
114+
setOf("and", "or", "on")
127115

128-
fun isSecondOptionKeyword(keyword: String): Boolean = SECOND_OPTION_KEYWORD.contains(keyword.lowercase())
116+
private val CONDITION_KEYWORDS: Set<String> =
117+
setOf("and", "or")
129118

130-
private val BEFORE_TABLE_KEYWORD =
131-
setOf(
132-
"from",
133-
"update",
134-
"drop",
135-
"table",
136-
)
119+
fun isConditionKeyword(keyword: String): Boolean = CONDITION_KEYWORDS.contains(keyword.lowercase())
137120

138-
private val SELECT_SECOND_OPTION_KEYWORD =
139-
setOf(
140-
"from",
141-
"where",
142-
"group",
143-
"having",
144-
"order",
145-
"rows",
146-
)
121+
fun isSecondOptionKeyword(keyword: String): Boolean = SECOND_OPTION_KEYWORDS.contains(keyword.lowercase())
147122

148-
fun isSelectSecondOptionKeyword(keyword: String): Boolean = SELECT_SECOND_OPTION_KEYWORD.contains(keyword.lowercase())
123+
private val BEFORE_TABLE_KEYWORDS: Set<String> =
124+
setOf("from", "update", "drop", "table")
149125

150-
fun isBeforeTableKeyword(keyword: String): Boolean = BEFORE_TABLE_KEYWORD.contains(keyword.lowercase())
126+
private val SELECT_SECOND_OPTION_KEYWORDS: Set<String> =
127+
setOf("from", "where", "group", "having", "order", "rows")
151128

152-
private val JOIN_KEYWORD =
153-
setOf(
154-
"left",
155-
"right",
156-
"full",
157-
"cross",
158-
"natural",
159-
)
129+
fun isSelectSecondOptionKeyword(keyword: String): Boolean = SELECT_SECOND_OPTION_KEYWORDS.contains(keyword.lowercase())
160130

161-
fun isJoinKeyword(keyword: String): Boolean = JOIN_KEYWORD.contains(keyword.lowercase())
131+
fun isBeforeTableKeyword(keyword: String): Boolean = BEFORE_TABLE_KEYWORDS.contains(keyword.lowercase())
162132

163-
private val JOIN_ATTACHED_KEYWORD =
164-
setOf(
165-
"outer",
166-
"inner",
167-
"join",
168-
)
133+
private val JOIN_KEYWORDS: Set<String> =
134+
setOf("left", "right", "full", "cross", "natural")
169135

170-
fun isJoinAttachedKeyword(keyword: String): Boolean = JOIN_ATTACHED_KEYWORD.contains(keyword.lowercase())
136+
fun isJoinKeyword(keyword: String): Boolean = JOIN_KEYWORDS.contains(keyword.lowercase())
171137

172-
private val ATTACHED_KEYWORD =
173-
setOf(
174-
"distinct",
175-
"into",
176-
"table",
177-
"index",
178-
"database",
179-
"view",
180-
)
138+
private val JOIN_ATTACHED_KEYWORDS: Set<String> =
139+
setOf("outer", "inner", "join")
140+
141+
fun isJoinAttachedKeyword(keyword: String): Boolean = JOIN_ATTACHED_KEYWORDS.contains(keyword.lowercase())
142+
143+
private val ATTACHED_KEYWORDS: Set<String> =
144+
setOf("distinct", "into", "table", "index", "database", "view")
181145

182-
fun isAttachedKeyword(keyword: String): Boolean = ATTACHED_KEYWORD.contains(keyword.lowercase())
146+
fun isAttachedKeyword(keyword: String): Boolean = ATTACHED_KEYWORDS.contains(keyword.lowercase())
183147

184148
private val THIRD_KEYWORDS =
185149
setOf(
@@ -334,7 +298,7 @@ class SqlKeywordUtil {
334298
"group" to setOf("within"),
335299
"by" to setOf("group", "order", "first", "partition"),
336300
"and" to setOf("between", "preceding"),
337-
// "if" to setOf("table", "index","view"),
301+
// "if" to setOf("table", "index","view"),
338302
"exists" to setOf("if", "where"),
339303
"conflict" to setOf("on"),
340304
"nothing" to setOf("do"),

0 commit comments

Comments
 (0)