Skip to content

Commit

Permalink
Add Where test.
Browse files Browse the repository at this point in the history
  • Loading branch information
abellgithub committed Jul 21, 2020
1 parent cfaa799 commit 58e5d52
Show file tree
Hide file tree
Showing 6 changed files with 178 additions and 77 deletions.
39 changes: 37 additions & 2 deletions pdal/Filter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ struct Filter::Args
{
expr::Expression m_where;
Arg *m_whereArg;
Stage::WhereMergeMode m_whereMerge;
Filter::WhereMergeMode m_whereMerge;
Arg *m_whereMergeArg;
};

Expand Down Expand Up @@ -102,7 +102,7 @@ void Filter::splitView(const PointViewPtr& view, PointViewPtr& keep, PointViewPt
keep = view;
}

Stage::WhereMergeMode Filter::mergeMode() const
Filter::WhereMergeMode Filter::mergeMode() const
{
return m_args->m_whereMerge;
}
Expand All @@ -114,5 +114,40 @@ bool Filter::eval(PointRef& p) const
return m_args->m_where.eval(p);
}

std::istream& operator>>(std::istream& in, Filter::WhereMergeMode& mode)
{
std::string s;
in >> s;

s = Utils::tolower(s);
if (s == "auto")
mode = Filter::WhereMergeMode::Auto;
else if (s == "true")
mode = Filter::WhereMergeMode::True;
else if (s == "false")
mode = Filter::WhereMergeMode::False;
else
in.setstate(std::ios_base::failbit);
return in;
}

std::ostream& operator<<(std::ostream& out, const Filter::WhereMergeMode& mode)
{
switch (mode)
{
case Filter::WhereMergeMode::Auto:
out << "auto";
break;
case Filter::WhereMergeMode::True:
out << "true";
break;
case Filter::WhereMergeMode::False:
out << "false";
break;
}

return out;
}

} // namespace pdal

13 changes: 12 additions & 1 deletion pdal/Filter.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,25 +50,36 @@ class PDAL_DLL Filter : public virtual Stage
friend class FilterWrapper;

struct Args;

public:
enum class WhereMergeMode
{
True,
False,
Auto
};

Filter();
~Filter();

Filter& operator=(const Filter&) = delete;
Filter(const Filter&) = delete;

void splitView(const PointViewPtr& views, PointViewPtr& keeps, PointViewPtr& skips);
WhereMergeMode mergeMode() const;
bool eval(PointRef& p) const;

private:
virtual void l_initialize(PointTableRef table) final;
virtual void l_addArgs(ProgramArgs& args) final;
virtual void l_prepared(PointTableRef table) final;
virtual WhereMergeMode mergeMode() const;
virtual PointViewSet run(PointViewPtr view);
virtual void filter(PointView& /*view*/)
{}

friend std::istream& operator>>(std::istream& in, Filter::WhereMergeMode& mode);
friend std::ostream& operator<<(std::ostream& out, const Filter::WhereMergeMode& mode);

std::unique_ptr<Args> m_args;
};

Expand Down
41 changes: 0 additions & 41 deletions pdal/Stage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -423,46 +423,5 @@ void Stage::stopLogging() const
m_log->popLeader();
}

Stage::WhereMergeMode Stage::mergeMode() const
{
return WhereMergeMode::Auto;
}

std::istream& operator>>(std::istream& in, Stage::WhereMergeMode& mode)
{
std::string s;
in >> s;

s = Utils::tolower(s);
std::cerr << "Mode = " << s << "!\n";
if (s == "auto")
mode = Stage::WhereMergeMode::Auto;
else if (s == "true")
mode = Stage::WhereMergeMode::True;
else if (s == "false")
mode = Stage::WhereMergeMode::False;
else
in.setstate(std::ios_base::failbit);
return in;
}

std::ostream& operator<<(std::ostream& out, const Stage::WhereMergeMode& mode)
{
switch (mode)
{
case Stage::WhereMergeMode::Auto:
out << "auto";
break;
case Stage::WhereMergeMode::True:
out << "true";
break;
case Stage::WhereMergeMode::False:
out << "false";
break;
}

return out;
}

} // namespace pdal

11 changes: 0 additions & 11 deletions pdal/Stage.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -76,13 +76,6 @@ class PDAL_DLL Stage
friend class Reader;
friend class Filter;
friend class Writer;
public:
enum class WhereMergeMode
{
True,
False,
Auto
};

public:
Stage();
Expand Down Expand Up @@ -385,7 +378,6 @@ class PDAL_DLL Stage
virtual void l_addArgs(ProgramArgs& args);
virtual void l_initialize(PointTableRef table);
virtual void l_prepared(PointTableRef table);
virtual WhereMergeMode mergeMode() const;

/**
Get basic metadata (avoids reading points). Implement in subclass.
Expand Down Expand Up @@ -497,9 +489,6 @@ class PDAL_DLL Stage
*/
const Options& getOptions() const
{ return m_options; }

