1 package com.daffodilwoods.daffodildb.server.sql99.fulltext.dql.condition; 2 3 import com.daffodilwoods.database.resource.DException; 4 import java.util.ArrayList ; 5 import java.util.Arrays ; 6 import com.daffodilwoods.daffodildb.utils.field.FieldBase; 7 8 17 18 public class PredicateMerger { 19 20 29 public static _FullTextPredicate mergePredicateWithAnd(_FullTextPredicate 30 leftPredicate, _FullTextPredicate rightPredicate) throws DException { 31 int type1 = leftPredicate.getType(); 32 int type2 = rightPredicate.getType(); 33 switch (type1) { 34 case PredicateConstant.singleWord: 35 WordRepresentation[] leftWords = ( (_Word) leftPredicate).getWord(); 36 switch (type2) { 37 case PredicateConstant.singleWord: 38 case PredicateConstant.andWords: 39 WordRepresentation[] rightWords = ( (_Word) rightPredicate).getWord(); 40 return new AndWords(getResultantArray(leftWords, rightWords)); 41 case PredicateConstant.phrase: 42 return new AllKeyWordSortedPredicate(leftPredicate, rightPredicate); 43 case PredicateConstant.allKeyWordSortedPredicate: 44 case PredicateConstant.anyKeyWordSortedPredicate: 45 case PredicateConstant.andFullTextPredicate: 46 case PredicateConstant.orFullTextPredicate: 47 48 return new AndFullTextPredicate(leftPredicate, rightPredicate); 49 case PredicateConstant.orWords: 50 return new AllKeyWordSortedPredicate(leftPredicate, rightPredicate); 51 case PredicateConstant.notFullTextPredicate: 52 return new OptimizedNotPredicate( (_Word) leftPredicate, 53 rightPredicate); 54 case PredicateConstant.optimizedNotPredicate: 55 OptimizedNotPredicate onp = (OptimizedNotPredicate) rightPredicate; 56 _Word w = onp.getWord(); 57 onp.setWord( (_Word) PredicateMerger.mergePredicateWithAnd( 58 leftPredicate, w)); 59 return onp; 60 } 61 break; 62 case PredicateConstant.andWords: 63 WordRepresentation[] leftAndWords = ( (_Word) leftPredicate).getWord(); 64 switch (type2) { 65 case PredicateConstant.singleWord: 66 case PredicateConstant.andWords: 67 WordRepresentation[] rightWords = ( (_Word) rightPredicate).getWord(); 68 return new AndWords(getResultantArray(leftAndWords, rightWords)); 69 case PredicateConstant.phrase: 70 case PredicateConstant.orWords: 71 case PredicateConstant.orFullTextPredicate: 72 case PredicateConstant.andFullTextPredicate: 73 case PredicateConstant.notFullTextPredicate: 74 case PredicateConstant.optimizedNotPredicate: 75 case PredicateConstant.allKeyWordSortedPredicate: 76 case PredicateConstant.anyKeyWordSortedPredicate: 77 return new AllKeyWordSortedPredicate(leftPredicate, rightPredicate); 78 } 79 break; 80 case PredicateConstant.phrase: 81 switch (type2) { 82 case PredicateConstant.singleWord: 83 case PredicateConstant.phrase: 84 return new AllKeyWordSortedPredicate(leftPredicate, rightPredicate); 85 case PredicateConstant.notFullTextPredicate: 86 case PredicateConstant.optimizedNotPredicate: 87 case PredicateConstant.andFullTextPredicate: 88 case PredicateConstant.orFullTextPredicate: 89 case PredicateConstant.allKeyWordSortedPredicate: 90 case PredicateConstant.anyKeyWordSortedPredicate: 91 return new AndFullTextPredicate(leftPredicate, rightPredicate); 92 case PredicateConstant.orWords: 93 case PredicateConstant.andWords: 94 95 return new AllKeyWordSortedPredicate(leftPredicate, rightPredicate); 96 } 97 break; 98 case PredicateConstant.orWords: 99 switch (type2) { 100 case PredicateConstant.singleWord: 101 case PredicateConstant.phrase: 102 case PredicateConstant.notFullTextPredicate: 103 case PredicateConstant.optimizedNotPredicate: 104 case PredicateConstant.orWords: 105 case PredicateConstant.andWords: 106 case PredicateConstant.andFullTextPredicate: 107 case PredicateConstant.orFullTextPredicate: 108 case PredicateConstant.allKeyWordSortedPredicate: 109 case PredicateConstant.anyKeyWordSortedPredicate: 110 return new AllKeyWordSortedPredicate(leftPredicate, rightPredicate); 111 } 112 break; 113 case PredicateConstant.andFullTextPredicate: 114 case PredicateConstant.orFullTextPredicate: 115 switch (type2) { 116 case PredicateConstant.singleWord: 117 case PredicateConstant.andFullTextPredicate: 118 case PredicateConstant.notFullTextPredicate: 119 case PredicateConstant.optimizedNotPredicate: 120 case PredicateConstant.allKeyWordSortedPredicate: 121 case PredicateConstant.anyKeyWordSortedPredicate: 122 return new AndFullTextPredicate(leftPredicate, rightPredicate); 123 case PredicateConstant.andWords: 124 case PredicateConstant.phrase: 125 case PredicateConstant.orWords: 126 return new AllKeyWordSortedPredicate(leftPredicate, rightPredicate); 127 128 } 129 case PredicateConstant.notFullTextPredicate: 130 switch (type2) { 131 case PredicateConstant.singleWord: 132 case PredicateConstant.andWords: 133 return new OptimizedNotPredicate( (_Word) rightPredicate, 134 leftPredicate); case PredicateConstant.orWords: 136 return new AllKeyWordSortedPredicate(leftPredicate, rightPredicate); 137 case PredicateConstant.phrase: 138 return new AllKeyWordSortedPredicate(leftPredicate, rightPredicate); 139 case PredicateConstant.notFullTextPredicate: 140 case PredicateConstant.optimizedNotPredicate: 141 case PredicateConstant.andFullTextPredicate: 142 case PredicateConstant.orFullTextPredicate: 143 case PredicateConstant.allKeyWordSortedPredicate: 144 case PredicateConstant.anyKeyWordSortedPredicate: 145 return new AndFullTextPredicate(leftPredicate, rightPredicate); 146 } 147 148 case PredicateConstant.optimizedNotPredicate: 149 switch (type2) { 150 case PredicateConstant.singleWord: 151 case PredicateConstant.andWords: 152 OptimizedNotPredicate onp = (OptimizedNotPredicate) leftPredicate; 153 _Word w = onp.getWord(); 154 onp.setWord( (_Word) PredicateMerger.mergePredicateWithAnd(w, 155 rightPredicate)); 156 return onp; 157 case PredicateConstant.orWords: 158 return new AllKeyWordSortedPredicate(leftPredicate, rightPredicate); 159 case PredicateConstant.phrase: 160 return new AllKeyWordSortedPredicate(leftPredicate, rightPredicate); 161 case PredicateConstant.andFullTextPredicate: 162 case PredicateConstant.orFullTextPredicate: 163 case PredicateConstant.notFullTextPredicate: 164 case PredicateConstant.optimizedNotPredicate: 165 case PredicateConstant.allKeyWordSortedPredicate: 166 case PredicateConstant.anyKeyWordSortedPredicate: 167 return new AndFullTextPredicate(leftPredicate, rightPredicate); 168 } 169 case PredicateConstant.allKeyWordSortedPredicate: 170 switch (type2) { 171 case PredicateConstant.allKeyWordSortedPredicate: 172 case PredicateConstant.orFullTextPredicate: 173 return new AndFullTextPredicate(leftPredicate, rightPredicate); 174 } 175 } 176 throw new DException("DSE0", 177 new Object [] {"IN Predicate Merger Invalid Case"}); } 179 180 189 190 public static _FullTextPredicate mergePredicateWithOr(_FullTextPredicate 191 leftPredicate, _FullTextPredicate rightPredicate) throws DException { 192 int type1 = leftPredicate.getType(); 193 int type2 = rightPredicate.getType(); 194 switch (type1) { 195 case PredicateConstant.singleWord: 196 WordRepresentation[] leftWords = ( (_Word) leftPredicate).getWord(); 197 switch (type2) { 198 case PredicateConstant.singleWord: 199 case PredicateConstant.orWords: 200 WordRepresentation[] rightWords = ( (_Word) rightPredicate).getWord(); 201 return new OrWords(getResultantArray(leftWords, rightWords)); 202 case PredicateConstant.andWords: 203 return new AnyKeyWordSortedPredicate(leftPredicate, rightPredicate); 204 case PredicateConstant.phrase: 205 case PredicateConstant.andFullTextPredicate: 206 case PredicateConstant.orFullTextPredicate: 207 case PredicateConstant.notFullTextPredicate: 208 case PredicateConstant.optimizedNotPredicate: 209 case PredicateConstant.anyKeyWordSortedPredicate: 210 case PredicateConstant.allKeyWordSortedPredicate: 211 return new OrFullTextpredicate(leftPredicate, rightPredicate); 212 } 213 break; 214 case PredicateConstant.orWords: 215 WordRepresentation[] leftOrWords = ( (_Word) leftPredicate).getWord(); 216 switch (type2) { 217 case PredicateConstant.singleWord: 218 case PredicateConstant.orWords: 219 WordRepresentation[] rightWords = ( (_Word) rightPredicate).getWord(); 220 return new OrWords(getResultantArray(leftOrWords, rightWords)); 221 case PredicateConstant.phrase: 222 case PredicateConstant.andWords: 223 case PredicateConstant.andFullTextPredicate: 224 case PredicateConstant.orFullTextPredicate: 225 case PredicateConstant.notFullTextPredicate: 226 case PredicateConstant.optimizedNotPredicate: 227 case PredicateConstant.allKeyWordSortedPredicate: 228 case PredicateConstant.anyKeyWordSortedPredicate: 229 return new AnyKeyWordSortedPredicate(leftPredicate, rightPredicate); 230 } 231 break; 232 case PredicateConstant.andWords: 233 switch (type2) { 234 case PredicateConstant.singleWord: 235 case PredicateConstant.orWords: 236 case PredicateConstant.phrase: 237 case PredicateConstant.andWords: 238 case PredicateConstant.notFullTextPredicate: 239 case PredicateConstant.optimizedNotPredicate: 240 case PredicateConstant.andFullTextPredicate: 241 case PredicateConstant.allKeyWordSortedPredicate: 242 case PredicateConstant.anyKeyWordSortedPredicate: 243 case PredicateConstant.orFullTextPredicate: 244 return new AnyKeyWordSortedPredicate(leftPredicate, rightPredicate); 245 } 246 break; 247 case PredicateConstant.phrase: 248 case PredicateConstant.notFullTextPredicate: 249 case PredicateConstant.optimizedNotPredicate: 250 case PredicateConstant.andFullTextPredicate: 251 case PredicateConstant.orFullTextPredicate: 252 case PredicateConstant.allKeyWordSortedPredicate: 253 switch (type2) { 254 case PredicateConstant.singleWord: 255 case PredicateConstant.orFullTextPredicate: 256 case PredicateConstant.phrase: 257 case PredicateConstant.andFullTextPredicate: 258 case PredicateConstant.notFullTextPredicate: 259 case PredicateConstant.optimizedNotPredicate: 260 case PredicateConstant.allKeyWordSortedPredicate: 261 case PredicateConstant.anyKeyWordSortedPredicate: 262 return new OrFullTextpredicate(leftPredicate, rightPredicate); 263 case PredicateConstant.andWords: 264 case PredicateConstant.orWords: 265 return new AnyKeyWordSortedPredicate(leftPredicate, rightPredicate); 266 } 267 case PredicateConstant.anyKeyWordSortedPredicate: 268 switch(type2){ 269 case PredicateConstant.singleWord: 270 return new OrFullTextpredicate(leftPredicate, rightPredicate); 271 } 272 break; 273 } 274 throw new DException("DSE0", 275 new Object [] {"IN Predicate Merger Invalid Case"}); 277 } 278 279 287 private static WordRepresentation[] getResultantArray(WordRepresentation[] 288 leftWord, WordRepresentation[] rightWord) throws DException { 289 ArrayList resultantWords = new ArrayList (); 290 resultantWords.addAll(Arrays.asList(leftWord)); 291 for (int j = 0; j < rightWord.length; j++) { 292 if (!resultantWords.contains(rightWord[j])) { 293 resultantWords.add(rightWord[j]); 294 } 295 } 296 return (WordRepresentation[]) resultantWords.toArray(new WordRepresentation[ 297 resultantWords.size()]); 298 } 299 300 } 301 | Popular Tags |