Skip to content

Commit 3dba881

Browse files
committed
make coordsys optional for point, box, circle and polygon
1 parent 18094a0 commit 3dba881

File tree

3 files changed

+51
-24
lines changed

3 files changed

+51
-24
lines changed

src/queryparser/adql/ADQLParser.g4

+8-5
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ boolean_value_expression: boolean_literal | user_defined_function ; //| bo
2020
box:
2121
BOX
2222
LPAREN
23-
coord_sys COMMA coordinates COMMA numeric_value_expression COMMA numeric_value_expression
23+
( coord_sys COMMA )?
24+
coordinates COMMA numeric_value_expression COMMA numeric_value_expression
2425
RPAREN ;
2526
catalog_name: ID ;
2627
centroid: CENTROID LPAREN geometry_value_expression RPAREN ;
@@ -31,7 +32,7 @@ character_value_expression:
3132
character_value_expression concatenation_operator ( value_expression_primary | string_value_function )
3233
| value_expression_primary
3334
| string_value_function ;
34-
circle: CIRCLE LPAREN coord_sys COMMA coordinates COMMA radius RPAREN ;
35+
circle: CIRCLE LPAREN ( coord_sys COMMA )? coordinates COMMA radius RPAREN ;
3536
column_name: identifier ;
3637
column_name_list: column_name ( COMMA column_name )* ;
3738
column_reference: ( qualifier DOT )? column_name ;
@@ -127,9 +128,11 @@ order_by_clause: ORDER BY sort_specification_list ;
127128
ordering_specification: ASC | DESC ;
128129
outer_join_type: LEFT | RIGHT | FULL ;
129130
pattern: character_value_expression ;
130-
point: POINT LPAREN coord_sys COMMA coordinates RPAREN ;
131-
polygon: POLYGON LPAREN coord_sys COMMA coordinates COMMA
132-
coordinates ( COMMA coordinates )+ RPAREN ;
131+
point: POINT LPAREN ( coord_sys COMMA )? coordinates RPAREN ;
132+
polygon: POLYGON LPAREN
133+
( coord_sys COMMA )?
134+
coordinates COMMA
135+
coordinates ( COMMA coordinates )+ RPAREN ;
133136
predicate:
134137
comparison_predicate
135138
| between_predicate

src/queryparser/adql/adqltranslator.py

+23-18
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323

2424

2525
def _remove_children(ctx):
26-
for i in range(ctx.getChildCount() - 1):
26+
for _ in range(ctx.getChildCount() - 1):
2727
ctx.removeLastChild()
2828

2929

@@ -133,8 +133,12 @@ def visitAs_clause(self, ctx):
133133

134134
def visitPoint(self, ctx):
135135
coords = []
136-
for j in (2, 4):
137-
coords.extend(self._convert_values(ctx, j))
136+
if len(ctx.children) > 4:
137+
for j in (2, 4):
138+
coords.extend(self._convert_values(ctx, j))
139+
else:
140+
coords.extend(self._convert_values(ctx, 2))
141+
138142
if len(coords) == 3:
139143
coords = coords[1:]
140144

@@ -151,10 +155,11 @@ def visitPoint(self, ctx):
151155
self.contexts[ctx] = ctx_text
152156

153157
def visitBox(self, ctx):
154-
s = 4
155158
pars = []
156-
for j in range(0, 5, 2):
157-
pars.extend(self._convert_values(ctx, s + j))
159+
s = 4 if len(ctx.children) > 8 else 2
160+
pars.extend(self._convert_values(ctx, s))
161+
pars.extend(self._convert_values(ctx, s+2))
162+
pars.extend(self._convert_values(ctx, s+4))
158163

159164
try:
160165
topright_x = float(pars[0]) + float(pars[2])
@@ -174,10 +179,10 @@ def visitBox(self, ctx):
174179
self.contexts[ctx] = ctx_text
175180

176181
def visitCircle(self, ctx):
177-
s = 4
178182
pars = []
179-
for j in range(0, 3, 2):
180-
pars.extend(self._convert_values(ctx, s + j))
183+
s = 4 if len(ctx.children) > 6 else 2
184+
pars.extend(self._convert_values(ctx, s))
185+
pars.extend(self._convert_values(ctx, s+2))
181186

182187
if self.output_sql in ('mysql', 'postgresql'):
183188
ctx_text = "scircle( spoint(%s(%s), %s(%s)), %s(%s) )" %\
@@ -190,16 +195,16 @@ def visitCircle(self, ctx):
190195
self.contexts[ctx] = ctx_text
191196

