package adql.translator;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.sql.Types;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.postgresql.util.PGobject;
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 {
@BeforeClass
public static void setUpBeforeClass() throws Exception{}
@AfterClass
public static void tearDownAfterClass() throws Exception{}
@Before
public void setUp() throws Exception{}
@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();
// POINT
DBType type = translator.convertTypeFromDB(Types.OTHER, "spoint", "spoint", null);
assertNotNull(type);
assertEquals(DBDatatype.POINT, type.type);
assertEquals(DBType.NO_LENGTH, type.length);
// CIRCLE
type = translator.convertTypeFromDB(Types.OTHER, "scircle", "scircle", null);
assertNotNull(type);
assertEquals(DBDatatype.REGION, type.type);
assertEquals(DBType.NO_LENGTH, type.length);
// BOX
type = translator.convertTypeFromDB(Types.OTHER, "sbox", "sbox", null);
assertNotNull(type);
assertEquals(DBDatatype.REGION, type.type);
assertEquals(DBType.NO_LENGTH, type.length);
// POLYGON
type = translator.convertTypeFromDB(Types.OTHER, "spoly", "spoly", null);
assertNotNull(type);
assertEquals(DBDatatype.REGION, type.type);
assertEquals(DBType.NO_LENGTH, type.length);
}
@Test
public void testConvertTypeToDB(){
PgSphereTranslator translator = new PgSphereTranslator();
// NULL
assertEquals("VARCHAR", translator.convertTypeToDB(null));
// POINT
assertEquals("spoint", translator.convertTypeToDB(new DBType(DBDatatype.POINT)));
// REGION (any other region is transformed into a polygon)
assertEquals("spoly", translator.convertTypeToDB(new DBType(DBDatatype.REGION)));
}
@Test
public void testTranslateGeometryFromDB(){
PgSphereTranslator translator = new PgSphereTranslator();
PGobject pgo = new PGobject();
// NULL
try{
assertNull(translator.translateGeometryFromDB(null));
}catch(Throwable t){
t.printStackTrace();
fail(t.getMessage());
}
// SPOINT
try{
pgo.setType("spoint");
pgo.setValue("(0.1 , 0.2)");
Region r = translator.translateGeometryFromDB(pgo);
assertEquals(5.72957, r.coordinates[0][0], 1e-5);
assertEquals(11.45915, r.coordinates[0][1], 1e-5);
pgo.setValue("(5.72957d , 11.45915d)");
r = translator.translateGeometryFromDB(pgo);
assertEquals(5.72957, r.coordinates[0][0], 1e-5);
assertEquals(11.45915, r.coordinates[0][1], 1e-5);
pgo.setValue("( 5d 43m 46.480625s , +11d 27m 32.961249s)");
r = translator.translateGeometryFromDB(pgo);
assertEquals(5.72957, r.coordinates[0][0], 1e-5);
assertEquals(11.45915, r.coordinates[0][1], 1e-5);
pgo.setValue("( 0h 22m 55.098708s , +11d 27m 32.961249s)");
r = translator.translateGeometryFromDB(pgo);
assertEquals(5.72957, r.coordinates[0][0], 1e-5);
assertEquals(11.45915, r.coordinates[0][1], 1e-5);
}catch(Throwable t){
t.printStackTrace();
fail(t.getMessage());
}
// SCIRCLE
try{
pgo.setType("scircle");
pgo.setValue("<(0.1,-0.2),1>");
Region r = translator.translateGeometryFromDB(pgo);
assertEquals(5.72957, r.coordinates[0][0], 1e-5);
assertEquals(-11.45915, r.coordinates[0][1], 1e-5);
assertEquals(57.29577, r.radius, 1e-5);
pgo.setValue("<(5.72957d , -11.45915d) , 57.29577d>");
r = translator.translateGeometryFromDB(pgo);
assertEquals(5.72957, r.coordinates[0][0], 1e-5);
assertEquals(-11.45915, r.coordinates[0][1], 1e-5);
assertEquals(57.29577, r.radius, 1e-5);
pgo.setValue("<( 5d 43m 46.452s , -11d 27m 32.94s) , 57d 17m 44.772s>");
r = translator.translateGeometryFromDB(pgo);
assertEquals(5.72957, r.coordinates[0][0], 1e-5);
assertEquals(-11.45915, r.coordinates[0][1], 1e-5);
assertEquals(57.29577, r.radius, 1e-5);
pgo.setValue("<( 0h 22m 55.0968s , -11d 27m 32.94s) , 57d 17m 44.772s>");
r = translator.translateGeometryFromDB(pgo);
assertEquals(5.72957, r.coordinates[0][0], 1e-5);
assertEquals(-11.45915, r.coordinates[0][1], 1e-5);
assertEquals(57.29577, r.radius, 1e-5);
}catch(Throwable t){
t.printStackTrace();
fail(t.getMessage());
}
// SBOX
try{
pgo.setType("sbox");
pgo.setValue("((0.1,0.2),(0.5,0.5))");
Region r = translator.translateGeometryFromDB(pgo);
assertEquals(17.18873, r.coordinates[0][0], 1e-5);
assertEquals(20.05352, r.coordinates[0][1], 1e-5);
assertEquals(22.91831, r.width, 1e-5);
assertEquals(17.18873, r.height, 1e-5);
pgo.setValue("((5.72957795130823d , 11.4591559026165d), (28.6478897565412d , 28.6478897565412d))");
r = translator.translateGeometryFromDB(pgo);
assertEquals(17.18873, r.coordinates[0][0], 1e-5);
assertEquals(20.05352, r.coordinates[0][1], 1e-5);
assertEquals(22.91831, r.width, 1e-5);
assertEquals(17.18873, r.height, 1e-5);
pgo.setValue("(( 5d 43m 46.480625s , +11d 27m 32.961249s), ( 28d 38m 52.403124s , +28d 38m 52.403124s))");
r = translator.translateGeometryFromDB(pgo);
assertEquals(17.18873, r.coordinates[0][0], 1e-5);
assertEquals(20.05352, r.coordinates[0][1], 1e-5);
assertEquals(22.91831, r.width, 1e-5);
assertEquals(17.18873, r.height, 1e-5);
pgo.setValue("(( 0h 22m 55.098708s , +11d 27m 32.961249s), ( 1h 54m 35.493542s , +28d 38m 52.403124s))");
r = translator.translateGeometryFromDB(pgo);
assertEquals(17.18873, r.coordinates[0][0], 1e-5);
assertEquals(20.05352, r.coordinates[0][1], 1e-5);
assertEquals(22.91831, r.width, 1e-5);
assertEquals(17.18873, r.height, 1e-5);
}catch(Throwable t){
t.printStackTrace();
fail(t.getMessage());
}
// SPOLY
try{
pgo.setType("spoly");
pgo.setValue("{(0.789761486527434 , 0.00436332312998582),(0.789761486527434 , 0.00872664625997165),(0.785398163397448 , 0.00872664625997165),(0.785398163397448 , 0.00436332312998582),(0.781034840267463 , 0.00436332312998582),(0.781034840267463 , 0),(0.785398163397448 , 0)}");
Region r = translator.translateGeometryFromDB(pgo);
assertEquals(45.25, r.coordinates[0][0], 1e-2);
assertEquals(0.25, r.coordinates[0][1], 1e-2);
assertEquals(45.25, r.coordinates[1][0], 1e-2);
assertEquals(0.5, r.coordinates[1][1], 1e-2);
assertEquals(45, r.coordinates[2][0], 1e-2);
assertEquals(0.5, r.coordinates[2][1], 1e-2);
assertEquals(45, r.coordinates[3][0], 1e-2);
assertEquals(0.25, r.coordinates[3][1], 1e-2);
assertEquals(44.75, r.coordinates[4][0], 1e-2);
assertEquals(0.25, r.coordinates[4][1], 1e-2);
assertEquals(44.75, r.coordinates[5][0], 1e-2);
assertEquals(0, r.coordinates[5][1], 1e-2);
assertEquals(45, r.coordinates[6][0], 1e-2);
assertEquals(0, r.coordinates[6][1], 1e-2);
pgo.setValue("{(45.25d , 0.25d), (45.25d , 0.5d), (45d , 0.5d), (45d , 0.25d), (44.75d , 0.25d), (44.75d , 0d), (45d , 0d)}");
r = translator.translateGeometryFromDB(pgo);
assertEquals(45.25, r.coordinates[0][0], 1e-2);
assertEquals(0.25, r.coordinates[0][1], 1e-2);
assertEquals(45.25, r.coordinates[1][0], 1e-2);
assertEquals(0.5, r.coordinates[1][1], 1e-2);
assertEquals(45, r.coordinates[2][0], 1e-2);
assertEquals(0.5, r.coordinates[2][1], 1e-2);
assertEquals(45, r.coordinates[3][0], 1e-2);
assertEquals(0.25, r.coordinates[3][1], 1e-2);
assertEquals(44.75, r.coordinates[4][0], 1e-2);
assertEquals(0.25, r.coordinates[4][1], 1e-2);
assertEquals(44.75, r.coordinates[5][0], 1e-2);
assertEquals(0, r.coordinates[5][1], 1e-2);
assertEquals(45, r.coordinates[6][0], 1e-2);
assertEquals(0, r.coordinates[6][1], 1e-2);
pgo.setValue("{( 45d 15m 0s , + 0d 15m 0s),( 45d 15m 0s , + 0d 30m 0s),( 45d 0m 0s , + 0d 30m 0s),( 45d 0m 0s , + 0d 15m 0s),( 44d 45m 0s , + 0d 15m 0s),( 44d 45m 0s , + 0d 0m 0s),( 45d 0m 0s , + 0d 0m 0s)}");
r = translator.translateGeometryFromDB(pgo);
assertEquals(45.25, r.coordinates[0][0], 1e-2);
assertEquals(0.25, r.coordinates[0][1], 1e-2);
assertEquals(45.25, r.coordinates[1][0], 1e-2);
assertEquals(0.5, r.coordinates[1][1], 1e-2);
assertEquals(45, r.coordinates[2][0], 1e-2);
assertEquals(0.5, r.coordinates[2][1], 1e-2);
assertEquals(45, r.coordinates[3][0], 1e-2);
assertEquals(0.25, r.coordinates[3][1], 1e-2);
assertEquals(44.75, r.coordinates[4][0], 1e-2);
assertEquals(0.25, r.coordinates[4][1], 1e-2);
assertEquals(44.75, r.coordinates[5][0], 1e-2);
assertEquals(0, r.coordinates[5][1], 1e-2);
assertEquals(45, r.coordinates[6][0], 1e-2);
assertEquals(0, r.coordinates[6][1], 1e-2);
pgo.setValue("{( 3h 1m 0s , + 0d 15m 0s),( 3h 1m 0s , + 0d 30m 0s),( 3h 0m 0s , + 0d 30m 0s),( 3h 0m 0s , + 0d 15m 0s),( 2h 59m 0s , + 0d 15m 0s),( 2h 59m 0s , + 0d 0m 0s),( 3h 0m 0s , + 0d 0m 0s)}");
r = translator.translateGeometryFromDB(pgo);
assertEquals(45.25, r.coordinates[0][0], 1e-2);
assertEquals(0.25, r.coordinates[0][1], 1e-2);
assertEquals(45.25, r.coordinates[1][0], 1e-2);
assertEquals(0.5, r.coordinates[1][1], 1e-2);
assertEquals(45, r.coordinates[2][0], 1e-2);
assertEquals(0.5, r.coordinates[2][1], 1e-2);
assertEquals(45, r.coordinates[3][0], 1e-2);
assertEquals(0.25, r.coordinates[3][1], 1e-2);
assertEquals(44.75, r.coordinates[4][0], 1e-2);
assertEquals(0.25, r.coordinates[4][1], 1e-2);
assertEquals(44.75, r.coordinates[5][0], 1e-2);
assertEquals(0, r.coordinates[5][1], 1e-2);
assertEquals(45, r.coordinates[6][0], 1e-2);
assertEquals(0, r.coordinates[6][1], 1e-2);
}catch(Throwable t){
t.printStackTrace();
fail(t.getMessage());
}
// OTHER
try{
translator.translateGeometryFromDB(new Double(12.3));
fail("The translation of a Double as a geometry is not supported!");
}catch(Throwable t){
assertTrue(t instanceof ParseException);
assertEquals("Incompatible type! The column value \"12.3\" was supposed to be a geometrical object.", t.getMessage());
}
try{
pgo.setType("sline");
pgo.setValue("( -90d, -20d, 200d, XYZ ), 30d ");
translator.translateGeometryFromDB(pgo);
fail("The translation of a sline is not supported!");
}catch(Throwable t){
assertTrue(t instanceof ParseException);
assertEquals("Unsupported PgSphere type: \"sline\"! Impossible to convert the column value \"( -90d, -20d, 200d, XYZ ), 30d \" into a Region.", t.getMessage());
}
}
@Test
public void testTranslateGeometryToDB(){
PgSphereTranslator translator = new PgSphereTranslator();
try{
// NULL
assertNull(translator.translateGeometryToDB(null));
// POSITION
Region r = new Region(null, new double[]{45,0});
PGobject pgo = (PGobject)translator.translateGeometryToDB(r);
assertNotNull(pgo);
assertEquals("spoint", pgo.getType());
assertEquals("(45.0d,0.0d)", pgo.getValue());
// CIRCLE
r = new Region(null, new double[]{45,0}, 1.2);
pgo = (PGobject)translator.translateGeometryToDB(r);
assertNotNull(pgo);
assertEquals("spoly", pgo.getType());
assertEquals("{(46.2d,0.0d),(46.176942336483876d,0.2341083864193539d),(46.108655439013546d,0.4592201188381077d),(45.99776353476305d,0.6666842796235226d),(45.848528137423855d,0.8485281374238569d),(45.666684279623524d,0.9977635347630542d),(45.45922011883811d,1.1086554390135441d),(45.23410838641935d,1.1769423364838765d),(45.0d,1.2d),(44.76589161358065d,1.1769423364838765d),(44.54077988116189d,1.1086554390135441d),(44.333315720376476d,0.9977635347630543d),(44.151471862576145d,0.848528137423857d),(44.00223646523695d,0.6666842796235226d),(43.891344560986454d,0.4592201188381073d),(43.823057663516124d,0.23410838641935325d),(43.8d,-9.188564877424678E-16d),(43.823057663516124d,-0.23410838641935505d),(43.891344560986454d,-0.45922011883810904d),(44.00223646523695d,-0.6666842796235241d),(44.151471862576145d,-0.8485281374238584d),(44.333315720376476d,-0.9977635347630555d),(44.540779881161896d,-1.108655439013545d),(44.76589161358065d,-1.176942336483877d),(45.0d,-1.2d),(45.23410838641936d,-1.1769423364838758d),(45.45922011883811d,-1.1086554390135428d),(45.666684279623524d,-0.9977635347630521d),(45.84852813742386d,-0.8485281374238541d),(45.99776353476306d,-0.6666842796235192d),(46.108655439013546d,-0.45922011883810354d),(46.176942336483876d,-0.23410838641934922d)}", pgo.getValue());
// BOX
r = new Region(null, new double[]{45,0}, 1.2, 5);
pgo = (PGobject)translator.translateGeometryToDB(r);
assertNotNull(pgo);
assertEquals("spoly", pgo.getType());
assertEquals("{(44.4d,-2.5d),(44.4d,2.5d),(45.6d,2.5d),(45.6d,-2.5d)}", pgo.getValue());
// POLYGON
r = new Region(null, new double[][]{new double[]{45.25,0.25},new double[]{45.25,0.5},new double[]{45,0.5},new double[]{45,0.25},new double[]{44.75,0.25},new double[]{44.75,0},new double[]{45,0}});
pgo = (PGobject)translator.translateGeometryToDB(r);
assertNotNull(pgo);
assertEquals("spoly", pgo.getType());
assertEquals("{(45.25d,0.25d),(45.25d,0.5d),(45.0d,0.5d),(45.0d,0.25d),(44.75d,0.25d),(44.75d,0.0d),(45.0d,0.0d)}", pgo.getValue());
// OTHER
try{
r = new Region(new Region(null, new double[]{45,0}));
translator.translateGeometryToDB(r);
fail("The translation of a STC Not region is not supported!");
}catch(Throwable ex){
assertTrue(ex instanceof ParseException);
assertEquals("Unsupported geometrical region: \"" + r.type + "\"!", ex.getMessage());
}
}catch(ParseException t){
t.printStackTrace();
fail(t.getMessage());
}
}
}