00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "fennel/common/CommonPreamble.h"
00025 #include "fennel/ftrs/FtrsTableWriterFactory.h"
00026 #include "fennel/common/ByteInputStream.h"
00027 #include "fennel/tuple/TupleDescriptor.h"
00028 #include "fennel/segment/SegmentMap.h"
00029
00030 FENNEL_BEGIN_CPPFILE("$Id: //open/dev/fennel/ftrs/FtrsTableWriterFactory.cpp#9 $");
00031
00032 FtrsTableWriterFactory::FtrsTableWriterFactory(
00033 SharedSegmentMap pSegmentMapInit,
00034 SharedCacheAccessor pCacheAccessorInit,
00035 StoredTypeDescriptorFactory const &typeFactoryInit,
00036 SegmentAccessor scratchAccessorInit)
00037 : pSegmentMap(pSegmentMapInit),
00038 pCacheAccessor(pCacheAccessorInit),
00039 typeFactory(typeFactoryInit)
00040 {
00041 scratchAccessor = scratchAccessorInit;
00042 }
00043
00044 SharedFtrsTableWriter FtrsTableWriterFactory::newTableWriter(
00045 FtrsTableWriterParams const ¶ms)
00046 {
00047
00048 for (uint i = 0; i < pool.size(); ++i) {
00049 SharedFtrsTableWriter pPooledWriter = pool[i];
00050 if (pPooledWriter->getTableId() != params.tableId) {
00051 continue;
00052 }
00053 if (pPooledWriter->updateProj != params.updateProj) {
00054 continue;
00055 }
00056
00057 return pPooledWriter;
00058 }
00059 SharedFtrsTableWriter pNewWriter(new FtrsTableWriter(params));
00060 pool.push_back(pNewWriter);
00061 return pNewWriter;
00062 }
00063
00064 SharedLogicalTxnParticipant FtrsTableWriterFactory::loadParticipant(
00065 LogicalTxnClassId classId,
00066 ByteInputStream &logStream)
00067 {
00068 assert(classId == getParticipantClassId());
00069
00070 TupleDescriptor clusteredTupleDesc;
00071 clusteredTupleDesc.readPersistent(logStream,typeFactory);
00072
00073 uint nIndexes;
00074 logStream.readValue(nIndexes);
00075
00076 FtrsTableWriterParams params;
00077 params.indexParams.resize(nIndexes);
00078
00079 for (uint i = 0; i < nIndexes; ++i) {
00080 loadIndex(clusteredTupleDesc,params.indexParams[i],logStream);
00081 }
00082
00083 params.updateProj.readPersistent(logStream);
00084
00085 return SharedLogicalTxnParticipant(
00086 new FtrsTableWriter(params));
00087 }
00088
00089 void FtrsTableWriterFactory::loadIndex(
00090 TupleDescriptor const &clusteredTupleDesc,
00091 FtrsTableIndexWriterParams ¶ms,
00092 ByteInputStream &logStream)
00093 {
00094 logStream.readValue(params.segmentId);
00095 logStream.readValue(params.pageOwnerId);
00096 logStream.readValue(params.rootPageId);
00097 logStream.readValue(params.distinctness);
00098 logStream.readValue(params.updateInPlace);
00099 params.inputProj.readPersistent(logStream);
00100 params.keyProj.readPersistent(logStream);
00101 if (params.inputProj.empty()) {
00102 params.tupleDesc = clusteredTupleDesc;
00103 } else {
00104 params.tupleDesc.projectFrom(clusteredTupleDesc,params.inputProj);
00105 }
00106 params.pCacheAccessor = pCacheAccessor;
00107 SharedSegment pSegment;
00108 params.pSegment = pSegmentMap->getSegmentById(params.segmentId, pSegment);
00109 params.scratchAccessor = scratchAccessor;
00110 }
00111
00112 LogicalTxnClassId FtrsTableWriterFactory::getParticipantClassId()
00113 {
00114 return LogicalTxnClassId(0xaa6576b8efadbcdcLL);
00115 }
00116
00117 FENNEL_END_CPPFILE("$Id: //open/dev/fennel/ftrs/FtrsTableWriterFactory.cpp#9 $");
00118
00119