1 package com.daffodilwoods.daffodildb.server.sql99.dql.plan.condition; 2 3 import com.daffodilwoods.daffodildb.server.sql99.expression.booleanvalueexpression.*; 4 import com.daffodilwoods.daffodildb.server.sql99.expression.booleanvalueexpression.predicates.*; 5 import com.daffodilwoods.daffodildb.utils.comparator.*; 6 import com.daffodilwoods.database.resource.*; 7 8 27 public class TablePlanMerger implements ExecutionPlanConstants { 28 40 public static predicate getMergedPredicate(predicate predicate1, predicate predicate2, SuperComparator objectComparator) throws DException { 41 predicate1.getColumnDetails(); 42 predicate2.getColumnDetails(); 43 int type1 = predicate1.getPredicateType(); 44 int type2 = predicate2.getPredicateType(); 45 switch (type1) { 46 case OperatorConstants.EQUALTO: 47 switch (type2) { 48 case OperatorConstants.EQUALTO: 49 return case_Equal_Equal_PredicateTypes(predicate1, predicate2, objectComparator); 50 case OperatorConstants.GREATERTHAN: 51 return case_Equal_GreaterThan_PredicateTypes(predicate1, predicate2, objectComparator); 52 case OperatorConstants.GREATERTHANEQUALTO: 53 return case_Equal_GreaterThanEqualTo_PredicateTypes(predicate1, predicate2, objectComparator); 54 case OperatorConstants.LESSTHAN: 55 return case_Equal_LessThan_PredicateTypes(predicate1, predicate2, objectComparator); 56 case OperatorConstants.LESSTHANEQUALTO: 57 return case_Equal_LessThanEqualTo_PredicateTypes(predicate1, predicate2, objectComparator); 58 case OperatorConstants.RANGE_PREDICATE: 59 return case_Equal_Range_PredicateTypes(predicate1, predicate2, objectComparator); 60 case OperatorConstants.JOINCOMPARISONPREDICATE: 61 return case_Join_PredicateTypes(predicate1, predicate2, objectComparator); 62 } 63 case OperatorConstants.GREATERTHAN: 64 switch (type2) { 65 case OperatorConstants.EQUALTO: 66 return case_Equal_GreaterThan_PredicateTypes(predicate2, predicate1, objectComparator); 67 case OperatorConstants.GREATERTHAN: 68 return case_GreaterThan_GreaterThan_PredicateTypes(predicate1, predicate2, objectComparator); 69 case OperatorConstants.GREATERTHANEQUALTO: 70 return case_GreaterThan_GreaterThanEqualTo_PredicateTypes(predicate1, predicate2, objectComparator); 71 case OperatorConstants.LESSTHAN: 72 return case_GreaterThan_LessThan_PredicateTypes(predicate1, predicate2, objectComparator); 73 case OperatorConstants.LESSTHANEQUALTO: 74 return case_GreaterThan_LessThanEqualTo_PredicateTypes(predicate1, predicate2, objectComparator); 75 case OperatorConstants.RANGE_PREDICATE: 76 return case_GreaterThan_Range_PredicateTypes(predicate1, predicate2, objectComparator); 77 case OperatorConstants.JOINCOMPARISONPREDICATE: 78 return case_Join_PredicateTypes(predicate1, predicate2, objectComparator); 79 } 80 case OperatorConstants.GREATERTHANEQUALTO: 81 switch (type2) { 82 case OperatorConstants.EQUALTO: 83 return case_Equal_GreaterThanEqualTo_PredicateTypes(predicate2, predicate1, objectComparator); 84 case OperatorConstants.GREATERTHAN: 85 return case_GreaterThan_GreaterThanEqualTo_PredicateTypes(predicate2, predicate1, objectComparator); 86 case OperatorConstants.GREATERTHANEQUALTO: 87 return case_GreaterThanEqualTo_GreaterThanEqualTo_PredicateTypes(predicate1, predicate2, objectComparator); 88 case OperatorConstants.LESSTHAN: 89 return case_GreaterThanEqualTo_LessThan_PredicateTypes(predicate1, predicate2, objectComparator); 90 case OperatorConstants.LESSTHANEQUALTO: 91 return case_GreaterThanEqualTo_LessThanEqualTo_PredicateTypes(predicate1, predicate2, objectComparator); 92 case OperatorConstants.RANGE_PREDICATE: 93 return case_GreaterThanEqualTo_Range_PredicateTypes(predicate1, predicate2, objectComparator); 94 case OperatorConstants.JOINCOMPARISONPREDICATE: 95 return case_Join_PredicateTypes(predicate1, predicate2, objectComparator); 96 } 97 98 case OperatorConstants.LESSTHAN: 99 switch (type2) { 100 case OperatorConstants.EQUALTO: 101 return case_Equal_LessThan_PredicateTypes(predicate2, predicate1, objectComparator); 102 case OperatorConstants.GREATERTHAN: 103 return case_GreaterThan_LessThan_PredicateTypes(predicate2, predicate1, objectComparator); 104 case OperatorConstants.GREATERTHANEQUALTO: 105 return case_GreaterThanEqualTo_LessThan_PredicateTypes(predicate2, predicate1, objectComparator); 106 case OperatorConstants.LESSTHAN: 107 return case_LessThan_LessThan_PredicateTypes(predicate1, predicate2, objectComparator); 108 case OperatorConstants.LESSTHANEQUALTO: 109 return case_LessThan_LessThanEqualTo_PredicateTypes(predicate1, predicate2, objectComparator); 110 case OperatorConstants.RANGE_PREDICATE: 111 return case_LessThan_Range_PredicateTypes(predicate1, predicate2, objectComparator); 112 case OperatorConstants.JOINCOMPARISONPREDICATE: 113 return case_Join_PredicateTypes(predicate1, predicate2, objectComparator); 114 } 115 case OperatorConstants.LESSTHANEQUALTO: 116 switch (type2) { 117 case OperatorConstants.EQUALTO: 118 return case_Equal_LessThanEqualTo_PredicateTypes(predicate2, predicate1, objectComparator); 119 case OperatorConstants.GREATERTHAN: 120 return case_GreaterThan_LessThanEqualTo_PredicateTypes(predicate2, predicate1, objectComparator); 121 case OperatorConstants.GREATERTHANEQUALTO: 122 return case_GreaterThanEqualTo_LessThanEqualTo_PredicateTypes(predicate2, predicate1, objectComparator); 123 case OperatorConstants.LESSTHAN: 124 return case_LessThan_LessThanEqualTo_PredicateTypes(predicate2, predicate1, objectComparator); 125 case OperatorConstants.LESSTHANEQUALTO: 126 return case_LessThanEqualTo_LessThanEqualTo_PredicateTypes(predicate1, predicate2, objectComparator); 127 case OperatorConstants.RANGE_PREDICATE: 128 return case_LessThanEqualTo_Range_PredicateTypes(predicate1, predicate2, objectComparator); 129 case OperatorConstants.JOINCOMPARISONPREDICATE: 130 return case_Join_PredicateTypes(predicate1, predicate2, objectComparator); 131 } 132 case OperatorConstants.RANGE_PREDICATE: 133 switch (type2) { 134 case OperatorConstants.EQUALTO: 135 return case_Equal_Range_PredicateTypes(predicate2, predicate1, objectComparator); 136 case OperatorConstants.GREATERTHAN: 137 return case_GreaterThan_Range_PredicateTypes(predicate2, predicate1, objectComparator); 138 case OperatorConstants.GREATERTHANEQUALTO: 139 return case_GreaterThanEqualTo_Range_PredicateTypes(predicate2, predicate1, objectComparator); 140 case OperatorConstants.LESSTHAN: 141 return case_LessThan_Range_PredicateTypes(predicate2, predicate1, objectComparator); 142 case OperatorConstants.LESSTHANEQUALTO: 143 return case_LessThanEqualTo_Range_PredicateTypes(predicate2, predicate1, objectComparator); 144 case OperatorConstants.RANGE_PREDICATE: 145 return case_Range_Range_PredicateTypes(predicate1, predicate2, objectComparator); 146 case OperatorConstants.JOINCOMPARISONPREDICATE: 147 return case_Join_PredicateTypes(predicate1, predicate2, objectComparator); 148 } 149 case OperatorConstants.JOINCOMPARISONPREDICATE: 150 switch (type2) { 151 case OperatorConstants.EQUALTO: 152 return case_Join_PredicateTypes(predicate2, predicate1, objectComparator); 153 case OperatorConstants.GREATERTHAN: 154 return case_Join_PredicateTypes(predicate2, predicate1, objectComparator); 155 case OperatorConstants.GREATERTHANEQUALTO: 156 return case_Join_PredicateTypes(predicate2, predicate1, objectComparator); 157 case OperatorConstants.LESSTHAN: 158 return case_Join_PredicateTypes(predicate2, predicate1, objectComparator); 159 case OperatorConstants.LESSTHANEQUALTO: 160 return case_Join_PredicateTypes(predicate2, predicate1, objectComparator); 161 case OperatorConstants.RANGE_PREDICATE: 162 return case_Join_Range_PredicateTypes(predicate1, predicate2, objectComparator); 163 case OperatorConstants.JOINCOMPARISONPREDICATE: 164 return case_Join_Join_PredicateTypes(predicate1, predicate2, objectComparator); 165 } 166 } 167 return null; 168 } 169 170 private static predicate case_Equal_Equal_PredicateTypes(predicate equalPredicateValue1, predicate equalPredicateValue2, SuperComparator objectComparator) throws DException { 171 if (objectComparator.compare( ( (_ComparisonPredicate) equalPredicateValue1).getValue(), ( (_ComparisonPredicate) equalPredicateValue2).getValue()) == 0) { 172 return equalPredicateValue1; 173 } 174 return null; 175 } 176 177 private static predicate case_Equal_GreaterThan_PredicateTypes(predicate equalPredicateValue1, predicate greaterThanPredicateValue2, SuperComparator objectComparator) throws DException { 178 if (objectComparator.compare( ( (_ComparisonPredicate) greaterThanPredicateValue2).getValue(), ( (_ComparisonPredicate) equalPredicateValue1).getValue()) == -1) { 179 return equalPredicateValue1; 180 } 181 return null; 182 } 183 184 private static predicate case_Equal_GreaterThanEqualTo_PredicateTypes(predicate equalPredicateValue1, predicate greaterThanEqualToPredicateValue2, SuperComparator objectComparator) throws DException { 185 if (objectComparator.compare( ( (_ComparisonPredicate) greaterThanEqualToPredicateValue2).getValue(), ( (_ComparisonPredicate) equalPredicateValue1).getValue()) == 1) { 186 return null; 187 } 188 return equalPredicateValue1; 189 } 190 191 private static predicate case_Equal_LessThan_PredicateTypes(predicate equalPredicateValue1, predicate lessThanPredicateValue2, SuperComparator objectComparator) throws DException { 192 if (objectComparator.compare( ( (_ComparisonPredicate) lessThanPredicateValue2).getValue(), ( (_ComparisonPredicate) equalPredicateValue1).getValue()) == 1) { 193 return equalPredicateValue1; 194 } 195 return null; 196 } 197 198 private static predicate case_Equal_LessThanEqualTo_PredicateTypes(predicate equalPredicateValue1, predicate equalLessThanEqualTo2, SuperComparator objectComparator) throws DException { 199 if (objectComparator.compare( ( (_ComparisonPredicate) equalLessThanEqualTo2).getValue(), ( (_ComparisonPredicate) equalPredicateValue1).getValue()) == -1) { 200 return null; 201 } 202 return equalPredicateValue1; 203 } 204 205 private static predicate case_Equal_Range_PredicateTypes(predicate equalPredicateValue1, predicate rangePredicate2, SuperComparator objectComparator) throws DException { 206 predicate resultantPredicateValue1 = getMergedPredicate(equalPredicateValue1, ( (RangePredicate) rangePredicate2).getBottomPredicate(), objectComparator); 207 if (resultantPredicateValue1 == null) { 208 return null; 209 } 210 return getMergedPredicate(resultantPredicateValue1, ( (RangePredicate) rangePredicate2).getTopPredicate(), objectComparator); 211 } 212 213 private static predicate case_GreaterThan_GreaterThan_PredicateTypes(predicate greaterThanPredicateValue1, predicate greaterThanPredicateValue2, SuperComparator objectComparator) throws DException { 214 if (objectComparator.compare( ( (_ComparisonPredicate) greaterThanPredicateValue1).getValue(), ( (_ComparisonPredicate) greaterThanPredicateValue2).getValue()) == -1) { 215 return greaterThanPredicateValue2; 216 } 217 return greaterThanPredicateValue1; 218 } 219 220 private static predicate case_GreaterThan_GreaterThanEqualTo_PredicateTypes(predicate greaterThanPredicateValue1, predicate greaterThanEqualToPredicateValue2, SuperComparator objectComparator) throws DException { 221 if (objectComparator.compare( ( (_ComparisonPredicate) greaterThanEqualToPredicateValue2).getValue(), ( (_ComparisonPredicate) greaterThanPredicateValue1).getValue()) == 1) { 222 return greaterThanEqualToPredicateValue2; 223 } 224 return greaterThanPredicateValue1; 225 } 226 227 private static predicate case_GreaterThan_LessThan_PredicateTypes(predicate greaterThanPredicateValue1, predicate lessThanPredicateValue2, SuperComparator objectComparator) throws DException { 228 int equal = objectComparator.compare( ( (_ComparisonPredicate) lessThanPredicateValue2).getValue(), ( (_ComparisonPredicate) greaterThanPredicateValue1).getValue()); 229 if (equal == 1) { 230 return new RangePredicate(lessThanPredicateValue2, greaterThanPredicateValue1); 231 } 232 233 return null; 234 } 235 236 private static predicate case_GreaterThan_LessThanEqualTo_PredicateTypes(predicate greaterThanPredicateValue1, predicate lessThanEqualToPredicateValue2, SuperComparator objectComparator) throws DException { 237 if (objectComparator.compare( ( (_ComparisonPredicate) lessThanEqualToPredicateValue2).getValue(), ( (_ComparisonPredicate) greaterThanPredicateValue1).getValue()) == 1) { 238 return new RangePredicate(lessThanEqualToPredicateValue2, greaterThanPredicateValue1); 239 } 240 return null; 241 } 242 243 private static predicate case_GreaterThan_Range_PredicateTypes(predicate greaterThanPredicateValue1, predicate rangePredicateValue2, SuperComparator objectComparator) throws DException { 244 predicate p1 = getMergedPredicate( ( (RangePredicate) rangePredicateValue2).bottomPredicate, greaterThanPredicateValue1, objectComparator); 245 if (p1 == null) { 246 return null; 247 } 248 return getMergedPredicate( ( (RangePredicate) rangePredicateValue2).topPredicate, p1, objectComparator); 249 250 } 251 252 private static predicate case_GreaterThanEqualTo_GreaterThanEqualTo_PredicateTypes(predicate greaterThanEqualToPredicateValue1, predicate greaterThanEqualToPredicateValue2, SuperComparator objectComparator) throws DException { 253 if (objectComparator.compare( ( (_ComparisonPredicate) greaterThanEqualToPredicateValue1).getValue(), ( (_ComparisonPredicate) greaterThanEqualToPredicateValue2).getValue()) == -1) { 254 return greaterThanEqualToPredicateValue2; 255 } 256 257 return greaterThanEqualToPredicateValue1; 258 } 259 260 private static predicate case_GreaterThanEqualTo_LessThan_PredicateTypes(predicate greaterThanEqualToPredicateValue1, predicate lessThanPredicateValue2, SuperComparator objectComparator) throws DException { 261 if (objectComparator.compare( ( (_ComparisonPredicate) lessThanPredicateValue2).getValue(), ( (_ComparisonPredicate) greaterThanEqualToPredicateValue1).getValue()) == 1) { 262 RangePredicate rp = new RangePredicate(lessThanPredicateValue2, greaterThanEqualToPredicateValue1); 263 return rp; 264 } 265 return null; 266 } 267 268 private static predicate case_GreaterThanEqualTo_LessThanEqualTo_PredicateTypes(predicate greaterThanEqualToPredicateValue1, predicate lessThanEqualToPredicateValue2, SuperComparator objectComparator) throws DException { 269 int difference = objectComparator.compare( ( (_ComparisonPredicate) greaterThanEqualToPredicateValue1).getValue(), ( (_ComparisonPredicate) lessThanEqualToPredicateValue2).getValue()); 270 if (difference == 1) { 271 return null; 272 } 273 if (difference == 0) { 274 ( (_ComparisonPredicate) greaterThanEqualToPredicateValue1).setOperator(OperatorConstants.EQUALTO); 275 return greaterThanEqualToPredicateValue1; 276 } 277 return new RangePredicate(lessThanEqualToPredicateValue2, greaterThanEqualToPredicateValue1); 278 } 279 280 private static predicate case_GreaterThanEqualTo_Range_PredicateTypes(predicate greaterThanEqualToPredicateValue1, predicate rangePredicateValue2, SuperComparator objectComparator) throws DException { 281 predicate p1 = getMergedPredicate( ( (RangePredicate) rangePredicateValue2).bottomPredicate, greaterThanEqualToPredicateValue1, objectComparator); 282 return getMergedPredicate( ( (RangePredicate) rangePredicateValue2).topPredicate, p1, objectComparator); 283 } 284 285 private static predicate case_LessThan_LessThan_PredicateTypes(predicate lessThanPredicateValue1, predicate lessThanPredicateValue2, SuperComparator objectComparator) throws DException { 286 if (objectComparator.compare( ( (_ComparisonPredicate) lessThanPredicateValue1).getValue(), ( (_ComparisonPredicate) lessThanPredicateValue2).getValue()) == -1) { 287 return lessThanPredicateValue1; 288 } 289 return lessThanPredicateValue2; 290 } 291 292 private static predicate case_LessThan_LessThanEqualTo_PredicateTypes(predicate lessThanPredicateValue1, predicate lessThanEqualToPredicateValue2, SuperComparator objectComparator) throws DException { 293 if (objectComparator.compare( ( (_ComparisonPredicate) lessThanEqualToPredicateValue2).getValue(), ( (_ComparisonPredicate) lessThanPredicateValue1).getValue()) == -1) { 294 return lessThanEqualToPredicateValue2; 295 } 296 return lessThanPredicateValue1; 297 } 298 299 private static predicate case_LessThan_Range_PredicateTypes(predicate lessThanPredicateValue1, predicate rangePredicateValue2, SuperComparator objectComparator) throws DException { 300 predicate p1 = getMergedPredicate( ( (RangePredicate) rangePredicateValue2).topPredicate, lessThanPredicateValue1, objectComparator); 301 return getMergedPredicate( ( (RangePredicate) rangePredicateValue2).bottomPredicate, p1, objectComparator); 302 } 303 304 private static predicate case_LessThanEqualTo_LessThanEqualTo_PredicateTypes(predicate lessThanEqualToPredicateValue1, predicate lessThanEqualToPredicateValue2, SuperComparator objectComparator) throws DException { 305 if (objectComparator.compare( ( (_ComparisonPredicate) lessThanEqualToPredicateValue2).getValue(), ( (_ComparisonPredicate) lessThanEqualToPredicateValue1).getValue()) == -1) { 306 return lessThanEqualToPredicateValue2; 307 } 308 return lessThanEqualToPredicateValue1; 309 } 310 311 private static predicate case_LessThanEqualTo_Range_PredicateTypes(predicate lessThanEqualToPredicateValue1, predicate rangePredicateValue2, SuperComparator objectComparator) throws DException { 312 predicate p1 = getMergedPredicate( ( (RangePredicate) rangePredicateValue2).topPredicate, lessThanEqualToPredicateValue1, objectComparator); 313 return getMergedPredicate( ( (RangePredicate) rangePredicateValue2).bottomPredicate, p1, objectComparator); 314 } 315 316 private static predicate case_Range_Range_PredicateTypes(predicate rangePredicateValue1, predicate rangePredicateValue2, SuperComparator objectComparator) throws DException { 317 predicate p1 = getMergedPredicate( ( (RangePredicate) rangePredicateValue1).topPredicate, ( (RangePredicate) rangePredicateValue2).topPredicate, objectComparator); 318 predicate p2 = getMergedPredicate( ( (RangePredicate) rangePredicateValue1).bottomPredicate, ( (RangePredicate) rangePredicateValue2).bottomPredicate, objectComparator); 319 return getMergedPredicate(p1, p2, objectComparator); 320 } 321 322 private static predicate case_Join_PredicateTypes(predicate predicate1, predicate predicate2, SuperComparator objectComparator) throws DException { 323 if (! (predicate2.getPredicateType() == OperatorConstants.JOINCOMPARISONPREDICATE)) { 324 predicate2 = new JoinPredicate(BVEPlanMerger.getBooleanFactor(predicate2)); 325 } 326 return new JoinPredicate(BVEPlanMerger.addAndConditions(BVEPlanMerger.getBooleanFactor(predicate2), BVEPlanMerger.getBooleanFactor(predicate1))); 327 } 328 329 private static predicate case_Join_Range_PredicateTypes(predicate predicate1, predicate rangePredicate2, SuperComparator objectComparator) throws DException { 330 booleanvalueexpression joinCond = ( (JoinPredicate) predicate1).getCondition(); 331 joinCond = BVEPlanMerger.addAndConditions(BVEPlanMerger.getBooleanFactor( ( (RangePredicate) rangePredicate2).getTopPredicate()), joinCond); 332 joinCond = BVEPlanMerger.addAndConditions(BVEPlanMerger.getBooleanFactor( ( (RangePredicate) rangePredicate2).getBottomPredicate()), joinCond); 333 return new JoinPredicate(joinCond); 334 } 335 336 private static JoinPredicate case_Join_Join_PredicateTypes(predicate predicate1, predicate predicate2, SuperComparator objectComparator) throws DException { 337 return new JoinPredicate(BVEPlanMerger.addAndConditions( ( (JoinPredicate) predicate1).getCondition(), ( (JoinPredicate) predicate2).getCondition())); 338 } 339 340 private static booleanfactor getBooleanFactor(booleanprimary bp) throws DException { 341 return new booleanfactor(new booleantest(bp)); 342 } 343 } | Popular Tags |