88#include < vector>
99
1010#include " clippy/selector.hpp"
11+ #include " jsonlogic/logic.hpp"
1112#include " testgraph.hpp"
1213
1314template <typename M>
1415auto parse_where_expression (M& mvmap_, boost::json::object& expression,
1516 boost::json::object& submission_data) {
16- std::cerr << " parse_where_expression: expression: " << expression
17- << std::endl;
17+ // std::cerr << " parse_where_expression: expression: " << expression
18+ // << std::endl;
1819 boost::json::object exp2 (expression);
1920
21+ std::shared_ptr<jsonlogic::logic_rule> jlrule =
22+ std::make_shared<jsonlogic::logic_rule>(
23+ jsonlogic::create_logic (exp2[" rule" ]));
24+ // std::cerr << "past create_logic\n";
25+ auto vars = jlrule->variable_names ();
2026 // boost::json::object submission_data{};
21- std::vector<boost::json::string> vars ;
27+ // jsonlogic::any_expr expression_rule_ ;
2228
2329 // we use expression_rule_ (and expression_rule; see below) in order to avoid
2430 // having to recompute this every time we call the lambda.
25- jsonlogic::logic_rule jlrule = jsonlogic::create_logic (exp2[" rule" ]);
31+ // std::tie(expression_rule_, vars, std::ignore) =
32+ // jsonlogic::create_logic(exp2["rule"]);
2633
27- std::cerr << " parse_where: # of vars: " << vars.size () << std::endl;
28- for (const auto & var : vars) {
29- std::cerr << " apply_jl var dump: var: " << var << std::endl;
30- }
34+ // this works around a deficiency in C++ compilers where
35+ // unique pointers moved into a lambda cannot be moved into
36+ // an std::function.
37+ // jsonlogic::expr* rawexpr = expression_rule_.release();
38+ // std::shared_ptr<jsonlogic::expr> expression_rule{rawexpr};
39+ // std::shared_ptr<jsonlogic::logic_rule> jlshared{&jlrule};
3140
32- auto apply_jl = [rule=std::move (jlrule), vars, &mvmap_,
41+ // std::cerr << "parse_where: # of vars: " << vars.size() << std::endl;
42+ // for (const auto& var : vars) {
43+ // std::cerr << " apply_jl var dump: var: " << var << std::endl;
44+ // }
45+
46+ auto apply_jl = [&expression, jlrule, &mvmap_,
3347 &submission_data](mvmap::locator loc) mutable {
34- std::cerr << " apply_jl: # of vars: " << vars.size () << std::endl;
48+ auto vars = jlrule->variable_names ();
49+ // std::cerr << " apply_jl: # of vars: " << vars.size() << std::endl;
3550 for (const auto & var : vars) {
36- std::cerr << " apply_jl: var: " << var << std::endl;
51+ // std::cerr << " apply_jl: var: " << var << std::endl;
3752 auto var_sel = selector (std::string (var));
38- std::cerr << " apply_jl: var_sel = " << var_sel << std::endl;
53+ // std::cerr << " apply_jl: var_sel = " << var_sel << std::endl;
3954 // if (!var_sel.headeq("node")) {
4055 // std::cerr << "selector is not a node selector; skipping." <<
4156 // std::endl; continue;
4257 // }
4358 auto var_tail = var_sel.tail ().value ();
4459 std::string var_str = std::string (var_sel);
45- std::cerr << " apply_jl: var: " << var_sel << std::endl;
60+ // std::cerr << " apply_jl: var: " << var_sel << std::endl;
4661 if (mvmap_.has_series (var_tail)) {
47- std::cerr << " apply_jl: has series: " << var_sel << std::endl;
62+ // std::cerr << " apply_jl: has series: " << var_sel << std::endl;
4863 auto val = mvmap_.get_as_variant (var_tail, loc);
4964 if (val.has_value ()) {
50- std::cerr << " apply_jl: val has value" << std::endl;
65+ // std::cerr << " apply_jl: val has value" << std::endl;
5166 std::visit (
5267 [&submission_data, &loc, &var_str](auto && v) {
5368 submission_data[var_str] = boost::json::value (v);
54- std::cerr << " apply_jl: submission_data[" << var_str
55- << " ] = " << v << " at loc " << loc << " ."
56- << std::endl;
69+ // std::cerr << " apply_jl: submission_data[" << var_str
70+ // << "] = " << v << " at loc " << loc << "."
71+ // << std::endl;
5772 },
5873 *val);
5974 } else {
@@ -64,11 +79,13 @@ auto parse_where_expression(M& mvmap_, boost::json::object& expression,
6479 std::cerr << " apply_jl: no series for " << var_sel << std::endl;
6580 }
6681 }
67- std::cerr << " apply_jl: submission_data: " << submission_data
68- << std::endl;
69- jsonlogic::any_value res = rule.apply (jsonlogic::json_accessor (submission_data));
70- std::cerr << " apply_jl: res: " << res << std::endl;
71- return truthy (res);
82+ // std::cerr << " apply_jl: submission_data: " << submission_data
83+ // << std::endl;
84+ auto res = jlrule->apply (jsonlogic::json_accessor (submission_data));
85+ // jsonlogic::apply(
86+ // *expression_rule, jsonlogic::data_accessor(submission_data));
87+ // std::cerr << " apply_jl: res: " << res << std::endl;
88+ return jsonlogic::unpack_value<bool >(res);
7289 };
7390
7491 return apply_jl;
@@ -79,59 +96,16 @@ std::vector<testgraph::node_t> where_nodes(const testgraph::testgraph& g,
7996 std::vector<testgraph::node_t > filtered_results;
8097 // boost::json::object exp2(expression);
8198
82- std::cerr << " where: expression: " << expression << std::endl;
83- // auto [_a /*unused*/, vars, _b /*unused*/] =
84- // jsonlogic::translateNode(exp2["rule"]);
85-
86- // auto nodemap = g.nodemap();
87- // boost::json::object submission_data{};
88- // auto apply_jl = [&expression, &vars, &nodemap,
89- // &submission_data](testgraph::node_t key) {
90- // for (const auto& var : vars) {
91- // auto var_sel = selector(std::string(var));
92- // if (!var_sel.headeq("node")) {
93- // std::cerr << "selector is not a node selector; skipping." <<
94- // std::endl; continue;
95- // }
96- // auto var_tail = var_sel.tail().value();
97- // std::string var_str = std::string(var_sel);
98- // std::cerr << " apply_jl: var: " << var_sel << std::endl;
99- // if (nodemap.has_series(var_tail)) {
100- // std::cerr << " apply_jl: has series: " << var_sel << std::endl;
101- // auto val = nodemap.get_as_variant(var_tail, key);
102- // if (val.has_value()) {
103- // std::cerr << " apply_jl: val has value" << std::endl;
104- // std::visit(
105- // [&submission_data, &key, &var_str](auto&& v) {
106- // submission_data[var_str] = boost::json::value(v);
107- // std::cerr << " apply_jl: submission_data[" << var_str
108- // << "] = " << v << " at key " << key << "."
109- // << std::endl;
110- // },
111- // val.value());
112- // } else {
113- // std::cerr << " apply_jl: no value for " << var_sel << std::endl;
114- // submission_data[var_str] = boost::json::value();
115- // }
116- // } else {
117- // std::cerr << " apply_jl: no series for " << var_sel << std::endl;
118- // }
119- // }
120-
121- // jsonlogic::any_expr res =
122- // jsonlogic::apply(expression["rule"], submission_data);
123- // std::cerr << " apply_jl: res: " << res << std::endl;
124- // return jsonlogic::unpack_value<bool>(res);
125- // };
99+ // std::cerr << " where: expression: " << expression << std::endl;
126100
127101 auto nodemap = g.nodemap ();
128102 boost::json::object submission_data;
129103 auto apply_jl = parse_where_expression (nodemap, expression, submission_data);
130- nodemap.for_all ([&filtered_results, &apply_jl, &nodemap, &expression](
131- const auto & key, const auto & loc) {
132- std::cerr << " where for_all key: " << key << std::endl;
104+ nodemap.for_all ([&filtered_results, &apply_jl, &nodemap,
105+ &expression]( const auto & key, const auto & loc) {
106+ // std::cerr << " where for_all key: " << key << std::endl;
133107 if (apply_jl (loc)) {
134- std::cerr << " where: applied!" << std::endl;
108+ // std::cerr << " where: applied!" << std::endl;
135109 filtered_results.push_back (key);
136110 }
137111 });
0 commit comments