99#include " core/algorithms/fd/tane/model/lattice_level.h"
1010#include " core/algorithms/fd/tane/model/lattice_vertex.h"
1111#include " core/config/error/option.h"
12+ #include " core/config/option.h"
13+ #include " core/config/use_pliws/option.h"
1214#include " core/model/table/column_data.h"
1315#include " core/model/table/column_layout_relation_data.h"
1416#include " core/model/table/relational_schema.h"
@@ -21,6 +23,7 @@ namespace tane {
2123
2224TaneCommon::TaneCommon () : PliBasedFDAlgorithm() {
2325 RegisterOption (config::kErrorOpt (&max_ucc_error_));
26+ RegisterOption (config::kUsePliwsOpt (&use_pliws_));
2427}
2528
2629double TaneCommon::CalculateUccError (model::PositionListIndex const * pli,
@@ -93,14 +96,27 @@ void TaneCommon::ComputeDependencies(model::LatticeLevel* level) {
9396 Vertical xa = xa_vertex->GetVertical ();
9497 // Calculate XA PLI
9598 if (xa_vertex->GetPositionListIndex () == nullptr ) {
96- auto parent_pli_1 = xa_vertex->GetParents ()[0 ]->GetPositionListIndexWithSingletons ();
97- auto parent_pli_2 = xa_vertex->GetParents ()[1 ]->GetPositionListIndexWithSingletons ();
98- xa_vertex->AcquirePLIWithSingletons (parent_pli_1->Intersect (parent_pli_2));
99+ if (use_pliws_) {
100+ auto parent_pli_1 =
101+ xa_vertex->GetParents ()[0 ]->GetPositionListIndexWithSingletons ();
102+ auto parent_pli_2 =
103+ xa_vertex->GetParents ()[1 ]->GetPositionListIndexWithSingletons ();
104+ xa_vertex->AcquirePLIWithSingletons (parent_pli_1->Intersect (parent_pli_2));
105+ } else {
106+ auto parent_pli_1 = xa_vertex->GetParents ()[0 ]->GetPositionListIndex ();
107+ auto parent_pli_2 = xa_vertex->GetParents ()[1 ]->GetPositionListIndex ();
108+ xa_vertex->AcquirePositionListIndex (parent_pli_1->Intersect (parent_pli_2));
109+ }
99110 }
100111
101112 dynamic_bitset<> xa_indices = xa.GetColumnIndices ();
102113 dynamic_bitset<> a_candidates = xa_vertex->GetRhsCandidates ();
103- auto xa_pli = xa_vertex->GetPositionListIndexWithSingletons ();
114+ std::variant<model::PLI const *, model::PLIWS const *> xa_pli;
115+ if (use_pliws_) {
116+ xa_pli = xa_vertex->GetPositionListIndexWithSingletons ();
117+ } else {
118+ xa_pli = xa_vertex->GetPositionListIndex ();
119+ }
104120 for (auto const & x_vertex : xa_vertex->GetParents ()) {
105121 Vertical const & lhs = x_vertex->GetVertical ();
106122
@@ -110,8 +126,14 @@ void TaneCommon::ComputeDependencies(model::LatticeLevel* level) {
110126 if (!a_candidates[a_index]) {
111127 continue ;
112128 }
113- auto x_pli = x_vertex->GetPositionListIndexWithSingletons ();
114- auto a_pli = relation_->GetColumnData (a_index).GetPLWSIndex ();
129+ std::variant<model::PLI const *, model::PLIWS const *> x_pli, a_pli;
130+ if (use_pliws_) {
131+ x_pli = x_vertex->GetPositionListIndexWithSingletons ();
132+ a_pli = relation_->GetColumnData (a_index).GetPLWSIndex ();
133+ } else {
134+ x_pli = x_vertex->GetPositionListIndex ();
135+ a_pli = relation_->GetColumnData (a_index).GetPositionListIndex ();
136+ }
115137 // Check X -> A
116138 config::ErrorType error = CalculateFdError (x_pli, a_pli, xa_pli);
117139 if (error <= max_fd_error_) {
0 commit comments