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 : 2005/12/07 00013 // 00014 00015 #ifndef _INDEXARGUMENT_H 00016 #define _INDEXARGUMENT_H 00017 00018 #if _MSC_VER > 1000 00019 #pragma once 00020 #endif // _MSC_VER > 1000 00021 00022 #include "../utility/stdint.h" 00023 #include "Metadata.h" 00024 #include "../document/DocumentSchema.h" 00025 #include "../utility/Config.h" 00026 #include "../utility/FXString.h" 00027 #include <assert.h> 00028 #include <string> 00029 using namespace std; 00030 using namespace firtex::utility; 00031 using namespace firtex::document; 00032 00033 namespace firtex 00034 { 00035 namespace index 00036 { 00037 typedef unsigned short param_type; 00038 00039 #define PARAMETER_DEFINE(a, value) namespace param { const param_type a = (param_type)(value); } 00040 00041 PARAMETER_DEFINE(File,1) 00042 PARAMETER_DEFINE(FileW,2) 00043 PARAMETER_DEFINE(Buffer,3) 00044 00045 typedef struct _tagParameter 00046 { 00047 param_type at; 00048 00049 str_t buffer; //Buffer 00050 CFXStringA file; //文件路径,ANSI 00051 CFXStringW wfile; //文件路径,UNICODE 00052 }Parameter; 00053 00054 class CIndexParameter 00055 { 00056 public: 00057 CIndexParameter(void); 00058 CIndexParameter(const CDocumentSchema& schema); 00059 virtual ~CIndexParameter(void); 00060 00061 public: 00066 void setSchema(const CDocumentSchema& schema); 00071 CDocumentSchema* getSchema(){return m_pDocSchema;}; 00072 00076 bool isSchemaModified(){return m_bIsSchemaModified;} 00077 00082 void setSchemaModified(bool bModified = true){ m_bIsSchemaModified = bModified;} 00083 public: 00089 inline void addMetadata(schemaid_t id,const string& value); 00090 inline void addMetadata(schemaid_t id,const char* value); 00091 inline void addMetadata(schemaid_t id,const wchar_t* value); 00092 inline void addMetadata(schemaid_t id,char* value,size_t len,bool bNoCopy); 00093 inline void addMetadata(schemaid_t id,wchar_t* value,size_t len,bool bNoCopy); 00094 inline void addMetadata(schemaid_t id,const str_t& value,bool bNoCopy); 00095 inline void addMetadata(schemaid_t id,const wstr_t& value,bool bNoCopy); 00096 inline void addMetadata(schemaid_t id,const CNumber& number); 00097 inline void addMetadata(schemaid_t id,const numbervar& number); 00098 inline void addMetadata(schemaid_t id,const datarecord& datarec,bool bNoCopy); 00099 00100 public: 00101 void startIterator(){m_iterator = 0;} 00102 bool hasNext(){return (m_iterator < m_numMetas);} 00103 CMetadata* next(){return m_ppMetas[m_iterator++];} 00104 public: 00108 Parameter& getParam(){return m_Param;} 00109 00114 void setParam(const char* filename); 00115 00120 void setParam(const wchar_t* filename); 00121 00127 void setParam(char* buffer,size_t len); 00128 00129 00134 int getMetaNum(){return m_numMetas;} 00135 00141 CMetadata* getMetadata(const tchar* name); 00142 00148 CMetadata* getMetadata(schemaid_t id); 00149 public: 00150 void cleanup(); 00151 void applySchema(); 00152 private: 00153 Parameter m_Param; 00154 CMetadata** m_ppMetas; //metadata数组 00155 int m_numMetas; //metadata数组长度 00156 int m_iterator; //用于迭代方式访问元数据 00157 00158 bool m_bIsSchemaModified; //是否经修改过元数据的schema 00159 00160 CDocumentSchema* m_pDocSchema; //模式 00161 }; 00162 00164 //inline functions 00165 inline void CIndexParameter::addMetadata(schemaid_t id,const string& value) 00166 { 00167 FIRTEX_ASSERT((id >=0 && id < m_numMetas),_T("CIndexParameter::addMetadata(schemaid_t id,const string& value)")); 00168 m_ppMetas[id]->assign(value.c_str()); 00169 } 00170 inline void CIndexParameter::addMetadata(schemaid_t id,const char* value) 00171 { 00172 FIRTEX_ASSERT((id >=0 && id < m_numMetas),_T("CIndexParameter::addMetadata(schemaid_t id,const char* value)")); 00173 m_ppMetas[id]->assign(value); 00174 } 00175 inline void CIndexParameter::addMetadata(schemaid_t id,const wchar_t* value) 00176 { 00177 FIRTEX_ASSERT((id >=0 && id < m_numMetas),_T("CIndexParameter::addMetadata(schemaid_t id,const wchar_t* value)")); 00178 m_ppMetas[id]->assign(value); 00179 } 00180 inline void CIndexParameter::addMetadata(schemaid_t id,char* value,size_t len,bool bNoCopy) 00181 { 00182 FIRTEX_ASSERT((id >=0 && id < m_numMetas),_T("CIndexParameter::addMetadata(schemaid_t id,char* value,size_t len,bool bNoCopy)")); 00183 m_ppMetas[id]->assign(value,len,bNoCopy); 00184 } 00185 inline void CIndexParameter::addMetadata(schemaid_t id,wchar_t* value,size_t len,bool bNoCopy) 00186 { 00187 FIRTEX_ASSERT((id >=0 && id < m_numMetas),_T("CIndexParameter::addMetadata(schemaid_t id,wchar_t* value,size_t len,bool bNoCopy)")); 00188 m_ppMetas[id]->assign(value,len,bNoCopy); 00189 } 00190 00191 inline void CIndexParameter::addMetadata(schemaid_t id,const str_t& value,bool bNoCopy) 00192 { 00193 FIRTEX_ASSERT((id >=0 && id < m_numMetas),_T("CIndexParameter::addMetadata(schemaid_t id,const str_t& value,bool bNoCopy)")); 00194 m_ppMetas[id]->assign(value.str,value.length,bNoCopy); 00195 00196 } 00197 inline void CIndexParameter::addMetadata(schemaid_t id,const wstr_t& value,bool bNoCopy) 00198 { 00199 FIRTEX_ASSERT((id >=0 && id < m_numMetas),_T("CIndexParameter::addMetadata(schemaid_t id,const wstr_t& value,bool bNoCopy)")); 00200 m_ppMetas[id]->assign(value.str,value.length,bNoCopy); 00201 } 00202 inline void CIndexParameter::addMetadata(schemaid_t id,const CNumber& number) 00203 { 00204 FIRTEX_ASSERT((id >=0 && id < m_numMetas),_T("CIndexParameter::addMetadata(schemaid_t id,const CNumber& number)")); 00205 if(m_ppMetas[id]->Index.Analyze) 00206 { 00207 FIRTEX_CLOG(level::warn) << "addMetadata(schemaid_t id,const CNumber& number):Number value can't analyze,discard it." <<endl; 00208 return; 00209 } 00210 m_ppMetas[id]->assign(number); 00211 } 00212 inline void CIndexParameter::addMetadata(schemaid_t id,const numbervar& number) 00213 { 00214 FIRTEX_ASSERT((id >=0 && id < m_numMetas),_T("CIndexParameter::addMetadata(schemaid_t id,const numbervar& number)")); 00215 if(m_ppMetas[id]->Index.Analyze) 00216 { 00217 FIRTEX_CLOG(level::warn) << "addMetadata(schemaid_t id,const numbervar& number):Number value can't analyze,discard it." <<endl; 00218 return; 00219 } 00220 m_ppMetas[id]->assign(number); 00221 } 00222 inline void CIndexParameter::addMetadata(schemaid_t id,const datarecord& datarec,bool bNoCopy) 00223 { 00224 FIRTEX_ASSERT((id >=0 && id < m_numMetas),_T("CIndexParameter::addMetadata(schemaid_t id,const datarecord& datarec,bool bNoCopy)")); 00225 if(m_ppMetas[id]->Index.Analyze) 00226 { 00227 FIRTEX_CLOG(level::warn) << "addMetadata(schemaid_t id,const datarecord& datarec,bool bNoCopy):Binary value can't analyze,discard it." <<endl; 00228 return; 00229 } 00230 m_ppMetas[id]->assign(datarec,bNoCopy); 00231 } 00232 00233 inline void CIndexParameter::setParam(const char* filename) 00234 { 00235 m_Param.at = param::File; 00236 m_Param.file = filename; 00237 } 00238 00239 inline void CIndexParameter::setParam(const wchar_t* filename) 00240 { 00241 m_Param.at = param::FileW; 00242 m_Param.wfile = filename; 00243 } 00244 inline void CIndexParameter::setParam(char* buffer,size_t len) 00245 { 00246 m_Param.at = param::Buffer; 00247 m_Param.buffer.str = buffer; 00248 m_Param.buffer.length = len; 00249 } 00250 } 00251 } 00252 00253 #endif
http://www.firtex.org http://www.sourceforge.net/projects/firtex