blob: 5ec84d823ac79d875a93b4ebf5945d3013bdbb4e [file] [log] [blame]
// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package query_functions
import (
"math"
ds "v.io/v23/query/engine/datasource"
"v.io/v23/query/engine/internal/conversions"
"v.io/v23/query/engine/internal/query_parser"
)
func ceilingFunc(db ds.Database, off int64, args []*query_parser.Operand) (*query_parser.Operand, error) {
f, err := conversions.ConvertValueToFloat(args[0])
if err != nil {
return nil, err
}
return makeFloatOp(off, math.Ceil(f.Float)), nil
}
func floorFunc(db ds.Database, off int64, args []*query_parser.Operand) (*query_parser.Operand, error) {
f, err := conversions.ConvertValueToFloat(args[0])
if err != nil {
return nil, err
}
return makeFloatOp(off, math.Floor(f.Float)), nil
}
func nanFunc(db ds.Database, off int64, args []*query_parser.Operand) (*query_parser.Operand, error) {
return makeFloatOp(off, math.NaN()), nil
}
func isNanFunc(db ds.Database, off int64, args []*query_parser.Operand) (*query_parser.Operand, error) {
f, err := conversions.ConvertValueToFloat(args[0])
if err != nil {
return nil, err
}
return makeBoolOp(off, math.IsNaN(f.Float)), nil
}
func infFunc(db ds.Database, off int64, args []*query_parser.Operand) (*query_parser.Operand, error) {
i, err := conversions.ConvertValueToInt(args[0])
if err != nil {
return nil, err
}
var sign int
if i.Int < 0 {
sign = -1
} else if i.Int == 0 {
sign = 0
} else {
sign = 1
}
return makeFloatOp(off, math.Inf(sign)), nil
}
func isInfFunc(db ds.Database, off int64, args []*query_parser.Operand) (*query_parser.Operand, error) {
f, err := conversions.ConvertValueToFloat(args[0])
if err != nil {
return nil, err
}
i, err := conversions.ConvertValueToInt(args[1])
if err != nil {
return nil, err
}
var sign int
if i.Int < 0 {
sign = -1
} else if i.Int == 0 {
sign = 0
} else {
sign = 1
}
return makeBoolOp(off, math.IsInf(f.Float, sign)), nil
}
func logFunc(db ds.Database, off int64, args []*query_parser.Operand) (*query_parser.Operand, error) {
f, err := conversions.ConvertValueToFloat(args[0])
if err != nil {
return nil, err
}
return makeFloatOp(off, math.Log(f.Float)), nil
}
func log10Func(db ds.Database, off int64, args []*query_parser.Operand) (*query_parser.Operand, error) {
f, err := conversions.ConvertValueToFloat(args[0])
if err != nil {
return nil, err
}
return makeFloatOp(off, math.Log10(f.Float)), nil
}
func powFunc(db ds.Database, off int64, args []*query_parser.Operand) (*query_parser.Operand, error) {
x, err := conversions.ConvertValueToFloat(args[0])
if err != nil {
return nil, err
}
y, err := conversions.ConvertValueToFloat(args[1])
if err != nil {
return nil, err
}
return makeFloatOp(off, math.Pow(x.Float, y.Float)), nil
}
func pow10Func(db ds.Database, off int64, args []*query_parser.Operand) (*query_parser.Operand, error) {
x, err := conversions.ConvertValueToInt(args[0])
if err != nil {
return nil, err
}
return makeFloatOp(off, math.Pow10(int(x.Int))), nil
}
func modFunc(db ds.Database, off int64, args []*query_parser.Operand) (*query_parser.Operand, error) {
x, err := conversions.ConvertValueToFloat(args[0])
if err != nil {
return nil, err
}
y, err := conversions.ConvertValueToFloat(args[1])
if err != nil {
return nil, err
}
return makeFloatOp(off, math.Mod(x.Float, y.Float)), nil
}
func truncateFunc(db ds.Database, off int64, args []*query_parser.Operand) (*query_parser.Operand, error) {
f, err := conversions.ConvertValueToFloat(args[0])
if err != nil {
return nil, err
}
return makeFloatOp(off, math.Trunc(f.Float)), nil
}
func remainderFunc(db ds.Database, off int64, args []*query_parser.Operand) (*query_parser.Operand, error) {
x, err := conversions.ConvertValueToFloat(args[0])
if err != nil {
return nil, err
}
y, err := conversions.ConvertValueToFloat(args[1])
if err != nil {
return nil, err
}
return makeFloatOp(off, math.Remainder(x.Float, y.Float)), nil
}