souffle  2.0.2-371-g6315b36
Public Member Functions | Protected Member Functions
souffle::ram::transform::CollapseFiltersTransformer Class Reference

Transforms consecutive filters into a single filter containing a conjunction. More...

#include <CollapseFilters.h>

Inheritance diagram for souffle::ram::transform::CollapseFiltersTransformer:
Inheritance graph
Collaboration diagram for souffle::ram::transform::CollapseFiltersTransformer:
Collaboration graph

Public Member Functions

bool collapseFilters (Program &program)
 Collapse consecutive filter operations. More...
 
std::string getName () const override
 @Brief get name of the transformer More...
 
- Public Member Functions inherited from souffle::ram::transform::Transformer
bool apply (TranslationUnit &translationUnit)
 @Brief apply the transformer to a translation unit @Param translationUnit that will be transformed. More...
 
virtual ~Transformer ()=default
 

Protected Member Functions

bool transform (TranslationUnit &translationUnit) override
 @Brief transform the translation unit / used by apply @Param translationUnit that will be transformed. More...
 

Detailed Description

Transforms consecutive filters into a single filter containing a conjunction.

For example ..

QUERY
...
IF C1
IF C2
...

will be rewritten to

QUERY
...
IF C1 /\ C2 then
...

Definition at line 52 of file CollapseFilters.h.

Member Function Documentation

◆ collapseFilters()

bool souffle::ram::transform::CollapseFiltersTransformer::collapseFilters ( Program program)

Collapse consecutive filter operations.

Parameters
programProgram that is transformed
Returns
Flag showing whether the program has been changed by the transformation

Definition at line 35 of file CollapseFilters.cpp.

35  {
36  // true if two consecutive filters in loop nest found
37  bool canCollapse = false;
38 
39  // storing conditions for collapsing
40  VecOwn<Condition> conditions;
41 
42  const Filter* prevFilter = filter;
43  conditions.emplace_back(filter->getCondition().clone());
44  while (auto* nextFilter = dynamic_cast<Filter*>(&prevFilter->getOperation())) {
45  canCollapse = true;
46  conditions.emplace_back(nextFilter->getCondition().clone());
47  prevFilter = nextFilter;
48  }
49 
50  if (canCollapse) {
51  changed = true;
52  node = mk<Filter>(toCondition(conditions), souffle::clone(&prevFilter->getOperation()),
53  prevFilter->getProfileText());
54  }
55  }
56  node->apply(makeLambdaRamMapper(filterRewriter));
57  return node;
58  };
59  const_cast<Query*>(&query)->apply(makeLambdaRamMapper(filterRewriter));
60  });
61  return changed;
62 }
63 
64 } // namespace souffle::ram::transform

References souffle::clone(), souffle::filter(), souffle::ram::NestedOperation::getOperation(), souffle::ram::NestedOperation::getProfileText(), and souffle::ram::toCondition().

Here is the call graph for this function:

◆ getName()

std::string souffle::ram::transform::CollapseFiltersTransformer::getName ( ) const
inlineoverridevirtual

@Brief get name of the transformer

Implements souffle::ram::transform::Transformer.

Definition at line 54 of file CollapseFilters.h.

61  :
62  bool transform(TranslationUnit& translationUnit) override {

◆ transform()

bool souffle::ram::transform::CollapseFiltersTransformer::transform ( TranslationUnit translationUnit)
inlineoverrideprotectedvirtual

@Brief transform the translation unit / used by apply @Param translationUnit that will be transformed.

@Return flag reporting whether the RAM program has changed

Implements souffle::ram::transform::Transformer.

Definition at line 66 of file CollapseFilters.h.


The documentation for this class was generated from the following files:
souffle::ram::toCondition
Own< Condition > toCondition(const VecOwn< Condition > &conds)
Convert list of conditions to a conjunction.
Definition: Utils.h:84
souffle::ram::transform::Transformer::apply
bool apply(TranslationUnit &translationUnit)
@Brief apply the transformer to a translation unit @Param translationUnit that will be transformed.
Definition: Transformer.cpp:39
souffle::clone
auto clone(const std::vector< A * > &xs)
Definition: ContainerUtil.h:172
souffle::filter
std::vector< A > filter(std::vector< A > xs, F &&f)
Filter a vector to include certain elements.
Definition: FunctionalUtil.h:155
souffle::ram::transform::CollapseFiltersTransformer::transform
bool transform(TranslationUnit &translationUnit) override
@Brief transform the translation unit / used by apply @Param translationUnit that will be transformed...
Definition: CollapseFilters.h:66
souffle::ram::makeLambdaRamMapper
LambdaNodeMapper< Lambda > makeLambdaRamMapper(const Lambda &lambda)
Creates a node mapper based on a corresponding lambda expression.
Definition: LambdaNodeMapper.h:67