// ADD INDEX TO A RELATION public void addIndex(String relation, String attrName, IndexType accessType, int buckets) throws IOException, Catalogioerror, Cataloghferror, Catalogmissparam, Catalogattrnotfound, Catalogbadtype, Catalognomem, Catalogindexnotfound, IndexCatalogException, java.lang.Exception { RID rid = null; IndexDesc indexRec = null; AttrDesc attrRec = null; int intKey = 0; float floatKey = (float) 0.0; String charKey = null; int attrCnt = 0; KeyClass key = null; int recSize = 0; Heapfile datafile = null; String indexName = null; Tuple tuple = null; BTreeFile btree = null; Scan pscan = null; AttrType[] typeArray = null; short[] sizeArray = null; // CHECK PARM if ((relation == null) || (attrName == null)) throw new Catalogmissparam(null, "MISSING_PARAM"); // CHECK FOR EXISTING INDEX try { getInfo(relation, attrName, accessType, indexRec); } catch (Catalogioerror e) { System.err.println("Catalog I/O Error!" + e); throw new Catalogioerror(null, ""); } catch (Cataloghferror e1) { System.err.println("Catalog Heapfile Error!" + e1); throw new Cataloghferror(null, ""); } catch (Catalogmissparam e2) { System.err.println("Catalog Missing Param Error!" + e2); throw new Catalogmissparam(null, ""); } // GET ATTRIBUTE INFO try { ExtendedSystemDefs.MINIBASE_ATTRCAT.getInfo(relation, attrName, attrRec); } catch (Exception e2) { throw new IndexCatalogException(e2, "getInfo() failed"); } // Can only index on int's and strings currently if ((attrRec.attrType.attrType != AttrType.attrInteger) && (attrRec.attrType.attrType != AttrType.attrString)) throw new Catalogbadtype(null, "Catalog: BAD TYPE!"); // UPDATE ATTRIBUTE INFO attrRec.indexCnt++; try { ExtendedSystemDefs.MINIBASE_ATTRCAT.removeInfo(relation, attrName); ExtendedSystemDefs.MINIBASE_ATTRCAT.addInfo(attrRec); } catch (Exception e) { throw new IndexCatalogException(e, "add/remove info failed"); } // BUILD INDEX FILE NAME indexName = buildIndexName(relation, attrName, accessType); // ADDED BY BILL KIMMEL - DELETE LATER System.out.println("Index name is " + indexName); // IF BTREE if (accessType.indexType == IndexType.B_Index) { btree = new BTreeFile(indexName, attrRec.attrType.attrType, attrRec.attrLen, 0); } // ADD ENTRY IN INDEXCAT indexRec.relName = new String(relation); indexRec.attrName = new String(attrName); indexRec.accessType = accessType; if (accessType.indexType == IndexType.B_Index) indexRec.order = new TupleOrder(TupleOrder.Ascending); else indexRec.order = new TupleOrder(TupleOrder.Random); indexRec.distinctKeys = DISTINCTKEYS; indexRec.clustered = 0; // 0 means non-clustered!!!! indexRec.indexPages = INDEXPAGES; try { addInfo(indexRec); } catch (Exception e) { throw new IndexCatalogException(e, "addInfo() failed"); } // PREPARE TO SCAN DATA FILE try { datafile = new Heapfile(relation); if (datafile == null) throw new Catalognomem(null, "NO Enough Memory!"); } catch (Exception e) { throw new IndexCatalogException(e, "create heapfile failed"); } try { pscan = datafile.openScan(); } catch (Exception e) { throw new IndexCatalogException(e, "openScan() failed"); } // PREPARE TUPLE try { ExtendedSystemDefs.MINIBASE_ATTRCAT.getTupleStructure( relation, attrCnt, typeArray, sizeArray); } catch (Exception e) { throw new IndexCatalogException(e, "getTupleStructure"); } tuple = new Tuple(Tuple.max_size); if (tuple == null) throw new Catalognomem(null, "Catalog, No Enough Memory!"); try { tuple.setHdr((short) attrCnt, typeArray, sizeArray); } catch (Exception e) { throw new IndexCatalogException(e, "setHdr() failed"); } recSize = tuple.size(); // NOW PROCESS THE HEAPFILE AND INSERT KEY,RID INTO INDEX while (true) { try { tuple = pscan.getNext(rid); if (tuple == null) return; } catch (Exception e) { throw new IndexCatalogException(e, "getNext() failed"); } // PULL OUT THE KEY VALUE FROM HEAPFILE RECORD if (attrRec.attrType.attrType == AttrType.attrInteger) { intKey = tuple.getIntFld(attrRec.attrPos); key = new IntegerKey(intKey); } else if (attrRec.attrType.attrType == AttrType.attrReal) { floatKey = tuple.getFloFld(attrRec.attrPos); key = new IntegerKey((int) floatKey); } else if (attrRec.attrType.attrType == AttrType.attrString) { charKey = new String(tuple.getStrFld(attrRec.attrPos)); key = new StringKey(charKey); } // NOW INSERT RECORD INTO INDEX if (accessType.indexType == IndexType.B_Index) { try { btree.insert(key, rid); } catch (Exception e) { throw new IndexCatalogException(e, "insert failed"); } } } };