search

WordKeySemantic.cc

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: WordKeySemantic_8cc-source.html,v 1.1 2008年06月08日 10:13:12 sebdiaz Exp $
00009 //
00010 #ifdef HAVE_CONFIG_H
00011 #include <config.h>
00012 #endif /* HAVE_CONFIG_H */
00013 
00014 #ifdef HAVE_UNISTD_H
00015 #include <unistd.h>
00016 #endif /* HAVE_UNISTD_H */
00017 
00018 #include <clib.h>
00019 #include <WordKey.h>
00020 
00021 #include <WordKeySemantic.h>
00022 
00023 WordKeySemantic::WordKeySemantic(WordContext *ncontext)
00024 {
00025 context = ncontext;
00026 int nfields = context->GetKeyInfo().nfields;
00027 document = new int[nfields];
00028 document_length = 0;
00029 location = -1;
00030 verbose = 0;
00031 }
00032 
00033 WordKeySemantic::~WordKeySemantic()
00034 {
00035 if(document) delete [] document;
00036 }
00037 
00038 int WordKeySemantic::Initialize(int* document_arg, int document_length_arg, int location_arg, int uniq_arg)
00039 {
00040 memcpy((char*)document, (char*)document_arg, document_length_arg * sizeof(int));
00041 document_length = document_length_arg;
00042 location = location_arg;
00043 uniq = uniq_arg;
00044 
00045 for(int i = 0; i < document_length; i++) {
00046 if(i + 1 < document_length) {
00047 if(document[i] >= document[i+1]) {
00048 fprintf(stderr, "WordKeySemantic::Initialize: the document list must be a list of strictly increasing numbers (%d >= %d)\n", document[i], document[i+1]);
00049 return NOTOK;
00050 }
00051 }
00052 }
00053 return OK;
00054 }
00055 
00056 void WordKeySemantic::RealmSet(const WordKey& from, WordKey& to)
00057 {
00058 to.Clear();
00059 RealmCopy(from, to);
00060 }
00061 
00062 void WordKeySemantic::RealmCopy(const WordKey& from, WordKey& to)
00063 {
00064 for(int i = WORD_KEY_WORD + 1; i < document[i]; i++)
00065 to.Set(i, from.Get(i));
00066 }
00067 
00068 void WordKeySemantic::RealmUndefined(WordKey& key)
00069 {
00070 for(int i = WORD_KEY_WORD + 1; i < document[i]; i++)
00071 key.Undefined(i);
00072 }
00073 
00074 void WordKeySemantic::RealmClear(WordKey& key)
00075 {
00076 key.Clear();
00077 for(int i = WORD_KEY_WORD + 1; i < document[i]; i++)
00078 key.Set(i, 0);
00079 }
00080 
00081 void WordKeySemantic::DocumentSet(const WordKey& from, WordKey& to)
00082 {
00083 to.Clear();
00084 DocumentCopy(from, to);
00085 }
00086 
00087 void WordKeySemantic::DocumentCopy(const WordKey& from, WordKey& to)
00088 {
00089 for(int i = 0; i < document_length; i++)
00090 to.Set(document[i], from.Get(document[i]));
00091 }
00092 
00093 int WordKeySemantic::DocumentCompare(const WordKey& a, const WordKey& b)
00094 {
00095 int ret = 1;
00096 for(int i = 0; i < document_length; i++) {
00097 int idx = document[i];
00098 if((a.IsDefined(idx) && b.IsDefined(idx)) &&
00099 (ret = a.Get(idx) - b.Get(idx)) != 0) return ret;
00100 }
00101 return ret;
00102 }
00103 
00104 int WordKeySemantic::DocumentClear(WordKey& key)
00105 {
00106 for(int i = 0; i < document_length; i++)
00107 key.Set(document[i], 0);
00108 return 0;
00109 }
00110 
00111 int WordKeySemantic::DocumentUndefined(WordKey& key)
00112 {
00113 for(int i = 0; i < document_length; i++)
00114 key.Undefined(document[i]);
00115 return 0;
00116 }
00117 
00118 void WordKeySemantic::DocumentNext(WordKey& key, int use_uniq)
00119 {
00120 if(use_uniq)
00121 key.SetToFollowing(uniq);
00122 else
00123 key.SetToFollowing(document[document_length-1]);
00124 }
00125 
00126 
00127 void WordKeySemantic::LocationSet(const WordKey& from, WordKey& to)
00128 {
00129 to = from;
00130 to.Undefined(WORD_KEY_WORD);
00131 
00132 for(int i = location + 1; i < to.NFields(); i++) {
00133 to.Undefined(i); 
00134 }
00135 }
00136 
00137 int WordKeySemantic::LocationCompare(const WordKey& expected, const WordKey& actual, int proximity )
00138 {
00139 int ret = 1;
00140 
00141 for(int i = 1; i < document[0]; i++) {
00142 if((expected.IsDefined(i) && actual.IsDefined(i)) &&
00143 (ret = expected.Get(i) - actual.Get(i)) != 0) return ret;
00144 }
00145 
00146 if((ret = DocumentCompare(expected, actual)) != 0) return ret;
00147 //
00148 // Only compare location if defined.
00149 //
00150 if((expected.IsDefined(location) && actual.IsDefined(location)) &&
00151 (ret = expected.Get(location) - actual.Get(location))) {
00152 if(proximity < 0) {
00153 //
00154 // -N means ok if in range [-N +N]
00155 //
00156 proximity *= 2;
00157 if(ret < 0 && ret >= proximity)
00158 ret = 0;
00159 } else {
00160 //
00161 // N means ok if in range [0 +N]
00162 //
00163 if(ret < 0 && ret >= -proximity)
00164 ret = 0;
00165 }
00166 }
00167 return ret;
00168 }
00169 
00170 void WordKeySemantic::LocationNext(WordKey& key)
00171 {
00172 key.SetToFollowing(location);
00173 }
00174 
00175 void WordKeySemantic::LocationNearLowest(WordKey& key, int proximity)
00176 {
00177 if(proximity < 0) {
00178 if(key.Underflow(location, proximity))
00179 key.Get(location) = 0;
00180 else
00181 key.Get(location) += proximity;
00182 }
00183 }
00184 
00185 void WordKeySemantic::Location2Document(WordKey& key)
00186 {
00187 key.Undefined(location);
00188 }
00189 

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

AltStyle によって変換されたページ (->オリジナル) /