summaryrefslogtreecommitdiff
path: root/storage/ndb/test/ndbapi/slow_select.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'storage/ndb/test/ndbapi/slow_select.cpp')
-rw-r--r--storage/ndb/test/ndbapi/slow_select.cpp228
1 files changed, 228 insertions, 0 deletions
diff --git a/storage/ndb/test/ndbapi/slow_select.cpp b/storage/ndb/test/ndbapi/slow_select.cpp
new file mode 100644
index 00000000000..8d615fa5771
--- /dev/null
+++ b/storage/ndb/test/ndbapi/slow_select.cpp
@@ -0,0 +1,228 @@
+
+#include <ndb_global.h>
+#include <NdbApi.hpp>
+#include <NdbOut.hpp>
+#include <NdbTick.h>
+
+struct
+S_Scan {
+ const char * m_table;
+ const char * m_index;
+ NdbIndexScanOperation * m_scan;
+ Uint32 metaid;
+ Uint32 match_count;
+ Uint32 row_count;
+};
+
+static S_Scan g_scans[] = {
+ { "affiliatestometa", "ind_affiliatestometa", 0, 0, 0, 0 },
+ { "media", "metaid", 0, 0, 0, 0 },
+ { "meta", "PRIMARY", 0, 0, 0, 0 },
+ { "artiststometamap", "PRIMARY", 0, 0, 0, 0 },
+ { "subgenrestometamap", "metaid", 0, 0, 0, 0 }
+};
+
+#define require(x) if(!(x)) { ndbout << "LINE: " << __LINE__ << endl;abort(); }
+#define require2(o, x) if(!(x)) { ndbout << o->getNdbError() << endl; abort(); }
+Uint32 g_affiliateid = 2;
+Uint32 g_formatids[] = { 8, 31, 76 };
+
+Uint64 start;
+Uint32 g_artistid = 0;
+Uint32 g_subgenreid = 0;
+
+NdbConnection* g_trans = 0;
+static void lookup();
+
+int
+main(void){
+ ndb_init();
+
+ Ndb_cluster_connection con;
+ if(con.connect(12, 5, 1) != 0)
+ {
+ return 1;
+ }
+
+ Ndb g_ndb(&con, "test");
+ g_ndb.init(1024);
+
+ require(g_ndb.waitUntilReady() == 0);
+
+ 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);
+ require(scan->readTuples(NdbScanOperation::LM_CommittedRead,
+ 0, 0, true) == 0);
+ }
+
+ 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])));
+#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"));
+
+ // 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));
+
+ // 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);
+ }
+
+ g_trans->execute(NoCommit, AbortOnError, 1);
+
+ 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];
+ }
+
+ 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_scan->nextResult();
+ if(res == -1)
+ abort();
+
+ if(res == 1){
+ continue;
+ }
+
+ 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);
+ }
+ 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){
+ 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(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;
+ match_count++;
+ lookup();
+ } else if(!found && F_sz + Q_sz < cnt){
+ F_sz = 0;
+ }
+ 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);
+
+ 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();
+ }
+}
+
+static
+void
+lookup(){
+ {
+ NdbOperation* op = g_trans->getNdbOperation("artists");
+ require2(g_trans, op);
+ require2(op, op->readTuple() == 0);
+ require2(op, op->equal("artistid", g_artistid) == 0);
+ require2(op, op->getValue("name"));
+ }
+
+ {
+ NdbOperation* op = g_trans->getNdbOperation("subgenres");
+ require2(g_trans, op);
+ require2(op, op->readTuple() == 0);
+ require2(op, op->equal("subgenreid", g_subgenreid) == 0);
+ require2(op, op->getValue("name"));
+ }
+
+ static int loop = 0;
+ if(loop++ >= 16){
+ loop = 0;
+ require(g_trans->execute(NoCommit) == 0);
+ }
+ //require(g_trans->restart() == 0);
+}