You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@metamodel.apache.org by ka...@apache.org on 2013/08/02 14:24:09 UTC
[7/9] git commit: Decreased overhead of SingleLineCsvRow by avoid the
inner LazyRef.
Decreased overhead of SingleLineCsvRow by avoid the inner LazyRef.
Project: http://git-wip-us.apache.org/repos/asf/incubator-metamodel/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-metamodel/commit/5e24c5ee
Tree: http://git-wip-us.apache.org/repos/asf/incubator-metamodel/tree/5e24c5ee
Diff: http://git-wip-us.apache.org/repos/asf/incubator-metamodel/diff/5e24c5ee
Branch: refs/heads/master
Commit: 5e24c5ee610f773ae45b03a297f5209abcbaa6f7
Parents: cfeb6fc
Author: kaspers <ka...@kaspers-think.humaninference.com>
Authored: Fri Aug 2 14:21:38 2013 +0200
Committer: kaspers <ka...@kaspers-think.humaninference.com>
Committed: Fri Aug 2 14:21:38 2013 +0200
----------------------------------------------------------------------
.../apache/metamodel/csv/SingleLineCsvRow.java | 83 ++++++++++++--------
1 file changed, 50 insertions(+), 33 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/5e24c5ee/csv/src/main/java/org/apache/metamodel/csv/SingleLineCsvRow.java
----------------------------------------------------------------------
diff --git a/csv/src/main/java/org/apache/metamodel/csv/SingleLineCsvRow.java b/csv/src/main/java/org/apache/metamodel/csv/SingleLineCsvRow.java
index 8207e38..a6bf1c9 100644
--- a/csv/src/main/java/org/apache/metamodel/csv/SingleLineCsvRow.java
+++ b/csv/src/main/java/org/apache/metamodel/csv/SingleLineCsvRow.java
@@ -18,11 +18,13 @@
*/
package org.apache.metamodel.csv;
+import java.io.IOException;
+
+import org.apache.metamodel.MetaModelException;
import org.apache.metamodel.data.AbstractRow;
import org.apache.metamodel.data.DataSetHeader;
import org.apache.metamodel.data.Style;
import org.apache.metamodel.schema.Column;
-import org.apache.metamodel.util.LazyRef;
import au.com.bytecode.opencsv.CSVParser;
@@ -34,50 +36,65 @@ final class SingleLineCsvRow extends AbstractRow {
private static final long serialVersionUID = 1L;
private final SingleLineCsvDataSet _dataSet;
- private final LazyRef<String[]> _valuesRef;
+ private final String _line;
+ private final int _columnsInTable;
+ private final boolean _failOnInconsistentRowLength;
+ private final int _rowNumber;
+ private String[] _values;
public SingleLineCsvRow(SingleLineCsvDataSet dataSet, final String line, final int columnsInTable,
final boolean failOnInconsistentRowLength, final int rowNumber) {
_dataSet = dataSet;
- _valuesRef = new LazyRef<String[]>() {
- @Override
- protected String[] fetch() throws Throwable {
- final CSVParser parser = _dataSet.getCsvParser();
- final String[] csvValues = parser.parseLine(line);
-
- if (failOnInconsistentRowLength) {
- if (columnsInTable != csvValues.length) {
- throw new InconsistentRowLengthException(columnsInTable, SingleLineCsvRow.this, csvValues,
- rowNumber);
- }
- }
+ _line = line;
+ _columnsInTable = columnsInTable;
+ _failOnInconsistentRowLength = failOnInconsistentRowLength;
+ _rowNumber = rowNumber;
+ _values = null;
+ }
+
+ private String[] getValuesInternal() {
+ if (_values == null) {
+ final CSVParser parser = _dataSet.getCsvParser();
+ String[] csvValues;
+ try {
+ csvValues = parser.parseLine(_line);
+ } catch (IOException e) {
+ throw new MetaModelException("Failed to parse CSV line no. " + _rowNumber + ": " + _line);
+ }
- // convert the line's values into the row values that where
- // requested
- final DataSetHeader header = _dataSet.getHeader();
- final int size = header.size();
- final String[] rowValues = new String[size];
-
- for (int i = 0; i < size; i++) {
- final Column column = header.getSelectItem(i).getColumn();
- final int columnNumber = column.getColumnNumber();
- if (columnNumber < csvValues.length) {
- rowValues[i] = csvValues[columnNumber];
- } else {
- // Ticket #125: Missing values should be enterpreted as
- // null.
- rowValues[i] = null;
- }
+ if (_failOnInconsistentRowLength) {
+ if (_columnsInTable != csvValues.length) {
+ throw new InconsistentRowLengthException(_columnsInTable, SingleLineCsvRow.this, csvValues,
+ _rowNumber);
}
+ }
+
+ // convert the line's values into the row values that where
+ // requested
+ final DataSetHeader header = _dataSet.getHeader();
+ final int size = header.size();
+ final String[] rowValues = new String[size];
- return rowValues;
+ for (int i = 0; i < size; i++) {
+ final Column column = header.getSelectItem(i).getColumn();
+ final int columnNumber = column.getColumnNumber();
+ if (columnNumber < csvValues.length) {
+ rowValues[i] = csvValues[columnNumber];
+ } else {
+ // Ticket #125: Missing values should be enterpreted as
+ // null.
+ rowValues[i] = null;
+ }
}
- };
+
+ _values = rowValues;
+ }
+ return _values;
}
@Override
public Object getValue(int index) throws IndexOutOfBoundsException {
- String[] values = _valuesRef.get();
+ String[] values = getValuesInternal();
if (values == null) {
return null;
}