ReUseX  0.0.5
3D Point Cloud Processing for Building Reuse
Loading...
Searching...
No Matches
filter_expression.hpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2025 Povl Filip Sonne-Frederiksen
2// SPDX-License-Identifier: GPL-3.0-or-later
3
4#pragma once
5
6#include <reusex/types.hpp>
7#include <memory>
8#include <string>
9#include <unordered_set>
10#include <vector>
11
12namespace reusex {
13// Forward declaration
14class ProjectDB;
15} // namespace reusex
16
17namespace reusex::core {
18
21public:
22 virtual ~FilterNode() = default;
23
27 virtual auto evaluate(int32_t label_value) const -> bool = 0;
28};
29
32 std::string cloud_name_;
33 CloudLConstPtr label_cloud_;
34
35public:
37 : cloud_name_(std::move(name)), label_cloud_(std::move(labels)) {}
38
39 auto labels() const -> const CloudLConstPtr & { return label_cloud_; }
40 auto name() const -> const std::string & { return cloud_name_; }
41 auto size() const -> size_t { return label_cloud_->size(); }
42};
43
45class EqualNode : public FilterNode {
46 int32_t value_;
47
48public:
49 explicit EqualNode(int32_t value) : value_(value) {}
50 auto evaluate(int32_t label) const -> bool override {
51 return label == value_;
52 }
53};
54
56class NotEqualNode : public FilterNode {
57 int32_t value_;
58
59public:
60 explicit NotEqualNode(int32_t value) : value_(value) {}
61 auto evaluate(int32_t label) const -> bool override {
62 return label != value_;
63 }
64};
65
67class InNode : public FilterNode {
68 std::unordered_set<int32_t> values_;
69
70public:
71 explicit InNode(std::vector<int32_t> values)
72 : values_(values.begin(), values.end()) {}
73 auto evaluate(int32_t label) const -> bool override {
74 return values_.count(label) > 0;
75 }
76};
77
79class CompareNode : public FilterNode {
80public:
81 enum class Op { GT, GE, LT, LE };
82
83private:
84 Op op_;
85 int32_t value_;
86
87public:
88 CompareNode(Op op, int32_t value) : op_(op), value_(value) {}
89 auto evaluate(int32_t label) const -> bool override {
90 switch (op_) {
91 case Op::GT:
92 return label > value_;
93 case Op::GE:
94 return label >= value_;
95 case Op::LT:
96 return label < value_;
97 case Op::LE:
98 return label <= value_;
99 }
100 return false;
101 }
102};
103
105class AndNode : public FilterNode {
106 std::unique_ptr<FilterNode> left_;
107 std::unique_ptr<FilterNode> right_;
108
109public:
110 AndNode(std::unique_ptr<FilterNode> left, std::unique_ptr<FilterNode> right)
111 : left_(std::move(left)), right_(std::move(right)) {}
112 auto evaluate(int32_t label) const -> bool override {
113 return left_->evaluate(label) && right_->evaluate(label);
114 }
115};
116
118class OrNode : public FilterNode {
119 std::unique_ptr<FilterNode> left_;
120 std::unique_ptr<FilterNode> right_;
121
122public:
123 OrNode(std::unique_ptr<FilterNode> left, std::unique_ptr<FilterNode> right)
124 : left_(std::move(left)), right_(std::move(right)) {}
125 auto evaluate(int32_t label) const -> bool override {
126 return left_->evaluate(label) || right_->evaluate(label);
127 }
128};
129
132 std::unique_ptr<FilterNode> root;
133 std::vector<CloudReferenceNode> clouds;
134
138 auto evaluate_point(size_t idx) const -> bool;
139};
140
146auto parse_filter_expression(const std::string &expression, ProjectDB &db)
147 -> std::unique_ptr<FilterExpression>;
148
153auto evaluate_filter(const FilterExpression &expr, size_t cloud_size)
154 -> IndicesPtr;
155
156} // namespace reusex::core
AndNode(std::unique_ptr< FilterNode > left, std::unique_ptr< FilterNode > right)
auto evaluate(int32_t label) const -> bool override
Evaluate this node for a specific point's label value.
auto labels() const -> const CloudLConstPtr &
auto name() const -> const std::string &
CloudReferenceNode(std::string name, CloudLConstPtr labels)
auto evaluate(int32_t label) const -> bool override
Evaluate this node for a specific point's label value.
CompareNode(Op op, int32_t value)
auto evaluate(int32_t label) const -> bool override
Evaluate this node for a specific point's label value.
Base AST node for filter expressions.
virtual ~FilterNode()=default
virtual auto evaluate(int32_t label_value) const -> bool=0
Evaluate this node for a specific point's label value.
auto evaluate(int32_t label) const -> bool override
Evaluate this node for a specific point's label value.
InNode(std::vector< int32_t > values)
auto evaluate(int32_t label) const -> bool override
Evaluate this node for a specific point's label value.
auto evaluate(int32_t label) const -> bool override
Evaluate this node for a specific point's label value.
OrNode(std::unique_ptr< FilterNode > left, std::unique_ptr< FilterNode > right)
auto evaluate_filter(const FilterExpression &expr, size_t cloud_size) -> IndicesPtr
Evaluate filter expression against all points, generate Indices.
auto parse_filter_expression(const std::string &expression, ProjectDB &db) -> std::unique_ptr< FilterExpression >
Parse filter expression and resolve label cloud references from ProjectDB.
typename CloudL::ConstPtr CloudLConstPtr
Definition types.hpp:36
pcl::IndicesPtr IndicesPtr
Definition types.hpp:23
Parsed filter expression with resolved label cloud references.
std::vector< CloudReferenceNode > clouds
Referenced label clouds.
auto evaluate_point(size_t idx) const -> bool
Evaluate filter for a point index.
std::unique_ptr< FilterNode > root
AST root.