MCPcopy Create free account
hub / github.com/bytedance/bolt / fromExpression

Method fromExpression

bolt/dwio/common/MetadataFilter.cpp:172–224  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

170} // namespace
171
172std::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
226MetadataFilter::MetadataFilter(
227 ScanSpec& scanSpec,

Callers

nothing calls this directly

Calls 9

asCallFunction · 0.85
has_valueMethod · 0.80
createFunction · 0.50
nameMethod · 0.45
valueMethod · 0.45
kindMethod · 0.45
validMethod · 0.45
toStringMethod · 0.45

Tested by

no test coverage detected