blob: 9ca98901ca68c0cd8a01610d5edd0e34ee6b78ce [file] [log] [blame]
package org.qcri.rheem.apps.tpch.data;
import java.io.Serializable;
import java.util.Calendar;
import java.util.GregorianCalendar;
/**
* A tuple of the lineitem table.
* <p>Example line:</p>
* <pre>
* "3249925";"37271";"9775";"1";"9.00";"10874.43";"0.10";"0.04";"N";"O";"1998-04-19";"1998-06-17";"1998-04-21";"TAKE BACK RETURN ";"AIR ";"express instructions among the excuses nag"
* </pre>
*/
public class LineItemTuple implements Serializable {
/**
* {@code identifier}, {@code PK}
*/
public long L_ORDERKEY;
/**
* {@code identifier}
*/
public long L_PARTKEY;
/**
* {@code identifier}
*/
public long L_SUPPKEY;
/**
* {@code integer}, {@code PK}
*/
public int L_LINENUMBER;
/**
* {@code decimal}
*/
public double L_QUANTITY;
/**
* {@code decimal}
*/
public double L_EXTENDEDPRICE;
/**
* {@code decimal}
*/
public double L_DISCOUNT;
/**
* {@code decimal}
*/
public double L_TAX;
/**
* {@code fixed text, size 1}
*/
public char L_RETURNFLAG;
/**
* {@code fixed text, size 1}
*/
public char L_LINESTATUS;
/**
* {@code fixed text, size 1}
*/
public int L_SHIPDATE;
/**
* {@code fixed text, size 1}
*/
public int L_COMMITDATE;
/**
* {@code fixed text, size 1}
*/
public int L_RECEIPTDATE;
/**
* {@code fixed text, size 25}
*/
public String L_SHIPINSTRUCT;
/**
* {@code fixed text, size 10}
*/
public String L_SHIPMODE;
/**
* {@code variable text, size 44}
*/
public String L_COMMENT;
public LineItemTuple(long l_ORDERKEY,
long l_PARTKEY,
long l_SUPPKEY,
int l_LINENUMBER,
double l_QUANTITY,
double l_EXTENDEDPRICE,
double l_DISCOUNT,
double l_TAX,
char l_RETURNFLAG,
int l_SHIPDATE,
int l_COMMITDATE,
int l_RECEIPTDATE,
String l_SHIPINSTRUCT,
String l_SHIPMODE,
String l_COMMENT) {
this.L_ORDERKEY = l_ORDERKEY;
this.L_PARTKEY = l_PARTKEY;
this.L_SUPPKEY = l_SUPPKEY;
this.L_LINENUMBER = l_LINENUMBER;
this.L_QUANTITY = l_QUANTITY;
this.L_EXTENDEDPRICE = l_EXTENDEDPRICE;
this.L_DISCOUNT = l_DISCOUNT;
this.L_TAX = l_TAX;
this.L_RETURNFLAG = l_RETURNFLAG;
this.L_SHIPDATE = l_SHIPDATE;
this.L_COMMITDATE = l_COMMITDATE;
this.L_RECEIPTDATE = l_RECEIPTDATE;
this.L_SHIPINSTRUCT = l_SHIPINSTRUCT;
this.L_SHIPMODE = l_SHIPMODE;
this.L_COMMENT = l_COMMENT;
}
public LineItemTuple() {
}
/**
* Parses a {@link LineItemTuple} from a given CSV line (double quoted, comma-separated).
*/
public static class Parser {
public LineItemTuple parse(String line) {
LineItemTuple tuple = new LineItemTuple();
int startPos = 0;
int endPos = line.indexOf(';', startPos);
tuple.L_ORDERKEY = Long.valueOf(line.substring(startPos + 1, endPos - 1));
startPos = endPos + 1;
endPos = line.indexOf(';', startPos);
tuple.L_PARTKEY = Long.valueOf(line.substring(startPos + 1, endPos - 1));
startPos = endPos + 1;
endPos = line.indexOf(';', startPos);
tuple.L_SUPPKEY = Long.valueOf(line.substring(startPos + 1, endPos - 1));
startPos = endPos + 1;
endPos = line.indexOf(';', startPos);
tuple.L_LINENUMBER = Integer.valueOf(line.substring(startPos + 1, endPos - 1));
startPos = endPos + 1;
endPos = line.indexOf(';', startPos);
tuple.L_QUANTITY = Double.valueOf(line.substring(startPos + 1, endPos - 1));
startPos = endPos + 1;
endPos = line.indexOf(';', startPos);
tuple.L_EXTENDEDPRICE = Double.valueOf(line.substring(startPos + 1, endPos - 1));
startPos = endPos + 1;
endPos = line.indexOf(';', startPos);
tuple.L_DISCOUNT = Double.valueOf(line.substring(startPos + 1, endPos - 1));
startPos = endPos + 1;
endPos = line.indexOf(';', startPos);
tuple.L_TAX = Double.valueOf(line.substring(startPos + 1, endPos - 1));
startPos = endPos + 1;
endPos = line.indexOf(';', startPos);
tuple.L_RETURNFLAG = line.charAt(startPos + 1);
startPos = endPos + 1;
endPos = line.indexOf(';', startPos);
tuple.L_LINESTATUS = line.charAt(startPos + 1);
startPos = endPos + 1;
endPos = line.indexOf(';', startPos);
tuple.L_SHIPDATE = parseDate(line.substring(startPos + 1, endPos - 1));
startPos = endPos + 1;
endPos = line.indexOf(';', startPos);
tuple.L_COMMITDATE = parseDate(line.substring(startPos + 1, endPos - 1));
startPos = endPos + 1;
endPos = line.indexOf(';', startPos);
tuple.L_RECEIPTDATE = parseDate(line.substring(startPos + 1, endPos - 1));
startPos = endPos + 1;
endPos = startPos - 1;
do {
endPos++;
endPos = line.indexOf(';', endPos);
} while (line.charAt(endPos - 1) != '"' || line.charAt(endPos + 1) != '"');
tuple.L_SHIPINSTRUCT = line.substring(startPos + 1, endPos - 1);
startPos = endPos + 1;
endPos = startPos - 1;
do {
endPos++;
endPos = line.indexOf(';', endPos);
} while (line.charAt(endPos - 1) != '"' || line.charAt(endPos + 1) != '"');
tuple.L_SHIPMODE = line.substring(startPos + 1, endPos - 1);
startPos = endPos + 1;
endPos = startPos - 1;
do {
endPos++;
endPos = line.indexOf(';', endPos);
} while (endPos >= 0 && (line.charAt(endPos - 1) != '"' || (endPos < line.length() - 1 && line.charAt(endPos + 1) != '"')));
assert endPos < 0 : String.format("Parsing error: unexpected ';' at %d. Input: %s", endPos, line);
endPos = line.length();
tuple.L_COMMENT = line.substring(startPos + 1, endPos - 1);
return tuple;
}
public static int parseDate(String dateString) {
Calendar calendar = GregorianCalendar.getInstance();
calendar.set(
Integer.parseInt(dateString.substring(0, 4)),
Integer.parseInt(dateString.substring(5, 7)) - 1,
Integer.parseInt(dateString.substring(8, 10))
);
final int millisPerDay = 1000 * 60 * 60 * 24;
return (int) (calendar.getTimeInMillis() / millisPerDay);
}
}
}