jena-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From rve...@apache.org
Subject [47/50] [abbrv] git commit: Move jena-csv code to intended location
Date Thu, 02 Oct 2014 09:48:56 GMT
Move jena-csv code to intended location


Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/e7ac8b4d
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/e7ac8b4d
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/e7ac8b4d

Branch: refs/heads/jena-csv
Commit: e7ac8b4d5be932199eac5c2c90c7c40a60dd9572
Parents: a40c568
Author: Rob Vesse <rvesse@apache.org>
Authored: Wed Oct 1 16:06:25 2014 +0100
Committer: Rob Vesse <rvesse@apache.org>
Committed: Wed Oct 1 16:08:52 2014 +0100

----------------------------------------------------------------------
 LICENSE                                         | 202 -----------
 NOTICE                                          |   5 -
 ReleaseNotes.txt                                |  14 -
 jena-csv/LICENSE                                | 202 +++++++++++
 jena-csv/NOTICE                                 |   5 +
 jena-csv/ReleaseNotes.txt                       |  14 +
 jena-csv/pom.xml                                | 189 ++++++++++
 .../org/apache/jena/propertytable/Column.java   |  45 +++
 .../jena/propertytable/PropertyTable.java       | 126 +++++++
 .../java/org/apache/jena/propertytable/Row.java |  75 ++++
 .../jena/propertytable/graph/GraphCSV.java      |  62 ++++
 .../propertytable/graph/GraphPropertyTable.java | 203 +++++++++++
 .../graph/QueryIterPropertyTable.java           | 115 ++++++
 .../graph/QueryIterPropertyTableRow.java        | 243 +++++++++++++
 .../jena/propertytable/graph/RowMatch.java      |  48 +++
 .../graph/StageGeneratorPropertyTable.java      |  57 +++
 .../jena/propertytable/impl/ColumnImpl.java     |  58 +++
 .../impl/PropertyTableArrayImpl.java            | 346 ++++++++++++++++++
 .../impl/PropertyTableBuilder.java              | 134 +++++++
 .../impl/PropertyTableHashMapImpl.java          | 357 +++++++++++++++++++
 .../apache/jena/propertytable/lang/LangCSV.java | 229 ++++++++++++
 .../apache/jena/propertytable/util/IRILib.java  | 264 ++++++++++++++
 .../main/java/riotcmd/LocatorOupputFile.java    | 148 ++++++++
 jena-csv/src/main/java/riotcmd/ModDest.java     |  51 +++
 jena-csv/src/main/java/riotcmd/csv2rdf.java     | 205 +++++++++++
 .../jena/propertytable/AbstractColumnTest.java  |  80 +++++
 .../AbstractPropertyTableTest.java              |  57 +++
 .../jena/propertytable/AbstractRowTest.java     | 106 ++++++
 .../org/apache/jena/propertytable/BaseTest.java |  47 +++
 .../jena/propertytable/TS_PropertyTable.java    |  42 +++
 .../jena/propertytable/graph/GraphCSVTest.java  | 153 ++++++++
 .../impl/AbstractPropertyTableBuilderTest.java  | 147 ++++++++
 .../impl/PropertyTableArrayImplTest.java        |  84 +++++
 .../PropertyTableBuilderForArrayImplTest.java   |  39 ++
 .../PropertyTableBuilderForHashMapImplTest.java |  34 ++
 .../impl/PropertyTableHashMapImplTest.java      |  46 +++
 .../jena/propertytable/lang/TestLangCSV.java    | 113 ++++++
 .../HEFCE_organogram_senior_data_31032011.csv   |   5 +
 .../test/resources/PLOSone-search-results.csv   |   6 +
 jena-csv/src/test/resources/Palo_Alto_Trees.csv |   6 +
 jena-csv/src/test/resources/log4j.properties    |  19 +
 jena-csv/src/test/resources/test.csv            |   3 +
 pom.xml                                         | 189 ----------
 .../org/apache/jena/propertytable/Column.java   |  45 ---
 .../jena/propertytable/PropertyTable.java       | 126 -------
 .../java/org/apache/jena/propertytable/Row.java |  75 ----
 .../jena/propertytable/graph/GraphCSV.java      |  62 ----
 .../propertytable/graph/GraphPropertyTable.java | 203 -----------
 .../graph/QueryIterPropertyTable.java           | 115 ------
 .../graph/QueryIterPropertyTableRow.java        | 243 -------------
 .../jena/propertytable/graph/RowMatch.java      |  48 ---
 .../graph/StageGeneratorPropertyTable.java      |  57 ---
 .../jena/propertytable/impl/ColumnImpl.java     |  58 ---
 .../impl/PropertyTableArrayImpl.java            | 346 ------------------
 .../impl/PropertyTableBuilder.java              | 134 -------
 .../impl/PropertyTableHashMapImpl.java          | 357 -------------------
 .../apache/jena/propertytable/lang/LangCSV.java | 229 ------------
 .../apache/jena/propertytable/util/IRILib.java  | 264 --------------
 src/main/java/riotcmd/LocatorOupputFile.java    | 148 --------
 src/main/java/riotcmd/ModDest.java              |  51 ---
 src/main/java/riotcmd/csv2rdf.java              | 205 -----------
 .../jena/propertytable/AbstractColumnTest.java  |  80 -----
 .../AbstractPropertyTableTest.java              |  57 ---
 .../jena/propertytable/AbstractRowTest.java     | 106 ------
 .../org/apache/jena/propertytable/BaseTest.java |  47 ---
 .../jena/propertytable/TS_PropertyTable.java    |  42 ---
 .../jena/propertytable/graph/GraphCSVTest.java  | 153 --------
 .../impl/AbstractPropertyTableBuilderTest.java  | 147 --------
 .../impl/PropertyTableArrayImplTest.java        |  84 -----
 .../PropertyTableBuilderForArrayImplTest.java   |  39 --
 .../PropertyTableBuilderForHashMapImplTest.java |  34 --
 .../impl/PropertyTableHashMapImplTest.java      |  46 ---
 .../jena/propertytable/lang/TestLangCSV.java    | 113 ------
 .../HEFCE_organogram_senior_data_31032011.csv   |   5 -
 src/test/resources/PLOSone-search-results.csv   |   6 -
 src/test/resources/Palo_Alto_Trees.csv          |   6 -
 src/test/resources/log4j.properties             |  19 -
 src/test/resources/test.csv                     |   3 -
 78 files changed, 4163 insertions(+), 4163 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/e7ac8b4d/LICENSE
