inline ptree toPTree(MetadataNode const& node) { typedef ptree::path_type path; ptree tree; tree.put("name", node.name()); tree.put("description", node.description()); tree.put("type", node.type()); tree.put("value", node.value()); MetadataNodeList children = node.children(); for (auto n = children.begin(); n != children.end(); ++n) { ptree pnode = toPTree(*n); if (node.kind() == MetadataType::Array) { boost::optional<ptree&> opt = tree.get_child_optional(path(node.name(), '/')); if (opt) opt->push_back(std::make_pair("", pnode)); else { tree.push_back(ptree::value_type(node.name(), ptree())); auto& p = tree.get_child(path(node.name(), '/')); p.push_back(std::make_pair("", pnode)); } } else if (node.name().size()) tree.push_back(std::make_pair(node.name(), pnode)); } return tree; }
TEST(Stats, metadata) { BOX3D bounds(1.0, 2.0, 3.0, 101.0, 102.0, 103.0); Options ops; ops.add("bounds", bounds); ops.add("count", 1000); ops.add("mode", "constant"); StageFactory f; std::unique_ptr<Stage> reader(f.createStage("readers.faux")); EXPECT_TRUE(reader.get()); reader->setOptions(ops); Options filterOps; filterOps.add("dimensions", " , X, Z "); StatsFilter filter; filter.setInput(*reader); filter.setOptions(filterOps); PointTable table; filter.prepare(table); filter.execute(table); MetadataNode m = filter.getMetadata(); std::vector<MetadataNode> children = m.children("statistic"); auto findNode = [](MetadataNode m, const std::string name, const std::string val) { auto findNameVal = [name, val](MetadataNode m) { return (m.name() == name && m.value() == val); }; return m.find(findNameVal); }; for (auto mi = children.begin(); mi != children.end(); ++mi) { if (findNode(*mi, "name", "X").valid()) { EXPECT_DOUBLE_EQ(mi->findChild("average").value<double>(), 1.0); EXPECT_DOUBLE_EQ(mi->findChild("minimum").value<double>(), 1.0); EXPECT_DOUBLE_EQ(mi->findChild("maximum").value<double>(), 1.0); EXPECT_DOUBLE_EQ(mi->findChild("count").value<double>(), 1000.0); } if (findNode(*mi, "name", "Z").valid()) { EXPECT_DOUBLE_EQ(mi->findChild("average").value<double>(), 3.0); EXPECT_DOUBLE_EQ(mi->findChild("minimum").value<double>(), 3.0); EXPECT_DOUBLE_EQ(mi->findChild("maximum").value<double>(), 3.0); EXPECT_DOUBLE_EQ(mi->findChild("count").value<double>(), 1000.0); } } }
TEST_F(PythonFilterTest, metadata) { StageFactory f; BOX3D bounds(0.0, 0.0, 0.0, 1.0, 1.0, 1.0); Options ops; ops.add("bounds", bounds); ops.add("count", 10); ops.add("mode", "ramp"); FauxReader reader; reader.setOptions(ops); Option source("source", "import numpy\n" "import sys\n" "import redirector\n" "def myfunc(ins,outs):\n" " global metadata\n" " #print('before', globals(), file=sys.stderr,)\n" " metadata = {'name': 'root', 'value': 'a string', 'type': 'string', 'description': 'a description', 'children': [{'name': 'filters.python', 'value': 52, 'type': 'integer', 'description': 'a filter description', 'children': []}, {'name': 'readers.faux', 'value': 'another string', 'type': 'string', 'description': 'a reader description', 'children': []}]}\n" " # print ('schema', schema, file=sys.stderr,)\n" " return True\n" ); Option module("module", "MyModule"); Option function("function", "myfunc"); Options opts; opts.add(source); opts.add(module); opts.add(function); Stage* filter(f.createStage("filters.python")); filter->setOptions(opts); filter->setInput(reader); PointTable table; filter->prepare(table); PointViewSet viewSet = filter->execute(table); EXPECT_EQ(viewSet.size(), 1u); PointViewPtr view = *viewSet.begin(); PointLayoutPtr layout(table.layout()); MetadataNode m = table.metadata(); m = m.findChild("filters.python"); MetadataNodeList l = m.children(); EXPECT_EQ(l.size(), 3u); EXPECT_EQ(l[0].name(), "filters.python"); EXPECT_EQ(l[0].value(), "52"); EXPECT_EQ(l[0].description(), "a filter description"); }
void toJSON(const MetadataNode& m, std::ostream& o) { if (m.name().empty()) pdal::subnodesToJSON(m, o, 0); else if (m.kind() == MetadataType::Array) pdal::arrayToJSON(m.children(), o, 0); else { o << "{" << std::endl; pdal::toJSON(m, o, 1); o << std::endl; o << "}"; } o << std::endl; }