/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/



#ifndef _CONNECTIVITY_FILE_FNUMERICFUNCTIONS_HXX_
#define _CONNECTIVITY_FILE_FNUMERICFUNCTIONS_HXX_

#include "file/fcode.hxx"
#include "file/filedllapi.hxx"

namespace connectivity
{
	class OSQLParseNode;
	namespace file
	{
		/** ABS(X)
			Returns the absolute value of X:

		> SELECT ABS(2);
				-> 2
		> SELECT ABS(-32);
				-> 32

		*/
		class OOp_Abs : public OUnaryOperator
		{
		protected:
			virtual ORowSetValue operate(const ORowSetValue& lhs) const;
		};

		/** SIGN(X)
			Returns the sign of the argument as -1, 0, or 1, depending on whether X is negative, zero, or positive:

			> SELECT SIGN(-32);
					-> -1
			> SELECT SIGN(0);
					-> 0
			> SELECT SIGN(234);
					-> 1

		*/
		class OOp_Sign : public OUnaryOperator
		{
		protected:
			virtual ORowSetValue operate(const ORowSetValue& lhs) const;
		};

		/** MOD(N,M)
			%
				Modulo (like the % operator in C). Returns the remainder of N divided by M:

			> SELECT MOD(234, 10);
					-> 4
			> SELECT 253 % 7;
					-> 1
			> SELECT MOD(29,9);
					-> 2
			> SELECT 29 MOD 9;
					-> 2
		*/
		class OOp_Mod : public OBinaryOperator
		{
		protected:
			virtual ORowSetValue operate(const ORowSetValue& lhs,const ORowSetValue& rhs) const;
		};

		/** FLOOR(X)
			Returns the largest integer value not greater than X:

		> SELECT FLOOR(1.23);
				-> 1
		> SELECT FLOOR(-1.23);
				-> -2

		*/
		class OOp_Floor : public OUnaryOperator
		{
		protected:
			virtual ORowSetValue operate(const ORowSetValue& lhs) const;
		};

		/** CEILING(X)
			Returns the smallest integer value not less than X:

		> SELECT CEILING(1.23);
				-> 2
		> SELECT CEILING(-1.23);
				-> -1

		*/
		class OOp_Ceiling : public OUnaryOperator
		{
		protected:
			virtual ORowSetValue operate(const ORowSetValue& lhs) const;
		};

		/** ROUND(X)
			ROUND(X,D)
			Returns the argument X, rounded to the nearest integer. With two arguments rounded to a number to D decimals.

			> SELECT ROUND(-1.23);
					-> -1
			> SELECT ROUND(-1.58);
					-> -2
			> SELECT ROUND(1.58);
					-> 2
			> SELECT ROUND(1.298, 1);
					-> 1.3
			> SELECT ROUND(1.298, 0);
					-> 1
			> SELECT ROUND(23.298, -1);
					-> 20
		*/
		class OOp_Round : public ONthOperator
		{
		protected:
			virtual ORowSetValue operate(const ::std::vector<ORowSetValue>& lhs) const;
		};

		/** EXP(X)
			Returns the value of e (the base of natural logarithms) raised to the power of X:

		> SELECT EXP(2);
				-> 7.389056
		> SELECT EXP(-2);
				-> 0.135335
		*/
		class OOp_Exp : public OUnaryOperator
		{
		protected:
			virtual ORowSetValue operate(const ORowSetValue& lhs) const;
		};

		/** LN(X)
			Returns the natural logarithm of X:

		> SELECT LN(2);
				-> 0.693147
		> SELECT LN(-2);
				-> NULL

		*/
		class OOp_Ln : public OUnaryOperator
		{
		protected:
			virtual ORowSetValue operate(const ORowSetValue& lhs) const;
		};

		/** LOG(X)
			LOG(B,X)
				If called with one parameter, this function returns the natural logarithm of X:

			> SELECT LOG(2);
					-> 0.693147
			> SELECT LOG(-2);
					-> NULL

				If called with two parameters, this function returns the logarithm of X for an arbitrary base B:

			> SELECT LOG(2,65536);
					-> 16.000000
			> SELECT LOG(1,100);
					-> NULL
		*/
		class OOp_Log : public ONthOperator
		{
		protected:
			virtual ORowSetValue operate(const ::std::vector<ORowSetValue>& lhs) const;
		};

		/** LOG10(X)
			Returns the base-10 logarithm of X:

		> SELECT LOG10(2);
				-> 0.301030
		> SELECT LOG10(100);
				-> 2.000000
		> SELECT LOG10(-100);
				-> NULL
		*/
		class OOp_Log10 : public OUnaryOperator
		{
		protected:
			virtual ORowSetValue operate(const ORowSetValue& lhs) const;
		};

