WordTree.h

Go to the documentation of this file.
00001 //
00002 // Part of the ht://Dig package   <http://www.htdig.org/>
00003 // Copyright (c) 1999, 2000, 2001 The ht://Dig Group
00004 // For copyright details, see the file COPYING in your distribution
00005 // or the GNU General Public License version 2 or later
00006 // <http://www.gnu.org/copyleft/gpl.html>
00007 //
00008 // $Id: WordTree_8h-source.html,v 1.1 2008/06/08 10:13:24 sebdiaz Exp $
00009 //
00010 //
00011 // NAME
00012 // 
00013 // Base class for query resolution nodes
00014 //
00015 // SYNOPSIS
00016 //
00017 // #include <WordTree.h>
00018 //
00019 // class WordTreeMethod : public WordTree {
00020 // ...
00021 // };
00022 //
00023 // DESCRIPTION
00024 //
00025 // The WordTree class is derived from the WordCursor class and implement
00026 // the basic operations and data structures needed for query resolution.
00027 // It is the common base class of all the classes that actually implement
00028 // a query resolution. The derived classes must be implemented to follow
00029 // the WordCursor semantic for Walk* operations.
00030 //
00031 // 
00032 // END
00033 // 
00034 
00035 #ifndef _WordTree_h
00036 #define _WordTree_h
00037 
00038 #include <WordList.h>
00039 
00040 #include <WordKeySemantic.h>
00041 #include <WordPermute.h>
00042 #include <WordCursorOne.h>
00043 #include <WordResults.h>
00044 
00045 #define WORD_WALK_REDO          0x1000
00046 #define WORD_WALK_RESTART       0x2000
00047 #define WORD_WALK_NEXT          0x4000
00048 #define WORD_WALK_END_CACHE     0x8000
00049 
00050 //
00051 // Return values of CursorsObeyProximity method
00052 //
00053 #define WORD_SEARCH_NOPROXIMITY 1
00054 
00055 //
00056 // operand values
00057 //
00058 #define WORD_TREE_OR            1
00059 #define WORD_TREE_AND           2
00060 #define WORD_TREE_NEAR          3
00061 #define WORD_TREE_OPTIONAL      4
00062 #define WORD_TREE_LITERAL       5
00063 #define WORD_TREE_MANDATORY     6
00064 #define WORD_TREE_NOT           7
00065 
00066 #define WORD_TREE_OP_SIZE       20
00067 
00068 //
00069 // Default proximity is to search for adjacent words in order
00070 //
00071 #ifndef WORD_SEARCH_DEFAULT_PROXIMITY
00072 #define WORD_SEARCH_DEFAULT_PROXIMITY (-1)
00073 #endif /* WORD_SEARCH_DEFAULT_PROXIMITY */
00074 
00075 class WordTreeArg {
00076  public:
00077   WordTreeArg(WordList *words, int uniq, int has_uniq, int nproximity, int *document, int document_length, int location) {
00078     _words = words;
00079     _uniq = uniq;
00080     _has_uniq = has_uniq;
00081     _nproximity = nproximity;
00082     _document = document;
00083     _document_length = document_length;
00084     _location = location;
00085     _realm = 0;
00086   }
00087 
00088   WordList *_words;
00089   int _uniq;
00090   int _has_uniq;
00091   int _nproximity;
00092   int *_document;
00093   int _document_length;
00094   int _location;
00095   int _realm;
00096 };
00097 
00098 class WordTree : public WordCursorOne {
00099 public:
00100   WordTree(WordList* words) :
00101     WordCursorOne(words),
00102     key_semantic(words->GetContext())
00103   {
00104     proximity = 0;
00105     has_uniq = 0;
00106     results = 0;
00107     verbose = 0;
00108   }
00109 
00110   virtual int ContextSaveList(StringList& list) const {
00111     return OK;
00112   }
00113 
00114   virtual int ContextRestoreList(StringList& list) {
00115     return OK;
00116   }
00117 
00118   //-
00119   // Initialize the object. <b>words</b> is used to initialize the 
00120   // WordCursor base class, <b>document, document_length</b> and 
00121   // <b>location</b> are used to initialize the WordKeySemantic data
00122   // member. The <b>uniq</b> is the WordKey field position used by
00123   // the WordKeySemantic::DocumentNext function. The <b>nproximity</b>
00124   // is the proximity factor used by the WordKeySemantic::LocationCompare
00125   // method.
00126   // Return OK on success, NOTOK on failure.
00127   //
00128   virtual int Prepare(WordTreeArg& arg) {
00129     int ret;
00130     proximity = arg._nproximity;
00131     has_uniq = arg._has_uniq;
00132     if((ret = key_semantic.Initialize(arg._document, arg._document_length, arg._location, arg._uniq)) != OK)
00133       return ret;
00134     key_semantic.Verbose(verbose);
00135     WordKey key(arg._words->GetContext());
00136     //
00137     // Set scope
00138     //
00139     if(!scope.empty()) {
00140       if(key.Set(scope) != OK) {
00141         fprintf(stderr, "WordTree::Prepare: setting scope %s failed\n", (char*)scope);
00142         return NOTOK;
00143       }
00144     }
00145     //
00146     // Set word
00147     //
00148     if(!search.empty()) {
00149       unsigned int wordid = WORD_DICT_SERIAL_INVALID;
00150       if(arg._words->Dict()->SerialExists(search, wordid) != OK)
00151         return NOTOK;
00152       key.Set(WORD_KEY_WORD, wordid);
00153     }
00154     return WordCursorOne::Initialize(arg._words, key, 0, 0, HTDIG_WORDLIST_WALKER);
00155   }
00156 
00157   virtual int WalkNextExclude(const WordKey& key);
00158 
00159   virtual int Bounds(const WordKey& bottom, const WordKey& top) = 0;
00160 
00161   //-
00162   // Return a copy of the last document found.
00163   //
00164   WordKey GetDocument() {
00165     WordKey found(words->GetContext());
00166     key_semantic.DocumentSet(GetFound().Key(), found);
00167     return found;
00168   }
00169 
00170   //-
00171   // Change the search criterion to match realm
00172   //
00173   virtual int SetRealm(const WordKey& realm) {
00174     key_semantic.RealmCopy(realm, GetSearch());
00175     return OK;
00176   }
00177   //-
00178   // Undefine the realm
00179   //
00180   virtual int UndefinedRealm() {
00181     key_semantic.RealmUndefined(GetSearch());
00182     return OK;
00183   }
00184   //-
00185   // Set the realm to 0
00186   //
00187   int ClearRealm() {
00188     WordKey realm(words->GetContext());
00189     key_semantic.RealmClear(realm);
00190     return SetRealm(realm);
00191   }
00192 
00193   //-
00194   // Returns estimate of the match count.
00195   //
00196   virtual int Count(unsigned int& count) const { return Noccurrence(count); }
00197 
00198   virtual int Noccurrence(unsigned int& noccurrence) const { return words->Noccurrence(search, noccurrence); }
00199 
00200   //-
00201   // Store in the <i>info</i> data member textual information about
00202   // the latest match found.
00203   //
00204   virtual void SetInfo() { info = search; }
00205 
00206   //-
00207   // Return a copy of the <i>info</i> data member. Should be 
00208   // called after SetInfo().
00209   //
00210   String GetInfo() { return info; }
00211 
00212   //-
00213   // Set the list of documents that must be ignored.
00214   //
00215   virtual inline int SetResults(WordResults* nresults) { results = nresults; return OK; }
00216   virtual inline WordResults* GetResults() { return results; }
00217 
00218   //-
00219   // Sort WordTree data members (if any) in ascending frequency order.
00220   // Return OK on success, NOTOK on failure.
00221   //
00222   virtual int AscendingFrequency() { return OK; }
00223 
00224   //-
00225   // Delete WordTree data members (if any) that have a zero frequency.
00226   // The number of data members deleted is returned in <b>stripped</b>.
00227   // Return OK on success, NOTOK on failure.
00228   //
00229   virtual int StripNonExistent(unsigned int& stripped, unsigned int& killed_mandatory) {
00230     stripped = 0;
00231     killed_mandatory = 0;
00232     return OK;
00233   }
00234 
00235   //-
00236   // Optimize the search expression. It first asks the expression
00237   // (member expr) to optimize itself, then it does some optimization
00238   // that cannot be done by the expression itself.
00239   //
00240   static int TopLevelOptimize(WordTree*& expr);
00241 
00242   inline int Verbose(int verbosity) { return verbose = verbosity; }
00243 
00244   //
00245   // Input
00246   //
00247   //-
00248   // Proximity factor. See WordKeySemantic::LocationCompare.
00249   //
00250   int proximity;
00251   //-
00252   // Reduce the result set so that only one document per server 
00253   // is returned. See WordKeySemantic::DocumentNext.
00254   //
00255   int has_uniq;
00256   //-
00257   // Semantic of the WordKey object.
00258   //
00259   WordKeySemantic key_semantic;
00260   //-
00261   // Textual representation of the search scope.
00262   //
00263   String scope;
00264   //-
00265   // Original search criterion that may be different from the 
00266   // WordCursor::searchKey data member.
00267   //
00268   String search;
00269 
00270   //
00271   // Internal state
00272   //
00273   //-
00274   // Textual information about the latest match.
00275   //
00276   String info;
00277   //-
00278   // A list of documents that must be ignored
00279   //
00280   WordResults *results;
00281   int verbose;
00282 };
00283 
00284 // ************************* WordTreeLiteral implementation ****************
00285 
00286 class WordTreeLiteral : public WordTree {
00287 public:
00288   //-
00289   // Constructor. The search criterion is <b>string</b> and the
00290   // scope is <b>nscope.</b>.
00291   //
00292   WordTreeLiteral(WordList* words, const char* string, int string_length, const char* nscope = "") :
00293     WordTree(words),
00294     bottom_document(words->GetContext()),
00295     top_document(words->GetContext())
00296   {
00297     search.set(string, string_length);
00298     scope.set((char*)nscope);
00299   }
00300 
00301   //-
00302   // Returns WORD_TREE_LITERAL.
00303   //
00304   int IsA() const { return WORD_TREE_LITERAL; }
00305 
00306   virtual int WalkInit();
00307   virtual int WalkRewind();
00308   //-
00309   // Only return a match for each distinct document.
00310   //
00311   virtual int WalkNext();
00312   virtual int Seek(const WordKey& patch);
00313 
00314   //-
00315   // If scope is set the <b>bufferout</b> is filled with
00316   // <pre>
00317   // ( word "scope" )
00318   // </pre>
00319   // otherwise the <b>bufferout</b> only contains the word.
00320   //
00321   virtual int Get(String& bufferout) const;
00322  
00323   virtual int Bounds(const WordKey& bottom, const WordKey& top) {
00324     bottom_document = bottom;
00325     top_document = top;
00326     return OK;
00327   }
00328 
00329 protected:
00330   WordKey bottom_document;
00331   WordKey top_document;
00332 };
00333 
00334 // ************************* WordTreeOperand implementation ****************
00335 //
00336 // NAME
00337 // 
00338 // Base class for boolean query resolution nodes
00339 //
00340 // SYNOPSIS
00341 //
00342 // #include <WordTree.h>
00343 //
00344 // class WordTreeMethod : public WordTreeOperand {
00345 // ...
00346 // };
00347 //
00348 // DESCRIPTION
00349 //
00350 // The WordTreeOperand class is derived from WordTree and implemet
00351 // the basic operations and data structures needed for query resultion
00352 // of boolean operators. It contains a list of WordTree objects (the
00353 // operands or cursors) and redefine the basic WordCursor methods
00354 // to operate on all of them according to the logic defined by the
00355 // derived class.
00356 //
00357 //
00358 // END
00359 //
00360 
00361 //
00362 // Helper for debugging that returns the string representation
00363 // of the return codes.
00364 //
00365 
00366 class WordTreeOperand : public WordTree
00367 {
00368 public:
00369   //-
00370   // Constructor. The scope is <b>nscope</b>.
00371   //
00372   WordTreeOperand(WordList* words, const char* nscope) :
00373     WordTree(words),
00374     pos(words->GetContext())
00375   {
00376     scope.set((char*)nscope);
00377   }
00378   //-
00379   // Free the objects pointed by <i>cursors</i> with delete as well
00380   // as the <i>cursors</i> array itself with delete [].
00381   //
00382   virtual ~WordTreeOperand();
00383 
00384   virtual void Clear() {
00385     cursors = 0;
00386     cursors_length = 0;
00387     WordCursorOne::Clear();
00388   }
00389 
00390   //-
00391   // Recursively call Optimize on each <i>cursors</i>.
00392   //
00393   virtual int Optimize();
00394 
00395   //-
00396   // Change the <i>permutation</i> data member ignore mask according
00397   // to WORD_TREE_MANDATORY and WORD_TREE_NOT nodes found in 
00398   // <i>cursors</i>. MANDATORY and NOT nodes are reduced (replaced
00399   // by their first child cursor. For each MANDATORY and NOT nodes
00400   // the bit (see WordExcludeMask for information) 
00401   // corresponding to their position is ignored (set in the <b>ignore</b>
00402   // argument of the WordExcludeMask::Initialize function. For NOT
00403   // nodes, the bit corresponding to their position is set in 
00404   // the <b>ignore_mask</b> of the WordExcludeMask::Initialize function
00405   // (i.e. implementing a <i>not</i> operation).
00406   // The <b>proximity</b> argument may be WORD_PERMUTE_PROXIMITY_TOGGLE or 
00407   // WORD_PERMUTE_PROXIMITY_NO.
00408   // Returns OK on success, NOTOK on failure.
00409   //
00410   int OptimizeOr(int proximity);
00411 
00412   virtual int ContextSave(String& buffer) const {
00413     StringList list;
00414     int ret;
00415     if((ret = ContextSaveList(list)) != OK)
00416       return ret;
00417 
00418     buffer.trunc();
00419     String* element;
00420     list.Start_Get();
00421     while((element = (String*)list.Get_Next())) {
00422       buffer << (*element) << ';';
00423     }
00424     //
00425     // Trim last ;
00426     //
00427     buffer.chop(1);
00428 
00429     return OK;
00430   }
00431 
00432   virtual int ContextSaveList(StringList& list) const {
00433     //
00434     // Apply to each cursor
00435     //
00436     unsigned int i;
00437     for(i = 0; i < cursors_length; i++)
00438       if(cursors[i]->ContextSaveList(list) == NOTOK)
00439         return NOTOK;
00440     return OK;
00441   }
00442 
00443   virtual int ContextRestore(const String& buffer) {
00444     if(!buffer.empty()) {
00445       StringList list(buffer, ";");
00446       return ContextRestoreList(list);
00447     } else {
00448       return OK;
00449     }
00450   }
00451 
00452   virtual int ContextRestoreList(StringList& list) {
00453     //
00454     // Apply to each cursor
00455     //
00456     unsigned int i;
00457     for(i = 0; i < cursors_length; i++)
00458       if(cursors[i]->ContextRestoreList(list) == NOTOK)
00459         return NOTOK;
00460     return OK;
00461   }
00462 
00463   virtual int SetResults(WordResults* nresults) {
00464     //
00465     // Apply to each cursor
00466     //
00467     unsigned int i;
00468     for(i = 0; i < cursors_length; i++)
00469       if(cursors[i]->SetResults(nresults) == NOTOK)
00470         return NOTOK;
00471     return WordTree::SetResults(nresults);
00472   }
00473 
00474   //-
00475   // Recursively call WalkInit on each <i>cursors</i>.
00476   //
00477   virtual int WalkInit();
00478   //-
00479   // Recursively call WalkRewind on each <i>cursors</i>.
00480   // Reset the <i>pos</i> data member with WordKeySemantic::DocumentClear.
00481   //
00482   virtual int WalkRewind();
00483   //-
00484   // Recursively call WalkFinish on each <i>cursors</i>.
00485   //
00486   virtual int WalkFinish();
00487   //-
00488   // Recursively call Seek on each <i>cursors</i>.
00489   // Save the <b>patch</b> argument in the <i>pos</i> data
00490   // member.
00491   //
00492   virtual int Seek(const WordKey& patch);
00493 
00494   //-
00495   // The number of occurrence of a WordTreeOperand is the sum of the
00496   // number of occurrence of each term.
00497   //
00498   virtual int Noccurrence(unsigned int& noccurrence) const {
00499     noccurrence = 0;
00500     unsigned int i;
00501     for(i = 0; i < cursors_length; i++) {
00502       unsigned int frequency;
00503       if(cursors[i]->Noccurrence(frequency) != OK)
00504         return NOTOK;
00505       noccurrence += frequency;
00506     }
00507     return OK;
00508   }
00509 
00510   //-
00511   // The <b>bufferout</b> argument is filled with a lisp like representation
00512   // of the tree starting at this node.
00513   //
00514   virtual int Get(String& bufferout) const;
00515   //-
00516   // Call Prepare on each <i>cursors</i>. Set the <i>search</i> member
00517   // with an textual representation of the tree starting at this node.
00518   //
00519   virtual int Prepare(WordTreeArg& arg) {
00520     int ret;
00521     if((ret = WordTree::Prepare(arg)) != OK)
00522       return ret;
00523     unsigned int i;
00524     for(i = 0; i < cursors_length; i++) {
00525       cursors[i]->Verbose(verbose);
00526       if((ret = cursors[i]->Prepare(arg)) != OK)
00527         return ret;
00528     }
00529     return Get(search);
00530   }
00531 
00532   virtual int Bounds(const WordKey& bottom, const WordKey& top) {
00533     int ret;
00534     unsigned int i;
00535     for(i = 0; i < cursors_length; i++) {
00536       if((ret = cursors[i]->Bounds(bottom, top)) != OK)
00537         return ret;
00538     }
00539     return OK;
00540   }
00541 
00542   //-
00543   // The current cursor offset (set by Seek for instance). It
00544   // duplicates the function of the WordCursor <i>key</i> data member
00545   // because the data type is different (WordKey instead of String).
00546   //
00547   WordKey pos;
00548   //-
00549   // Sub nodes array.
00550   //
00551   WordTree** cursors;
00552   //-
00553   // Number of valid entries in the <i>cursors</i> member.
00554   //
00555   unsigned int cursors_length;
00556   //-
00557   // Permutation generator with proximity toggle
00558   //
00559   WordPermute permutation;
00560 };
00561 
00562 // ************************* WordTreeOptional implementation ****************
00563 
00564 class WordTreeOptional : public WordTreeOperand {
00565  public:
00566   WordTreeOptional(WordList* words, const char* nscope) : WordTreeOperand(words, nscope) { }
00567 
00568   //-
00569   // Return WORD_TREE_OPTIONAL
00570   //
00571   virtual int IsA() const { return WORD_TREE_OPTIONAL; }
00572 
00573   virtual int Optimize();
00574 
00575   virtual int ContextSaveList(StringList& list) const;
00576 
00577   virtual int ContextRestoreList(StringList& list);
00578 
00579   //-
00580   // Multipass walk of the occurrences according to the <i>permutation</i>
00581   // data member specifications. First search for documents containing
00582   // all occurrences near to each other. Then documents that
00583   // contain all occurrences far appart. Then ignore the most frequent 
00584   // search criterion and search for documents that contain all the others
00585   // near to each other. The logic goes on until there only remains the
00586   // most frequent word. 
00587   //
00588   virtual int WalkNext();
00589   //-
00590   // Only seek the first non excluded cursor. The implementation
00591   // of WalkNext makes it useless to seek the others.
00592   //
00593   virtual int Seek(const WordKey& position);
00594 
00595   virtual int Prepare(WordTreeArg& arg) {
00596     int ret;
00597     if((ret = permutation.Initialize(cursors_length, 0, 0, WORD_PERMUTE_PROXIMITY_TOGGLE)) != OK)
00598       return ret;
00599     permutation.Verbose(verbose);
00600     return WordTreeOperand::Prepare(arg);
00601   }
00602 
00603   virtual void SetInfo();
00604 
00605   virtual int UseProximity() const { return WORD_PERMUTE_PROXIMITY_TOGGLE; }
00606 
00607   virtual int UsePermutation() const { return 1; }
00608 
00609   virtual int SetRealm(const WordKey& realm) {
00610     unsigned int i;
00611     int ret = OK;
00612     for(i = 0; i < cursors_length; i++) {
00613       if(permutation.Excluded(i)) {
00614         //
00615         // An excluded cursor is not restricted to the current realm.
00616         // The document is excluded no matter where the word appears
00617         // in the document.
00618         //
00619         if((ret = cursors[i]->UndefinedRealm()) != OK)
00620           return ret;
00621       } else {
00622         if((ret = cursors[i]->SetRealm(realm)) != OK)
00623           return ret;
00624       }
00625     }
00626     return OK;
00627   }
00628 
00629   virtual int Count(unsigned int& count) const;
00630 
00631   //-
00632   // Returns true if all cursors must have a frequency > 0, false otherwise.
00633   // 
00634   virtual int AllOrNothing() const { return 0; }
00635 
00636   //-
00637   // Comparison between <b>cursor</b> and <b>constraint</b> is made
00638   // with WordKeySemantic::LocationCompare using the <b>proximity</b>
00639   // argument. If <b>master</b> is NULL it is set to point to <b>
00640   // <b>cursor</b>.
00641   //
00642   // Return WORD_WALK_NEXT if <b>cursor</b> is at <b>constraint</b> and
00643   // set <b>constraint</b> if <b>cursor</b> is <b>master</b>.
00644   //
00645   // Return WORD_WALK_REDO if <b>cursor</b> is above <b>constraint</b> and
00646   // call cursor.WalkNext().
00647   //
00648   // Return WORD_WALK_RESTART if <b>cursor</b> is below <b>constraint</b> and
00649   // set <b>constraint</b> from <b>cursor</b> using
00650   // WordKeySemantic::DocumentSet if <b>cursor</b> is not <b>master</b> 
00651   // otherwise also set location of <b>constraint</b> using 
00652   // WordKeySemantic::LocationSet and call WordKeySemantic::LocationNext
00653   // on <b>constraint.</b>
00654   //
00655   // Return WORD_WALK_ATEND if no more match possible.
00656   //
00657   // Return NOTOK on failure.
00658   //
00659   int SearchCursorNear(WordTree& cursor, WordTree*& master, WordKey& constraint, int proximity);
00660   //-
00661   // Comparison between <b>cursor</b> and <b>document</b> is made
00662   // with WordKeySemantic::DocumentCompare.
00663   //
00664   // Return WORD_WALK_NEXT if <b>cursor</b> is above <b>document.</b>
00665   //
00666   // Return WORD_WALK_REDO if <b>cursor</b> is below <b>document</b>
00667   // and call cursor.WalkNext().
00668   //
00669   // Return WORD_WALK_RESTART if <b>cursor</b> is at <b>document</b>
00670   // and call WordKeySemantic::DocumentNext method on <b>document.</b>
00671   //
00672   // Return WORD_WALK_ATEND if no more match possible.
00673   //
00674   // Return NOTOK on failure.
00675   //
00676   int SearchCursorNot(WordTree& cursor, WordKey& document);
00677   //-
00678   // Comparison between <b>cursor</b> and <b>document</b> is made
00679   // with WordKeySemantic::DocumentCompare.
00680   //
00681   // Return WORD_WALK_NEXT if <b>cursor</b> is at <b>document.</b>.
00682   //
00683   // Return WORD_WALK_REDO if <b>cursor</b> is below <b>document</b>
00684   //
00685   // Return WORD_WALK_RESTART if <b>cursor</b> is above <b>document</b>
00686   // and call WordKeySemantic::DocumentNext method on <b>document.</b>
00687   //
00688   // Return WORD_WALK_ATEND if no more match possible.
00689   //
00690   // Return NOTOK on failure.
00691   // 
00692   //
00693   int SearchCursorAnd(WordTree& cursor, WordKey& document, WordExclude& permutation);
00694 
00695   //-
00696   // Sort the <i>cursors</i> in ascending frequency order using the
00697   // Noccurrence method on each cursor.
00698   // Return OK on success, NOTOK on failure.
00699   //
00700   virtual int AscendingFrequency();
00701   //-
00702   // Delete all elements of the <i>cursors</i> array that have a 
00703   // zero frequency. The <i>cursors</i> array is shrinked and the 
00704   // <i>cursors_length</i> set accordingly. Returns the number of
00705   // deletions in the <b>stripped</i> argument. 
00706   // Return OK on success, NOTOK on failure.
00707   //
00708   virtual int StripNonExistent(unsigned int& stripped, unsigned int& killed_mandatory);
00709 };
00710 
00711 // ************************* WordTreeOr implementation ********************
00712 
00713 class WordTreeOr : public WordTreeOperand {
00714  public:
00715   WordTreeOr(WordList* words, const char* nscope) : WordTreeOperand(words, nscope) { }
00716 
00717   //-
00718   // Return WORD_TREE_OR
00719   //
00720   virtual int IsA() const { return WORD_TREE_OR; }
00721 
00722   virtual int Optimize();
00723 
00724   virtual int ContextSaveList(StringList& list) const;
00725 
00726   virtual int ContextRestoreList(StringList& list);
00727 
00728   virtual void SetInfo();
00729 
00730   virtual int WalkNext();
00731 
00732   virtual int UsePermutation() const { return 0; }
00733 
00734   virtual int UseProximity() const { return WORD_PERMUTE_PROXIMITY_NO; }
00735 };
00736 
00737 // ************************* WordTreeAnd implementation ********************
00738 
00739 class WordTreeAnd : public WordTreeOptional {
00740  public:
00741   WordTreeAnd(WordList* words, const char* nscope) : WordTreeOptional(words, nscope) { }
00742 
00743   //-
00744   // Return WORD_TREE_AND
00745   //
00746   virtual int IsA() const { return WORD_TREE_AND; }
00747 
00748   virtual int UsePermutation() const { return 0; }
00749 
00750   virtual int UseProximity() const { return WORD_PERMUTE_PROXIMITY_NO; }
00751 
00752   virtual int AllOrNothing() const { return 1; }
00753 };
00754 
00755 // ************************* WordTreeNear implementation ********************
00756 
00757 class WordTreeNear : public WordTreeOptional {
00758  public:
00759   WordTreeNear(WordList* words, const char* nscope) : WordTreeOptional(words, nscope) { }
00760 
00761   //-
00762   // Return WORD_TREE_NEAR
00763   //
00764   virtual int IsA() const { return WORD_TREE_NEAR; }
00765 
00766   virtual int UsePermutation() const { return 0; }
00767 
00768   virtual int UseProximity() const { return WORD_PERMUTE_PROXIMITY_ONLY; }
00769 
00770   virtual int AllOrNothing() const { return 1; }
00771 
00772   virtual int Prepare(WordTreeArg& arg) {
00773     int proximity_saved = proximity ? proximity : arg._nproximity;
00774     int ret = WordTreeOptional::Prepare(arg);
00775     proximity = proximity_saved;
00776     return ret;
00777   }
00778 
00779 };
00780 
00781 // ************************* WordTreeMandatory implementation ***************
00782 
00783 class WordTreeMandatory : public WordTreeOperand {
00784  public:
00785   WordTreeMandatory(WordList* words, const char* nscope) : WordTreeOperand(words, nscope) { }
00786 
00787   //-
00788   // Return WORD_TREE_MANDATORY
00789   //
00790   virtual int IsA() const { return WORD_TREE_MANDATORY; }
00791 };
00792 
00793 // ************************* WordTreeNot implementation ***************
00794 
00795 class WordTreeNot : public WordTreeOperand {
00796  public:
00797   WordTreeNot(WordList* words, const char* nscope) : WordTreeOperand(words, nscope) { }
00798 
00799   //-
00800   // Return WORD_TREE_NOT
00801   //
00802   virtual int IsA() const { return WORD_TREE_NOT; }
00803 };
00804 
00805 #endif /* _WordTree_h */

Generated on Sun Jun 8 10:56:40 2008 for GNUmifluz by  doxygen 1.5.5