00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "fennel/common/CommonPreamble.h"
00023 #include "fennel/test/ExecStreamUnitTestBase.h"
00024 #include "fennel/test/SnapshotSegmentTestBase.h"
00025 #include "fennel/lucidera/colstore/LcsClusterReplaceExecStream.h"
00026 #include "fennel/lucidera/colstore/LcsRowScanExecStream.h"
00027 #include "fennel/btree/BTreeBuilder.h"
00028 #include "fennel/tuple/StandardTypeDescriptor.h"
00029 #include "fennel/segment/SnapshotRandomAllocationSegment.h"
00030 #include "fennel/segment/SegmentFactory.h"
00031 #include "fennel/exec/MockProducerExecStream.h"
00032 #include "fennel/exec/ValuesExecStream.h"
00033 #include "fennel/exec/ExecStreamEmbryo.h"
00034 #include "fennel/exec/DynamicParam.h"
00035 #include "fennel/cache/Cache.h"
00036 #include <stdarg.h>
00037
00038 #include <boost/test/test_tools.hpp>
00039
00040 using namespace fennel;
00041
00047 class LcsClusterReplaceExecStreamTest :
00048 public ExecStreamUnitTestBase, public SnapshotSegmentTestBase
00049 {
00050 StandardTypeDescriptorFactory stdTypeFactory;
00051 TupleAttributeDescriptor attrDesc_int64;
00052 TupleAttributeDescriptor attrDesc_bitmap;
00053
00054 PageId savedRootPageId;
00055 BTreeDescriptor btreeDescriptor;
00056
00066 void loadCluster(
00067 uint nCols,
00068 uint nRows,
00069 SharedMockProducerExecStreamGenerator pInputGenerator);
00070
00080 void verifyCluster(
00081 uint nCols,
00082 uint nRows,
00083 MockProducerExecStreamGenerator &resultGenerator);
00084
00095 void replaceCluster(
00096 uint nCols,
00097 uint nRows,
00098 SharedMockProducerExecStreamGenerator pInputGenerator);
00099
00116 void testClusterReplace(
00117 uint nCols,
00118 uint totalNumRows,
00119 uint numReplRows,
00120 SharedMockProducerExecStreamGenerator pOrigClusterInputGenerator,
00121 MockProducerExecStreamGenerator &origClusterResultGenerator,
00122 SharedMockProducerExecStreamGenerator pReplClusterInputGenerator,
00123 MockProducerExecStreamGenerator &replClusterResultGenerator);
00124
00125 void testSingleColRepeatingSequence(
00126 uint nRows,
00127 uint inputSeqStart,
00128 uint replSeqStart,
00129 uint expectedSeqStart);
00130
00131 void testMultiColClusterReplace(uint nCols, uint nRows);
00132
00133 void initClusterAppendParams(
00134 LcsClusterAppendExecStreamParams &lcsAppendParams,
00135 uint nCols,
00136 bool replace);
00137
00138 public:
00139 explicit LcsClusterReplaceExecStreamTest()
00140 {
00141 FENNEL_UNIT_TEST_CASE(
00142 LcsClusterReplaceExecStreamTest, testSingleColOddNumRows);
00143 FENNEL_UNIT_TEST_CASE(
00144 LcsClusterReplaceExecStreamTest, testSingleColEvenNumRows);
00145 FENNEL_UNIT_TEST_CASE(
00146 LcsClusterReplaceExecStreamTest, testSingleColSeqStartAt1);
00147 FENNEL_UNIT_TEST_CASE(
00148 LcsClusterReplaceExecStreamTest, testReplaceAllRows);
00149 FENNEL_UNIT_TEST_CASE(
00150 LcsClusterReplaceExecStreamTest, testReplaceNoRows);
00151 FENNEL_UNIT_TEST_CASE(
00152 LcsClusterReplaceExecStreamTest, test3ColClusterReplace);
00153 }
00154
00155 void testSingleColOddNumRows();
00156 void testSingleColEvenNumRows();
00157 void testSingleColSeqStartAt1();
00158 void testReplaceAllRows();
00159 void testReplaceNoRows();
00160 void test3ColClusterReplace();
00161
00162 virtual void testCaseSetUp();
00163 virtual void testCaseTearDown();
00164
00165 virtual void openRandomSegment();
00166 };
00167
00168 void LcsClusterReplaceExecStreamTest::testSingleColOddNumRows()
00169 {
00170
00171
00172
00173 testSingleColRepeatingSequence(5001, 0, 1, 0);
00174 }
00175
00176 void LcsClusterReplaceExecStreamTest::testSingleColEvenNumRows()
00177 {
00178
00179
00180
00181 testSingleColRepeatingSequence(4000, 0, 1, 0);
00182 }
00183
00184 void LcsClusterReplaceExecStreamTest::testSingleColSeqStartAt1()
00185 {
00186
00187
00188
00189 testSingleColRepeatingSequence(3000, 1, 0, 0);
00190 }
00191
00192 void LcsClusterReplaceExecStreamTest::testSingleColRepeatingSequence(
00193 uint nRows,
00194 uint inputSeqStart,
00195 uint replSeqStart,
00196 uint expectedSeqStart)
00197 {
00198
00199
00200
00201
00202
00203
00204 SharedMockProducerExecStreamGenerator pOrigClusterInputGenerator =
00205 SharedMockProducerExecStreamGenerator(
00206 new StairCaseExecStreamGenerator(2, 2, inputSeqStart));
00207
00208 StairCaseExecStreamGenerator origClusterResultGenerator =
00209 StairCaseExecStreamGenerator(2, 2, inputSeqStart);
00210
00211 vector<boost::shared_ptr<ColumnGenerator<int64_t> > > columnGenerators;
00212 SharedInt64ColumnGenerator colGenerator =
00213 SharedInt64ColumnGenerator(new SeqColumnGenerator(replSeqStart, 2));
00214 columnGenerators.push_back(colGenerator);
00215 colGenerator =
00216 SharedInt64ColumnGenerator(new SeqColumnGenerator(replSeqStart, 2));
00217 columnGenerators.push_back(colGenerator);
00218 SharedMockProducerExecStreamGenerator pReplClusterInputGenerator =
00219 SharedMockProducerExecStreamGenerator(
00220 new CompositeExecStreamGenerator(columnGenerators));
00221
00222 RampExecStreamGenerator replClusterResultGenerator(expectedSeqStart);
00223
00224 testClusterReplace(
00225 1,
00226 nRows,
00227 nRows / 2,
00228 pOrigClusterInputGenerator,
00229 origClusterResultGenerator,
00230 pReplClusterInputGenerator,
00231 replClusterResultGenerator);
00232 }
00233
00234 void LcsClusterReplaceExecStreamTest::testReplaceAllRows()
00235 {
00236
00237
00238
00239 uint nRows = 2003;
00240
00241 SharedMockProducerExecStreamGenerator pOrigClusterInputGenerator =
00242 SharedMockProducerExecStreamGenerator(
00243 new ConstExecStreamGenerator(99));
00244
00245 ConstExecStreamGenerator origClusterResultGenerator =
00246 ConstExecStreamGenerator(99);
00247
00248 vector<boost::shared_ptr<ColumnGenerator<int64_t> > > columnGenerators;
00249 SharedInt64ColumnGenerator colGenerator =
00250 SharedInt64ColumnGenerator(new SeqColumnGenerator(0, 1));
00251 columnGenerators.push_back(colGenerator);
00252 colGenerator =
00253 SharedInt64ColumnGenerator(new SeqColumnGenerator(0, 1));
00254 columnGenerators.push_back(colGenerator);
00255 SharedMockProducerExecStreamGenerator pReplClusterInputGenerator =
00256 SharedMockProducerExecStreamGenerator(
00257 new CompositeExecStreamGenerator(columnGenerators));
00258
00259 RampExecStreamGenerator replClusterResultGenerator;
00260
00261 testClusterReplace(
00262 1,
00263 nRows,
00264 nRows,
00265 pOrigClusterInputGenerator,
00266 origClusterResultGenerator,
00267 pReplClusterInputGenerator,
00268 replClusterResultGenerator);
00269 }
00270
00271 void LcsClusterReplaceExecStreamTest::testReplaceNoRows()
00272 {
00273
00274
00275
00276 uint nRows = 1007;
00277
00278 SharedMockProducerExecStreamGenerator pOrigClusterInputGenerator =
00279 SharedMockProducerExecStreamGenerator(
00280 new RampExecStreamGenerator());
00281
00282 RampExecStreamGenerator origClusterResultGenerator =
00283 RampExecStreamGenerator();
00284
00285
00286
00287 vector<boost::shared_ptr<ColumnGenerator<int64_t> > > columnGenerators;
00288 SharedInt64ColumnGenerator colGenerator =
00289 SharedInt64ColumnGenerator(new SeqColumnGenerator(0, 1));
00290 columnGenerators.push_back(colGenerator);
00291 colGenerator =
00292 SharedInt64ColumnGenerator(new SeqColumnGenerator(0, 1));
00293 columnGenerators.push_back(colGenerator);
00294 SharedMockProducerExecStreamGenerator pReplClusterInputGenerator =
00295 SharedMockProducerExecStreamGenerator(
00296 new CompositeExecStreamGenerator(columnGenerators));
00297
00298 RampExecStreamGenerator replClusterResultGenerator;
00299
00300 testClusterReplace(
00301 1,
00302 nRows,
00303 0,
00304 pOrigClusterInputGenerator,
00305 origClusterResultGenerator,
00306 pReplClusterInputGenerator,
00307 replClusterResultGenerator);
00308 }
00309
00310 void LcsClusterReplaceExecStreamTest::test3ColClusterReplace()
00311 {
00312 testMultiColClusterReplace(3, 800);
00313 }
00314
00315 void LcsClusterReplaceExecStreamTest::testMultiColClusterReplace(
00316 uint nCols,
00317 uint nRows)
00318 {
00319 vector<boost::shared_ptr<ColumnGenerator<int64_t> > > columnGenerators;
00320 SharedInt64ColumnGenerator colGenerator;
00321
00322
00323
00324
00325 for (uint i = 0; i < nCols; i++) {
00326 colGenerator =
00327 SharedInt64ColumnGenerator(new StairCaseColumnGenerator(2, 2, i));
00328 columnGenerators.push_back(colGenerator);
00329 }
00330 SharedMockProducerExecStreamGenerator pOrigClusterInputGenerator =
00331 SharedMockProducerExecStreamGenerator(
00332 new CompositeExecStreamGenerator(columnGenerators));
00333
00334 columnGenerators.clear();
00335 for (uint i = 0; i < nCols; i++) {
00336 colGenerator =
00337 SharedInt64ColumnGenerator(new StairCaseColumnGenerator(2, 2, i));
00338 columnGenerators.push_back(colGenerator);
00339 }
00340 CompositeExecStreamGenerator origClusterResultGenerator =
00341 CompositeExecStreamGenerator(columnGenerators);
00342
00343
00344
00345
00346 columnGenerators.clear();
00347 colGenerator =
00348 SharedInt64ColumnGenerator(new SeqColumnGenerator(1, 2));
00349 columnGenerators.push_back(colGenerator);
00350 for (uint i = 1; i < nCols + 1; i++) {
00351 colGenerator = SharedInt64ColumnGenerator(new SeqColumnGenerator(i, 2));
00352 columnGenerators.push_back(colGenerator);
00353 }
00354 SharedMockProducerExecStreamGenerator pReplClusterInputGenerator =
00355 SharedMockProducerExecStreamGenerator(
00356 new CompositeExecStreamGenerator(columnGenerators));
00357
00358
00359
00360 columnGenerators.clear();
00361 for (uint i = 0; i < nCols; i++) {
00362 colGenerator = SharedInt64ColumnGenerator(new SeqColumnGenerator(i));
00363 columnGenerators.push_back(colGenerator);
00364 }
00365 CompositeExecStreamGenerator replClusterResultGenerator =
00366 CompositeExecStreamGenerator(columnGenerators);
00367
00368 testClusterReplace(
00369 nCols,
00370 nRows,
00371 nRows / 2,
00372 pOrigClusterInputGenerator,
00373 origClusterResultGenerator,
00374 pReplClusterInputGenerator,
00375 replClusterResultGenerator);
00376 }
00377
00378 void LcsClusterReplaceExecStreamTest::testClusterReplace(
00379 uint nCols,
00380 uint totalNumRows,
00381 uint numReplRows,
00382 SharedMockProducerExecStreamGenerator pOrigClusterInputGenerator,
00383 MockProducerExecStreamGenerator &origClusterResultGenerator,
00384 SharedMockProducerExecStreamGenerator pReplClusterInputGenerator,
00385 MockProducerExecStreamGenerator &replClusterResultGenerator)
00386 {
00387
00388 loadCluster(nCols, totalNumRows, pOrigClusterInputGenerator);
00389 resetExecStreamTest();
00390 verifyCluster(nCols, totalNumRows, origClusterResultGenerator);
00391 resetExecStreamTest();
00392
00393
00394
00395 SnapshotRandomAllocationSegment *pSnapshotSegment =
00396 SegmentFactory::dynamicCast<SnapshotRandomAllocationSegment *>(
00397 pSnapshotRandomSegment);
00398 pSnapshotSegment->commitChanges(currCsn);
00399 pSnapshotSegment->checkpoint(CHECKPOINT_FLUSH_ALL);
00400 currCsn = TxnId(1);
00401 pSnapshotRandomSegment2 =
00402 pSegmentFactory->newSnapshotRandomAllocationSegment(
00403 pVersionedRandomSegment,
00404 pVersionedRandomSegment,
00405 currCsn);
00406 setForceCacheUnmap(pSnapshotRandomSegment2);
00407 pRandomSegment = pSnapshotRandomSegment2;
00408
00409
00410 replaceCluster(nCols, numReplRows, pReplClusterInputGenerator);
00411
00412
00413
00414
00415 pSnapshotSegment =
00416 SegmentFactory::dynamicCast<SnapshotRandomAllocationSegment *>(
00417 pSnapshotRandomSegment2);
00418 pSnapshotSegment->commitChanges(currCsn);
00419 pSnapshotSegment->checkpoint(CHECKPOINT_FLUSH_ALL);
00420 resetExecStreamTest();
00421 verifyCluster(nCols, totalNumRows, replClusterResultGenerator);
00422 }
00423
00424 void LcsClusterReplaceExecStreamTest::loadCluster(
00425 uint nCols,
00426 uint nRows,
00427 SharedMockProducerExecStreamGenerator pInputGenerator)
00428 {
00429 MockProducerExecStreamParams mockParams;
00430 for (uint i = 0; i < nCols; i++) {
00431 mockParams.outputTupleDesc.push_back(attrDesc_int64);
00432 }
00433 mockParams.nRows = nRows;
00434 mockParams.pGenerator = pInputGenerator;
00435
00436 ExecStreamEmbryo mockStreamEmbryo;
00437 mockStreamEmbryo.init(new MockProducerExecStream(), mockParams);
00438 mockStreamEmbryo.getStream()->setName("MockProducerExecStream");
00439
00440 LcsClusterAppendExecStreamParams lcsAppendParams;
00441 initClusterAppendParams(lcsAppendParams, nCols, false);
00442
00443
00444 btreeDescriptor.segmentAccessor.pSegment = lcsAppendParams.pSegment;
00445 btreeDescriptor.segmentAccessor.pCacheAccessor = pCache;
00446 btreeDescriptor.tupleDescriptor = lcsAppendParams.tupleDesc;
00447 btreeDescriptor.keyProjection = lcsAppendParams.keyProj;
00448 btreeDescriptor.rootPageId = NULL_PAGE_ID;
00449
00450 BTreeBuilder builder(btreeDescriptor, pRandomSegment);
00451 builder.createEmptyRoot();
00452 savedRootPageId = builder.getRootPageId();
00453
00454 lcsAppendParams.rootPageId = btreeDescriptor.rootPageId = savedRootPageId;
00455
00456 ExecStreamEmbryo lcsAppendStreamEmbryo;
00457 lcsAppendStreamEmbryo.init(
00458 new LcsClusterAppendExecStream(),
00459 lcsAppendParams);
00460 lcsAppendStreamEmbryo.getStream()->setName("LcsClusterAppendExecStream");
00461
00462 SharedExecStream pOutputStream = prepareTransformGraph(
00463 mockStreamEmbryo, lcsAppendStreamEmbryo);
00464
00465
00466 vector<boost::shared_ptr<ColumnGenerator<int64_t> > > columnGenerators;
00467 SharedInt64ColumnGenerator colGen =
00468 SharedInt64ColumnGenerator(new SeqColumnGenerator(nRows));
00469 columnGenerators.push_back(colGen);
00470 colGen = SharedInt64ColumnGenerator(new SeqColumnGenerator(0));
00471 columnGenerators.push_back(colGen);
00472
00473 CompositeExecStreamGenerator expectedResultGenerator(columnGenerators);
00474
00475 verifyOutput(*pOutputStream, 1, expectedResultGenerator);
00476 }
00477
00478 void LcsClusterReplaceExecStreamTest::initClusterAppendParams(
00479 LcsClusterAppendExecStreamParams &lcsAppendParams,
00480 uint nCols,
00481 bool replace)
00482 {
00483 lcsAppendParams.scratchAccessor =
00484 pSegmentFactory->newScratchSegment(pCache, 10);
00485 lcsAppendParams.pCacheAccessor = pCache;
00486 lcsAppendParams.pSegment = pRandomSegment;
00487 lcsAppendParams.rootPageIdParamId = DynamicParamId(0);
00488
00489 for (uint i = 0; i < nCols; i++) {
00490 lcsAppendParams.inputProj.push_back(i);
00491 }
00492 if (replace) {
00493 lcsAppendParams.inputProj.push_back(nCols);
00494 }
00495
00496
00497
00498 (lcsAppendParams.tupleDesc).push_back(attrDesc_int64);
00499 (lcsAppendParams.tupleDesc).push_back(attrDesc_int64);
00500
00501
00502 (lcsAppendParams.keyProj).push_back(0);
00503
00504
00505 lcsAppendParams.outputTupleDesc.push_back(attrDesc_int64);
00506 lcsAppendParams.outputTupleDesc.push_back(attrDesc_int64);
00507
00508 lcsAppendParams.pRootMap = 0;
00509
00510
00511 lcsAppendParams.segmentId = btreeDescriptor.segmentId;
00512 lcsAppendParams.pageOwnerId = btreeDescriptor.pageOwnerId;
00513 }
00514
00515 void LcsClusterReplaceExecStreamTest::verifyCluster(
00516 uint nCols,
00517 uint nRows,
00518 MockProducerExecStreamGenerator &resultGenerator)
00519 {
00520
00521
00522
00523 LcsRowScanExecStreamParams scanParams;
00524 scanParams.hasExtraFilter = false;
00525 scanParams.isFullScan = true;
00526 scanParams.samplingMode = SAMPLING_OFF;
00527
00528 struct LcsClusterScanDef clusterScanDef;
00529
00530 for (uint i = 0; i < nCols; i++) {
00531 clusterScanDef.clusterTupleDesc.push_back(attrDesc_int64);
00532 }
00533 clusterScanDef.pSegment = btreeDescriptor.segmentAccessor.pSegment;
00534 clusterScanDef.pCacheAccessor =
00535 btreeDescriptor.segmentAccessor.pCacheAccessor;
00536 clusterScanDef.tupleDesc = btreeDescriptor.tupleDescriptor;
00537 clusterScanDef.keyProj = btreeDescriptor.keyProjection;
00538 clusterScanDef.rootPageId = btreeDescriptor.rootPageId;
00539 clusterScanDef.segmentId = btreeDescriptor.segmentId;
00540 clusterScanDef.pageOwnerId = btreeDescriptor.pageOwnerId;
00541
00542 scanParams.lcsClusterScanDefs.push_back(clusterScanDef);
00543 for (uint i = 0; i < nCols; i++) {
00544 scanParams.outputTupleDesc.push_back(attrDesc_int64);
00545 scanParams.outputProj.push_back(i);
00546 }
00547
00548 ValuesExecStreamParams valuesParams;
00549 ExecStreamEmbryo valuesStreamEmbryo;
00550 boost::shared_array<FixedBuffer> pBuffer;
00551
00552 valuesParams.outputTupleDesc.push_back(attrDesc_int64);
00553 valuesParams.outputTupleDesc.push_back(attrDesc_bitmap);
00554 valuesParams.outputTupleDesc.push_back(attrDesc_bitmap);
00555
00556 uint bufferSize = 16;
00557 pBuffer.reset(new FixedBuffer[bufferSize]);
00558 valuesParams.pTupleBuffer = pBuffer;
00559 valuesParams.bufSize = 0;
00560 valuesStreamEmbryo.init(new ValuesExecStream(), valuesParams);
00561 valuesStreamEmbryo.getStream()->setName("ValuesExecStream");
00562
00563 ExecStreamEmbryo scanStreamEmbryo;
00564 scanStreamEmbryo.init(new LcsRowScanExecStream(), scanParams);
00565 scanStreamEmbryo.getStream()->setName("RowScanExecStream");
00566
00567 SharedExecStream pOutputStream =
00568 prepareTransformGraph(valuesStreamEmbryo, scanStreamEmbryo);
00569
00570 verifyOutput(*pOutputStream, nRows, resultGenerator);
00571 }
00572
00573 void LcsClusterReplaceExecStreamTest::replaceCluster(
00574 uint nCols,
00575 uint nRows,
00576 SharedMockProducerExecStreamGenerator pGenerator)
00577 {
00578 MockProducerExecStreamParams mockParams;
00579
00580 for (uint i = 0; i < nCols + 1; i++) {
00581 mockParams.outputTupleDesc.push_back(attrDesc_int64);
00582 }
00583 mockParams.nRows = nRows;
00584 mockParams.pGenerator = pGenerator;
00585
00586 ExecStreamEmbryo mockStreamEmbryo;
00587 mockStreamEmbryo.init(new MockProducerExecStream(), mockParams);
00588 mockStreamEmbryo.getStream()->setName("MockProducerExecStream");
00589
00590 LcsClusterReplaceExecStreamParams lcsReplaceParams;
00591 initClusterAppendParams(lcsReplaceParams, nCols, true);
00592
00593 btreeDescriptor.segmentAccessor.pSegment = lcsReplaceParams.pSegment;
00594 btreeDescriptor.segmentAccessor.pCacheAccessor = pCache;
00595 btreeDescriptor.tupleDescriptor = lcsReplaceParams.tupleDesc;
00596 btreeDescriptor.keyProjection = lcsReplaceParams.keyProj;
00597
00598 lcsReplaceParams.rootPageId = btreeDescriptor.rootPageId = savedRootPageId;
00599
00600 ExecStreamEmbryo lcsReplaceStreamEmbryo;
00601 lcsReplaceStreamEmbryo.init(
00602 new LcsClusterReplaceExecStream(),
00603 lcsReplaceParams);
00604 lcsReplaceStreamEmbryo.getStream()->setName("LcsClusterReplaceExecStream");
00605
00606 SharedExecStream pOutputStream = prepareTransformGraph(
00607 mockStreamEmbryo, lcsReplaceStreamEmbryo);
00608
00609
00610 vector<boost::shared_ptr<ColumnGenerator<int64_t> > > columnGenerators;
00611 SharedInt64ColumnGenerator colGenerator =
00612 SharedInt64ColumnGenerator(new SeqColumnGenerator(nRows));
00613 columnGenerators.push_back(colGenerator);
00614 colGenerator = SharedInt64ColumnGenerator(new SeqColumnGenerator(0));
00615 columnGenerators.push_back(colGenerator);
00616
00617 CompositeExecStreamGenerator expectedResultGenerator(columnGenerators);
00618
00619 verifyOutput(*pOutputStream, 1, expectedResultGenerator);
00620 }
00621
00622 void LcsClusterReplaceExecStreamTest::testCaseSetUp()
00623 {
00624 ExecStreamUnitTestBase::testCaseSetUp();
00625 SnapshotSegmentTestBase::testCaseSetUp();
00626
00627 attrDesc_int64 = TupleAttributeDescriptor(
00628 stdTypeFactory.newDataType(STANDARD_TYPE_INT_64));
00629 attrDesc_bitmap = TupleAttributeDescriptor(
00630 stdTypeFactory.newDataType(STANDARD_TYPE_CHAR),
00631 true, pRandomSegment->getUsablePageSize() / 8);
00632
00633 savedRootPageId = NULL_PAGE_ID;
00634 }
00635
00636 void LcsClusterReplaceExecStreamTest::openRandomSegment()
00637 {
00638
00639
00640 }
00641
00642 void LcsClusterReplaceExecStreamTest::testCaseTearDown()
00643 {
00644 btreeDescriptor.segmentAccessor.reset();
00645 ExecStreamUnitTestBase::testCaseTearDown();
00646 }
00647
00648 FENNEL_UNIT_TEST_SUITE(LcsClusterReplaceExecStreamTest);
00649
00650