virtual CActivityBase *queryActivity(bool checkNull) { if (checkNull && hasNullInput) { CriticalBlock b(nullActivityCs); if (!nullActivity) nullActivity.setown(createNullSlave(this)); return nullActivity; } else return activity; }
virtual CActivityBase *factory(ThorActivityKind kind) { CActivityBase *ret = NULL; switch (kind) { case TAKdiskread: ret = createDiskReadSlave(this); break; case TAKdisknormalize: ret = createDiskNormalizeSlave(this); break; case TAKdiskaggregate: ret = createDiskAggregateSlave(this); break; case TAKdiskcount: ret = createDiskCountSlave(this); break; case TAKdiskgroupaggregate: ret = createDiskGroupAggregateSlave(this); break; case TAKindexread: ret = createIndexReadSlave(this); break; case TAKindexcount: ret = createIndexCountSlave(this); break; case TAKindexnormalize: ret = createIndexNormalizeSlave(this); break; case TAKindexaggregate: ret = createIndexAggregateSlave(this); break; case TAKindexgroupaggregate: case TAKindexgroupexists: case TAKindexgroupcount: ret = createIndexGroupAggregateSlave(this); break; case TAKchildaggregate: ret = createChildAggregateSlave(this); break; case TAKchildgroupaggregate: ret = createChildGroupAggregateSlave(this); break; case TAKchildthroughnormalize: ret = createChildThroughNormalizeSlave(this); break; case TAKchildnormalize: ret = createChildNormalizeSlave(this); break; case TAKspill: ret = createSpillSlave(this); break; case TAKdiskwrite: ret = createDiskWriteSlave(this); break; case TAKsort: if (queryGrouped()) ret = createGroupSortSlave(this); else if (queryLocal()) ret = createLocalSortSlave(this); else ret = createMSortSlave(this); break; case TAKsorted: ret = createSortedSlave(this); break; case TAKdedup: if (queryGrouped()) ret = createGroupDedupSlave(this); else if (queryLocal()) ret = createLocalDedupSlave(this); else ret = createDedupSlave(this); break; case TAKrollupgroup: ret = createRollupGroupSlave(this); break; case TAKrollup: if (queryGrouped()) ret = createGroupRollupSlave(this); else if (queryLocal()) ret = createLocalRollupSlave(this); else ret = createRollupSlave(this); break; case TAKprocess: if (queryGrouped()) ret = createGroupProcessSlave(this); else if (queryLocal()) ret = createLocalProcessSlave(this); else ret = createProcessSlave(this); break; case TAKfilter: ret = createFilterSlave(this); break; case TAKfilterproject: ret = createFilterProjectSlave(this); break; case TAKfiltergroup: ret = createFilterGroupSlave(this); break; case TAKsplit: ret = createNSplitterSlave(this); break; case TAKproject: ret = createProjectSlave(this); break; case TAKprefetchproject: ret = createPrefetchProjectSlave(this); break; case TAKprefetchcountproject: break; case TAKiterate: if (queryGrouped()) ret = createGroupIterateSlave(this); else if (queryLocal()) ret = createLocalIterateSlave(this); else ret = createIterateSlave(this); break; case TAKaggregate: case TAKexistsaggregate: case TAKcountaggregate: if (queryLocalOrGrouped()) ret = createGroupAggregateSlave(this); else ret = createAggregateSlave(this); break; case TAKhashaggregate: ret = createHashAggregateSlave(this); break; case TAKfirstn: ret = createFirstNSlave(this); break; case TAKsample: ret = createSampleSlave(this); break; case TAKdegroup: ret = createDegroupSlave(this); break; case TAKjoin: if (queryLocalOrGrouped()) ret = createLocalJoinSlave(this); else ret = createJoinSlave(this); break; case TAKhashjoin: case TAKhashdenormalize: case TAKhashdenormalizegroup: ret = createHashJoinSlave(this); break; case TAKlookupjoin: ret = createLookupJoinSlave(this); break; case TAKalljoin: ret = createAllJoinSlave(this); break; case TAKselfjoin: if (queryLocalOrGrouped()) ret = createLocalSelfJoinSlave(this); else ret = createSelfJoinSlave(this); break; case TAKselfjoinlight: ret = createLightweightSelfJoinSlave(this); break; case TAKkeyedjoin: case TAKkeyeddenormalize: case TAKkeyeddenormalizegroup: ret = createKeyedJoinSlave(this); break; case TAKgroup: if (queryLocalOrGrouped()) ret = createLocalGroupSlave(this); else ret = createGroupSlave(this); break; case TAKworkunitwrite: ret = createWorkUnitWriteSlave(this); break; case TAKfunnel: ret = createFunnelSlave(this); break; case TAKcombine: ret = createCombineSlave(this); break; case TAKregroup: ret = createRegroupSlave(this); break; case TAKapply: ret = createApplySlave(this); break; case TAKtemptable: case TAKtemprow: ret = createTempTableSlave(this); break; case TAKkeyeddistribute: ret = createIndexDistributeSlave(this); break; case TAKhashdistribute: ret = createHashDistributeSlave(this); break; case TAKhashdistributemerge: ret = createHashDistributeMergeSlave(this); break; case TAKhashdedup: if (queryLocalOrGrouped()) ret = createHashLocalDedupSlave(this); else ret = createHashDedupSlave(this); break; case TAKnormalize: ret = createNormalizeSlave(this); break; case TAKnormalizechild: ret = createNormalizeChildSlave(this); break; case TAKnormalizelinkedchild: ret = createNormalizeLinkedChildSlave(this); break; case TAKremoteresult: ret = createResultSlave(this); break; case TAKpull: ret = createPullSlave(this); break; case TAKdenormalize: case TAKdenormalizegroup: if (queryLocalOrGrouped()) ret = createLocalDenormalizeSlave(this); else ret = createDenormalizeSlave(this); break; case TAKnwayinput: ret = createNWayInputSlave(this); break; case TAKnwayselect: ret = createNWaySelectSlave(this); break; case TAKnwaymerge: ret = createNWayMergeActivity(this); break; case TAKnwaymergejoin: case TAKnwayjoin: ret = createNWayMergeJoinActivity(this); break; case TAKalldenormalize: case TAKalldenormalizegroup: ret = createAllDenormalizeSlave(this); break; case TAKlookupdenormalize: case TAKlookupdenormalizegroup: ret = createLookupDenormalizeSlave(this); break; case TAKchilddataset: UNIMPLEMENTED; case TAKchilditerator: ret = createChildIteratorSlave(this); break; case TAKrawiterator: ret = createRawIteratorSlave(this); break; case TAKlinkedrawiterator: ret = createLinkedRawIteratorSlave(this); break; case TAKselectn: if (queryLocalOrGrouped()) ret = createLocalSelectNthSlave(this); else ret = createSelectNthSlave(this); break; case TAKenth: if (queryLocalOrGrouped()) ret = createLocalEnthSlave(this); else ret = createEnthSlave(this); break; case TAKnull: ret = createNullSlave(this); break; case TAKdistribution: ret = createDistributionSlave(this); break; case TAKcountproject: if (queryLocalOrGrouped()) ret = createLocalCountProjectSlave(this); else ret = createCountProjectSlave(this); break; case TAKchoosesets: if (queryLocalOrGrouped()) ret = createLocalChooseSetsSlave(this); else ret = createChooseSetsSlave(this); break; case TAKpiperead: ret = createPipeReadSlave(this); break; case TAKpipewrite: ret = createPipeWriteSlave(this); break; case TAKcsvread: ret = createCsvReadSlave(this); break; case TAKcsvwrite: ret = createCsvWriteSlave(this); break; case TAKpipethrough: ret = createPipeThroughSlave(this); break; case TAKindexwrite: ret = createIndexWriteSlave(this); break; case TAKchoosesetsenth: ret = createChooseSetsEnthSlave(this); break; case TAKchoosesetslast: ret = createChooseSetsLastSlave(this); break; case TAKfetch: ret = createFetchSlave(this); break; case TAKcsvfetch: ret = createCsvFetchSlave(this); break; case TAKxmlfetch: ret = createXmlFetchSlave(this); break; case TAKthroughaggregate: ret = createThroughAggregateSlave(this); break; case TAKcase: case TAKif: throwUnexpected(); break; case TAKwhen_dataset: ret = createWhenSlave(this); break; case TAKworkunitread: { if (wuidread2diskread) { Owned<IHThorDiskReadArg> diskReadHelper = createWorkUnitReadArg(wuidreadFilename, (IHThorWorkunitReadArg *)LINK(baseHelper)); Owned<CActivityBase> retAct = createDiskReadSlave(this, diskReadHelper); return retAct.getClear(); } else ret = createWuidReadSlave(this); break; } case TAKparse: ret = createParseSlave(this); break; case TAKsideeffect: ret = createNullActionSlave(this); break; case TAKsimpleaction: ret = createNullSlave(this); break; case TAKtopn: if (queryGrouped()) ret = createGroupedTopNSlave(this); else if (queryLocal()) ret = createLocalTopNSlave(this); else ret = createGlobalTopNSlave(this); break; case TAKxmlparse: ret = createXmlParseSlave(this); break; case TAKxmlread: ret = createXmlReadSlave(this); break; case TAKxmlwrite: ret = createXmlWriteSlave(this); break; case TAKmerge: if (queryLocalOrGrouped()) ret = createLocalMergeSlave(this); else ret = createGlobalMergeSlave(this); break; case TAKsoap_rowdataset: ret = createSoapRowCallSlave(this); break; case TAKsoap_rowaction: ret = createSoapRowActionSlave(this); break; case TAKsoap_datasetdataset: ret = createSoapDatasetCallSlave(this); break; case TAKsoap_datasetaction: ret = createSoapDatasetActionSlave(this); break; case TAKcountdisk: return new CSlaveActivity(this); case TAKkeydiff: ret = createKeyDiffSlave(this); break; case TAKkeypatch: ret = createKeyPatchSlave(this); break; case TAKlimit: ret = createLimitSlave(this); break; case TAKskiplimit: ret = createSkipLimitSlave(this); break; case TAKcreaterowlimit: ret = createRowLimitSlave(this); break; case TAKnonempty: ret = createNonEmptySlave(this); break; case TAKlocalresultread: ret = createLocalResultReadSlave(this); break; case TAKlocalresultwrite: ret = createLocalResultWriteSlave(this); break; case TAKlocalresultspill: ret = createLocalResultSpillSlave(this); break; case TAKchildif: ret = createIfSlave(this); break; case TAKcatch: case TAKskipcatch: case TAKcreaterowcatch: ret = createCatchSlave(this); break; case TAKlooprow: case TAKloopcount: case TAKloopdataset: ret = createLoopSlave(this); break; case TAKgraphloop: case TAKparallelgraphloop: ret = createGraphLoopSlave(this); break; case TAKgraphloopresultread: ret = createGraphLoopResultReadSlave(this); break; case TAKgraphloopresultwrite: ret = createGraphLoopResultWriteSlave(this); break; case TAKstreamediterator: ret = createStreamedIteratorSlave(this); break; case TAKifaction: ret = createIfActionSlave(this); break; default: throw MakeStringException(TE_UnsupportedActivityKind, "Unsupported activity kind: %s", activityKindStr(kind)); } return ret; }