friend std::istream& operator>>(std::istream& in, Stage::WhereMergeMode& mode);
friend std::ostream& operator<<(std::ostream& out, const Stage::WhereMergeMode& mode);
};

} // namespace pdal
33 changes: 16 additions & 17 deletions pdal/private/StageRunner.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -61,34 +61,33 @@ PointViewPtr StageRunner::keeps()
void StageRunner::run()
{
point_count_t keepSize = m_keeps->size();
int keepId = m_keeps->id();
m_viewSet = m_stage->run(m_keeps);

if (m_skips && m_skips->size())
Filter *f = dynamic_cast<Filter *>(m_stage);
if (!f || !m_skips || m_skips->size() == 0)
return;

if (f->mergeMode() == Filter::WhereMergeMode::True)
{
if (m_stage->mergeMode() == Stage::WhereMergeMode::True)
if (m_viewSet.size())
{
if (m_viewSet.size())
{
(*m_viewSet.begin())->append(*m_skips);
(*m_viewSet.begin())->append(*m_skips);
return;
}

}
else if (m_stage->mergeMode() == Stage::WhereMergeMode::Auto)
}
else if (f->mergeMode() == Filter::WhereMergeMode::Auto)
{
if (m_viewSet.size() == 1)
{
if (m_viewSet.size() == 1)
PointViewPtr keeps = *m_viewSet.begin();
if (keeps.get() == m_keeps.get() && keepSize == keeps->size())
{
PointViewPtr keeps = *m_viewSet.begin();
if (keeps->id() == keepId && keepSize == keeps->size())
{
keeps->append(*m_skips);
return;
}
keeps->append(*m_skips);
return;
}
}
m_viewSet.insert(m_skips);
}
m_viewSet.insert(m_skips);
}

PointViewSet StageRunner::wait()
Expand Down
118 changes: 113 additions & 5 deletions test/unit/WhereTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,8 @@ namespace
size_t g_count;
}

TEST(WhereTest, t1)
void exec1(const std::string& where, size_t expKeep, size_t expViews,
Filter::WhereMergeMode mm = Filter::WhereMergeMode::Auto)
{
StageFactory factory;

Expand All @@ -57,6 +58,46 @@ TEST(WhereTest, t1)
ro.add("mode", "ramp");
r->setOptions(ro);

class TestFilter : public Filter
{
std::string getName() const
{ return "filters.test"; }

void filter(PointView& v)
{
g_count = v.size();
}
};

TestFilter f;
Options fo;
fo.add("where", where);
fo.add("where_merge", mm);
f.setOptions(fo);
f.setInput(*r);

PointTable t;
f.prepare(t);
PointViewSet s = f.execute(t);
EXPECT_EQ(s.size(), expViews);
size_t total = 0;
for (auto vp : s)
total += vp->size();
EXPECT_EQ(total, 100);
EXPECT_EQ(g_count, expKeep);
}

void exec2(const std::string& where, size_t expKeep, size_t expViews,
Filter::WhereMergeMode mm = Filter::WhereMergeMode::Auto)
{
StageFactory factory;

Stage *r = factory.createStage("readers.faux");
Options ro;
ro.add("count", 100);
ro.add("bounds", BOX3D(0, 0, 100, 99, 9.9, 199));
ro.add("mode", "ramp");
r->setOptions(ro);

class TestFilter : public Filter
{
Expand All @@ -66,22 +107,89 @@ TEST(WhereTest, t1)
void filter(PointView& v)
{
g_count = v.size();
v.setField(Dimension::Id::X, v.size(), 1);
}
};

TestFilter f;
Options fo;
fo.add("where", where);
fo.add("where_merge", mm);
f.setOptions(fo);
f.setInput(*r);

PointTable t;
f.prepare(t);
PointViewSet s = f.execute(t);
EXPECT_EQ(s.size(), expViews);
size_t total = 0;
for (auto vp : s)
total += vp->size();
EXPECT_EQ(total, 101);
EXPECT_EQ(g_count, expKeep);
}

void exec3(const std::string& where, size_t expKeep, size_t expViews,
Filter::WhereMergeMode mm = Filter::WhereMergeMode::Auto)
{
StageFactory factory;

Stage *r = factory.createStage("readers.faux");
Options ro;
ro.add("count", 100);
ro.add("bounds", BOX3D(0, 0, 100, 99, 9.9, 199));
ro.add("mode", "ramp");
r->setOptions(ro);

class TestFilter : public Filter
{
std::string getName() const
{ return "filters.test"; }

PointViewSet run(PointViewPtr v)
{
g_count = v->size();
PointViewSet s;
s.insert(v);
s.insert(v->makeNew());
return s;
}
};

TestFilter f;
Options fo;
fo.add("where", "X<50");
fo.add("where", where);
fo.add("where_merge", mm);
f.setOptions(fo);
f.setInput(*r);

PointTable t;
f.prepare(t);
PointViewSet s = f.execute(t);
EXPECT_EQ(s.size(), expViews);
size_t total = 0;
for (auto vp : s)
std::cerr << "View size = " << vp->size() << "!\n";
PointViewPtr v = *s.begin();
std::cerr << "Filter/Post size = " << g_count << "/" << v->size() << "!\n";
total += vp->size();
EXPECT_EQ(total, 100);
EXPECT_EQ(g_count, expKeep);
}

TEST(WhereTest, t1)
{
exec1("X<50", 50, 1);
exec1("X<50 && Y < 2.5", 25, 1);
exec1("X<50 && Y < 2.5", 25, 1, Filter::WhereMergeMode::True);
exec1("X<50 && Y < 2.5", 25, 2, Filter::WhereMergeMode::False);

exec2("X<50", 50, 2);
exec2("X<50 && Y < 2.5", 25, 2);
exec2("X<50 && Y < 2.5", 25, 1, Filter::WhereMergeMode::True);
exec2("X<50 && Y < 2.5", 25, 2, Filter::WhereMergeMode::False);

exec3("X<50", 50, 3);
exec3("X<50 && Y < 2.5", 25, 3);
exec3("X<50 && Y < 2.5", 25, 2, Filter::WhereMergeMode::True);
exec3("X<50 && Y < 2.5", 25, 3, Filter::WhereMergeMode::False);
}

} // namespace pdal

0 comments on commit 58e5d52

Please sign in to comment.