Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/queryparser/adql/ADQLParser.g4
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ comp_op: EQ | NOT_EQ | LTH | GTH | GRET | LEET ;
comparison_predicate: value_expression comp_op value_expression ;
concatenation_operator: CONCAT ;
contains: CONTAINS LPAREN geometry_value_expression COMMA geometry_value_expression RPAREN ;
contains_predicate: INT EQ contains;
contains_predicate: INT EQ contains | contains EQ INT;
coord_sys: string_value_expression ;
coord_value: point_value | column_reference ;
//coord1: COORD1 LPAREN coord_value RPAREN ;
Expand Down Expand Up @@ -80,7 +80,7 @@ in_predicate: value_expression ( NOT )? IN in_predicate_value
in_predicate_value: table_subquery | LPAREN in_value_list RPAREN ;
in_value_list: value_expression ( COMMA value_expression )* ;
intersects: INTERSECTS LPAREN geometry_value_expression COMMA geometry_value_expression RPAREN ;
intersects_predicate: INT EQ intersects;
intersects_predicate: INT EQ intersects | intersects EQ INT ;
join_column_list: column_name_list ;
join_condition: ON search_condition ;
join_specification: join_condition | named_columns_join ;
Expand Down
54 changes: 40 additions & 14 deletions src/queryparser/adql/adqltranslator.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,17 @@
'SQRT', 'TAN', 'TRUNCATE')


def _remove_children(ctx):
def _removeFirstChild(ctx):
if ctx.children is not None:
del ctx.children[0]


def _remove_children(ctx, reverse=False):
for _ in range(ctx.getChildCount() - 1):
ctx.removeLastChild()
if reverse:
_removeFirstChild(ctx)
else:
ctx.removeLastChild()


def _convert_values(ctx, cidx, output_sql):
Expand Down Expand Up @@ -268,8 +276,6 @@ def visitCircle(self, ctx):
def visitPolygon(self, ctx):
pars = []

