00001 #ifndef Impala_Persistency_SimilarityTableSetRepositoryInFile_h
00002 #define Impala_Persistency_SimilarityTableSetRepositoryInFile_h
00003
00004 #include "Persistency/RepositoryInFileSystem.h"
00005 #include "Core/Table/SimilarityTableSet.h"
00006 #include "Persistency/SimilarityTableSetLocator.h"
00007
00008 namespace Impala
00009 {
00010 namespace Persistency
00011 {
00012
00013
00014 class SimilarityTableSetRepositoryInFile
00015 {
00016 public:
00017
00018 typedef Core::Table::SimilarityTableSet SimilarityTableSet;
00019
00020 SimilarityTableSetRepositoryInFile()
00021 {
00022 }
00023
00024 SimilarityTableSet*
00025 Get(const SimilarityTableSetLocator& loc)
00026 {
00027 String dir = GetDir(loc);
00028 File file = RepFS().GetFile(loc, dir, "names.txt", false, false);
00029 if (!file.Valid())
00030 return 0;
00031 std::vector<String> names;
00032 file.ReadStrings(std::back_inserter(names));
00033 SimilarityTableSet* res = new SimilarityTableSet(names, 0);
00034 res->SetDescription(loc.GetFeature());
00035
00036 LoadQuids(res, loc, dir);
00037 LoadSims(res, loc, dir);
00038 LoadRanks(res, loc, dir);
00039 return res;
00040 }
00041
00042 void
00043 Add(const SimilarityTableSetLocator& loc, SimilarityTableSet* simSet)
00044 {
00045 String dir = GetDir(loc);
00046 Save(simSet, loc, dir);
00047 }
00048
00049 private:
00050
00051 RepositoryInFileSystem&
00052 RepFS()
00053 {
00054 return RepositoryInFileSystem::GetInstance();
00055 }
00056
00057 String
00058 GetDir(const SimilarityTableSetLocator& loc)
00059 {
00060 String dir = loc.GetInIndexString();
00061 if (!loc.GetInIndex())
00062 dir = FileNameConcat(dir, loc.GetWalkType());
00063 dir = FileNameConcat(dir, loc.GetConceptSet());
00064 dir = FileNameConcat(dir, loc.GetModel());
00065 dir = FileNameConcat(dir, loc.GetFeature());
00066 if (!loc.GetInIndex())
00067 dir = FileNameConcat(dir, loc.GetContainer());
00068 return dir;
00069 }
00070
00071 void
00072 LoadQuids(SimilarityTableSet* res, const SimilarityTableSetLocator& loc,
00073 CString dir)
00074 {
00075 File file = RepFS().GetFile(loc, dir, "all_quids.tab", false, false);
00076 Read(res->GetQuidTable(), file);
00077 }
00078
00079 void
00080 LoadSim(SimilarityTableSet* res, int tableIdx,
00081 const SimilarityTableSetLocator& loc, CString dir)
00082 {
00083 String name = res->GetName(tableIdx) + "_sim.tab";
00084 File file = RepFS().GetFile(loc, dir, name, false, false);
00085 Read(res->GetSimTable(tableIdx), file);
00086 }
00087
00088 void
00089 LoadSims(SimilarityTableSet* res, const SimilarityTableSetLocator& loc,
00090 CString dir)
00091 {
00092 for (int i=0 ; i<res->NrTables() ; i++)
00093 LoadSim(res, i, loc, dir);
00094 }
00095
00096 void
00097 LoadRank(SimilarityTableSet* res, int tableIdx,
00098 const SimilarityTableSetLocator& loc, CString dir)
00099 {
00100 String name = res->GetName(tableIdx) + "_rank.tab";
00101 File file = RepFS().GetFile(loc, dir, name, false, false);
00102 Read(res->GetRankTable(tableIdx), file);
00103 }
00104
00105 void
00106 LoadRanks(SimilarityTableSet* res, const SimilarityTableSetLocator& loc,
00107 CString dir)
00108 {
00109 for (int i=0 ; i<res->NrTables() ; i++)
00110 LoadRank(res, i, loc, dir);
00111 }
00112
00113 void
00114 Save(SimilarityTableSet* simSet, const SimilarityTableSetLocator& loc,
00115 CString dir)
00116 {
00117 SaveNames(simSet, loc, dir);
00118 SaveQuids(simSet, loc, dir);
00119 SaveSims(simSet, loc, dir);
00120 SaveRanks(simSet, loc, dir);
00121 }
00122
00123 void
00124 SaveNames(SimilarityTableSet* simSet, const SimilarityTableSetLocator& loc,
00125 CString dir)
00126 {
00127 File file = RepFS().GetFile(loc, dir, "names.txt", true, false);
00128 std::vector<String> names = simSet->GetNames();
00129 file.WriteStrings(names);
00130 }
00131
00132 void
00133 SaveQuids(SimilarityTableSet* simSet, const SimilarityTableSetLocator& loc,
00134 CString dir)
00135 {
00136 File file = RepFS().GetFile(loc, dir, "all_quids.tab", true, false);
00137 Write(simSet->GetQuidTable(), file);
00138 }
00139
00140 void
00141 SaveSim(SimilarityTableSet* simSet, int tableIdx,
00142 const SimilarityTableSetLocator& loc, CString dir)
00143 {
00144 String name = simSet->GetName(tableIdx) + "_sim.tab";
00145 File file = RepFS().GetFile(loc, dir, name, true, false);
00146 Write(simSet->GetSimTable(tableIdx), file);
00147 }
00148
00149 void
00150 SaveSims(SimilarityTableSet* simSet, const SimilarityTableSetLocator& loc,
00151 CString dir)
00152 {
00153 for (int i=0 ; i<simSet->NrTables() ; i++)
00154 SaveSim(simSet, i, loc, dir);
00155 }
00156
00157 void
00158 SaveRank(SimilarityTableSet* simSet, int tableIdx,
00159 const SimilarityTableSetLocator& loc, CString dir)
00160 {
00161 String name = simSet->GetName(tableIdx) + "_rank.tab";
00162 File file = RepFS().GetFile(loc, dir, name, true, false);
00163 Write(simSet->GetRankTable(tableIdx), file);
00164 }
00165
00166 void
00167 SaveRanks(SimilarityTableSet* simSet, const SimilarityTableSetLocator& loc,
00168 CString dir)
00169 {
00170 for (int i=0 ; i<simSet->NrTables() ; i++)
00171 SaveRank(simSet, i, loc, dir);
00172 }
00173
00174 ILOG_VAR_DEC;
00175 };
00176
00177 ILOG_VAR_INIT(SimilarityTableSetRepositoryInFile, Impala.Persistency);
00178
00179 }
00180 }
00181
00182 #endif