Skip to content

Commit 69410c9

Browse files
authored
Merge pull request #24 from jburke-cadc/t74572
T74572
2 parents e790a77 + b4ed971 commit 69410c9

File tree

26 files changed

+8651
-8352
lines changed

26 files changed

+8651
-8352
lines changed

.travis.yml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
language: java
2+
3+
dist: trusty
4+
sudo: required
5+
26
jdk:
37
- openjdk7
48
- oraclejdk8
5-
script: for mod in cadc-tap-schema cadc-jsqlparser-compat cadc-tap-server cadc-adql cadc-test-tap example-tap; do cd $mod; gradle --stacktrace build javadoc install || break -1; cd ..; done
69

10+
before_script: openssl s_client -CApath /etc/ssl/certs/ -connect plugins.gradle.org:443 </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /tmp/gradle.crt; sudo keytool -importcert -noprompt -file /tmp/gradle.crt -trustcacerts -keystore $JAVA_HOME/jre/lib/security/cacerts -alias root -storepass changeit;
11+
12+
script: for mod in cadc-tap-schema cadc-jsqlparser-compat cadc-tap-server cadc-adql cadc-test-tap example-tap; do cd $mod; gradle --stacktrace build javadoc install || break -1; cd ..; done

cadc-adql/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,15 @@ sourceCompatibility = 1.7
1414

1515
group = 'org.opencadc'
1616

17-
version = '1.0.1'
17+
version = '1.0.2'
1818

1919
dependencies {
2020
compile 'log4j:log4j:1.2.+'
2121

2222
compile 'org.opencadc:cadc-util:1.+'
2323
compile 'org.opencadc:cadc-tap-server:1.+'
2424
compile 'org.opencadc:cadc-tap-schema:1.+'
25-
compile 'org.opencadc:cadc-jsqlparser-compat:0.6.2a'
25+
compile 'org.opencadc:cadc-jsqlparser-compat:0.6.4'
2626

2727
testCompile 'junit:junit:4.+'
2828
}

cadc-adql/src/main/java/ca/nrc/cadc/tap/AdqlQuery.java

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
******************* CANADIAN ASTRONOMY DATA CENTRE *******************
44
************** CENTRE CANADIEN DE DONNÉES ASTRONOMIQUES **************
55
*
6-
* (c) 2009. (c) 2009.
6+
* (c) 2017. (c) 2017.
77
* Government of Canada Gouvernement du Canada
88
* National Research Council Conseil national de recherches
99
* Ottawa, Canada, K1A 0R6 Ottawa, Canada, K1A 0R6
@@ -139,27 +139,24 @@ public AdqlQuery()
139139
*/
140140
protected void init()
141141
{
142-
ExpressionNavigator endef = new ExpressionNavigator();
143-
ReferenceNavigator rndef = new ReferenceNavigator();
144-
FromItemNavigator fndef = new FromItemNavigator();
145-
146142
// default validator: table and columns in tap_schema,
147143
// blobs and clobs in select list only
148-
ExpressionNavigator en = new ExpressionValidator(tapSchema);
149-
ReferenceNavigator rn = new BlobClobColumnValidator(tapSchema);
150-
FromItemNavigator fn = new TapSchemaTableValidator(tapSchema);
151-
SelectNavigator sn = new SelectNavigator(en, rn, fn);
144+
SelectNavigator sn = new SelectNavigator(new ExpressionValidator(tapSchema),
145+
new BlobClobColumnValidator(tapSchema),
146+
new TapSchemaTableValidator(tapSchema));
152147
navigatorList.add(sn);
153148

154149
// convert * to fixed select-list
155-
sn = new AllColumnConverter(endef, rndef, fndef, tapSchema);
150+
sn = new AllColumnConverter(new ExpressionNavigator(),
151+
new ReferenceNavigator(),
152+
new FromItemNavigator(),
153+
tapSchema);
156154
navigatorList.add(sn);
157155

158156
// extract select-list
159-
en = new SelectListExpressionExtractor(tapSchema);
160-
rn = rndef;
161-
fn = fndef;
162-
sn = new SelectListExtractor(en, rn, fn);
157+
sn = new SelectListExtractor(new SelectListExpressionExtractor(tapSchema),
158+
new ReferenceNavigator(),
159+
new FromItemNavigator());
163160
navigatorList.add(sn);
164161

165162
// support for file uploads to map the upload table name to the query table name.
@@ -174,7 +171,7 @@ protected void init()
174171
tnc.put(tableDesc.getTableName(), newName);
175172
log.debug("TableNameConverter " + tableDesc.getTableName() + " -> " + newName);
176173
}
177-
sn = new SelectNavigator(endef, rndef, tnc);
174+
sn = new SelectNavigator(new ExpressionNavigator(), new ReferenceNavigator(), tnc);
178175
navigatorList.add(sn);
179176
}
180177

