(
&mut self,
start: usize,
)
| 1110 | } |
| 1111 | |
| 1112 | fn optimize_order_for( |
| 1113 | &mut self, |
| 1114 | start: usize, |
| 1115 | ) -> Result<Vec<(JoinInputCharacteristics, Vec<MirScalarExpr>, usize)>, TransformError> { |
| 1116 | self.order.clear(); |
| 1117 | self.priority_queue.clear(); |
| 1118 | for input in 0..self.inputs { |
| 1119 | self.placed[input] = false; |
| 1120 | self.bound[input].clear(); |
| 1121 | self.arrangement_active[input].clear(); |
| 1122 | } |
| 1123 | for index in 0..self.equivalences.len() { |
| 1124 | self.equivalences_active[index] = false; |
| 1125 | } |
| 1126 | |
| 1127 | // Introduce cross joins as a possibility. |
| 1128 | for input in 0..self.inputs { |
| 1129 | let cardinality = self.cardinalities[input]; |
| 1130 | |
| 1131 | let is_unique = self.unique_keys[input].iter().any(|cols| cols.is_empty()); |
| 1132 | if let Some(pos) = self.arrangements[input] |
| 1133 | .iter() |
| 1134 | .position(|key| key.is_empty()) |
| 1135 | { |
| 1136 | self.arrangement_active[input].push(pos); |
| 1137 | self.priority_queue.push(( |
| 1138 | JoinInputCharacteristics::new( |
| 1139 | is_unique, |
| 1140 | 0, |
| 1141 | true, |
| 1142 | cardinality, |
| 1143 | self.filters[input].clone(), |
| 1144 | input, |
| 1145 | self.enable_join_prioritize_arranged, |
| 1146 | ), |
| 1147 | vec![], |
| 1148 | input, |
| 1149 | )); |
| 1150 | } else { |
| 1151 | self.priority_queue.push(( |
| 1152 | JoinInputCharacteristics::new( |
| 1153 | is_unique, |
| 1154 | 0, |
| 1155 | false, |
| 1156 | cardinality, |
| 1157 | self.filters[input].clone(), |
| 1158 | input, |
| 1159 | self.enable_join_prioritize_arranged, |
| 1160 | ), |
| 1161 | vec![], |
| 1162 | input, |
| 1163 | )); |
| 1164 | } |
| 1165 | } |
| 1166 | |
| 1167 | // Main loop, ordering all the inputs. |
| 1168 | if self.inputs > 1 { |
| 1169 | self.order_input(start); |
no test coverage detected