----------------------------------------------------------------------
diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index d645695..0000000
--- a/LICENSE
+++ /dev/null
@@ -1,202 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed 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.

http://git-wip-us.apache.org/repos/asf/jena/blob/e7ac8b4d/NOTICE
----------------------------------------------------------------------
diff --git a/NOTICE b/NOTICE
deleted file mode 100644
index ca5166a..0000000
--- a/NOTICE
+++ /dev/null
@@ -1,5 +0,0 @@
-Apache Jena - Data Tables for RDF and SPARQL
-Copyright 2011, 2012, 2013, 2014 The Apache Software Foundation
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).

http://git-wip-us.apache.org/repos/asf/jena/blob/e7ac8b4d/ReleaseNotes.txt
----------------------------------------------------------------------
diff --git a/ReleaseNotes.txt b/ReleaseNotes.txt
deleted file mode 100644
index 58688df..0000000
--- a/ReleaseNotes.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-Release Notes 
-=============
-
-==== Apache Jena - CSV PropertyTable 1.0.0
-
-+ PropertyTable and its 2 implementations:
-    PropertyTableArrayImpl
-    PropertyTableHashMapImpl
-+ GraphPropertyTable and StageGenerator Optimization
-+ RIOT Reader for CSV Files
-+ CSV2RDF tool
-
-
-

http://git-wip-us.apache.org/repos/asf/jena/blob/e7ac8b4d/jena-csv/LICENSE
----------------------------------------------------------------------
diff --git a/jena-csv/LICENSE b/jena-csv/LICENSE
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/jena-csv/LICENSE
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed 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.

http://git-wip-us.apache.org/repos/asf/jena/blob/e7ac8b4d/jena-csv/NOTICE
----------------------------------------------------------------------
diff --git a/jena-csv/NOTICE b/jena-csv/NOTICE
new file mode 100644
index 0000000..ca5166a
--- /dev/null
+++ b/jena-csv/NOTICE
@@ -0,0 +1,5 @@
+Apache Jena - Data Tables for RDF and SPARQL
+Copyright 2011, 2012, 2013, 2014 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).

http://git-wip-us.apache.org/repos/asf/jena/blob/e7ac8b4d/jena-csv/ReleaseNotes.txt
----------------------------------------------------------------------
diff --git a/jena-csv/ReleaseNotes.txt b/jena-csv/ReleaseNotes.txt
new file mode 100644
index 0000000..58688df
--- /dev/null
+++ b/jena-csv/ReleaseNotes.txt
@@ -0,0 +1,14 @@
+Release Notes 
+=============
+
+==== Apache Jena - CSV PropertyTable 1.0.0
+
++ PropertyTable and its 2 implementations:
+    PropertyTableArrayImpl
+    PropertyTableHashMapImpl
++ GraphPropertyTable and StageGenerator Optimization
++ RIOT Reader for CSV Files
++ CSV2RDF tool
+
+
+

