Changeset 6119


Ignore:
Timestamp:
2003-12-03T16:38:45+13:00 (20 years ago)
Author:
kjdon
Message:

added WITHIN operator

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/indexers/mgpp/text/GSDLQueryLex.cpp

    r5449 r6119  
    253253    return true;
    254254  }
     255  UCArray WITHIN; SetCStr (WITHIN, "WITHIN");
     256  if (PrefixLen(el.text, WITHIN)==6) {
     257    el.lexType = WithinOpE;
     258    return true;
     259  }
     260 
    255261  el.lexType = TermE;
    256262  return true;
  • trunk/indexers/mgpp/text/GSDLQueryParser.cpp

    r6082 r6119  
    9292// default is within 20 words
    9393static void SetRangeValues (TermNode &termNode,
    94                 UCArray &nearby) {
     94                UCArray &nearby,
     95                bool reverse) {
    9596  UCArray NEARBY; SetCStr(NEARBY, "NEAR");
     97  UCArray WITHIN; SetCStr(WITHIN, "WITHIN");
     98 
    9699  if (nearby == NEARBY) { // no modifier
    97100    termNode.startRange = (NEAR_DEFAULT+1)*-1;
    98101    termNode.endRange = NEAR_DEFAULT;
    99102
     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    }
    100111  }
    101112  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    }
    103121    UCArray::const_iterator end = nearby.end();
    104122    int size=0;
     
    107125      here++;
    108126    }
    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    }
    111139  }
    112140}
     
    241269        }
    242270      } else if (near) {
    243     SetRangeValues(termNode, near_string);
     271    SetRangeValues(termNode, near_string, false);
    244272    near = false;
    245273      }
     
    257285    phrase=true; // start of phrase
    258286      }
    259     } else if (el.lexType == NearOpE) {
     287    } else if (el.lexType == NearOpE || el.lexType == WithinOpE) {
    260288      if (phrase) {
    261     // cant have NEAR op in a phrase - just assume its an actual word
     289    // cant have proximity op in a phrase - just assume its an actual word
    262290    TermNode termNode;
    263291    termNode.term = el.text;
     
    265293    proxNode->terms.push_back(termNode);
    266294      } else {
    267     // its a NEAR op
     295    // its a NEAR or within op
    268296    near = true;
    269297    near_string = el.text;
     
    342370    ParseTermModifiers (here, end, termNode, defaultStemMethod);
    343371    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 )) {
    345373    delete proxNode;
    346374    oldHere = here;
     
    350378      LexEl temp_el;
    351379      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";
    353381    return NULL;
    354382      }
     
    357385      proxNode = (ProxMatchQueryNode *)ParseTerm(here, end, defaultBoolCombine,
    358386                         defaultStemMethod);
    359       SetRangeValues(termNode, el.text);
     387      SetRangeValues(termNode, el.text, true);
    360388      proxNode->terms.push_back (termNode);
    361389      return proxNode;
  • trunk/mgpp/text/GSDLQueryLex.cpp

    r5449 r6119  
    253253    return true;
    254254  }
     255  UCArray WITHIN; SetCStr (WITHIN, "WITHIN");
     256  if (PrefixLen(el.text, WITHIN)==6) {
     257    el.lexType = WithinOpE;
     258    return true;
     259  }
     260 
    255261  el.lexType = TermE;
    256262  return true;
  • trunk/mgpp/text/GSDLQueryParser.cpp

    r6082 r6119  
    9292// default is within 20 words
    9393static void SetRangeValues (TermNode &termNode,
    94                 UCArray &nearby) {
     94                UCArray &nearby,
     95                bool reverse) {
    9596  UCArray NEARBY; SetCStr(NEARBY, "NEAR");
     97  UCArray WITHIN; SetCStr(WITHIN, "WITHIN");
     98 
    9699  if (nearby == NEARBY) { // no modifier
    97100    termNode.startRange = (NEAR_DEFAULT+1)*-1;
    98101    termNode.endRange = NEAR_DEFAULT;
    99102
     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    }
    100111  }
    101112  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    }
    103121    UCArray::const_iterator end = nearby.end();
    104122    int size=0;
     
    107125      here++;
    108126    }
    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    }
    111139  }
    112140}
     
    241269        }
    242270      } else if (near) {
    243     SetRangeValues(termNode, near_string);
     271    SetRangeValues(termNode, near_string, false);
    244272    near = false;
    245273      }
     
    257285    phrase=true; // start of phrase
    258286      }
    259     } else if (el.lexType == NearOpE) {
     287    } else if (el.lexType == NearOpE || el.lexType == WithinOpE) {
    260288      if (phrase) {
    261     // cant have NEAR op in a phrase - just assume its an actual word
     289    // cant have proximity op in a phrase - just assume its an actual word
    262290    TermNode termNode;
    263291    termNode.term = el.text;
     
    265293    proxNode->terms.push_back(termNode);
    266294      } else {
    267     // its a NEAR op
     295    // its a NEAR or within op
    268296    near = true;
    269297    near_string = el.text;
     
    342370    ParseTermModifiers (here, end, termNode, defaultStemMethod);
    343371    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 )) {
    345373    delete proxNode;
    346374    oldHere = here;
     
    350378      LexEl temp_el;
    351379      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";
    353381    return NULL;
    354382      }
     
    357385      proxNode = (ProxMatchQueryNode *)ParseTerm(here, end, defaultBoolCombine,
    358386                         defaultStemMethod);
    359       SetRangeValues(termNode, el.text);
     387      SetRangeValues(termNode, el.text, true);
    360388      proxNode->terms.push_back (termNode);
    361389      return proxNode;
Note: See TracChangeset for help on using the changeset viewer.