http://git-wip-us.apache.org/repos/asf/jena/blob/3d70d735/jena-csv/src/main/java/org/apache/jena/propertytable/impl/ColumnImpl.java
----------------------------------------------------------------------
diff --git 
a/jena-csv/src/main/java/org/apache/jena/propertytable/impl/ColumnImpl.java 
b/jena-csv/src/main/java/org/apache/jena/propertytable/impl/ColumnImpl.java
index ce456f9..808441a 100644
--- a/jena-csv/src/main/java/org/apache/jena/propertytable/impl/ColumnImpl.java
+++ b/jena-csv/src/main/java/org/apache/jena/propertytable/impl/ColumnImpl.java
@@ -1,57 +1,57 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.jena.propertytable.impl;
-
-
-import java.util.List;
-
-import org.apache.jena.graph.Node ;
-import org.apache.jena.propertytable.Column;
-import org.apache.jena.propertytable.PropertyTable;
-
-/**
- * The simple implementation of Column
- *
- */
-public class ColumnImpl implements Column {
-       
-       
-       private final PropertyTable table;
-       private Node p;
-
-       ColumnImpl(PropertyTable table, Node p) {
-               this.table = table;
-               this.p = p;
-       }
-
-       @Override
-       public PropertyTable getTable() {
-               return table;
-       }
-
-       @Override
-       public Node getColumnKey() {
-               return p;
-       }
-
-       @Override
-       public List<Node> getValues() {
-               return table.getColumnValues(this);
-       }
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jena.propertytable.impl;
+
+
+import java.util.List;
+
+import org.apache.jena.graph.Node ;
+import org.apache.jena.propertytable.Column;
+import org.apache.jena.propertytable.PropertyTable;
+
+/**
+ * The simple implementation of Column
+ *
+ */
+public class ColumnImpl implements Column {
+       
+       
+       private final PropertyTable table;
+       private Node p;
+
+       ColumnImpl(PropertyTable table, Node p) {
+               this.table = table;
+               this.p = p;
+       }
+
+       @Override
+       public PropertyTable getTable() {
+               return table;
+       }
+
+       @Override
+       public Node getColumnKey() {
+               return p;
+       }
+
+       @Override
+       public List<Node> getValues() {
+               return table.getColumnValues(this);
+       }
+}

http://git-wip-us.apache.org/repos/asf/jena/blob/3d70d735/jena-csv/src/main/java/org/apache/jena/propertytable/impl/PropertyTableArrayImpl.java
----------------------------------------------------------------------
diff --git 
a/jena-csv/src/main/java/org/apache/jena/propertytable/impl/PropertyTableArrayImpl.java
 
b/jena-csv/src/main/java/org/apache/jena/propertytable/impl/PropertyTableArrayImpl.java
index 1920045..6b8bd6e 100644
--- 
a/jena-csv/src/main/java/org/apache/jena/propertytable/impl/PropertyTableArrayImpl.java
+++ 
b/jena-csv/src/main/java/org/apache/jena/propertytable/impl/PropertyTableArrayImpl.java
@@ -1,345 +1,345 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.jena.propertytable.impl;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.jena.atlas.iterator.Iter;
-import org.apache.jena.atlas.iterator.IteratorConcat;
-import org.apache.jena.graph.Node ;
-import org.apache.jena.graph.Triple ;
-import org.apache.jena.propertytable.Column;
-import org.apache.jena.propertytable.PropertyTable;
-import org.apache.jena.propertytable.Row;
-import org.apache.jena.util.iterator.ExtendedIterator ;
-import org.apache.jena.util.iterator.WrappedIterator ;
-
-/**
- * A PropertyTable Implementation using a two dimension array.
- * It contains SPO and PSO indexes.
- * 
- */
-public class PropertyTableArrayImpl implements PropertyTable {
-       
-       private final List<Node> rowList;
-       private final List<Node> columnList;
-
-       private final Map<Node, Integer> rowKeyToIndex;
-       private final Map<Node, Integer> columnKeyToIndex;
-       private final Node[][] array;
-       private final int rowNum;
-       private final int columnNum;
-       
-       public PropertyTableArrayImpl(int rowNum, int columnNum){
-               rowList = new ArrayList<Node>(rowNum);
-               columnList = new ArrayList<Node>(columnNum);
-               rowKeyToIndex = new HashMap<Node, Integer>();
-               columnKeyToIndex = new HashMap<Node, Integer>();
-               this.rowNum = rowNum;
-               this.columnNum = columnNum;
-               array = new Node [rowNum][columnNum];
-       }
-
-       @Override
-       public ExtendedIterator<Triple> getTripleIterator(Column column, Node 
value) {
-               if (column == null || column.getColumnKey() == null)
-                       throw new NullPointerException("column is null");
-               
-               if (value == null){
-                       throw new NullPointerException("value is null");
-               }
-               
-               ArrayList<Triple> triples = new ArrayList<Triple>();
-               
-               Node p = column.getColumnKey();
-               Integer columnIndex = this.columnKeyToIndex.get(p);
-               if (columnIndex != null){
-                       for(int rowIndex=0; rowIndex< 
rowList.size();rowIndex++){
-                               if ( value.equals( this.get(rowIndex, 
columnIndex))){
-                                       
triples.add(Triple.create(rowList.get(rowIndex), p, value));
-                               }
-                       }
-               }
-               return WrappedIterator.create(triples.iterator());
-       }
-
-       @Override
-       public ExtendedIterator<Triple> getTripleIterator(Column column) {
-               
-               if (column == null || column.getColumnKey() == null)
-                       throw new NullPointerException("column is null");
-               
-               ArrayList<Triple> triples = new ArrayList<Triple>();
-               
-               Node p = column.getColumnKey();
-               Integer columnIndex = this.columnKeyToIndex.get(p);
-               if (columnIndex != null){
-                       for(int rowIndex=0; rowIndex< 
rowList.size();rowIndex++){
-                               if(this.get(rowIndex, columnIndex)!=null){
-                                       
triples.add(Triple.create(rowList.get(rowIndex), p, this.get(rowIndex, 
columnIndex)));
-                               }
-                       }
-               }
-               return WrappedIterator.create(triples.iterator());
-       }
-
-       @Override
-       public ExtendedIterator<Triple> getTripleIterator(Node value) {
-               if (value == null)
-                       throw new NullPointerException("value is null");
-               
-               IteratorConcat<Triple> iter = new IteratorConcat<Triple>();
-               for (Column column : this.getColumns()) {
-                       ExtendedIterator<Triple> eIter = 
getTripleIterator(column,value);
-                       iter.add(eIter);
-               }
-               return WrappedIterator.create(Iter.distinct(iter));
-       }
-
-       @Override
-       public ExtendedIterator<Triple> getTripleIterator(Row row) {
-               if (row == null || row.getRowKey() == null)
-                       throw new NullPointerException("row is null");
-               
-               ArrayList<Triple> triples = new ArrayList<Triple>();
-           Integer rowIndex = this.rowKeyToIndex.get(row.getRowKey());
-
-               if (rowIndex != null){
-                       for(int columnIndex=0; columnIndex < columnList.size(); 
columnIndex++){
-                               triples.add(Triple.create( row.getRowKey(), 
columnList.get(columnIndex), this.get(rowIndex, columnIndex)));
-                       }
-               }
-               return WrappedIterator.create(triples.iterator());
-       }
-
-       @Override
-       public ExtendedIterator<Triple> getTripleIterator() {
-
-               IteratorConcat<Triple> iter = new IteratorConcat<Triple>();
-               for (Column column : getColumns()) {
-                       iter.add(getTripleIterator(column));
-               }
-               return WrappedIterator.create(Iter.distinct(iter));
-       }
-
-       @Override
-       public Collection<Column> getColumns() {
-               Collection<Column> columns = new ArrayList<Column>();
-               for(Node p: columnKeyToIndex.keySet() ){
-                       columns.add(new ColumnImpl(this, p));
-               }
-               return columns;
-       }
-
-       @Override
-       public Column getColumn(Node p) {
-               if (p == null)
-                       throw new NullPointerException("column name is null");
-           Integer columnIndex = columnKeyToIndex.get(p);
-           return (columnIndex == null)
-               ? null : new ColumnImpl(this, p);
-       }
-
-       @Override
-       public Column createColumn(Node p) {
-               if (p == null)
-                       throw new NullPointerException("column name is null");
-
-               if (columnKeyToIndex.containsKey(p))
-                       throw new IllegalArgumentException("column already 
exists: '"
-                                       + p.toString());
-               
-               if (columnList.size()>= columnNum)
-                       throw new IllegalArgumentException("cannot create new 
column for max column count: " + columnNum);
-               
-               columnList.add(p);
-               columnKeyToIndex.put(p, columnList.indexOf(p));
-               return getColumn(p);
-       }
-
-       @Override
-       public Row getRow(Node s) {
-               if (s == null)
-                       throw new NullPointerException("subject node is null");
-               
-               Integer rowIndex = rowKeyToIndex.get(s);
-               return (rowIndex == null) ? null : new InternalRow(rowIndex);
-       }
-
-       @Override
-       public Row createRow(Node s) {
-               Row row = this.getRow(s);
-               if (row != null)
-                       return row;
-
-               if (rowList.size()>= rowNum)
-                       throw new IllegalArgumentException("cannot create new 
row for max row count: " + rowNum);
-               
-               rowList.add(s);
-               int rowIndex = rowList.indexOf(s);
-               rowKeyToIndex.put(s, rowIndex);         
-               
-               return new InternalRow(rowIndex);
-       }
-       
-       private void set(int rowIndex, int columnIndex, Node value) {
-               
-               if (rowIndex >= rowList.size())
-                       throw new IllegalArgumentException("row index out of 
bound: " + rowList.size());
-               if (columnIndex >= columnList.size())
-                       throw new IllegalArgumentException("column index out of 
bound: " + columnList.size());
-               array[rowIndex][columnIndex] = value;
-       }
-       
-       public Node get(int rowIndex, int columnIndex) {
-           if (rowIndex >= rowList.size())
-                       throw new IllegalArgumentException("row index out of 
bound: " + rowList.size());
-               if (columnIndex >= columnList.size())
-                       throw new IllegalArgumentException("column index out of 
bound: " + columnList.size());
-               return array[rowIndex][columnIndex];
-    }
-
-       @Override
-       public List<Row> getAllRows() {
-               ArrayList<Row> rows = new ArrayList<Row>();
-               for (int rowIndex=0;rowIndex<rowList.size();rowIndex++){
-                       rows.add( new InternalRow(rowIndex));
-               }
-               return rows;
-       }
-
-       @Override
-       public List<Node> getColumnValues(Column column) {
-               if (column == null || column.getColumnKey() == null)
-                       throw new NullPointerException("column is null");
-               
-               Node p = column.getColumnKey();
-               Integer columnIndex = this.columnKeyToIndex.get(p);
-               
-               List<Node> list = new ArrayList<Node>();
-               
-               if (columnIndex != null){
-                       for(int rowIndex=0; rowIndex< 
rowList.size();rowIndex++){
-                               if(this.get(rowIndex, columnIndex)!=null){
-                                       list.add(this.get(rowIndex, 
columnIndex));
-                               }
-                       }
-               }
-               return list;
-       }
-       
-
-       @Override
-       public Collection<Row> getMatchingRows(Column column, Node value) {
-               
-               if (column == null || column.getColumnKey() == null)
-                       throw new NullPointerException("column is null");
-               
-               if (value == null){
-                       throw new NullPointerException("value is null");
-               }
-               
-               final ArrayList<Row> matchingRows = new ArrayList<Row>();
-               
-               Node p = column.getColumnKey();
-               Integer columnIndex = this.columnKeyToIndex.get(p);
-               if (columnIndex != null){
-                       for(int rowIndex=0; rowIndex< 
rowList.size();rowIndex++){
-                               if ( value.equals( this.get(rowIndex, 
columnIndex))){
-                                       matchingRows.add( this.getRow( 
rowList.get(rowIndex) ));
-                               }
-                       }
-               }
-               return matchingRows;
-       }
-       
-       private final class InternalRow implements Row {
-
-           final int rowIndex;
-
-           InternalRow(int rowIndex) {
-             this.rowIndex = rowIndex;
-           }
-               
-               @Override
-               public PropertyTable getTable() {
-                       return PropertyTableArrayImpl.this;
-               }
-
-               @Override
-               public void setValue(Column column, Node value) {
-                       if (column == null || column.getColumnKey() == null)
-                               throw new NullPointerException("column is 
null");
-                       
-                   Integer columnIndex = 
columnKeyToIndex.get(column.getColumnKey());
-                   if (columnIndex == null)
-                       throw new IllegalArgumentException("column index does 
not exist: " + column.getColumnKey());
-
-                   set(rowIndex, columnIndex, value);
-                       
-               }
-
-               @Override
-               public Node getValue(Column column) {
-                       if (column == null)
-                               throw new NullPointerException("column is 
null");
-                       return this.getValue(column.getColumnKey());
-               }
-
-               @Override
-               public Node getValue(Node columnKey) {
-                       if (columnKey == null)
-                               throw new NullPointerException("column key is 
null");
-                       
-                   Integer columnIndex = columnKeyToIndex.get(columnKey);
-                   if (columnIndex == null)
-                       throw new IllegalArgumentException("column index does 
not exist: " + columnKey);
-                   
-                   return get(rowIndex, columnIndex);
-               }
-
-               @Override
-               public Node getRowKey() {
-                       return rowList.get(rowIndex);
-               }
-
-               @Override
-               public ExtendedIterator<Triple> getTripleIterator() {
-                       ArrayList<Triple> triples = new ArrayList<Triple>();
-                       for (int 
columnIndex=0;columnIndex<columnList.size();columnIndex++) {
-                               triples.add(Triple.create(getRowKey(), 
columnList.get(columnIndex), get(rowIndex, columnIndex)));
-                       }
-                       return WrappedIterator.create(triples.iterator());
-               }
-
-               @Override
-               public Collection<Column> getColumns() {
-                       return PropertyTableArrayImpl.this.getColumns();
-               }
-               
-       }
-
-
-
-
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jena.propertytable.impl;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.jena.atlas.iterator.Iter;
+import org.apache.jena.atlas.iterator.IteratorConcat;
+import org.apache.jena.graph.Node ;
+import org.apache.jena.graph.Triple ;
+import org.apache.jena.propertytable.Column;
+import org.apache.jena.propertytable.PropertyTable;
+import org.apache.jena.propertytable.Row;
+import org.apache.jena.util.iterator.ExtendedIterator ;
+import org.apache.jena.util.iterator.WrappedIterator ;
+
+/**
+ * A PropertyTable Implementation using a two dimension array.
+ * It contains SPO and PSO indexes.
+ * 
+ */
+public class PropertyTableArrayImpl implements PropertyTable {
+       
+       private final List<Node> rowList;
+       private final List<Node> columnList;
+
+       private final Map<Node, Integer> rowKeyToIndex;
+       private final Map<Node, Integer> columnKeyToIndex;
+       private final Node[][] array;
+       private final int rowNum;
+       private final int columnNum;
+       
+       public PropertyTableArrayImpl(int rowNum, int columnNum){
+               rowList = new ArrayList<Node>(rowNum);
+               columnList = new ArrayList<Node>(columnNum);
+               rowKeyToIndex = new HashMap<Node, Integer>();
+               columnKeyToIndex = new HashMap<Node, Integer>();
+               this.rowNum = rowNum;
+               this.columnNum = columnNum;
+               array = new Node [rowNum][columnNum];
+       }
+
+       @Override
+       public ExtendedIterator<Triple> getTripleIterator(Column column, Node 
value) {
+               if (column == null || column.getColumnKey() == null)
+                       throw new NullPointerException("column is null");
+               
+               if (value == null){
+                       throw new NullPointerException("value is null");
+               }
+               
+               ArrayList<Triple> triples = new ArrayList<Triple>();
+               
+               Node p = column.getColumnKey();
+               Integer columnIndex = this.columnKeyToIndex.get(p);
+               if (columnIndex != null){
+                       for(int rowIndex=0; rowIndex< 
rowList.size();rowIndex++){
+                               if ( value.equals( this.get(rowIndex, 
columnIndex))){
+                                       
triples.add(Triple.create(rowList.get(rowIndex), p, value));
+                               }
+                       }
+               }
+               return WrappedIterator.create(triples.iterator());
+       }
+
+       @Override
+       public ExtendedIterator<Triple> getTripleIterator(Column column) {
+               
+               if (column == null || column.getColumnKey() == null)
+                       throw new NullPointerException("column is null");
+               
+               ArrayList<Triple> triples = new ArrayList<Triple>();
+               
+               Node p = column.getColumnKey();
+               Integer columnIndex = this.columnKeyToIndex.get(p);
+               if (columnIndex != null){
+                       for(int rowIndex=0; rowIndex< 
rowList.size();rowIndex++){
+                               if(this.get(rowIndex, columnIndex)!=null){
+                                       
triples.add(Triple.create(rowList.get(rowIndex), p, this.get(rowIndex, 
columnIndex)));
+                               }
+                       }
+               }
+               return WrappedIterator.create(triples.iterator());
+       }
+
+       @Override
+       public ExtendedIterator<Triple> getTripleIterator(Node value) {
+               if (value == null)
+                       throw new NullPointerException("value is null");
+               
+               IteratorConcat<Triple> iter = new IteratorConcat<Triple>();
+               for (Column column : this.getColumns()) {
+                       ExtendedIterator<Triple> eIter = 
getTripleIterator(column,value);
+                       iter.add(eIter);
+               }
+               return WrappedIterator.create(Iter.distinct(iter));
+       }
+
+       @Override
+       public ExtendedIterator<Triple> getTripleIterator(Row row) {
+               if (row == null || row.getRowKey() == null)
+                       throw new NullPointerException("row is null");
+               
+               ArrayList<Triple> triples = new ArrayList<Triple>();
+           Integer rowIndex = this.rowKeyToIndex.get(row.getRowKey());
+
+               if (rowIndex != null){
+                       for(int columnIndex=0; columnIndex < columnList.size(); 
columnIndex++){
+                               triples.add(Triple.create( row.getRowKey(), 
columnList.get(columnIndex), this.get(rowIndex, columnIndex)));
+                       }
+               }
+               return WrappedIterator.create(triples.iterator());
+       }
+
+       @Override
+       public ExtendedIterator<Triple> getTripleIterator() {
+
+               IteratorConcat<Triple> iter = new IteratorConcat<Triple>();
+               for (Column column : getColumns()) {
+                       iter.add(getTripleIterator(column));
+               }
+               return WrappedIterator.create(Iter.distinct(iter));
+       }
+
+       @Override
+       public Collection<Column> getColumns() {
+               Collection<Column> columns = new ArrayList<Column>();
+               for(Node p: columnKeyToIndex.keySet() ){
+                       columns.add(new ColumnImpl(this, p));
+               }
+               return columns;
+       }
+
+       @Override
+       public Column getColumn(Node p) {
+               if (p == null)
+                       throw new NullPointerException("column name is null");
+           Integer columnIndex = columnKeyToIndex.get(p);
+           return (columnIndex == null)
+               ? null : new ColumnImpl(this, p);
+       }
+
+       @Override
+       public Column createColumn(Node p) {
+               if (p == null)
+                       throw new NullPointerException("column name is null");
+
+               if (columnKeyToIndex.containsKey(p))
+                       throw new IllegalArgumentException("column already 
exists: '"
+                                       + p.toString());
+               
+               if (columnList.size()>= columnNum)
+                       throw new IllegalArgumentException("cannot create new 
column for max column count: " + columnNum);
+               
+               columnList.add(p);
+               columnKeyToIndex.put(p, columnList.indexOf(p));
+               return getColumn(p);
+       }
+
+       @Override
+       public Row getRow(Node s) {
+               if (s == null)
+                       throw new NullPointerException("subject node is null");
+               
+               Integer rowIndex = rowKeyToIndex.get(s);
+               return (rowIndex == null) ? null : new InternalRow(rowIndex);
+       }
+
+       @Override
+       public Row createRow(Node s) {
+               Row row = this.getRow(s);
+               if (row != null)
+                       return row;
+
+               if (rowList.size()>= rowNum)
+                       throw new IllegalArgumentException("cannot create new 
row for max row count: " + rowNum);
+               
+               rowList.add(s);
+               int rowIndex = rowList.indexOf(s);
+               rowKeyToIndex.put(s, rowIndex);         
+               
+               return new InternalRow(rowIndex);
+       }
+       
+       private void set(int rowIndex, int columnIndex, Node value) {
+               
+               if (rowIndex >= rowList.size())
+                       throw new IllegalArgumentException("row index out of 
bound: " + rowList.size());
+               if (columnIndex >= columnList.size())
+                       throw new IllegalArgumentException("column index out of 
bound: " + columnList.size());
+               array[rowIndex][columnIndex] = value;
+       }
+       
+       public Node get(int rowIndex, int columnIndex) {
+           if (rowIndex >= rowList.size())
+                       throw new IllegalArgumentException("row index out of 
bound: " + rowList.size());
+               if (columnIndex >= columnList.size())
+                       throw new IllegalArgumentException("column index out of 
bound: " + columnList.size());
+               return array[rowIndex][columnIndex];
+    }
+
+       @Override
+       public List<Row> getAllRows() {
+               ArrayList<Row> rows = new ArrayList<Row>();
+               for (int rowIndex=0;rowIndex<rowList.size();rowIndex++){
+                       rows.add( new InternalRow(rowIndex));
+               }
+               return rows;
+       }
+
+       @Override
+       public List<Node> getColumnValues(Column column) {
+               if (column == null || column.getColumnKey() == null)
+                       throw new NullPointerException("column is null");
+               
+               Node p = column.getColumnKey();
+               Integer columnIndex = this.columnKeyToIndex.get(p);
+               
+               List<Node> list = new ArrayList<Node>();
+               
+               if (columnIndex != null){
+                       for(int rowIndex=0; rowIndex< 
rowList.size();rowIndex++){
+                               if(this.get(rowIndex, columnIndex)!=null){
+                                       list.add(this.get(rowIndex, 
columnIndex));
+                               }
+                       }
+               }
+               return list;
+       }
+       
+
+       @Override
+       public Collection<Row> getMatchingRows(Column column, Node value) {
+               
+               if (column == null || column.getColumnKey() == null)
+                       throw new NullPointerException("column is null");
+               
+               if (value == null){
+                       throw new NullPointerException("value is null");
+               }
+               
+               final ArrayList<Row> matchingRows = new ArrayList<Row>();
+               
+               Node p = column.getColumnKey();
+               Integer columnIndex = this.columnKeyToIndex.get(p);
+               if (columnIndex != null){
+                       for(int rowIndex=0; rowIndex< 
rowList.size();rowIndex++){
+                               if ( value.equals( this.get(rowIndex, 
columnIndex))){
+                                       matchingRows.add( this.getRow( 
rowList.get(rowIndex) ));
+                               }
+                       }
+               }
+               return matchingRows;
+       }
+       
+       private final class InternalRow implements Row {
+
+           final int rowIndex;
+
+           InternalRow(int rowIndex) {
+             this.rowIndex = rowIndex;
+           }
+               
+               @Override
+               public PropertyTable getTable() {
+                       return PropertyTableArrayImpl.this;
+               }
+
+               @Override
+               public void setValue(Column column, Node value) {
+                       if (column == null || column.getColumnKey() == null)
+                               throw new NullPointerException("column is 
null");
+                       
+                   Integer columnIndex = 
columnKeyToIndex.get(column.getColumnKey());
+                   if (columnIndex == null)
+                       throw new IllegalArgumentException("column index does 
not exist: " + column.getColumnKey());
+
+                   set(rowIndex, columnIndex, value);
+                       
+               }
+
+               @Override
+               public Node getValue(Column column) {
+                       if (column == null)
+                               throw new NullPointerException("column is 
null");
+                       return this.getValue(column.getColumnKey());
+               }
+
+               @Override
+               public Node getValue(Node columnKey) {
+                       if (columnKey == null)
+                               throw new NullPointerException("column key is 
null");
+                       
+                   Integer columnIndex = columnKeyToIndex.get(columnKey);
+                   if (columnIndex == null)
+                       throw new IllegalArgumentException("column index does 
not exist: " + columnKey);
+                   
+                   return get(rowIndex, columnIndex);
+               }
+
+               @Override
+               public Node getRowKey() {
+                       return rowList.get(rowIndex);
+               }
+
+               @Override
+               public ExtendedIterator<Triple> getTripleIterator() {
+                       ArrayList<Triple> triples = new ArrayList<Triple>();
+                       for (int 
columnIndex=0;columnIndex<columnList.size();columnIndex++) {
+                               triples.add(Triple.create(getRowKey(), 
columnList.get(columnIndex), get(rowIndex, columnIndex)));
+                       }
+                       return WrappedIterator.create(triples.iterator());
+               }
+
+               @Override
+               public Collection<Column> getColumns() {
+                       return PropertyTableArrayImpl.this.getColumns();
+               }
+               
+       }
+
+
+
+
+}

http://git-wip-us.apache.org/repos/asf/jena/blob/3d70d735/jena-csv/src/main/java/org/apache/jena/propertytable/impl/PropertyTableBuilder.java
----------------------------------------------------------------------
diff --git 
a/jena-csv/src/main/java/org/apache/jena/propertytable/impl/PropertyTableBuilder.java
 
b/jena-csv/src/main/java/org/apache/jena/propertytable/impl/PropertyTableBuilder.java
index a0c5af1..0532dc9 100644
--- 
a/jena-csv/src/main/java/org/apache/jena/propertytable/impl/PropertyTableBuilder.java
+++ 
b/jena-csv/src/main/java/org/apache/jena/propertytable/impl/PropertyTableBuilder.java
@@ -1,135 +1,135 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.jena.propertytable.impl;
-
-import java.io.InputStream ;
-import java.util.ArrayList ;
-import java.util.Iterator ;
-import java.util.List ;
-
-import org.apache.jena.atlas.csv.CSVParser ;
-import org.apache.jena.atlas.io.IO ;
-import org.apache.jena.datatypes.xsd.XSDDatatype ;
-import org.apache.jena.graph.Node ;
-import org.apache.jena.graph.NodeFactory ;
-import org.apache.jena.propertytable.PropertyTable ;
-import org.apache.jena.propertytable.Row ;
-import org.apache.jena.propertytable.lang.LangCSV ;
-import org.apache.jena.riot.system.IRIResolver ;
-
-
-/**
- * A tool for constructing PropertyTable from a file (e.g., a CSV file).
- * 
- *
- */
-public class PropertyTableBuilder {
-       
-       public static Node CSV_ROW_NODE = 
NodeFactory.createURI(LangCSV.CSV_ROW);
-       
-       public static PropertyTable buildPropetyTableHashMapImplFromCsv(String 
csvFilePath) {           
-               PropertyTable table = new PropertyTableHashMapImpl();
-               return fillPropertyTable(table, csvFilePath);
-       }
-       
-       public static PropertyTable buildPropetyTableArrayImplFromCsv(String 
csvFilePath) {
-               PropertyTable table = 
createEmptyPropertyTableArrayImpl(csvFilePath);
-               return fillPropertyTable(table, csvFilePath);
-       }
-       
-       private static PropertyTable createEmptyPropertyTableArrayImpl (String 
csvFilePath) {
-               CSVParser parser = CSVParser.create(csvFilePath);
-               List<String> rowLine = null;
-               int rowNum = 0;
-               int columnNum = 0;
-               
-               while ((rowLine = parser.parse1()) != null) {
-                       if (rowNum == 0) {
-                               columnNum = rowLine.size();
-                       }
-                       rowNum++;
-               }
-               if (rowNum!=0 && columnNum!=0){
-                       return new PropertyTableArrayImpl(rowNum, columnNum+1);
-               } else {
-                       return null;
-               }
-       }
-
-       protected static PropertyTable fillPropertyTable(PropertyTable table, 
String csvFilePath ){
-               InputStream input = IO.openFile(csvFilePath) ;
-               CSVParser iterator = CSVParser.create(input) ;
-               return fillPropertyTable(table, iterator, csvFilePath);
-       }
-       
-       protected static PropertyTable fillPropertyTable(PropertyTable table, 
CSVParser parser, String csvFilePath){
-               if (table == null){
-                       return null;
-               }
-               ArrayList<Node> predicates = new ArrayList<Node>();
-               int rowNum = 0;
-               
-               Iterator<List<String>> iter = parser.iterator() ;
-               if ( ! iter.hasNext() )
-                   return table ;
-               List<String> row1 = iter.next() ;
-               table.createColumn(CSV_ROW_NODE);
-        for (String column : row1) {
-            String uri = createColumnKeyURI(csvFilePath, column);
-            Node p = NodeFactory.createURI(uri);
-            predicates.add(p);
-            table.createColumn(p);
-        }
-        
-        rowNum++ ;
-        while(iter.hasNext()) {
-            List<String> rowLine = iter.next();
-            Node subject = LangCSV.caculateSubject(rowNum, csvFilePath);
-            Row row = table.createRow(subject);
-
-            row.setValue(table.getColumn(CSV_ROW_NODE), 
-                         NodeFactory.createLiteral((rowNum + ""), 
XSDDatatype.XSDinteger));
-
-            for (int col = 0; col < rowLine.size() && col<predicates.size(); 
col++) {
-
-                String columnValue = rowLine.get(col).trim();
-                if("".equals(columnValue)){
-                    continue;
-                }
-                Node o;
-                try {
-                    // Try for a double.
-                    double d = Double.parseDouble(columnValue);
-                    o = NodeFactory.createLiteral(columnValue,
-                                                  XSDDatatype.XSDdouble);
-                } catch (Exception e) {
-                    o = NodeFactory.createLiteral(columnValue);
-                }
-                row.setValue(table.getColumn(predicates.get(col)), o);
-            }
-            rowNum++ ;
-        }
-        return table;
-       }
-       
-       protected static String createColumnKeyURI(String csvFilePath, String 
column){
-               String uri = IRIResolver.resolveString(csvFilePath) + "#" + 
LangCSV.toSafeLocalname(column);
-               return uri;
-       }
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jena.propertytable.impl;
+
+import java.io.InputStream ;
+import java.util.ArrayList ;
+import java.util.Iterator ;
+import java.util.List ;
+
+import org.apache.jena.atlas.csv.CSVParser ;
+import org.apache.jena.atlas.io.IO ;
+import org.apache.jena.datatypes.xsd.XSDDatatype ;
+import org.apache.jena.graph.Node ;
+import org.apache.jena.graph.NodeFactory ;
+import org.apache.jena.propertytable.PropertyTable ;
+import org.apache.jena.propertytable.Row ;
+import org.apache.jena.propertytable.lang.LangCSV ;
+import org.apache.jena.riot.system.IRIResolver ;
+
+
+/**
+ * A tool for constructing PropertyTable from a file (e.g., a CSV file).
+ * 
+ *
+ */
+public class PropertyTableBuilder {
+       
+       public static Node CSV_ROW_NODE = 
NodeFactory.createURI(LangCSV.CSV_ROW);
+       
+       public static PropertyTable buildPropetyTableHashMapImplFromCsv(String 
csvFilePath) {           
+               PropertyTable table = new PropertyTableHashMapImpl();
+               return fillPropertyTable(table, csvFilePath);
+       }
+       
+       public static PropertyTable buildPropetyTableArrayImplFromCsv(String 
csvFilePath) {
+               PropertyTable table = 
createEmptyPropertyTableArrayImpl(csvFilePath);
+               return fillPropertyTable(table, csvFilePath);
+       }
+       
+       private static PropertyTable createEmptyPropertyTableArrayImpl (String 
csvFilePath) {
+               CSVParser parser = CSVParser.create(csvFilePath);
+               List<String> rowLine = null;
+               int rowNum = 0;
+               int columnNum = 0;
+               
+               while ((rowLine = parser.parse1()) != null) {
+                       if (rowNum == 0) {
+                               columnNum = rowLine.size();
+                       }
+                       rowNum++;
+               }
+               if (rowNum!=0 && columnNum!=0){
+                       return new PropertyTableArrayImpl(rowNum, columnNum+1);
+               } else {
+                       return null;
+               }
+       }
+
+       protected static PropertyTable fillPropertyTable(PropertyTable table, 
String csvFilePath ){
+               InputStream input = IO.openFile(csvFilePath) ;
+               CSVParser iterator = CSVParser.create(input) ;
+               return fillPropertyTable(table, iterator, csvFilePath);
+       }
+       
+       protected static PropertyTable fillPropertyTable(PropertyTable table, 
CSVParser parser, String csvFilePath){
+               if (table == null){
+                       return null;
+               }
+               ArrayList<Node> predicates = new ArrayList<Node>();
+               int rowNum = 0;
+               
+               Iterator<List<String>> iter = parser.iterator() ;
+               if ( ! iter.hasNext() )
+                   return table ;
+               List<String> row1 = iter.next() ;
+               table.createColumn(CSV_ROW_NODE);
+        for (String column : row1) {
+            String uri = createColumnKeyURI(csvFilePath, column);
+            Node p = NodeFactory.createURI(uri);
+            predicates.add(p);
+            table.createColumn(p);
+        }
+        
+        rowNum++ ;
+        while(iter.hasNext()) {
+            List<String> rowLine = iter.next();
+            Node subject = LangCSV.caculateSubject(rowNum, csvFilePath);
+            Row row = table.createRow(subject);
+
+            row.setValue(table.getColumn(CSV_ROW_NODE), 
+                         NodeFactory.createLiteral((rowNum + ""), 
XSDDatatype.XSDinteger));
+
+            for (int col = 0; col < rowLine.size() && col<predicates.size(); 
col++) {
+
+                String columnValue = rowLine.get(col).trim();
+                if("".equals(columnValue)){
+                    continue;
+                }
+                Node o;
+                try {
+                    // Try for a double.
+                    double d = Double.parseDouble(columnValue);
+                    o = NodeFactory.createLiteral(columnValue,
+                                                  XSDDatatype.XSDdouble);
+                } catch (Exception e) {
+                    o = NodeFactory.createLiteral(columnValue);
+                }
+                row.setValue(table.getColumn(predicates.get(col)), o);
+            }
+            rowNum++ ;
+        }
+        return table;
+       }
+       
+       protected static String createColumnKeyURI(String csvFilePath, String 
column){
+               String uri = IRIResolver.resolveString(csvFilePath) + "#" + 
LangCSV.toSafeLocalname(column);
+               return uri;
+       }
+}

http://git-wip-us.apache.org/repos/asf/jena/blob/3d70d735/jena-csv/src/main/java/org/apache/jena/propertytable/impl/PropertyTableHashMapImpl.java
----------------------------------------------------------------------
diff --git 
a/jena-csv/src/main/java/org/apache/jena/propertytable/impl/PropertyTableHashMapImpl.java
 
b/jena-csv/src/main/java/org/apache/jena/propertytable/impl/PropertyTableHashMapImpl.java
index 45ec40f..622b3f1 100644
--- 
a/jena-csv/src/main/java/org/apache/jena/propertytable/impl/PropertyTableHashMapImpl.java
+++ 
b/jena-csv/src/main/java/org/apache/jena/propertytable/impl/PropertyTableHashMapImpl.java
@@ -1,352 +1,352 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.jena.propertytable.impl;
-
-import java.util.* ;
-import java.util.Map.Entry;
-
-import org.apache.jena.atlas.iterator.Iter;
-import org.apache.jena.atlas.iterator.IteratorConcat;
-import org.apache.jena.ext.com.google.common.collect.HashMultimap;
-import org.apache.jena.ext.com.google.common.collect.SetMultimap ;
-import org.apache.jena.graph.Node ;
-import org.apache.jena.graph.Triple ;
-import org.apache.jena.propertytable.Column;
-import org.apache.jena.propertytable.PropertyTable;
-import org.apache.jena.propertytable.Row;
-import org.apache.jena.util.iterator.ExtendedIterator ;
-import org.apache.jena.util.iterator.NullIterator ;
-import org.apache.jena.util.iterator.WrappedIterator ;
-
-/**
- * A PropertyTable Implementation using HashMap.
- * It contains PSO and POS indexes.
- * 
- */
-public class PropertyTableHashMapImpl implements PropertyTable {
-
-       private Map<Node, Column> columnIndex; // Maps property Node key to 
Column
-       private List<Column> columnList; // Stores the list of columns in the 
table
-       private Map<Node, Row> rowIndex; // Maps the subject Node key to Row.
-       private List<Row> rowList; // Stores the list of rows in the table
-
-       // PSO index
-       // Maps column Node to (subject Node, value) pairs
-       private Map<Node, Map<Node, Node>> valueIndex; 
-       // POS index
-       // Maps column Node to (value, subject Node) pairs
-       private Map<Node, SetMultimap<Node, Node>> valueReverseIndex; 
-
-       PropertyTableHashMapImpl() {
-               columnIndex = new HashMap<Node, Column>();
-               columnList = new ArrayList<Column>();
-               rowIndex = new HashMap<Node, Row>();
-               rowList = new ArrayList<Row>();
-               valueIndex = new HashMap<Node, Map<Node, Node>>();
-               valueReverseIndex = new HashMap<Node, SetMultimap<Node, 
Node>>();
-       }
-
-       @Override
-       public ExtendedIterator<Triple> getTripleIterator() {
-               
-               // use PSO index to scan all the table (slow)
-               IteratorConcat<Triple> iter = new IteratorConcat<Triple>();
-               for (Column column : getColumns()) {
-                       iter.add(getTripleIterator(column));
-               }
-               return WrappedIterator.create(Iter.distinct(iter));
-       }
-
-       @Override
-       public ExtendedIterator<Triple> getTripleIterator(Column column) {
-               
-               // use PSO index directly (fast)
-               
-               if (column == null || column.getColumnKey() == null)
-                       throw new NullPointerException("column is null");
-               
-               ArrayList<Triple> triples = new ArrayList<Triple>();
-               Map<Node, Node> values = valueIndex.get(column.getColumnKey());
-
-               for (Entry<Node, Node> entry : values.entrySet()) {
-                       Node subject = entry.getKey();
-                       Node value = entry.getValue();
-                       triples.add(Triple.create(subject, 
column.getColumnKey(), value));
-               }
-               return WrappedIterator.create(triples.iterator());
-       }
-
-       @Override
-       public ExtendedIterator<Triple> getTripleIterator(Node value) {
-               
-               // use POS index ( O(n), n= column count )
-               
-               if (value == null)
-                       throw new NullPointerException("value is null");
-               
-               IteratorConcat<Triple> iter = new IteratorConcat<Triple>();
-               for (Column column : this.getColumns()) {
-                       ExtendedIterator<Triple> eIter = 
getTripleIterator(column,value);
-                       iter.add(eIter);
-               }
-               return WrappedIterator.create(Iter.distinct(iter));
-       }
-
-       @Override
-       public ExtendedIterator<Triple> getTripleIterator(Column column, Node 
value) {
-               
-               // use POS index directly (fast)
-               
-               if (column == null || column.getColumnKey() == null)
-                       throw new NullPointerException("column is null");
-               
-               if (value == null)
-                       throw new NullPointerException("value is null");
-               
-               
-               Node p = column.getColumnKey();
-               final SetMultimap<Node, Node> valueToSubjectMap = 
valueReverseIndex.get(p);
-               if ( valueToSubjectMap == null ) 
-                   return NullIterator.instance() ;
-               final Set<Node> subjects = valueToSubjectMap.get(value);
-               ArrayList<Triple> triples = new ArrayList<Triple>();
-               for (Node subject : subjects) {
-                   triples.add(Triple.create(subject, p, value));
-               }
-               return WrappedIterator.create(triples.iterator());
-       }
-
-
-       @Override
-       public ExtendedIterator<Triple> getTripleIterator(Row row) {
-               // use PSO index ( O(n), n= column count )
-               
-               if (row == null || row.getRowKey() == null)
-                       throw new NullPointerException("row is null");
-               
-               ArrayList<Triple> triples = new ArrayList<Triple>();
-               for (Column column : getColumns()) {
-                       Node value = row.getValue(column);
-                       triples.add(Triple.create(row.getRowKey(), 
column.getColumnKey(), value));
-               }
-               return WrappedIterator.create(triples.iterator());
-       }
-
-       @Override
-       public Collection<Column> getColumns() {
-               return columnList;
-       }
-
-       @Override
-       public Column getColumn(Node p) {
-               if (p == null)
-                       throw new NullPointerException("column node is null");
-               return columnIndex.get(p);
-       }
-
-       @Override
-       public Column createColumn(Node p) {
-               if (p == null)
-                       throw new NullPointerException("column node is null");
-
-               if (columnIndex.containsKey(p))
-                       throw new IllegalArgumentException("column already 
exists: '"
-                                       + p.toString());
-
-               columnIndex.put(p, new ColumnImpl(this, p));
-               columnList.add(columnIndex.get(p));
-               valueIndex.put(p, new HashMap<Node, Node>());
-               valueReverseIndex.put(p, HashMultimap.create());
-               return getColumn(p);
-       }
-
-       @Override
-       public Row getRow(final Node s) {
-               if (s == null)
-                       throw new NullPointerException("subject node is null");
-               Row row = rowIndex.get(s);
-               return row;
-
-       }
-       
-       @Override
-       public Row createRow(final Node s){
-               Row row = this.getRow(s);
-               if (row != null)
-                       return row;
-
-               row = new InternalRow(s);
-               rowIndex.put(s, row);
-               rowList.add(row);
-
-               return row;
-       }
-       
-       @Override
-       public List<Row> getAllRows() {
-               return rowList;
-       }
-
-       
-       
-       @Override
-       public List<Node> getColumnValues(Column column) {
-               if (column == null || column.getColumnKey() == null)
-                       throw new NullPointerException("column is null");
-               
-               Map<Node, Node> values = valueIndex.get(column.getColumnKey());
-
-               List<Node> list = new ArrayList<Node>(values.size());
-               list.addAll(values.values());
-               return list;
-       }
-       
-       @Override
-       public Collection<Row> getMatchingRows(Column column, Node value) {
-               if (column == null || column.getColumnKey() == null)
-                       throw new NullPointerException("column is null");
-               
-               if (value == null)
-                       throw new NullPointerException("value is null");
-               
-               
-               Node p = column.getColumnKey();
-               final SetMultimap<Node, Node> valueToSubjectMap = 
valueReverseIndex.get(p);
-               if ( valueToSubjectMap == null )
-                   return Collections.emptyList() ;
-               final Set<Node> subjects = valueToSubjectMap.get(value);
-               if ( subjects == null )
-                   return Collections.emptyList() ;
-               final ArrayList<Row> matchingRows = new ArrayList<Row>();
-               for (Node subject : subjects) {
-                   matchingRows.add(this.getRow(subject));
-               }
-               return matchingRows;
-       }
-
-       private final void setX(final Node s, final Node p, final Node value) {
-               if (p == null)
-                       throw new NullPointerException("column Node must not be 
null.");
-               if (value == null)
-                       throw new NullPointerException("value must not be 
null.");
-
-               Map<Node, Node> subjectToValueMap = valueIndex.get(p);
-               if (!columnIndex.containsKey(p) || subjectToValueMap == null)
-                       throw new IllegalArgumentException("column: '" + p
-                                       + "' does not yet exist.");
-
-               Node oldValue = subjectToValueMap.get(s);
-               subjectToValueMap.put(s, value);
-               addToReverseMap(p, s, oldValue, value);
-       }
-
-       private void addToReverseMap(final Node p, final Node s, final Node 
oldValue, final Node value) {
-
-               final SetMultimap<Node, Node> valueToSubjectMap = 
valueReverseIndex.get(p);
-               if ( valueToSubjectMap == null )
-            return ; 
-               valueToSubjectMap.remove(oldValue, s);
-               valueToSubjectMap.put(value, s);
-       }
-
-       private void unSetX(final Node s, final Node p) {
-
-               final Map<Node, Node> subjectToValueMap = valueIndex.get(p);
-               if (!columnIndex.containsKey(p) || subjectToValueMap == null)
-                       throw new IllegalArgumentException("column: '" + p
-                                       + "' does not yet exist.");
-
-               final Node value = subjectToValueMap.get(s);
-               if (value == null)
-                       return;
-
-               subjectToValueMap.remove(s);
-               removeFromReverseMap(p, s, value);
-       }
-
-       private void removeFromReverseMap(final Node p, final Node s,
-                       final Node value) {
-               final SetMultimap<Node, Node> valueTokeysMap = 
valueReverseIndex.get(p);
-               if ( valueTokeysMap == null )
-                   return ;
-               valueTokeysMap.remove(s, value);
-       }
-
-       private Node getX(final Node s, final Node p) {
-               final Map<Node, Node> subjectToValueMap = valueIndex.get(p);
-               if (!columnIndex.containsKey(p) || subjectToValueMap == null)
-                       throw new IllegalArgumentException("column: '" + p
-                                       + "' does not yet exist.");
-               return subjectToValueMap.get(s);
-       }
-
-       private final class InternalRow implements Row {
-               private final Node key;
-
-               InternalRow(final Node key) {
-                       this.key = key;
-               }
-
-               @Override
-               public void setValue(Column column, Node value) {
-                       if (value == null)
-                               unSetX(key, column.getColumnKey());
-                       else
-                               setX(key, column.getColumnKey(), value);
-               }
-
-               @Override
-               public Node getValue(Column column) {
-                       return getX(key, column.getColumnKey());
-               }
-               
-               @Override
-               public Node getValue(Node columnKey) {
-                       return getX(key, columnKey);
-               }
-
-               @Override
-               public PropertyTable getTable() {
-                       return PropertyTableHashMapImpl.this;
-               }
-
-               @Override
-               public Node getRowKey() {
-                       return key;
-               }
-
-               @Override
-               public Collection<Column> getColumns() {
-                       // TODO Auto-generated method stub
-                       return PropertyTableHashMapImpl.this.getColumns();
-               }
-
-               @Override
-               public ExtendedIterator<Triple> getTripleIterator() {
-                       ArrayList<Triple> triples = new ArrayList<Triple>();
-                       for (Column column : getColumns()) {
-                               Node value = this.getValue(column);
-                               triples.add(Triple.create(key, 
column.getColumnKey(), value));
-                       }
-                       return WrappedIterator.create(triples.iterator());
-               }
-
-       }
-
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jena.propertytable.impl;
+
+import java.util.* ;
+import java.util.Map.Entry;
+
+import org.apache.jena.atlas.iterator.Iter;
+import org.apache.jena.atlas.iterator.IteratorConcat;
+import org.apache.jena.ext.com.google.common.collect.HashMultimap;
+import org.apache.jena.ext.com.google.common.collect.SetMultimap ;
+import org.apache.jena.graph.Node ;
+import org.apache.jena.graph.Triple ;
+import org.apache.jena.propertytable.Column;
+import org.apache.jena.propertytable.PropertyTable;
+import org.apache.jena.propertytable.Row;
+import org.apache.jena.util.iterator.ExtendedIterator ;
+import org.apache.jena.util.iterator.NullIterator ;
+import org.apache.jena.util.iterator.WrappedIterator ;
+
+/**
+ * A PropertyTable Implementation using HashMap.
+ * It contains PSO and POS indexes.
+ * 
+ */
+public class PropertyTableHashMapImpl implements PropertyTable {
+
+       private Map<Node, Column> columnIndex; // Maps property Node key to 
Column
+       private List<Column> columnList; // Stores the list of columns in the 
table
+       private Map<Node, Row> rowIndex; // Maps the subject Node key to Row.
+       private List<Row> rowList; // Stores the list of rows in the table
+
+       // PSO index
+       // Maps column Node to (subject Node, value) pairs
+       private Map<Node, Map<Node, Node>> valueIndex; 
+       // POS index
+       // Maps column Node to (value, subject Node) pairs
+       private Map<Node, SetMultimap<Node, Node>> valueReverseIndex; 
+
+       PropertyTableHashMapImpl() {
+               columnIndex = new HashMap<Node, Column>();
+               columnList = new ArrayList<Column>();
+               rowIndex = new HashMap<Node, Row>();
+               rowList = new ArrayList<Row>();
+               valueIndex = new HashMap<Node, Map<Node, Node>>();
+               valueReverseIndex = new HashMap<Node, SetMultimap<Node, 
Node>>();
+       }
+
+       @Override
+       public ExtendedIterator<Triple> getTripleIterator() {
+               
+               // use PSO index to scan all the table (slow)
+               IteratorConcat<Triple> iter = new IteratorConcat<Triple>();
+               for (Column column : getColumns()) {
+                       iter.add(getTripleIterator(column));
+               }
+               return WrappedIterator.create(Iter.distinct(iter));
+       }
+
+       @Override
+       public ExtendedIterator<Triple> getTripleIterator(Column column) {
+               
+               // use PSO index directly (fast)
+               
+               if (column == null || column.getColumnKey() == null)
+                       throw new NullPointerException("column is null");
+               
+               ArrayList<Triple> triples = new ArrayList<Triple>();
+               Map<Node, Node> values = valueIndex.get(column.getColumnKey());
+
+               for (Entry<Node, Node> entry : values.entrySet()) {
+                       Node subject = entry.getKey();
+                       Node value = entry.getValue();
+                       triples.add(Triple.create(subject, 
column.getColumnKey(), value));
+               }
+               return WrappedIterator.create(triples.iterator());
+       }
+
+       @Override
+       public ExtendedIterator<Triple> getTripleIterator(Node value) {
+               
+               // use POS index ( O(n), n= column count )
+               
+               if (value == null)
+                       throw new NullPointerException("value is null");
+               
+               IteratorConcat<Triple> iter = new IteratorConcat<Triple>();
+               for (Column column : this.getColumns()) {
+                       ExtendedIterator<Triple> eIter = 
getTripleIterator(column,value);
+                       iter.add(eIter);
+               }
+               return WrappedIterator.create(Iter.distinct(iter));
+       }
+
+       @Override
+       public ExtendedIterator<Triple> getTripleIterator(Column column, Node 
value) {
+               
+               // use POS index directly (fast)
+               
+               if (column == null || column.getColumnKey() == null)
+                       throw new NullPointerException("column is null");
+               
+               if (value == null)
+                       throw new NullPointerException("value is null");
+               
+               
+               Node p = column.getColumnKey();
+               final SetMultimap<Node, Node> valueToSubjectMap = 
valueReverseIndex.get(p);
+               if ( valueToSubjectMap == null ) 
+                   return NullIterator.instance() ;
+               final Set<Node> subjects = valueToSubjectMap.get(value);
+               ArrayList<Triple> triples = new ArrayList<Triple>();
+               for (Node subject : subjects) {
+                   triples.add(Triple.create(subject, p, value));
+               }
+               return WrappedIterator.create(triples.iterator());
+       }
+
+
+       @Override
+       public ExtendedIterator<Triple> getTripleIterator(Row row) {
+               // use PSO index ( O(n), n= column count )
+               
+               if (row == null || row.getRowKey() == null)
+                       throw new NullPointerException("row is null");
+               
+               ArrayList<Triple> triples = new ArrayList<Triple>();
+               for (Column column : getColumns()) {
+                       Node value = row.getValue(column);
+                       triples.add(Triple.create(row.getRowKey(), 
column.getColumnKey(), value));
+               }
+               return WrappedIterator.create(triples.iterator());
+       }
+
+       @Override
+       public Collection<Column> getColumns() {
+               return columnList;
+       }
+
+       @Override
+       public Column getColumn(Node p) {
+               if (p == null)
+                       throw new NullPointerException("column node is null");
+               return columnIndex.get(p);
+       }
+
+       @Override
+       public Column createColumn(Node p) {
+               if (p == null)
+                       throw new NullPointerException("column node is null");
+
+               if (columnIndex.containsKey(p))
+                       throw new IllegalArgumentException("column already 
exists: '"
+                                       + p.toString());
+
+               columnIndex.put(p, new ColumnImpl(this, p));
+               columnList.add(columnIndex.get(p));
+               valueIndex.put(p, new HashMap<Node, Node>());
+               valueReverseIndex.put(p, HashMultimap.create());
+               return getColumn(p);
+       }
+
+       @Override
+       public Row getRow(final Node s) {
+               if (s == null)
+                       throw new NullPointerException("subject node is null");
+               Row row = rowIndex.get(s);
+               return row;
+
+       }
+       
+       @Override
+       public Row createRow(final Node s){
+               Row row = this.getRow(s);
+               if (row != null)
+                       return row;
+
+               row = new InternalRow(s);
+               rowIndex.put(s, row);
+               rowList.add(row);
+
+               return row;
+       }
+       
+       @Override
+       public List<Row> getAllRows() {
+               return rowList;
+       }
+
+       
+       
+       @Override
+       public List<Node> getColumnValues(Column column) {
+               if (column == null || column.getColumnKey() == null)
+                       throw new NullPointerException("column is null");
+               
+               Map<Node, Node> values = valueIndex.get(column.getColumnKey());
+
+               List<Node> list = new ArrayList<Node>(values.size());
+               list.addAll(values.values());
+               return list;
+       }
+       
+       @Override
+       public Collection<Row> getMatchingRows(Column column, Node value) {
+               if (column == null || column.getColumnKey() == null)
+                       throw new NullPointerException("column is null");
+               
+               if (value == null)
+                       throw new NullPointerException("value is null");
+               
+               
+               Node p = column.getColumnKey();
+               final SetMultimap<Node, Node> valueToSubjectMap = 
valueReverseIndex.get(p);
+               if ( valueToSubjectMap == null )
+                   return Collections.emptyList() ;
+               final Set<Node> subjects = valueToSubjectMap.get(value);
+               if ( subjects == null )
+                   return Collections.emptyList() ;
+               final ArrayList<Row> matchingRows = new ArrayList<Row>();
+               for (Node subject : subjects) {
+                   matchingRows.add(this.getRow(subject));
+               }
+               return matchingRows;
+       }
+
+       private final void setX(final Node s, final Node p, final Node value) {
+               if (p == null)
+                       throw new NullPointerException("column Node must not be 
null.");
+               if (value == null)
+                       throw new NullPointerException("value must not be 
null.");
+
+               Map<Node, Node> subjectToValueMap = valueIndex.get(p);
+               if (!columnIndex.containsKey(p) || subjectToValueMap == null)
+                       throw new IllegalArgumentException("column: '" + p
+                                       + "' does not yet exist.");
+
+               Node oldValue = subjectToValueMap.get(s);
+               subjectToValueMap.put(s, value);
+               addToReverseMap(p, s, oldValue, value);
+       }
+
+       private void addToReverseMap(final Node p, final Node s, final Node 
oldValue, final Node value) {
+
+               final SetMultimap<Node, Node> valueToSubjectMap = 
valueReverseIndex.get(p);
+               if ( valueToSubjectMap == null )
+            return ; 
+               valueToSubjectMap.remove(oldValue, s);
+               valueToSubjectMap.put(value, s);
+       }
+
+       private void unSetX(final Node s, final Node p) {
+
+               final Map<Node, Node> subjectToValueMap = valueIndex.get(p);
+               if (!columnIndex.containsKey(p) || subjectToValueMap == null)
+                       throw new IllegalArgumentException("column: '" + p
+                                       + "' does not yet exist.");
+
+               final Node value = subjectToValueMap.get(s);
+               if (value == null)
+                       return;
+
+               subjectToValueMap.remove(s);
+               removeFromReverseMap(p, s, value);
+       }
+
+       private void removeFromReverseMap(final Node p, final Node s,
+                       final Node value) {
+               final SetMultimap<Node, Node> valueTokeysMap = 
valueReverseIndex.get(p);
+               if ( valueTokeysMap == null )
+                   return ;
+               valueTokeysMap.remove(s, value);
+       }
+
+       private Node getX(final Node s, final Node p) {
+               final Map<Node, Node> subjectToValueMap = valueIndex.get(p);
+               if (!columnIndex.containsKey(p) || subjectToValueMap == null)
+                       throw new IllegalArgumentException("column: '" + p
+                                       + "' does not yet exist.");
+               return subjectToValueMap.get(s);
+       }
+
+       private final class InternalRow implements Row {
+               private final Node key;
+
+               InternalRow(final Node key) {
+                       this.key = key;
+               }
+
+               @Override
+               public void setValue(Column column, Node value) {
+                       if (value == null)
+                               unSetX(key, column.getColumnKey());
+                       else
+                               setX(key, column.getColumnKey(), value);
+               }
+
+               @Override
+               public Node getValue(Column column) {
+                       return getX(key, column.getColumnKey());
+               }
+               
+               @Override
+               public Node getValue(Node columnKey) {
+                       return getX(key, columnKey);
+               }
+
+               @Override
+               public PropertyTable getTable() {
+                       return PropertyTableHashMapImpl.this;
+               }
+
+               @Override
+               public Node getRowKey() {
+                       return key;
+               }
+
+               @Override
+               public Collection<Column> getColumns() {
+                       // TODO Auto-generated method stub
+                       return PropertyTableHashMapImpl.this.getColumns();
+               }
+
+               @Override
+               public ExtendedIterator<Triple> getTripleIterator() {
+                       ArrayList<Triple> triples = new ArrayList<Triple>();
+                       for (Column column : getColumns()) {
+                               Node value = this.getValue(column);
+                               triples.add(Triple.create(key, 
column.getColumnKey(), value));
+                       }
+                       return WrappedIterator.create(triples.iterator());
+               }
+
+       }
+
+}

http://git-wip-us.apache.org/repos/asf/jena/blob/3d70d735/jena-csv/src/main/java/org/apache/jena/propertytable/lang/LangCSV.java
----------------------------------------------------------------------
diff --git 
a/jena-csv/src/main/java/org/apache/jena/propertytable/lang/LangCSV.java 
b/jena-csv/src/main/java/org/apache/jena/propertytable/lang/LangCSV.java
index d816f46..bd2ff29 100644
--- a/jena-csv/src/main/java/org/apache/jena/propertytable/lang/LangCSV.java
+++ b/jena-csv/src/main/java/org/apache/jena/propertytable/lang/LangCSV.java
@@ -1,154 +1,154 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.jena.propertytable.lang;
-
-import java.io.InputStream ;
-import java.io.Reader ;
-import java.util.ArrayList ;
-import java.util.List ;
-
-import org.apache.jena.atlas.csv.CSVParser ;
-import org.apache.jena.atlas.lib.IRILib ;
-import org.apache.jena.datatypes.xsd.XSDDatatype ;
-import org.apache.jena.graph.Node ;
-import org.apache.jena.graph.NodeFactory ;
-import org.apache.jena.riot.Lang ;
-import org.apache.jena.riot.RDFLanguages ;
-import org.apache.jena.riot.lang.LangRIOT ;
-import org.apache.jena.riot.system.* ;
-
-/**
- * The LangRIOT implementation for CSV
- *
- */
-public class LangCSV implements LangRIOT {
-
-    /** @deprecated Use {@linkplain CSV2RDF#init} */
-    @Deprecated
-    public static void register() { CSV2RDF.init() ; }
-    
-       public static final String CSV_PREFIX = "http://w3c/future-csv-vocab/";;
-       public static final String CSV_ROW = CSV_PREFIX + "row";
-
-       private InputStream input = null;
-       private Reader reader = null;
-       private String base;
-       private String filename;
-       private StreamRDF sink;
-       private ParserProfile profile; // Warning - we don't use all of this.
-
-       @Override
-       public Lang getLang() {
-               return RDFLanguages.CSV;
-       }
-
-       @Override
-       public ParserProfile getProfile() {
-               return profile;
-       }
-
-       @Override
-       public void setProfile(ParserProfile profile) {
-               this.profile = profile;
-       }
-
-       public LangCSV(Reader reader, String base, String filename, 
ErrorHandler errorHandler, StreamRDF sink) {
-               this.reader = reader;
-               this.base = base;
-               this.filename = filename;
-               this.sink = sink;
-               this.profile = RiotLib.profile(getLang(), base, errorHandler);
-       }
-
-       public LangCSV(InputStream in, String base, String filename, 
ErrorHandler errorHandler, StreamRDF sink) {
-               this.input = in;
-               this.base = base;
-               this.filename = filename;
-               this.sink = sink;
-               this.profile = RiotLib.profile(getLang(), base, errorHandler);
-       }
-
-       @Override
-       public void parse() {
-               sink.start();
-               CSVParser parser = (input != null) ? CSVParser.create(input) : 
CSVParser.create(reader);
-               List<String> row = null;
-               ArrayList<Node> predicates = new ArrayList<Node>();
-               int rowNum = 0;
-               while ((row = parser.parse1()) != null) {
-                       
-                       if (rowNum == 0) {
-                               for (String column : row) {
-                                       String uri = 
IRIResolver.resolveString(filename) + "#"
-                                                       + 
toSafeLocalname(column);
-                                       Node predicate = 
this.profile.createURI(uri, rowNum, 0);
-                                       predicates.add(predicate);
-                               }
-                       } else {
-                               //Node subject = 
this.profile.createBlankNode(null, -1, -1);
-                               Node subject = caculateSubject(rowNum, 
filename);
-                               Node predicateRow = 
this.profile.createURI(CSV_ROW, -1, -1);
-                               Node objectRow = this.profile
-                                               .createTypedLiteral((rowNum + 
""),
-                                                               
XSDDatatype.XSDinteger, rowNum, 0);
-                               sink.triple(this.profile.createTriple(subject, 
predicateRow,
-                                               objectRow, rowNum, 0));
-                               for (int col = 0; col < row.size() && 
col<predicates.size(); col++) {
-                                       Node predicate = predicates.get(col);
-                                       String columnValue = 
row.get(col).trim();
-                                       if("".equals(columnValue)){
-                                               continue;
-                                       }                                       
-                                       Node o;
-                                       try {
-                                               // Try for a double.
-                                               double d = 
Double.parseDouble(columnValue);
-                                               o = 
NodeFactory.createLiteral(columnValue,
-                                                               
XSDDatatype.XSDdouble);
-                                       } catch (Exception e) {
-                                               o = 
NodeFactory.createLiteral(columnValue);
-                                       }
-                                       
sink.triple(this.profile.createTriple(subject, predicate,
-                                                       o, rowNum, col));
-                               }
-
-                       }
-                       rowNum++;
-               }
-               sink.finish();
-
-       }
-
-       public static String toSafeLocalname(String raw) {
-               String ret = raw.trim();
-               return encodeURIComponent(ret);
-               
-       }
-       
-       public static String encodeURIComponent(String s) {
-           return IRILib.encodeUriComponent(s);
-       }
-       
-       public static Node caculateSubject(int rowNum, String filename){
-               Node subject = NodeFactory.createBlankNode();
-//             String uri = IRIResolver.resolveString(filename) + "#Row_" + 
rowNum; 
-//             Node subject =  NodeFactory.createURI(uri);
-               return subject;
-       }
-}
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jena.propertytable.lang;
+
+import java.io.InputStream ;
+import java.io.Reader ;
+import java.util.ArrayList ;
+import java.util.List ;
+
+import org.apache.jena.atlas.csv.CSVParser ;
+import org.apache.jena.atlas.lib.IRILib ;
+import org.apache.jena.datatypes.xsd.XSDDatatype ;
+import org.apache.jena.graph.Node ;
+import org.apache.jena.graph.NodeFactory ;
+import org.apache.jena.riot.Lang ;
+import org.apache.jena.riot.RDFLanguages ;
+import org.apache.jena.riot.lang.LangRIOT ;
+import org.apache.jena.riot.system.* ;
+
+/**
+ * The LangRIOT implementation for CSV
+ *
+ */
+public class LangCSV implements LangRIOT {
+
+    /** @deprecated Use {@linkplain CSV2RDF#init} */
+    @Deprecated
+    public static void register() { CSV2RDF.init() ; }
+    
+       public static final String CSV_PREFIX = "http://w3c/future-csv-vocab/";;
+       public static final String CSV_ROW = CSV_PREFIX + "row";
+
+       private InputStream input = null;
+       private Reader reader = null;
+       private String base;
+       private String filename;
+       private StreamRDF sink;
+       private ParserProfile profile; // Warning - we don't use all of this.
+
+       @Override
+       public Lang getLang() {
+               return RDFLanguages.CSV;
+       }
+
+       @Override
+       public ParserProfile getProfile() {
+               return profile;
+       }
+
+       @Override
+       public void setProfile(ParserProfile profile) {
+               this.profile = profile;
+       }
+
+       public LangCSV(Reader reader, String base, String filename, 
ErrorHandler errorHandler, StreamRDF sink) {
+               this.reader = reader;
+               this.base = base;
+               this.filename = filename;
+               this.sink = sink;
+               this.profile = RiotLib.profile(getLang(), base, errorHandler);
+       }
+
+       public LangCSV(InputStream in, String base, String filename, 
ErrorHandler errorHandler, StreamRDF sink) {
+               this.input = in;
+               this.base = base;
+               this.filename = filename;
+               this.sink = sink;
+               this.profile = RiotLib.profile(getLang(), base, errorHandler);
+       }
+
+       @Override
+       public void parse() {
+               sink.start();
+               CSVParser parser = (input != null) ? CSVParser.create(input) : 
CSVParser.create(reader);
+               List<String> row = null;
+               ArrayList<Node> predicates = new ArrayList<Node>();
+               int rowNum = 0;
+               while ((row = parser.parse1()) != null) {
+                       
+                       if (rowNum == 0) {
+                               for (String column : row) {
+                                       String uri = 
IRIResolver.resolveString(filename) + "#"
+                                                       + 
toSafeLocalname(column);
+                                       Node predicate = 
this.profile.createURI(uri, rowNum, 0);
+                                       predicates.add(predicate);
+                               }
+                       } else {
+                               //Node subject = 
this.profile.createBlankNode(null, -1, -1);
+                               Node subject = caculateSubject(rowNum, 
filename);
+                               Node predicateRow = 
this.profile.createURI(CSV_ROW, -1, -1);
+                               Node objectRow = this.profile
+                                               .createTypedLiteral((rowNum + 
""),
+                                                               
XSDDatatype.XSDinteger, rowNum, 0);
+                               sink.triple(this.profile.createTriple(subject, 
predicateRow,
+                                               objectRow, rowNum, 0));
+                               for (int col = 0; col < row.size() && 
col<predicates.size(); col++) {
+                                       Node predicate = predicates.get(col);
+                                       String columnValue = 
row.get(col).trim();
+                                       if("".equals(columnValue)){
+                                               continue;
+                                       }                                       
+                                       Node o;
+                                       try {
+                                               // Try for a double.
+                                               double d = 
Double.parseDouble(columnValue);
+                                               o = 
NodeFactory.createLiteral(columnValue,
+                                                               
XSDDatatype.XSDdouble);
+                                       } catch (Exception e) {
+                                               o = 
NodeFactory.createLiteral(columnValue);
+                                       }
+                                       
sink.triple(this.profile.createTriple(subject, predicate,
+                                                       o, rowNum, col));
+                               }
+
+                       }
+                       rowNum++;
+               }
+               sink.finish();
+
+       }
+
+       public static String toSafeLocalname(String raw) {
+               String ret = raw.trim();
+               return encodeURIComponent(ret);
+               
+       }
+       
+       public static String encodeURIComponent(String s) {
+           return IRILib.encodeUriComponent(s);
+       }
+       
+       public static Node caculateSubject(int rowNum, String filename){
+               Node subject = NodeFactory.createBlankNode();
+//             String uri = IRIResolver.resolveString(filename) + "#Row_" + 
rowNum; 
+//             Node subject =  NodeFactory.createURI(uri);
+               return subject;
+       }
+}

http://git-wip-us.apache.org/repos/asf/jena/blob/3d70d735/jena-csv/src/main/java/riotcmdx/csv2rdf.java
----------------------------------------------------------------------
diff --git a/jena-csv/src/main/java/riotcmdx/csv2rdf.java 
b/jena-csv/src/main/java/riotcmdx/csv2rdf.java
index cd8929d..eda3d8a 100644
--- a/jena-csv/src/main/java/riotcmdx/csv2rdf.java
+++ b/jena-csv/src/main/java/riotcmdx/csv2rdf.java
@@ -1,52 +1,52 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package riotcmdx;
-
-import org.apache.jena.atlas.lib.Lib ;
-import org.apache.jena.atlas.web.ContentType ;
-import org.apache.jena.riot.Lang ;
-import org.apache.jena.riot.RDFLanguages ;
-import riotcmd.CmdLangParse ;
-
-/**
- * A command line tool for direct and scalable transforming from CSV to the 
formatted RDF syntax (i.e. N-Triples), 
- * with no intermediary Graph or PropertyTable.
- */
-public class csv2rdf extends CmdLangParse{
-       
-    public static void main(String... argv)
-    {
-        new csv2rdf(argv).mainRun() ;
-    }    
-    
-    protected csv2rdf(String[] argv)
-    {
-        super(argv) ;
-    }
-       
-       @Override
-       protected Lang selectLang(String filename, ContentType contentType, 
Lang dftLang) {
-               return RDFLanguages.CSV; 
-       }
-
-       @Override
-       protected String getCommandName() {
-               return Lib.classShortName(csv2rdf.class) ;
-       }
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package riotcmdx;
+
+import org.apache.jena.atlas.lib.Lib ;
+import org.apache.jena.atlas.web.ContentType ;
+import org.apache.jena.riot.Lang ;
+import org.apache.jena.riot.RDFLanguages ;
+import riotcmd.CmdLangParse ;
+
+/**
+ * A command line tool for direct and scalable transforming from CSV to the 
formatted RDF syntax (i.e. N-Triples), 
+ * with no intermediary Graph or PropertyTable.
+ */
+public class csv2rdf extends CmdLangParse{
+       
+    public static void main(String... argv)
+    {
+        new csv2rdf(argv).mainRun() ;
+    }    
+    
+    protected csv2rdf(String[] argv)
+    {
+        super(argv) ;
+    }
+       
+       @Override
+       protected Lang selectLang(String filename, ContentType contentType, 
Lang dftLang) {
+               return RDFLanguages.CSV; 
+       }
+
+       @Override
+       protected String getCommandName() {
+               return Lib.classShortName(csv2rdf.class) ;
+       }
+}

http://git-wip-us.apache.org/repos/asf/jena/blob/3d70d735/jena-csv/src/test/java/org/apache/jena/propertytable/AbstractColumnTest.java
----------------------------------------------------------------------
diff --git 
a/jena-csv/src/test/java/org/apache/jena/propertytable/AbstractColumnTest.java 
b/jena-csv/src/test/java/org/apache/jena/propertytable/AbstractColumnTest.java
index fed4517..a41161e 100644
--- 
a/jena-csv/src/test/java/org/apache/jena/propertytable/AbstractColumnTest.java
+++ 
b/jena-csv/src/test/java/org/apache/jena/propertytable/AbstractColumnTest.java
@@ -1,79 +1,79 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.jena.propertytable;
-
-import java.util.List;
-
-import org.apache.jena.graph.Node ;
-import org.apache.jena.graph.NodeFactory ;
-import org.junit.Assert;
-import org.junit.Test;
-
-/**
- * Tests related to Column.
- *
- */
-public abstract class AbstractColumnTest extends BaseTest{
-
-
-       @Test(expected = NullPointerException.class)
-       public void testCreateColumnWithArgNull() {
-               table.createColumn(null);
-       }
-
-       @Test(expected = IllegalArgumentException.class)
-       public void testCreateListColumnWithAlreadyExistingCoulmnName() {
-               table.createColumn(URI("something"));
-               table.createColumn(URI("something"));
-       }
-       
-       @Test
-       public void testColumnCreate() {
-               table.createColumn(URI("something"));
-               Assert.assertEquals(1, table.getColumns().size());
-               Assert.assertTrue(collectionContains(table.getColumns(), 
URI("something")));
-       }
-       
-       @Test
-       public void testGetColumnValues() {
-               Column something = table.createColumn(URI("something"));
-               final Row row1 = table.createRow(NodeFactory.createBlankNode());
-               row1.setValue(something, URI("apple"));
-               final Row row2 = table.createRow(NodeFactory.createBlankNode());
-               row2.setValue(something, URI("orange"));
-               final List<Node> values = something.getValues();
-               Assert.assertTrue(values.size() == 2);
-               Assert.assertTrue(values.contains( URI("apple")));
-               Assert.assertTrue(values.contains(  URI("orange")));
-       }
-       
-       @Test
-       public void testGetColumn() {
-               table.createColumn(URI("something"));
-               Assert.assertNotNull(table.getColumn(URI("something")));
-               Assert.assertNull(table.getColumn( 
URI("nonExistentColumnName")));
-       }
-
-       @Test
-       public void testGetTable() {
-               Column something = table.createColumn(URI("something"));
-               Assert.assertEquals(table, something.getTable());
-       }
-
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jena.propertytable;
+
+import java.util.List;
+
+import org.apache.jena.graph.Node ;
+import org.apache.jena.graph.NodeFactory ;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * Tests related to Column.
+ *
+ */
+public abstract class AbstractColumnTest extends BaseTest{
+
+
+       @Test(expected = NullPointerException.class)
+       public void testCreateColumnWithArgNull() {
+               table.createColumn(null);
+       }
+
+       @Test(expected = IllegalArgumentException.class)
+       public void testCreateListColumnWithAlreadyExistingCoulmnName() {
+               table.createColumn(URI("something"));
+               table.createColumn(URI("something"));
+       }
+       
+       @Test
+       public void testColumnCreate() {
+               table.createColumn(URI("something"));
+               Assert.assertEquals(1, table.getColumns().size());
+               Assert.assertTrue(collectionContains(table.getColumns(), 
URI("something")));
+       }
+       
+       @Test
+       public void testGetColumnValues() {
+               Column something = table.createColumn(URI("something"));
+               final Row row1 = table.createRow(NodeFactory.createBlankNode());
+               row1.setValue(something, URI("apple"));
+               final Row row2 = table.createRow(NodeFactory.createBlankNode());
+               row2.setValue(something, URI("orange"));
+               final List<Node> values = something.getValues();
+               Assert.assertTrue(values.size() == 2);
+               Assert.assertTrue(values.contains( URI("apple")));
+               Assert.assertTrue(values.contains(  URI("orange")));
+       }
+       
+       @Test
+       public void testGetColumn() {
+               table.createColumn(URI("something"));
+               Assert.assertNotNull(table.getColumn(URI("something")));
+               Assert.assertNull(table.getColumn( 
URI("nonExistentColumnName")));
+       }
+
+       @Test
+       public void testGetTable() {
+               Column something = table.createColumn(URI("something"));
+               Assert.assertEquals(table, something.getTable());
+       }
+
+}

http://git-wip-us.apache.org/repos/asf/jena/blob/3d70d735/jena-csv/src/test/java/org/apache/jena/propertytable/AbstractPropertyTableTest.java
----------------------------------------------------------------------
diff --git 
a/jena-csv/src/test/java/org/apache/jena/propertytable/AbstractPropertyTableTest.java
 
b/jena-csv/src/test/java/org/apache/jena/propertytable/AbstractPropertyTableTest.java
index a9544f9..5209361 100644
--- 
a/jena-csv/src/test/java/org/apache/jena/propertytable/AbstractPropertyTableTest.java
+++ 
b/jena-csv/src/test/java/org/apache/jena/propertytable/AbstractPropertyTableTest.java
@@ -1,56 +1,56 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.jena.propertytable;
-
-import java.util.Collection;
-
-import org.apache.jena.graph.NodeFactory ;
-import org.junit.Assert;
-import org.junit.Test;
-
-/**
- * Tests related to PropertyTable.
- *
- */
-public abstract class AbstractPropertyTableTest extends AbstractRowTest{
-
-       @Test
-       public void testGetMatchingColumns() {
-               Column something = table.createColumn(URI("something") );
-               final Row row1 = table.createRow(NodeFactory.createBlankNode());
-               row1.setValue(something, URI("apple"));
-               final Row row2 = table.createRow(NodeFactory.createBlankNode());
-               row2.setValue(something, URI("orange"));
-               Collection<Row> matchingRows = table.getMatchingRows(something, 
URI("apple"));
-               Assert.assertTrue(matchingRows.size() == 1);
-               matchingRows = table.getMatchingRows(something, URI("banana"));
-               Assert.assertTrue(matchingRows.isEmpty());
-       }
-       
-       @Test
-       public void testGetAllRows() {
-               Assert.assertTrue(table.getAllRows().size() == 1);
-               table.createRow(NodeFactory.createBlankNode());
-               Assert.assertTrue(table.getAllRows().size() == 2);
-               table.createRow(NodeFactory.createBlankNode());
-               Assert.assertTrue(table.getAllRows().size() == 3);
-       }
-
-
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jena.propertytable;
+
+import java.util.Collection;
+
+import org.apache.jena.graph.NodeFactory ;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * Tests related to PropertyTable.
+ *
+ */
+public abstract class AbstractPropertyTableTest extends AbstractRowTest{
+
+       @Test
+       public void testGetMatchingColumns() {
+               Column something = table.createColumn(URI("something") );
+               final Row row1 = table.createRow(NodeFactory.createBlankNode());
+               row1.setValue(something, URI("apple"));
+               final Row row2 = table.createRow(NodeFactory.createBlankNode());
+               row2.setValue(something, URI("orange"));
+               Collection<Row> matchingRows = table.getMatchingRows(something, 
URI("apple"));
+               Assert.assertTrue(matchingRows.size() == 1);
+               matchingRows = table.getMatchingRows(something, URI("banana"));
+               Assert.assertTrue(matchingRows.isEmpty());
+       }
+       
+       @Test
+       public void testGetAllRows() {
+               Assert.assertTrue(table.getAllRows().size() == 1);
+               table.createRow(NodeFactory.createBlankNode());
+               Assert.assertTrue(table.getAllRows().size() == 2);
+               table.createRow(NodeFactory.createBlankNode());
+               Assert.assertTrue(table.getAllRows().size() == 3);
+       }
+
+
+}

Reply via email to