From 610639066c31085fd27de1c868828c4df373e25e Mon Sep 17 00:00:00 2001
From: gmantele <gmantele@ari.uni-heidelberg.de>
Date: Mon, 20 Feb 2017 18:51:29 +0100
Subject: [PATCH] [ADQL] Fix CentroidFunction's type and its PgSphere
 translation.

---
 .../function/geometry/CentroidFunction.java   |  8 +++---
 src/adql/translator/PgSphereTranslator.java   | 25 +++++++++++------
 .../geometry/TestCentroidFunction.java        | 28 +++++++++++++++++++
 .../translator/TestPgSphereTranslator.java    | 18 ++++++++++++
 4 files changed, 67 insertions(+), 12 deletions(-)
 create mode 100644 test/adql/query/operand/function/geometry/TestCentroidFunction.java

diff --git a/src/adql/query/operand/function/geometry/CentroidFunction.java b/src/adql/query/operand/function/geometry/CentroidFunction.java
index 23a2b78..049d9c3 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&eacute;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 6474ab3..358d79d 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&eacute;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 0000000..ee17950
--- /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 2f34471..346ed80 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();
-- 
GitLab