/*
* This file is part of rasdaman community.
*
* Rasdaman community is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Rasdaman community 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with rasdaman community. If not, see .
*
* Copyright 2003 - 2010 Peter Baumann / rasdaman GmbH.
*
* For more information please see
* or contact Peter Baumann via .
*/
package petascope.wcps.server.core;
import petascope.core.Metadata;
import petascope.exceptions.WCPSException;
import java.math.BigInteger;
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import org.w3c.dom.*;
import petascope.exceptions.PetascopeException;
public class ScalarExpr implements IRasNode, ICoverageInfo {
private IRasNode child;
private CoverageInfo info;
private boolean singleNumericValue = false;
private double dvalue;
public ScalarExpr(Node node, XmlQuery xq) throws WCPSException {
while ((node != null) && node.getNodeName().equals("#text")) {
node = node.getNextSibling();
}
// Try one of the groups
child = null;
// TODO: Implement class MetadataScalarExprType
// MetadataScalarExprType
if (child == null) {
try {
child = new MetadataScalarExpr(node, xq);
System.err.println("Matched metadata scalar expression.");
} catch (WCPSException e) {
System.err.println("Failed to match metadata scalar expression: "
+ e.toString() + "\nRetrying");
child = null;
}
}
// BooleanScalarExprType
if (child == null) {
try {
child = new BooleanScalarExpr(node, xq);
System.err.println("Matched boolean scalar expression.");
} catch (WCPSException e) {
System.err.println("Failed to match boolean scalar expression : "
+ e.toString() + "\nRetrying");
child = null;
}
}
// NumericScalarExprType
if (child == null) {
try {
child = new NumericScalarExpr(node, xq);
singleNumericValue = ((NumericScalarExpr) child).isSingleValue();
dvalue = ((NumericScalarExpr) child).getSingleValue();
System.err.println("Matched numeric scalar expression.");
} catch (WCPSException e) {
System.err.println("Failed to match numeric scalar expression : "
+ e.toString() + "\nRetrying");
child = null;
}
}
// ReduceScalarExprType
if (child == null) {
try {
child = new ReduceScalarExpr(node, xq);
System.err.println("Matched reduce scalar expression.");
} catch (WCPSException e) {
System.err.println("Failed to match reduce scalar expression: "
+ e.toString() + "\nRetrying");
child = null;
}
}
// StringScalarExprType
if (child == null) {
try {
child = new StringScalarExpr(node, xq);
System.err.println("Matched string scalar expression.");
} catch (WCPSException e) {
System.err.println("Failed to match string scalar expression: "
+ e.toString() + "\nRetrying");
child = null;
}
}
// Error check
if (child == null) {
throw new WCPSException("Invalid coverage Expression, next node: "
+ node.getNodeName());
}
Metadata meta = createScalarExprMetadata(xq);
info = new CoverageInfo(meta);
}
public String toRasQL() {
return child.toRasQL();
}
public CoverageInfo getCoverageInfo() {
return info;
}
/** Builds full metadata for the newly constructed coverage **/
private Metadata createScalarExprMetadata(XmlQuery xq) throws WCPSException {
List cellDomainList = new LinkedList();
List rangeList = new LinkedList();
HashSet nullSet = new HashSet();
String nullDefault = "0";
nullSet.add(nullDefault);
HashSet interpolationSet = new HashSet();
InterpolationMethod interpolationDefault = new InterpolationMethod("none", "none");
interpolationSet.add(interpolationDefault);
String coverageName = "scalarExpr";
List domainList = new LinkedList();
// Build domain metadata
cellDomainList.add(new CellDomainElement(new BigInteger("1"), new BigInteger("1")));
String crs = DomainElement.IMAGE_CRS;
HashSet crsset = new HashSet();
crsset.add(crs);
Collection allowedAxes = xq.getMetadataSource().getAxisNames();
DomainElement domain = new DomainElement("x", "x", 1.0, 1.0, null, null, crsset, allowedAxes, null);
domainList.add(domain);
// "unsigned int" is default datatype
rangeList.add(new RangeElement("dynamic_type", "unsigned int", null));
try {
Metadata metadata = new Metadata(cellDomainList, rangeList, nullSet,
nullDefault, interpolationSet, interpolationDefault,
coverageName, "GridCoverage", domainList, null); // FIXME
return metadata;
} catch (PetascopeException ex) {
throw (WCPSException) ex;
}
}
public boolean isSingleValue() {
return singleNumericValue;
}
public double getSingleValue() {
return dvalue;
}
}