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;
         }