cadc-adql/src/main/java/ca/nrc/cadc/tap/SqlQuery.java

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
******************* CANADIAN ASTRONOMY DATA CENTRE *******************
44
************** CENTRE CANADIEN DE DONNÉES ASTRONOMIQUES **************
55
*
6-
* (c) 2009. (c) 2009.
6+
* (c) 2017. (c) 2017.
77
* Government of Canada Gouvernement du Canada
88
* National Research Council Conseil national de recherches
99
* Ottawa, Canada, K1A 0R6 Ottawa, Canada, K1A 0R6
@@ -125,24 +125,22 @@ public SqlQuery() { }
125125
*/
126126
protected void init()
127127
{
128-
ExpressionNavigator endef = new ExpressionNavigator();
129-
ReferenceNavigator rndef = new ReferenceNavigator();
130-
FromItemNavigator fndef = new FromItemNavigator();
131-
132-
ReferenceNavigator rn = new TapSchemaColumnValidator(tapSchema);
133-
FromItemNavigator fn = new TapSchemaTableValidator(tapSchema);
134-
SelectNavigator sn = new SelectNavigator(endef, rn, fn);
128+
SelectNavigator sn = new SelectNavigator(new ExpressionNavigator(),
129+
new TapSchemaColumnValidator(tapSchema),
130+
new TapSchemaTableValidator(tapSchema));
135131
navigatorList.add(sn);
136132

137133
// convert * to fixed select-list
138-
sn = new AllColumnConverter(endef, rndef, fndef, tapSchema);
134+
sn = new AllColumnConverter(new ExpressionNavigator(),
135+
new ReferenceNavigator(),
136+
new FromItemNavigator(),
137+
tapSchema);
139138
navigatorList.add(sn);
140139

141140
// extract select-list
142-
ExpressionNavigator en = new SelectListExpressionExtractor(tapSchema);
143-
rn = rndef;
144-
fn = fndef;
145-
sn = new SelectListExtractor(en, rn, fn);
141+
sn = new SelectListExtractor(new SelectListExpressionExtractor(tapSchema),
142+
new ReferenceNavigator(),
143+
new FromItemNavigator());
146144
navigatorList.add(sn);
147145

148146
// support for file uploads to map the upload table name to the query table name.
@@ -157,7 +155,7 @@ protected void init()
157155
tnc.put(tableDesc.getTableName(), newName);
158156
log.debug("TableNameConverter " + tableDesc.getTableName() + " -> " + newName);
159157
}
160-
sn = new SelectNavigator(endef, rndef, tnc);
158+
sn = new SelectNavigator(new ExpressionNavigator(), new ReferenceNavigator(), tnc);
161159
navigatorList.add(sn);
162160
}
163161
}
@@ -247,5 +245,4 @@ public String getInfo()
247245
return queryString;
248246
}
249247

250-
251248
}

cadc-adql/src/main/java/ca/nrc/cadc/tap/parser/extractor/SelectListExpressionExtractor.java

Lines changed: 42 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
******************* CANADIAN ASTRONOMY DATA CENTRE *******************
44
************** CENTRE CANADIEN DE DONNÉES ASTRONOMIQUES **************
55
*
6-
* (c) 2009. (c) 2009.
6+
* (c) 2017. (c) 2017.
77
* Government of Canada Gouvernement du Canada
88
* National Research Council Conseil national de recherches
99
* Ottawa, Canada, K1A 0R6 Ottawa, Canada, K1A 0R6
@@ -69,26 +69,22 @@
6969

7070
package ca.nrc.cadc.tap.parser.extractor;
7171

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;
8172
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;
8375
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;
8879
import net.sf.jsqlparser.expression.Function;
8980
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
81+
import net.sf.jsqlparser.schema.Column;
82+
import net.sf.jsqlparser.statement.select.*;
9083
import org.apache.log4j.Logger;
9184