http://git-wip-us.apache.org/repos/asf/jena/blob/e7ac8b4d/jena-csv/pom.xml
----------------------------------------------------------------------
diff --git a/jena-csv/pom.xml b/jena-csv/pom.xml
new file mode 100644
index 0000000..2ba7acc
--- /dev/null
+++ b/jena-csv/pom.xml
@@ -0,0 +1,189 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+   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.
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.apache.jena</groupId>
+  <artifactId>jena-csv</artifactId>
+  <packaging>jar</packaging>
+  <name>Apache Jena - Data Tables for RDF and SPARQL</name>
+  <version>1.0.1-SNAPSHOT</version>
+
+  <parent>
+    <groupId>org.apache.jena</groupId>
+    <artifactId>jena-parent</artifactId>
+    <version>10</version>
+    <relativePath />
+  </parent>
+  
+  
+    <!-- Need if the parent is a snapshot -->
+  <repositories>
+    <repository>
+      <id>apache.snapshots</id>
+      <name>Apache Snapshot Repository</name>
+      <url>http://repository.apache.org/snapshots</url>
+      <releases>
+	<enabled>false</enabled>
+      </releases>
+    </repository>
+  </repositories>
+  
+  <description>jena-csv is for getting CSVs into a form that is amenable to Jena SPARQL processing, and doing so in a way that is not specific to CSV files. It includes getting the right architecture in place for regular table shaped data, using the core abstraction of PropertyTable.</description> 
+  
+  <scm>
+    <connection>scm:svn:https://svn.apache.org/repos/asf/jena/Experimental/jena-csv</connection>
+    <developerConnection>scm:svn:https://svn.apache.org/repos/asf/jena/Experimental/jena-csv</developerConnection>
+    <url>https://svn.apache.org/repos/asf/jena/Experimental/jena-csv</url>
+  </scm>
+  
+  <properties>
+    <maven.build.timestamp.format>yyyy-MM-dd'T'HH:mm:ssZ</maven.build.timestamp.format>
+    <build.time.xsd>${maven.build.timestamp}</build.time.xsd>
+  </properties>
+
+  <dependencies>
+
+    <!-- All Jena libs -->
+    <dependency>
+      <groupId>org.apache.jena</groupId>
+      <artifactId>apache-jena-libs</artifactId>
+      <version>2.12.0</version>
+      <type>pom</type>
+    </dependency>
+    
+    <!-- Google Code Guava -->
+    <dependency>
+	  <groupId>com.google.guava</groupId>
+	  <artifactId>guava</artifactId>
+	  <version>17.0</version>
+    </dependency>
+	
+    <!-- Testing support -->
+    <dependency>
+      <groupId>org.apache.jena</groupId>
+      <artifactId>jena-arq</artifactId>
+      <version>2.12.0</version>
+      <type>jar</type>
+      <classifier>tests</classifier>
+      <scope>test</scope>
+    </dependency>
+    
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+  
+  
+
+  <build>
+    <plugins>
+      <plugin>
+	<groupId>org.apache.maven.plugins</groupId>
+	<artifactId>maven-compiler-plugin</artifactId>
+      </plugin>
+
+      <plugin>
+	<groupId>org.apache.maven.plugins</groupId>
+	<artifactId>maven-surefire-plugin</artifactId>
+	<configuration>
+	  <systemPropertyVariables>
+	    <log4j.configuration>file:src/test/resources/log4j.properties</log4j.configuration>
+	  </systemPropertyVariables>
+
+	  <includes>
+	    <include>**/TS_*.java</include>
+	  </includes>
+	</configuration>
+      </plugin>
+
+      <plugin>
+	<groupId>org.apache.maven.plugins</groupId>
+	<artifactId>maven-jar-plugin</artifactId>
+      </plugin>
+
+      <plugin>
+	<groupId>org.apache.maven.plugins</groupId>
+	<artifactId>maven-source-plugin</artifactId>
+	<executions>
+	  <execution>
+	    <id>attach-sources</id>
+	    <goals>
+	      <goal>jar-no-fork</goal>
+	    </goals>
+	  </execution>
+	  <!-- Only material in the main jar <execution> <id>attach-sources-test</id> 
+	       <goals> <goal>test-jar-no-fork</goal> </goals> </execution> -->
+	</executions>
+      </plugin>
+
+      <plugin>
+	<groupId>org.apache.maven.plugins</groupId>
+	<artifactId>maven-javadoc-plugin</artifactId>
+	<configuration>
+	  <version>true</version>
+	  <show>public</show>
+	  <quiet>true</quiet>
+	  <encoding>UTF-8</encoding>
+	  <windowtitle>${project.name} ${project.version}</windowtitle>
+	  <doctitle>${project.name} ${project.version}</doctitle>
+	  <bottom>Licenced under the Apache License, Version 2.0</bottom>
+	</configuration>
+      </plugin>
+
+      <plugin>
+	<groupId>org.apache.maven.plugins</groupId>
+	<artifactId>maven-resources-plugin</artifactId>
+	<configuration>
+	  <encoding>UTF-8</encoding>
+	</configuration>
+      </plugin>
+
+      <plugin>
+	<groupId>org.apache.maven.plugins</groupId>
+	<artifactId>maven-dependency-plugin</artifactId>
+	<configuration>
+	  <overWriteReleases>false</overWriteReleases>
+	  <overWriteIfNewer>true</overWriteIfNewer>
+	</configuration>
+      </plugin>
+      <plugin>
+	<groupId>org.apache.maven.plugins</groupId>
+	<artifactId>maven-eclipse-plugin</artifactId>
+	<configuration>
+	  <!-- By default, have separate Eclipse and maven build areas -->
+	  <buildOutputDirectory>${project.build.directory}/classes</buildOutputDirectory>
+	  <downloadSources>true</downloadSources>
+	  <downloadJavadocs>false</downloadJavadocs>
+	</configuration>
+      </plugin>
+
+      <plugin>
+	<groupId>org.apache.maven.plugins</groupId>
+	<artifactId>maven-release-plugin</artifactId>
+    <configuration>
+	  <tagBase>https://svn.apache.org/repos/asf/jena/tags/</tagBase>  
+	</configuration>
+      </plugin>
+    </plugins>
+
+  </build>
+   
+</project>

http://git-wip-us.apache.org/repos/asf/jena/blob/e7ac8b4d/jena-csv/src/main/java/org/apache/jena/propertytable/Column.java
----------------------------------------------------------------------
diff --git a/jena-csv/src/main/java/org/apache/jena/propertytable/Column.java b/jena-csv/src/main/java/org/apache/jena/propertytable/Column.java
new file mode 100644
index 0000000..2e6b6b2
--- /dev/null
+++ b/jena-csv/src/main/java/org/apache/jena/propertytable/Column.java
@@ -0,0 +1,45 @@
+/*
+ * 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 com.hp.hpl.jena.graph.Node;
+
+/**
+ * Each Column of the PropertyTable has an unique columnKey Node of the predicate (or p for short).
+ * 
+ */
+public interface Column {
+
+	/**
+	 * @return the PropertyTable it belongs to
+	 */
+	PropertyTable getTable();
+
+	/**
+	 * @return the columnKey Node of the predicate
+	 */
+	Node getColumnKey();
+	
+	/**
+	 * @return all the values within a Column
+	 */
+	List<Node> getValues();
+
+}

