|
3 | 3 | ******************* CANADIAN ASTRONOMY DATA CENTRE ******************* |
4 | 4 | ************** CENTRE CANADIEN DE DONNÉES ASTRONOMIQUES ************** |
5 | 5 | * |
6 | | -* (c) 2009. (c) 2009. |
| 6 | +* (c) 2017. (c) 2017. |
7 | 7 | * Government of Canada Gouvernement du Canada |
8 | 8 | * National Research Council Conseil national de recherches |
9 | 9 | * Ottawa, Canada, K1A 0R6 Ottawa, Canada, K1A 0R6 |
|
69 | 69 |
|
70 | 70 | package ca.nrc.cadc.tap.parser.extractor; |
71 | 71 |
|
72 | | -import java.util.ArrayList; |
73 | | -import java.util.List; |
74 | | - |
75 | | -import net.sf.jsqlparser.expression.Expression; |
76 | | -import net.sf.jsqlparser.schema.Column; |
77 | | -import net.sf.jsqlparser.statement.select.AllColumns; |
78 | | -import net.sf.jsqlparser.statement.select.AllTableColumns; |
79 | | -import net.sf.jsqlparser.statement.select.PlainSelect; |
80 | | -import net.sf.jsqlparser.statement.select.SelectExpressionItem; |
81 | 72 | import ca.nrc.cadc.tap.parser.navigator.ExpressionNavigator; |
82 | | -import ca.nrc.cadc.tap.schema.TapSchema; |
| 73 | +import ca.nrc.cadc.tap.parser.navigator.FromItemNavigator; |
| 74 | +import ca.nrc.cadc.tap.parser.navigator.ReferenceNavigator; |
83 | 75 | import ca.nrc.cadc.tap.parser.schema.TapSchemaUtil; |
84 | | -import ca.nrc.cadc.tap.schema.ColumnDesc; |
85 | | -import ca.nrc.cadc.tap.schema.FunctionDesc; |
86 | | -import ca.nrc.cadc.tap.schema.ParamDesc; |
87 | | -import ca.nrc.cadc.tap.schema.TapSchemaDAO; |
| 76 | +import ca.nrc.cadc.tap.schema.*; |
| 77 | +import net.sf.jsqlparser.expression.Expression; |
| 78 | +import net.sf.jsqlparser.expression.ExpressionVisitor; |
88 | 79 | import net.sf.jsqlparser.expression.Function; |
89 | 80 | import net.sf.jsqlparser.expression.operators.relational.ExpressionList; |
| 81 | +import net.sf.jsqlparser.schema.Column; |
| 82 | +import net.sf.jsqlparser.statement.select.*; |
90 | 83 | import org.apache.log4j.Logger; |
91 | 84 |
|
| 85 | +import java.util.ArrayList; |
| 86 | +import java.util.List; |
| 87 | + |
92 | 88 | /** |
93 | 89 | * Extract a list of TapSelectItem from query. |
94 | 90 | * |
@@ -142,31 +138,53 @@ public void visit(SelectExpressionItem selectExpressionItem) |
142 | 138 | PlainSelect plainSelect = selectNavigator.getPlainSelect(); |
143 | 139 | String alias = selectExpressionItem.getAlias(); |
144 | 140 |
|
145 | | - Expression expression = selectExpressionItem.getExpression(); |
146 | | - if (expression instanceof Column) |
| 141 | + Expression selectExpression = selectExpressionItem.getExpression(); |
| 142 | + if (selectExpression instanceof Column) |
147 | 143 | { |
148 | | - Column column = (Column) expression; |
| 144 | + Column column = (Column) selectExpression; |
149 | 145 | ColumnDesc columnDesc = TapSchemaUtil.findColumnDesc(tapSchema, plainSelect, column); |
150 | 146 | log.debug("visit(column) " + column + "found: " + columnDesc); |
151 | 147 | paramDesc = new ParamDesc(columnDesc, alias); |
152 | 148 | } |
153 | | - else if (expression instanceof Function) |
| 149 | + else if (selectExpression instanceof Function) |
154 | 150 | { |
155 | | - Function function = (Function) expression; |
| 151 | + Function function = (Function) selectExpression; |
156 | 152 | FunctionDesc functionDesc = getFunctionDesc(function, plainSelect); |
157 | 153 | log.debug("visit(function) " + function + " fiund: " + functionDesc); |
158 | 154 | paramDesc = new ParamDesc(functionDesc, alias); |
159 | 155 | paramDesc.columnDesc = functionDesc.arg; |
160 | 156 | } |
| 157 | + else if (selectExpression instanceof SubSelect) |
| 158 | + { |
| 159 | + SubSelect subSelect = (SubSelect) selectExpression; |
| 160 | + log.debug("visit(subSelect) " + subSelect); |
| 161 | + |
| 162 | + SelectListExtractor sle = new SelectListExtractor(new SelectListExpressionExtractor(tapSchema), |
| 163 | + new ReferenceNavigator(), |
| 164 | + new FromItemNavigator()); |
| 165 | + subSelect.getSelectBody().accept(sle); |
| 166 | + SelectListExpressionExtractor slee = (SelectListExpressionExtractor) sle.getExpressionNavigator(); |
| 167 | + List <ParamDesc> selectList = slee.getSelectList(); |
| 168 | + if (selectList.size() != 1) |
| 169 | + { |
| 170 | + final String error = "Expected 1 ParamDesc in SelectList, found " + selectList.size(); |
| 171 | + throw new IllegalStateException(error); |
| 172 | + } |
| 173 | + paramDesc = selectList.get(0); |
| 174 | + } |
161 | 175 | else |
162 | 176 | { |
163 | | - String datatype = getDatatypeFromExpression(expression); |
| 177 | + String datatype = getDatatypeFromExpression(selectExpression); |
164 | 178 | if (alias == null || alias.isEmpty()) |
165 | | - paramDesc = new ParamDesc(expression.toString(), expression.toString(), datatype); |
| 179 | + paramDesc = new ParamDesc(selectExpression.toString(), selectExpression.toString(), datatype); |
166 | 180 | else |
167 | | - paramDesc = new ParamDesc(expression.toString(), alias, datatype); |
| 181 | + paramDesc = new ParamDesc(selectExpression.toString(), alias, datatype); |
| 182 | + } |
| 183 | + |
| 184 | + if (paramDesc != null) |
| 185 | + { |
| 186 | + selectList.add(paramDesc); |
168 | 187 | } |
169 | | - selectList.add(paramDesc); |
170 | 188 | } |
171 | 189 |
|
172 | 190 | public List<ParamDesc> getSelectList() |
|
0 commit comments