for ch in ctx.children:
print(ch.getText())
for j in range(2, len(ctx.children), 2):
par = self._convert_values(ctx, j)
# only append coordinates
Expand Down Expand Up @@ -351,18 +357,27 @@ def visitCentroid(self, ctx):
'''

def visitContains_predicate(self, ctx):
comp_value = ctx.children[0].getText()
if comp_value == '1' or comp_value == '0':
comp_value_l = ctx.children[0].getText()
comp_value_r = ctx.children[2].getText()
if comp_value_l == '1' or comp_value_l == '0':
self.visitContains(ctx.children[2])
ctx_text = self.contexts[ctx.children[2]]
if self.output_sql == 'mysql':
ctx_text = f"{comp_value} = {ctx_text}"
elif self.output_sql == 'postgresql' and comp_value == '0':
ctx_text = f"{comp_value_l} = {ctx_text}"
elif self.output_sql == 'postgresql' and comp_value_l == '0':
ctx_text = ctx_text.replace('@', '!@')
_remove_children(ctx)
elif comp_value_r == '1' or comp_value_r == '0':
self.visitContains(ctx.children[0])
ctx_text = self.contexts[ctx.children[0]]
if self.output_sql == 'mysql':
ctx_text = f"{comp_value_r} = {ctx_text}"
elif self.output_sql == 'postgresql' and comp_value_r == '0':
ctx_text = ctx_text.replace('@', '!@')
_remove_children(ctx, reverse=True)
else:
raise QueryError('The function CONTAINS allows comparison to 1 or 0 only.')

_remove_children(ctx)
self.contexts[ctx] = ctx_text


Expand Down Expand Up @@ -415,21 +430,32 @@ def visitDistance(self, ctx):
ctx.removeLastChild()
self.contexts[ctx] = ctx_text


def visitIntersects_predicate(self, ctx):
comp_value = ctx.children[0].getText()
if comp_value == '1' or comp_value == '0':
comp_value_l = ctx.children[0].getText()
comp_value_r = ctx.children[2].getText()
if comp_value_l == '1' or comp_value_l == '0':
self.visitIntersects(ctx.children[2])
ctx_text = self.contexts[ctx.children[2]]
if self.output_sql == 'mysql':
ctx_text = f"{comp_value} = {ctx_text}"
elif self.output_sql == 'postgresql' and comp_value == '0':
ctx_text = f"{comp_value_l} = {ctx_text}"
elif self.output_sql == 'postgresql' and comp_value_l == '0':
ctx_text = ctx_text.replace('&&', '!&&')
_remove_children(ctx)
elif comp_value_r == '1' or comp_value_r == '0':
self.visitIntersects(ctx.children[0])
ctx_text = self.contexts[ctx.children[0]]
if self.output_sql == 'mysql':
ctx_text = f"{comp_value_r} = {ctx_text}"
elif self.output_sql == 'postgresql' and comp_value_r == '0':
ctx_text = ctx_text.replace('&&', '!&&')
_remove_children(ctx, reverse=True)
else:
raise QueryError('The function INTERSECTS allows comparison to 1 or 0 only.')

_remove_children(ctx)
self.contexts[ctx] = ctx_text


def visitIntersects(self, ctx):
arg = (self.contexts[ctx.children[2].children[0]],
self.contexts[ctx.children[4].children[0]])
Expand Down
13 changes: 12 additions & 1 deletion src/queryparser/testing/tests.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -847,6 +847,10 @@ adql_postgresql_tests:
- 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));
- SELECT ra, dec FROM db.tab WHERE spoint(RADIANS(ra), RADIANS(dec)) @ sbox(spoint(RADIANS(-5.000000000000),RADIANS(0.000000000000)),spoint(RADIANS(-1.000000000000),RADIANS(10.000000000000))) LIMIT 10;

-
- SELECT TOP 10 ra, dec FROM db.tab WHERE CONTAINS(POINT('ICRS', ra, dec), BOX('ICRS', -3.0, 5.0, 4.0, 10.0)) = 1;
- SELECT ra, dec FROM db.tab WHERE spoint(RADIANS(ra), RADIANS(dec)) @ sbox(spoint(RADIANS(-5.000000000000),RADIANS(0.000000000000)),spoint(RADIANS(-1.000000000000),RADIANS(10.000000000000))) LIMIT 10;

-
- SELECT TOP 10 ra, dec FROM db.tab WHERE 1=CONTAINS(POINT(ra, dec), BOX(-3.0, 5.0, 4.0, 10.0));
- SELECT ra, dec FROM db.tab WHERE spoint(RADIANS(ra), RADIANS(dec)) @ sbox(spoint(RADIANS(-5.000000000000),RADIANS(0.000000000000)),spoint(RADIANS(-1.000000000000),RADIANS(10.000000000000))) LIMIT 10;
Expand All @@ -855,6 +859,10 @@ adql_postgresql_tests:
- SELECT TOP 10 ra, dec FROM db.tab WHERE 1=CONTAINS(POINT(ra, dec), CIRCLE(POINT(-3.0, 4.0), 10.0));
- SELECT ra, dec FROM db.tab WHERE spoint(RADIANS(ra), RADIANS(dec)) @ scircle(spoint(RADIANS(-3.0), RADIANS(4.0)), RADIANS(10.0)) LIMIT 10;

-
- SELECT TOP 10 ra, dec FROM db.tab WHERE CONTAINS(POINT(ra, dec), CIRCLE(POINT(-3.0, 4.0), 10.0))=0;
- SELECT ra, dec FROM db.tab WHERE spoint(RADIANS(ra), RADIANS(dec)) !@ scircle(spoint(RADIANS(-3.0), RADIANS(4.0)), RADIANS(10.0)) LIMIT 10;

-
- SELECT TOP 10 ra, dec FROM db.tab WHERE 0=CONTAINS(POINT(ra, dec), CIRCLE(POINT(-3.0, 4.0), 10.0));
- SELECT ra, dec FROM db.tab WHERE spoint(RADIANS(ra), RADIANS(dec)) !@ scircle(spoint(RADIANS(-3.0), RADIANS(4.0)), RADIANS(10.0)) LIMIT 10;
Expand All @@ -864,7 +872,7 @@ adql_postgresql_tests:
- 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;

-
- 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));
- SELECT TOP 10 LOG10(ra), LOG(dec) FROM db.tab WHERE CONTAINS(POINT(ra, dec), POLYGON(10.0, -10.5, 20.0, 20.5, 30.0, 30.5))=1;
- 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;

-
Expand All @@ -883,6 +891,9 @@ adql_postgresql_tests:
- 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));
- 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;

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


# Each test below consists of:
Expand Down