示例#1
0
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);
    }
}
示例#2
0
文件: IX_test.cpp 项目: Orpine/zbase
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;

}
示例#3
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);
}
示例#4
0
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;
}