FirteX-高性能全文索引和检索平台API Documentation |
00001 // 00002 // Copyright(C) 2005--2006 Institute of Computing Tech, Chinese Academy of Sciences. 00003 // All rights reserved. 00004 // This file is part of FirteX (www.firtex.org) 00005 // 00006 // Use of the FirteX is subject to the terms of the software license set forth in 00007 // the LICENSE file included with this software, and also available at 00008 // http://www.firtex.org/license.html 00009 // 00010 // Author : 郭瑞杰(GuoRuijie) 00011 // Email : ruijieguo@software.ict.ac.cn 00012 // Created : 2006/5/20 00013 // 00014 #ifndef _METADATA_H 00015 #define _METADATA_H 00016 00017 #if _MSC_VER > 1000 00018 #pragma once 00019 #endif // _MSC_VER > 1000 00020 00021 #include "../utility/typedefs.h" 00022 #include "../utility/Exception.h" 00023 #include "../utility/Number.h" 00024 #include "../utility/FXString.h" 00025 #include <string> 00026 using namespace firtex; 00027 using namespace firtex::utility; 00028 using namespace std; 00029 00030 namespace firtex 00031 { 00032 namespace index 00033 { 00034 enum METAENUM 00035 { 00036 MT_EMPTY = 0, //Empty 00037 MT_STR = 1, //ANSI 00038 MT_WSTR = 2, //UNICODE 00039 MT_NUMBER = 3, //Number 00040 MT_DATARECORD = 4, //Binary data 00041 }; 00042 00043 typedef unsigned short meta_type; 00044 typedef struct _tag_metadata_var 00045 { 00046 meta_type mt; 00047 union 00048 { 00049 union 00050 { 00051 CFXString* strval; //ANSI 00052 CFXStringW* wstrval; //Unicode 00053 }text; 00054 numbervar numval; //Number 00055 struct sdrval : public datarecord //Binary data 00056 { 00057 bool owner; 00058 }drval; 00059 }meta; 00060 }metadata_var; 00061 00062 class CMetadataVar : public _tag_metadata_var 00063 { 00064 public: 00065 CMetadataVar(); 00066 CMetadataVar(const metadata_var& mdvar); //will NOT copy string 00067 CMetadataVar(const string& value); //will copy string 00068 CMetadataVar(const char* value); //will copy string 00069 CMetadataVar(const wchar_t* value); //will copy string 00070 CMetadataVar(char* value,size_t len,bool bNoCopy); //will or will NOT copy string,depends on bNoCopy 00071 CMetadataVar(wchar_t* value,size_t len,bool bNoCopy); //will or will NOT copy string,depends on bNoCopy 00072 CMetadataVar(const str_t& value,bool bNoCopy); //will or will NOT copy string,depends on bNoCopy 00073 CMetadataVar(const wstr_t& value,bool bNoCopy); //will or will NOT copy string,depends on bNoCopy 00074 CMetadataVar(const CNumber& number); 00075 CMetadataVar(const numbervar& number); 00076 CMetadataVar(const datarecord& datarec,bool bNoCopy); //will or will NOT copy data,depends on bNoCopy 00077 ~CMetadataVar(); 00078 public: 00079 operator char*(); 00080 operator wchar_t*(); 00081 operator str_t(); 00082 operator wstr_t(); 00083 operator numbervar(); 00084 operator datarecord(); 00085 00086 CMetadataVar& operator =(const char* value); //will copy string 00087 CMetadataVar& operator =(const wchar_t* value); //will copy string 00088 CMetadataVar& operator =(const str_t& value); //will copy string 00089 CMetadataVar& operator =(const wstr_t& value); //will copy string 00090 CMetadataVar& operator =(const CNumber& number); 00091 CMetadataVar& operator =(const numbervar& number); 00092 CMetadataVar& operator =(const datarecord& datarec); //will copy string 00093 00094 bool operator==(const metadata_var& mdvar); 00095 bool operator==(const metadata_var* mdvar); 00096 00097 bool operator!=(const metadata_var& mdvar); 00098 bool operator!=(const metadata_var* mdvar); 00099 public: 00100 void clear(); 00101 void assign(char* value,size_t len,bool bNoCopy); 00102 void assign(wchar_t* value,size_t len,bool bNoCopy); 00103 void assign(const char* value); 00104 void assign(const wchar_t* value); 00105 void assign(const datarecord& datarec,bool bNoCopy); 00106 void assign(const numbervar& num); 00107 protected: 00108 void assign_str(const char* s); 00109 void assign_wstr(const wchar_t* s); 00110 void assign_str(char* s,size_t len); 00111 void assign_wstr(wchar_t* s,size_t len); 00112 void assign_str(const str_t& s); 00113 void assign_wstr(const wstr_t& s); 00114 }; 00115 00117 //CMetadata 00118 00119 class CMetadata : public CMetadataVar 00120 { 00121 public: 00122 CMetadata(void); 00123 CMetadata(schemaid_t id,const tchar* name,bool bAnalyze,bool bIndex,bool bCompress); 00124 00125 CMetadata(const tchar* name,const string& value,bool bAnalyze,bool bIndex); //will NOT copy string 00126 CMetadata(const tchar* name,const char* value,bool bAnalyze,bool bIndex); //will copy string 00127 CMetadata(const tchar* name,const wchar_t* value,bool bAnalyze,bool bIndex); //will copy string 00128 CMetadata(const tchar* name,char* value,size_t len,bool bNoCopy,bool bAnalyze,bool bIndex); //will or will NOT copy string,depends on bNoCopy 00129 CMetadata(const tchar* name,wchar_t* value,size_t len,bool bNoCopy,bool bAnalyze,bool bIndex); //will or will NOT copy string,depends on bNoCopy 00130 CMetadata(const tchar* name,const str_t& value,bool bNoCopy,bool bAnalyze,bool bIndex); 00131 CMetadata(const tchar* name,const wstr_t& value,bool bNoCopy,bool bAnalyze,bool bIndex); 00132 CMetadata(const tchar* name,const CNumber& number,bool bIndex); 00133 CMetadata(const tchar* name,const numbervar& number,bool bIndex); 00134 CMetadata(const tchar* name,const datarecord& datarec,bool bNoCopy,bool bCompress); 00135 ~CMetadata(void); 00136 public: 00137 CFXString Name; 00138 schemaid_t Id; 00139 struct sIndex 00140 { 00141 bool Analyze; 00142 bool Index; 00143 bool Compress; 00144 }Index; 00145 }; 00146 00148 //CMetadataVar inline functions 00149 00150 inline CMetadataVar::CMetadataVar() 00151 { 00152 memset(this,0,sizeof(metadata_var)); 00153 mt = MT_EMPTY; 00154 } 00155 inline CMetadataVar::CMetadataVar(const metadata_var& mdvar) 00156 { 00157 memset(this,0,sizeof(metadata_var)); 00158 mt = mdvar.mt; 00159 meta = mdvar.meta; 00160 } 00161 inline CMetadataVar::CMetadataVar(const string& value) 00162 { 00163 memset(this,0,sizeof(metadata_var)); 00164 mt = MT_STR; 00165 meta.text.strval = new CFXString(value); 00166 } 00167 inline CMetadataVar::CMetadataVar(const char* value) 00168 { 00169 memset(this,0,sizeof(metadata_var)); 00170 mt = MT_STR; 00171 meta.text.strval = new CFXString(value); 00172 } 00173 inline CMetadataVar::CMetadataVar(const wchar_t* value) 00174 { 00175 memset(this,0,sizeof(metadata_var)); 00176 mt = MT_WSTR; 00177 meta.text.wstrval = new CFXStringW(value); 00178 } 00179 inline CMetadataVar::CMetadataVar(char* value,size_t len,bool bNoCopy) 00180 { 00181 memset(this,0,sizeof(metadata_var)); 00182 mt = MT_STR; 00183 meta.text.strval = new CFXString(value,len,bNoCopy); 00184 } 00185 inline CMetadataVar::CMetadataVar(wchar_t* value,size_t len,bool bNoCopy) 00186 { 00187 memset(this,0,sizeof(metadata_var)); 00188 mt = MT_WSTR; 00189 meta.text.wstrval = new CFXStringW(value,len,bNoCopy); 00190 } 00191 inline CMetadataVar::CMetadataVar(const str_t& value,bool bNoCopy) 00192 { 00193 memset(this,0,sizeof(metadata_var)); 00194 mt = MT_STR; 00195 meta.text.strval = new CFXString(value,bNoCopy); 00196 } 00197 inline CMetadataVar::CMetadataVar(const wstr_t& value,bool bNoCopy) 00198 { 00199 memset(this,0,sizeof(metadata_var)); 00200 mt = MT_WSTR; 00201 meta.text.wstrval = new CFXStringW(value,bNoCopy); 00202 } 00203 inline CMetadataVar::CMetadataVar(const CNumber& number) 00204 { 00205 memset(this,0,sizeof(metadata_var)); 00206 mt = MT_NUMBER; 00207 meta.numval = number; 00208 } 00209 inline CMetadataVar::CMetadataVar(const numbervar& number) 00210 { 00211 memset(this,0,sizeof(metadata_var)); 00212 mt = MT_NUMBER; 00213 meta.numval = number; 00214 } 00215 inline CMetadataVar::CMetadataVar(const datarecord& datarec,bool bNoCopy) 00216 { 00217 memset(this,0,sizeof(metadata_var)); 00218 mt = MT_DATARECORD; 00219 meta.drval.length = datarec.length; 00220 if(bNoCopy) 00221 { 00222 meta.drval.data = datarec.data; 00223 meta.drval.owner = false; 00224 } 00225 else 00226 { 00227 meta.drval.data = new byte[datarec.length]; 00228 memcpy(meta.drval.data,datarec.data,datarec.length); 00229 meta.drval.owner = true; 00230 } 00231 } 00232 inline CMetadataVar::~CMetadataVar() 00233 { 00234 clear(); 00235 } 00236 inline CMetadataVar::operator char*() 00237 { 00238 FIRTEX_ASSERT((mt == MT_STR),_T("CMetadataVar::operator char*()")); 00239 return (*(meta.text.strval)); 00240 } 00241 inline CMetadataVar::operator wchar_t*() 00242 { 00243 FIRTEX_ASSERT((mt == MT_WSTR),_T("CMetadataVar::operator wchar_t*()")); 00244 return (*(meta.text.wstrval)); 00245 } 00246 inline CMetadataVar::operator str_t() 00247 { 00248 FIRTEX_ASSERT((mt == MT_STR),_T("CMetadataVar::operator str_t()")); 00249 return (*(meta.text.strval)); 00250 } 00251 inline CMetadataVar::operator wstr_t() 00252 { 00253 FIRTEX_ASSERT((mt == MT_WSTR),_T("CMetadataVar::operator wstr_t()")); 00254 return (*(meta.text.wstrval)); 00255 } 00256 inline CMetadataVar::operator numbervar() 00257 { 00258 FIRTEX_ASSERT((mt == MT_NUMBER),_T("CMetadataVar::operator numbervar()")); 00259 return meta.numval; 00260 } 00261 inline CMetadataVar::operator datarecord() 00262 { 00263 FIRTEX_ASSERT((mt == MT_DATARECORD),_T("CMetadataVar::operator datarecord()")); 00264 return meta.drval; 00265 } 00266 00267 inline CMetadataVar& CMetadataVar::operator =(const char* value) 00268 { 00269 FIRTEX_ASSERT(( (mt == MT_STR) || (mt == MT_EMPTY) ),_T("CMetadataVar::operator =(const char* value)")); 00270 00271 mt = MT_STR; 00272 if(meta.text.strval == NULL) 00273 meta.text.strval = new CFXString(value); 00274 else (*(meta.text.strval)) = value; 00275 return *this; 00276 } 00277 inline CMetadataVar& CMetadataVar::operator =(const wchar_t* value) 00278 { 00279 FIRTEX_ASSERT(( (mt == MT_WSTR) || (mt == MT_EMPTY) ),_T("CMetadataVar::operator =(const wchar_t* value)")); 00280 00281 mt = MT_WSTR; 00282 if(meta.text.wstrval == NULL) 00283 meta.text.wstrval = new CFXStringW(value); 00284 else (*(meta.text.wstrval)) = value; 00285 return *this; 00286 } 00287 inline CMetadataVar& CMetadataVar::operator =(const str_t& value) 00288 { 00289 FIRTEX_ASSERT(( (mt == MT_STR) || (mt == MT_EMPTY) ),"CMetadataVar::operator =(const str_t* value)"); 00290 00291 mt = MT_STR; 00292 if(meta.text.strval == NULL) 00293 meta.text.strval = new CFXString(value); 00294 else (*(meta.text.strval)) = value; 00295 return (*this); 00296 } 00297 inline CMetadataVar& CMetadataVar::operator =(const wstr_t& value) 00298 { 00299 FIRTEX_ASSERT(( (mt == MT_WSTR) || (mt == MT_EMPTY) ),_T("CMetadataVar::operator =(const wstr_t* value)")); 00300 00301 mt = MT_WSTR; 00302 if(meta.text.wstrval == NULL) 00303 meta.text.wstrval = new CFXStringW(value); 00304 else (*(meta.text.wstrval)) = value; 00305 return (*this); 00306 } 00307 inline CMetadataVar& CMetadataVar::operator =(const CNumber& number) 00308 { 00309 FIRTEX_ASSERT(( (mt == MT_NUMBER) || (mt == MT_EMPTY) ),_T("CMetadataVar::operator =(const CNumber& value)")); 00310 00311 mt = MT_NUMBER; 00312 meta.numval = (numbervar)number; 00313 return (*this); 00314 } 00315 inline CMetadataVar& CMetadataVar::operator =(const numbervar& number) 00316 { 00317 FIRTEX_ASSERT(( (mt == MT_NUMBER) || (mt == MT_EMPTY) ),_T("CMetadataVar::operator =(const numbervar& value)")); 00318 00319 mt = MT_NUMBER; 00320 meta.numval = number; 00321 return (*this); 00322 } 00323 inline CMetadataVar& CMetadataVar::operator =(const datarecord& datarec) 00324 { 00325 FIRTEX_ASSERT(( (mt == MT_DATARECORD) || (mt == MT_EMPTY) ),_T("CMetadataVar::operator =(const datarecord& value)")); 00326 00327 mt = MT_DATARECORD; 00328 if(meta.drval.owner && meta.drval.data) 00329 delete[] meta.drval.data; 00330 meta.drval.length = datarec.length; 00331 meta.drval.data = new byte[datarec.length]; 00332 memcpy(meta.drval.data,datarec.data,datarec.length); 00333 meta.drval.owner = true; 00334 return (*this); 00335 } 00336 00337 inline void CMetadataVar::assign(char* value,size_t len,bool bNoCopy) 00338 { 00339 FIRTEX_ASSERT(( (mt == MT_STR) || (mt == MT_EMPTY) ),_T("CMetadataVar::assign(char* value,size_t len,bool bNoCopy)")); 00340 mt = MT_STR; 00341 if(meta.text.strval == NULL) 00342 meta.text.strval = new CFXString(value,len,bNoCopy); 00343 else meta.text.strval->assign(value,len,bNoCopy); 00344 } 00345 inline void CMetadataVar::assign(wchar_t* value,size_t len,bool bNoCopy) 00346 { 00347 FIRTEX_ASSERT(( (mt == MT_WSTR) || (mt == MT_EMPTY) ),_T("CMetadataVar::assign(char* value,size_t len,bool bNoCopy)")); 00348 mt = MT_WSTR; 00349 if(meta.text.wstrval == NULL) 00350 meta.text.wstrval = new CFXStringW(value,len,bNoCopy); 00351 else meta.text.wstrval->assign(value,len,bNoCopy); 00352 } 00353 inline void CMetadataVar::assign(const char* value) 00354 { 00355 FIRTEX_ASSERT(( (mt == MT_STR) || (mt == MT_EMPTY) ),_T("CMetadataVar::assign(const char* value)")); 00356 mt = MT_STR; 00357 if(meta.text.strval == NULL) 00358 meta.text.strval = new CFXString(value); 00359 else meta.text.strval->assign(value); 00360 } 00361 inline void CMetadataVar::assign(const wchar_t* value) 00362 { 00363 FIRTEX_ASSERT(( (mt == MT_WSTR) || (mt == MT_EMPTY) ),_T("CMetadataVar::assign(char* value,size_t len,bool bNoCopy)")); 00364 mt = MT_WSTR; 00365 if(meta.text.wstrval == NULL) 00366 meta.text.wstrval = new CFXStringW(value); 00367 else meta.text.wstrval->assign(value); 00368 } 00369 00370 inline void CMetadataVar::assign(const datarecord& datarec,bool bNoCopy) 00371 { 00372 00373 FIRTEX_ASSERT(( (mt == MT_DATARECORD) || (mt == MT_EMPTY) ),_T("CMetadataVar::assign(const datarecord& datarec,bool bNoCopy)")); 00374 mt = MT_DATARECORD; 00375 meta.drval.length = datarec.length; 00376 if(bNoCopy) 00377 { 00378 meta.drval.data = datarec.data; 00379 meta.drval.owner = false; 00380 } 00381 else 00382 { 00383 meta.drval.data = new byte[datarec.length]; 00384 memcpy(meta.drval.data,datarec.data,datarec.length); 00385 meta.drval.owner = true; 00386 } 00387 } 00388 inline void CMetadataVar::assign(const numbervar& num) 00389 { 00390 FIRTEX_ASSERT(( (mt == MT_NUMBER) || (mt == MT_EMPTY) ),_T("CMetadataVar::assign(const numbervar& num)")); 00391 mt = MT_NUMBER; 00392 meta.numval = num; 00393 } 00394 00395 inline bool CMetadataVar::operator==(const metadata_var& mdvar) 00396 { 00397 return (this == &mdvar); 00398 } 00399 inline bool CMetadataVar::operator==(const metadata_var* mdvar) 00400 { 00401 if(mdvar == NULL) 00402 return false; 00403 if(mt != mdvar->mt) 00404 return false; 00405 switch(mt) 00406 { 00407 case MT_EMPTY: 00408 return true; 00409 case MT_STR: 00410 if(meta.text.strval == mdvar->meta.text.strval) 00411 return true; 00412 if(meta.text.strval== NULL || mdvar->meta.text.strval==NULL) 00413 return false; 00414 return (*(meta.text.strval)) == (*(mdvar->meta.text.strval)); 00415 case MT_WSTR: 00416 if(meta.text.wstrval == mdvar->meta.text.wstrval) 00417 return true; 00418 if(meta.text.wstrval== NULL || mdvar->meta.text.wstrval==NULL) 00419 return false; 00420 return (*(meta.text.wstrval)) == (*(mdvar->meta.text.wstrval)); 00421 case MT_NUMBER: 00422 return ( ((CNumber)meta.numval) == mdvar->meta.numval); 00423 default: 00424 return false; 00425 } 00426 } 00427 00428 inline bool CMetadataVar::operator!=(const metadata_var& mdvar) 00429 { 00430 return !(this == &mdvar); 00431 } 00432 inline bool CMetadataVar::operator!=(const metadata_var* mdvar) 00433 { 00434 return !(this == mdvar); 00435 } 00436 00437 inline void CMetadataVar::clear() 00438 { 00439 if(mt == MT_EMPTY) 00440 return ; 00441 switch(mt) 00442 { 00443 case MT_STR: 00444 { 00445 delete meta.text.strval; 00446 break; 00447 } 00448 case MT_WSTR: 00449 { 00450 delete meta.text.wstrval; 00451 break; 00452 } 00453 case MT_NUMBER: 00454 { 00455 break; 00456 } 00457 case MT_DATARECORD: 00458 { 00459 if(meta.drval.owner) 00460 delete[] meta.drval.data; 00461 meta.drval.owner = false; 00462 meta.drval.data = NULL; 00463 meta.drval.length = 0; 00464 break; 00465 } 00466 default: 00467 break; 00468 } 00469 mt = MT_EMPTY; 00470 } 00471 00473 // CMetadata inline functions 00474 inline CMetadata::CMetadata(void):CMetadataVar() 00475 { 00476 Id = -1; 00477 } 00478 inline CMetadata::CMetadata(schemaid_t id,const tchar* name,bool bAnalyze,bool bIndex,bool bCompress) 00479 :Id(id) 00480 ,Name(name) 00481 { 00482 Index.Index = bIndex; 00483 Index.Analyze = bAnalyze; 00484 Index.Compress = bCompress; 00485 } 00486 inline CMetadata::CMetadata(const tchar* name,const string& value,bool bAnalyze,bool bIndex) 00487 :CMetadataVar(value) 00488 ,Name(name) 00489 { 00490 Id = -1; 00491 Index.Index = bIndex; 00492 Index.Analyze = bAnalyze; 00493 Index.Compress = false; 00494 } 00495 inline CMetadata::CMetadata(const tchar* name,const char* value,bool bAnalyze,bool bIndex) 00496 :CMetadataVar(value) 00497 ,Name(name) 00498 { 00499 Id = -1; 00500 Index.Index = bIndex; 00501 Index.Analyze = bAnalyze; 00502 Index.Compress = false; 00503 } 00504 inline CMetadata::CMetadata(const tchar* name,const wchar_t* value,bool bAnalyze,bool bIndex) 00505 :CMetadataVar(value) 00506 ,Name(name) 00507 { 00508 Id = -1; 00509 Index.Index = bIndex; 00510 Index.Analyze = bAnalyze; 00511 Index.Compress = false; 00512 } 00513 inline CMetadata::CMetadata(const tchar* name,char* value,size_t len,bool bNoCopy,bool bAnalyze,bool bIndex) 00514 :CMetadataVar(value,len,bNoCopy) 00515 ,Name(name) 00516 { 00517 Id = -1; 00518 Index.Index = bIndex; 00519 Index.Analyze = bAnalyze; 00520 Index.Compress = false; 00521 } 00522 inline CMetadata::CMetadata(const tchar* name,wchar_t* value,size_t len,bool bNoCopy,bool bAnalyze,bool bIndex) 00523 :CMetadataVar(value,len,bNoCopy) 00524 ,Name(name) 00525 { 00526 Id = -1; 00527 Index.Index = bIndex; 00528 Index.Analyze = bAnalyze; 00529 Index.Compress = false; 00530 } 00531 inline CMetadata::CMetadata(const tchar* name,const str_t& value,bool bNoCopy,bool bAnalyze,bool bIndex) 00532 :CMetadataVar(value,bNoCopy) 00533 ,Name(name) 00534 { 00535 Id = -1; 00536 Index.Index = bIndex; 00537 Index.Analyze = bAnalyze; 00538 Index.Compress = false; 00539 } 00540 inline CMetadata::CMetadata(const tchar* name,const wstr_t& value,bool bNoCopy,bool bAnalyze,bool bIndex) 00541 :CMetadataVar(value,bNoCopy) 00542 ,Name(name) 00543 { 00544 Id = -1; 00545 Index.Index = bIndex; 00546 Index.Analyze = bAnalyze; 00547 Index.Compress = false; 00548 } 00549 inline CMetadata::CMetadata(const tchar* name,const CNumber& number,bool bIndex) 00550 :CMetadataVar(number) 00551 ,Name(name) 00552 { 00553 Id = -1; 00554 Index.Index = bIndex; 00555 Index.Analyze = false; 00556 Index.Compress = false; 00557 } 00558 inline CMetadata::CMetadata(const tchar* name,const numbervar& number,bool bIndex) 00559 :CMetadataVar(number) 00560 ,Name(name) 00561 { 00562 Id = -1; 00563 Index.Index = bIndex; 00564 Index.Analyze = false; 00565 Index.Compress = false; 00566 } 00567 inline CMetadata::CMetadata(const tchar* name,const datarecord& datarec,bool bNoCopy,bool bCompress) 00568 :CMetadataVar(datarec,bNoCopy) 00569 ,Name(name) 00570 { 00571 Id = -1; 00572 Index.Index = false; 00573 Index.Analyze = false; 00574 Index.Compress = bCompress; 00575 } 00576 inline CMetadata::~CMetadata(void) 00577 { 00578 } 00579 } 00580 } 00581 00582 #endif
http://www.firtex.org http://www.sourceforge.net/projects/firtex