/* * Copyright (c) 2013, OpenCloudDB/MyCAT and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software;Designed and Developed mainly by many Chinese * opensource volunteers. you can redistribute it and/or modify it under the * terms of the GNU General Public License version 2 only, as published by the * Free Software Foundation. * * This code 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 * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Any questions about this component can be directed to it's project Web address * https://code.google.com/p/opencloudb/. * */ package com.akiban.sql.parser; import com.akiban.sql.StandardException; import com.akiban.sql.types.ValueClassName; /** * A BinaryOperatorNode represents a built-in binary operator as defined by * the ANSI/ISO SQL standard. This covers operators like +, -, *, /, =, <, etc. * Java operators are not represented here: the JSQL language allows Java * methods to be called from expressions, but not Java operators. * */ public class XMLBinaryOperatorNode extends BinaryOperatorNode { // Derby did the following, which just make things too messy: // At the time of adding XML support, it was decided that // we should avoid creating new OperatorNodes where possible. // So for the XML-related binary operators we just add the // necessary code to _this_ class, similar to what is done in // TernarnyOperatorNode. Subsequent binary operators (whether // XML-related or not) should follow this example when // possible. public static enum OperatorType { EXISTS("xmlexists", "XMLExists", ValueClassName.BooleanDataValue, new String[] { ValueClassName.StringDataValue, ValueClassName.XMLDataValue }), QUERY("xmlquery", "XMLQuery", ValueClassName.XMLDataValue, new String [] { ValueClassName.StringDataValue, ValueClassName.XMLDataValue }); String operator, methodName; String resultType; String[] argTypes; OperatorType(String operator, String methodName, String resultType, String[] argTypes) { this.operator = operator; this.methodName = methodName; this.resultType = resultType; this.argTypes = argTypes; } } public static enum PassByType { REF, VALUE } public static enum ReturnType { SEQUENCE, CONTENT } public static enum OnEmpty { EMPTY, NULL } /** * Initializer for a BinaryOperatorNode * * @param leftOperand The left operand of the node * @param rightOperand The right operand of the node * @param opType An Integer holding the operatorType * for this operator. */ public void init(Object leftOperand, Object rightOperand, Object opType) { this.leftOperand = (ValueNode)leftOperand; this.rightOperand = (ValueNode)rightOperand; OperatorType operatorType = (OperatorType)opType; this.operator = operatorType.operator; this.methodName = operatorType.operator; this.leftInterfaceType = operatorType.argTypes[0]; this.rightInterfaceType = operatorType.argTypes[1]; this.resultInterfaceType = operatorType.resultType; } }