From 11ce6f8f72b895881cea82508596e47ae07257bd Mon Sep 17 00:00:00 2001 From: Alejandro Martinez Date: Mon, 6 Apr 2026 19:05:44 -0300 Subject: [PATCH] DataFilter vectors - vectorize = <> < <= > >= operations Similar to b24869e for relational operators Fixes #4856 --- src/Core/DataFilter.cpp | 73 +++++++++++++++++++++++++---------------- 1 file changed, 44 insertions(+), 29 deletions(-) diff --git a/src/Core/DataFilter.cpp b/src/Core/DataFilter.cpp index b3973041c..ff64d4d5c 100644 --- a/src/Core/DataFilter.cpp +++ b/src/Core/DataFilter.cpp @@ -8259,42 +8259,57 @@ Result Leaf::eval(DataFilterRuntime *df, Leaf *leaf, const Result &x, long it, R } break; + // relational operations should all work with vectors or scalars case EQ: - { - if (lhs.isNumber) return Result(lhs.number() == rhs.number()); - else return Result(lhs.string() == rhs.string()); - } - break; - case NEQ: - { - if (lhs.isNumber) return Result(lhs.number() != rhs.number()); - else return Result(lhs.string() != rhs.string()); - } - break; - case LT: - { - if (lhs.isNumber) return Result(lhs.number() < rhs.number()); - else return Result(lhs.string() < rhs.string()); - } - break; case LTE: - { - if (lhs.isNumber) return Result(lhs.number() <= rhs.number()); - else return Result(lhs.string() <= rhs.string()); - } - break; case GT: - { - if (lhs.isNumber) return Result(lhs.number() > rhs.number()); - else return Result(lhs.string() > rhs.string()); - } - break; case GTE: { - if (lhs.isNumber) return Result(lhs.number() >= rhs.number()); - else return Result(lhs.string() >= rhs.string()); + if (lhs.isVector() || rhs.isVector()) { + + Result returning(0); + // coerce both into a vector of matching size + int size = std::max(lhs.isNumber ? lhs.asNumeric().count() : lhs.asString().count(), + rhs.isNumber ? rhs.asNumeric().count() : rhs.asString().count()); + lhs.vectorize(size); + rhs.vectorize(size); + + for(int i=0; iop) { + case EQ: value = lhs.isNumber ? lhs.number() == rhs.number() : lhs.string() == rhs.string(); break; + case NEQ: value = lhs.isNumber ? lhs.number() != rhs.number() : lhs.string() != rhs.string(); break; + case LT: value = lhs.isNumber ? lhs.number() < rhs.number() : lhs.string() < rhs.string(); break; + case LTE: value = lhs.isNumber ? lhs.number() <= rhs.number() : lhs.string() <= rhs.string(); break; + case GT: value = lhs.isNumber ? lhs.number() > rhs.number() : lhs.string() > rhs.string(); break; + case GTE: value = lhs.isNumber ? lhs.number() >= rhs.number() : lhs.string() >= rhs.string(); break; + } + returning.asNumeric() << value; + returning.number() += value; + } + return returning; + + } else { + + switch (leaf->op) { + case EQ: if (lhs.isNumber) return Result(lhs.number() == rhs.number()); + else return Result(lhs.string() == rhs.string()); + case NEQ: if (lhs.isNumber) return Result(lhs.number() != rhs.number()); + else return Result(lhs.string() != rhs.string()); + case LT: if (lhs.isNumber) return Result(lhs.number() < rhs.number()); + else return Result(lhs.string() < rhs.string()); + case LTE: if (lhs.isNumber) return Result(lhs.number() <= rhs.number()); + else return Result(lhs.string() <= rhs.string()); + case GT: if (lhs.isNumber) return Result(lhs.number() > rhs.number()); + else return Result(lhs.string() > rhs.string()); + case GTE: if (lhs.isNumber) return Result(lhs.number() >= rhs.number()); + else return Result(lhs.string() >= rhs.string()); + } + } } break;