/**
* This file is licensed under the University of Illinois/NCSA Open Source License. See LICENSE.TXT for details.
*/
package edu.illinois.codingspectator.csvtotransactions;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import com.beust.jcommander.JCommander;
import com.beust.jcommander.ParameterException;
/**
*
* @author Mohsen Vakilian
*
*/
public class CSVToTransactions {
private long timeWindowInMinutes;
private InputStreamReader reader;
private TransactionWriters transactionWriters;
private Writer transactionPatternsWriter;
private String itemColumnName;
private String timestampColumnName;
private List<String> fixedColumnNames;
public CSVToTransactions(InputStreamReader reader, OutputStreamWriter transactionWriter, long timeWindowInMinutes, Writer detailedTransactionsWriter, Writer transactionPatternsWriter,
String itemColumnName, String timestampColumnName, List<String> fixedColumnNames) {
this.reader= reader;
this.timeWindowInMinutes= timeWindowInMinutes;
this.transactionWriters= new TransactionWriters(transactionWriter, detailedTransactionsWriter);
this.transactionPatternsWriter= transactionPatternsWriter;
this.itemColumnName= itemColumnName;
this.timestampColumnName= timestampColumnName;
this.fixedColumnNames= fixedColumnNames;
}
private List<String> getFixedColumnNames() {
return fixedColumnNames;
}
public void convertCSVToTransactions() throws IOException {
try {
TransactionFactory transactionFactory= new TransactionFactory();
TransactionPatterns transactionPatterns= new TransactionPatterns(itemColumnName);
CSVReader csvReader= new CSVReader(reader, new String[] { itemColumnName, timestampColumnName });
Iterator<Map<String, String>> iterator= csvReader.iterator();
List<String> allColumnNames= csvReader.getHeader();
Transaction lastTransaction= transactionFactory.createTransaction(transactionPatterns);
UDCRow lastRow= null;
if (iterator.hasNext()) {
lastRow= new UDCRow(iterator.next(), allColumnNames, itemColumnName, timestampColumnName, getFixedColumnNames(), timeWindowInMinutes);
lastRow.setTransaction(lastTransaction);
}
while (iterator.hasNext()) {
Map<String, String> currentCSVRow= iterator.next();
UDCRow currentRow= new UDCRow(currentCSVRow, allColumnNames, itemColumnName, timestampColumnName, getFixedColumnNames(), timeWindowInMinutes);
if (!currentRow.shouldBelongToTheTransactionOf(lastRow)) {
transactionWriters.writeTransaction(lastTransaction);
lastTransaction= transactionFactory.createTransaction(transactionPatterns);
}
currentRow.setTransaction(lastTransaction);
lastRow= currentRow;
}
transactionWriters.writeTransaction(lastTransaction);
transactionPatterns.writeTo(transactionPatternsWriter);
} finally {
reader.close();
transactionWriters.close();
if (transactionPatternsWriter != null) {
transactionPatternsWriter.close();
}
}
}
public static void main(String[] args) throws IOException {
CommandLineParameters params= new CommandLineParameters();
try {
JCommander commander= new JCommander(params, args);
if (params.help) {
commander.usage();
} else {
CSVToTransactions csvToTransactions= new CSVToTransactions(new FileReader(params.eventsFileName), new OutputStreamWriter(System.out), params.timeWindowInMinutes, new FileWriter(
params.detailedTransactionsFileName), new FileWriter(params.transactionPatternsFileName), params.itemColumnName, params.timestampColumnName, params.fixedColumnNames);
csvToTransactions.convertCSVToTransactions();
}
} catch (ParameterException e) {
new JCommander(params).usage();
}
}
}