+sub parse_order_statement_into_boolean {
+ my ($statement,$status,$tags) = @_;
+
+ if (not defined $tags) {
+ $tags = {map { $_, 1 } split / /, $status->{"tags"}
+ }
+ if defined $status->{"tags"};
+
+ }
+ # replace all + with &&
+ $statement =~ s/\+/&&/g;
+ # replace all , with ||
+ $statement =~ s/,/||/g;
+ $statement =~ s{(?<field>[^\&\|\=]+)=(?<value>[^\&\|\=]+)}
+ {
+ my $ok = 0;
+ if ($+{field} eq 'tag') {
+ $ok = 1 if defined $tags->{$+{value}};
+ } else {
+ $ok = 1 if defined $status->{$+{field}} and
+ $status->{$+{field}} eq $+{value};
+ }
+ $ok;
+ }exg;
+ # check that the parsed statement is just valid boolean statements
+ if ($statement =~ /^([01\(\)\&\|]+)$/) {
+ return eval "$statement";
+ } else {
+ # this is an invalid boolean statement
+ return 0;
+ }
+}
+