/// Search for metadata associated with the provided recordId and userId. /// \param node - Top-level node to use for metadata search. /// \param recordId - Record ID to match. /// \param userId - User ID to match. MetadataNode LasWriter::findVlrMetadata(MetadataNode node, uint16_t recordId, const std::string& userId) { std::string sRecordId = std::to_string(recordId); // Find a node whose name starts with vlr and that has child nodes // with the name and recordId we're looking for. auto pred = [sRecordId,userId](MetadataNode n) { auto recPred = [sRecordId](MetadataNode n) { return n.name() == "record_id" && n.value() == sRecordId; }; auto userPred = [userId](MetadataNode n) { return n.name() == "user_id" && n.value() == userId; }; return (boost::algorithm::istarts_with(n.name(), "vlr") && !n.findChild(recPred).empty() && !n.findChild(userPred).empty()); }; return node.find(pred); }
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); } } }