diff options
Diffstat (limited to 'petascope/src/petascope/wcps/server/core/NumericScalarExpr.java')
-rw-r--r-- | petascope/src/petascope/wcps/server/core/NumericScalarExpr.java | 306 |
1 files changed, 152 insertions, 154 deletions
diff --git a/petascope/src/petascope/wcps/server/core/NumericScalarExpr.java b/petascope/src/petascope/wcps/server/core/NumericScalarExpr.java index 67b21b2..2b09e4f 100644 --- a/petascope/src/petascope/wcps/server/core/NumericScalarExpr.java +++ b/petascope/src/petascope/wcps/server/core/NumericScalarExpr.java @@ -14,161 +14,159 @@ * You should have received a copy of the GNU General Public License * along with rasdaman community. If not, see <http://www.gnu.org/licenses/>. * - * Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 Peter Baumann / - rasdaman GmbH. + * Copyright 2003 - 2010 Peter Baumann / rasdaman GmbH. * * For more information please see <http://www.rasdaman.org> * or contact Peter Baumann via <baumann@rasdaman.com>. */ -package petascope.wcps.server.core;
-
-import petascope.wcps.server.exceptions.InvalidCrsException;
-import petascope.wcps.server.exceptions.WCPSException;
-import org.w3c.dom.*;
-
-public class NumericScalarExpr implements IRasNode {
-
- private IRasNode first, second;
- private String op, value;
- private boolean twoChildren;
- private double dvalue;
-
- public NumericScalarExpr(Node node, XmlQuery xq) throws WCPSException, InvalidCrsException {
- twoChildren = false;
- String nodeName = node.getNodeName();
-
- op = "";
-
- System.err.println("Trying to parse numeric scalar expression ...");
-
- while ((node != null) && node.getNodeName().equals("#text")) {
- node = node.getNextSibling();
- }
-
- if (nodeName.equals("numericConstant")) {
- twoChildren = false;
- op = code(nodeName);
- value = node.getFirstChild().getNodeValue();
- try {
- dvalue = Double.parseDouble(value);
- } catch (NumberFormatException e) {
- throw new WCPSException("Could not understand constant: " + value);
- }
- } else if (nodeName.equals("complexConstant")
- || nodeName.equals("condense")
- || nodeName.equals("reduce")) {
- op = code(nodeName);
- twoChildren = false;
- if (nodeName.equals("complexConstant")) {
- first = new ComplexConstant(node, xq);
- }
- if (nodeName.equals("condense")) {
- first = new CondenseScalarExpr(node, xq);
- }
- if (nodeName.equals("reduce")) {
- first = new ReduceScalarExpr(node, xq);
- }
- } else if (nodeName.equals("numericUnaryMinus")
- || nodeName.equals("numericSqrt")
- || nodeName.equals("numericAbs")) {
- op = code(nodeName);
- twoChildren = false;
- first = new NumericScalarExpr(node.getFirstChild(), xq);
- } else if (nodeName.equals("numericAdd")
- || nodeName.equals("numericMinus")
- || nodeName.equals("numericMult")
- || nodeName.equals("numericDiv")) {
- try {
- op = code(nodeName);
- twoChildren = true;
- Node child = node.getFirstChild();
- first = new NumericScalarExpr(child, xq);
- second = new NumericScalarExpr(child.getNextSibling(), xq);
- } catch (WCPSException e) {
- System.err.println("Failed to parse a numeric expression pair !");
- }
- } else if (nodeName.equals("variableRef")) {
- try {
- op = code(nodeName);
- twoChildren = false;
- first = new VariableReference(node, xq);
- System.err.println("Matched variable reference: " + first.toRasQL());
- } catch (WCPSException e) {
- System.err.println("Failed to match variable reference: "
- + e.toString());
- }
- } else {
- throw new WCPSException("Unexpected Numeric Scalar Expression node : "
- + node.getNodeName());
- }
- }
-
- public String toRasQL() {
- String result = "";
- if (twoChildren == false)
- {
- if (op.equals("variable")) {
- result = first.toRasQL();
- } else if (op.equals("value")) {
- result = value;
- } else if (op.equals("-")) {
- result = "-" + first.toRasQL();
- } else if (op.equals("sqrt")) {
- result = "sqrt(" + first.toRasQL() + ")";
- } else if (op.equals("child")) {
- result = first.toRasQL();
- } else if (op.equals("abs")) {
- result = "abs(" + first.toRasQL() + ")";
- }
- }else if (twoChildren == true) {
- result = "(" + first.toRasQL() + ")" + op
- + "(" + second.toRasQL() + ")";
- } else {
- return " error ";
- }
-
- return result;
- }
-
- private String code(String name) {
- String op = "";
- if (name.equals("numericConstant")) {
- op = "value";
- }
- if (name.equals("numericUnaryMinus") || name.equals("numericMinus")) {
- op = "-";
- }
- if (name.equals("numericAdd")) {
- op = "+";
- }
- if (name.equals("numericMult")) {
- op = "*";
- }
- if (name.equals("numericDiv")) {
- op = "/";
- }
- if (name.equals("numericSqrt")) {
- op = "sqrt";
- }
- if (name.equals("numericAbs")) {
- op = "abs";
- }
- if (name.equals("condense") || name.equals("reduce")
- || name.equals("complexConstant")) {
- op = "child";
- }
- if (name.equals("variableRef")) {
- op = "variable";
- }
-
- return op;
- }
-
- public boolean isSingleValue() {
- return op.equals("value");
- }
-
- public double getSingleValue() {
- return dvalue;
- }
-}
+package petascope.wcps.server.core; + +import petascope.exceptions.WCPSException; +import org.w3c.dom.*; + +public class NumericScalarExpr implements IRasNode { + + private IRasNode first, second; + private String op, value; + private boolean twoChildren; + private double dvalue; + + public NumericScalarExpr(Node node, XmlQuery xq) throws WCPSException { + twoChildren = false; + String nodeName = node.getNodeName(); + + op = ""; + + System.err.println("Trying to parse numeric scalar expression ..."); + + while ((node != null) && node.getNodeName().equals("#text")) { + node = node.getNextSibling(); + } + + if (nodeName.equals("numericConstant")) { + twoChildren = false; + op = code(nodeName); + value = node.getFirstChild().getNodeValue(); + try { + dvalue = Double.parseDouble(value); + } catch (NumberFormatException e) { + throw new WCPSException("Could not understand constant: " + value); + } + } else if (nodeName.equals("complexConstant") + || nodeName.equals("condense") + || nodeName.equals("reduce")) { + op = code(nodeName); + twoChildren = false; + if (nodeName.equals("complexConstant")) { + first = new ComplexConstant(node, xq); + } + if (nodeName.equals("condense")) { + first = new CondenseScalarExpr(node, xq); + } + if (nodeName.equals("reduce")) { + first = new ReduceScalarExpr(node, xq); + } + } else if (nodeName.equals("numericUnaryMinus") + || nodeName.equals("numericSqrt") + || nodeName.equals("numericAbs")) { + op = code(nodeName); + twoChildren = false; + first = new NumericScalarExpr(node.getFirstChild(), xq); + } else if (nodeName.equals("numericAdd") + || nodeName.equals("numericMinus") + || nodeName.equals("numericMult") + || nodeName.equals("numericDiv")) { + try { + op = code(nodeName); + twoChildren = true; + Node child = node.getFirstChild(); + first = new NumericScalarExpr(child, xq); + second = new NumericScalarExpr(child.getNextSibling(), xq); + } catch (WCPSException e) { + System.err.println("Failed to parse a numeric expression pair !"); + } + } else if (nodeName.equals("variableRef")) { + try { + op = code(nodeName); + twoChildren = false; + first = new VariableReference(node, xq); + System.err.println("Matched variable reference: " + first.toRasQL()); + } catch (WCPSException e) { + System.err.println("Failed to match variable reference: " + + e.toString()); + } + } else { + throw new WCPSException("Unexpected Numeric Scalar Expression node : " + + node.getNodeName()); + } + } + + public String toRasQL() { + String result = ""; + if (twoChildren == false) + { + if (op.equals("variable")) { + result = first.toRasQL(); + } else if (op.equals("value")) { + result = value; + } else if (op.equals("-")) { + result = "-" + first.toRasQL(); + } else if (op.equals("sqrt")) { + result = "sqrt(" + first.toRasQL() + ")"; + } else if (op.equals("child")) { + result = first.toRasQL(); + } else if (op.equals("abs")) { + result = "abs(" + first.toRasQL() + ")"; + } + }else if (twoChildren == true) { + result = "(" + first.toRasQL() + ")" + op + + "(" + second.toRasQL() + ")"; + } else { + return " error "; + } + + return result; + } + + private String code(String name) { + String op = ""; + if (name.equals("numericConstant")) { + op = "value"; + } + if (name.equals("numericUnaryMinus") || name.equals("numericMinus")) { + op = "-"; + } + if (name.equals("numericAdd")) { + op = "+"; + } + if (name.equals("numericMult")) { + op = "*"; + } + if (name.equals("numericDiv")) { + op = "/"; + } + if (name.equals("numericSqrt")) { + op = "sqrt"; + } + if (name.equals("numericAbs")) { + op = "abs"; + } + if (name.equals("condense") || name.equals("reduce") + || name.equals("complexConstant")) { + op = "child"; + } + if (name.equals("variableRef")) { + op = "variable"; + } + + return op; + } + + public boolean isSingleValue() { + return op.equals("value"); + } + + public double getSingleValue() { + return dvalue; + } +} |