http://git-wip-us.apache.org/repos/asf/jena/blob/e7ac8b4d/jena-csv/src/main/java/org/apache/jena/propertytable/PropertyTable.java
----------------------------------------------------------------------
diff --git a/jena-csv/src/main/java/org/apache/jena/propertytable/PropertyTable.java b/jena-csv/src/main/java/org/apache/jena/propertytable/PropertyTable.java
new file mode 100644
index 0000000..6c9b9a8
--- /dev/null
+++ b/jena-csv/src/main/java/org/apache/jena/propertytable/PropertyTable.java
@@ -0,0 +1,126 @@
+/*
+ * 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 java.util.List;
+
+import com.hp.hpl.jena.graph.Node;
+import com.hp.hpl.jena.graph.Triple;
+import com.hp.hpl.jena.util.iterator.ExtendedIterator;
+
+/**
+ * PropertyTable is designed to be a table of RDF terms, or Nodes in Jena. 
+ * Each Column of the PropertyTable has an unique columnKey Node of the predicate (or p for short).
+ * Each Row of the PropertyTable has an unique rowKey Node of the subject (or s for short).
+ * You can use getColumn() to get the Column by its columnKey Node of the predicate, while getRow() for Row.
+ * 
+ */
+public interface PropertyTable {
+	
+	/**
+	 * Query for ?s <p> <o>
+	 * @param column the Column with the columnKey Node of the predicate
+	 * @param value the object (or value) Node
+	 * @return the ExtendedIterator of the matching Triples
+	 */
+	ExtendedIterator<Triple> getTripleIterator(Column column, Node value);
+
+	/**
+	 * Query for ?s <p> ?o
+	 * @param column the Column with the columnKey Node of the predicate
+	 * @return the ExtendedIterator of the matching Triples
+	 */
+	ExtendedIterator<Triple> getTripleIterator(Column column);
+	
+	/**
+	 * Query for ?s ?p <o>
+	 * @param value the object (or value) Node
+	 * @return the ExtendedIterator of the matching Triples
+	 */
+	ExtendedIterator<Triple> getTripleIterator(Node value);
+	
+	/**
+	 * Query for <s> ?p ?o
+	 * @param row the Row with the rowKey Node of the subject
+	 * @return the ExtendedIterator of the matching Triples
+	 */
+	ExtendedIterator<Triple> getTripleIterator(Row row);
+	
+	/**
+	 * Query for ?s ?p ?o
+	 * @return all of the Triples of the PropertyTable
+	 */
+	ExtendedIterator<Triple> getTripleIterator();
+
+	/**
+	 * @return all of the Columns of the PropertyTable
+	 */
+	Collection<Column> getColumns();
+
+	/**
+	 * Get Column by its columnKey Node of the predicate
+	 * @param p columnKey Node of the predicate
+	 * @return the Column
+	 */
+	Column getColumn(Node p);
+
+	/**
+	 * Create a Column by its columnKey Node of the predicate
+	 * @param p
+	 */
+	Column createColumn(Node p);
+
+	/**
+	 * Get Row by its rowKey Node of the subject
+	 * @param s rowKey Node of the subject
+	 * @return the Row
+	 */
+	Row getRow(Node s);
+	
+	
+	/**
+	 * Create Row by its rowKey Node of the subject
+	 * @param s rowKey Node of the subject
+	 * @return the Row created
+	 */
+	Row createRow(Node s);
+	
+	
+	/**
+	 * Get all of the rows
+	 */
+	List<Row> getAllRows() ;
+	
+	
+	/**
+	 * Get all the values within a Column
+	 * @param column
+	 * @return the values
+	 */
+	List<Node> getColumnValues(Column column);
+	
+	/**
+	 * Get the Rows matching the value of a Column
+	 * @param column the Column with the columnKey Node of the predicate
+	 * @param value the object (or value) Node
+	 * @return the matching Rows
+	 */
+	Collection<Row> getMatchingRows(Column column, Node value);
+	
+}

http://git-wip-us.apache.org/repos/asf/jena/blob/e7ac8b4d/jena-csv/src/main/java/org/apache/jena/propertytable/Row.java
----------------------------------------------------------------------
diff --git a/jena-csv/src/main/java/org/apache/jena/propertytable/Row.java b/jena-csv/src/main/java/org/apache/jena/propertytable/Row.java
new file mode 100644
index 0000000..bc6d068
--- /dev/null
+++ b/jena-csv/src/main/java/org/apache/jena/propertytable/Row.java
@@ -0,0 +1,75 @@
+/*
+ * 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 com.hp.hpl.jena.graph.Node;
+import com.hp.hpl.jena.graph.Triple;
+import com.hp.hpl.jena.util.iterator.ExtendedIterator;
+
+/**
+ * Each Row of the PropertyTable has an unique rowKey Node of the subject (or s for short).
+ *
+ */
+public interface Row {
+
+	/**
+	 * @return the PropertyTable it belongs to
+	 */
+	PropertyTable getTable();
+	
+	/**
+	 * Set the value of the Column in this Row
+	 * @param column
+	 * @param value
+	 */
+	void setValue(Column column, Node value);
+	
+	/**
+	 * Get the value of the Column in this Row
+	 * @param column
+	 * @return value
+	 */
+	Node getValue(Column column);
+	
+	
+	/**
+	 * Get the value of the Column in this Row
+	 * @param ColumnKey
+	 * @return value
+	 */
+	Node getValue(Node ColumnKey);
+	
+	/**
+	 * @return the rowKey Node of the subject
+	 */
+	Node getRowKey();
+	
+	/**
+	 * @return the Triple Iterator over the values in this Row
+	 */
+	ExtendedIterator<Triple> getTripleIterator();
+	
+	/**
+	 * @return all of the Columns of the PropertyTable
+	 */
+	Collection<Column> getColumns();
+
+}

http://git-wip-us.apache.org/repos/asf/jena/blob/e7ac8b4d/jena-csv/src/main/java/org/apache/jena/propertytable/graph/GraphCSV.java
----------------------------------------------------------------------
diff --git a/jena-csv/src/main/java/org/apache/jena/propertytable/graph/GraphCSV.java b/jena-csv/src/main/java/org/apache/jena/propertytable/graph/GraphCSV.java
new file mode 100644
index 0000000..d002ec6
--- /dev/null
+++ b/jena-csv/src/main/java/org/apache/jena/propertytable/graph/GraphCSV.java
@@ -0,0 +1,62 @@
+/*
+ * 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.graph;
+
+import org.apache.jena.propertytable.PropertyTable;
+import org.apache.jena.propertytable.impl.PropertyTableBuilder;
+
+
+/**
+ * GraphCSV is a sub class of GraphPropertyTable aiming at CSV data.
+ * Its constructor takes a CSV file path as the parameter, parse the file using a CSV Parser,
+ * and makes a PropertyTable through PropertyTableBuilder.
+ *
+ */
+public class GraphCSV extends GraphPropertyTable {
+	
+	public static GraphCSV createHashMapImpl( String csvFilePath ){
+		return new GraphCSVHashMapImpl(csvFilePath);
+	}
+	
+	public static GraphCSV createArrayImpl( String csvFilePath ){
+		return new GraphCSVArrayImpl(csvFilePath);
+	}
+	
+	protected GraphCSV (PropertyTable table) {
+		super(table);
+	}
+	
+	// use the Java array implementation of PropertyTable for default
+	public GraphCSV ( String csvFilePath ){
+		super(PropertyTableBuilder.buildPropetyTableArrayImplFromCsv(csvFilePath));
+	}
+}
+
+
+class GraphCSVHashMapImpl extends GraphCSV{
+	protected GraphCSVHashMapImpl(String csvFilePath){
+		super(PropertyTableBuilder.buildPropetyTableHashMapImplFromCsv(csvFilePath));
+	}
+}
+
+class GraphCSVArrayImpl extends GraphCSV{
+	protected GraphCSVArrayImpl(String csvFilePath){
+		super(PropertyTableBuilder.buildPropetyTableArrayImplFromCsv(csvFilePath));
+	}
+}

