package adql.query.operand.function.geometry; /* * This file is part of ADQLLibrary. * * ADQLLibrary is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * ADQLLibrary is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * 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), * Astronomisches Rechen Institut (ARI) */ import adql.parser.ParseException; import adql.query.ADQLIterator; import adql.query.ADQLObject; import adql.query.TextPosition; import adql.query.operand.ADQLColumn; import adql.query.operand.ADQLOperand; import adql.query.operand.StringConstant; import adql.query.operand.function.ADQLFunction; /** * <p>It represents any geometric function of ADQL.</p> * * @author Grégory Mantelet (CDS;ARI) * @version 1.4 (06/2015) */ public abstract class GeometryFunction extends ADQLFunction { /** The coordinate system used to express the coordinates. */ protected ADQLOperand coordSys = null; /** * Builds a geometry function with no coordinate system. */ protected GeometryFunction(){ coordSys = null; } /** * Builds a geometry function with its coordinate system. * * @param coordSys A string operand which corresponds to a valid coordinate system. * @throws UnsupportedOperationException If this function is not associated with a coordinate system. * @throws NullPointerException If the given operand is <i>null</i>. * @throws Exception If the given operand is not a string. */ protected GeometryFunction(ADQLOperand coordSys) throws UnsupportedOperationException, NullPointerException, Exception{ setCoordinateSystem(coordSys); } /** * Builds a geometry function by copying the given one. * * @param toCopy The geometry function to copy. * @throws Exception If there is an error during the copy. */ protected GeometryFunction(GeometryFunction toCopy) throws Exception{ coordSys = (ADQLOperand)(toCopy.coordSys.getCopy()); setPosition((toCopy.getPosition() == null) ? null : new TextPosition(toCopy.getPosition())); } /** * Gets the used coordinate system. * * @return Its coordinate system. */ public ADQLOperand getCoordinateSystem(){ return coordSys; } /** * Changes the coordinate system. * * @param coordSys Its new coordinate system. * @throws UnsupportedOperationException If this function is not associated with a coordinate system. * @throws NullPointerException If the given operand is <i>null</i>. * @throws ParseException If the given operand is not a string. */ public void setCoordinateSystem(ADQLOperand coordSys) throws UnsupportedOperationException, NullPointerException, ParseException{ if (coordSys == null) this.coordSys = new StringConstant(""); else if (!coordSys.isString()) throw new ParseException("A coordinate system must be a string literal: \"" + coordSys.toADQL() + "\" is not a string operand!"); else{ this.coordSys = coordSys; setPosition(null); } } /** * This class represents a parameter of a geometry function * which, in general, is either a GeometryFunction or a Column. * * @author Grégory Mantelet (CDS;ARI) * @version 1.4 (06/2015) */ public static final class GeometryValue< F extends GeometryFunction > implements ADQLOperand { private ADQLColumn column; private F geomFunct; /** Position of this {@link GeometryValue} in the ADQL query string. * @since 1.4 */ private TextPosition position = null; public GeometryValue(ADQLColumn col) throws NullPointerException{ if (col == null) throw new NullPointerException("Impossible to build a GeometryValue without a column or a geometry function !"); setColumn(col); if (col.getPosition() != null) position = col.getPosition(); } public GeometryValue(F geometry) throws NullPointerException{ if (geometry == null) throw new NullPointerException("Impossible to build a GeometryValue without a column or a geometry function !"); setGeometry(geometry); if (geometry.getPosition() != null) position = geometry.getPosition(); } @SuppressWarnings("unchecked") public GeometryValue(GeometryValue<F> toCopy) throws Exception{ column = (toCopy.column == null) ? null : ((ADQLColumn)(toCopy.column.getCopy())); geomFunct = (toCopy.geomFunct == null) ? null : ((F)(toCopy.geomFunct.getCopy())); position = (toCopy.position == null) ? null : new TextPosition(toCopy.position); } public void setColumn(ADQLColumn col){ if (col != null){ geomFunct = null; column = col; position = (column.getPosition() != null) ? column.getPosition() : null; } } public void setGeometry(F geometry){ if (geometry != null){ column = null; geomFunct = geometry; position = (geomFunct.getPosition() != null) ? geomFunct.getPosition() : null; } } public ADQLOperand getValue(){ return (column != null) ? column : geomFunct; } public boolean isColumn(){ return column != null; } @Override public boolean isNumeric(){ return getValue().isNumeric(); } @Override public boolean isString(){ return getValue().isString(); } @Override public TextPosition getPosition(){ return position; } @Override public boolean isGeometry(){ return getValue().isGeometry(); } @Override public ADQLObject getCopy() throws Exception{ return new GeometryValue<F>(this); } @Override public String getName(){ return getValue().getName(); } @Override public ADQLIterator adqlIterator(){ return getValue().adqlIterator(); } @Override public String toADQL(){ return getValue().toADQL(); } } }