// IThorSlaveActivity virtual void init(MemoryBuffer & data, MemoryBuffer &slaveData) override { if(!isLocal) { mpTagRPC = container.queryJobChannel().deserializeMPTag(data); mptag_t barrierTag = container.queryJobChannel().deserializeMPTag(data); barrier.setown(container.queryJobChannel().createBarrier(barrierTag)); portbase = allocPort(NUMSLAVEPORTS); server.setLocalHost(portbase); sorter.setown(CreateThorSorter(this, server,&container.queryJob().queryIDiskUsage(),&queryJobChannel().queryJobComm(),mpTagRPC)); server.serialize(slaveData); } compare = helper->queryCompareLeft(); // NB not CompareLeftRight keyserializer = helper->querySerializeLeft(); // hopefully never need right if(isLightweight) ActPrintLog("SELFJOIN: LIGHTWEIGHT"); else if(isLocal) ActPrintLog("SELFJOIN: LOCAL"); else ActPrintLog("SELFJOIN: GLOBAL"); }
// IThorSlaveActivity virtual void init(MemoryBuffer & data, MemoryBuffer &slaveData) { appendOutputLinked(this); if(!isLocal) { mpTagRPC = container.queryJob().deserializeMPTag(data); mptag_t barrierTag = container.queryJob().deserializeMPTag(data); barrier.setown(container.queryJob().createBarrier(barrierTag)); portbase = allocPort(NUMSLAVEPORTS); SocketEndpoint server; server.setLocalHost(portbase); sorter.setown(CreateThorSorter(this, server,&container.queryJob().queryIDiskUsage(),&container.queryJob().queryJobComm(),mpTagRPC)); server.serialize(slaveData); } helper = static_cast <IHThorJoinArg *> (queryHelper()); compare = helper->queryCompareLeft(); // NB not CompareLeftRight keyserializer = helper->querySerializeLeft(); // hopefully never need right if(isLightweight) ActPrintLog("SELFJOIN: LIGHTWEIGHT"); else if(isLocal) ActPrintLog("SELFJOIN: LOCAL"); else ActPrintLog("SELFJOIN: GLOBAL"); }
// IThorDataLink virtual void start() { ActivityTimer s(totalCycles, timeActivities, NULL); input = inputs.item(0); startInput(input); dataLinkStart("SELFJOIN", container.queryId()); bool hintparallelmatch = container.queryXGMML().getPropInt("hint[@name=\"parallel_match\"]")!=0; bool hintunsortedoutput = container.queryXGMML().getPropInt("hint[@name=\"unsorted_output\"]")!=0; if (helper->getJoinFlags()&JFlimitedprefixjoin) { CriticalBlock b(joinHelperCrit); // use std join helper (less efficient but implements limited prefix) joinhelper.setown(createJoinHelper(helper,"SELFJOIN", container.queryId(), queryRowAllocator(),hintparallelmatch,hintunsortedoutput)); } else { CriticalBlock b(joinHelperCrit); joinhelper.setown(createSelfJoinHelper(helper,"SELFJOIN", container.queryId(), queryRowAllocator(),hintparallelmatch,hintunsortedoutput)); } strm.setown(isLightweight? doLightweightSelfJoin() : (isLocal ? doLocalSelfJoin() : doGlobalSelfJoin())); assertex(strm); joinhelper->init(strm, NULL, ::queryRowAllocator(inputs.item(0)), ::queryRowAllocator(inputs.item(0)), ::queryRowMetaData(inputs.item(0)), &abortSoon, this); }
// IThorDataLink virtual void start() override { ActivityTimer s(totalCycles, timeActivities); PARENT::start(); bool hintunsortedoutput = getOptBool(THOROPT_UNSORTED_OUTPUT, (JFreorderable & helper->getJoinFlags()) != 0); bool hintparallelmatch = getOptBool(THOROPT_PARALLEL_MATCH, hintunsortedoutput); // i.e. unsorted, implies use parallel by default, otherwise no point if (helper->getJoinFlags()&JFlimitedprefixjoin) { CriticalBlock b(joinHelperCrit); // use std join helper (less efficient but implements limited prefix) joinhelper.setown(createJoinHelper(*this, helper, this, hintparallelmatch, hintunsortedoutput)); } else { CriticalBlock b(joinHelperCrit); joinhelper.setown(createSelfJoinHelper(*this, helper, this, hintparallelmatch, hintunsortedoutput)); } strm.setown(isLightweight? doLightweightSelfJoin() : (isLocal ? doLocalSelfJoin() : doGlobalSelfJoin())); assertex(strm); joinhelper->init(strm, NULL, ::queryRowAllocator(queryInput(0)), ::queryRowAllocator(queryInput(0)), ::queryRowMetaData(queryInput(0))); }
bool isUnstable() { // actually don't think currently supported by join but maybe will be sometime IHThorAlgorithm * algo = helper?(static_cast<IHThorAlgorithm *>(helper->selectInterface(TAIalgorithm_1))):NULL; return (algo&&algo->getAlgorithmFlags()&TAFunstable); }