85+
import java.util.ArrayList;
86+
import java.util.List;
87+
9288
/**
9389
* Extract a list of TapSelectItem from query.
9490
*
@@ -142,31 +138,53 @@ public void visit(SelectExpressionItem selectExpressionItem)
142138
PlainSelect plainSelect = selectNavigator.getPlainSelect();
143139
String alias = selectExpressionItem.getAlias();
144140

145-
Expression expression = selectExpressionItem.getExpression();
146-
if (expression instanceof Column)
141+
Expression selectExpression = selectExpressionItem.getExpression();
142+
if (selectExpression instanceof Column)
147143
{
148-
Column column = (Column) expression;
144+
Column column = (Column) selectExpression;
149145
ColumnDesc columnDesc = TapSchemaUtil.findColumnDesc(tapSchema, plainSelect, column);
150146
log.debug("visit(column) " + column + "found: " + columnDesc);
151147
paramDesc = new ParamDesc(columnDesc, alias);
152148
}
153-
else if (expression instanceof Function)
149+
else if (selectExpression instanceof Function)
154150
{
155-
Function function = (Function) expression;
151+
Function function = (Function) selectExpression;
156152
FunctionDesc functionDesc = getFunctionDesc(function, plainSelect);
157153
log.debug("visit(function) " + function + " fiund: " + functionDesc);
158154
paramDesc = new ParamDesc(functionDesc, alias);
159155
paramDesc.columnDesc = functionDesc.arg;
160156
}
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+
}
161175
else
162176
{
163-
String datatype = getDatatypeFromExpression(expression);
177+
String datatype = getDatatypeFromExpression(selectExpression);
164178
if (alias == null || alias.isEmpty())
165-
paramDesc = new ParamDesc(expression.toString(), expression.toString(), datatype);
179+
paramDesc = new ParamDesc(selectExpression.toString(), selectExpression.toString(), datatype);
166180
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);
168187
}
169-
selectList.add(paramDesc);
170188
}
171189

172190
public List<ParamDesc> getSelectList()

cadc-adql/src/main/java/ca/nrc/cadc/tap/parser/navigator/FromItemNavigator.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
******************* CANADIAN ASTRONOMY DATA CENTRE *******************
44
************** CENTRE CANADIEN DE DONNÉES ASTRONOMIQUES **************
55
*
6-
* (c) 2009. (c) 2009.
6+
* (c) 2017. (c) 2017.
77
* Government of Canada Gouvernement du Canada
88
* National Research Council Conseil national de recherches
99
* Ottawa, Canada, K1A 0R6 Ottawa, Canada, K1A 0R6
@@ -119,8 +119,8 @@ public void visit(SubSelect subSelect)
119119
VisitingPart visiting = selectNavigator.getVisitingPart();
120120
if (visiting.equals(VisitingPart.FROM))
121121
throw new UnsupportedOperationException("sub-select not supported in FROM clause.");
122-
else if (visiting.equals(VisitingPart.SELECT_ITEM))
123-
throw new UnsupportedOperationException("sub-select not supported in SELECT ITEM.");
122+
// else if (visiting.equals(VisitingPart.SELECT_ITEM))
123+
// throw new UnsupportedOperationException("sub-select not supported in SELECT ITEM.");
124124
else
125125
subSelect.getSelectBody().accept(selectNavigator);
126126
}

cadc-adql/src/test/java/ca/nrc/cadc/tap/AdqlQueryTest.java

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
******************* CANADIAN ASTRONOMY DATA CENTRE *******************
44
************** CENTRE CANADIEN DE DONNÉES ASTRONOMIQUES **************
55
*
6-
* (c) 2009. (c) 2009.
6+
* (c) 2018. (c) 2017.
77
* Government of Canada Gouvernement du Canada
88
* National Research Council Conseil national de recherches
99
* Ottawa, Canada, K1A 0R6 Ottawa, Canada, K1A 0R6
@@ -73,6 +73,7 @@
7373
package ca.nrc.cadc.tap;
7474

7575
import static org.junit.Assert.assertEquals;
76+
import static org.junit.Assert.assertTrue;
7677

7778
import java.util.List;
7879

@@ -123,7 +124,7 @@ public class AdqlQueryTest
123124
public String getID() { return "abcdefg"; }
124125
};
125126

126-
private void doit()
127+
private List<ParamDesc> doit()
127128
{
128129
try
129130
{
@@ -138,6 +139,7 @@ private void doit()
138139
log.debug("QUERY: \r\n" + _query);
139140
log.debug("SQL: \r\n" + sql);
140141
assertEquals(_expected.toLowerCase().trim(), sql.toLowerCase().trim());
142+
return selectList;
141143
}
142144
finally
143145
{
@@ -169,6 +171,45 @@ public void testColumnAlias()
169171
doit();
170172
}
171173

174+
@Test
175+
public void testSubSelectInSelect()
176+
{
177+
_query = "select schema_name as xx, (select t_integer from tap_schema.alldatatypes) from tap_schema.tables";
178+
_expected = "select schema_name as xx, (select t_integer from tap_schema.alldatatypes) from tap_schema.tables";
179+
List<ParamDesc> selectList = doit();
180+
assertTrue(selectList.size() == 2);
181+
ParamDesc paramDesc = selectList.get(1);
182+
assertEquals("t_integer", paramDesc.name);
183+
assertEquals("adql:INTEGER", paramDesc.datatype);
184+
assertEquals("int column", paramDesc.description);
185+
186+
_query = "select schema_name as xx, (select t_varchar from tap_schema.alldatatypes) from tap_schema.tables";
187+
_expected = "select schema_name as xx, (select t_varchar from tap_schema.alldatatypes) from tap_schema.tables";
188+
selectList = doit();
189+
assertTrue(selectList.size() == 2);
190+
paramDesc = selectList.get(1);
191+
assertEquals("t_varchar", paramDesc.name);
192+
assertEquals("adql:VARCHAR", paramDesc.datatype);
193+
assertEquals("varchar column", paramDesc.description);
194+
assertEquals(8L, paramDesc.arraysize, 0.0);
195+
196+
_query = "select schema_name, (select count(distinct t_bytes) from tap_schema.alldatatypes) from tap_schema.tables";
197+
_expected = "select schema_name, (select count(distinct t_bytes) from tap_schema.alldatatypes) from tap_schema.tables";
198+
selectList = doit();
199+
assertTrue(selectList.size() == 2);
200+
paramDesc = selectList.get(1);
201+
assertEquals("COUNT", paramDesc.name);
202+
assertEquals("adql:INTEGER", paramDesc.datatype);
203+
204+
_query = "select schema_name, (select count(*) from tap_schema.alldatatypes) from tap_schema.tables";
205+
_expected = "select schema_name, (select count(*) from tap_schema.alldatatypes) from tap_schema.tables";
206+
selectList = doit();
207+
assertTrue(selectList.size() == 2);
208+
paramDesc = selectList.get(1);
209+
assertEquals("COUNT", paramDesc.name);
210+
assertEquals("adql:INTEGER", paramDesc.datatype);
211+
}
212+
172213
//@Test
173214
public void testJoin()
174215
{

cadc-adql/src/test/java/ca/nrc/cadc/tap/parser/AllColumnConverterTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
******************* CANADIAN ASTRONOMY DATA CENTRE *******************
44
************** CENTRE CANADIEN DE DONNÉES ASTRONOMIQUES **************
55
*
6-
* (c) 2009. (c) 2009.
6+
* (c) 2017. (c) 2017.
77
* Government of Canada Gouvernement du Canada
88
* National Research Council Conseil national de recherches
99
* Ottawa, Canada, K1A 0R6 Ottawa, Canada, K1A 0R6
@@ -197,7 +197,7 @@ public void testJoin()
197197
{
198198
_query = "select * from tap_schema.keys as aa, tap_schema.tables as bb " +
199199
" where aa.key_id = bb.utype";
200-
_expected = "select aa.key_id, aa.from_table, aa.target_table, aa.utype, aa.description, bb.schema_name, bb.table_name, bb.utype, bb.description from tap_schema.keys as aa , tap_schema.tables as bb where aa.key_id = bb.utype";
200+
_expected = "select aa.key_id, aa.from_table, aa.target_table, aa.utype, aa.description, bb.schema_name, bb.table_name, bb.utype, bb.description from tap_schema.keys as aa, tap_schema.tables as bb where aa.key_id = bb.utype";
201201
doit();
202202
}
203203
}

cadc-jsqlparser-compat/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ sourceCompatibility = 1.7
1414

1515
group = 'org.opencadc'
1616

17-
version = '0.6.2a'
17+
version = '0.6.4'
1818

1919
dependencies {
2020
compile 'log4j:log4j:1.2.+'

0 commit comments

Comments
 (0)