diff --git a/ndb/test/ndbapi/slow_select.cpp b/ndb/test/ndbapi/slow_select.cpp index ef32d698754aaee8a5d93af74dd72457becd6991..a953e1539d042a58d762110c916f3bec8bafcca0 100644 --- a/ndb/test/ndbapi/slow_select.cpp +++ b/ndb/test/ndbapi/slow_select.cpp @@ -41,152 +41,155 @@ main(void){ require(g_ndb.waitUntilReady() == 0); - g_trans = g_ndb.startTransaction(); - require(g_trans); + while(true){ + g_trans = g_ndb.startTransaction(); + require(g_trans); - size_t i, j; - const size_t cnt = sizeof(g_scans)/sizeof(g_scans[0]); - - start = NdbTick_CurrentMillisecond(); - - for(i = 0; i<cnt; i++){ - ndbout_c("starting scan on: %s %s", - g_scans[i].m_table, g_scans[i].m_index); - g_scans[i].m_scan = g_trans->getNdbIndexScanOperation(g_scans[i].m_index, - g_scans[i].m_table); - NdbIndexScanOperation* scan = g_scans[i].m_scan; - require(scan); - g_scans[i].m_result = scan->readTuples(NdbScanOperation::LM_CommittedRead, - 0, 0, true); - require(g_scans[i].m_result); - } + size_t i, j; + const size_t cnt = sizeof(g_scans)/sizeof(g_scans[0]); + + start = NdbTick_CurrentMillisecond(); + + for(i = 0; i<cnt; i++){ + ndbout_c("starting scan on: %s %s", + g_scans[i].m_table, g_scans[i].m_index); + g_scans[i].m_scan = g_trans->getNdbIndexScanOperation(g_scans[i].m_index, + g_scans[i].m_table); + NdbIndexScanOperation* scan = g_scans[i].m_scan; + require(scan); + g_scans[i].m_result = scan->readTuples(NdbScanOperation::LM_CommittedRead, + 0, 0, true); + require(g_scans[i].m_result); + } - require(!g_scans[0].m_scan->setBound((Uint32)0, - NdbIndexScanOperation::BoundEQ, - &g_affiliateid, - sizeof(g_affiliateid))); + require(!g_scans[0].m_scan->setBound((Uint32)0, + NdbIndexScanOperation::BoundEQ, + &g_affiliateid, + sizeof(g_affiliateid))); #if 0 - require(!g_scans[1].m_scan->setBound((Uint32)0, - NdbIndexScanOperation::BoundLE, - &g_formatids[0], - sizeof(g_formatids[0]))); + require(!g_scans[1].m_scan->setBound((Uint32)0, + NdbIndexScanOperation::BoundLE, + &g_formatids[0], + sizeof(g_formatids[0]))); #endif - NdbScanFilter sf(g_scans[1].m_scan); - sf.begin(NdbScanFilter::OR); - sf.eq(2, g_formatids[0]); - sf.eq(2, g_formatids[1]); - sf.eq(2, g_formatids[2]); - sf.end(); - - // affiliatestometa - require(g_scans[0].m_scan->getValue("uniquekey")); - require(g_scans[0].m_scan->getValue("xml")); - - // media - require(g_scans[1].m_scan->getValue("path")); - require(g_scans[1].m_scan->getValue("mediaid")); - require(g_scans[1].m_scan->getValue("formatid")); + NdbScanFilter sf(g_scans[1].m_scan); + sf.begin(NdbScanFilter::OR); + sf.eq(2, g_formatids[0]); + sf.eq(2, g_formatids[1]); + sf.eq(2, g_formatids[2]); + sf.end(); + + // affiliatestometa + require(g_scans[0].m_scan->getValue("uniquekey")); + require(g_scans[0].m_scan->getValue("xml")); + + // media + require(g_scans[1].m_scan->getValue("path")); + require(g_scans[1].m_scan->getValue("mediaid")); + require(g_scans[1].m_scan->getValue("formatid")); - // meta - require(g_scans[2].m_scan->getValue("name")); - require(g_scans[2].m_scan->getValue("xml")); + // meta + require(g_scans[2].m_scan->getValue("name")); + require(g_scans[2].m_scan->getValue("xml")); - // artiststometamap - require(g_scans[3].m_scan->getValue("artistid", (char*)&g_artistid)); + // artiststometamap + require(g_scans[3].m_scan->getValue("artistid", (char*)&g_artistid)); - // subgenrestometamap - require(g_scans[4].m_scan->getValue("subgenreid", (char*)&g_subgenreid)); + // subgenrestometamap + require(g_scans[4].m_scan->getValue("subgenreid", (char*)&g_subgenreid)); - for(i = 0; i<cnt; i++){ - g_scans[i].m_scan->getValue("metaid", (char*)&g_scans[i].metaid); - } + for(i = 0; i<cnt; i++){ + g_scans[i].m_scan->getValue("metaid", (char*)&g_scans[i].metaid); + } - g_trans->execute(NoCommit, AbortOnError, 1); + g_trans->execute(NoCommit, AbortOnError, 1); - Uint32 max_val = 0; - Uint32 match_val = 0; + Uint32 max_val = 0; + Uint32 match_val = 0; - S_Scan * F [5], * Q [5], * nextF [5]; - Uint32 F_sz = 0, Q_sz = 0; - for(i = 0; i<cnt; i++){ - F_sz++; - F[i] = &g_scans[i]; - } + S_Scan * F [5], * Q [5], * nextF [5]; + Uint32 F_sz = 0, Q_sz = 0; + for(i = 0; i<cnt; i++){ + F_sz++; + F[i] = &g_scans[i]; + } - Uint32 match_count = 0; - while(F_sz > 0){ - Uint32 prev_F_sz = F_sz; - F_sz = 0; - bool found = false; - //for(i = 0; i<cnt; i++) - //ndbout_c("%s - %d", g_scans[i].m_table, g_scans[i].metaid); + Uint32 match_count = 0; + while(F_sz > 0){ + Uint32 prev_F_sz = F_sz; + F_sz = 0; + bool found = false; + //for(i = 0; i<cnt; i++) + //ndbout_c("%s - %d", g_scans[i].m_table, g_scans[i].metaid); - for(i = 0; i<prev_F_sz; i++){ - int res = F[i]->m_result->nextResult(); - if(res == -1) - abort(); + for(i = 0; i<prev_F_sz; i++){ + int res = F[i]->m_result->nextResult(); + if(res == -1) + abort(); - if(res == 1){ - continue; - } + if(res == 1){ + continue; + } - Uint32 metaid = F[i]->metaid; - F[i]->row_count++; + Uint32 metaid = F[i]->metaid; + F[i]->row_count++; - if(metaid == match_val){ - //ndbout_c("flera"); - nextF[F_sz++] = F[i]; - require(F_sz >= 0 && F_sz <= cnt); - F[i]->match_count++; - Uint32 comb = 1; - for(j = 0; j<cnt; j++){ - comb *= (&g_scans[j] == F[i] ? 1 : g_scans[j].match_count); + if(metaid == match_val){ + //ndbout_c("flera"); + nextF[F_sz++] = F[i]; + require(F_sz >= 0 && F_sz <= cnt); + F[i]->match_count++; + Uint32 comb = 1; + for(j = 0; j<cnt; j++){ + comb *= (&g_scans[j] == F[i] ? 1 : g_scans[j].match_count); + } + match_count += comb; + found = true; + continue; } - match_count += comb; - found = true; - continue; - } - if(metaid < max_val){ - nextF[F_sz++] = F[i]; - require(F_sz >= 0 && F_sz <= cnt); - continue; + if(metaid < max_val){ + nextF[F_sz++] = F[i]; + require(F_sz >= 0 && F_sz <= cnt); + continue; + } + if(metaid > max_val){ + for(j = 0; j<Q_sz; j++) + nextF[F_sz++] = Q[j]; + require(F_sz >= 0 && F_sz <= cnt); + Q_sz = 0; + max_val = metaid; + } + Q[Q_sz++] = F[i]; + require(Q_sz >= 0 && Q_sz <= cnt); } - if(metaid > max_val){ - for(j = 0; j<Q_sz; j++) + if(F_sz == 0 && Q_sz > 0){ + match_val = max_val; + for(j = 0; j<Q_sz; j++){ nextF[F_sz++] = Q[j]; + Q[j]->match_count = 1; + } require(F_sz >= 0 && F_sz <= cnt); + require(Q_sz >= 0 && Q_sz <= cnt); Q_sz = 0; - max_val = metaid; - } - Q[Q_sz++] = F[i]; - require(Q_sz >= 0 && Q_sz <= cnt); - } - if(F_sz == 0 && Q_sz > 0){ - match_val = max_val; - for(j = 0; j<Q_sz; j++){ - nextF[F_sz++] = Q[j]; - Q[j]->match_count = 1; + match_count++; + lookup(); + } else if(!found && F_sz + Q_sz < cnt){ + F_sz = 0; } require(F_sz >= 0 && F_sz <= cnt); - require(Q_sz >= 0 && Q_sz <= cnt); - Q_sz = 0; - match_count++; - lookup(); - } else if(!found && F_sz + Q_sz < cnt){ - F_sz = 0; + for(i = 0; i<F_sz; i++) + F[i] = nextF[i]; } - require(F_sz >= 0 && F_sz <= cnt); - for(i = 0; i<F_sz; i++) - F[i] = nextF[i]; - } - start = NdbTick_CurrentMillisecond() - start; - ndbout_c("Elapsed: %lldms", start); + start = NdbTick_CurrentMillisecond() - start; + ndbout_c("Elapsed: %lldms", start); - ndbout_c("rows: %d", match_count); - for(i = 0; i<cnt; i++){ - ndbout_c("%s : %d", g_scans[i].m_table, g_scans[i].row_count); + ndbout_c("rows: %d", match_count); + for(i = 0; i<cnt; i++){ + ndbout_c("%s : %d", g_scans[i].m_table, g_scans[i].row_count); + } + g_trans->close(); } }