// Sorts Both the file , individually // irrespective of their size. public static void initialize( String table1, String table1_join_col, String table2, String table2_join_col) { // System.out.println(DBSystem.PATH_FOR_DATA); // System.out.println(table1); tab1 = table1; tab2 = table2; for (Table t : DBSystem.tableList) { if (t.getName().equalsIgnoreCase(table1)) { table1JoinColIndex = t.getColumnNum().get(table1_join_col); table1JoinColType = t.getColumnData().get(table1_join_col); table1Lines = t.getLines(); t1 = t; } else if (t.getName().equalsIgnoreCase(table2)) { table2JoinColIndex = t.getColumnNum().get(table2_join_col); table2JoinColType = t.getColumnData().get(table2_join_col); table2Lines = t.getLines(); t2 = t; } } // System.out.println(table1 + " - " + table1_join_col + " - " + table1JoinColIndex + " - " + // table1JoinColType); // System.out.println(table2 + " - " + table2_join_col + " - " + table2JoinColIndex + " - " + // table2JoinColType); if (!table1JoinColType.equalsIgnoreCase(table2JoinColType)) { System.out.println("Both the tables must have similar join types"); System.exit(1); } int numberOfcolumnsForJoin = 2; // For Joining Two tables // Sort the columns used for join for (int k = 0; k < numberOfcolumnsForJoin; k++) { String tab = null; String tabColType = null; int tabColIndex = 0; int tLines = 0; if (k == 0) { // Sorting table 1. tab = table1; tabColType = table1JoinColType; tabColIndex = table1JoinColIndex; tLines = table1Lines; } else if (k == 1) { // Sorting table 2 tab = table2; tabColType = table2JoinColType; tabColIndex = table2JoinColIndex; tLines = table2Lines; } Comparator<String> cmp = new SortingComparator(tabColIndex, tabColType); PriorityQueue<String> priorityQueue = new PriorityQueue<String>(10, cmp); int remainingBufferSize = MAX_MEM_TO_USE; int fileCount = 1; String line; int inOutFlag = 0; for (int i = 0; i < tLines; i++) { line = DBSystem.getRecord(tab, i); // System.out.println(line); // String cols [] = line.split(","); remainingBufferSize -= line.getBytes().length; if (remainingBufferSize >= 0) { priorityQueue.add(line); inOutFlag = 1; } else { // write to file FileWriter fileWriter = null; // System.out.println("Written"); try { // String fileName = setBlockFile(fileCount,table1); // System.out.println(fileName); fileWriter = new FileWriter(new File(setBlockFile(fileCount, tab))); int siz = priorityQueue.size(); // System.out.println(siz); for (int j = 0; j < siz; j++) { fileWriter.write(priorityQueue.poll().toString()); // System.out.println(priorityQueue.poll().toString()); fileWriter.write("\n"); } fileCount++; } catch (IOException e) { e.printStackTrace(); } finally { try { fileWriter.close(); } catch (IOException e) { e.printStackTrace(); } } // set remainingSize back to MAX_MEM_TO_USE remainingBufferSize = MAX_MEM_TO_USE; // current read line priorityQueue.add(line); remainingBufferSize -= line.getBytes().length; inOutFlag = 0; } } if (inOutFlag == 1) { FileWriter fw = null; try { fw = new FileWriter(new File(setBlockFile(fileCount, tab))); int psiz = priorityQueue.size(); for (int j = 0; j < psiz; j++) { fw.write(priorityQueue.poll().toString()); // System.out.println(priorityQueue.poll().toString()); fw.write("\n"); } } catch (IOException e) { e.printStackTrace(); } finally { try { fw.close(); } catch (IOException e) { e.printStackTrace(); } } } if (k == 0) table1_tempfileCount = fileCount; if (k == 1) table2_tempfileCount = fileCount; } // Begin the merging process for both the files. // System.out.println(table1_tempfileCount); // System.out.println(table2_tempfileCount); // Merging Process SortedMergeJoin sortedMergeJoin = new SortedMergeJoin( table1, table1_tempfileCount, table1JoinColIndex, table1JoinColType, table2, table2_tempfileCount, table2JoinColIndex, table2JoinColType); sortedMergeJoin.execute(); }