192197
def visitPolygon(self, ctx):
193-
s = 4
194-
195-
j = 0
196198
pars = []
197-
while True:
198-
try:
199-
pars.append(self._convert_values(ctx, s + j))
200-
s += 2
201-
except IndexError:
202-
break
199+
200+
for ch in ctx.children:
201+
print(ch.getText())
202+
for j in range(2, len(ctx.children), 2):
203+
par = self._convert_values(ctx, j)
204+
# only append coordinates
205+
# (ctx.children[2] can still return coord_sys which is deprecated)
206+
if len(par) > 1:
207+
pars.append(par)
203208

204209
ustr = ''
205210
if self.conunits == "RADIANS":

src/queryparser/testing/tests.yaml

+20-1
Original file line numberDiff line numberDiff line change
@@ -820,24 +820,43 @@ adql_mysql_tests:
820820
- SELECT DEGREES(sdist(spoint(RADIANS(`ra`), RADIANS(`dec`)), spoint(RADIANS(13.66), RADIANS(-58.3)))) FROM `db`.`tab` LIMIT 10;
821821

822822

823+
# the coordsys strings are deprecated since adql 2.1. The tests including the
824+
# coordsys will ensure the backward compatibility for adql2.0 but can be removed
825+
# later.
823826
adql_postgresql_tests:
824827
-
825828
- SELECT TOP 10 AREA(CIRCLE('ICRS', "tab".RA, -2.23, 176.98)) FROM db.tab
826829
- SELECT area(scircle(spoint(RADIANS("tab".RA), RADIANS(-2.23)), RADIANS(176.98))) FROM db.tab LIMIT 10;
827830

831+
-
832+
- SELECT TOP 10 AREA(CIRCLE("tab".RA, -2.23, 176.98)) FROM db.tab
833+
- SELECT area(scircle(spoint(RADIANS("tab".RA), RADIANS(-2.23)), RADIANS(176.98))) FROM db.tab LIMIT 10;
834+
828835
-
829836
- SELECT POINT('icrs', 10, 10) AS "p" FROM "db".tab
830837
- SELECT spoint(RADIANS(10.0), RADIANS(10.0)) AS "p" FROM "db".tab;
831838

839+
-
840+
- SELECT POINT(10, 10) AS "p" FROM "db".tab
841+
- SELECT spoint(RADIANS(10.0), RADIANS(10.0)) AS "p" FROM "db".tab;
842+
832843
-
833844
- SELECT TOP 10 ra, dec FROM db.tab WHERE 1=CONTAINS(POINT('ICRS', ra, dec), BOX('ICRS', -3.0, 5.0, 4.0, 10.0));
834845
- SELECT ra, dec FROM db.tab WHERE spoint(RADIANS(ra), RADIANS(dec)) @ sbox(spoint(RADIANS(-3.0),RADIANS(5.0)),spoint(RADIANS(1.000000000000),RADIANS(15.000000000000))) LIMIT 10;
835846

847+
-
848+
- SELECT TOP 10 ra, dec FROM db.tab WHERE 1=CONTAINS(POINT(ra, dec), BOX(-3.0, 5.0, 4.0, 10.0));
849+
- SELECT ra, dec FROM db.tab WHERE spoint(RADIANS(ra), RADIANS(dec)) @ sbox(spoint(RADIANS(-3.0),RADIANS(5.0)),spoint(RADIANS(1.000000000000),RADIANS(15.000000000000))) LIMIT 10;
850+
836851
-
837852
- SELECT TOP 10 LOG10(ra), LOG(dec) FROM db.tab WHERE 1=CONTAINS(POINT('ICRS', ra, dec), POLYGON('ICRS', 10.0, -10.5, 20.0, 20.5, 30.0, 30.5));
838853
- SELECT LOG(ra), LN(dec) FROM db.tab WHERE spoint(RADIANS(ra), RADIANS(dec)) @ spoly('{(10.0d,-10.5d),(20.0d,20.5d),(30.0d,30.5d)}') LIMIT 10;
839854

840-
-
855+
-
856+
- SELECT TOP 10 LOG10(ra), LOG(dec) FROM db.tab WHERE 1=CONTAINS(POINT(ra, dec), POLYGON(10.0, -10.5, 20.0, 20.5, 30.0, 30.5));
857+
- SELECT LOG(ra), LN(dec) FROM db.tab WHERE spoint(RADIANS(ra), RADIANS(dec)) @ spoly('{(10.0d,-10.5d),(20.0d,20.5d),(30.0d,30.5d)}') LIMIT 10;
858+
859+
-
841860
- SELECT CENTROID(CIRCLE('ICRS', 10.0, -10.5, 2.0)) FROM db.tab;
842861
- SELECT center(scircle(spoint(RADIANS(10.0), RADIANS(-10.5)), RADIANS(2.0))) FROM db.tab;
843862

0 commit comments

Comments
 (0)