diff --git a/src/adql/query/operand/function/geometry/CentroidFunction.java b/src/adql/query/operand/function/geometry/CentroidFunction.java index 23a2b7852972ed5df64646e54739db87b29842b0..049d9c38ecf2d889b8503dbd7d3b2bb0df729b4c 100644 --- a/src/adql/query/operand/function/geometry/CentroidFunction.java +++ b/src/adql/query/operand/function/geometry/CentroidFunction.java @@ -16,7 +16,7 @@ package adql.query.operand.function.geometry; * You should have received a copy of the GNU Lesser General Public License * along with ADQLLibrary. If not, see <http://www.gnu.org/licenses/>. * - * Copyright 2012-2015 - UDS/Centre de Données astronomiques de Strasbourg (CDS), + * Copyright 2012-2017 - UDS/Centre de Données astronomiques de Strasbourg (CDS), * Astronomisches Rechen Institut (ARI) */ @@ -36,7 +36,7 @@ import adql.query.operand.ADQLOperand; * </i></p> * * @author Grégory Mantelet (CDS;ARI) - * @version 1.4 (06/2015) + * @version 1.4 (02/2017) */ public class CentroidFunction extends GeometryFunction { @@ -80,7 +80,7 @@ public class CentroidFunction extends GeometryFunction { @Override public boolean isNumeric(){ - return true; + return false; } @Override @@ -90,7 +90,7 @@ public class CentroidFunction extends GeometryFunction { @Override public boolean isGeometry(){ - return false; + return true; } @Override diff --git a/src/adql/translator/PgSphereTranslator.java b/src/adql/translator/PgSphereTranslator.java index 6474ab34bea48921ee21b66dba4c853b8ac00732..358d79d79f20814dee9f4ee92f879e5ae63d0c6b 100644 --- a/src/adql/translator/PgSphereTranslator.java +++ b/src/adql/translator/PgSphereTranslator.java @@ -16,7 +16,7 @@ package adql.translator; * You should have received a copy of the GNU Lesser General Public License * along with ADQLLibrary. If not, see <http://www.gnu.org/licenses/>. * - * Copyright 2012-2015 - UDS/Centre de Données astronomiques de Strasbourg (CDS), + * Copyright 2012-2017 - UDS/Centre de Données astronomiques de Strasbourg (CDS), * Astronomisches Rechen Institut (ARI) */ @@ -34,6 +34,7 @@ import adql.query.constraint.Comparison; import adql.query.constraint.ComparisonOperator; import adql.query.operand.function.geometry.AreaFunction; import adql.query.operand.function.geometry.BoxFunction; +import adql.query.operand.function.geometry.CentroidFunction; import adql.query.operand.function.geometry.CircleFunction; import adql.query.operand.function.geometry.ContainsFunction; import adql.query.operand.function.geometry.DistanceFunction; @@ -48,7 +49,7 @@ import adql.query.operand.function.geometry.PolygonFunction; * The other functions are managed by {@link PostgreSQLTranslator}.</p> * * @author Grégory Mantelet (CDS;ARI) - * @version 1.4 (07/2015) + * @version 1.4 (07/2017) */ public class PgSphereTranslator extends PostgreSQLTranslator { @@ -72,7 +73,7 @@ public class PgSphereTranslator extends PostgreSQLTranslator { * Builds a PgSphereTranslator which always translates in SQL all identifiers (schema, table and column) in the specified case sensitivity ; * in other words, schema, table and column names will all be surrounded or not by double quotes in the SQL translation. * - * @param allCaseSensitive <i>true</i> to translate all identifiers in a case sensitive manner (surrounded by double quotes), <i>false</i> for case insensitivity. + * @param allCaseSensitive <i>true</i> to translate all identifiers in a case sensitive manner (surrounded by double quotes), <i>false</i> for case insensitivity. * * @see PostgreSQLTranslator#PostgreSQLTranslator(boolean) */ @@ -174,6 +175,13 @@ public class PgSphereTranslator extends PostgreSQLTranslator { return str.toString(); } + @Override + public String translate(CentroidFunction centroidFunction) throws TranslationException{ + StringBuffer str = new StringBuffer("center("); + str.append(translate(centroidFunction.getParameter(0))).append(")"); + return str.toString(); + } + @Override public String translate(ContainsFunction fct) throws TranslationException{ StringBuffer str = new StringBuffer("("); @@ -245,7 +253,7 @@ public class PgSphereTranslator extends PostgreSQLTranslator { String objType = pgo.getType().toLowerCase(); String geomStr = pgo.getValue(); - /* Only spoint, scircle, sbox and spoly are supported ; + /* Only spoint, scircle, sbox and spoly are supported ; * these geometries are parsed and transformed in Region instances:*/ if (objType.equals("spoint")) return (new PgSphereGeometryParser()).parsePoint(geomStr); @@ -434,7 +442,7 @@ public class PgSphereTranslator extends PostgreSQLTranslator { * Finalize the parsing. * No more characters (except eventually some space characters) should remain in the PgSphere expression to parse. * - * @throws ParseException If other non-space characters remains. + * @throws ParseException If other non-space characters remains. */ private void end() throws ParseException{ // Skip all spaces: @@ -451,7 +459,7 @@ public class PgSphereTranslator extends PostgreSQLTranslator { } /** - * Tool function which skips all next space characters until the next meaningful characters. + * Tool function which skips all next space characters until the next meaningful characters. */ private void skipSpaces(){ while(pos < expr.length() && Character.isWhitespace(expr.charAt(pos))) @@ -555,7 +563,7 @@ public class PgSphereTranslator extends PostgreSQLTranslator { } /** - * Internal spoint parsing function. It parses the PgSphere expression stored in this parser as a point. + * Internal spoint parsing function. It parses the PgSphere expression stored in this parser as a point. * * @return The ra and dec coordinates (in degrees) of the parsed point. * @@ -624,7 +632,8 @@ public class PgSphereTranslator extends PostgreSQLTranslator { end(); // Build the STC Box region: - double width = Math.abs(northeast[0] - southwest[0]), height = Math.abs(northeast[1] - southwest[1]); + double width = Math.abs(northeast[0] - southwest[0]), + height = Math.abs(northeast[1] - southwest[1]); double[] center = new double[]{northeast[0] - width / 2,northeast[1] - height / 2}; return new Region(null, center, width, height); } diff --git a/test/adql/query/operand/function/geometry/TestCentroidFunction.java b/test/adql/query/operand/function/geometry/TestCentroidFunction.java new file mode 100644 index 0000000000000000000000000000000000000000..ee1795015d8e2895a11b568f3734265182f3f01c --- /dev/null +++ b/test/adql/query/operand/function/geometry/TestCentroidFunction.java @@ -0,0 +1,28 @@ +package adql.query.operand.function.geometry; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.junit.Test; + +import adql.query.operand.NumericConstant; +import adql.query.operand.StringConstant; +import adql.query.operand.function.geometry.GeometryFunction.GeometryValue; + +public class TestCentroidFunction { + + @Test + public void testIsGeometry(){ + try{ + CentroidFunction centfc = new CentroidFunction(new GeometryValue<GeometryFunction>(new CircleFunction(new StringConstant("ICRS"), new NumericConstant(128.23), new NumericConstant(0.53), new NumericConstant(2)))); + assertTrue(centfc.isGeometry()); + assertFalse(centfc.isNumeric()); + assertFalse(centfc.isString()); + }catch(Throwable t){ + t.printStackTrace(System.err); + fail("An error occured while building a simple CentroidFunction! (see the console for more details)"); + } + } + +} diff --git a/test/adql/translator/TestPgSphereTranslator.java b/test/adql/translator/TestPgSphereTranslator.java index 2f34471fc7be78303a7945fee526c63fb425e71f..346ed8057c2558b1aa57ef828d04e55872fd19c6 100644 --- a/test/adql/translator/TestPgSphereTranslator.java +++ b/test/adql/translator/TestPgSphereTranslator.java @@ -19,6 +19,12 @@ import adql.db.DBType; import adql.db.DBType.DBDatatype; import adql.db.STCS.Region; import adql.parser.ParseException; +import adql.query.operand.NumericConstant; +import adql.query.operand.StringConstant; +import adql.query.operand.function.geometry.CentroidFunction; +import adql.query.operand.function.geometry.CircleFunction; +import adql.query.operand.function.geometry.GeometryFunction; +import adql.query.operand.function.geometry.GeometryFunction.GeometryValue; public class TestPgSphereTranslator { @@ -34,6 +40,18 @@ public class TestPgSphereTranslator { @After public void tearDown() throws Exception{} + @Test + public void testTranslateCentroidFunction(){ + try{ + PgSphereTranslator translator = new PgSphereTranslator(); + CentroidFunction centfc = new CentroidFunction(new GeometryValue<GeometryFunction>(new CircleFunction(new StringConstant("ICRS"), new NumericConstant(128.23), new NumericConstant(0.53), new NumericConstant(2)))); + assertEquals("center(scircle(spoint(radians(128.23),radians(0.53)),radians(2)))", translator.translate(centfc)); + }catch(Throwable t){ + t.printStackTrace(System.err); + fail("An error occured while building a simple CentroidFunction! (see the console for more details)"); + } + } + @Test public void testConvertTypeFromDB(){ PgSphereTranslator translator = new PgSphereTranslator();