44#include < iomanip>
55#include < list>
66#include < memory>
7+ #include < variant>
78
89#include " core/algorithms/fd/pli_based_fd_algorithm.h"
910#include " core/algorithms/fd/tane/model/lattice_level.h"
1011#include " core/algorithms/fd/tane/model/lattice_vertex.h"
1112#include " core/config/error/option.h"
13+ #include " core/config/option.h"
14+ #include " core/config/use_pliws/option.h"
1215#include " core/model/table/column_data.h"
1316#include " core/model/table/column_layout_relation_data.h"
1417#include " core/model/table/relational_schema.h"
@@ -21,6 +24,7 @@ namespace tane {
2124
2225TaneCommon::TaneCommon () : PliBasedFDAlgorithm() {
2326 RegisterOption (config::kErrorOpt (&max_ucc_error_));
27+ RegisterOption (config::kUsePliwsOpt (&use_pliws_));
2428}
2529
2630double TaneCommon::CalculateUccError (model::PositionListIndex const * pli,
@@ -93,14 +97,27 @@ void TaneCommon::ComputeDependencies(model::LatticeLevel* level) {
9397 Vertical xa = xa_vertex->GetVertical ();
9498 // Calculate XA PLI
9599 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));
100+ if (use_pliws_) {
101+ auto parent_pli_1 =
102+ xa_vertex->GetParents ()[0 ]->GetPositionListIndexWithSingletons ();
103+ auto parent_pli_2 =
104+ xa_vertex->GetParents ()[1 ]->GetPositionListIndexWithSingletons ();
105+ xa_vertex->AcquirePLIWithSingletons (parent_pli_1->Intersect (parent_pli_2));
106+ } else {
107+ auto parent_pli_1 = xa_vertex->GetParents ()[0 ]->GetPositionListIndex ();
108+ auto parent_pli_2 = xa_vertex->GetParents ()[1 ]->GetPositionListIndex ();
109+ xa_vertex->AcquirePositionListIndex (parent_pli_1->Intersect (parent_pli_2));
110+ }
99111 }
100112
101113 dynamic_bitset<> xa_indices = xa.GetColumnIndices ();
102114 dynamic_bitset<> a_candidates = xa_vertex->GetRhsCandidates ();
103- auto xa_pli = xa_vertex->GetPositionListIndexWithSingletons ();
115+ std::variant<model::PLI const *, model::PLIWS const *> xa_pli;
116+ if (use_pliws_) {
117+ xa_pli = xa_vertex->GetPositionListIndexWithSingletons ();
118+ } else {
119+ xa_pli = xa_vertex->GetPositionListIndex ();
120+ }
104121 for (auto const & x_vertex : xa_vertex->GetParents ()) {
105122 Vertical const & lhs = x_vertex->GetVertical ();
106123
@@ -110,10 +127,18 @@ void TaneCommon::ComputeDependencies(model::LatticeLevel* level) {
110127 if (!a_candidates[a_index]) {
111128 continue ;
112129 }
113- auto x_pli = x_vertex->GetPositionListIndexWithSingletons ();
114- auto a_pli = relation_->GetColumnData (a_index).GetPLWSIndex ();
130+
131+ config::ErrorType error;
132+ if (use_pliws_) {
133+ model::PLIWS const * x_pli = x_vertex->GetPositionListIndexWithSingletons ();
134+ model::PLIWS const * a_pli = relation_->GetColumnData (a_index).GetPLWSIndex ();
135+ error = CalculateFdError (x_pli, a_pli, std::get<model::PLIWS const *>(xa_pli));
136+ } else {
137+ model::PLI const * x_pli = x_vertex->GetPositionListIndex ();
138+ model::PLI const * a_pli = relation_->GetColumnData (a_index).GetPositionListIndex ();
139+ error = CalculateFdError (x_pli, a_pli, std::get<model::PLI const *>(xa_pli));
140+ }
115141 // Check X -> A
116- config::ErrorType error = CalculateFdError (x_pli, a_pli, xa_pli);
117142 if (error <= max_fd_error_) {
118143 Column const * rhs = schema->GetColumns ()[a_index].get ();
119144
0 commit comments