import java.io.*;
import java.util.ArrayList;
public class ExternalSort {
// readers and writers needed for the files
private static FileReader _input;
private static BufferedReader _bufRead;
private static FileReader _input2;
private static BufferedReader _bufRead2;
private static FileWriter _output;
private static BufferedWriter _bufWrite;
private static String identifierRegex = "[a-zA-Z]+\\w*";
// the main() function
public static void main(String[] args)
{
String relation = "test"; // the code takes care of the .CSV
String attribute = "B";
externalSort(relation, attribute);
System.out.println("The relation was sorted");
}
// returns an array of ints given an array of strings that should be ints
private static Integer[] getIntsFromStringArray(String[] row)
{
return getIntsFromStringArray(row, false);
}
private static Integer[] getIntsFromStringArray(String[] row, boolean nullIsZero)
{
Integer [] rowAsInts = new Integer[row.length];
for(int i=0; i tenKRows = new ArrayList();
int numFiles = 0;
while (row!=null)
{
// get 10k rows
for(int i=0; i<10000; i++)
{
String line = initRelationReader.readLine();
if (line==null)
{
row = null;
break;
}
row = line.split(",");
tenKRows.add(getIntsFromStringArray(row));
}
// sort the rows
tenKRows = mergeSort(tenKRows, indexToCompare);
// write to disk
FileWriter fw = new FileWriter(relation + "_chunk" + numFiles + ".csv");
BufferedWriter bw = new BufferedWriter(fw);
bw.write(flattenArray(header,",")+"\n");
for(int i=0; i mergefr = new ArrayList();
ArrayList mergefbr = new ArrayList();
ArrayList filerows = new ArrayList();
FileWriter fw = new FileWriter(relation + "_sorted.csv");
BufferedWriter bw = new BufferedWriter(fw);
String [] header;
boolean someFileStillHasRows = false;
for (int i=0; i mergeSort(ArrayList arr, int index)
{
ArrayList left = new ArrayList();
ArrayList right = new ArrayList();
if(arr.size()<=1)
return arr;
else
{
int middle = arr.size()/2;
for (int i = 0; i merge(ArrayList left, ArrayList right, int index)
{
ArrayList result = new ArrayList();
while (left.size() > 0 && right.size() > 0)
{
if(left.get(0)[index] <= right.get(0)[index])
{
result.add(left.get(0));
left.remove(0);
}
else
{
result.add(right.get(0));
right.remove(0);
}
}
if (left.size()>0)
{
for(int i=0; i0)
{
for(int i=0; i