00001 #ifndef Impala_Core_Feature_VirtualFeatureTableFactory_h
00002 #define Impala_Core_Feature_VirtualFeatureTableFactory_h
00003
00004 #include "Core/Feature/VirtualFeatureTableIOBufferReader.h"
00005 #include "Core/Feature/VirtualFeatureTableIOBufferWriter.h"
00006 #include "Core/Feature/VirtualFeatureTableMemory.h"
00007 #include "Persistency/FeatureTableRepository.h"
00008 #include "Util/SimpleMap.h"
00009
00010 namespace Impala
00011 {
00012 namespace Core
00013 {
00014 namespace Feature
00015 {
00016
00017
00018 class VirtualFeatureTableFactory
00019 {
00020 public:
00021
00022 static VirtualFeatureTableFactory&
00023 GetInstance()
00024 {
00025 static VirtualFeatureTableFactory theVirtualFeatureTableFactory;
00026 return theVirtualFeatureTableFactory;
00027 }
00028
00029 VirtualFeatureTable*
00030 ConstructIOBufferReader(const Persistency::FeatureLocator& loc, bool cacheIt)
00031 {
00032 if (!mUseCache)
00033 cacheIt = false;
00034 Util::IOBuffer* buf = 0;
00035 if (mIOBuffers.Get(loc.ToString(), buf))
00036 {
00037 buf->SetPosition(0);
00038 return new VirtualFeatureTableIOBufferReader(buf, false);
00039 }
00040 typedef Persistency::FeatureTableRepository FeatureTableRepository;
00041 typedef Persistency::File File;
00042 File file = FeatureTableRepository().ExposeFile(loc, false);
00043
00044 buf = file.GetReadBuffer(true, "");
00045 if (!buf)
00046 {
00047 ILOG_ERROR("[ConstructIOBufferReader] Couldn't get readbuffer for "
00048 << loc);
00049 return 0;
00050 }
00051 if (cacheIt)
00052 mIOBuffers.Add(loc.ToString(), buf);
00053 return new VirtualFeatureTableIOBufferReader(buf, !cacheIt);
00054 }
00055
00056
00057
00058 VirtualFeatureTableIOBufferWriter*
00059 ConstructIOBufferWriter(int nrVectors, int vectorLength,
00060 Persistency::File file, bool write32)
00061 {
00062 Util::IOBuffer* buf = file.GetWriteBuffer();
00063 if (!buf)
00064 {
00065 ILOG_ERROR("[ConstructIOBufferWriter] Couldn't get writebuffer for "
00066 << file.GetPath());
00067 return 0;
00068 }
00069 return new VirtualFeatureTableIOBufferWriter(nrVectors, vectorLength,
00070 buf, true, write32);
00071 }
00072
00073 VirtualFeatureTable*
00074 ConstructMemory(const Persistency::FeatureLocator& loc)
00075 {
00076 typedef Persistency::FeatureTableRepository FeatureTableRepository;
00077 FeatureTable* tab = FeatureTableRepository().Get(loc);
00078 if (!tab)
00079 {
00080 ILOG_ERROR("[ConstructMemory] Couldn't get " << loc);
00081 return 0;
00082 }
00083 return new VirtualFeatureTableMemory(tab);
00084 }
00085
00086 void
00087 SetUseCache(bool flag)
00088 {
00089 mUseCache = flag;
00090 }
00091
00092 void
00093 ClearCache()
00094 {
00095 mIOBuffers.Clear();
00096 }
00097
00098 private:
00099
00100 VirtualFeatureTableFactory()
00101 {
00102 mUseCache = true;
00103 if (CmdOptions::GetInstance().GetBool("noFeatureCache"))
00104 mUseCache = false;
00105 }
00106
00107 Util::SimpleMapDelete<String, Util::IOBuffer*> mIOBuffers;
00108 bool mUseCache;
00109
00110 ILOG_VAR_DEC;
00111
00112 };
00113
00114 ILOG_VAR_INIT(VirtualFeatureTableFactory, Impala.Core.Feature);
00115
00116 }
00117 }
00118 }
00119
00120 #endif