void test_IX_speed() { RID rid; IX_Manager manager; manager.DestroyIndex("ixtest", 1); manager.CreateIndex("ixtest", 1, INTEGER, 8); IX_IndexHandle handle; long long a; printf("begin insert\n"); for (int i = 1280000; i >= 1; i--) { manager.OpenIndex("ixtest", 1, handle); rid.pageid = i; rid.slotid = i; a = i; if (i % 1000 == 0) printf("i = %d \n", i); handle.InsertEntry(&a, rid); // handle.ForcePages(); manager.CloseIndex(handle); } printf("insert finish\n"); printf("begin delete\n"); manager.OpenIndex("ixtest", 1, handle); for (int i = 60; i >= 56; i--) { rid.pageid = i; rid.slotid = i; a = i; printf("i = %d \n", i); handle.DeleteEntry(&a, rid); handle.ForcePages(); } for (int i = 1; i <= 30; i++) { rid.pageid = i; rid.slotid = i; a = i; printf("i = %d \n", i); handle.DeleteEntry(&a, rid); handle.ForcePages(); } rid.pageid = 33; rid.slotid = 33; a = 33; handle.DeleteEntry(&a, rid); printf("delete finish\n"); IX_IndexScan scan; a = 43; scan.OpenScan(handle, LE, &a); RID scanrid; scan.GetNextEntry(scanrid); while (scanrid.pageid > 0) { printf("rid: %d %d\n", scanrid.pageid, scanrid.slotid); scan.GetNextEntry(scanrid); } }
int main(){ RC rc; PF_Manager pfm; IX_Manager ixm(pfm); IX_IndexHandle ixih; IX_IndexScan ixis; if(rc=ixm.CreateIndex("indextest",0,FLOAT,4)) return rc; if(rc=ixm.OpenIndex("indextest",0,ixih)) return rc; for(int i=0;i<10;i++){ Value value((float)i); if(rc=ixih.InsertEntry(value,RID(i/10,i%10))) return rc; } if ((rc = ixm.CloseIndex(ixih))) { return rc; } if ((rc=ixm.OpenIndex("indextest",0,ixih))) { return rc; } // for(int i=0;i<1;i++){ // Value value; // value.type=INT; // value.iData=i; // // if(rc=ixih.DeleteEntry(value,RID(i/10,i%10))) // return rc; // } ixis.OpenScan(ixih,GE,Value((float)5.0)); RID id; while(ixis.GetNextEntry(id)!=IX_EOF){ PageNum pageNum; SlotNum slotNum; id.GetPageNum(pageNum); id.GetSlotNum(slotNum); cout<<pageNum<<"\t"<<slotNum<<endl; } if ((rc = ixis.CloseScan())) { return rc; } if ((rc = ixm.CloseIndex(ixih))) { return rc; } return 0; }
void test_IX() { RID rid; IX_Manager manager; manager.DestroyIndex("ixtest", 0); manager.CreateIndex("ixtest", 0, INTEGER, 8); // IX_IndexHandle handle; manager.OpenIndex("ixtest", 0, handle); char a[480]; memset(a, 0, 10); memset(a + 10, 255, 470); printf("begin insert\n"); // for (int i = 1; i <= 4; i++) { // for (int j = 1; j <= 4; j++) { // rid.pageid = i; rid.slotid = j; // a[i] = j; // printf("%d %d\n", i, j); // handle.InsertEntry(a, rid); // handle.ForcePages(); // } // } for (int i = 55; i >= 1; i--) { rid.pageid = i; rid.slotid = i; a[0] = i; printf("i = %d \n", i); handle.InsertEntry(a, rid); handle.ForcePages(); } printf("insert finish\n"); printf("begin delete\n"); for (int i = 60; i >= 56; i--) { rid.pageid = i; rid.slotid = i; a[0] = i; printf("i = %d \n", i); handle.DeleteEntry(a, rid); handle.ForcePages(); } for (int i = 1; i <= 30; i++) { rid.pageid = i; rid.slotid = i; a[0] = i; printf("i = %d \n", i); handle.DeleteEntry(a, rid); handle.ForcePages(); } rid.pageid = 33; rid.slotid = 33; a[0] = 33; handle.DeleteEntry(a, rid); printf("delete finish\n"); IX_IndexScan scan; a[0] = 43; scan.OpenScan(handle, NE, a); RID scanrid; scan.GetNextEntry(scanrid); while (scanrid.pageid > 0) { printf("rid: %d %d\n", scanrid.pageid, scanrid.slotid); scan.GetNextEntry(scanrid); } // handle.DeleteEntry(&a, rid); printf("%d\n", INT_MAX); }
RC QL_Manager::FindRecords(const char *relName, vector<RM_Record> &records){ RC rc; RM_FileHandle *rh; IX_IndexHandle *ih; if (rc = db.FindTableHandle(relName, rh)) return rc; RM_FileScan rmscan; IX_IndexScan ixscan; vector<RM_Record> v_now; v_now.clear(); bool flagAll = true; if (rmp.nConditions) { for (int i = 0; i < rmp.nConditions; i++) if (rmp.conditions[i].bRhsIsValue) { if (strcmp(relName, rmp.conditions[i].lhsAttr.relName) != 0) continue; vector<RM_Record> v_tmp; v_tmp.clear(); char *attrName = rmp.conditions[i].lhsAttr.attrName; SM_Attribute *smAttr; if (rc = db.FindAttribute(relName, attrName, smAttr)) return rc; AttrType attrType = smAttr->attrType; int attrLength = smAttr->attrLength; int attrOffset = smAttr->attrOffset; int attrNumber = smAttr->number; CompOp op = rmp.conditions[i].op; void *data = rmp.conditions[i].rhsValue.data; if (smAttr->hasIndex && isCmpOp(op)) { if (rc = db.FindIndexHandle(relName, attrName, ih)) return rc; ixscan.OpenScan(*ih, op, data); RID rid; RM_Record rec; v_tmp.clear(); while (1) { rc = ixscan.GetNextEntry(rid); if (rc != 0 && rc != IX_EOF) return rc; if (rc == IX_EOF) break; if (rc = rh->GetRec(rid, rec)) return rc; v_tmp.push_back(rec); } ixscan.CloseScan(); } else { if (op == IS_OP || op == IS_NOT_OP) { int number = smAttr->number; int nullBitmap = rh->header.recordSize - sizeof(int); if ((rc = rmscan.OpenScan(*rh, NOTYPE, 4, nullBitmap, 0, op, &number))) return rc; } else { if (rc = rmscan.OpenScan(*rh, attrType, attrLength, attrOffset, attrNumber, op, data)) return rc; } v_tmp.clear(); RM_Record rec; while (rmscan.GetNextRec(rec) != RM_ERR_EOF) { v_tmp.push_back(rec); } if (rc = rmscan.CloseScan()) return rc; } if (rc = MergeAnd(v_now, v_tmp, flagAll)) return rc; flagAll = false; } } //cout << "before flagAll\n"; if (flagAll) { int t = 0; if (rc = rmscan.OpenScan(*rh, INT, 4, 0, 0, NO_OP, &t, NO_HINT)) return rc; //cout << "after open scan\n"; RM_Record rec; v_now.clear(); while (rmscan.GetNextRec(rec) != RM_ERR_EOF) v_now.push_back(rec); if (rc = rmscan.CloseScan()) return rc; } //cout << "after flagAll\n"; records.clear(); records.assign(v_now.begin(), v_now.end()); return 0; }