go.mondoo.com/cnquery@v0.0.0-20231005093811-59568235f6ea/llx/builtin_simple.go (about) 1 // Copyright (c) Mondoo, Inc. 2 // SPDX-License-Identifier: BUSL-1.1 3 4 package llx 5 6 import ( 7 "errors" 8 "io" 9 "regexp" 10 "strconv" 11 "strings" 12 "time" 13 "unicode" 14 15 "go.mondoo.com/cnquery/types" 16 ) 17 18 // run an operation that returns true/false on a bind data vs a chunk call. 19 // Unlike boolOp we don't check if either side is nil 20 func rawboolOpV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64, f func(*RawData, *RawData) bool) (*RawData, uint64, error) { 21 v, dref, err := e.resolveValue(chunk.Function.Args[0], ref) 22 if err != nil { 23 return nil, 0, err 24 } 25 if dref != 0 { 26 return nil, dref, nil 27 } 28 return BoolData(f(bind, v)), 0, nil 29 } 30 31 // run an operation that returns true/false on a bind data vs a chunk call. 32 // Unlike boolOp we don't check if either side is nil. It inverts the 33 // returned boolean from the child function. 34 func rawboolNotOpV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64, f func(*RawData, *RawData) bool) (*RawData, uint64, error) { 35 v, dref, err := e.resolveValue(chunk.Function.Args[0], ref) 36 if err != nil { 37 return nil, 0, err 38 } 39 if dref != 0 { 40 return nil, dref, nil 41 } 42 return BoolData(!f(bind, v)), 0, nil 43 } 44 45 // run an operation that returns true/false on a bind data vs a chunk call. 46 // this includes handling for the case where either side is nil, i.e. 47 // - if both sides are nil we return true 48 // - if either side is nil but not the other we return false 49 func boolOpV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64, f func(interface{}, interface{}) bool) (*RawData, uint64, error) { 50 v, dref, err := e.resolveValue(chunk.Function.Args[0], ref) 51 if err != nil { 52 return nil, 0, err 53 } 54 if dref != 0 { 55 return nil, dref, nil 56 } 57 58 if bind.Value == nil { 59 return BoolData(v.Value == nil), 0, nil 60 } 61 if v == nil || v.Value == nil { 62 return BoolData(false), 0, nil 63 } 64 65 return BoolData(f(bind.Value, v.Value)), 0, nil 66 } 67 68 // boolOrOp behaves like boolOp, but checks if the left argument is true first 69 // (and stop if it is). Only then proceeds to check the right argument. 70 func boolOrOpV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64, fLeft func(interface{}) bool, fRight func(interface{}) bool) (*RawData, uint64, error) { 71 if bind.Value != nil && fLeft(bind.Value) { 72 return BoolData(true), 0, nil 73 } 74 75 v, dref, err := e.resolveValue(chunk.Function.Args[0], ref) 76 if err != nil { 77 return nil, 0, err 78 } 79 if dref != 0 { 80 return nil, dref, nil 81 } 82 83 if bind.Value == nil { 84 return BoolData(v.Value == nil), 0, nil 85 } 86 if v == nil || v.Value == nil { 87 return BoolData(false), 0, nil 88 } 89 90 return BoolData(fRight(v.Value)), 0, nil 91 } 92 93 // boolAndOp behaves like boolOp, but checks if the left argument is false first 94 // (and stop if it is). Only then proceeds to check the right argument. 95 func boolAndOpV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64, fLeft func(interface{}) bool, fRight func(interface{}) bool) (*RawData, uint64, error) { 96 if bind.Value != nil && !fLeft(bind.Value) { 97 return BoolData(false), 0, nil 98 } 99 100 v, dref, err := e.resolveValue(chunk.Function.Args[0], ref) 101 if err != nil { 102 return nil, 0, err 103 } 104 if dref != 0 { 105 return nil, dref, nil 106 } 107 108 if bind.Value == nil { 109 return BoolData(v.Value == nil), 0, nil 110 } 111 if v == nil || v.Value == nil { 112 return BoolData(false), 0, nil 113 } 114 return BoolData(fRight(v.Value)), 0, nil 115 } 116 117 func boolNotOpV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64, f func(interface{}, interface{}) bool) (*RawData, uint64, error) { 118 v, dref, err := e.resolveValue(chunk.Function.Args[0], ref) 119 if err != nil { 120 return nil, 0, err 121 } 122 if dref != 0 { 123 return nil, dref, nil 124 } 125 126 if bind.Value == nil { 127 return BoolData(v.Value != nil), 0, nil 128 } 129 if v == nil || v.Value == nil { 130 return BoolData(true), 0, nil 131 } 132 133 return BoolData(!f(bind.Value, v.Value)), 0, nil 134 } 135 136 func dataOpV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64, typ types.Type, f func(interface{}, interface{}) *RawData) (*RawData, uint64, error) { 137 v, dref, err := e.resolveValue(chunk.Function.Args[0], ref) 138 if err != nil { 139 return nil, 0, err 140 } 141 if dref != 0 { 142 return nil, dref, nil 143 } 144 145 if bind.Value == nil { 146 return &RawData{Type: typ}, 0, nil 147 } 148 if v == nil || v.Value == nil { 149 return &RawData{Type: typ}, 0, nil 150 } 151 152 return f(bind.Value, v.Value), 0, nil 153 } 154 155 func nonNilDataOpV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64, typ types.Type, f func(interface{}, interface{}) *RawData) (*RawData, uint64, error) { 156 if bind.Value == nil { 157 return &RawData{Type: typ, Error: errors.New("left side of operation is null")}, 0, nil 158 } 159 160 v, dref, err := e.resolveValue(chunk.Function.Args[0], ref) 161 if err != nil { 162 return nil, 0, err 163 } 164 if dref != 0 { 165 return nil, dref, nil 166 } 167 168 if v == nil || v.Value == nil { 169 return &RawData{Type: typ, Error: errors.New("right side of operation is null")}, 0, nil 170 } 171 172 return f(bind.Value, v.Value), 0, nil 173 } 174 175 // for equality and inequality checks that are pre-determined 176 // we need to catch the case where both values end up nil 177 178 func chunkEqTrueV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 179 return boolOpV2(e, bind, chunk, ref, func(a interface{}, b interface{}) bool { 180 return true 181 }) 182 } 183 184 func chunkEqFalseV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 185 return boolOpV2(e, bind, chunk, ref, func(a interface{}, b interface{}) bool { 186 return false 187 }) 188 } 189 190 func chunkNeqFalseV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 191 return boolNotOpV2(e, bind, chunk, ref, func(a interface{}, b interface{}) bool { 192 return true 193 }) 194 } 195 196 func chunkNeqTrueV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 197 return boolNotOpV2(e, bind, chunk, ref, func(a interface{}, b interface{}) bool { 198 return false 199 }) 200 } 201 202 func bindingEqNil(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 203 return BoolData(bind.Value == nil), 0, nil 204 } 205 206 func bindingNeqNil(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 207 return BoolData(bind.Value != nil), 0, nil 208 } 209 210 // raw operator handling 211 // == != 212 213 func opBoolCmpBool(left interface{}, right interface{}) bool { 214 return left.(bool) == right.(bool) 215 } 216 217 func opIntCmpInt(left interface{}, right interface{}) bool { 218 return left.(int64) == right.(int64) 219 } 220 221 func opFloatCmpFloat(left interface{}, right interface{}) bool { 222 return left.(float64) == right.(float64) 223 } 224 225 func opStringCmpString(left interface{}, right interface{}) bool { 226 return left.(string) == right.(string) 227 } 228 229 func opTimeCmpTime(left interface{}, right interface{}) bool { 230 l := left.(*time.Time) 231 r := right.(*time.Time) 232 if l == nil { 233 return r == nil 234 } 235 if r == nil { 236 return false 237 } 238 239 if (*l == NeverPastTime || *l == NeverFutureTime) && (*r == NeverPastTime || *r == NeverFutureTime) { 240 return true 241 } 242 243 return (*l).Equal(*r) 244 } 245 246 func opStringCmpInt(left interface{}, right interface{}) bool { 247 return left.(string) == strconv.FormatInt(right.(int64), 10) 248 } 249 250 func opIntCmpString(left interface{}, right interface{}) bool { 251 return right.(string) == strconv.FormatInt(left.(int64), 10) 252 } 253 254 func opStringCmpFloat(left interface{}, right interface{}) bool { 255 return left.(string) == strconv.FormatFloat(right.(float64), 'f', -1, 64) 256 } 257 258 func opFloatCmpString(left interface{}, right interface{}) bool { 259 return right.(string) == strconv.FormatFloat(left.(float64), 'f', -1, 64) 260 } 261 262 func opStringCmpRegex(left interface{}, right interface{}) bool { 263 r := regexp.MustCompile(right.(string)) 264 return r.Match([]byte(left.(string))) 265 } 266 267 func opRegexCmpString(left interface{}, right interface{}) bool { 268 r := regexp.MustCompile(left.(string)) 269 return r.Match([]byte(right.(string))) 270 } 271 272 func opRegexCmpInt(left interface{}, right interface{}) bool { 273 return opStringCmpRegex(strconv.FormatInt(right.(int64), 10), left.(string)) 274 } 275 276 func opIntCmpRegex(left interface{}, right interface{}) bool { 277 return opStringCmpRegex(strconv.FormatInt(left.(int64), 10), right.(string)) 278 } 279 280 func opRegexCmpFloat(left interface{}, right interface{}) bool { 281 return opStringCmpRegex(strconv.FormatFloat(right.(float64), 'f', -1, 64), left.(string)) 282 } 283 284 func opFloatCmpRegex(left interface{}, right interface{}) bool { 285 return opStringCmpRegex(strconv.FormatFloat(left.(float64), 'f', -1, 64), right.(string)) 286 } 287 288 // same operator types 289 // == != 290 291 func boolCmpBoolV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 292 return boolOpV2(e, bind, chunk, ref, opBoolCmpBool) 293 } 294 295 func boolNotBoolV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 296 return boolNotOpV2(e, bind, chunk, ref, opBoolCmpBool) 297 } 298 299 func intCmpIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 300 return boolOpV2(e, bind, chunk, ref, opIntCmpInt) 301 } 302 303 func intNotIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 304 return boolNotOpV2(e, bind, chunk, ref, opIntCmpInt) 305 } 306 307 func floatCmpFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 308 return boolOpV2(e, bind, chunk, ref, opFloatCmpFloat) 309 } 310 311 func floatNotFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 312 return boolNotOpV2(e, bind, chunk, ref, opFloatCmpFloat) 313 } 314 315 func stringCmpStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 316 return boolOpV2(e, bind, chunk, ref, opStringCmpString) 317 } 318 319 func stringNotStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 320 return boolNotOpV2(e, bind, chunk, ref, opStringCmpString) 321 } 322 323 func timeCmpTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 324 return boolOpV2(e, bind, chunk, ref, opTimeCmpTime) 325 } 326 327 func timeNotTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 328 return boolNotOpV2(e, bind, chunk, ref, opTimeCmpTime) 329 } 330 331 func stringCmpEmptyV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 332 if bind.Value == nil { 333 return BoolTrue, 0, nil 334 } 335 return BoolData(bind.Value.(string) == ""), 0, nil 336 } 337 338 func stringNotEmptyV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 339 if bind.Value == nil { 340 return BoolFalse, 0, nil 341 } 342 return BoolData(bind.Value.(string) != ""), 0, nil 343 } 344 345 // int arithmetic 346 347 func intPlusIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 348 return dataOpV2(e, bind, chunk, ref, types.Int, func(left interface{}, right interface{}) *RawData { 349 res := left.(int64) + right.(int64) 350 return IntData(res) 351 }) 352 } 353 354 func intMinusIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 355 return dataOpV2(e, bind, chunk, ref, types.Int, func(left interface{}, right interface{}) *RawData { 356 res := left.(int64) - right.(int64) 357 return IntData(res) 358 }) 359 } 360 361 func intTimesIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 362 return dataOpV2(e, bind, chunk, ref, types.Int, func(left interface{}, right interface{}) *RawData { 363 res := left.(int64) * right.(int64) 364 return IntData(res) 365 }) 366 } 367 368 func intDividedIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 369 return dataOpV2(e, bind, chunk, ref, types.Int, func(left interface{}, right interface{}) *RawData { 370 res := left.(int64) / right.(int64) 371 return IntData(res) 372 }) 373 } 374 375 func intPlusFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 376 return dataOpV2(e, bind, chunk, ref, types.Float, func(left interface{}, right interface{}) *RawData { 377 res := float64(left.(int64)) + right.(float64) 378 return FloatData(res) 379 }) 380 } 381 382 func intMinusFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 383 return dataOpV2(e, bind, chunk, ref, types.Float, func(left interface{}, right interface{}) *RawData { 384 res := float64(left.(int64)) - right.(float64) 385 return FloatData(res) 386 }) 387 } 388 389 func intTimesFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 390 return dataOpV2(e, bind, chunk, ref, types.Float, func(left interface{}, right interface{}) *RawData { 391 res := float64(left.(int64)) * right.(float64) 392 return FloatData(res) 393 }) 394 } 395 396 func intDividedFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 397 return dataOpV2(e, bind, chunk, ref, types.Float, func(left interface{}, right interface{}) *RawData { 398 res := float64(left.(int64)) / right.(float64) 399 return FloatData(res) 400 }) 401 } 402 403 // float arithmetic 404 405 func floatPlusIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 406 return dataOpV2(e, bind, chunk, ref, types.Float, func(left interface{}, right interface{}) *RawData { 407 res := left.(float64) + float64(right.(int64)) 408 return FloatData(res) 409 }) 410 } 411 412 func floatMinusIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 413 return dataOpV2(e, bind, chunk, ref, types.Float, func(left interface{}, right interface{}) *RawData { 414 res := left.(float64) - float64(right.(int64)) 415 return FloatData(res) 416 }) 417 } 418 419 func floatTimesIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 420 return dataOpV2(e, bind, chunk, ref, types.Float, func(left interface{}, right interface{}) *RawData { 421 res := left.(float64) * float64(right.(int64)) 422 return FloatData(res) 423 }) 424 } 425 426 func floatDividedIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 427 return dataOpV2(e, bind, chunk, ref, types.Float, func(left interface{}, right interface{}) *RawData { 428 res := left.(float64) / float64(right.(int64)) 429 return FloatData(res) 430 }) 431 } 432 433 func floatPlusFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 434 return dataOpV2(e, bind, chunk, ref, types.Float, func(left interface{}, right interface{}) *RawData { 435 res := left.(float64) + right.(float64) 436 return FloatData(res) 437 }) 438 } 439 440 func floatMinusFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 441 return dataOpV2(e, bind, chunk, ref, types.Float, func(left interface{}, right interface{}) *RawData { 442 res := left.(float64) - right.(float64) 443 return FloatData(res) 444 }) 445 } 446 447 func floatTimesFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 448 return dataOpV2(e, bind, chunk, ref, types.Float, func(left interface{}, right interface{}) *RawData { 449 res := left.(float64) * right.(float64) 450 return FloatData(res) 451 }) 452 } 453 454 func floatDividedFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 455 return dataOpV2(e, bind, chunk, ref, types.Float, func(left interface{}, right interface{}) *RawData { 456 res := left.(float64) / right.(float64) 457 return FloatData(res) 458 }) 459 } 460 461 // int vs float 462 // int ==/!= float 463 464 func opIntCmpFloat(left interface{}, right interface{}) bool { 465 return float64(left.(int64)) == right.(float64) 466 } 467 468 func opFloatCmpInt(left interface{}, right interface{}) bool { 469 return left.(float64) == float64(right.(int64)) 470 } 471 472 func intCmpFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 473 return boolOpV2(e, bind, chunk, ref, opIntCmpFloat) 474 } 475 476 func intNotFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 477 return boolNotOpV2(e, bind, chunk, ref, opIntCmpFloat) 478 } 479 480 func floatCmpIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 481 return boolOpV2(e, bind, chunk, ref, opFloatCmpInt) 482 } 483 484 func floatNotIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 485 return boolNotOpV2(e, bind, chunk, ref, opFloatCmpInt) 486 } 487 488 // string vs other types 489 // string ==/!= nil 490 491 func opStringCmpNil(left interface{}, right interface{}) bool { 492 return left == nil 493 } 494 495 func opNilCmpString(left interface{}, right interface{}) bool { 496 return right == nil 497 } 498 499 func stringCmpNilV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 500 return boolOpV2(e, bind, chunk, ref, opStringCmpNil) 501 } 502 503 func stringNotNilV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 504 return boolNotOpV2(e, bind, chunk, ref, opStringCmpNil) 505 } 506 507 func nilCmpStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 508 return boolOpV2(e, bind, chunk, ref, opNilCmpString) 509 } 510 511 func nilNotStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 512 return boolNotOpV2(e, bind, chunk, ref, opNilCmpString) 513 } 514 515 // string ==/!= bool 516 517 func opStringCmpBool(left interface{}, right interface{}) bool { 518 if right.(bool) == true { 519 return left.(string) == "true" 520 } 521 return left.(string) == "false" 522 } 523 524 func opBoolCmpString(left interface{}, right interface{}) bool { 525 if left.(bool) == true { 526 return right.(string) == "true" 527 } 528 return right.(string) == "false" 529 } 530 531 func stringCmpBoolV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 532 return boolOpV2(e, bind, chunk, ref, opStringCmpBool) 533 } 534 535 func stringNotBoolV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 536 return boolNotOpV2(e, bind, chunk, ref, opStringCmpBool) 537 } 538 539 func boolCmpStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 540 return boolOpV2(e, bind, chunk, ref, opBoolCmpString) 541 } 542 543 func boolNotStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 544 return boolNotOpV2(e, bind, chunk, ref, opBoolCmpString) 545 } 546 547 // string ==/!= int 548 549 func stringCmpIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 550 return boolOpV2(e, bind, chunk, ref, opStringCmpInt) 551 } 552 553 func stringNotIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 554 return boolNotOpV2(e, bind, chunk, ref, opStringCmpInt) 555 } 556 557 func intCmpStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 558 return boolOpV2(e, bind, chunk, ref, opIntCmpString) 559 } 560 561 func intNotStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 562 return boolNotOpV2(e, bind, chunk, ref, opIntCmpString) 563 } 564 565 // string ==/!= float 566 567 func stringCmpFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 568 return boolOpV2(e, bind, chunk, ref, opStringCmpFloat) 569 } 570 571 func stringNotFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 572 return boolNotOpV2(e, bind, chunk, ref, opStringCmpFloat) 573 } 574 575 func floatCmpStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 576 return boolOpV2(e, bind, chunk, ref, opFloatCmpString) 577 } 578 579 func floatNotStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 580 return boolNotOpV2(e, bind, chunk, ref, opFloatCmpString) 581 } 582 583 // string ==/!= regex 584 585 func stringCmpRegexV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 586 return boolOpV2(e, bind, chunk, ref, opStringCmpRegex) 587 } 588 589 func stringNotRegexV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 590 return boolNotOpV2(e, bind, chunk, ref, opStringCmpRegex) 591 } 592 593 func regexCmpStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 594 return boolOpV2(e, bind, chunk, ref, opRegexCmpString) 595 } 596 597 func regexNotStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 598 return boolNotOpV2(e, bind, chunk, ref, opRegexCmpString) 599 } 600 601 // regex vs other types 602 // int ==/!= regex 603 604 func intCmpRegexV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 605 return boolOpV2(e, bind, chunk, ref, opIntCmpRegex) 606 } 607 608 func intNotRegexV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 609 return boolNotOpV2(e, bind, chunk, ref, opIntCmpRegex) 610 } 611 612 func regexCmpIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 613 return boolOpV2(e, bind, chunk, ref, opRegexCmpInt) 614 } 615 616 func regexNotIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 617 return boolNotOpV2(e, bind, chunk, ref, opRegexCmpInt) 618 } 619 620 // float ==/!= regex 621 622 func floatCmpRegexV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 623 return boolOpV2(e, bind, chunk, ref, opFloatCmpRegex) 624 } 625 626 func floatNotRegexV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 627 return boolNotOpV2(e, bind, chunk, ref, opFloatCmpRegex) 628 } 629 630 func regexCmpFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 631 return boolOpV2(e, bind, chunk, ref, opRegexCmpFloat) 632 } 633 634 func regexNotFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 635 return boolNotOpV2(e, bind, chunk, ref, opRegexCmpFloat) 636 } 637 638 // null vs other types 639 // bool ==/!= nil 640 641 func opBoolCmpNil(left interface{}, right interface{}) bool { 642 return left == nil 643 } 644 645 func opNilCmpBool(left interface{}, right interface{}) bool { 646 return right == nil 647 } 648 649 func boolCmpNilV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 650 return boolOpV2(e, bind, chunk, ref, opBoolCmpNil) 651 } 652 653 func boolNotNilV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 654 return boolNotOpV2(e, bind, chunk, ref, opBoolCmpNil) 655 } 656 657 func nilCmpBoolV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 658 return boolOpV2(e, bind, chunk, ref, opNilCmpBool) 659 } 660 661 func nilNotBoolV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 662 return boolNotOpV2(e, bind, chunk, ref, opNilCmpBool) 663 } 664 665 // int ==/!= nil 666 667 func opIntCmpNil(left interface{}, right interface{}) bool { 668 return left == nil 669 } 670 671 func opNilCmpInt(left interface{}, right interface{}) bool { 672 return right == nil 673 } 674 675 func intCmpNilV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 676 return boolOpV2(e, bind, chunk, ref, opIntCmpNil) 677 } 678 679 func intNotNilV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 680 return boolNotOpV2(e, bind, chunk, ref, opIntCmpNil) 681 } 682 683 func nilCmpIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 684 return boolOpV2(e, bind, chunk, ref, opNilCmpInt) 685 } 686 687 func nilNotIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 688 return boolNotOpV2(e, bind, chunk, ref, opNilCmpInt) 689 } 690 691 // float ==/!= nil 692 693 func opFloatCmpNil(left interface{}, right interface{}) bool { 694 return left == nil 695 } 696 697 func opNilCmpFloat(left interface{}, right interface{}) bool { 698 return right == nil 699 } 700 701 func floatCmpNilV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 702 return boolOpV2(e, bind, chunk, ref, opFloatCmpNil) 703 } 704 705 func floatNotNilV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 706 return boolNotOpV2(e, bind, chunk, ref, opFloatCmpNil) 707 } 708 709 func nilCmpFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 710 return boolOpV2(e, bind, chunk, ref, opNilCmpFloat) 711 } 712 713 func nilNotFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 714 return boolNotOpV2(e, bind, chunk, ref, opNilCmpFloat) 715 } 716 717 // time ==/!= nil 718 719 func opTimeCmpNil(left *RawData, right *RawData) bool { 720 return left.Value == nil || left.Value.(*time.Time) == nil 721 } 722 723 func opNilCmpTime(left *RawData, right *RawData) bool { 724 return right.Value == nil || right.Value.(*time.Time) == nil 725 } 726 727 func timeCmpNilV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 728 return rawboolOpV2(e, bind, chunk, ref, opTimeCmpNil) 729 } 730 731 func timeNotNilV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 732 return rawboolNotOpV2(e, bind, chunk, ref, opTimeCmpNil) 733 } 734 735 func nilCmpTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 736 return rawboolOpV2(e, bind, chunk, ref, opNilCmpTime) 737 } 738 739 func nilNotTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 740 return rawboolNotOpV2(e, bind, chunk, ref, opNilCmpTime) 741 } 742 743 // string </>/<=/>= string 744 745 func stringLTStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 746 return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData { 747 return BoolData(left.(string) < right.(string)) 748 }) 749 } 750 751 func stringLTEStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 752 return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData { 753 return BoolData(left.(string) <= right.(string)) 754 }) 755 } 756 757 func stringGTStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 758 return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData { 759 return BoolData(left.(string) > right.(string)) 760 }) 761 } 762 763 func stringGTEStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 764 return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData { 765 return BoolData(left.(string) >= right.(string)) 766 }) 767 } 768 769 // int </>/<=/>= int 770 771 func intLTIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 772 return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData { 773 return BoolData(left.(int64) < right.(int64)) 774 }) 775 } 776 777 func intLTEIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 778 return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData { 779 return BoolData(left.(int64) <= right.(int64)) 780 }) 781 } 782 783 func intGTIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 784 return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData { 785 return BoolData(left.(int64) > right.(int64)) 786 }) 787 } 788 789 func intGTEIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 790 return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData { 791 return BoolData(left.(int64) >= right.(int64)) 792 }) 793 } 794 795 // float </>/<=/>= float 796 797 func floatLTFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 798 return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData { 799 return BoolData(left.(float64) < right.(float64)) 800 }) 801 } 802 803 func floatLTEFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 804 return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData { 805 return BoolData(left.(float64) <= right.(float64)) 806 }) 807 } 808 809 func floatGTFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 810 return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData { 811 return BoolData(left.(float64) > right.(float64)) 812 }) 813 } 814 815 func floatGTEFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 816 return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData { 817 return BoolData(left.(float64) >= right.(float64)) 818 }) 819 } 820 821 // time </>/<=/>= time 822 823 func timeLTTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 824 return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData { 825 l := left.(*time.Time) 826 if l == nil { 827 return &RawData{Type: types.Bool, Error: errors.New("left side of operation is null")} 828 } 829 r := right.(*time.Time) 830 if r == nil { 831 return &RawData{Type: types.Bool, Error: errors.New("right side of operation is null")} 832 } 833 834 return BoolData((*l).Before(*r)) 835 }) 836 } 837 838 func timeLTETimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 839 return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData { 840 l := left.(*time.Time) 841 if l == nil { 842 return &RawData{Type: types.Bool, Error: errors.New("left side of operation is null")} 843 } 844 r := right.(*time.Time) 845 if r == nil { 846 return &RawData{Type: types.Bool, Error: errors.New("right side of operation is null")} 847 } 848 849 return BoolData((*l).Before(*r) || (*l).Equal(*r)) 850 }) 851 } 852 853 func timeGTTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 854 return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData { 855 l := left.(*time.Time) 856 if l == nil { 857 return &RawData{Type: types.Bool, Error: errors.New("left side of operation is null")} 858 } 859 r := right.(*time.Time) 860 if r == nil { 861 return &RawData{Type: types.Bool, Error: errors.New("right side of operation is null")} 862 } 863 864 return BoolData((*l).After(*r)) 865 }) 866 } 867 868 func timeGTETimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 869 return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData { 870 l := left.(*time.Time) 871 if l == nil { 872 return &RawData{Type: types.Bool, Error: errors.New("left side of operation is null")} 873 } 874 r := right.(*time.Time) 875 if r == nil { 876 return &RawData{Type: types.Bool, Error: errors.New("right side of operation is null")} 877 } 878 879 return BoolData((*l).After(*r) || (*l).Equal(*r)) 880 }) 881 } 882 883 // time arithmetic 884 885 func timeMinusTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 886 return dataOpV2(e, bind, chunk, ref, types.Time, func(left interface{}, right interface{}) *RawData { 887 l := left.(*time.Time) 888 r := right.(*time.Time) 889 if l == nil || r == nil { 890 return &RawData{Type: types.Time} 891 } 892 893 if *r == NeverPastTime { 894 return NeverFuturePrimitive.RawData() 895 } 896 if *r == NeverFutureTime { 897 return NeverPastPrimitive.RawData() 898 } 899 if *l == NeverPastTime { 900 return NeverPastPrimitive.RawData() 901 } 902 if *l == NeverFutureTime { 903 return NeverFuturePrimitive.RawData() 904 } 905 906 diff := l.Unix() - r.Unix() 907 res := DurationToTime(diff) 908 return TimeData(res) 909 }) 910 } 911 912 func timePlusTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 913 return dataOpV2(e, bind, chunk, ref, types.Time, func(left interface{}, right interface{}) *RawData { 914 l := left.(*time.Time) 915 r := right.(*time.Time) 916 if l == nil || r == nil { 917 return &RawData{Type: types.Time} 918 } 919 920 if *r == NeverPastTime { 921 return NeverFuturePrimitive.RawData() 922 } 923 if *r == NeverFutureTime { 924 return NeverPastPrimitive.RawData() 925 } 926 if *l == NeverPastTime { 927 return NeverPastPrimitive.RawData() 928 } 929 if *l == NeverFutureTime { 930 return NeverFuturePrimitive.RawData() 931 } 932 933 lt := l.Unix() 934 rt := r.Unix() 935 936 // the breakpoint for time and duration is the unix time of zero 937 bothDuration := false 938 if lt < 0 { 939 lt = TimeToDuration(l) 940 if rt < 0 { 941 bothDuration = true 942 } 943 } 944 if rt < 0 { 945 rt = TimeToDuration(r) 946 } 947 948 sum := lt + rt 949 if bothDuration { 950 return TimeData(DurationToTime(sum)) 951 } 952 953 return TimeData(time.Unix(sum, 0)) 954 }) 955 } 956 957 func opTimeTimesInt(left interface{}, right interface{}) *RawData { 958 l := left.(*time.Time) 959 if l == nil { 960 return &RawData{Type: types.Time} 961 } 962 963 if *l == NeverPastTime { 964 return NeverPastPrimitive.RawData() 965 } 966 if *l == NeverFutureTime { 967 return NeverFuturePrimitive.RawData() 968 } 969 970 diff := TimeToDuration(l) * right.(int64) 971 res := DurationToTime(diff) 972 return TimeData(res) 973 } 974 975 func opTimeTimesFloat(left interface{}, right interface{}) *RawData { 976 l := left.(*time.Time) 977 if l == nil { 978 return &RawData{Type: types.Time} 979 } 980 981 if *l == NeverPastTime { 982 return NeverPastPrimitive.RawData() 983 } 984 if *l == NeverFutureTime { 985 return NeverFuturePrimitive.RawData() 986 } 987 988 diff := float64(TimeToDuration(l)) * right.(float64) 989 res := DurationToTime(int64(diff)) 990 return TimeData(res) 991 } 992 993 func timeTimesIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 994 return dataOpV2(e, bind, chunk, ref, types.Time, opTimeTimesInt) 995 } 996 997 func intTimesTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 998 return dataOpV2(e, bind, chunk, ref, types.Time, func(left interface{}, right interface{}) *RawData { 999 return opTimeTimesInt(right, left) 1000 }) 1001 } 1002 1003 func timeTimesFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1004 return dataOpV2(e, bind, chunk, ref, types.Time, opTimeTimesFloat) 1005 } 1006 1007 func floatTimesTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1008 return dataOpV2(e, bind, chunk, ref, types.Time, func(left interface{}, right interface{}) *RawData { 1009 return opTimeTimesFloat(right, left) 1010 }) 1011 } 1012 1013 // int </>/<=/>= float 1014 1015 func intLTFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1016 return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData { 1017 return BoolData(float64(left.(int64)) < right.(float64)) 1018 }) 1019 } 1020 1021 func intLTEFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1022 return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData { 1023 return BoolData(float64(left.(int64)) <= right.(float64)) 1024 }) 1025 } 1026 1027 func intGTFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1028 return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData { 1029 return BoolData(float64(left.(int64)) > right.(float64)) 1030 }) 1031 } 1032 1033 func intGTEFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1034 return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData { 1035 return BoolData(float64(left.(int64)) >= right.(float64)) 1036 }) 1037 } 1038 1039 // float </>/<=/>= int 1040 1041 func floatLTIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1042 return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData { 1043 return BoolData(left.(float64) < float64(right.(int64))) 1044 }) 1045 } 1046 1047 func floatLTEIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1048 return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData { 1049 return BoolData(left.(float64) <= float64(right.(int64))) 1050 }) 1051 } 1052 1053 func floatGTIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1054 return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData { 1055 return BoolData(left.(float64) > float64(right.(int64))) 1056 }) 1057 } 1058 1059 func floatGTEIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1060 return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData { 1061 return BoolData(left.(float64) >= float64(right.(int64))) 1062 }) 1063 } 1064 1065 // float </>/<=/>= string 1066 1067 func floatLTStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1068 return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData { 1069 f, err := strconv.ParseFloat(right.(string), 64) 1070 if err != nil { 1071 return &RawData{Type: types.Bool, Error: errors.New("failed to convert string to float")} 1072 } 1073 return BoolData(left.(float64) < f) 1074 }) 1075 } 1076 1077 func floatLTEStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1078 return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData { 1079 f, err := strconv.ParseFloat(right.(string), 64) 1080 if err != nil { 1081 return &RawData{Type: types.Bool, Error: errors.New("failed to convert string to float")} 1082 } 1083 return BoolData(left.(float64) <= f) 1084 }) 1085 } 1086 1087 func floatGTStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1088 return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData { 1089 f, err := strconv.ParseFloat(right.(string), 64) 1090 if err != nil { 1091 return &RawData{Type: types.Bool, Error: errors.New("failed to convert string to float")} 1092 } 1093 return BoolData(left.(float64) > f) 1094 }) 1095 } 1096 1097 func floatGTEStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1098 return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData { 1099 f, err := strconv.ParseFloat(right.(string), 64) 1100 if err != nil { 1101 return &RawData{Type: types.Bool, Error: errors.New("failed to convert string to float")} 1102 } 1103 return BoolData(left.(float64) >= f) 1104 }) 1105 } 1106 1107 // string </>/<=/>= float 1108 1109 func stringLTFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1110 return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData { 1111 f, err := strconv.ParseFloat(left.(string), 64) 1112 if err != nil { 1113 return &RawData{Type: types.Bool, Error: errors.New("failed to convert string to float")} 1114 } 1115 return BoolData(f < right.(float64)) 1116 }) 1117 } 1118 1119 func stringLTEFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1120 return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData { 1121 f, err := strconv.ParseFloat(left.(string), 64) 1122 if err != nil { 1123 return &RawData{Type: types.Bool, Error: errors.New("failed to convert string to float")} 1124 } 1125 return BoolData(f <= right.(float64)) 1126 }) 1127 } 1128 1129 func stringGTFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1130 return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData { 1131 f, err := strconv.ParseFloat(left.(string), 64) 1132 if err != nil { 1133 return &RawData{Type: types.Bool, Error: errors.New("failed to convert string to float")} 1134 } 1135 return BoolData(f > right.(float64)) 1136 }) 1137 } 1138 1139 func stringGTEFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1140 return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData { 1141 f, err := strconv.ParseFloat(left.(string), 64) 1142 if err != nil { 1143 return &RawData{Type: types.Bool, Error: errors.New("failed to convert string to float")} 1144 } 1145 return BoolData(f >= right.(float64)) 1146 }) 1147 } 1148 1149 // int </>/<=/>= string 1150 1151 func intLTStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1152 return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData { 1153 f, err := strconv.ParseInt(right.(string), 10, 64) 1154 if err != nil { 1155 return &RawData{Type: types.Bool, Error: errors.New("failed to convert string to float")} 1156 } 1157 return BoolData(left.(int64) < f) 1158 }) 1159 } 1160 1161 func intLTEStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1162 return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData { 1163 f, err := strconv.ParseInt(right.(string), 10, 64) 1164 if err != nil { 1165 return &RawData{Type: types.Bool, Error: errors.New("failed to convert string to float")} 1166 } 1167 return BoolData(left.(int64) <= f) 1168 }) 1169 } 1170 1171 func intGTStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1172 return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData { 1173 f, err := strconv.ParseInt(right.(string), 10, 64) 1174 if err != nil { 1175 return &RawData{Type: types.Bool, Error: errors.New("failed to convert string to float")} 1176 } 1177 return BoolData(left.(int64) > f) 1178 }) 1179 } 1180 1181 func intGTEStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1182 return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData { 1183 f, err := strconv.ParseInt(right.(string), 10, 64) 1184 if err != nil { 1185 return &RawData{Type: types.Bool, Error: errors.New("failed to convert string to float")} 1186 } 1187 return BoolData(left.(int64) >= f) 1188 }) 1189 } 1190 1191 // string </>/<=/>= int 1192 1193 func stringLTIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1194 return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData { 1195 f, err := strconv.ParseInt(left.(string), 10, 64) 1196 if err != nil { 1197 return &RawData{Type: types.Bool, Error: errors.New("failed to convert string to float")} 1198 } 1199 return BoolData(f < right.(int64)) 1200 }) 1201 } 1202 1203 func stringLTEIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1204 return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData { 1205 f, err := strconv.ParseInt(left.(string), 10, 64) 1206 if err != nil { 1207 return &RawData{Type: types.Bool, Error: errors.New("failed to convert string to float")} 1208 } 1209 return BoolData(f <= right.(int64)) 1210 }) 1211 } 1212 1213 func stringGTIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1214 return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData { 1215 f, err := strconv.ParseInt(left.(string), 10, 64) 1216 if err != nil { 1217 return &RawData{Type: types.Bool, Error: errors.New("failed to convert string to float")} 1218 } 1219 return BoolData(f > right.(int64)) 1220 }) 1221 } 1222 1223 func stringGTEIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1224 return nonNilDataOpV2(e, bind, chunk, ref, types.Bool, func(left interface{}, right interface{}) *RawData { 1225 f, err := strconv.ParseInt(left.(string), 10, 64) 1226 if err != nil { 1227 return &RawData{Type: types.Bool, Error: errors.New("failed to convert string to float")} 1228 } 1229 return BoolData(f >= right.(int64)) 1230 }) 1231 } 1232 1233 // --------------------------------- 1234 // && AND || OR 1235 // --------------------------------- 1236 1237 // T &&/|| T 1238 1239 func truthyBool(val interface{}) bool { 1240 return val.(bool) 1241 } 1242 1243 func truthyInt(val interface{}) bool { 1244 return val.(int64) != 0 1245 } 1246 1247 func truthyFloat(val interface{}) bool { 1248 return val.(float64) != 0 1249 } 1250 1251 func truthyString(val interface{}) bool { 1252 return val.(string) != "" 1253 } 1254 1255 func truthyArray(val interface{}) bool { 1256 return true 1257 } 1258 1259 func truthyMap(val interface{}) bool { 1260 return true 1261 } 1262 1263 func boolAndBoolV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1264 return boolAndOpV2(e, bind, chunk, ref, truthyBool, truthyBool) 1265 } 1266 1267 func boolOrBoolV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1268 return boolOrOpV2(e, bind, chunk, ref, truthyBool, truthyBool) 1269 } 1270 1271 func intAndIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1272 return boolAndOpV2(e, bind, chunk, ref, truthyInt, truthyInt) 1273 } 1274 1275 func intOrIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1276 return boolOrOpV2(e, bind, chunk, ref, truthyInt, truthyInt) 1277 } 1278 1279 func floatAndFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1280 return boolAndOpV2(e, bind, chunk, ref, truthyFloat, truthyFloat) 1281 } 1282 1283 func floatOrFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1284 return boolOrOpV2(e, bind, chunk, ref, truthyFloat, truthyFloat) 1285 } 1286 1287 func stringAndStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1288 return boolAndOpV2(e, bind, chunk, ref, truthyString, truthyString) 1289 } 1290 1291 func stringOrStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1292 return boolOrOpV2(e, bind, chunk, ref, truthyString, truthyString) 1293 } 1294 1295 func regexAndRegexV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1296 return boolAndOpV2(e, bind, chunk, ref, truthyString, truthyString) 1297 } 1298 1299 func regexOrRegexV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1300 return boolOrOpV2(e, bind, chunk, ref, truthyString, truthyString) 1301 } 1302 1303 func arrayAndArrayV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1304 return boolAndOpV2(e, bind, chunk, ref, truthyArray, truthyArray) 1305 } 1306 1307 func arrayOrArrayV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1308 return boolOrOpV2(e, bind, chunk, ref, truthyArray, truthyArray) 1309 } 1310 1311 // bool &&/|| T 1312 1313 func boolAndIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1314 return boolAndOpV2(e, bind, chunk, ref, truthyBool, truthyInt) 1315 } 1316 1317 func boolOrIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1318 return boolOrOpV2(e, bind, chunk, ref, truthyBool, truthyInt) 1319 } 1320 1321 func intAndBoolV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1322 return boolAndOpV2(e, bind, chunk, ref, truthyInt, truthyBool) 1323 } 1324 1325 func intOrBoolV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1326 return boolOrOpV2(e, bind, chunk, ref, truthyInt, truthyBool) 1327 } 1328 1329 func boolAndFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1330 return boolAndOpV2(e, bind, chunk, ref, truthyBool, truthyFloat) 1331 } 1332 1333 func boolOrFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1334 return boolOrOpV2(e, bind, chunk, ref, truthyBool, truthyFloat) 1335 } 1336 1337 func floatAndBoolV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1338 return boolAndOpV2(e, bind, chunk, ref, truthyFloat, truthyBool) 1339 } 1340 1341 func floatOrBoolV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1342 return boolOrOpV2(e, bind, chunk, ref, truthyFloat, truthyBool) 1343 } 1344 1345 func boolAndStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1346 return boolAndOpV2(e, bind, chunk, ref, truthyBool, truthyString) 1347 } 1348 1349 func boolOrStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1350 return boolOrOpV2(e, bind, chunk, ref, truthyBool, truthyString) 1351 } 1352 1353 func stringAndBoolV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1354 return boolAndOpV2(e, bind, chunk, ref, truthyString, truthyBool) 1355 } 1356 1357 func stringOrBoolV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1358 return boolOrOpV2(e, bind, chunk, ref, truthyString, truthyBool) 1359 } 1360 1361 func boolAndRegexV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1362 return boolAndOpV2(e, bind, chunk, ref, truthyBool, truthyString) 1363 } 1364 1365 func boolOrRegexV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1366 return boolOrOpV2(e, bind, chunk, ref, truthyBool, truthyString) 1367 } 1368 1369 func regexAndBoolV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1370 return boolAndOpV2(e, bind, chunk, ref, truthyString, truthyBool) 1371 } 1372 1373 func regexOrBoolV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1374 return boolOrOpV2(e, bind, chunk, ref, truthyString, truthyBool) 1375 } 1376 1377 func boolAndArrayV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1378 return boolAndOpV2(e, bind, chunk, ref, truthyBool, truthyArray) 1379 } 1380 1381 func boolOrArrayV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1382 return boolOrOpV2(e, bind, chunk, ref, truthyBool, truthyArray) 1383 } 1384 1385 func arrayAndBoolV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1386 return boolAndOpV2(e, bind, chunk, ref, truthyArray, truthyBool) 1387 } 1388 1389 func arrayOrBoolV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1390 return boolOrOpV2(e, bind, chunk, ref, truthyArray, truthyBool) 1391 } 1392 1393 func opBoolAndMap(left interface{}, right interface{}) bool { 1394 return left.(bool) && (len(right.([]interface{})) != 0) 1395 } 1396 1397 func opMapAndBool(left interface{}, right interface{}) bool { 1398 return right.(bool) && (len(left.([]interface{})) != 0) 1399 } 1400 1401 func opBoolOrMap(left interface{}, right interface{}) bool { 1402 return left.(bool) || (len(right.([]interface{})) != 0) 1403 } 1404 1405 func opMapOrBool(left interface{}, right interface{}) bool { 1406 return right.(bool) || (len(left.([]interface{})) != 0) 1407 } 1408 1409 func boolAndMapV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1410 return boolOpV2(e, bind, chunk, ref, opBoolAndMap) 1411 } 1412 1413 func boolOrMapV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1414 return boolOpV2(e, bind, chunk, ref, opBoolOrMap) 1415 } 1416 1417 func mapAndBoolV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1418 return boolOpV2(e, bind, chunk, ref, opMapAndBool) 1419 } 1420 1421 func mapOrBoolV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1422 return boolOpV2(e, bind, chunk, ref, opMapOrBool) 1423 } 1424 1425 // int &&/|| T 1426 1427 func opIntAndFloat(left interface{}, right interface{}) bool { 1428 return (left.(int64) != 0) && (right.(float64) != 0) 1429 } 1430 1431 func opFloatAndInt(left interface{}, right interface{}) bool { 1432 return (right.(int64) != 0) && (left.(float64) != 0) 1433 } 1434 1435 func opIntOrFloat(left interface{}, right interface{}) bool { 1436 return (left.(int64) != 0) || (right.(float64) != 0) 1437 } 1438 1439 func opFloatOrInt(left interface{}, right interface{}) bool { 1440 return (right.(int64) != 0) || (left.(float64) != 0) 1441 } 1442 1443 func intAndFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1444 return boolOpV2(e, bind, chunk, ref, opIntAndFloat) 1445 } 1446 1447 func intOrFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1448 return boolOpV2(e, bind, chunk, ref, opIntOrFloat) 1449 } 1450 1451 func floatAndIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1452 return boolOpV2(e, bind, chunk, ref, opFloatAndInt) 1453 } 1454 1455 func floatOrIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1456 return boolOpV2(e, bind, chunk, ref, opFloatOrInt) 1457 } 1458 1459 func opIntAndString(left interface{}, right interface{}) bool { 1460 return (left.(int64) != 0) && (right.(string) != "") 1461 } 1462 1463 func opStringAndInt(left interface{}, right interface{}) bool { 1464 return (right.(int64) != 0) && (left.(string) != "") 1465 } 1466 1467 func opIntOrString(left interface{}, right interface{}) bool { 1468 return (left.(int64) != 0) || (right.(string) != "") 1469 } 1470 1471 func opStringOrInt(left interface{}, right interface{}) bool { 1472 return (right.(int64) != 0) || (left.(string) != "") 1473 } 1474 1475 func intAndStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1476 return boolOpV2(e, bind, chunk, ref, opIntAndString) 1477 } 1478 1479 func intOrStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1480 return boolOpV2(e, bind, chunk, ref, opIntOrString) 1481 } 1482 1483 func stringAndIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1484 return boolOpV2(e, bind, chunk, ref, opStringAndInt) 1485 } 1486 1487 func stringOrIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1488 return boolOpV2(e, bind, chunk, ref, opStringOrInt) 1489 } 1490 1491 func intAndRegexV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1492 return boolOpV2(e, bind, chunk, ref, opIntAndString) 1493 } 1494 1495 func intOrRegexV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1496 return boolOpV2(e, bind, chunk, ref, opIntOrString) 1497 } 1498 1499 func regexAndIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1500 return boolOpV2(e, bind, chunk, ref, opStringAndInt) 1501 } 1502 1503 func regexOrIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1504 return boolOpV2(e, bind, chunk, ref, opStringOrInt) 1505 } 1506 1507 func opIntAndArray(left interface{}, right interface{}) bool { 1508 return (left.(int64) != 0) && (len(right.([]interface{})) != 0) 1509 } 1510 1511 func opArrayAndInt(left interface{}, right interface{}) bool { 1512 return (right.(int64) != 0) && (len(left.([]interface{})) != 0) 1513 } 1514 1515 func opIntOrArray(left interface{}, right interface{}) bool { 1516 return (left.(int64) != 0) || (len(right.([]interface{})) != 0) 1517 } 1518 1519 func opArrayOrInt(left interface{}, right interface{}) bool { 1520 return (right.(int64) != 0) || (len(left.([]interface{})) != 0) 1521 } 1522 1523 func intAndArrayV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1524 return boolOpV2(e, bind, chunk, ref, opIntAndArray) 1525 } 1526 1527 func intOrArrayV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1528 return boolOpV2(e, bind, chunk, ref, opIntOrArray) 1529 } 1530 1531 func arrayAndIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1532 return boolOpV2(e, bind, chunk, ref, opArrayAndInt) 1533 } 1534 1535 func arrayOrIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1536 return boolOpV2(e, bind, chunk, ref, opArrayOrInt) 1537 } 1538 1539 func opIntAndMap(left interface{}, right interface{}) bool { 1540 return (left.(int64) != 0) && (len(right.(map[string]interface{})) != 0) 1541 } 1542 1543 func opMapAndInt(left interface{}, right interface{}) bool { 1544 return (right.(int64) != 0) && (len(left.(map[string]interface{})) != 0) 1545 } 1546 1547 func opIntOrMap(left interface{}, right interface{}) bool { 1548 return (left.(int64) != 0) || (len(right.(map[string]interface{})) != 0) 1549 } 1550 1551 func opMapOrInt(left interface{}, right interface{}) bool { 1552 return (right.(int64) != 0) || (len(left.(map[string]interface{})) != 0) 1553 } 1554 1555 func intAndMapV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1556 return boolOpV2(e, bind, chunk, ref, opIntAndMap) 1557 } 1558 1559 func intOrMapV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1560 return boolOpV2(e, bind, chunk, ref, opIntOrMap) 1561 } 1562 1563 func mapAndIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1564 return boolOpV2(e, bind, chunk, ref, opMapAndInt) 1565 } 1566 1567 func mapOrIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1568 return boolOpV2(e, bind, chunk, ref, opMapOrInt) 1569 } 1570 1571 // float &&/|| T 1572 1573 func opFloatAndString(left interface{}, right interface{}) bool { 1574 return (left.(float64) != 0) && (right.(string) != "") 1575 } 1576 1577 func opStringAndFloat(left interface{}, right interface{}) bool { 1578 return (right.(float64) != 0) && (left.(string) != "") 1579 } 1580 1581 func opFloatOrString(left interface{}, right interface{}) bool { 1582 return (left.(float64) != 0) || (right.(string) != "") 1583 } 1584 1585 func opStringOrFloat(left interface{}, right interface{}) bool { 1586 return (right.(float64) != 0) || (left.(string) != "") 1587 } 1588 1589 func floatAndStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1590 return boolOpV2(e, bind, chunk, ref, opFloatAndString) 1591 } 1592 1593 func floatOrStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1594 return boolOpV2(e, bind, chunk, ref, opFloatOrString) 1595 } 1596 1597 func stringAndFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1598 return boolOpV2(e, bind, chunk, ref, opStringAndFloat) 1599 } 1600 1601 func stringOrFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1602 return boolOpV2(e, bind, chunk, ref, opStringOrFloat) 1603 } 1604 1605 func floatAndRegexV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1606 return boolOpV2(e, bind, chunk, ref, opFloatAndString) 1607 } 1608 1609 func floatOrRegexV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1610 return boolOpV2(e, bind, chunk, ref, opFloatOrString) 1611 } 1612 1613 func regexAndFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1614 return boolOpV2(e, bind, chunk, ref, opStringAndFloat) 1615 } 1616 1617 func regexOrFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1618 return boolOpV2(e, bind, chunk, ref, opStringOrFloat) 1619 } 1620 1621 func opFloatAndArray(left interface{}, right interface{}) bool { 1622 return (left.(float64) != 0) && (len(right.([]interface{})) != 0) 1623 } 1624 1625 func opArrayAndFloat(left interface{}, right interface{}) bool { 1626 return (right.(float64) != 0) && (len(left.([]interface{})) != 0) 1627 } 1628 1629 func opFloatOrArray(left interface{}, right interface{}) bool { 1630 return (left.(float64) != 0) || (len(right.([]interface{})) != 0) 1631 } 1632 1633 func opArrayOrFloat(left interface{}, right interface{}) bool { 1634 return (right.(float64) != 0) || (len(left.([]interface{})) != 0) 1635 } 1636 1637 func floatAndArrayV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1638 return boolOpV2(e, bind, chunk, ref, opFloatAndArray) 1639 } 1640 1641 func floatOrArrayV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1642 return boolOpV2(e, bind, chunk, ref, opFloatOrArray) 1643 } 1644 1645 func arrayAndFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1646 return boolOpV2(e, bind, chunk, ref, opArrayAndFloat) 1647 } 1648 1649 func arrayOrFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1650 return boolOpV2(e, bind, chunk, ref, opArrayOrFloat) 1651 } 1652 1653 func opFloatAndMap(left interface{}, right interface{}) bool { 1654 return (left.(float64) != 0) && (len(right.(map[string]interface{})) != 0) 1655 } 1656 1657 func opMapAndFloat(left interface{}, right interface{}) bool { 1658 return (right.(float64) != 0) && (len(left.(map[string]interface{})) != 0) 1659 } 1660 1661 func opFloatOrMap(left interface{}, right interface{}) bool { 1662 return (left.(float64) != 0) || (len(right.(map[string]interface{})) != 0) 1663 } 1664 1665 func opMapOrFloat(left interface{}, right interface{}) bool { 1666 return (right.(float64) != 0) || (len(left.(map[string]interface{})) != 0) 1667 } 1668 1669 func floatAndMapV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1670 return boolOpV2(e, bind, chunk, ref, opFloatAndMap) 1671 } 1672 1673 func floatOrMapV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1674 return boolOpV2(e, bind, chunk, ref, opFloatOrMap) 1675 } 1676 1677 func mapAndFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1678 return boolOpV2(e, bind, chunk, ref, opMapAndFloat) 1679 } 1680 1681 func mapOrFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1682 return boolOpV2(e, bind, chunk, ref, opMapOrFloat) 1683 } 1684 1685 // string &&/|| T 1686 1687 func stringAndRegexV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1688 return boolAndOpV2(e, bind, chunk, ref, truthyString, truthyString) 1689 } 1690 1691 func stringOrRegexV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1692 return boolOrOpV2(e, bind, chunk, ref, truthyString, truthyString) 1693 } 1694 1695 func regexAndStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1696 return boolAndOpV2(e, bind, chunk, ref, truthyString, truthyString) 1697 } 1698 1699 func regexOrStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1700 return boolOrOpV2(e, bind, chunk, ref, truthyString, truthyString) 1701 } 1702 1703 func opStringAndArray(left interface{}, right interface{}) bool { 1704 return (left.(float64) != 0) && (len(right.([]interface{})) != 0) 1705 } 1706 1707 func opArrayAndString(left interface{}, right interface{}) bool { 1708 return (right.(float64) != 0) && (len(left.([]interface{})) != 0) 1709 } 1710 1711 func opStringOrArray(left interface{}, right interface{}) bool { 1712 return (left.(float64) != 0) || (len(right.([]interface{})) != 0) 1713 } 1714 1715 func opArrayOrString(left interface{}, right interface{}) bool { 1716 return (right.(float64) != 0) || (len(left.([]interface{})) != 0) 1717 } 1718 1719 func stringAndArrayV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1720 return boolOpV2(e, bind, chunk, ref, opStringAndArray) 1721 } 1722 1723 func stringOrArrayV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1724 return boolOpV2(e, bind, chunk, ref, opStringOrArray) 1725 } 1726 1727 func arrayAndStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1728 return boolOpV2(e, bind, chunk, ref, opArrayAndString) 1729 } 1730 1731 func arrayOrStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1732 return boolOpV2(e, bind, chunk, ref, opArrayOrString) 1733 } 1734 1735 func opStringAndMap(left interface{}, right interface{}) bool { 1736 return (left.(float64) != 0) && (len(right.(map[string]interface{})) != 0) 1737 } 1738 1739 func opMapAndString(left interface{}, right interface{}) bool { 1740 return (right.(float64) != 0) && (len(left.(map[string]interface{})) != 0) 1741 } 1742 1743 func opStringOrMap(left interface{}, right interface{}) bool { 1744 return (left.(float64) != 0) || (len(right.(map[string]interface{})) != 0) 1745 } 1746 1747 func opMapOrString(left interface{}, right interface{}) bool { 1748 return (right.(float64) != 0) || (len(left.(map[string]interface{})) != 0) 1749 } 1750 1751 func stringAndMapV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1752 return boolOpV2(e, bind, chunk, ref, opStringAndMap) 1753 } 1754 1755 func stringOrMapV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1756 return boolOpV2(e, bind, chunk, ref, opStringOrMap) 1757 } 1758 1759 func mapAndStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1760 return boolOpV2(e, bind, chunk, ref, opMapAndString) 1761 } 1762 1763 func mapOrStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1764 return boolOpV2(e, bind, chunk, ref, opMapOrString) 1765 } 1766 1767 // string + T 1768 1769 func stringPlusStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1770 return dataOpV2(e, bind, chunk, ref, types.Time, func(left interface{}, right interface{}) *RawData { 1771 l := left.(string) 1772 r := right.(string) 1773 1774 return StringData(l + r) 1775 }) 1776 } 1777 1778 // regex &&/|| array 1779 1780 func regexAndArrayV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1781 return boolOpV2(e, bind, chunk, ref, opStringAndArray) 1782 } 1783 1784 func regexOrArrayV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1785 return boolOpV2(e, bind, chunk, ref, opStringOrArray) 1786 } 1787 1788 func arrayAndRegexV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1789 return boolOpV2(e, bind, chunk, ref, opArrayAndString) 1790 } 1791 1792 func arrayOrRegexV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1793 return boolOpV2(e, bind, chunk, ref, opArrayOrString) 1794 } 1795 1796 // regex &&/|| map 1797 1798 func regexAndMapV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1799 return boolOpV2(e, bind, chunk, ref, opStringAndMap) 1800 } 1801 1802 func regexOrMapV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1803 return boolOpV2(e, bind, chunk, ref, opStringOrMap) 1804 } 1805 1806 func mapAndRegexV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1807 return boolOpV2(e, bind, chunk, ref, opMapAndString) 1808 } 1809 1810 func mapOrRegexV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1811 return boolOpV2(e, bind, chunk, ref, opMapOrString) 1812 } 1813 1814 // time &&/|| T 1815 // note: time is always truthy 1816 1817 func opBoolAndTime(left interface{}, right interface{}) bool { 1818 return left.(bool) 1819 } 1820 1821 func opTimeAndBool(left interface{}, right interface{}) bool { 1822 return right.(bool) 1823 } 1824 1825 func boolAndTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1826 return boolOpV2(e, bind, chunk, ref, opBoolAndTime) 1827 } 1828 1829 func boolOrTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1830 return BoolTrue, 0, nil 1831 } 1832 1833 func timeAndBoolV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1834 return boolOpV2(e, bind, chunk, ref, opTimeAndBool) 1835 } 1836 1837 func timeOrBoolV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1838 return BoolTrue, 0, nil 1839 } 1840 1841 func opIntAndTime(left interface{}, right interface{}) bool { 1842 return left.(int64) != 0 1843 } 1844 1845 func opTimeAndInt(left interface{}, right interface{}) bool { 1846 return right.(int64) != 0 1847 } 1848 1849 func intAndTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1850 return boolOpV2(e, bind, chunk, ref, opIntAndTime) 1851 } 1852 1853 func intOrTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1854 return BoolTrue, 0, nil 1855 } 1856 1857 func timeAndIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1858 return boolOpV2(e, bind, chunk, ref, opTimeAndInt) 1859 } 1860 1861 func timeOrIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1862 return BoolTrue, 0, nil 1863 } 1864 1865 func opFloatAndTime(left interface{}, right interface{}) bool { 1866 return left.(float64) != 0 1867 } 1868 1869 func opTimeAndFloat(left interface{}, right interface{}) bool { 1870 return right.(float64) != 0 1871 } 1872 1873 func floatAndTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1874 return boolOpV2(e, bind, chunk, ref, opFloatAndTime) 1875 } 1876 1877 func floatOrTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1878 return BoolTrue, 0, nil 1879 } 1880 1881 func timeAndFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1882 return boolOpV2(e, bind, chunk, ref, opTimeAndFloat) 1883 } 1884 1885 func timeOrFloatV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1886 return BoolTrue, 0, nil 1887 } 1888 1889 func opStringAndTime(left interface{}, right interface{}) bool { 1890 return left.(string) != "" 1891 } 1892 1893 func opTimeAndString(left interface{}, right interface{}) bool { 1894 return right.(string) != "" 1895 } 1896 1897 func stringAndTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1898 return boolOpV2(e, bind, chunk, ref, opStringAndTime) 1899 } 1900 1901 func stringOrTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1902 return BoolTrue, 0, nil 1903 } 1904 1905 func timeAndStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1906 return boolOpV2(e, bind, chunk, ref, opTimeAndString) 1907 } 1908 1909 func timeOrStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1910 return BoolTrue, 0, nil 1911 } 1912 1913 func opRegexAndTime(left interface{}, right interface{}) bool { 1914 return left.(string) != "" 1915 } 1916 1917 func opTimeAndRegex(left interface{}, right interface{}) bool { 1918 return right.(string) != "" 1919 } 1920 1921 func regexAndTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1922 return boolOpV2(e, bind, chunk, ref, opRegexAndTime) 1923 } 1924 1925 func regexOrTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1926 return BoolTrue, 0, nil 1927 } 1928 1929 func timeAndRegexV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1930 return boolOpV2(e, bind, chunk, ref, opTimeAndRegex) 1931 } 1932 1933 func timeOrRegexV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1934 return BoolTrue, 0, nil 1935 } 1936 1937 func timeAndTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1938 return BoolTrue, 0, nil 1939 } 1940 1941 func timeOrTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1942 return BoolTrue, 0, nil 1943 } 1944 1945 func opTimeAndArray(left interface{}, right interface{}) bool { 1946 return len(right.([]interface{})) != 0 1947 } 1948 1949 func opArrayAndTime(left interface{}, right interface{}) bool { 1950 return len(left.([]interface{})) != 0 1951 } 1952 1953 func timeAndArrayV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1954 return boolOpV2(e, bind, chunk, ref, opTimeAndArray) 1955 } 1956 1957 func timeOrArrayV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1958 return BoolTrue, 0, nil 1959 } 1960 1961 func arrayAndTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1962 return boolOpV2(e, bind, chunk, ref, opArrayAndTime) 1963 } 1964 1965 func arrayOrTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1966 return BoolTrue, 0, nil 1967 } 1968 1969 func opTimeAndMap(left interface{}, right interface{}) bool { 1970 return len(right.(map[string]interface{})) != 0 1971 } 1972 1973 func opMapAndTime(left interface{}, right interface{}) bool { 1974 return len(left.(map[string]interface{})) != 0 1975 } 1976 1977 func timeAndMapV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1978 return boolOpV2(e, bind, chunk, ref, opTimeAndMap) 1979 } 1980 1981 func timeOrMapV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1982 return BoolTrue, 0, nil 1983 } 1984 1985 func mapAndTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1986 return boolOpV2(e, bind, chunk, ref, opMapAndTime) 1987 } 1988 1989 func mapOrTimeV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1990 return BoolTrue, 0, nil 1991 } 1992 1993 // string methods 1994 1995 func stringContainsStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 1996 if bind.Value == nil { 1997 return BoolFalse, 0, nil 1998 } 1999 2000 argRef := chunk.Function.Args[0] 2001 arg, rref, err := e.resolveValue(argRef, ref) 2002 if err != nil || rref > 0 { 2003 return nil, rref, err 2004 } 2005 2006 if arg.Value == nil { 2007 return BoolFalse, 0, nil 2008 } 2009 2010 ok := strings.Contains(bind.Value.(string), arg.Value.(string)) 2011 return BoolData(ok), 0, nil 2012 } 2013 2014 func stringContainsIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 2015 if bind.Value == nil { 2016 return BoolFalse, 0, nil 2017 } 2018 2019 argRef := chunk.Function.Args[0] 2020 arg, rref, err := e.resolveValue(argRef, ref) 2021 if err != nil || rref > 0 { 2022 return nil, rref, err 2023 } 2024 2025 if arg.Value == nil { 2026 return BoolFalse, 0, nil 2027 } 2028 2029 val := strconv.FormatInt(arg.Value.(int64), 10) 2030 2031 ok := strings.Contains(bind.Value.(string), val) 2032 return BoolData(ok), 0, nil 2033 } 2034 2035 func stringContainsRegex(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 2036 if bind.Value == nil { 2037 return BoolFalse, 0, nil 2038 } 2039 2040 argRef := chunk.Function.Args[0] 2041 arg, rref, err := e.resolveValue(argRef, ref) 2042 if err != nil || rref > 0 { 2043 return nil, rref, err 2044 } 2045 2046 if arg.Value == nil { 2047 return BoolFalse, 0, nil 2048 } 2049 2050 reContent := arg.Value.(string) 2051 re, err := regexp.Compile(reContent) 2052 if err != nil { 2053 return nil, 0, errors.New("Failed to compile regular expression: " + reContent) 2054 } 2055 2056 ok := re.MatchString(bind.Value.(string)) 2057 return BoolData(ok), 0, nil 2058 } 2059 2060 func stringContainsArrayStringV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 2061 if bind.Value == nil { 2062 return BoolFalse, 0, nil 2063 } 2064 2065 argRef := chunk.Function.Args[0] 2066 arg, rref, err := e.resolveValue(argRef, ref) 2067 if err != nil || rref > 0 { 2068 return nil, rref, err 2069 } 2070 2071 if arg.Value == nil { 2072 return BoolFalse, 0, nil 2073 } 2074 2075 arr := arg.Value.([]interface{}) 2076 for i := range arr { 2077 v := arr[i].(string) 2078 if strings.Contains(bind.Value.(string), v) { 2079 return BoolData(true), 0, nil 2080 } 2081 } 2082 2083 return BoolData(false), 0, nil 2084 } 2085 2086 func stringContainsArrayIntV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 2087 if bind.Value == nil { 2088 return BoolFalse, 0, nil 2089 } 2090 2091 argRef := chunk.Function.Args[0] 2092 arg, rref, err := e.resolveValue(argRef, ref) 2093 if err != nil || rref > 0 { 2094 return nil, rref, err 2095 } 2096 2097 if arg.Value == nil { 2098 return BoolFalse, 0, nil 2099 } 2100 2101 arr := arg.Value.([]interface{}) 2102 for i := range arr { 2103 v := arr[i].(int64) 2104 val := strconv.FormatInt(v, 10) 2105 if strings.Contains(bind.Value.(string), val) { 2106 return BoolData(true), 0, nil 2107 } 2108 } 2109 2110 return BoolData(false), 0, nil 2111 } 2112 2113 func stringContainsArrayRegex(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 2114 if bind.Value == nil { 2115 return BoolFalse, 0, nil 2116 } 2117 2118 argRef := chunk.Function.Args[0] 2119 arg, rref, err := e.resolveValue(argRef, ref) 2120 if err != nil || rref > 0 { 2121 return nil, rref, err 2122 } 2123 2124 if arg.Value == nil { 2125 return BoolFalse, 0, nil 2126 } 2127 2128 arr := arg.Value.([]interface{}) 2129 for i := range arr { 2130 v := arr[i].(string) 2131 re, err := regexp.Compile(v) 2132 if err != nil { 2133 return nil, 0, errors.New("Failed to compile regular expression: " + v) 2134 } 2135 2136 if re.MatchString(bind.Value.(string)) { 2137 return BoolData(true), 0, nil 2138 } 2139 } 2140 2141 return BoolData(false), 0, nil 2142 } 2143 2144 func stringFindV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 2145 if bind.Value == nil { 2146 return ArrayData([]interface{}{}, types.String), 0, nil 2147 } 2148 2149 argRef := chunk.Function.Args[0] 2150 arg, rref, err := e.resolveValue(argRef, ref) 2151 if err != nil || rref > 0 { 2152 return nil, rref, err 2153 } 2154 2155 if arg.Value == nil { 2156 return ArrayData([]interface{}{}, types.String), 0, nil 2157 } 2158 2159 reContent := arg.Value.(string) 2160 re, err := regexp.Compile(reContent) 2161 if err != nil { 2162 return nil, 0, errors.New("Failed to compile regular expression: " + reContent) 2163 } 2164 2165 list := re.FindAllString(bind.Value.(string), -1) 2166 res := make([]interface{}, len(list)) 2167 for i := range list { 2168 res[i] = list[i] 2169 } 2170 2171 return ArrayData(res, types.String), 0, nil 2172 } 2173 2174 func stringDowncaseV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 2175 if bind.Value == nil { 2176 return &RawData{Type: bind.Type}, 0, nil 2177 } 2178 2179 res := strings.ToLower(bind.Value.(string)) 2180 return StringData(res), 0, nil 2181 } 2182 2183 var camelCaseRe = regexp.MustCompile(`([[:punct:]]|\s)+[\p{L}]`) 2184 2185 func stringCamelcaseV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 2186 if bind.Value == nil { 2187 return &RawData{Type: bind.Type}, 0, nil 2188 } 2189 2190 res := camelCaseRe.ReplaceAllStringFunc(bind.Value.(string), func(in string) string { 2191 reader := strings.NewReader(in) 2192 var last rune 2193 for { 2194 r, _, err := reader.ReadRune() 2195 if err == io.EOF { 2196 break 2197 } 2198 if err != nil { 2199 return in 2200 } 2201 last = r 2202 } 2203 2204 return string(unicode.ToTitle(last)) 2205 }) 2206 2207 return StringData(res), 0, nil 2208 } 2209 2210 func stringUpcaseV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 2211 if bind.Value == nil { 2212 return &RawData{Type: bind.Type}, 0, nil 2213 } 2214 2215 res := strings.ToUpper(bind.Value.(string)) 2216 return StringData(res), 0, nil 2217 } 2218 2219 func stringLengthV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 2220 if bind.Value == nil { 2221 return &RawData{Type: types.Int}, 0, nil 2222 } 2223 2224 l := len(bind.Value.(string)) 2225 return IntData(int64(l)), 0, nil 2226 } 2227 2228 func stringLinesV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 2229 if bind.Value == nil { 2230 return &RawData{Type: types.Array(types.String)}, 0, nil 2231 } 2232 2233 s := bind.Value.(string) 2234 lines := strings.Split(s, "\n") 2235 res := make([]interface{}, len(lines)) 2236 for i := range lines { 2237 res[i] = lines[i] 2238 } 2239 2240 return ArrayData(res, types.String), 0, nil 2241 } 2242 2243 func stringSplitV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 2244 if bind.Value == nil { 2245 return &RawData{Type: types.Array(types.String)}, 0, nil 2246 } 2247 2248 argRef := chunk.Function.Args[0] 2249 arg, rref, err := e.resolveValue(argRef, ref) 2250 if err != nil || rref > 0 { 2251 return nil, rref, err 2252 } 2253 2254 if arg.Value == nil { 2255 return &RawData{ 2256 Type: types.Array(types.String), 2257 Value: nil, 2258 Error: errors.New("failed to split string, separator was null"), 2259 }, 0, nil 2260 } 2261 2262 splits := strings.Split(bind.Value.(string), arg.Value.(string)) 2263 res := make([]interface{}, len(splits)) 2264 for i := range splits { 2265 res[i] = splits[i] 2266 } 2267 2268 return ArrayData(res, types.String), 0, nil 2269 } 2270 2271 func stringTrimV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 2272 if bind.Value == nil { 2273 return &RawData{Type: bind.Type}, 0, nil 2274 } 2275 2276 cutset := " \t\n\r" 2277 2278 if len(chunk.Function.Args) != 0 { 2279 argRef := chunk.Function.Args[0] 2280 arg, rref, err := e.resolveValue(argRef, ref) 2281 if err != nil || rref > 0 { 2282 return nil, rref, err 2283 } 2284 2285 if arg.Value == nil { 2286 return &RawData{ 2287 Type: bind.Type, 2288 Value: nil, 2289 Error: errors.New("failed to trim string, cutset was null"), 2290 }, 0, nil 2291 } 2292 2293 cutset = arg.Value.(string) 2294 } 2295 2296 res := strings.Trim(bind.Value.(string), cutset) 2297 2298 return StringData(res), 0, nil 2299 } 2300 2301 // time methods 2302 2303 // zeroTimeOffset to help convert unix times into base times that start at the year 0 2304 const zeroTimeOffset int64 = -62167219200 2305 2306 // TimeToDuration takes a regular time object and treats it as a duration and gets the duration in seconds 2307 func TimeToDuration(t *time.Time) int64 { 2308 return t.Unix() - zeroTimeOffset 2309 } 2310 2311 // DurationToTime takes a duration in seconds and turns it into a time object 2312 func DurationToTime(i int64) time.Time { 2313 return time.Unix(i+zeroTimeOffset, 0) 2314 } 2315 2316 func timeSecondsV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 2317 t := bind.Value.(*time.Time) 2318 if t == nil { 2319 return &RawData{Type: types.Array(types.Time)}, 0, nil 2320 } 2321 2322 if *t == NeverPastTime { 2323 return MinIntPrimitive.RawData(), 0, nil 2324 } 2325 if *t == NeverFutureTime { 2326 return MaxIntPrimitive.RawData(), 0, nil 2327 } 2328 2329 raw := TimeToDuration(t) 2330 return IntData(int64(raw)), 0, nil 2331 } 2332 2333 func timeMinutesV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 2334 t := bind.Value.(*time.Time) 2335 if t == nil { 2336 return &RawData{Type: types.Array(types.Time)}, 0, nil 2337 } 2338 2339 if *t == NeverPastTime { 2340 return MinIntPrimitive.RawData(), 0, nil 2341 } 2342 if *t == NeverFutureTime { 2343 return MaxIntPrimitive.RawData(), 0, nil 2344 } 2345 2346 raw := TimeToDuration(t) / 60 2347 return IntData(int64(raw)), 0, nil 2348 } 2349 2350 func timeHoursV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 2351 t := bind.Value.(*time.Time) 2352 if t == nil { 2353 return &RawData{Type: types.Array(types.Time)}, 0, nil 2354 } 2355 2356 if *t == NeverPastTime { 2357 return MinIntPrimitive.RawData(), 0, nil 2358 } 2359 if *t == NeverFutureTime { 2360 return MaxIntPrimitive.RawData(), 0, nil 2361 } 2362 2363 raw := TimeToDuration(t) / (60 * 60) 2364 return IntData(int64(raw)), 0, nil 2365 } 2366 2367 func timeDaysV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 2368 t := bind.Value.(*time.Time) 2369 if t == nil { 2370 return &RawData{Type: types.Array(types.Time)}, 0, nil 2371 } 2372 2373 if *t == NeverPastTime { 2374 return MinIntPrimitive.RawData(), 0, nil 2375 } 2376 if *t == NeverFutureTime { 2377 return MaxIntPrimitive.RawData(), 0, nil 2378 } 2379 2380 raw := TimeToDuration(t) / (60 * 60 * 24) 2381 return IntData(int64(raw)), 0, nil 2382 } 2383 2384 func timeUnixV2(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 2385 t := bind.Value.(*time.Time) 2386 if t == nil { 2387 return &RawData{Type: types.Array(types.Time)}, 0, nil 2388 } 2389 2390 raw := t.Unix() 2391 return IntData(int64(raw)), 0, nil 2392 } 2393 2394 // stringslice methods 2395 2396 func stringsliceEqString(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 2397 return dataOpV2(e, bind, chunk, ref, types.Int, func(left interface{}, right interface{}) *RawData { 2398 l := left.(string) 2399 r := right.(string) 2400 idx := strings.Index(l, r) 2401 if idx == -1 { 2402 return StringData("") 2403 } 2404 return StringData(r) 2405 }) 2406 } 2407 2408 func stringsliceEqArrayString(e *blockExecutor, bind *RawData, chunk *Chunk, ref uint64) (*RawData, uint64, error) { 2409 return dataOpV2(e, bind, chunk, ref, types.Int, func(left interface{}, right interface{}) *RawData { 2410 l := left.(string) 2411 arr := right.([]interface{}) 2412 for i := range arr { 2413 r := arr[i].(string) 2414 idx := strings.Index(l, r) 2415 if idx != -1 { 2416 return StringData(r) 2417 } 2418 } 2419 2420 return StringData("") 2421 }) 2422 }