| 170 | } // namespace |
| 171 | |
| 172 | std::unique_ptr<MetadataFilter::Node> MetadataFilter::Node::fromExpression( |
| 173 | const core::ITypedExpr& expr, |
| 174 | core::ExpressionEvaluator* evaluator, |
| 175 | bool negated, |
| 176 | bool enableMapSubscriptFilter) { |
| 177 | auto* call = asCall(&expr); |
| 178 | if (!call) { |
| 179 | return nullptr; |
| 180 | } |
| 181 | if (call->name() == "and") { |
| 182 | auto lhs = fromExpression( |
| 183 | *call->inputs()[0], evaluator, negated, enableMapSubscriptFilter); |
| 184 | auto rhs = fromExpression( |
| 185 | *call->inputs()[1], evaluator, negated, enableMapSubscriptFilter); |
| 186 | return negated ? OrNode::create(std::move(lhs), std::move(rhs)) |
| 187 | : AndNode::create(std::move(lhs), std::move(rhs)); |
| 188 | } |
| 189 | if (call->name() == "or") { |
| 190 | auto lhs = fromExpression( |
| 191 | *call->inputs()[0], evaluator, negated, enableMapSubscriptFilter); |
| 192 | auto rhs = fromExpression( |
| 193 | *call->inputs()[1], evaluator, negated, enableMapSubscriptFilter); |
| 194 | return negated ? AndNode::create(std::move(lhs), std::move(rhs)) |
| 195 | : OrNode::create(std::move(lhs), std::move(rhs)); |
| 196 | } |
| 197 | if (call->name() == "not") { |
| 198 | return fromExpression( |
| 199 | *call->inputs()[0], evaluator, !negated, enableMapSubscriptFilter); |
| 200 | } |
| 201 | try { |
| 202 | auto subfieldAndFilter = |
| 203 | exec::ExprToSubfieldFilterParser::getInstance() |
| 204 | ->leafCallToSubfieldFilter(*call, evaluator, negated); |
| 205 | if (!subfieldAndFilter.has_value()) { |
| 206 | return nullptr; |
| 207 | } |
| 208 | |
| 209 | auto& [subfield, filter] = subfieldAndFilter.value(); |
| 210 | if (filter->kind() == FilterKind::kMapSubscript && |
| 211 | !enableMapSubscriptFilter) { |
| 212 | return nullptr; |
| 213 | } |
| 214 | BOLT_CHECK( |
| 215 | subfield.valid(), |
| 216 | "Invalid subfield from expression: {}", |
| 217 | expr.toString()); |
| 218 | return std::make_unique<LeafNode>(std::move(subfield), std::move(filter)); |
| 219 | } catch (const BoltException&) { |
| 220 | LOG(WARNING) << "Fail to convert expression to metadata filter: " |
| 221 | << expr.toString(); |
| 222 | return nullptr; |
| 223 | } |
| 224 | } |
| 225 | |
| 226 | MetadataFilter::MetadataFilter( |
| 227 | ScanSpec& scanSpec, |