Skip to content

Commit 09d7db8

Browse files
committed
add support for '0=intersects()' in ADQL
1 parent 2723ec3 commit 09d7db8

File tree

3 files changed

+23
-1
lines changed

3 files changed

+23
-1
lines changed

src/queryparser/adql/ADQLParser.g4

+2
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ in_predicate: value_expression ( NOT )? IN in_predicate_value
8080
in_predicate_value: table_subquery | LPAREN in_value_list RPAREN ;
8181
in_value_list: value_expression ( COMMA value_expression )* ;
8282
intersects: INTERSECTS LPAREN geometry_value_expression COMMA geometry_value_expression RPAREN ;
83+
intersects_predicate: INT EQ intersects;
8384
join_column_list: column_name_list ;
8485
join_condition: ON search_condition ;
8586
join_specification: join_condition | named_columns_join ;
@@ -138,6 +139,7 @@ polygon: POLYGON LPAREN
138139
coordinates ( COMMA coordinates )+ RPAREN ;
139140
predicate:
140141
contains_predicate
142+
| intersects_predicate
141143
| comparison_predicate
142144
| between_predicate
143145
| in_predicate

src/queryparser/adql/adqltranslator.py

+16-1
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,7 @@ def visitArea(self, ctx):
330330
ctx.removeLastChild()
331331
self.contexts[ctx] = ctx_text
332332

333+
333334
def visitCentroid(self, ctx):
334335
"""
335336
Works only for circles.
@@ -348,7 +349,6 @@ def visitCentroid(self, ctx):
348349
_remove_children(ctx)
349350
self.contexts[ctx] = ctx_text
350351

351-
352352
def visitContains_predicate(self, ctx):
353353
comp_value = ctx.children[0].getText()
354354
if comp_value == '1' or comp_value == '0':
@@ -414,6 +414,21 @@ def visitDistance(self, ctx):
414414
ctx.removeLastChild()
415415
self.contexts[ctx] = ctx_text
416416

417+
def visitIntersects_predicate(self, ctx):
418+
comp_value = ctx.children[0].getText()
419+
if comp_value == '1' or comp_value == '0':
420+
self.visitIntersects(ctx.children[2])
421+
ctx_text = self.contexts[ctx.children[2]]
422+
if self.output_sql == 'mysql':
423+
ctx_text = f"{comp_value} = {ctx_text}"
424+
elif self.output_sql == 'postgresql' and comp_value == '0':
425+
ctx_text = ctx_text.replace('&&', '!&&')
426+
else:
427+
raise QueryError('The function INTERSECTS allows comparison to 1 or 0 only.')
428+
429+
_remove_children(ctx)
430+
self.contexts[ctx] = ctx_text
431+
417432
def visitIntersects(self, ctx):
418433
arg = (self.contexts[ctx.children[2].children[0]],
419434
self.contexts[ctx.children[4].children[0]])

src/queryparser/testing/tests.yaml

+5
Original file line numberDiff line numberDiff line change
@@ -887,6 +887,11 @@ adql_postgresql_tests:
887887
- SELECT INTERSECTS(CIRCLE('ICRS', 0, 0, 10), BOX('ICRS', 2, -3, 4, 4)) FROM db.tab;
888888
- SELECT scircle(spoint(RADIANS(0.0), RADIANS(0.0)), RADIANS(10.0)) && sbox(spoint(RADIANS(0.000000000000),RADIANS(-5.000000000000)),spoint(RADIANS(4.000000000000),RADIANS(-1.000000000000))) FROM db.tab;
889889

890+
-
891+
- SELECT TOP 10 LOG10(ra), LOG(dec) FROM db.tab WHERE 0=INTERSECTS(POINT('ICRS', ra, dec), POLYGON('ICRS', 10.0, -10.5, 20.0, 20.5, 30.0, 30.5));
892+
- 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;
893+
894+
890895

891896
# Each test below consists of:
892897
#

0 commit comments

Comments
 (0)