		/** POWER(X,Y)
				Returns the value of X raised to the power of Y:

			> SELECT POW(2,2);
					-> 4.000000
			> SELECT POW(2,-2);
					-> 0.250000
		*/
		class OOp_Pow : public OBinaryOperator
		{
		protected:
			virtual ORowSetValue operate(const ORowSetValue& lhs,const ORowSetValue& rhs) const;
		};

		/** SQRT(X)
			Returns the non-negative square root of X:

		> SELECT SQRT(4);
				-> 2.000000
		> SELECT SQRT(20);
				-> 4.472136
		*/
		class OOp_Sqrt : public OUnaryOperator
		{
		protected:
			virtual ORowSetValue operate(const ORowSetValue& lhs) const;
		};

		/** PI()
			Returns the value of PI. The default shown number of decimals is 5, but  internally uses the full double precession for PI.

		> SELECT PI();
				-> 3.141593
		> SELECT PI()+0.000000000000000000;
				-> 3.141592653589793116

		*/
		class OOp_Pi : public ONthOperator
		{
		protected:
			virtual ORowSetValue operate(const ::std::vector<ORowSetValue>& lhs) const;
		};

		/** COS(X)
			Returns the cosine of X, where X is given in radians:

		> SELECT COS(PI());
				-> -1.000000
		*/
		class OOp_Cos : public OUnaryOperator
		{
		protected:
			virtual ORowSetValue operate(const ORowSetValue& lhs = ORowSetValue()) const;
		};

		/** SIN(X)
			Returns the sine of X, where X is given in radians:

		> SELECT SIN(PI());
				-> 0.000000

		*/
		class OOp_Sin : public OUnaryOperator
		{
		protected:
			virtual ORowSetValue operate(const ORowSetValue& lhs = ORowSetValue()) const;
		};
		/** TAN(X)
			Returns the tangent of X, where X is given in radians:

		> SELECT TAN(PI()+1);
				-> 1.557408
		*/
		class OOp_Tan : public OUnaryOperator
		{
		protected:
			virtual ORowSetValue operate(const ORowSetValue& lhs = ORowSetValue()) const;
		};

		/** ACOS(X)
			Returns the arc cosine of X, that is, the value whose cosine is X. Returns NULL if X is not in the range -1 to 1:

		> SELECT ACOS(1);
				-> 0.000000
		> SELECT ACOS(1.0001);
				-> NULL
		> SELECT ACOS(0);
				-> 1.570796
		*/
		class OOp_ACos : public OUnaryOperator
		{
		protected:
			virtual ORowSetValue operate(const ORowSetValue& lhs = ORowSetValue()) const;
		};

		/** ASIN(X)
			Returns the arc sine of X, that is, the value whose sine is X. Returns NULL if X is not in the range -1 to 1:

		> SELECT ASIN(0.2);
				-> 0.201358
		> SELECT ASIN('foo');
				-> 0.000000
		*/
		class OOp_ASin : public OUnaryOperator
		{
		protected:
			virtual ORowSetValue operate(const ORowSetValue& lhs = ORowSetValue()) const;
		};

		/** ATAN(X)
			Returns the arc tangent of X, that is, the value whose tangent is X:

		> SELECT ATAN(2);
				-> 1.107149
		> SELECT ATAN(-2);
				-> -1.107149
		*/
		class OOp_ATan : public OUnaryOperator
		{
		protected:
			virtual ORowSetValue operate(const ORowSetValue& lhs = ORowSetValue()) const;
		};

		/** ATAN2(Y,X)
			Returns the arc tangent of the two variables X and Y. It is similar to calculating the arc tangent of Y / X, except that the signs of both arguments are used to determine the quadrant of the result:

		> SELECT ATAN2(-2,2);
				-> -0.785398
		> SELECT ATAN2(PI(),0);
				-> 1.570796

		*/
		class OOp_ATan2 : public OBinaryOperator
		{
		protected:
			virtual ORowSetValue operate(const ORowSetValue& lhs,const ORowSetValue& rhs) const;
		};

		/** DEGREES(X)
			Returns the argument X, converted from radians to degrees:

		> SELECT DEGREES(PI());
				-> 180.000000
		*/
		class OOp_Degrees : public OUnaryOperator
		{
		protected:
			virtual ORowSetValue operate(const ORowSetValue& lhs = ORowSetValue()) const;
		};

		/** RADIANS(X)
			Returns the argument X, converted from degrees to radians:

		> SELECT RADIANS(90);
				-> 1.570796

		*/
		class OOp_Radians : public OUnaryOperator
		{
		protected:
			virtual ORowSetValue operate(const ORowSetValue& lhs = ORowSetValue()) const;
		};
	}
}

#endif // _CONNECTIVITY_FILE_FNUMERICFUNCTIONS_HXX_

