|
3 | 3 | import static org.seasar.doma.internal.Constants.ROWNUMBER_COLUMN_NAME; |
4 | 4 | import static org.seasar.doma.internal.util.AssertionUtil.assertTrue; |
5 | 5 |
|
| 6 | +import java.util.function.Function; |
6 | 7 | import org.seasar.doma.internal.jdbc.sql.SimpleSqlNodeVisitor; |
7 | | -import org.seasar.doma.internal.jdbc.sql.node.AnonymousNode; |
8 | | -import org.seasar.doma.internal.jdbc.sql.node.FragmentNode; |
9 | | -import org.seasar.doma.internal.jdbc.sql.node.FromClauseNode; |
10 | | -import org.seasar.doma.internal.jdbc.sql.node.OrderByClauseNode; |
11 | | -import org.seasar.doma.internal.jdbc.sql.node.SelectClauseNode; |
12 | | -import org.seasar.doma.internal.jdbc.sql.node.SelectStatementNode; |
13 | | -import org.seasar.doma.internal.jdbc.sql.node.WhereClauseNode; |
14 | | -import org.seasar.doma.internal.jdbc.sql.node.WordNode; |
| 8 | +import org.seasar.doma.internal.jdbc.sql.node.*; |
15 | 9 | import org.seasar.doma.jdbc.JdbcException; |
16 | 10 | import org.seasar.doma.jdbc.SqlNode; |
17 | 11 | import org.seasar.doma.message.Message; |
18 | 12 |
|
19 | 13 | public class StandardPagingTransformer extends SimpleSqlNodeVisitor<SqlNode, Void> { |
20 | 14 |
|
| 15 | + private final AliasReplacer replacer = new AliasReplacer(); |
| 16 | + |
21 | 17 | protected final long offset; |
22 | 18 |
|
23 | 19 | protected final long limit; |
@@ -58,18 +54,8 @@ public SqlNode visitSelectStatementNode(SelectStatementNode node, Void p) { |
58 | 54 |
|
59 | 55 | OrderByClauseNode orderBy = new OrderByClauseNode(originalOrderBy.getWordNode()); |
60 | 56 | for (SqlNode child : originalOrderBy.getChildren()) { |
61 | | - if (child instanceof WordNode) { |
62 | | - WordNode wordNode = (WordNode) child; |
63 | | - String word = wordNode.getWord(); |
64 | | - String[] names = word.split("\\."); |
65 | | - if (names.length == 2) { |
66 | | - orderBy.appendNode(new WordNode("temp_." + names[1])); |
67 | | - } else { |
68 | | - orderBy.appendNode(child); |
69 | | - } |
70 | | - } else { |
71 | | - orderBy.appendNode(child); |
72 | | - } |
| 57 | + SqlNode newChild = child.accept(replacer, null); |
| 58 | + orderBy.appendNode(newChild); |
73 | 59 | } |
74 | 60 |
|
75 | 61 | SelectClauseNode select = new SelectClauseNode("select"); |
@@ -108,4 +94,77 @@ public SqlNode visitSelectStatementNode(SelectStatementNode node, Void p) { |
108 | 94 | protected SqlNode defaultAction(SqlNode node, Void p) { |
109 | 95 | return node; |
110 | 96 | } |
| 97 | + |
| 98 | + protected static class AliasReplacer extends SimpleSqlNodeVisitor<SqlNode, Void> { |
| 99 | + |
| 100 | + @Override |
| 101 | + public SqlNode visitWordNode(WordNode node, Void aVoid) { |
| 102 | + String word = node.getWord(); |
| 103 | + String[] names = word.split("\\."); |
| 104 | + if (names.length == 2) { |
| 105 | + return new WordNode("temp_." + names[1]); |
| 106 | + } |
| 107 | + return node; |
| 108 | + } |
| 109 | + |
| 110 | + @Override |
| 111 | + public SqlNode visitIfBlockNode(IfBlockNode node, Void aVoid) { |
| 112 | + IfBlockNode ifBlockNode = new IfBlockNode(); |
| 113 | + IfNode originalIfNode = node.getIfNode(); |
| 114 | + IfNode ifNode = |
| 115 | + buildNode( |
| 116 | + originalIfNode, o -> new IfNode(o.getLocation(), o.getExpression(), o.getText())); |
| 117 | + ifBlockNode.setIfNode(ifNode); |
| 118 | + for (ElseifNode originalElseifNode : node.getElseifNodes()) { |
| 119 | + ElseifNode elseifNode = |
| 120 | + buildNode( |
| 121 | + originalElseifNode, |
| 122 | + o -> new ElseifNode(o.getLocation(), o.getExpression(), o.getText())); |
| 123 | + ifBlockNode.addElseifNode(elseifNode); |
| 124 | + } |
| 125 | + ElseNode originalElseNode = node.getElseNode(); |
| 126 | + if (originalElseNode != null) { |
| 127 | + ElseNode elseNode = buildNode(originalElseNode, o -> new ElseNode(o.getText())); |
| 128 | + ifBlockNode.setElseNode(elseNode); |
| 129 | + } |
| 130 | + EndNode originalEndNode = node.getEndNode(); |
| 131 | + if (originalEndNode != null) { |
| 132 | + EndNode endNode = buildNode(originalEndNode, o -> new EndNode(o.getText())); |
| 133 | + ifBlockNode.setEndNode(endNode); |
| 134 | + } |
| 135 | + return ifBlockNode; |
| 136 | + } |
| 137 | + |
| 138 | + @Override |
| 139 | + public SqlNode visitForBlockNode(ForBlockNode node, Void aVoid) { |
| 140 | + ForBlockNode forBlockNode = new ForBlockNode(); |
| 141 | + ForNode originalForNode = node.getForNode(); |
| 142 | + ForNode forNode = |
| 143 | + buildNode( |
| 144 | + originalForNode, |
| 145 | + o -> new ForNode(o.getLocation(), o.getIdentifier(), o.getExpression(), o.getText())); |
| 146 | + forBlockNode.setForNode(forNode); |
| 147 | + EndNode originalEndNode = node.getEndNode(); |
| 148 | + if (originalEndNode != null) { |
| 149 | + EndNode endNode = buildNode(originalEndNode, o -> new EndNode(o.getText())); |
| 150 | + forBlockNode.setEndNode(endNode); |
| 151 | + } |
| 152 | + return forBlockNode; |
| 153 | + } |
| 154 | + |
| 155 | + private <NODE extends AppendableSqlNode> NODE buildNode( |
| 156 | + NODE originalNode, Function<NODE, NODE> factory) { |
| 157 | + NODE newNode = factory.apply(originalNode); |
| 158 | + for (SqlNode child : originalNode.getChildren()) { |
| 159 | + SqlNode newChild = child.accept(this, null); |
| 160 | + newNode.appendNode(newChild); |
| 161 | + } |
| 162 | + return newNode; |
| 163 | + } |
| 164 | + |
| 165 | + @Override |
| 166 | + protected SqlNode defaultAction(SqlNode node, Void p) { |
| 167 | + return node; |
| 168 | + } |
| 169 | + } |
111 | 170 | } |
0 commit comments