http://git-wip-us.apache.org/repos/asf/jena/blob/e7ac8b4d/jena-csv/src/main/java/org/apache/jena/propertytable/graph/GraphPropertyTable.java
----------------------------------------------------------------------
diff --git a/jena-csv/src/main/java/org/apache/jena/propertytable/graph/GraphPropertyTable.java b/jena-csv/src/main/java/org/apache/jena/propertytable/graph/GraphPropertyTable.java
new file mode 100644
index 0000000..3f1e930
--- /dev/null
+++ b/jena-csv/src/main/java/org/apache/jena/propertytable/graph/GraphPropertyTable.java
@@ -0,0 +1,203 @@
+/*
+ * 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.graph;
+
+import java.util.ArrayList;
+import java.util.Locale;
+
+import org.apache.jena.propertytable.Column;
+import org.apache.jena.propertytable.PropertyTable;
+import org.apache.jena.propertytable.Row;
+
+
+import com.hp.hpl.jena.graph.Node;
+import com.hp.hpl.jena.graph.NodeFactory;
+import com.hp.hpl.jena.graph.Triple;
+import com.hp.hpl.jena.graph.TripleMatch;
+import com.hp.hpl.jena.graph.impl.GraphBase;
+import com.hp.hpl.jena.sparql.core.BasicPattern;
+import com.hp.hpl.jena.util.iterator.ExtendedIterator;
+import com.hp.hpl.jena.util.iterator.Filter;
+import com.hp.hpl.jena.util.iterator.NullIterator;
+import com.hp.hpl.jena.util.iterator.WrappedIterator;
+
+/**
+ * GraphPropertyTable implements the Graph interface (read-only) over a PropertyTable.
+ * This is subclass from GraphBase and implements find().
+ * The graphBaseFind()(for matching a Triple) and propertyTableBaseFind()(for matching a whole Row) methods can choose the access route based on the find arguments.
+ * GraphPropertyTable holds/wraps an reference of the PropertyTable instance, so that such a Graph can be treated in a more table-like fashion.
+ *
+ */
+public class GraphPropertyTable extends GraphBase {
+
+	private PropertyTable pt;
+
+	public GraphPropertyTable(PropertyTable pt) {
+		this.pt = pt;
+	}
+
+	public PropertyTable getPropertyTable() {
+		return pt;
+	}
+
+	@Override
+	protected ExtendedIterator<Triple> graphBaseFind(TripleMatch m) {
+		//System.out.println(m);
+
+		if (this.pt == null) {
+			return NullIterator.instance();
+		}
+
+		ExtendedIterator<Triple> iter = null;
+
+		Node s = m.getMatchSubject();
+		Node p = m.getMatchPredicate();
+		Node o = m.getMatchObject();
+
+		if (isConcrete(p) && isConcrete(o)) {
+			//System.out.println("1");
+			iter = pt.getTripleIterator(pt.getColumn(p), o);
+		} else if (isConcrete(p)) {
+			//System.out.println("2");
+			Column column = this.pt.getColumn(p);
+			if (column != null) {
+				iter = pt.getTripleIterator(column);
+			} else {
+				return NullIterator.instance();
+			}
+		} else if (isConcrete(o)) {
+			//System.out.println("3");
+			iter = pt.getTripleIterator(o);
+		} else{
+			//System.out.println("4");
+			iter = pt.getTripleIterator();
+		}
+
+		return iter.filterKeep(new TripleMatchFilterEquality(m.asTriple()));
+
+	}
+	
+	protected ExtendedIterator<Row> propertyTableBaseFind(RowMatch m) {
+		
+		if (this.pt == null) {
+			return NullIterator.instance();
+		}
+		
+		ExtendedIterator<Row> iter = null;
+
+		Node s = m.getMatchSubject();
+
+		if ( isConcrete(s) ){
+			Row row= pt.getRow(s);
+			if (row == null){
+				return NullIterator.instance();
+			} else {
+				ArrayList<Row> rows = new ArrayList<Row>();
+				rows.add(row);
+				return WrappedIterator.create(rows.iterator());
+			}
+		} else {
+			iter = WrappedIterator.create(pt.getAllRows().iterator());
+		}
+		
+		return iter.filterKeep(new RowMatchFilterEquality( m ));
+		
+	}
+	
+	static class RowMatchFilterEquality extends Filter<Row> {
+		final protected RowMatch rMatch;
+
+		public RowMatchFilterEquality(RowMatch rMatch) {
+			this.rMatch = rMatch;
+		}
+
+		@Override
+		public boolean accept(Row r) {
+			return rowContained(rMatch, r);
+		}
+
+	}
+	
+	static boolean rowContained(RowMatch rMatch, Row row) {
+			
+		boolean contained = equalNode(rMatch.getSubject(), row.getRowKey());
+		if(contained){
+			BasicPattern pattern =rMatch.getBasicPattern();
+			for(Triple triple: pattern ){
+				contained = equalNode(triple.getObject(), row.getValue( triple.getPredicate()) );
+				if (! contained){
+					break;
+				}
+			}
+		} 
+		return contained;
+	}
+	
+
+	static class TripleMatchFilterEquality extends Filter<Triple> {
+		final protected Triple tMatch;
+
+		/** Creates new TripleMatchFilter */
+		public TripleMatchFilterEquality(Triple tMatch) {
+			this.tMatch = tMatch;
+		}
+
+		@Override
+		public boolean accept(Triple t) {
+			return tripleContained(tMatch, t);
+		}
+
+	}
+
+	static boolean tripleContained(Triple patternTriple, Triple dataTriple) {
+		return equalNode(patternTriple.getSubject(), dataTriple.getSubject())
+				&& equalNode(patternTriple.getPredicate(),
+						dataTriple.getPredicate())
+				&& equalNode(patternTriple.getObject(), dataTriple.getObject());
+	}
+
+	private static boolean equalNode(Node m, Node n) {
+		// m should not be null unless .getMatchXXXX used to get the node.
+		// Language tag canonicalization
+		n = fixupNode(n);
+		m = fixupNode(m);
+		return (m == null) || (m == Node.ANY) || m.equals(n);
+	}
+
+	private static Node fixupNode(Node node) {
+		if (node == null || node == Node.ANY)
+			return node;
+
+		// RDF says ... language tags should be canonicalized to lower case.
+		if (node.isLiteral()) {
+			String lang = node.getLiteralLanguage();
+			if (lang != null && !lang.equals(""))
+				node = NodeFactory.createLiteral(node.getLiteralLexicalForm(),
+						lang.toLowerCase(Locale.ROOT),
+						node.getLiteralDatatype());
+		}
+		return node;
+	}
+
+	private boolean isConcrete(Node node) {
+		boolean wild = (node == null || node == Node.ANY);
+		return !wild;
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/jena/blob/e7ac8b4d/jena-csv/src/main/java/org/apache/jena/propertytable/graph/QueryIterPropertyTable.java
----------------------------------------------------------------------
diff --git a/jena-csv/src/main/java/org/apache/jena/propertytable/graph/QueryIterPropertyTable.java b/jena-csv/src/main/java/org/apache/jena/propertytable/graph/QueryIterPropertyTable.java
new file mode 100644
index 0000000..9b13e6c
--- /dev/null
+++ b/jena-csv/src/main/java/org/apache/jena/propertytable/graph/QueryIterPropertyTable.java
@@ -0,0 +1,115 @@
+/*
+ * 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.graph;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+
+import org.apache.jena.atlas.io.IndentedWriter;
+
+import com.hp.hpl.jena.graph.Graph;
+import com.hp.hpl.jena.graph.Node;
+import com.hp.hpl.jena.graph.Triple;
+import com.hp.hpl.jena.sparql.core.BasicPattern;
+import com.hp.hpl.jena.sparql.engine.ExecutionContext;
+import com.hp.hpl.jena.sparql.engine.QueryIterator;
+import com.hp.hpl.jena.sparql.engine.binding.Binding;
+import com.hp.hpl.jena.sparql.engine.iterator.QueryIter1;
+import com.hp.hpl.jena.sparql.serializer.SerializationContext;
+import com.hp.hpl.jena.sparql.util.FmtUtils;
+import com.hp.hpl.jena.sparql.util.Utils;
+
+/**
+ * Split the incoming BasicPattern by subjects, (i.e. it becomes multiple sub BasicPatterns grouped by the same subjects.
+ *
+ */
+public class QueryIterPropertyTable extends QueryIter1 {
+	
+	private BasicPattern pattern;
+	private Graph graph;
+	private QueryIterator output;
+
+	public static QueryIterator create(QueryIterator input,
+			BasicPattern pattern, ExecutionContext execContext) {
+		return new QueryIterPropertyTable(input, pattern, execContext);
+	}
+
+	private QueryIterPropertyTable(QueryIterator input, BasicPattern pattern,
+			ExecutionContext execContext) {
+		super(input, execContext);
+		this.pattern = pattern;
+		graph = execContext.getActiveGraph();
+		// Create a chain of triple iterators.
+		QueryIterator chain = getInput();
+		Collection<BasicPattern> patterns = sort(pattern);
+		for (BasicPattern p : patterns)
+			chain = new QueryIterPropertyTableRow(chain, p, execContext);
+		output = chain;
+	}
+
+	private Collection<BasicPattern> sort(BasicPattern pattern) {
+		HashMap<Node, BasicPattern> map = new HashMap<Node, BasicPattern>();
+		for (Triple triple : pattern.getList()) {
+			Node subject = triple.getSubject();
+			if (!map.containsKey(subject)) {
+				List<Triple> triples = new ArrayList<Triple>();
+				BasicPattern p = BasicPattern.wrap(triples);
+				map.put(subject, p);
+				p.add(triple);
+			} else {
+				map.get(subject).add(triple);
+			}
+		}
+		return map.values();
+	}
+
+	@Override
+	protected boolean hasNextBinding() {
+		return output.hasNext();
+	}
+
+	@Override
+	protected Binding moveToNextBinding() {
+		return output.nextBinding();
+	}
+
+	@Override
+	protected void closeSubIterator() {
+		if (output != null)
+			output.close();
+		output = null;
+	}
+
+	@Override
+	protected void requestSubCancel() {
+		if (output != null)
+			output.cancel();
+	}
+
+	@Override
+	protected void details(IndentedWriter out, SerializationContext sCxt) {
+		out.print(Utils.className(this));
+		out.println();
+		out.incIndent();
+		FmtUtils.formatPattern(out, pattern, sCxt);
+		out.decIndent();
+	}
+}

http://git-wip-us.apache.org/repos/asf/jena/blob/e7ac8b4d/jena-csv/src/main/java/org/apache/jena/propertytable/graph/QueryIterPropertyTableRow.java
----------------------------------------------------------------------
diff --git a/jena-csv/src/main/java/org/apache/jena/propertytable/graph/QueryIterPropertyTableRow.java b/jena-csv/src/main/java/org/apache/jena/propertytable/graph/QueryIterPropertyTableRow.java
new file mode 100644
index 0000000..a479e25
--- /dev/null
+++ b/jena-csv/src/main/java/org/apache/jena/propertytable/graph/QueryIterPropertyTableRow.java
@@ -0,0 +1,243 @@
+/*
+ * 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.graph;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.jena.propertytable.PropertyTable;
+import org.apache.jena.propertytable.Row;
+
+
+import com.hp.hpl.jena.graph.Node;
+import com.hp.hpl.jena.graph.Triple;
+import com.hp.hpl.jena.sparql.ARQInternalErrorException;
+import com.hp.hpl.jena.sparql.core.BasicPattern;
+import com.hp.hpl.jena.sparql.core.Var;
+import com.hp.hpl.jena.sparql.engine.ExecutionContext;
+import com.hp.hpl.jena.sparql.engine.QueryIterator;
+import com.hp.hpl.jena.sparql.engine.binding.Binding;
+import com.hp.hpl.jena.sparql.engine.binding.BindingFactory;
+import com.hp.hpl.jena.sparql.engine.binding.BindingMap;
+import com.hp.hpl.jena.sparql.engine.iterator.QueryIter;
+import com.hp.hpl.jena.sparql.engine.iterator.QueryIterRepeatApply;
+import com.hp.hpl.jena.util.iterator.ClosableIterator;
+import com.hp.hpl.jena.util.iterator.ExtendedIterator;
+import com.hp.hpl.jena.util.iterator.NiceIterator;
+import com.hp.hpl.jena.util.iterator.WrappedIterator;
+
+/**
+ * If the triple size within a BasicePattern is greater than 1 (i.e. at least 2 triples), it's turned into a row querying.
+ *
+ */
+public class QueryIterPropertyTableRow  extends QueryIterRepeatApply{
+	
+	
+    private final BasicPattern pattern ;
+    
+    public QueryIterPropertyTableRow( QueryIterator input,
+                                   BasicPattern pattern , 
+                                   ExecutionContext cxt)
+    {
+        super(input, cxt) ;
+        this.pattern = pattern ;
+    }
+
+    @Override
+    protected QueryIterator nextStage(Binding binding)
+    {
+        return new RowMapper(binding, pattern, getExecContext()) ;
+    }
+    
+    static int countMapper = 0 ; 
+    static class RowMapper extends QueryIter
+    {   
+    	private PropertyTable table;
+    	
+    	private BasicPattern pattern;
+        private Binding binding ;
+        private ClosableIterator<Row> graphIter ;
+        private Binding slot = null ;
+        private boolean finished = false ;
+        private volatile boolean cancelled = false ;
+
+        RowMapper(Binding binding, BasicPattern pattern, ExecutionContext cxt)
+        {
+            super(cxt) ;
+            GraphPropertyTable graph = (GraphPropertyTable)cxt.getActiveGraph() ;
+            
+            this.pattern = substitute(pattern, binding);
+            this.binding = binding ;
+            BasicPattern pattern2 = tripleNode(pattern);
+            
+            ExtendedIterator<Row> iter = graph.propertyTableBaseFind( new RowMatch( pattern2) );
+            
+            if ( false )
+            {
+                // Materialize the results now. Debugging only.
+                List<Row> x = iter.toList() ;
+                this.graphIter = WrappedIterator.create(x.iterator()) ;
+                iter.close();
+            }
+            else
+                // Stream.
+                this.graphIter = iter ;
+        }
+
+        private static Node tripleNode(Node node)
+        {
+            if ( node.isVariable() )
+                return Node.ANY ;
+            return node ;
+        }
+        
+        private static BasicPattern tripleNode(BasicPattern pattern)
+        {
+        	List<Triple> triples = new ArrayList<Triple>();
+        	for (Triple triple: pattern){
+        		triples.add( tripleNode(triple) );
+        	}
+        	return BasicPattern.wrap(triples);
+        }
+        
+        private static Triple tripleNode(Triple triple){
+            Node s = tripleNode(triple.getSubject()) ;
+            Node p = tripleNode(triple.getPredicate()) ;
+            Node o = tripleNode(triple.getObject()) ;
+            return Triple.create(s, p, o);
+        }
+
+        private static Node substitute(Node node, Binding binding)
+        {
+            if ( Var.isVar(node) )
+            {
+                Node x = binding.get(Var.alloc(node)) ;
+                if ( x != null )
+                    return x ;
+            }
+            return node ;
+        }
+        
+        private static Triple substitute(Triple triple, Binding binding){
+            Node s = substitute(triple.getSubject(), binding) ;
+            Node p = substitute(triple.getPredicate(), binding) ;
+            Node o = substitute(triple.getObject(), binding) ;
+            return Triple.create(s, p, o);
+        }
+        
+        private static BasicPattern substitute(BasicPattern pattern , Binding binding)
+        {
+        	List<Triple> triples = new ArrayList<Triple>();
+        	for (Triple triple: pattern){
+        		triples.add( substitute(triple,binding) );
+        	}
+        	return BasicPattern.wrap(triples);
+        }
+        
+        private Binding mapper(Row r)
+        {
+            BindingMap results = BindingFactory.create(binding) ;
+
+            if ( ! insert(pattern, r, results) )
+                return null ; 
+            return results ;
+        }
+        
+        private static boolean insert(BasicPattern input, Row output, BindingMap results)
+        {	
+        	for (Triple triple: input){
+        		if (! insert(triple, output, results) ){
+        			return false;
+        		}
+        	}
+        	return true;
+        }
+        
+        private static boolean insert(Triple input, Row output, BindingMap results){
+        	if ( ! insert(input.getSubject(), output.getRowKey(), results) )
+                return false ;
+//        	if ( ! insert(input.getPredicate(), output.get, results) )
+//                return false ;
+            if ( ! insert(input.getObject(), output.getValue( input.getPredicate() ), results) )
+                return false ;
+            return true;
+        }
+
+        private static boolean insert(Node inputNode, Node outputNode, BindingMap results)
+        {
+            if ( ! Var.isVar(inputNode) )
+                return true ;
+            
+            Var v = Var.alloc(inputNode) ;
+            Node x = results.get(v) ;
+            if ( x != null )
+                return outputNode.equals(x) ;
+            
+            results.add(v, outputNode) ;
+            return true ;
+        }
+        
+        @Override
+        protected boolean hasNextBinding()
+        {
+            if ( finished ) return false ;
+            if ( slot != null ) return true ;
+            if ( cancelled )
+            {
+                graphIter.close() ;
+                finished = true ;
+                return false ;
+            }
+
+            while(graphIter.hasNext() && slot == null )
+            {
+                Row r = graphIter.next() ;
+                slot = mapper(r) ;
+            }
+            if ( slot == null )
+                finished = true ;
+            return slot != null ;
+        }
+
+        @Override
+        protected Binding moveToNextBinding()
+        {
+            if ( ! hasNextBinding() ) 
+                throw new ARQInternalErrorException() ;
+            Binding r = slot ;
+            slot = null ;
+            return r ;
+        }
+
+        @Override
+        protected void closeIterator()
+        {
+            if ( graphIter != null )
+                NiceIterator.close(graphIter) ;
+            graphIter = null ;
+        }
+        
+        @Override
+        protected void requestCancel()
+        {
+            // The QueryIteratorBase machinary will do the real work.
+            cancelled = true ;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/jena/blob/e7ac8b4d/jena-csv/src/main/java/org/apache/jena/propertytable/graph/RowMatch.java
----------------------------------------------------------------------
diff --git a/jena-csv/src/main/java/org/apache/jena/propertytable/graph/RowMatch.java b/jena-csv/src/main/java/org/apache/jena/propertytable/graph/RowMatch.java
new file mode 100644
index 0000000..15fe088
--- /dev/null
+++ b/jena-csv/src/main/java/org/apache/jena/propertytable/graph/RowMatch.java
@@ -0,0 +1,48 @@
+/*
+ * 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.graph;
+
+import com.hp.hpl.jena.graph.Node;
+import com.hp.hpl.jena.sparql.core.BasicPattern;
+
+/**
+ * The data structure for matching a Row
+ *
+ */
+public class RowMatch {
+	
+	private BasicPattern pattern;
+	
+	public RowMatch( BasicPattern pattern ){		
+		this.pattern=pattern;
+	}
+
+	public Node getMatchSubject(){
+		return pattern.get(0).getMatchSubject();
+	}
+	
+	public Node getSubject(){
+		return pattern.get(0).getSubject();
+	}
+	
+	public BasicPattern getBasicPattern(){
+		return pattern;
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/jena/blob/e7ac8b4d/jena-csv/src/main/java/org/apache/jena/propertytable/graph/StageGeneratorPropertyTable.java
----------------------------------------------------------------------
diff --git a/jena-csv/src/main/java/org/apache/jena/propertytable/graph/StageGeneratorPropertyTable.java b/jena-csv/src/main/java/org/apache/jena/propertytable/graph/StageGeneratorPropertyTable.java
new file mode 100644
index 0000000..9c3457b
--- /dev/null
+++ b/jena-csv/src/main/java/org/apache/jena/propertytable/graph/StageGeneratorPropertyTable.java
@@ -0,0 +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.graph;
+
+
+import com.hp.hpl.jena.graph.Graph;
+import com.hp.hpl.jena.sparql.core.BasicPattern;
+import com.hp.hpl.jena.sparql.engine.ExecutionContext;
+import com.hp.hpl.jena.sparql.engine.QueryIterator;
+import com.hp.hpl.jena.sparql.engine.main.StageGenerator;
+
+/**
+ *  The extension of StageGenerator for querying a Row.
+ *
+ */
+public class StageGeneratorPropertyTable implements StageGenerator {
+
+    // Using OpExecutor is preferred.
+    StageGenerator above = null ;
+    
+    public StageGeneratorPropertyTable(StageGenerator original)
+    {
+        above = original ;
+    }
+    
+    @Override
+    public QueryIterator execute(BasicPattern pattern, QueryIterator input, ExecutionContext execCxt)
+    {
+        // --- In case this isn't for GraphPropertyTable
+        Graph g = execCxt.getActiveGraph() ;
+        
+        if ( ! ( g instanceof GraphPropertyTable ) )
+            return above.execute(pattern, input, execCxt) ;
+        if (pattern.size() <= 1){
+        	return above.execute(pattern, input, execCxt) ;
+        }
+        return QueryIterPropertyTable.create(input, pattern, execCxt);
+    }
+    
+
+}

http://git-wip-us.apache.org/repos/asf/jena/blob/e7ac8b4d/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
new file mode 100644
index 0000000..f846aee
--- /dev/null
+++ b/jena-csv/src/main/java/org/apache/jena/propertytable/impl/ColumnImpl.java
@@ -0,0 +1,58 @@
+/*
+ * 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.propertytable.Column;
+import org.apache.jena.propertytable.PropertyTable;
+
+import com.hp.hpl.jena.graph.Node;
+
+/**
+ * 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/e7ac8b4d/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
new file mode 100644
index 0000000..b8e2708
--- /dev/null
+++ b/jena-csv/src/main/java/org/apache/jena/propertytable/impl/PropertyTableArrayImpl.java
@@ -0,0 +1,346 @@
+/*
+ * 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.propertytable.Column;
+import org.apache.jena.propertytable.PropertyTable;
+import org.apache.jena.propertytable.Row;
+
+import com.hp.hpl.jena.graph.Node;
+import com.hp.hpl.jena.graph.Triple;
+import com.hp.hpl.jena.util.iterator.ExtendedIterator;
+import com.hp.hpl.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();
+		}
+		
+	}
+
+
+
+
+}


Mime
View raw message