From 732e310d3aa19edfd06b3ce7bff7a8815d3818f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9gory=20Mantelet?= <gregory.mantelet@astro.unistra.fr> Date: Thu, 8 Aug 2019 15:55:35 +0200 Subject: [PATCH] [ADQL] Add an easy UDF translation. An SQL expression template can now be provided. When done, all $$i (where i is the index of a parameter ; starting from 1) are replaced by the SQL translation of the corresponding parameters. --- src/adql/db/FunctionDef.java | 4 ++++ src/adql/query/operand/function/DefaultUDF.java | 14 +++++++------- test/adql/db/TestFunctionDef.java | 1 + test/adql/translator/TestJDBCTranslator.java | 3 ++- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/adql/db/FunctionDef.java b/src/adql/db/FunctionDef.java index 4a3d1f6..645ede9 100644 --- a/src/adql/db/FunctionDef.java +++ b/src/adql/db/FunctionDef.java @@ -289,6 +289,10 @@ public class FunctionDef implements Comparable<FunctionDef> { * @param returnType Return type of the function. * <i>If NULL, this function will have no return * type.</i> + * + * @throws ParseException If the given UDF name is invalid according to + * the {@link ADQLParserFactory#DEFAULT_VERSION default version} + * of the ADQL grammar. */ public FunctionDef(final String fctName, final DBType returnType) throws ParseException { this(fctName, returnType, null, null); diff --git a/src/adql/query/operand/function/DefaultUDF.java b/src/adql/query/operand/function/DefaultUDF.java index 326f5b8..aebb564 100644 --- a/src/adql/query/operand/function/DefaultUDF.java +++ b/src/adql/query/operand/function/DefaultUDF.java @@ -239,7 +239,7 @@ public final class DefaultUDF extends UserDefinedFunction { } @Override - public String translate(final ADQLTranslator caller) throws TranslationException{ + public String translate(final ADQLTranslator caller) throws TranslationException { // Use the translation pattern if any is specified: if (definition != null && definition.getTranslationPattern() != null) { StringBuffer sql = new StringBuffer(); @@ -277,12 +277,12 @@ public final class DefaultUDF extends UserDefinedFunction { } // Otherwise, no translation needed (use the ADQL as translation result): else { - StringBuffer sql = new StringBuffer(functionName); - sql.append('('); - for(int i = 0; i < parameters.size(); i++){ - if (i > 0) - sql.append(',').append(' '); - sql.append(caller.translate(parameters.get(i))); + StringBuffer sql = new StringBuffer(functionName); + sql.append('('); + for(int i = 0; i < parameters.size(); i++) { + if (i > 0) + sql.append(',').append(' '); + sql.append(caller.translate(parameters.get(i))); } sql.append(')'); return sql.toString(); diff --git a/test/adql/db/TestFunctionDef.java b/test/adql/db/TestFunctionDef.java index 92bbfc0..e0fe91b 100644 --- a/test/adql/db/TestFunctionDef.java +++ b/test/adql/db/TestFunctionDef.java @@ -2,6 +2,7 @@ package adql.db; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; diff --git a/test/adql/translator/TestJDBCTranslator.java b/test/adql/translator/TestJDBCTranslator.java index 3d8750e..c83dc56 100644 --- a/test/adql/translator/TestJDBCTranslator.java +++ b/test/adql/translator/TestJDBCTranslator.java @@ -41,7 +41,8 @@ public class TestJDBCTranslator { /* Ensure the translation from ADQL to SQL of strings is correct ; * particularly, ' should be escaped otherwise it would mean the end of a string in SQL *(the way to escape a such character is by doubling the character '): */ - try { + try{ +==== BASE ==== assertEquals("'SQL''s translation'", tr.translate(new StringConstant("SQL's translation"))); } catch(TranslationException e) { e.printStackTrace(System.err); -- GitLab