Changeset 6119
- Timestamp:
- 2003-12-03T16:38:45+13:00 (20 years ago)
- Location:
- trunk
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/indexers/mgpp/text/GSDLQueryLex.cpp
r5449 r6119 253 253 return true; 254 254 } 255 UCArray WITHIN; SetCStr (WITHIN, "WITHIN"); 256 if (PrefixLen(el.text, WITHIN)==6) { 257 el.lexType = WithinOpE; 258 return true; 259 } 260 255 261 el.lexType = TermE; 256 262 return true; -
trunk/indexers/mgpp/text/GSDLQueryParser.cpp
r6082 r6119 92 92 // default is within 20 words 93 93 static void SetRangeValues (TermNode &termNode, 94 UCArray &nearby) { 94 UCArray &nearby, 95 bool reverse) { 95 96 UCArray NEARBY; SetCStr(NEARBY, "NEAR"); 97 UCArray WITHIN; SetCStr(WITHIN, "WITHIN"); 98 96 99 if (nearby == NEARBY) { // no modifier 97 100 termNode.startRange = (NEAR_DEFAULT+1)*-1; 98 101 termNode.endRange = NEAR_DEFAULT; 99 102 103 } else if (nearby == WITHIN) { // no modifier 104 if (reverse) { 105 termNode.startRange = (NEAR_DEFAULT+1)*-1; 106 termNode.endRange = -1; 107 } else { 108 termNode.startRange = NEAR_DEFAULT; 109 termNode.endRange = 0; 110 } 100 111 } 101 112 else { // extract number 102 UCArray::const_iterator here = nearby.begin()+4; 113 UCArray::const_iterator here; 114 bool within = false; 115 if (PrefixLen(nearby, WITHIN)==6) { 116 within=true; 117 here = nearby.begin()+6; 118 } else { 119 here = nearby.begin()+4; 120 } 103 121 UCArray::const_iterator end = nearby.end(); 104 122 int size=0; … … 107 125 here++; 108 126 } 109 termNode.startRange = -1 * (size+1); 110 termNode.endRange = size; 127 if (within) { 128 if (reverse) { 129 termNode.startRange = size; 130 termNode.endRange = 0; 131 } else { 132 termNode.startRange = -1 * (size+1); 133 termNode.endRange = -1; 134 } 135 } else { 136 termNode.startRange = -1 * (size+1); 137 termNode.endRange = size; 138 } 111 139 } 112 140 } … … 241 269 } 242 270 } else if (near) { 243 SetRangeValues(termNode, near_string );271 SetRangeValues(termNode, near_string, false); 244 272 near = false; 245 273 } … … 257 285 phrase=true; // start of phrase 258 286 } 259 } else if (el.lexType == NearOpE ) {287 } else if (el.lexType == NearOpE || el.lexType == WithinOpE) { 260 288 if (phrase) { 261 // cant have NEARop in a phrase - just assume its an actual word289 // cant have proximity op in a phrase - just assume its an actual word 262 290 TermNode termNode; 263 291 termNode.term = el.text; … … 265 293 proxNode->terms.push_back(termNode); 266 294 } else { 267 // its a NEAR o p295 // its a NEAR or within op 268 296 near = true; 269 297 near_string = el.text; … … 342 370 ParseTermModifiers (here, end, termNode, defaultStemMethod); 343 371 oldHere = here; // dont backtrack past here 344 if (ParseLexEl(here, end, el) && el.lexType == NearOpE) {372 if (ParseLexEl(here, end, el) && (el.lexType == NearOpE || el.lexType == WithinOpE )) { 345 373 delete proxNode; 346 374 oldHere = here; … … 350 378 LexEl temp_el; 351 379 if (ParseLexEl(here, end, temp_el) && temp_el.lexType == OpenBracketE) { 352 cerr << "GSDLQueryParser: NEAR cannot be followed by a '('\n";380 cerr << "GSDLQueryParser: NEAR/WITHIN cannot be followed by a '('\n"; 353 381 return NULL; 354 382 } … … 357 385 proxNode = (ProxMatchQueryNode *)ParseTerm(here, end, defaultBoolCombine, 358 386 defaultStemMethod); 359 SetRangeValues(termNode, el.text );387 SetRangeValues(termNode, el.text, true); 360 388 proxNode->terms.push_back (termNode); 361 389 return proxNode; -
trunk/mgpp/text/GSDLQueryLex.cpp
r5449 r6119 253 253 return true; 254 254 } 255 UCArray WITHIN; SetCStr (WITHIN, "WITHIN"); 256 if (PrefixLen(el.text, WITHIN)==6) { 257 el.lexType = WithinOpE; 258 return true; 259 } 260 255 261 el.lexType = TermE; 256 262 return true; -
trunk/mgpp/text/GSDLQueryParser.cpp
r6082 r6119 92 92 // default is within 20 words 93 93 static void SetRangeValues (TermNode &termNode, 94 UCArray &nearby) { 94 UCArray &nearby, 95 bool reverse) { 95 96 UCArray NEARBY; SetCStr(NEARBY, "NEAR"); 97 UCArray WITHIN; SetCStr(WITHIN, "WITHIN"); 98 96 99 if (nearby == NEARBY) { // no modifier 97 100 termNode.startRange = (NEAR_DEFAULT+1)*-1; 98 101 termNode.endRange = NEAR_DEFAULT; 99 102 103 } else if (nearby == WITHIN) { // no modifier 104 if (reverse) { 105 termNode.startRange = (NEAR_DEFAULT+1)*-1; 106 termNode.endRange = -1; 107 } else { 108 termNode.startRange = NEAR_DEFAULT; 109 termNode.endRange = 0; 110 } 100 111 } 101 112 else { // extract number 102 UCArray::const_iterator here = nearby.begin()+4; 113 UCArray::const_iterator here; 114 bool within = false; 115 if (PrefixLen(nearby, WITHIN)==6) { 116 within=true; 117 here = nearby.begin()+6; 118 } else { 119 here = nearby.begin()+4; 120 } 103 121 UCArray::const_iterator end = nearby.end(); 104 122 int size=0; … … 107 125 here++; 108 126 } 109 termNode.startRange = -1 * (size+1); 110 termNode.endRange = size; 127 if (within) { 128 if (reverse) { 129 termNode.startRange = size; 130 termNode.endRange = 0; 131 } else { 132 termNode.startRange = -1 * (size+1); 133 termNode.endRange = -1; 134 } 135 } else { 136 termNode.startRange = -1 * (size+1); 137 termNode.endRange = size; 138 } 111 139 } 112 140 } … … 241 269 } 242 270 } else if (near) { 243 SetRangeValues(termNode, near_string );271 SetRangeValues(termNode, near_string, false); 244 272 near = false; 245 273 } … … 257 285 phrase=true; // start of phrase 258 286 } 259 } else if (el.lexType == NearOpE ) {287 } else if (el.lexType == NearOpE || el.lexType == WithinOpE) { 260 288 if (phrase) { 261 // cant have NEARop in a phrase - just assume its an actual word289 // cant have proximity op in a phrase - just assume its an actual word 262 290 TermNode termNode; 263 291 termNode.term = el.text; … … 265 293 proxNode->terms.push_back(termNode); 266 294 } else { 267 // its a NEAR o p295 // its a NEAR or within op 268 296 near = true; 269 297 near_string = el.text; … … 342 370 ParseTermModifiers (here, end, termNode, defaultStemMethod); 343 371 oldHere = here; // dont backtrack past here 344 if (ParseLexEl(here, end, el) && el.lexType == NearOpE) {372 if (ParseLexEl(here, end, el) && (el.lexType == NearOpE || el.lexType == WithinOpE )) { 345 373 delete proxNode; 346 374 oldHere = here; … … 350 378 LexEl temp_el; 351 379 if (ParseLexEl(here, end, temp_el) && temp_el.lexType == OpenBracketE) { 352 cerr << "GSDLQueryParser: NEAR cannot be followed by a '('\n";380 cerr << "GSDLQueryParser: NEAR/WITHIN cannot be followed by a '('\n"; 353 381 return NULL; 354 382 } … … 357 385 proxNode = (ProxMatchQueryNode *)ParseTerm(here, end, defaultBoolCombine, 358 386 defaultStemMethod); 359 SetRangeValues(termNode, el.text );387 SetRangeValues(termNode, el.text, true); 360 388 proxNode->terms.push_back (termNode); 361 389 return proxNode;
Note:
See TracChangeset
for help on using the changeset viewer.