You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@metamodel.apache.org by ka...@apache.org on 2017/08/07 04:36:36 UTC

[01/20] metamodel git commit: first round of refactoring

Repository: metamodel
Updated Branches:
  refs/heads/master 2fe6a2b73 -> 57e48be23


http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/test/java/org/apache/metamodel/query/FromItemTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/metamodel/query/FromItemTest.java b/core/src/test/java/org/apache/metamodel/query/FromItemTest.java
index b026f8d..adca140 100644
--- a/core/src/test/java/org/apache/metamodel/query/FromItemTest.java
+++ b/core/src/test/java/org/apache/metamodel/query/FromItemTest.java
@@ -27,6 +27,9 @@ import org.apache.metamodel.schema.Relationship;
 import org.apache.metamodel.schema.Schema;
 import org.apache.metamodel.schema.Table;
 
+import java.util.Collection;
+import java.util.List;
+
 public class FromItemTest extends MetaModelTestCase {
 
 	private Schema _schema = getExampleSchema();
@@ -44,9 +47,9 @@ public class FromItemTest extends MetaModelTestCase {
 	public void testRelationJoinToString() throws Exception {
 		Table contributorTable = _schema.getTableByName(TABLE_CONTRIBUTOR);
 		Table roleTable = _schema.getTableByName(TABLE_ROLE);
-		Relationship[] relationships = roleTable
+		Collection<Relationship> relationships = roleTable
 				.getRelationships(contributorTable);
-		FromItem from = new FromItem(JoinType.INNER, relationships[0]);
+		FromItem from = new FromItem(JoinType.INNER, relationships.iterator().next());
 		assertEquals(
 				"MetaModelSchema.contributor INNER JOIN MetaModelSchema.role ON contributor.contributor_id = role.contributor_id",
 				from.toString());
@@ -73,7 +76,7 @@ public class FromItemTest extends MetaModelTestCase {
 		leftSide.setAlias("a");
 		SelectItem[] leftOn = new SelectItem[] { new SelectItem(projectIdColumn) };
 
-		Column[] columns = roleTable.getColumns();
+		List<Column> columns = roleTable.getColumns();
 
 		Query subQuery = new Query();
 		FromItem subQueryFrom = new FromItem(roleTable);
@@ -107,7 +110,7 @@ public class FromItemTest extends MetaModelTestCase {
    
         final QueryPostprocessDataContext dc = new QueryPostprocessDataContext() {
             @Override
-            protected DataSet materializeMainSchemaTable(Table table, Column[] columns, int maxRows) {
+            protected DataSet materializeMainSchemaTable(Table table, List<Column> columns, int maxRows) {
                 throw new UnsupportedOperationException("This method is not used");
             }
 

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/test/java/org/apache/metamodel/query/QueryTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/metamodel/query/QueryTest.java b/core/src/test/java/org/apache/metamodel/query/QueryTest.java
index 823c4d9..8e518c9 100644
--- a/core/src/test/java/org/apache/metamodel/query/QueryTest.java
+++ b/core/src/test/java/org/apache/metamodel/query/QueryTest.java
@@ -106,7 +106,7 @@ public class QueryTest extends MetaModelTestCase {
         Query q1 = new Query();
         Table contributorTable = _schema.getTableByName(TABLE_CONTRIBUTOR);
         Table roleTable = _schema.getTableByName(TABLE_ROLE);
-        FromItem fromItem = new FromItem(JoinType.INNER, contributorTable.getRelationships(roleTable)[0]);
+        FromItem fromItem = new FromItem(JoinType.INNER, contributorTable.getRelationships(roleTable).iterator().next());
         q1.from(fromItem);
 
         Column nameColumn = contributorTable.getColumnByName(COLUMN_CONTRIBUTOR_NAME);

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/test/java/org/apache/metamodel/query/SelectItemTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/metamodel/query/SelectItemTest.java b/core/src/test/java/org/apache/metamodel/query/SelectItemTest.java
index e6bbdca..7f412c0 100644
--- a/core/src/test/java/org/apache/metamodel/query/SelectItemTest.java
+++ b/core/src/test/java/org/apache/metamodel/query/SelectItemTest.java
@@ -24,14 +24,16 @@ import org.apache.metamodel.schema.MutableColumn;
 import org.apache.metamodel.schema.Schema;
 import org.apache.metamodel.schema.Table;
 
+import java.util.List;
+
 public class SelectItemTest extends MetaModelTestCase {
 
     private Schema _schema = getExampleSchema();
 
     public void testSelectColumnInFromItem() throws Exception {
         final Table projectTable = _schema.getTableByName(TABLE_PROJECT);
-        final Column column1 = projectTable.getColumns()[0];
-        final Column column2 = projectTable.getColumns()[1];
+        final Column column1 = projectTable.getColumns().get(0);
+        final Column column2 = projectTable.getColumns().get(1);
 
         Query q = new Query().from(projectTable, "a").from(projectTable, "b");
         q.select(column1, q.getFromClause().getItem(1));
@@ -41,12 +43,12 @@ public class SelectItemTest extends MetaModelTestCase {
     }
     
     public void testToSql() throws Exception {
-        SelectItem selectItem = new SelectItem(_schema.getTableByName(TABLE_PROJECT).getColumns()[0]);
+        SelectItem selectItem = new SelectItem(_schema.getTableByName(TABLE_PROJECT).getColumns().get(0));
         assertEquals("project.project_id", selectItem.toSql());
     }
     
     public void testToSqlFuntionApproximation() throws Exception {
-        SelectItem selectItem = new SelectItem(FunctionType.MAX, _schema.getTableByName(TABLE_PROJECT).getColumns()[0]);
+        SelectItem selectItem = new SelectItem(FunctionType.MAX, _schema.getTableByName(TABLE_PROJECT).getColumns().get(0));
         selectItem.setFunctionApproximationAllowed(true);
         assertEquals("APPROXIMATE MAX(project.project_id)", selectItem.toSql());
     }
@@ -65,10 +67,10 @@ public class SelectItemTest extends MetaModelTestCase {
         FromItem subQueryFrom = new FromItem(roleTable);
         subQueryFrom.setAlias("c");
         subQuery.from(subQueryFrom);
-        Column[] columns = roleTable.getColumns();
+        List<Column> columns = roleTable.getColumns();
         subQuery.select(columns);
 
-        SelectItem subQuerySelectItem = subQuery.getSelectClause().getSelectItem(columns[1]);
+        SelectItem subQuerySelectItem = subQuery.getSelectClause().getSelectItem(columns.get(1));
         FromItem rightSide = new FromItem(subQuery);
         rightSide.setAlias("b");
         SelectItem[] rightOn = new SelectItem[] { subQuerySelectItem };

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/test/java/org/apache/metamodel/query/builder/GroupedQueryBuilderImplTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/metamodel/query/builder/GroupedQueryBuilderImplTest.java b/core/src/test/java/org/apache/metamodel/query/builder/GroupedQueryBuilderImplTest.java
index 238889f..b4baf34 100644
--- a/core/src/test/java/org/apache/metamodel/query/builder/GroupedQueryBuilderImplTest.java
+++ b/core/src/test/java/org/apache/metamodel/query/builder/GroupedQueryBuilderImplTest.java
@@ -32,6 +32,8 @@ import org.apache.metamodel.schema.MutableTable;
 import org.apache.metamodel.schema.Schema;
 import org.apache.metamodel.schema.Table;
 
+import java.util.List;
+
 public class GroupedQueryBuilderImplTest extends TestCase {
 
 	public void testFindColumnWithAlias() throws Exception {
@@ -76,7 +78,7 @@ public class GroupedQueryBuilderImplTest extends TestCase {
 			}
 
 			@Override
-			protected String[] getSchemaNamesInternal() {
+			protected List<String> getSchemaNamesInternal() {
 				throw new UnsupportedOperationException();
 			}
 

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/test/java/org/apache/metamodel/query/builder/SyntaxExamplesTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/metamodel/query/builder/SyntaxExamplesTest.java b/core/src/test/java/org/apache/metamodel/query/builder/SyntaxExamplesTest.java
index af81801..d83e82a 100644
--- a/core/src/test/java/org/apache/metamodel/query/builder/SyntaxExamplesTest.java
+++ b/core/src/test/java/org/apache/metamodel/query/builder/SyntaxExamplesTest.java
@@ -42,11 +42,11 @@ public class SyntaxExamplesTest extends TestCase {
         super.setUp();
         dc = new MockDataContext("sch", "tab1", "foo");
         MutableSchema schema = (MutableSchema) dc.getDefaultSchema();
-        table1 = schema.getTables()[0];
+        table1 = schema.getTables().get(0);
         schema.addTable(new MutableTable("tab2").setSchema(schema));
         table2 = schema.getTableByName("tab2");
-        col1 = table1.getColumns()[0];
-        col2 = table1.getColumns()[1];
+        col1 = table1.getColumns().get(0);
+        col2 = table1.getColumns().get(1);
     }
 
     public void testSchema() throws Exception {

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/test/java/org/apache/metamodel/schema/MutableTableTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/metamodel/schema/MutableTableTest.java b/core/src/test/java/org/apache/metamodel/schema/MutableTableTest.java
index c738a2b..1e1351b 100644
--- a/core/src/test/java/org/apache/metamodel/schema/MutableTableTest.java
+++ b/core/src/test/java/org/apache/metamodel/schema/MutableTableTest.java
@@ -19,6 +19,7 @@
 package org.apache.metamodel.schema;
 
 import java.util.Arrays;
+import java.util.List;
 
 import junit.framework.TestCase;
 
@@ -53,17 +54,17 @@ public class MutableTableTest extends TestCase {
         t.addColumn(new MutableColumn("a").setType(ColumnType.VARCHAR));
         t.addColumn(new MutableColumn("r").setType(ColumnType.INTEGER));
 
-        Column[] cols = t.getColumnsOfType(ColumnType.VARCHAR);
-        assertEquals(2, cols.length);
-        assertEquals("b", cols[0].getName());
-        assertEquals("a", cols[1].getName());
+        List<Column> cols = t.getColumnsOfType(ColumnType.VARCHAR);
+        assertEquals(2, cols.size());
+        assertEquals("b", cols.get(0).getName());
+        assertEquals("a", cols.get(1).getName());
 
         cols = t.getColumnsOfType(ColumnType.INTEGER);
-        assertEquals(1, cols.length);
-        assertEquals("r", cols[0].getName());
+        assertEquals(1, cols.size());
+        assertEquals("r", cols.get(0).getName());
 
         cols = t.getColumnsOfType(ColumnType.FLOAT);
-        assertEquals(0, cols.length);
+        assertEquals(0, cols.size());
     }
 
     public void testGetIndexedColumns() throws Exception {
@@ -71,10 +72,10 @@ public class MutableTableTest extends TestCase {
         t.addColumn(new MutableColumn("b").setIndexed(true));
         t.addColumn(new MutableColumn("a").setIndexed(false));
         t.addColumn(new MutableColumn("r").setIndexed(true));
-        Column[] indexedColumns = t.getIndexedColumns();
+        List<Column> indexedColumns = t.getIndexedColumns();
         assertEquals(
                 "[Column[name=b,columnNumber=0,type=null,nullable=null,nativeType=null,columnSize=null], Column[name=r,columnNumber=0,type=null,nullable=null,nativeType=null,columnSize=null]]",
-                Arrays.toString(indexedColumns));
+                Arrays.toString(indexedColumns.toArray()));
         for (Column column : indexedColumns) {
             assertTrue(column.isIndexed());
         }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/test/java/org/apache/metamodel/schema/SchemaModelTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/metamodel/schema/SchemaModelTest.java b/core/src/test/java/org/apache/metamodel/schema/SchemaModelTest.java
index 956f7e8..0c00277 100644
--- a/core/src/test/java/org/apache/metamodel/schema/SchemaModelTest.java
+++ b/core/src/test/java/org/apache/metamodel/schema/SchemaModelTest.java
@@ -19,6 +19,8 @@
 package org.apache.metamodel.schema;
 
 import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
 
 import org.apache.metamodel.MetaModelTestCase;
 
@@ -28,7 +30,7 @@ public class SchemaModelTest extends MetaModelTestCase {
         Schema schema = getExampleSchema();
         assertEquals("MetaModelSchema", schema.getName());
         assertEquals("Schema[name=MetaModelSchema]", schema.toString());
-        assertEquals(5, schema.getRelationships().length);
+        assertEquals(5, schema.getRelationships().size());
 
         assertEquals(4, schema.getTableCount());
         assertEquals(3, schema.getTableCount(TableType.TABLE));
@@ -47,18 +49,18 @@ public class SchemaModelTest extends MetaModelTestCase {
         assertNotNull(projectTable.getColumnByName("project_id"));
 
         assertEquals("[project_id, name, lines_of_code, parent_project_id]",
-                Arrays.toString(projectTable.getColumnNames()));
+                Arrays.toString(projectTable.getColumnNames().toArray()));
 
         assertEquals(
                 "[Column[name=project_id,columnNumber=0,type=INTEGER,nullable=false,nativeType=null,columnSize=null], "
                         + "Column[name=lines_of_code,columnNumber=2,type=BIGINT,nullable=true,nativeType=null,columnSize=null], "
                         + "Column[name=parent_project_id,columnNumber=3,type=INTEGER,nullable=true,nativeType=null,columnSize=null]]",
-                Arrays.toString(projectTable.getNumberColumns()));
+                Arrays.toString(projectTable.getNumberColumns().toArray()));
 
         assertEquals("[Column[name=name,columnNumber=1,type=VARCHAR,nullable=false,nativeType=null,columnSize=null]]",
-                Arrays.toString(projectTable.getLiteralColumns()));
+                Arrays.toString(projectTable.getLiteralColumns().toArray()));
 
-        assertEquals("[]", Arrays.toString(projectTable.getTimeBasedColumns()));
+        assertEquals("[]", Arrays.toString(projectTable.getTimeBasedColumns().toArray()));
 
         assertNull(projectTable.getColumnByName("foobar"));
         assertNull(projectTable.getColumnByName(null));
@@ -71,34 +73,34 @@ public class SchemaModelTest extends MetaModelTestCase {
         assertEquals(3, projectContributorView.getColumnCount());
         assertEquals(3, projectContributorView.getRelationshipCount());
 
-        Relationship[] projectContributorToContributorRelations = projectContributorView
+        Collection<Relationship> projectContributorToContributorRelations = projectContributorView
                 .getRelationships(contributorTable);
-        assertEquals(1, projectContributorToContributorRelations.length);
-        Relationship[] contributorToProjectContributorRelations = contributorTable
+        assertEquals(1, projectContributorToContributorRelations.size());
+        Collection<Relationship> contributorToProjectContributorRelations = contributorTable
                 .getRelationships(projectContributorView);
-        assertEquals(1, contributorToProjectContributorRelations.length);
-        assertTrue(Arrays.equals(projectContributorToContributorRelations, contributorToProjectContributorRelations));
+        assertEquals(1, contributorToProjectContributorRelations.size());
+        assertTrue(projectContributorToContributorRelations.equals(contributorToProjectContributorRelations));
 
         assertEquals(
                 "Relationship[primaryTable=contributor,primaryColumns=[name],foreignTable=project_contributor,foreignColumns=[contributor]]",
-                projectContributorToContributorRelations[0].toString());
+                projectContributorToContributorRelations.iterator().next().toString());
 
-        ((MutableRelationship) projectContributorToContributorRelations[0]).remove();
+        ((MutableRelationship) projectContributorToContributorRelations.iterator().next()).remove();
         projectContributorToContributorRelations = projectContributorView.getRelationships(contributorTable);
-        assertEquals(0, projectContributorToContributorRelations.length);
+        assertEquals(0, projectContributorToContributorRelations.size());
         contributorToProjectContributorRelations = contributorTable.getRelationships(projectContributorView);
-        assertEquals(0, contributorToProjectContributorRelations.length);
+        assertEquals(0, contributorToProjectContributorRelations.size());
 
         // Get primary keys / Get foreign keys test
         assertEquals(
                 "[Column[name=contributor_id,columnNumber=0,type=INTEGER,nullable=false,nativeType=null,columnSize=null]]",
-                Arrays.toString(contributorTable.getPrimaryKeys()));
-        assertEquals("[]", Arrays.toString(contributorTable.getForeignKeys()));
+                Arrays.toString(contributorTable.getPrimaryKeys().toArray()));
+        assertEquals("[]", Arrays.toString(contributorTable.getForeignKeys().toArray()));
 
         assertEquals(
                 "[Column[name=contributor_id,columnNumber=0,type=INTEGER,nullable=false,nativeType=null,columnSize=null], Column[name=project_id,columnNumber=1,type=INTEGER,nullable=false,nativeType=null,columnSize=null]]",
-                Arrays.toString(roleTable.getPrimaryKeys()));
-        Column[] foreignKeys = roleTable.getForeignKeys();
-        assertEquals(2, foreignKeys.length);
+                Arrays.toString(roleTable.getPrimaryKeys().toArray()));
+        List<Column> foreignKeys = roleTable.getForeignKeys();
+        assertEquals(2, foreignKeys.size());
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/test/java/org/apache/metamodel/util/LegacyDeserializationObjectInputStreamTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/metamodel/util/LegacyDeserializationObjectInputStreamTest.java b/core/src/test/java/org/apache/metamodel/util/LegacyDeserializationObjectInputStreamTest.java
index fffb679..7753539 100644
--- a/core/src/test/java/org/apache/metamodel/util/LegacyDeserializationObjectInputStreamTest.java
+++ b/core/src/test/java/org/apache/metamodel/util/LegacyDeserializationObjectInputStreamTest.java
@@ -75,13 +75,12 @@ public class LegacyDeserializationObjectInputStreamTest extends TestCase {
 
         final Query q = (Query) obj;
         final Table table = q.getFromClause().getItem(0).getTable();
-        final Column[] columns = table.getColumns();
 
         assertEquals("Table[name=mytable,type=TABLE,remarks=null]", table.toString());
         assertEquals("Column[name=mycol1,columnNumber=0,type=INTEGER,nullable=false,nativeType=int,columnSize=16]",
-                columns[0].toString());
+                table.getColumn(0).toString());
         assertEquals("Column[name=mycol1,columnNumber=1,type=VARCHAR,nullable=true,nativeType=text,columnSize=255]",
-                columns[1].toString());
+                table.getColumn(1).toString());
 
         assertEquals("SELECT mytable.\"mycol1\" FROM myschema.mytable WHERE mytable.mycol1 = 'foo'", q.toSql());
     }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/sugarcrm/src/main/java/org/apache/metamodel/sugarcrm/SugarCrmDataContext.java
----------------------------------------------------------------------
diff --git a/sugarcrm/src/main/java/org/apache/metamodel/sugarcrm/SugarCrmDataContext.java b/sugarcrm/src/main/java/org/apache/metamodel/sugarcrm/SugarCrmDataContext.java
index 22446fc..e3908c0 100644
--- a/sugarcrm/src/main/java/org/apache/metamodel/sugarcrm/SugarCrmDataContext.java
+++ b/sugarcrm/src/main/java/org/apache/metamodel/sugarcrm/SugarCrmDataContext.java
@@ -38,7 +38,7 @@ import org.apache.metamodel.util.LazyRef;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.sugarcrm.ws.soap.EntryValue;
+import com.sugarcrm.ws.soapyxyx.EntryValue;
 import com.sugarcrm.ws.soap.GetEntriesCountResult;
 import com.sugarcrm.ws.soap.GetEntryListResultVersion2;
 import com.sugarcrm.ws.soap.LinkNamesToFieldsArray;

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/xml/src/main/java/org/apache/metamodel/xml/XmlDomDataContext.java
----------------------------------------------------------------------
diff --git a/xml/src/main/java/org/apache/metamodel/xml/XmlDomDataContext.java b/xml/src/main/java/org/apache/metamodel/xml/XmlDomDataContext.java
index b9936af..0d0bebb 100644
--- a/xml/src/main/java/org/apache/metamodel/xml/XmlDomDataContext.java
+++ b/xml/src/main/java/org/apache/metamodel/xml/XmlDomDataContext.java
@@ -21,13 +21,10 @@ package org.apache.metamodel.xml;
 import java.io.File;
 import java.io.InputStream;
 import java.net.URL;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.Map.Entry;
 import java.util.function.Supplier;
+import java.util.stream.Collectors;
 
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
@@ -178,7 +175,7 @@ public class XmlDomDataContext extends QueryPostprocessDataContext {
     }
 
     @Override
-    public DataSet materializeMainSchemaTable(Table table, Column[] columns, int maxRows) {
+    public DataSet materializeMainSchemaTable(Table table, List<Column> columns, int maxRows) {
         loadSchema();
         List<Object[]> tableData = _tableData.get(table.getName());
         if (tableData == null) {
@@ -186,7 +183,7 @@ public class XmlDomDataContext extends QueryPostprocessDataContext {
                     + _tableData.keySet());
         }
 
-        final SelectItem[] selectItems = MetaModelHelper.createSelectItems(columns);
+        final List<SelectItem> selectItems = columns.stream().map(SelectItem::new).collect(Collectors.toList());
         final DataSetHeader header = new CachingDataSetHeader(selectItems);
 
         final List<Row> resultData = new ArrayList<Row>();
@@ -195,9 +192,9 @@ public class XmlDomDataContext extends QueryPostprocessDataContext {
                 break;
             }
             maxRows--;
-            Object[] dataValues = new Object[columns.length];
-            for (int i = 0; i < columns.length; i++) {
-                Column column = columns[i];
+            Object[] dataValues = new Object[columns.size()];
+            for (int i = 0; i < columns.size(); i++) {
+                Column column = columns.get(i);
                 int columnNumber = column.getColumnNumber();
                 // Some rows may not contain values for all columns
                 // (attributes)
@@ -259,7 +256,7 @@ public class XmlDomDataContext extends QueryPostprocessDataContext {
 
         // Remove tables from schema that has no data (typically root
         // node or pure XML structure)
-        Table[] tables = _schema.getTables();
+        List<Table> tables = _schema.getTables();
         for (Table table : tables) {
             String tableName = table.getName();
             List<Object[]> tableRows = _tableData.get(tableName);
@@ -330,8 +327,8 @@ public class XmlDomDataContext extends QueryPostprocessDataContext {
                     foreignKeyColumn.setNativeType(NATIVE_TYPE_FOREIGN_KEY);
                     table.addColumn(foreignKeyColumn);
 
-                    MutableRelationship.createRelationship(new Column[] { parentKeyColumn }, new Column[] {
-                            foreignKeyColumn });
+                    MutableRelationship.createRelationship(parentKeyColumn ,
+                            foreignKeyColumn );
 
                 } else {
                     foreignKeyColumn = null;
@@ -339,9 +336,9 @@ public class XmlDomDataContext extends QueryPostprocessDataContext {
             } else {
                 idColumn = getIdColumn(table);
                 tableRows = _tableData.get(tableName);
-                Column[] foreignKeys = table.getForeignKeys();
-                if (foreignKeys.length == 1) {
-                    foreignKeyColumn = (MutableColumn) foreignKeys[0];
+                List<Column> foreignKeys = table.getForeignKeys();
+                if (foreignKeys.size() == 1) {
+                    foreignKeyColumn = (MutableColumn) foreignKeys.get(0);
                 } else {
                     foreignKeyColumn = null;
                 }
@@ -401,7 +398,7 @@ public class XmlDomDataContext extends QueryPostprocessDataContext {
     }
 
     private Column getTextContentColumn(MutableTable table, String preferredColumnName) {
-        Column[] columns = table.getColumns();
+        List<Column> columns = table.getColumns();
         MutableColumn column = null;
         for (Column col : columns) {
             if (NATIVE_TYPE_TEXT.equals(col.getNativeType())) {
@@ -420,7 +417,7 @@ public class XmlDomDataContext extends QueryPostprocessDataContext {
     }
 
     private MutableColumn getIdColumn(MutableTable table) {
-        Column[] columns = table.getColumns();
+        List<Column> columns = table.getColumns();
         MutableColumn column = null;
         for (Column col : columns) {
             if (NATIVE_TYPE_PRIMARY_KEY.equals(col.getNativeType())) {
@@ -507,18 +504,15 @@ public class XmlDomDataContext extends QueryPostprocessDataContext {
         // Check that foreignTable is not primary table in other relationships
         // (if so we can't flatten as that would require id-rewriting of those
         // foreign tables as well)
-        if (foreignTable.getPrimaryKeyRelationships().length != 0) {
-            Relationship[] foreignPrimaryRelationships = foreignTable.getPrimaryKeyRelationships();
-            String[] foreignPrimaryNames = new String[foreignPrimaryRelationships.length];
-            for (int i = 0; i < foreignPrimaryRelationships.length; i++) {
-                foreignPrimaryNames[i] = foreignPrimaryRelationships[i].getForeignTable().getName();
-            }
+        if (!foreignTable.getPrimaryKeyRelationships().isEmpty()) {
+            Collection<Relationship> foreignPrimaryRelationships = foreignTable.getPrimaryKeyRelationships();
             throw new UnsupportedOperationException("Cannot flatten foreign table '" + foreignTable.getName()
-                    + "' as it acts as primary table for tables: " + Arrays.toString(foreignPrimaryNames));
+                    + "' as it acts as primary table for tables: " + foreignPrimaryRelationships.stream()
+                    .map(ftRel -> ftRel.getForeignTable().getName()).collect(Collectors.joining(", ")));
         }
 
-        List<Column> primaryColumns = new ArrayList<Column>(Arrays.asList(primaryTable.getColumns()));
-        List<Column> foreignColumns = new ArrayList<Column>(Arrays.asList(foreignTable.getColumns()));
+        List<Column> primaryColumns = primaryTable.getColumns();
+        List<Column> foreignColumns = foreignTable.getColumns();
 
         // Remove the surrogate id
         String primaryTableName = primaryTable.getName();
@@ -527,8 +521,7 @@ public class XmlDomDataContext extends QueryPostprocessDataContext {
         foreignColumns.remove(idColumn);
 
         // Remove the foreign keys
-        Column[] foreignKeys = foreignTable.getForeignKeys();
-        for (Column foreignKey : foreignKeys) {
+        for (Column foreignKey : foreignTable.getForeignKeys()) {
             foreignColumns.remove(foreignKey);
         }
 
@@ -560,7 +553,7 @@ public class XmlDomDataContext extends QueryPostprocessDataContext {
             logger.info("Tables '" + primaryTableName + "' and '" + foreignTableName + "' flattened to: "
                     + primaryTableName);
             if (logger.isDebugEnabled()) {
-                logger.debug(primaryTableName + " columns: " + Arrays.toString(primaryTable.getColumns()));
+                logger.debug(primaryTableName + " columns: " + Arrays.toString(primaryTable.getColumns().toArray()));
             }
         }
 
@@ -574,22 +567,20 @@ public class XmlDomDataContext extends QueryPostprocessDataContext {
      * mapped tables).
      */
     public XmlDomDataContext autoFlattenTables() {
-        Table[] tables = _schema.getTables();
-        for (Table table : tables) {
+        for (Table table : _schema.getTables()) {
             // First check to see that this table still exist (ie. has not been
             // flattened in a previous loop)
             if (_tableData.containsKey(table.getName())) {
                 // Find all tables that represent inner tags
-                Relationship[] foreignKeyRelationships = table.getForeignKeyRelationships();
-                if (foreignKeyRelationships.length == 1 && table.getPrimaryKeyRelationships().length == 0) {
-                    Relationship foreignKeyRelationship = foreignKeyRelationships[0];
+                Collection<Relationship> foreignKeyRelationships = table.getForeignKeyRelationships();
+                if (foreignKeyRelationships.size() == 1 && table.getPrimaryKeyRelationships().size() == 0) {
+                    Relationship foreignKeyRelationship = foreignKeyRelationships.iterator().next();
 
                     // If there is exactly one inner tag then we can probably
                     // flatten the tables, but it's only relevant if the inner
                     // tag only carry a single data column
                     int nonDataColumns = 0;
-                    Column[] columns = table.getColumns();
-                    for (Column column : columns) {
+                    for (Column column : table.getColumns()) {
                         String nativeType = column.getNativeType();
                         // Use the native column type constants to determine if
                         // the column is an artificial column
@@ -598,14 +589,14 @@ public class XmlDomDataContext extends QueryPostprocessDataContext {
                         }
                     }
 
-                    if (columns.length == nonDataColumns + 1) {
+                    if (table.getColumns().size() == nonDataColumns + 1) {
                         // If the foreign key is unique for all rows, we will
                         // flatten it (otherwise it means that multiple inner
                         // tags occur, which requires two tables to deal with
                         // multiplicity)
                         boolean uniqueForeignKeys = true;
 
-                        Column[] foreignColumns = foreignKeyRelationship.getForeignColumns();
+                        List<Column> foreignColumns = foreignKeyRelationship.getForeignColumns();
 
                         SelectItem countAllItem = SelectItem.getCountAllItem();
                         Query q = new Query().select(foreignColumns).select(countAllItem).from(table).groupBy(

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/xml/src/main/java/org/apache/metamodel/xml/XmlSaxDataContext.java
----------------------------------------------------------------------
diff --git a/xml/src/main/java/org/apache/metamodel/xml/XmlSaxDataContext.java b/xml/src/main/java/org/apache/metamodel/xml/XmlSaxDataContext.java
index f1c2d6c..217503c 100644
--- a/xml/src/main/java/org/apache/metamodel/xml/XmlSaxDataContext.java
+++ b/xml/src/main/java/org/apache/metamodel/xml/XmlSaxDataContext.java
@@ -22,6 +22,7 @@ import java.io.File;
 import java.io.InputStream;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.function.Supplier;
 
@@ -205,13 +206,13 @@ public class XmlSaxDataContext extends QueryPostprocessDataContext {
     }
 
     @Override
-    protected DataSet materializeMainSchemaTable(Table table, Column[] columns, int maxRows) {
+    protected DataSet materializeMainSchemaTable(Table table, List<Column> columns, int maxRows) {
         final XmlSaxTableDef tableDef = getTableDef(table);
 
-        final String[] valueXpaths = new String[columns.length];
-        final SelectItem[] selectItems = new SelectItem[columns.length];
-        for (int i = 0; i < columns.length; i++) {
-            final Column column = columns[i];
+        final String[] valueXpaths = new String[columns.size()];
+        final SelectItem[] selectItems = new SelectItem[columns.size()];
+        for (int i = 0; i < columns.size(); i++) {
+            final Column column = columns.get(i);
             selectItems[i] = new SelectItem(column);
             valueXpaths[i] = getXpath(tableDef, column);
         }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/xml/src/test/java/org/apache/metamodel/xml/XmlDomDataContextTest.java
----------------------------------------------------------------------
diff --git a/xml/src/test/java/org/apache/metamodel/xml/XmlDomDataContextTest.java b/xml/src/test/java/org/apache/metamodel/xml/XmlDomDataContextTest.java
index 6985852..b5a7a02 100644
--- a/xml/src/test/java/org/apache/metamodel/xml/XmlDomDataContextTest.java
+++ b/xml/src/test/java/org/apache/metamodel/xml/XmlDomDataContextTest.java
@@ -51,7 +51,7 @@ public class XmlDomDataContextTest extends TestCase {
         try {
             XmlDomDataContext dataContext = new XmlDomDataContext(url, false);
             assertEquals("xml_input_eobjects.xml", dataContext.getDefaultSchema().getName());
-            assertEquals(2, dataContext.getSchemaNames().length);
+            assertEquals(2, dataContext.getSchemaNames().size());
             Schema schema = dataContext.getSchemaByName("xml_input_eobjects.xml");
             assertEquals("Schema[name=xml_input_eobjects.xml]", schema.toString());
             assertEquals(5, schema.getTableCount());
@@ -68,31 +68,30 @@ public class XmlDomDataContextTest extends TestCase {
         XmlDomDataContext dataContext = new XmlDomDataContext(file, false);
 
         assertEquals("xml_input_eobjects.xml", dataContext.getDefaultSchema().getName());
-        assertEquals(2, dataContext.getSchemaNames().length);
+        assertEquals(2, dataContext.getSchemaNames().size());
 
         Schema schema = dataContext.getSchemaByName("xml_input_eobjects.xml");
         assertEquals("Schema[name=xml_input_eobjects.xml]", schema.toString());
 
-        Table[] tables = schema.getTables();
         assertEquals(5, schema.getTableCount());
         assertEquals("[Table[name=eobjects.dk,type=TABLE,remarks=null], "
                 + "Table[name=contributors_person,type=TABLE,remarks=null], "
                 + "Table[name=contributors_person_name,type=TABLE,remarks=null], "
                 + "Table[name=contributors_person_address,type=TABLE,remarks=null], "
-                + "Table[name=projects_project,type=TABLE,remarks=null]]", Arrays.toString(tables));
+                + "Table[name=projects_project,type=TABLE,remarks=null]]", Arrays.toString(schema.getTables().toArray()));
 
         Table table = schema.getTableByName("eobjects.dk");
         assertEquals(2, table.getColumnCount());
         assertEquals(
                 "[Column[name=id,columnNumber=0,type=INTEGER,nullable=false,nativeType=Auto-generated primary key,columnSize=null], "
                         + "Column[name=website,columnNumber=2,type=STRING,nullable=true,nativeType=XML Attribute,columnSize=null]]",
-                Arrays.toString(table.getColumns()));
+                Arrays.toString(table.getColumns().toArray()));
 
         table = schema.getTableByName("contributors_person");
         assertEquals(1, table.getColumnCount());
         assertEquals(
                 "[Column[name=id,columnNumber=0,type=INTEGER,nullable=false,nativeType=Auto-generated primary key,columnSize=null]]",
-                Arrays.toString(table.getColumns()));
+                Arrays.toString(table.getColumns().toArray()));
 
         table = schema.getTableByName("contributors_person_name");
         assertEquals(3, table.getColumnCount());
@@ -100,10 +99,10 @@ public class XmlDomDataContextTest extends TestCase {
                 "[Column[name=id,columnNumber=0,type=INTEGER,nullable=false,nativeType=Auto-generated primary key,columnSize=null], "
                         + "Column[name=contributors_person_id,columnNumber=1,type=INTEGER,nullable=false,nativeType=Auto-generated foreign key,columnSize=null], "
                         + "Column[name=name,columnNumber=2,type=STRING,nullable=true,nativeType=XML Text,columnSize=null]]",
-                Arrays.toString(table.getColumns()));
+                Arrays.toString(table.getColumns().toArray()));
         assertEquals("[Relationship[primaryTable=contributors_person,primaryColumns=[id],"
                 + "foreignTable=contributors_person_name,foreignColumns=[contributors_person_id]]]",
-                Arrays.toString(table.getRelationships()));
+                Arrays.toString(table.getRelationships().toArray()));
 
         table = schema.getTableByName("contributors_person_address");
         assertEquals(3, table.getColumnCount());
@@ -111,10 +110,10 @@ public class XmlDomDataContextTest extends TestCase {
                 "[Column[name=id,columnNumber=0,type=INTEGER,nullable=false,nativeType=Auto-generated primary key,columnSize=null], "
                         + "Column[name=contributors_person_id,columnNumber=1,type=INTEGER,nullable=false,nativeType=Auto-generated foreign key,columnSize=null], "
                         + "Column[name=address,columnNumber=2,type=STRING,nullable=true,nativeType=XML Text,columnSize=null]]",
-                Arrays.toString(table.getColumns()));
+                Arrays.toString(table.getColumns().toArray()));
         assertEquals("[Relationship[primaryTable=contributors_person,primaryColumns=[id],"
                 + "foreignTable=contributors_person_address,foreignColumns=[contributors_person_id]]]",
-                Arrays.toString(table.getRelationships()));
+                Arrays.toString(table.getRelationships().toArray()));
 
         table = schema.getTableByName("projects_project");
         assertEquals(3, table.getColumnCount());
@@ -122,7 +121,7 @@ public class XmlDomDataContextTest extends TestCase {
                 "[Column[name=id,columnNumber=0,type=INTEGER,nullable=false,nativeType=Auto-generated primary key,columnSize=null], "
                         + "Column[name=project,columnNumber=1,type=STRING,nullable=true,nativeType=XML Text,columnSize=null], "
                         + "Column[name=name,columnNumber=2,type=STRING,nullable=true,nativeType=XML Attribute,columnSize=null]]",
-                Arrays.toString(table.getColumns()));
+                Arrays.toString(table.getColumns().toArray()));
 
         dataContext.autoFlattenTables();
         table = schema.getTableByName("contributors_person");
@@ -130,7 +129,7 @@ public class XmlDomDataContextTest extends TestCase {
         assertEquals(
                 "[Column[name=id,columnNumber=0,type=INTEGER,nullable=false,nativeType=Auto-generated primary key,columnSize=null], "
                         + "Column[name=name,columnNumber=1,type=STRING,nullable=true,nativeType=XML Text,columnSize=null]]",
-                Arrays.toString(table.getColumns()));
+                Arrays.toString(table.getColumns().toArray()));
     }
 
     public void testExecuteQuery() throws Exception {
@@ -159,7 +158,7 @@ public class XmlDomDataContextTest extends TestCase {
 
         // Make a new query that joins the normalized tables together
         table = schema.getTableByName("contributors_person_address");
-        Relationship relationShip = table.getRelationships()[0];
+        Relationship relationShip = table.getRelationships().iterator().next();
         q = new Query().select(relationShip.getPrimaryTable().getColumns())
                 .select(relationShip.getForeignTable().getColumns()).from(new FromItem(JoinType.INNER, relationShip));
 
@@ -211,12 +210,12 @@ public class XmlDomDataContextTest extends TestCase {
         XmlDomDataContext strategy = new XmlDomDataContext("foobarSchema", document, true);
         Schema schema = strategy.getSchemaByName("foobarSchema");
         assertEquals("Schema[name=foobarSchema]", schema.toString());
-        assertEquals("[Table[name=child,type=TABLE,remarks=null]]", Arrays.toString(schema.getTables()));
-        Table table = schema.getTables()[0];
+        assertEquals("[Table[name=child,type=TABLE,remarks=null]]", Arrays.toString(schema.getTables().toArray()));
+        Table table = schema.getTable(0);
         assertEquals(
                 "[Column[name=id,columnNumber=0,type=INTEGER,nullable=false,nativeType=Auto-generated primary key,columnSize=null], "
                         + "Column[name=child,columnNumber=1,type=STRING,nullable=true,nativeType=XML Text,columnSize=null]]",
-                Arrays.toString(table.getColumns()));
+                Arrays.toString(table.getColumns().toArray()));
     }
 
     public void testFlattenTables() throws Exception {
@@ -227,18 +226,18 @@ public class XmlDomDataContextTest extends TestCase {
                 + "Table[name=dependency_groupId,type=TABLE,remarks=null], "
                 + "Table[name=dependency_artifactId,type=TABLE,remarks=null], "
                 + "Table[name=dependency_version,type=TABLE,remarks=null], "
-                + "Table[name=dependency_scope,type=TABLE,remarks=null]]", Arrays.toString(schema.getTables()));
+                + "Table[name=dependency_scope,type=TABLE,remarks=null]]", Arrays.toString(schema.getTables().toArray()));
         Table dependencyTable = schema.getTableByName("dependency");
         assertEquals(
                 "[Column[name=id,columnNumber=0,type=INTEGER,nullable=false,nativeType=Auto-generated primary key,columnSize=null]]",
-                Arrays.toString(dependencyTable.getColumns()));
+                Arrays.toString(dependencyTable.getColumns().toArray()));
         List<Object[]> dependencyData = dc
                 .materializeMainSchemaTable(dependencyTable, dependencyTable.getColumns(), -1).toObjectArrays();
         assertEquals(11, dependencyData.size());
         assertEquals("[1]", Arrays.toString(dependencyData.get(0)));
         assertEquals("[11]", Arrays.toString(dependencyData.get(10)));
 
-        Relationship relationship = schema.getTableByName("dependency_groupId").getRelationships()[0];
+        Relationship relationship = schema.getTableByName("dependency_groupId").getRelationships().iterator().next();
         assertEquals(
                 "Relationship[primaryTable=dependency,primaryColumns=[id],foreignTable=dependency_groupId,foreignColumns=[dependency_id]]",
                 relationship.toString());
@@ -248,12 +247,12 @@ public class XmlDomDataContextTest extends TestCase {
         assertEquals("[Table[name=dependency,type=TABLE,remarks=null], "
                 + "Table[name=dependency_artifactId,type=TABLE,remarks=null], "
                 + "Table[name=dependency_version,type=TABLE,remarks=null], "
-                + "Table[name=dependency_scope,type=TABLE,remarks=null]]", Arrays.toString(schema.getTables()));
+                + "Table[name=dependency_scope,type=TABLE,remarks=null]]", Arrays.toString(schema.getTables().toArray()));
 
         assertEquals(
                 "[Column[name=id,columnNumber=0,type=INTEGER,nullable=false,nativeType=Auto-generated primary key,columnSize=null], "
                         + "Column[name=groupId,columnNumber=1,type=STRING,nullable=true,nativeType=XML Text,columnSize=null]]",
-                Arrays.toString(dependencyTable.getColumns()));
+                Arrays.toString(dependencyTable.getColumns().toArray()));
 
         dependencyData = dc.materializeMainSchemaTable(dependencyTable, dependencyTable.getColumns(), -1)
                 .toObjectArrays();
@@ -263,14 +262,14 @@ public class XmlDomDataContextTest extends TestCase {
 
         dc.autoFlattenTables();
 
-        assertEquals("[Table[name=dependency,type=TABLE,remarks=null]]", Arrays.toString(schema.getTables()));
+        assertEquals("[Table[name=dependency,type=TABLE,remarks=null]]", Arrays.toString(schema.getTables().toArray()));
         assertEquals(
                 "[Column[name=id,columnNumber=0,type=INTEGER,nullable=false,nativeType=Auto-generated primary key,columnSize=null], "
                         + "Column[name=groupId,columnNumber=1,type=STRING,nullable=true,nativeType=XML Text,columnSize=null], "
                         + "Column[name=artifactId,columnNumber=2,type=STRING,nullable=true,nativeType=XML Text,columnSize=null], "
                         + "Column[name=version,columnNumber=3,type=STRING,nullable=true,nativeType=XML Text,columnSize=null], "
                         + "Column[name=scope,columnNumber=4,type=STRING,nullable=true,nativeType=XML Text,columnSize=null]]",
-                Arrays.toString(dependencyTable.getColumns()));
+                Arrays.toString(dependencyTable.getColumns().toArray()));
 
         dependencyData = dc.materializeMainSchemaTable(dependencyTable, dependencyTable.getColumns(), -1)
                 .toObjectArrays();
@@ -290,13 +289,13 @@ public class XmlDomDataContextTest extends TestCase {
                         + "Column[name=artifactId,columnNumber=2,type=STRING,nullable=true,nativeType=XML Text,columnSize=null], "
                         + "Column[name=version,columnNumber=3,type=STRING,nullable=true,nativeType=XML Text,columnSize=null], "
                         + "Column[name=scope,columnNumber=4,type=STRING,nullable=true,nativeType=XML Text,columnSize=null]]",
-                Arrays.toString(table.getColumns()));
+                Arrays.toString(table.getColumns().toArray()));
 
         table = schema.getTableByName("inceptionYear");
         assertEquals(
                 "[Column[name=id,columnNumber=0,type=INTEGER,nullable=false,nativeType=Auto-generated primary key,columnSize=null], "
                         + "Column[name=inceptionYear,columnNumber=1,type=STRING,nullable=true,nativeType=XML Text,columnSize=null]]",
-                Arrays.toString(table.getColumns()));
+                Arrays.toString(table.getColumns().toArray()));
 
         // first read
         DataSet data = dc.executeQuery(new Query().select(table.getColumnByName("inceptionYear")).from(table)
@@ -323,10 +322,10 @@ public class XmlDomDataContextTest extends TestCase {
                 + "Machine_Hardware_Network_Adapter, Machine_Hardware_UART_Port, Machine_Hardware_LPT_Port, "
                 + "Machine_Hardware_AudioAdapter, Machine_Hardware_SharedFolders_SharedFolder, "
                 + "Machine_Hardware_Guest, Machine_HardDiskAttachments_HardDiskAttachment]",
-                Arrays.toString(schema.getTableNames()));
+                Arrays.toString(schema.getTableNames().toArray()));
         assertEquals(
                 "[id, OSType, lastStateChange, name, uuid, enabled, enabled, RAMSize, enabled, enabled, mode, value, "
                         + "enabled, type, enabled, mode]",
-                Arrays.toString(schema.getTableByName("Machine").getColumnNames()));
+                Arrays.toString(schema.getTableByName("Machine").getColumnNames().toArray()));
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/xml/src/test/java/org/apache/metamodel/xml/XmlSaxDataContextTest.java
----------------------------------------------------------------------
diff --git a/xml/src/test/java/org/apache/metamodel/xml/XmlSaxDataContextTest.java b/xml/src/test/java/org/apache/metamodel/xml/XmlSaxDataContextTest.java
index d150aac..4ee8dba 100644
--- a/xml/src/test/java/org/apache/metamodel/xml/XmlSaxDataContextTest.java
+++ b/xml/src/test/java/org/apache/metamodel/xml/XmlSaxDataContextTest.java
@@ -44,11 +44,11 @@ public class XmlSaxDataContextTest extends TestCase {
 
 		final Schema schema = dc.getDefaultSchema();
 		assertEquals("Schema[name=/dependencies]", schema.toString());
-		assertEquals("[/dependency]", Arrays.toString(schema.getTableNames()));
+		assertEquals("[/dependency]", Arrays.toString(schema.getTableNames().toArray()));
 
 		final Table table = schema.getTableByName("/dependency");
 		assertEquals("[row_id, /artifactId, /groupId, /version, /scope]",
-				Arrays.toString(table.getColumnNames()));
+				Arrays.toString(table.getColumnNames().toArray()));
 
 		// perform a regular query
 		DataSet ds = dc.query().from(table).select(table.getColumns())
@@ -112,13 +112,13 @@ public class XmlSaxDataContextTest extends TestCase {
 		final Schema schema = dc.getDefaultSchema();
 		assertEquals("Schema[name=/root]", schema.toString());
 		assertEquals("[/employee, /organization]",
-				Arrays.toString(schema.getTableNames()));
+				Arrays.toString(schema.getTableNames().toArray()));
 
 		// organization assertions
 		final Table organizationTable = schema.getTableByName("/organization");
 		{
 			assertEquals("[row_id, /name, @type]",
-					Arrays.toString(organizationTable.getColumnNames()));
+					Arrays.toString(organizationTable.getColumnNames().toArray()));
 
 			DataSet ds = dc.query().from(organizationTable)
 					.select(organizationTable.getColumns()).execute();
@@ -140,7 +140,7 @@ public class XmlSaxDataContextTest extends TestCase {
 		{
 			assertEquals(
 					"[row_id, /name, /gender, index(/root/organization/employees), index(/root/organization)]",
-					Arrays.toString(employeeTable.getColumnNames()));
+					Arrays.toString(employeeTable.getColumnNames().toArray()));
 
 			DataSet ds = dc.query().from(employeeTable)
 					.select(employeeTable.getColumns()).execute();


[18/20] metamodel git commit: Merge pull request #1 from kaspersorensen/feature/collectionsInterfaces

Posted by ka...@apache.org.
Merge pull request #1 from kaspersorensen/feature/collectionsInterfaces

Fixed unused import and deprecation warnings

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

Branch: refs/heads/master
Commit: a07b8fe100925c9e4ed328b80319e48c72045dda
Parents: 840aea4 d24c3e5
Author: tomatophantastico <jo...@unbehauen.net>
Authored: Fri Aug 4 12:12:26 2017 +0200
Committer: GitHub <no...@github.com>
Committed: Fri Aug 4 12:12:26 2017 +0200

----------------------------------------------------------------------
 .../apache/metamodel/data/UnionDataSetTest.java |  4 +-
 .../metamodel/couchdb/CouchDbDataContext.java   |  1 -
 .../apache/metamodel/couchdb/CouchDbUtils.java  |  8 +--
 .../nativeclient/ElasticSearchDataSet.java      |  1 -
 .../rest/JestElasticSearchDataSet.java          | 19 ++++---
 .../rest/JestElasticSearchUpdateCallback.java   |  1 -
 .../metamodel/excel/ExcelDataContext.java       | 21 +++----
 .../metamodel/excel/ExcelDeleteBuilder.java     |  7 +--
 .../org/apache/metamodel/excel/ExcelUtils.java  | 59 +++++++++-----------
 .../excel/XlsxSpreadsheetReaderDelegate.java    |  1 -
 .../fixedwidth/EbcdicConfiguration.java         |  2 +
 .../apache/metamodel/jdbc/JdbcDataContext.java  |  1 -
 .../org/apache/metamodel/jdbc/JdbcSchema.java   |  1 -
 .../metamodel/jdbc/JdbcDataContextTest.java     |  3 +-
 .../jdbc/integrationtests/FirebirdTest.java     |  4 +-
 .../jdbc/integrationtests/OracleTest.java       |  4 +-
 .../apache/metamodel/json/JsonDataContext.java  |  1 -
 .../metamodel/json/JsonDataContextTest.java     |  5 +-
 .../mongodb/mongo2/MongoDbDataSet.java          |  5 +-
 .../mongodb/mongo3/MongoDbDataSet.java          |  5 +-
 .../mongodb/mongo3/MongoDbDataContextTest.java  |  5 +-
 .../metamodel/neo4j/Neo4jDataContext.java       |  1 -
 .../metamodel/neo4j/Neo4jDataContextTest.java   |  1 -
 .../apache/metamodel/pojo/PojoDataContext.java  |  1 -
 .../salesforce/SalesforceDataContext.java       |  3 +-
 .../salesforce/SalesforceUpdateCallback.java    |  1 -
 .../apache/metamodel/xml/XmlDomDataContext.java |  1 -
 27 files changed, 69 insertions(+), 97 deletions(-)
----------------------------------------------------------------------



[02/20] metamodel git commit: first round of refactoring

Posted by ka...@apache.org.
http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/main/java/org/apache/metamodel/schema/ImmutableRelationship.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/schema/ImmutableRelationship.java b/core/src/main/java/org/apache/metamodel/schema/ImmutableRelationship.java
index 2bcf95b..b930359 100644
--- a/core/src/main/java/org/apache/metamodel/schema/ImmutableRelationship.java
+++ b/core/src/main/java/org/apache/metamodel/schema/ImmutableRelationship.java
@@ -19,27 +19,30 @@
 package org.apache.metamodel.schema;
 
 import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
 
 public final class ImmutableRelationship extends AbstractRelationship implements Serializable {
 
 	private static final long serialVersionUID = 1L;
 
-	private final Column[] primaryColumns;
-	private final Column[] foreignColumns;
+	private final List<Column> primaryColumns;
+	private final List<Column> foreignColumns;
 
 	public static void create(Relationship origRelationship,
 			ImmutableSchema schema) {
 		ImmutableTable primaryTable = getSimilarTable(
 				origRelationship.getPrimaryTable(), schema);
 		assert primaryTable != null;
-		Column[] primaryColumns = getSimilarColumns(
+		List<Column> primaryColumns = getSimilarColumns(
 				origRelationship.getPrimaryColumns(), primaryTable);
 		checkSameTable(primaryColumns);
 
 		ImmutableTable foreignTable = getSimilarTable(
 				origRelationship.getForeignTable(), schema);
 		assert foreignTable != null;
-		Column[] foreignColumns = getSimilarColumns(
+		List<Column> foreignColumns = getSimilarColumns(
 				origRelationship.getForeignColumns(), foreignTable);
 		checkSameTable(foreignColumns);
 
@@ -49,13 +52,11 @@ public final class ImmutableRelationship extends AbstractRelationship implements
 		foreignTable.addRelationship(relationship);
 	}
 
-	private static Column[] getSimilarColumns(Column[] columns, Table table) {
-		Column[] result = new Column[columns.length];
-		for (int i = 0; i < columns.length; i++) {
-			String name = columns[i].getName();
-			result[i] = table.getColumnByName(name);
-		}
-		return result;
+	private static List<Column> getSimilarColumns(List<Column> columns, Table table) {
+		return columns.stream()
+				.map( col -> table.getColumnByName(col.getName()))
+				.collect(Collectors.toList());
+
 	}
 
 	private static ImmutableTable getSimilarTable(Table table,
@@ -64,19 +65,19 @@ public final class ImmutableRelationship extends AbstractRelationship implements
 		return (ImmutableTable) schema.getTableByName(name);
 	}
 
-	private ImmutableRelationship(Column[] primaryColumns,
-			Column[] foreignColumns) {
+	private ImmutableRelationship(List<Column> primaryColumns,
+			List<Column> foreignColumns) {
 		this.primaryColumns = primaryColumns;
 		this.foreignColumns = foreignColumns;
 	}
 
 	@Override
-	public Column[] getPrimaryColumns() {
+	public List<Column> getPrimaryColumns() {
 		return primaryColumns;
 	}
 
 	@Override
-	public Column[] getForeignColumns() {
+	public List<Column> getForeignColumns() {
 		return foreignColumns;
 	}
 }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/main/java/org/apache/metamodel/schema/ImmutableSchema.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/schema/ImmutableSchema.java b/core/src/main/java/org/apache/metamodel/schema/ImmutableSchema.java
index ddceb12..8da76eb 100644
--- a/core/src/main/java/org/apache/metamodel/schema/ImmutableSchema.java
+++ b/core/src/main/java/org/apache/metamodel/schema/ImmutableSchema.java
@@ -20,6 +20,8 @@ package org.apache.metamodel.schema;
 
 import java.io.Serializable;
 import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 
 /**
@@ -42,20 +44,20 @@ public final class ImmutableSchema extends AbstractSchema implements
 
 	public ImmutableSchema(Schema schema) {
 		this(schema.getName(), schema.getQuote());
-		Table[] origTables = schema.getTables();
+		List<Table> origTables = schema.getTables();
 		for (Table table : origTables) {
 			tables.add(new ImmutableTable(table, this));
 		}
 
-		Relationship[] origRelationships = schema.getRelationships();
+		Collection<Relationship> origRelationships = schema.getRelationships();
 		for (Relationship relationship : origRelationships) {
 			ImmutableRelationship.create(relationship, this);
 		}
 	}
 
 	@Override
-	public Table[] getTables() {
-		return tables.toArray(new Table[tables.size()]);
+	public List<Table> getTables() {
+		return Collections.unmodifiableList(tables);
 	}
 
 	@Override

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/main/java/org/apache/metamodel/schema/ImmutableTable.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/schema/ImmutableTable.java b/core/src/main/java/org/apache/metamodel/schema/ImmutableTable.java
index d807290..150384c 100644
--- a/core/src/main/java/org/apache/metamodel/schema/ImmutableTable.java
+++ b/core/src/main/java/org/apache/metamodel/schema/ImmutableTable.java
@@ -20,6 +20,8 @@ package org.apache.metamodel.schema;
 
 import java.io.Serializable;
 import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 
 /**
@@ -54,7 +56,7 @@ final class ImmutableTable extends AbstractTable implements Serializable {
 	protected ImmutableTable(Table table, ImmutableSchema schema) {
 		this(table.getName(), table.getType(), schema, table.getRemarks(),
 				table.getQuote());
-		Column[] origColumns = table.getColumns();
+		List<Column> origColumns = table.getColumns();
 		for (Column column : origColumns) {
 			columns.add(new ImmutableColumn(column, this));
 		}
@@ -67,8 +69,8 @@ final class ImmutableTable extends AbstractTable implements Serializable {
 	}
 
 	@Override
-	public Column[] getColumns() {
-		return columns.toArray(new Column[columns.size()]);
+	public List<Column> getColumns() {
+		return Collections.unmodifiableList(columns);
 	}
 
 	@Override
@@ -82,8 +84,8 @@ final class ImmutableTable extends AbstractTable implements Serializable {
 	}
 
 	@Override
-	public Relationship[] getRelationships() {
-		return relationships.toArray(new Relationship[relationships.size()]);
+	public Collection<Relationship> getRelationships() {
+		return Collections.unmodifiableCollection(relationships);
 	}
 
 	@Override

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/main/java/org/apache/metamodel/schema/MutableRelationship.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/schema/MutableRelationship.java b/core/src/main/java/org/apache/metamodel/schema/MutableRelationship.java
index e96c86c..466244c 100644
--- a/core/src/main/java/org/apache/metamodel/schema/MutableRelationship.java
+++ b/core/src/main/java/org/apache/metamodel/schema/MutableRelationship.java
@@ -19,6 +19,8 @@
 package org.apache.metamodel.schema;
 
 import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -36,8 +38,8 @@ public class MutableRelationship extends AbstractRelationship implements
 	private static final Logger logger = LoggerFactory
 			.getLogger(MutableRelationship.class);
 
-	private final Column[] _primaryColumns;
-	private final Column[] _foreignColumns;
+	private final List<Column> _primaryColumns;
+	private final List<Column> _foreignColumns;
 
 	/**
 	 * Factory method to create relations between two tables by specifying which
@@ -49,8 +51,8 @@ public class MutableRelationship extends AbstractRelationship implements
 	 *            the columns from the foreign key table
 	 * @return the relation created
 	 */
-	public static Relationship createRelationship(Column[] primaryColumns,
-			Column[] foreignColumns) {
+	public static Relationship createRelationship(List<Column> primaryColumns,
+			List<Column> foreignColumns) {
 		Table primaryTable = checkSameTable(primaryColumns);
 		Table foreignTable = checkSameTable(foreignColumns);
 		MutableRelationship relation = new MutableRelationship(primaryColumns,
@@ -105,25 +107,30 @@ public class MutableRelationship extends AbstractRelationship implements
 
 	public static Relationship createRelationship(Column primaryColumn,
 			Column foreignColumn) {
-		return createRelationship(new Column[] { primaryColumn },
-				new Column[] { foreignColumn });
+		List<Column> pcols = new ArrayList<>();
+		pcols.add(primaryColumn);
+		List<Column> fcols = new ArrayList<>();
+		pcols.add(foreignColumn);
+
+
+		return createRelationship(pcols, fcols);
 	}
 
 	/**
 	 * Prevent external instantiation
 	 */
-	private MutableRelationship(Column[] primaryColumns, Column[] foreignColumns) {
+	private MutableRelationship(List<Column> primaryColumns, List<Column> foreignColumns) {
 		_primaryColumns = primaryColumns;
 		_foreignColumns = foreignColumns;
 	}
 
 	@Override
-	public Column[] getPrimaryColumns() {
+	public List<Column> getPrimaryColumns() {
 		return _primaryColumns;
 	}
 
 	@Override
-	public Column[] getForeignColumns() {
+	public List<Column> getForeignColumns() {
 		return _foreignColumns;
 	}
 

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/main/java/org/apache/metamodel/schema/MutableSchema.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/schema/MutableSchema.java b/core/src/main/java/org/apache/metamodel/schema/MutableSchema.java
index c4cfe2e..29d361b 100644
--- a/core/src/main/java/org/apache/metamodel/schema/MutableSchema.java
+++ b/core/src/main/java/org/apache/metamodel/schema/MutableSchema.java
@@ -21,6 +21,7 @@ package org.apache.metamodel.schema;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 
 /**
@@ -63,9 +64,8 @@ public class MutableSchema extends AbstractSchema implements Serializable,
 	}
 
 	@Override
-	public MutableTable[] getTables() {
-		MutableTable[] array = new MutableTable[_tables.size()];
-		return _tables.toArray(array);
+	public List<Table> getTables() {
+		return Collections.unmodifiableList(_tables);
 	}
 
 	public MutableSchema setTables(Collection<? extends MutableTable> tables) {

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/main/java/org/apache/metamodel/schema/MutableTable.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/schema/MutableTable.java b/core/src/main/java/org/apache/metamodel/schema/MutableTable.java
index 904fc81..0b3475c 100644
--- a/core/src/main/java/org/apache/metamodel/schema/MutableTable.java
+++ b/core/src/main/java/org/apache/metamodel/schema/MutableTable.java
@@ -21,6 +21,7 @@ package org.apache.metamodel.schema;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 
 /**
@@ -100,9 +101,8 @@ public class MutableTable extends AbstractTable implements Serializable {
     }
 
     @Override
-    public Column[] getColumns() {
-        List<Column> columns = getColumnsInternal();
-        return columns.toArray(new Column[columns.size()]);
+    public List<Column> getColumns() {
+        return Collections.unmodifiableList(_columns);
     }
 
     public MutableTable setColumns(Column... columns) {
@@ -157,9 +157,8 @@ public class MutableTable extends AbstractTable implements Serializable {
     }
 
     @Override
-    public Relationship[] getRelationships() {
-        List<Relationship> relationships = getRelationshipsInternal();
-        return relationships.toArray(new Relationship[relationships.size()]);
+    public List<Relationship> getRelationships() {
+      return Collections.unmodifiableList(_relationships);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/main/java/org/apache/metamodel/schema/Relationship.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/schema/Relationship.java b/core/src/main/java/org/apache/metamodel/schema/Relationship.java
index 1ae3132..12a5c8c 100644
--- a/core/src/main/java/org/apache/metamodel/schema/Relationship.java
+++ b/core/src/main/java/org/apache/metamodel/schema/Relationship.java
@@ -19,6 +19,7 @@
 package org.apache.metamodel.schema;
 
 import java.io.Serializable;
+import java.util.List;
 
 /**
  * Represents a relationship between two tables where one set of columns is the
@@ -41,7 +42,7 @@ public interface Relationship extends Serializable, Comparable<Relationship> {
 	 * 
 	 * @return an array of primary key columns.
 	 */
-	public Column[] getPrimaryColumns();
+	public List<Column> getPrimaryColumns();
 
 	/**
 	 * Gets the table of the foreign key column(s).
@@ -55,7 +56,7 @@ public interface Relationship extends Serializable, Comparable<Relationship> {
 	 * 
 	 * @return an array of foreign key columns.
 	 */
-	public Column[] getForeignColumns();
+	public List<Column> getForeignColumns();
 
 	/**
 	 * Determines whether this relationship contains a specific pair of columns

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/main/java/org/apache/metamodel/schema/Schema.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/schema/Schema.java b/core/src/main/java/org/apache/metamodel/schema/Schema.java
index 1184954..082acb1 100644
--- a/core/src/main/java/org/apache/metamodel/schema/Schema.java
+++ b/core/src/main/java/org/apache/metamodel/schema/Schema.java
@@ -19,6 +19,8 @@
 package org.apache.metamodel.schema;
 
 import java.io.Serializable;
+import java.util.Collection;
+import java.util.List;
 
 import org.apache.metamodel.DataContext;
 
@@ -61,14 +63,14 @@ public interface Schema extends Comparable<Schema>, Serializable, NamedStructure
 	 * 
 	 * @return an array of table names.
 	 */
-	public String[] getTableNames();
+	public List<String> getTableNames();
 
 	/**
 	 * Gets all tables in this Schema.
 	 * 
 	 * @return the tables that reside in the schema
 	 */
-	public Table[] getTables();
+	public List<Table> getTables();
 
 	/**
 	 * Gets all tables in this Schema of a particular type.
@@ -78,7 +80,7 @@ public interface Schema extends Comparable<Schema>, Serializable, NamedStructure
 	 * @return an array of tables in this schema that matches the specified
 	 *         type.
 	 */
-	public Table[] getTables(TableType type);
+	public List<Table> getTables(TableType type);
 
 	/**
 	 * Gets a table by index. Use {@link #getTableCount()} to get the (0-based)
@@ -108,7 +110,7 @@ public interface Schema extends Comparable<Schema>, Serializable, NamedStructure
 	 * 
 	 * @return an array of relationships.
 	 */
-	public Relationship[] getRelationships();
+	public Collection<Relationship> getRelationships();
 
 	/**
 	 * Gets the number of relationships to and from this Schema.

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/main/java/org/apache/metamodel/schema/Table.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/schema/Table.java b/core/src/main/java/org/apache/metamodel/schema/Table.java
index f5c6680..d549dba 100644
--- a/core/src/main/java/org/apache/metamodel/schema/Table.java
+++ b/core/src/main/java/org/apache/metamodel/schema/Table.java
@@ -19,6 +19,8 @@
 package org.apache.metamodel.schema;
 
 import java.io.Serializable;
+import java.util.Collection;
+import java.util.List;
 
 /**
  * Represents a table and it's metadata description. Tables reside within a
@@ -49,7 +51,7 @@ public interface Table extends Comparable<Table>, Serializable, NamedStructure {
      * 
      * @return the columns of this table.
      */
-    public Column[] getColumns();
+    public List<Column> getColumns();
 
     /**
      * Convenience method for retrieving a column by it's name.
@@ -93,7 +95,7 @@ public interface Table extends Comparable<Table>, Serializable, NamedStructure {
      * @return all relationsips for this table. To add relations use
      *         TableRelation.createRelation();
      */
-    public Relationship[] getRelationships();
+    public Collection<Relationship> getRelationships();
 
     /**
      * Gets relationships between this table and another table.
@@ -102,7 +104,7 @@ public interface Table extends Comparable<Table>, Serializable, NamedStructure {
      *            another table for which to find relationships to and from.
      * @return an array of relationsips between this and the other table.
      */
-    public Relationship[] getRelationships(Table otherTable);
+    public Collection<Relationship> getRelationships(Table otherTable);
 
     /**
      * Gets a count of relationships to and from this table.
@@ -124,7 +126,7 @@ public interface Table extends Comparable<Table>, Serializable, NamedStructure {
      * @return an array of columns.
      * @see ColumnType
      */
-    public Column[] getNumberColumns();
+    public List<Column> getNumberColumns();
 
     /**
      * Gets all of this table's columns that are of literal (String/text) type.
@@ -132,7 +134,7 @@ public interface Table extends Comparable<Table>, Serializable, NamedStructure {
      * @return an array of columns.
      * @see ColumnType
      */
-    public Column[] getLiteralColumns();
+    public List<Column> getLiteralColumns();
 
     /**
      * Gets all of this table's columns that are time and/or date based.
@@ -140,7 +142,7 @@ public interface Table extends Comparable<Table>, Serializable, NamedStructure {
      * @return an array of columns.
      * @see ColumnType
      */
-    public Column[] getTimeBasedColumns();
+    public List<Column> getTimeBasedColumns();
 
     /**
      * Gets all of this table's columns that are of boolean type.
@@ -148,24 +150,24 @@ public interface Table extends Comparable<Table>, Serializable, NamedStructure {
      * @return an array of columns.
      * @see ColumnType
      */
-    public Column[] getBooleanColumns();
+    public List<Column> getBooleanColumns();
 
     /**
      * Gets all of this table's columns that are indexed.
      * 
      * @return an array of columns.
      */
-    public Column[] getIndexedColumns();
+    public List<Column> getIndexedColumns();
 
     /**
      * @return the relationships where this table is the foreign table
      */
-    public Relationship[] getForeignKeyRelationships();
+    public Collection<Relationship> getForeignKeyRelationships();
 
     /**
      * @return the relationships where this table is the primary table
      */
-    public Relationship[] getPrimaryKeyRelationships();
+    public Collection<Relationship> getPrimaryKeyRelationships();
 
     /**
      * Gets the columns of this table that are known to be foreign keys (ie.
@@ -173,7 +175,7 @@ public interface Table extends Comparable<Table>, Serializable, NamedStructure {
      * 
      * @return an array of columns that are known to be foreign keys.
      */
-    public Column[] getForeignKeys();
+    public List<Column> getForeignKeys();
 
     /**
      * Gets the columns of this table that are known to be primary keys. See
@@ -181,14 +183,14 @@ public interface Table extends Comparable<Table>, Serializable, NamedStructure {
      * 
      * @return an array of columns that are known to be primary keys.
      */
-    public Column[] getPrimaryKeys();
+    public List<Column> getPrimaryKeys();
 
     /**
      * Gets the names of this table's columns.
      * 
      * @return an array of column names.
      */
-    public String[] getColumnNames();
+    public List<String> getColumnNames();
 
     /**
      * Gets the columns of this table that conforms to a specified
@@ -198,7 +200,7 @@ public interface Table extends Comparable<Table>, Serializable, NamedStructure {
      *            the column type to search for.
      * @return an array of columns that match the specified ColumnType.
      */
-    public Column[] getColumnsOfType(ColumnType columnType);
+    public List<Column> getColumnsOfType(ColumnType columnType);
 
     /**
      * Gets the columns of this table that conforms to a specified
@@ -208,6 +210,6 @@ public interface Table extends Comparable<Table>, Serializable, NamedStructure {
      *            the super type of the column
      * @return an array of columns that match the specified SuperColumnType.
      */
-    public Column[] getColumnsOfSuperType(SuperColumnType superColumnType);
+    public List<Column> getColumnsOfSuperType(SuperColumnType superColumnType);
 
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/test/java/org/apache/metamodel/AbstractDataContextTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/metamodel/AbstractDataContextTest.java b/core/src/test/java/org/apache/metamodel/AbstractDataContextTest.java
index ea8a9de..c526df5 100644
--- a/core/src/test/java/org/apache/metamodel/AbstractDataContextTest.java
+++ b/core/src/test/java/org/apache/metamodel/AbstractDataContextTest.java
@@ -18,10 +18,10 @@
  */
 package org.apache.metamodel;
 
-import java.util.Arrays;
-import java.util.LinkedHashMap;
-import java.util.Map;
+import java.util.*;
 
+import com.google.common.collect.Lists;
+import javafx.scene.Scene;
 import junit.framework.TestCase;
 import org.apache.metamodel.data.DataSet;
 import org.apache.metamodel.query.Query;
@@ -57,8 +57,8 @@ public class AbstractDataContextTest extends TestCase {
         }
 
         @Override
-        protected String[] getSchemaNamesInternal() {
-            return _schemas.keySet().toArray(new String[0]);
+        protected List<String> getSchemaNamesInternal() {
+            return new ArrayList<>(_schemas.keySet());
         }
 
         @Override
@@ -154,8 +154,8 @@ public class AbstractDataContextTest extends TestCase {
             }
 
             @Override
-            protected String[] getSchemaNamesInternal() {
-                return new String[] { "test" };
+            protected List<String> getSchemaNamesInternal() {
+                return Lists.newArrayList("test");
             }
 
             @Override
@@ -209,12 +209,12 @@ public class AbstractDataContextTest extends TestCase {
 
     public void testGetSchemas() throws Exception {
         MyDataContext dc = new MyDataContext();
-        Schema[] schemas = dc.getSchemas();
-        assertEquals("[Schema[name=barfoo], Schema[name=foo.bar], Schema[name=foobar]]", Arrays.toString(schemas));
+        List<Schema> schemas = dc.getSchemas();
+        assertEquals("[Schema[name=barfoo], Schema[name=foo.bar], Schema[name=foobar]]", Arrays.toString(schemas.toArray()));
 
         dc.refreshSchemas();
         schemas = dc.getSchemas();
-        assertEquals("[Schema[name=barfoo], Schema[name=foo.bar], Schema[name=foobar]]", Arrays.toString(schemas));
+        assertEquals("[Schema[name=barfoo], Schema[name=foo.bar], Schema[name=foobar]]", Arrays.toString(schemas.toArray()));
     }
 
     public void testGetColumnByQualifiedLabelWithNameOverlaps() throws Exception {
@@ -226,8 +226,8 @@ public class AbstractDataContextTest extends TestCase {
             }
 
             @Override
-            protected String[] getSchemaNamesInternal() {
-                return new String[] { "sch" };
+            protected List<String> getSchemaNamesInternal() {
+                return Lists.newArrayList( "sch" );
             }
 
             @Override

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/test/java/org/apache/metamodel/CompositeDataContextTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/metamodel/CompositeDataContextTest.java b/core/src/test/java/org/apache/metamodel/CompositeDataContextTest.java
index 61e0dcc..f2ae8e0 100644
--- a/core/src/test/java/org/apache/metamodel/CompositeDataContextTest.java
+++ b/core/src/test/java/org/apache/metamodel/CompositeDataContextTest.java
@@ -42,11 +42,11 @@ public class CompositeDataContextTest extends TestCase {
 		DataContext composite = new CompositeDataContext(dc1, dc2);
 
 		assertEquals("[schema1, schema2]",
-				Arrays.toString(composite.getSchemaNames()));
+				Arrays.toString(composite.getSchemaNames().toArray()));
 		assertSame(dc1.getDefaultSchema(), composite.getDefaultSchema());
 
 		DataSet ds = composite.query()
-				.from(dc1.getDefaultSchema().getTables()[0]).select("foo")
+				.from(dc1.getDefaultSchema().getTables().get(0)).select("foo")
 				.execute();
 		List<Object[]> objectArrays = ds.toObjectArrays();
 		assertEquals("1", objectArrays.get(0)[0]);
@@ -61,12 +61,12 @@ public class CompositeDataContextTest extends TestCase {
 		DataContext composite = new CompositeDataContext(dc1, dc2);
 
 		assertEquals("[schema]",
-				Arrays.toString(composite.getSchemaNames()));
+				Arrays.toString(composite.getSchemaNames().toArray()));
 
 		Schema schema = composite.getDefaultSchema();
 		assertEquals(4, schema.getTableCount());
 		assertEquals("[table1, an_empty_table, table2, an_empty_table]",
-				Arrays.toString(schema.getTableNames()));
+				Arrays.toString(schema.getTableNames().toArray()));
 		assertTrue(schema instanceof CompositeSchema);
 	}
 
@@ -77,15 +77,14 @@ public class CompositeDataContextTest extends TestCase {
 		DataContext composite = new CompositeDataContext(dc1, dc2);
 
 		assertEquals("[schema]",
-				Arrays.toString(composite.getSchemaNames()));
+				Arrays.toString(composite.getSchemaNames().toArray()));
 
 		Schema schema = composite.getDefaultSchema();
 		assertEquals(4, schema.getTableCount());
-		assertEquals("[table, an_empty_table, table, an_empty_table]", Arrays.toString(schema.getTableNames()));
+		assertEquals("[table, an_empty_table, table, an_empty_table]", Arrays.toString(schema.getTableNames().toArray()));
 		assertTrue(schema instanceof CompositeSchema);
-		Table[] tables = schema.getTables();
-        Table table1 = tables[0];
-        Table table2 = tables[2];
+        Table table1 = schema.getTable(0);
+        Table table2 = schema.getTable(2);
         assertNotSame(table1, table2);
 
 		Query q = composite

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/test/java/org/apache/metamodel/MetaModelHelperTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/metamodel/MetaModelHelperTest.java b/core/src/test/java/org/apache/metamodel/MetaModelHelperTest.java
index 540aa95..84a09b2 100644
--- a/core/src/test/java/org/apache/metamodel/MetaModelHelperTest.java
+++ b/core/src/test/java/org/apache/metamodel/MetaModelHelperTest.java
@@ -22,6 +22,7 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
+import com.google.common.collect.Lists;
 import org.apache.metamodel.data.DataSet;
 import org.apache.metamodel.data.DataSetHeader;
 import org.apache.metamodel.data.DefaultRow;
@@ -66,8 +67,8 @@ public class MetaModelHelperTest extends MetaModelTestCase {
         data2.add(new Object[] { 2, "bad boy", "bb" });
         data2.add(new Object[] { 4, "trying harder", "try" });
 
-        DataSet ds1 = createDataSet(new SelectItem[] { si1, si2, si3, si4 }, data1);
-        DataSet ds2 = createDataSet(new SelectItem[] { si5, si6, si7 }, data2);
+        DataSet ds1 = createDataSet(Lists.newArrayList(si1, si2, si3, si4 ), data1);
+        DataSet ds2 = createDataSet(Lists.newArrayList(si5, si6, si7 ), data2);
         FilterItem[] onConditions = new FilterItem[1];
         onConditions[0] = new FilterItem(si4, OperatorType.EQUALS_TO, si5);
 
@@ -100,8 +101,8 @@ public class MetaModelHelperTest extends MetaModelTestCase {
         data2.add(new Object[] { 2, "bad boy", "bb" });
         data2.add(new Object[] { 4, "trying harder", "try" });
 
-        DataSet ds1 = createDataSet(new SelectItem[] { si1, si2, si3, si4 }, data1);
-        DataSet ds2 = createDataSet(new SelectItem[] { si5, si6, si7 }, data2);
+        DataSet ds1 = createDataSet(Lists.newArrayList(si1, si2, si3, si4 ), data1);
+        DataSet ds2 = createDataSet(Lists.newArrayList( si5, si6, si7 ), data2);
         FilterItem[] onConditions = new FilterItem[1];
         onConditions[0] = new FilterItem(si4, OperatorType.EQUALS_TO, si5);
 
@@ -116,7 +117,7 @@ public class MetaModelHelperTest extends MetaModelTestCase {
     public void testSimpleCarthesianProduct() throws Exception {
         DataSet dataSet = MetaModelHelper.getCarthesianProduct(createDataSet1(), createDataSet2());
 
-        assertEquals(2, dataSet.getSelectItems().length);
+        assertEquals(2, dataSet.getSelectItems().size());
         assertTrue(dataSet.next());
         assertEquals("Row[values=[f, b]]", dataSet.getRow().toString());
         assertTrue(dataSet.next());
@@ -134,7 +135,7 @@ public class MetaModelHelperTest extends MetaModelTestCase {
 
     public void testTripleCarthesianProduct() throws Exception {
         DataSet dataSet = MetaModelHelper.getCarthesianProduct(createDataSet1(), createDataSet2(), createDataSet3());
-        assertEquals(4, dataSet.getSelectItems().length);
+        assertEquals(4, dataSet.getSelectItems().size());
         for (int i = 0; i < 3 * 3 * 2; i++) {
             assertTrue("Assertion failed at i=" + i, dataSet.next());
         }
@@ -145,9 +146,9 @@ public class MetaModelHelperTest extends MetaModelTestCase {
         DataSet ds1 = createDataSet1();
         DataSet ds2 = createDataSet2();
         DataSet[] dataSets = new DataSet[] { ds1, ds2, };
-        FilterItem w1 = new FilterItem(ds1.getSelectItems()[0], OperatorType.EQUALS_TO, "f");
+        FilterItem w1 = new FilterItem(ds1.getSelectItems().get(0), OperatorType.EQUALS_TO, "f");
         DataSet dataSet = MetaModelHelper.getCarthesianProduct(dataSets, w1);
-        assertEquals(2, dataSet.getSelectItems().length);
+        assertEquals(2, dataSet.getSelectItems().size());
         for (int i = 0; i < 1 * 3; i++) {
             assertTrue("Assertion failed at i=" + i, dataSet.next());
             assertEquals("f", dataSet.getRow().getValue(0));
@@ -157,22 +158,22 @@ public class MetaModelHelperTest extends MetaModelTestCase {
 
     public void testGetCarthesianProductNoRows() throws Exception {
         DataSet dataSet = MetaModelHelper.getCarthesianProduct(createDataSet4(), createDataSet2(), createDataSet3());
-        assertEquals(4, dataSet.getSelectItems().length);
+        assertEquals(4, dataSet.getSelectItems().size());
         assertFalse(dataSet.next());
 
         dataSet = MetaModelHelper.getCarthesianProduct(createDataSet1(), createDataSet4(), createDataSet3());
-        assertEquals(4, dataSet.getSelectItems().length);
+        assertEquals(4, dataSet.getSelectItems().size());
         assertFalse(dataSet.next());
 
         dataSet = MetaModelHelper.getCarthesianProduct(createDataSet1(), createDataSet2(), createDataSet4());
-        assertEquals(3, dataSet.getSelectItems().length);
+        assertEquals(3, dataSet.getSelectItems().size());
         assertFalse(dataSet.next());
     }
 
     public void testGetOrdered() throws Exception {
         DataSet dataSet = createDataSet3();
         List<OrderByItem> orderByItems = new ArrayList<OrderByItem>();
-        orderByItems.add(new OrderByItem(dataSet.getSelectItems()[0]));
+        orderByItems.add(new OrderByItem(dataSet.getSelectItems().get(0)));
 
         dataSet = MetaModelHelper.getOrdered(dataSet, orderByItems);
         assertTrue(dataSet.next());
@@ -188,7 +189,7 @@ public class MetaModelHelperTest extends MetaModelTestCase {
         data1.add(new Object[] { "o" });
         data1.add(new Object[] { "o" });
         DataSet dataSet1 = createDataSet(
-                new SelectItem[] { new SelectItem(new MutableColumn("foo", ColumnType.VARCHAR)) }, data1);
+                Lists.newArrayList( new SelectItem(new MutableColumn("foo", ColumnType.VARCHAR)) ), data1);
         return dataSet1;
     }
 
@@ -197,7 +198,7 @@ public class MetaModelHelperTest extends MetaModelTestCase {
         data2.add(new Object[] { "b" });
         data2.add(new Object[] { "a" });
         data2.add(new Object[] { "r" });
-        DataSet dataSet2 = createDataSet(new SelectItem[] { new SelectItem("bar", "bar") }, data2);
+        DataSet dataSet2 = createDataSet(Lists.newArrayList(new SelectItem("bar", "bar") ), data2);
         return dataSet2;
     }
 
@@ -205,14 +206,14 @@ public class MetaModelHelperTest extends MetaModelTestCase {
         List<Object[]> data3 = new ArrayList<Object[]>();
         data3.add(new Object[] { "w00p", true });
         data3.add(new Object[] { "yippie", false });
-        DataSet dataSet3 = createDataSet(new SelectItem[] { new SelectItem("expression", "e"),
-                new SelectItem("webish?", "w") }, data3);
+        DataSet dataSet3 = createDataSet(Lists.newArrayList(new SelectItem("expression", "e"),
+                new SelectItem("webish?", "w") ), data3);
         return dataSet3;
     }
 
     private DataSet createDataSet4() {
         List<Object[]> data4 = new ArrayList<Object[]>();
-        DataSet dataSet4 = createDataSet(new SelectItem[] { new SelectItem("abc", "abc") }, data4);
+        DataSet dataSet4 = createDataSet(Lists.newArrayList(new SelectItem("abc", "abc") ), data4);
         return dataSet4;
     }
 
@@ -294,7 +295,7 @@ public class MetaModelHelperTest extends MetaModelTestCase {
         DataSet ds = MetaModelHelper.getSelection(selectItems2, new EmptyDataSet(selectItems1));
         assertEquals(SubSelectionDataSet.class, ds.getClass());
 
-        assertEquals("[bar AS b, foo AS f]", Arrays.toString(ds.getSelectItems()));
+        assertEquals("[bar AS b, foo AS f]", Arrays.toString(ds.getSelectItems().toArray()));
     }
 
     public void testLeftJoinNoRowsOrSingleRow() throws Exception {
@@ -311,7 +312,7 @@ public class MetaModelHelperTest extends MetaModelTestCase {
                 OperatorType.EQUALS_TO, item3) });
 
         assertEquals(SubSelectionDataSet.class, joinedDs.getClass());
-        assertEquals("[foo AS f, bar AS b, baz AS z]", Arrays.toString(joinedDs.getSelectItems()));
+        assertEquals("[foo AS f, bar AS b, baz AS z]", Arrays.toString(joinedDs.getSelectItems().toArray()));
 
         DataSetHeader header1 = new SimpleDataSetHeader(selectItems1);
         Row row = new DefaultRow(header1, new Object[] { 1, 2 }, null);
@@ -319,7 +320,7 @@ public class MetaModelHelperTest extends MetaModelTestCase {
 
         joinedDs = MetaModelHelper.getLeftJoin(ds1, ds2, new FilterItem[] { new FilterItem(item2,
                 OperatorType.EQUALS_TO, item3) });
-        assertEquals("[foo AS f, bar AS b, baz AS z]", Arrays.toString(joinedDs.getSelectItems()));
+        assertEquals("[foo AS f, bar AS b, baz AS z]", Arrays.toString(joinedDs.getSelectItems().toArray()));
         assertTrue(joinedDs.next());
         assertEquals("Row[values=[1, 2, null]]", joinedDs.getRow().toString());
         assertFalse(joinedDs.next());

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/test/java/org/apache/metamodel/MetaModelTestCase.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/metamodel/MetaModelTestCase.java b/core/src/test/java/org/apache/metamodel/MetaModelTestCase.java
index 3e1e5a9..56d57c8 100644
--- a/core/src/test/java/org/apache/metamodel/MetaModelTestCase.java
+++ b/core/src/test/java/org/apache/metamodel/MetaModelTestCase.java
@@ -124,25 +124,25 @@ public abstract class MetaModelTestCase extends TestCase {
         table4.setColumns(columnList);
 
         // one-Contributor-to-many-Role's
-        MutableRelationship.createRelationship(new Column[] { column1 }, new Column[] { column8 });
+        MutableRelationship.createRelationship( column1 , column8 );
 
         // one-Project-to-many-Role's
-        MutableRelationship.createRelationship(new Column[] { column4 }, new Column[] { column9 });
+        MutableRelationship.createRelationship(column4 , column9 );
 
         // view relation [contributor -> contributor_name]
-        MutableRelationship.createRelationship(new Column[] { column2 }, new Column[] { column11 });
+        MutableRelationship.createRelationship(column2 , column11 );
 
         // view relation [project -> project_name]
-        MutableRelationship.createRelationship(new Column[] { column5 }, new Column[] { column12 });
+        MutableRelationship.createRelationship(column5 , column12 );
 
         // view relation [role -> role_name]
-        MutableRelationship.createRelationship(new Column[] { column10 }, new Column[] { column13 });
+        MutableRelationship.createRelationship( column10 ,  column13 );
 
         schema.setTables(table1, table2, table3, table4);
         return schema;
     }
 
-    protected static DataSet createDataSet(SelectItem[] selectItems, List<Object[]> data) {
+    protected static DataSet createDataSet(List<SelectItem> selectItems, List<Object[]> data) {
         if (data.isEmpty()) {
             return new EmptyDataSet(selectItems);
         }
@@ -179,7 +179,7 @@ public abstract class MetaModelTestCase extends TestCase {
     }
 
     public void assertEquals(DataSet ds1, DataSet ds2) {
-        assertEquals(Arrays.toString(ds1.getSelectItems()), Arrays.toString(ds2.getSelectItems()));
+        assertEquals(Arrays.toString(ds1.getSelectItems().toArray()), Arrays.toString(ds2.getSelectItems().toArray()));
         boolean ds1next = true;
         while (ds1next) {
             ds1next = ds1.next();

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/test/java/org/apache/metamodel/MockDataContext.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/metamodel/MockDataContext.java b/core/src/test/java/org/apache/metamodel/MockDataContext.java
index 74d2464..0c217f2 100644
--- a/core/src/test/java/org/apache/metamodel/MockDataContext.java
+++ b/core/src/test/java/org/apache/metamodel/MockDataContext.java
@@ -20,6 +20,7 @@ package org.apache.metamodel;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import org.apache.metamodel.data.CachingDataSetHeader;
 import org.apache.metamodel.data.DataSet;
@@ -79,9 +80,9 @@ public class MockDataContext extends QueryPostprocessDataContext {
     }
 
     @Override
-    protected DataSet materializeMainSchemaTable(Table table, Column[] columns, int maxRows) {
+    protected DataSet materializeMainSchemaTable(Table table, List<Column> columns, int maxRows) {
         if (_tableName.equals(table.getName())) {
-            final SelectItem[] allSelectItems = MetaModelHelper.createSelectItems(table.getColumns());
+            final List<SelectItem> allSelectItems = table.getColumns().stream().map(SelectItem::new).collect(Collectors.toList());
             final DataSetHeader header = new CachingDataSetHeader(allSelectItems);
             final List<Row> data = new ArrayList<Row>();
             data.add(new DefaultRow(header, new Object[] { "1", "hello", "world" }, null));
@@ -91,11 +92,11 @@ public class MockDataContext extends QueryPostprocessDataContext {
 
             final DataSet sourceDataSet = new InMemoryDataSet(header, data);
 
-            final SelectItem[] columnSelectItems = MetaModelHelper.createSelectItems(columns);
+            final List<SelectItem> columnSelectItems = columns.stream().map(SelectItem::new).collect(Collectors.toList());
             final DataSet selectionDataSet = MetaModelHelper.getSelection(columnSelectItems, sourceDataSet);
             return selectionDataSet;
         } else if ("an_empty_table".equals(table.getName())) {
-            return new EmptyDataSet(columns);
+            return new EmptyDataSet(columns.stream().map(SelectItem::new).collect(Collectors.toList()));
         }
         throw new UnsupportedOperationException();
     }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/test/java/org/apache/metamodel/MockUpdateableDataContext.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/metamodel/MockUpdateableDataContext.java b/core/src/test/java/org/apache/metamodel/MockUpdateableDataContext.java
index 8d6d48e..4e6563a 100644
--- a/core/src/test/java/org/apache/metamodel/MockUpdateableDataContext.java
+++ b/core/src/test/java/org/apache/metamodel/MockUpdateableDataContext.java
@@ -21,6 +21,7 @@ package org.apache.metamodel;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import org.apache.metamodel.create.TableCreationBuilder;
 import org.apache.metamodel.data.CachingDataSetHeader;
@@ -68,16 +69,16 @@ public class MockUpdateableDataContext extends QueryPostprocessDataContext imple
     }
 
     @Override
-    protected DataSet materializeMainSchemaTable(Table table, Column[] columns, int maxRows) {
+    protected DataSet materializeMainSchemaTable(Table table, List<Column> columns, int maxRows) {
 
         List<Row> rows = new ArrayList<Row>();
-        SelectItem[] items = MetaModelHelper.createSelectItems(columns);
+        List<SelectItem> items = columns.stream().map(SelectItem::new).collect(Collectors.toList());
         CachingDataSetHeader header = new CachingDataSetHeader(items);
 
         for (final Object[] values : _values) {
-            Object[] rowValues = new Object[columns.length];
-            for (int i = 0; i < columns.length; i++) {
-                int columnNumber = columns[i].getColumnNumber();
+            Object[] rowValues = new Object[columns.size()];
+            for (int i = 0; i < columns.size(); i++) {
+                int columnNumber = columns.get(i).getColumnNumber();
                 rowValues[i] = values[columnNumber];
             }
             rows.add(new DefaultRow(header, rowValues));
@@ -161,7 +162,7 @@ public class MockUpdateableDataContext extends QueryPostprocessDataContext imple
     }
 
     private void delete(List<FilterItem> whereItems) {
-        final SelectItem[] selectItems = MetaModelHelper.createSelectItems(_table.getColumns());
+        final List<SelectItem> selectItems = _table.getColumns().stream().map(SelectItem::new).collect(Collectors.toList());
         final CachingDataSetHeader header = new CachingDataSetHeader(selectItems);
         for (Iterator<Object[]> it = _values.iterator(); it.hasNext();) {
             Object[] values = (Object[]) it.next();

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/test/java/org/apache/metamodel/QueryPostprocessDataContextTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/metamodel/QueryPostprocessDataContextTest.java b/core/src/test/java/org/apache/metamodel/QueryPostprocessDataContextTest.java
index d6955a9..f6352d4 100644
--- a/core/src/test/java/org/apache/metamodel/QueryPostprocessDataContextTest.java
+++ b/core/src/test/java/org/apache/metamodel/QueryPostprocessDataContextTest.java
@@ -22,6 +22,7 @@ import java.nio.channels.UnsupportedAddressTypeException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import javax.swing.table.TableModel;
 
@@ -61,7 +62,7 @@ public class QueryPostprocessDataContextTest extends MetaModelTestCase {
 
     public void testQueryMaxRows0() throws Exception {
         final MockDataContext dc = new MockDataContext("sch", "tab", "1");
-        final Table table = dc.getDefaultSchema().getTables()[0];
+        final Table table = dc.getDefaultSchema().getTable(0);
         final DataSet dataSet = dc.query().from(table).selectAll().limit(0).execute();
         assertTrue(dataSet instanceof EmptyDataSet);
         assertFalse(dataSet.next());
@@ -77,12 +78,12 @@ public class QueryPostprocessDataContextTest extends MetaModelTestCase {
 
         final QueryPostprocessDataContext dc = new QueryPostprocessDataContext() {
             @Override
-            protected DataSet materializeMainSchemaTable(Table table, Column[] columns, int maxRows) {
-                Object[] values = new Object[columns.length];
-                for (int i = 0; i < columns.length; i++) {
-                    values[i] = columns[i].getColumnNumber();
+            protected DataSet materializeMainSchemaTable(Table table, List<Column> columns, int maxRows) {
+                Object[] values = new Object[columns.size()];
+                for (int i = 0; i < columns.size(); i++) {
+                    values[i] = columns.get(i).getColumnNumber();
                 }
-                DataSetHeader header = new SimpleDataSetHeader(columns);
+                DataSetHeader header = new SimpleDataSetHeader(columns.stream().map(SelectItem::new).collect(Collectors.toList()));
                 DefaultRow row = new DefaultRow(header, values);
                 return new InMemoryDataSet(row);
             }
@@ -110,13 +111,13 @@ public class QueryPostprocessDataContextTest extends MetaModelTestCase {
 
     public void testAggregateQueryNoWhereClause() throws Exception {
         MockDataContext dc = new MockDataContext("sch", "tab", "1");
-        Table table = dc.getDefaultSchema().getTables()[0];
+        Table table = dc.getDefaultSchema().getTable(0);
         assertSingleRowResult("Row[values=[4]]", dc.query().from(table).selectCount().execute());
     }
 
     public void testAggregateQueryRegularWhereClause() throws Exception {
         MockDataContext dc = new MockDataContext("sch", "tab", "1");
-        Table table = dc.getDefaultSchema().getTables()[0];
+        Table table = dc.getDefaultSchema().getTable(0);
         assertSingleRowResult("Row[values=[3]]", dc.query().from(table).selectCount().where("baz").eq("world")
                 .execute());
     }
@@ -124,14 +125,10 @@ public class QueryPostprocessDataContextTest extends MetaModelTestCase {
     public void testApplyFunctionToNullValues() throws Exception {
         QueryPostprocessDataContext dataContext = new QueryPostprocessDataContext() {
             @Override
-            public DataSet materializeMainSchemaTable(Table table, Column[] columns, int maxRows) {
+            public DataSet materializeMainSchemaTable(Table table, List<Column> columns, int maxRows) {
                 if (table == table1) {
-                    Column[] columns1 = table1.getColumns();
-                    SelectItem[] selectItems = new SelectItem[columns1.length];
-                    for (int i = 0; i < selectItems.length; i++) {
-                        SelectItem selectItem = new SelectItem(columns1[i]);
-                        selectItems[i] = selectItem;
-                    }
+                    List<Column> columns1 = table1.getColumns();
+                    List<SelectItem> selectItems = columns1.stream().map(SelectItem::new).collect(Collectors.toList());
                     List<Object[]> data = new ArrayList<Object[]>();
                     data.add(new Object[] { 1, "no nulls", 1 });
                     data.add(new Object[] { 2, "onlynull", null });
@@ -175,7 +172,7 @@ public class QueryPostprocessDataContextTest extends MetaModelTestCase {
 
     public void testGroupByNulls() throws Exception {
         MockDataContext dc = new MockDataContext("sch", "tab", null);
-        Table table = dc.getDefaultSchema().getTables()[0];
+        Table table = dc.getDefaultSchema().getTable(0);
         DataSet dataSet = dc.query().from(table).select(FunctionType.SUM, "foo").select("baz").groupBy("baz").execute();
         assertTrue(dataSet.next());
         assertEquals("Row[values=[7.0, world]]", dataSet.getRow().toString());
@@ -187,7 +184,7 @@ public class QueryPostprocessDataContextTest extends MetaModelTestCase {
 
     public void testNewAggregateFunctions() throws Exception {
         MockDataContext dc = new MockDataContext("sch", "tab", null);
-        Table table = dc.getDefaultSchema().getTables()[0];
+        Table table = dc.getDefaultSchema().getTable(0);
         DataSet dataSet = dc.query().from(table).select(FunctionType.FIRST, "foo").select(FunctionType.LAST, "foo")
                 .select(FunctionType.RANDOM, "foo").execute();
         assertTrue(dataSet.next());
@@ -226,10 +223,10 @@ public class QueryPostprocessDataContextTest extends MetaModelTestCase {
 
     public void testMixedAggregateAndRawQuery() throws Exception {
         MockDataContext dc = new MockDataContext("sch", "tab", "1");
-        Table table = dc.getDefaultSchema().getTables()[0];
-        Column[] columns = table.getColumns();
+        Table table = dc.getDefaultSchema().getTable(0);
+        List<Column> columns = table.getColumns();
 
-        Query query = dc.query().from(table).select(FunctionType.MAX, columns[0]).and(columns[1]).toQuery();
+        Query query = dc.query().from(table).select(FunctionType.MAX, columns.get(0)).and(columns.get(1)).toQuery();
         assertEquals("SELECT MAX(tab.foo), tab.bar FROM sch.tab", query.toSql());
 
         DataSet ds = dc.executeQuery(query);
@@ -246,7 +243,7 @@ public class QueryPostprocessDataContextTest extends MetaModelTestCase {
 
     public void testScalarFunctionSelect() throws Exception {
         MockDataContext dc = new MockDataContext("sch", "tab", "1");
-        Table table = dc.getDefaultSchema().getTables()[0];
+        Table table = dc.getDefaultSchema().getTable(0);
 
         Query query = dc.query().from(table).select("foo").select(FunctionType.TO_NUMBER, "foo").select("bar")
                 .select(FunctionType.TO_STRING, "bar").select(FunctionType.TO_NUMBER, "bar").toQuery();
@@ -278,7 +275,7 @@ public class QueryPostprocessDataContextTest extends MetaModelTestCase {
 
     public void testScalarFunctionWhere() throws Exception {
         MockDataContext dc = new MockDataContext("sch", "tab", "1");
-        Table table = dc.getDefaultSchema().getTables()[0];
+        Table table = dc.getDefaultSchema().getTable(0);
 
         Query query = dc.query().from(table).select("foo").where(FunctionType.TO_NUMBER, "bar").eq(1).toQuery();
         assertEquals("SELECT tab.foo FROM sch.tab WHERE TO_NUMBER(tab.bar) = 1", query.toSql());
@@ -297,7 +294,7 @@ public class QueryPostprocessDataContextTest extends MetaModelTestCase {
     public void testSelectItemReferencesToFromItems() throws Exception {
         MockDataContext dc = new MockDataContext("sch", "tab", "1");
 
-        Table table = dc.getDefaultSchema().getTables()[0];
+        Table table = dc.getDefaultSchema().getTable(0);
 
         Query q = new Query();
         FromItem fromItem1 = q.from(table, "t1").getFromClause().getItem(0);
@@ -308,10 +305,10 @@ public class QueryPostprocessDataContextTest extends MetaModelTestCase {
         assertEquals("SELECT t1.foo, t2.foo FROM sch.tab t1, sch.tab t2 WHERE t1.foo = '2'", q.toSql());
 
         DataSet ds = dc.executeQuery(q);
-        SelectItem[] selectItems = ds.getSelectItems();
-        assertEquals(2, selectItems.length);
-        assertEquals("t1.foo", selectItems[0].toSql());
-        assertEquals("t2.foo", selectItems[1].toSql());
+        List<SelectItem> selectItems = ds.getSelectItems();
+        assertEquals(2, selectItems.size());
+        assertEquals("t1.foo", selectItems.get(0).toSql());
+        assertEquals("t2.foo", selectItems.get(1).toSql());
         assertTrue(ds.next());
         assertEquals("Row[values=[2, 1]]", ds.getRow().toString());
         assertTrue(ds.next());
@@ -328,14 +325,10 @@ public class QueryPostprocessDataContextTest extends MetaModelTestCase {
         QueryPostprocessDataContext dataContext = new QueryPostprocessDataContext() {
 
             @Override
-            public DataSet materializeMainSchemaTable(Table table, Column[] columns, int maxRows) {
+            public DataSet materializeMainSchemaTable(Table table, List<Column> columns, int maxRows) {
                 if (table == table1) {
-                    Column[] columns1 = table1.getColumns();
-                    SelectItem[] selectItems = new SelectItem[columns1.length];
-                    for (int i = 0; i < selectItems.length; i++) {
-                        SelectItem selectItem = new SelectItem(columns1[i]);
-                        selectItems[i] = selectItem;
-                    }
+                    List<Column> columns1 = table1.getColumns();
+                    List<SelectItem> selectItems = columns1.stream().map(SelectItem::new).collect(Collectors.toList());
                     List<Object[]> data = new ArrayList<Object[]>();
                     data.add(new Object[] { 1, "kasper", "denmark" });
                     data.add(new Object[] { 2, "asbjorn", "denmark" });
@@ -350,12 +343,7 @@ public class QueryPostprocessDataContextTest extends MetaModelTestCase {
                     }
                     return createDataSet(selectItems, data);
                 } else if (table == table2) {
-                    Column[] columns2 = table2.getColumns();
-                    SelectItem[] selectItems = new SelectItem[columns2.length];
-                    for (int i = 0; i < selectItems.length; i++) {
-                        SelectItem selectItem = new SelectItem(columns2[i]);
-                        selectItems[i] = selectItem;
-                    }
+                    List<SelectItem> selectItems = table2.getColumns().stream().map(SelectItem::new).collect(Collectors.toList());
                     List<Object[]> data = new ArrayList<Object[]>();
                     data.add(new Object[] { 1, 1, "founder" });
                     data.add(new Object[] { 1, 1, "developer" });
@@ -408,25 +396,25 @@ public class QueryPostprocessDataContextTest extends MetaModelTestCase {
 
     public void testInformationSchema() throws Exception {
         DataContext dc = getDataContext();
-        assertEquals("[information_schema, MetaModelSchema]", Arrays.toString(dc.getSchemaNames()));
+        assertEquals("[information_schema, MetaModelSchema]", Arrays.toString(dc.getSchemaNames().toArray()));
         Schema informationSchema = dc.getSchemaByName("information_schema");
         assertEquals(
                 "[Table[name=tables,type=TABLE,remarks=null], Table[name=columns,type=TABLE,remarks=null], Table[name=relationships,type=TABLE,remarks=null]]",
-                Arrays.toString(informationSchema.getTables()));
+                Arrays.toString(informationSchema.getTables().toArray()));
         assertEquals(
                 "[Relationship[primaryTable=tables,primaryColumns=[name],foreignTable=columns,foreignColumns=[table]], "
                         + "Relationship[primaryTable=tables,primaryColumns=[name],foreignTable=relationships,foreignColumns=[primary_table]], "
                         + "Relationship[primaryTable=tables,primaryColumns=[name],foreignTable=relationships,foreignColumns=[foreign_table]], "
                         + "Relationship[primaryTable=columns,primaryColumns=[name],foreignTable=relationships,foreignColumns=[primary_column]], "
                         + "Relationship[primaryTable=columns,primaryColumns=[name],foreignTable=relationships,foreignColumns=[foreign_column]]]",
-                Arrays.toString(informationSchema.getRelationships()));
+                Arrays.toString(informationSchema.getRelationships().toArray()));
         Table tablesTable = informationSchema.getTableByName("tables");
         assertEquals(
                 "[Column[name=name,columnNumber=0,type=VARCHAR,nullable=false,nativeType=null,columnSize=null], "
                         + "Column[name=type,columnNumber=1,type=VARCHAR,nullable=true,nativeType=null,columnSize=null], "
                         + "Column[name=num_columns,columnNumber=2,type=INTEGER,nullable=true,nativeType=null,columnSize=null], "
                         + "Column[name=remarks,columnNumber=3,type=VARCHAR,nullable=true,nativeType=null,columnSize=null]]",
-                Arrays.toString(tablesTable.getColumns()));
+                Arrays.toString(tablesTable.getColumns().toArray()));
         Table columnsTable = informationSchema.getTableByName("columns");
         assertEquals(
                 "[Column[name=name,columnNumber=0,type=VARCHAR,nullable=false,nativeType=null,columnSize=null], "
@@ -437,14 +425,14 @@ public class QueryPostprocessDataContextTest extends MetaModelTestCase {
                         + "Column[name=indexed,columnNumber=5,type=BOOLEAN,nullable=true,nativeType=null,columnSize=null], "
                         + "Column[name=table,columnNumber=6,type=VARCHAR,nullable=false,nativeType=null,columnSize=null], "
                         + "Column[name=remarks,columnNumber=7,type=VARCHAR,nullable=true,nativeType=null,columnSize=null]]",
-                Arrays.toString(columnsTable.getColumns()));
+                Arrays.toString(columnsTable.getColumns().toArray()));
         Table relationshipsTable = informationSchema.getTableByName("relationships");
         assertEquals(
                 "[Column[name=primary_table,columnNumber=0,type=VARCHAR,nullable=false,nativeType=null,columnSize=null], "
                         + "Column[name=primary_column,columnNumber=1,type=VARCHAR,nullable=false,nativeType=null,columnSize=null], "
                         + "Column[name=foreign_table,columnNumber=2,type=VARCHAR,nullable=false,nativeType=null,columnSize=null], "
                         + "Column[name=foreign_column,columnNumber=3,type=VARCHAR,nullable=false,nativeType=null,columnSize=null]]",
-                Arrays.toString(relationshipsTable.getColumns()));
+                Arrays.toString(relationshipsTable.getColumns().toArray()));
 
         DataSet dataSet = dc.query().from(tablesTable).select(tablesTable.getColumns()).execute();
         assertTrue(dataSet.next());
@@ -458,7 +446,7 @@ public class QueryPostprocessDataContextTest extends MetaModelTestCase {
         assertFalse(dataSet.next());
         dataSet.close();
 
-        Relationship relationship = tablesTable.getRelationships(columnsTable)[0];
+        Relationship relationship = tablesTable.getRelationships(columnsTable).iterator().next();
         FromItem joinFromItem = new FromItem(JoinType.INNER, relationship);
         Query q = new Query().select(tablesTable.getColumnByName("name")).select(columnsTable.getColumnByName("name"))
                 .select(columnsTable.getBooleanColumns()).from(joinFromItem);
@@ -492,7 +480,7 @@ public class QueryPostprocessDataContextTest extends MetaModelTestCase {
 
         DataContext dc = getDataContext();
         DataSet data = dc.executeQuery(q);
-        assertEquals(1, data.getSelectItems().length);
+        assertEquals(1, data.getSelectItems().size());
 
         TableModel tableModel = new DataSetTableModel(data);
 
@@ -533,8 +521,8 @@ public class QueryPostprocessDataContextTest extends MetaModelTestCase {
         DataContext dc = getDataContext();
 
         DataSet data = dc.executeQuery(q);
-        assertEquals(1, data.getSelectItems().length);
-        assertEquals("SUM(r.project_id)", data.getSelectItems()[0].toString());
+        assertEquals(1, data.getSelectItems().size());
+        assertEquals("SUM(r.project_id)", data.getSelectItems().get(0).toString());
 
         TableModel tableModel = new DataSetTableModel(data);
         assertEquals(3, tableModel.getRowCount());
@@ -564,31 +552,31 @@ public class QueryPostprocessDataContextTest extends MetaModelTestCase {
 
         DataContext dc = getDataContext();
         DataSet data = dc.executeQuery(q);
-        assertEquals(1, data.getSelectItems().length);
-        assertEquals("r.name", data.getSelectItems()[0].toString());
+        assertEquals(1, data.getSelectItems().size());
+        assertEquals("r.name", data.getSelectItems().get(0).toString());
         TableModel tableModel = new DataSetTableModel(data);
         assertEquals(3, tableModel.getRowCount());
 
         q.select(new SelectItem(FunctionType.COUNT, "*", "c"));
         q.where(new FilterItem(new SelectItem(roleColumn), OperatorType.EQUALS_TO, "founder"));
         data = dc.executeQuery(q);
-        assertEquals(2, data.getSelectItems().length);
-        assertEquals("r.name", data.getSelectItems()[0].toString());
-        assertEquals("COUNT(*) AS c", data.getSelectItems()[1].toString());
+        assertEquals(2, data.getSelectItems().size());
+        assertEquals("r.name", data.getSelectItems().get(0).toString());
+        assertEquals("COUNT(*) AS c", data.getSelectItems().get(1).toString());
         tableModel = new DataSetTableModel(data);
         assertEquals(1, tableModel.getRowCount());
         assertEquals("founder", tableModel.getValueAt(0, 0));
         assertEquals(2l, tableModel.getValueAt(0, 1));
 
-        q.select(new SelectItem(FunctionType.SUM, table2.getColumns()[0]));
+        q.select(new SelectItem(FunctionType.SUM, table2.getColumn(0)));
         assertEquals(
                 "SELECT r.name, COUNT(*) AS c, SUM(r.contributor_id) FROM MetaModelSchema.role r WHERE r.name = 'founder' GROUP BY r.name",
                 q.toString());
         data = dc.executeQuery(q);
-        assertEquals(3, data.getSelectItems().length);
-        assertEquals("r.name", data.getSelectItems()[0].toString());
-        assertEquals("COUNT(*) AS c", data.getSelectItems()[1].toString());
-        assertEquals("SUM(r.contributor_id)", data.getSelectItems()[2].toString());
+        assertEquals(3, data.getSelectItems().size());
+        assertEquals("r.name", data.getSelectItems().get(0).toString());
+        assertEquals("COUNT(*) AS c", data.getSelectItems().get(1).toString());
+        assertEquals("SUM(r.contributor_id)", data.getSelectItems().get(2).toString());
         tableModel = new DataSetTableModel(data);
         assertEquals(1, tableModel.getRowCount());
         assertEquals("founder", tableModel.getValueAt(0, 0));
@@ -744,7 +732,7 @@ public class QueryPostprocessDataContextTest extends MetaModelTestCase {
         q.select(table1.getColumns());
         q.select(table2.getColumns());
         DataSet data = dc.executeQuery(q);
-        assertEquals(table1.getColumnCount() + table2.getColumnCount(), data.getSelectItems().length);
+        assertEquals(table1.getColumnCount() + table2.getColumnCount(), data.getSelectItems().size());
         for (int i = 0; i < 6 * 8; i++) {
             assertTrue(data.next());
             if (i == 0) {
@@ -843,7 +831,7 @@ public class QueryPostprocessDataContextTest extends MetaModelTestCase {
                 q.toString());
 
         DataSet data = dc.executeQuery(q);
-        assertEquals(2, data.getSelectItems().length);
+        assertEquals(2, data.getSelectItems().size());
         assertTrue(data.next());
         assertEquals("Row[values=[kasper, founder]]", data.getRow().toString());
         assertTrue(data.next());
@@ -888,7 +876,7 @@ public class QueryPostprocessDataContextTest extends MetaModelTestCase {
 
         SelectItem s1 = new SelectItem(table1.getColumnByName(COLUMN_CONTRIBUTOR_NAME));
         SelectItem s2 = new SelectItem(table2.getColumnByName(COLUMN_ROLE_ROLE_NAME));
-        FromItem fromItem = new FromItem(JoinType.INNER, table1.getRelationships(table2)[0]);
+        FromItem fromItem = new FromItem(JoinType.INNER, table1.getRelationships(table2).iterator().next());
 
         Query q = new Query();
         q.select(s1);
@@ -899,7 +887,7 @@ public class QueryPostprocessDataContextTest extends MetaModelTestCase {
                 q.toString());
 
         DataSet data = dc.executeQuery(q);
-        assertEquals(2, data.getSelectItems().length);
+        assertEquals(2, data.getSelectItems().size());
         assertTrue(data.next());
         assertEquals("Row[values=[kasper, founder]]", data.getRow().toString());
         assertTrue(data.next());
@@ -941,7 +929,7 @@ public class QueryPostprocessDataContextTest extends MetaModelTestCase {
 
         DataContext dc = getDataContext();
         DataSet data = dc.executeQuery(q2);
-        assertEquals(1, data.getSelectItems().length);
+        assertEquals(1, data.getSelectItems().size());
         assertTrue(data.next());
         assertEquals("Row[values=[kasper]]", data.getRow().toString());
         assertTrue(data.next());
@@ -968,7 +956,7 @@ public class QueryPostprocessDataContextTest extends MetaModelTestCase {
                 "SELECT d.e AS f FROM (SELECT c.name AS e FROM (SELECT contributor.contributor_id, contributor.name, contributor.country FROM MetaModelSchema.contributor) c) d",
                 q3.toString());
         data = dc.executeQuery(q3);
-        assertEquals(1, data.getSelectItems().length);
+        assertEquals(1, data.getSelectItems().size());
         assertTrue(data.next());
         assertEquals("Row[values=[kasper]]", data.getRow().toString());
         assertTrue(data.next());
@@ -1015,7 +1003,7 @@ public class QueryPostprocessDataContextTest extends MetaModelTestCase {
     public void testExecuteCount() throws Exception {
         QueryPostprocessDataContext dc = new QueryPostprocessDataContext() {
             @Override
-            protected DataSet materializeMainSchemaTable(Table table, Column[] columns, int maxRows) {
+            protected DataSet materializeMainSchemaTable(Table table, List<Column> columns, int maxRows) {
                 throw new UnsupportedOperationException();
             }
 
@@ -1047,7 +1035,7 @@ public class QueryPostprocessDataContextTest extends MetaModelTestCase {
     public void testExecutePrimaryKeyLookupQuery() throws Exception {
         QueryPostprocessDataContext dc = new QueryPostprocessDataContext() {
             @Override
-            protected DataSet materializeMainSchemaTable(Table table, Column[] columns, int maxRows) {
+            protected DataSet materializeMainSchemaTable(Table table, List<Column> columns, int maxRows) {
                 throw new UnsupportedAddressTypeException();
             }
 

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/test/java/org/apache/metamodel/convert/ConvertersTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/metamodel/convert/ConvertersTest.java b/core/src/test/java/org/apache/metamodel/convert/ConvertersTest.java
index c68dfd2..f23cf1a 100644
--- a/core/src/test/java/org/apache/metamodel/convert/ConvertersTest.java
+++ b/core/src/test/java/org/apache/metamodel/convert/ConvertersTest.java
@@ -37,7 +37,7 @@ public class ConvertersTest extends TestCase {
 
     public void testAutoDetectConverters() throws Exception {
         final MockUpdateableDataContext decoratedDataContext = new MockUpdateableDataContext();
-        final Table table = decoratedDataContext.getDefaultSchema().getTables()[0];
+        final Table table = decoratedDataContext.getDefaultSchema().getTables().get(0);
         Map<Column, TypeConverter<?, ?>> converters = Converters.autoDetectConverters(decoratedDataContext, table, 2);
         assertEquals(1, converters.size());
         assertEquals(
@@ -92,7 +92,7 @@ public class ConvertersTest extends TestCase {
             assertEquals("foo is expected to be string", String.class, physicalValues[0].getClass());
         }
 
-        final Table table = dc.getDefaultSchema().getTables()[0];
+        final Table table = dc.getDefaultSchema().getTables().get(0);
         Map<Column, TypeConverter<?, ?>> converters = Converters.autoDetectConverters(dc, table, 1000);
         assertEquals(1, converters.size());
         dc = Converters.addTypeConverters(dc, converters);

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/test/java/org/apache/metamodel/create/AbstractCreateTableBuilderTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/metamodel/create/AbstractCreateTableBuilderTest.java b/core/src/test/java/org/apache/metamodel/create/AbstractCreateTableBuilderTest.java
index c4d320c..f5e7356 100644
--- a/core/src/test/java/org/apache/metamodel/create/AbstractCreateTableBuilderTest.java
+++ b/core/src/test/java/org/apache/metamodel/create/AbstractCreateTableBuilderTest.java
@@ -57,11 +57,11 @@ public class AbstractCreateTableBuilderTest extends TestCase {
         assertEquals("tablename", table.getName());
         assertEquals(3, table.getColumnCount());
         assertEquals("Column[name=foo,columnNumber=0,type=VARCHAR,nullable=true,nativeType=vch,columnSize=1234]",
-                table.getColumns()[0].toString());
+                table.getColumn(0).toString());
         assertEquals("Column[name=bar,columnNumber=1,type=null,nullable=null,nativeType=null,columnSize=null]",
-                table.getColumns()[1].toString());
+                table.getColumn(1).toString());
         assertEquals("Column[name=baz,columnNumber=2,type=null,nullable=false,nativeType=null,columnSize=null]",
-                table.getColumns()[2].toString());
+                table.getColumn(2).toString());
 
         System.out.println(builder.toSql());
         assertEquals("CREATE TABLE schema.tablename (foo VARCHAR(1234),bar,baz NOT NULL, PRIMARY KEY(foo))", builder.toSql());
@@ -96,12 +96,12 @@ public class AbstractCreateTableBuilderTest extends TestCase {
         assertEquals("tablename", table.getName());
         assertEquals(3, table.getColumnCount());
         assertEquals("Column[name=foo,columnNumber=0,type=VARCHAR,nullable=true,nativeType=vch,columnSize=1234]",
-                table.getColumns()[0].toString());
-        assertTrue(table.getColumns()[0].isPrimaryKey());
+                table.getColumn(0).toString());
+        assertTrue(table.getColumn(0).isPrimaryKey());
 
         assertEquals("Column[name=bar,columnNumber=1,type=null,nullable=null,nativeType=null,columnSize=null]",
-                table.getColumns()[1].toString());
+                table.getColumn(1).toString());
         assertEquals("Column[name=baz,columnNumber=2,type=null,nullable=null,nativeType=null,columnSize=null]",
-                table.getColumns()[2].toString());
+                table.getColumn(1).toString());
     }
 }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/test/java/org/apache/metamodel/data/DataSetTableModelTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/metamodel/data/DataSetTableModelTest.java b/core/src/test/java/org/apache/metamodel/data/DataSetTableModelTest.java
index b70bc8c..6736c5f 100644
--- a/core/src/test/java/org/apache/metamodel/data/DataSetTableModelTest.java
+++ b/core/src/test/java/org/apache/metamodel/data/DataSetTableModelTest.java
@@ -23,6 +23,7 @@ import java.util.List;
 
 import javax.swing.table.TableModel;
 
+import com.google.common.collect.Lists;
 import org.apache.metamodel.MetaModelHelper;
 import org.apache.metamodel.query.SelectItem;
 import org.apache.metamodel.schema.MutableColumn;
@@ -34,7 +35,7 @@ public class DataSetTableModelTest extends TestCase {
     public void testToTableModel() throws Exception {
         SelectItem[] selectItems = MetaModelHelper.createSelectItems(new MutableColumn("CUSTOMERNUMBER"),
                 new MutableColumn("CUSTOMERNAME"), new MutableColumn("CONTACTLASTNAME"));
-        CachingDataSetHeader header = new CachingDataSetHeader(selectItems);
+        CachingDataSetHeader header = new CachingDataSetHeader(Lists.newArrayList(selectItems));
         List<Row> rows = new ArrayList<Row>();
         rows.add(new DefaultRow(header, new Object[] { 1, "John", "Doe" }));
         rows.add(new DefaultRow(header, new Object[] { 2, "John", "Taylor" }));

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/test/java/org/apache/metamodel/data/DefaultRowTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/metamodel/data/DefaultRowTest.java b/core/src/test/java/org/apache/metamodel/data/DefaultRowTest.java
index 40f0551..1f485ea 100644
--- a/core/src/test/java/org/apache/metamodel/data/DefaultRowTest.java
+++ b/core/src/test/java/org/apache/metamodel/data/DefaultRowTest.java
@@ -24,6 +24,7 @@ import java.io.FileInputStream;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 import java.lang.reflect.Field;
+import java.util.List;
 
 import org.apache.metamodel.query.SelectItem;
 import org.apache.metamodel.schema.Column;
@@ -71,9 +72,9 @@ public class DefaultRowTest extends TestCase {
 
         Row row = (Row) obj;
         assertEquals(2, row.size());
-        SelectItem[] selectItems = row.getSelectItems();
-        assertEquals("foo", selectItems[0].toString());
-        assertEquals("bar", selectItems[1].toString());
+        List<SelectItem> selectItems = row.getSelectItems();
+        assertEquals("foo", selectItems.get(0).toString());
+        assertEquals("bar", selectItems.get(1).toString());
 
         assertEquals("foo", row.getValue(0));
         assertEquals("bar", row.getValue(1));
@@ -81,7 +82,7 @@ public class DefaultRowTest extends TestCase {
         assertEquals(Style.NO_STYLE, row.getStyle(0));
         assertEquals(Style.NO_STYLE, row.getStyle(1));
 
-        Column column = selectItems[0].getColumn();
+        Column column = selectItems.get(0).getColumn();
         assertNotNull(column);
         
         // the columns used to create the object did not have column types assigned.

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/test/java/org/apache/metamodel/data/RowTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/metamodel/data/RowTest.java b/core/src/test/java/org/apache/metamodel/data/RowTest.java
index daa846a..685a1d3 100644
--- a/core/src/test/java/org/apache/metamodel/data/RowTest.java
+++ b/core/src/test/java/org/apache/metamodel/data/RowTest.java
@@ -18,6 +18,7 @@
  */
 package org.apache.metamodel.data;
 
+import com.google.common.collect.Lists;
 import org.apache.metamodel.MetaModelTestCase;
 import org.apache.metamodel.query.SelectItem;
 import org.apache.metamodel.schema.Schema;
@@ -28,29 +29,27 @@ public class RowTest extends MetaModelTestCase {
     public void testRow() throws Exception {
         Schema schema = getExampleSchema();
         Table projectTable = schema.getTableByName(TABLE_PROJECT);
-        SelectItem item = new SelectItem(projectTable.getColumns()[0]);
-        SelectItem[] items = { item };
-        DataSetHeader header = new CachingDataSetHeader(items);
+        SelectItem item = new SelectItem(projectTable.getColumn(0));
+        DataSetHeader header = new CachingDataSetHeader(Lists.newArrayList(item));
         Object[] values = { "foobar" };
         Row row = new DefaultRow(header, values);
         assertEquals("Row[values=[foobar]]", row.toString());
         assertEquals("foobar", row.getValue(0));
         assertEquals("foobar", row.getValues()[0]);
         assertEquals("foobar", row.getValue(item));
-        assertEquals(item, row.getSelectItems()[0]);
+        assertEquals(item, row.getSelectItems().get(0));
     }
 
     public void testGetSubSelection() throws Exception {
         Schema schema = getExampleSchema();
         Table projectTable = schema.getTableByName(TABLE_PROJECT);
-        SelectItem item1 = new SelectItem(projectTable.getColumns()[0]);
-        SelectItem item2 = new SelectItem(projectTable.getColumns()[0]);
-        SelectItem[] items = { item1, item2 };
-        DataSetHeader header = new CachingDataSetHeader(items);
+        SelectItem item1 = new SelectItem(projectTable.getColumn(0));
+        SelectItem item2 = new SelectItem(projectTable.getColumn(0));
+        DataSetHeader header = new CachingDataSetHeader(Lists.newArrayList(item1,item2));
         Object[] values = { "foo", "bar" };
         Row row = new DefaultRow(header, values);
         row = row.getSubSelection(new SimpleDataSetHeader(new SelectItem[] { item1 }));
-        assertEquals(1, row.getSelectItems().length);
+        assertEquals(1, row.getSelectItems().size());
         assertEquals(1, row.getValues().length);
         assertEquals("foo", row.getValue(0));
     }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/test/java/org/apache/metamodel/data/UnionDataSetTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/metamodel/data/UnionDataSetTest.java b/core/src/test/java/org/apache/metamodel/data/UnionDataSetTest.java
index 44178b2..cce8b18 100644
--- a/core/src/test/java/org/apache/metamodel/data/UnionDataSetTest.java
+++ b/core/src/test/java/org/apache/metamodel/data/UnionDataSetTest.java
@@ -23,7 +23,10 @@ import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
 import java.util.Arrays;
+import java.util.stream.Collectors;
 
+import com.google.common.collect.Lists;
+import org.apache.metamodel.query.SelectItem;
 import org.apache.metamodel.schema.Column;
 import org.apache.metamodel.schema.MutableColumn;
 import org.junit.Test;
@@ -34,25 +37,33 @@ public class UnionDataSetTest {
     public void testVanillaUnion() {
         // data set 1
         final DataSetHeader header1 =
-                new SimpleDataSetHeader(new Column[] { new MutableColumn("foo1"), new MutableColumn("bar1") });
+                new SimpleDataSetHeader(
+                        Lists.newArrayList(new MutableColumn("foo1"), new MutableColumn("bar1")).stream()
+                                .map(SelectItem::new).collect(Collectors.toList()));
         final Row row1 = new DefaultRow(header1, new Object[] { "1", "2" });
         final Row row2 = new DefaultRow(header1, new Object[] { "3", "4" });
         final DataSet ds1 = new InMemoryDataSet(header1, row1, row2);
 
         // data set 2
         final DataSetHeader header2 =
-                new SimpleDataSetHeader(new Column[] { new MutableColumn("foo2"), new MutableColumn("bar2") });
+                new SimpleDataSetHeader(
+                        Lists.newArrayList( new MutableColumn("foo2"), new MutableColumn("bar2") ).stream()
+                                .map(SelectItem::new).collect(Collectors.toList()));
         final Row row3 = new DefaultRow(header2, new Object[] { "5", "6" });
         final DataSet ds2 = new InMemoryDataSet(header2, row3);
 
         // data set 3
         final DataSetHeader header3 =
-                new SimpleDataSetHeader(new Column[] { new MutableColumn("foo3"), new MutableColumn("bar3") });
+                new SimpleDataSetHeader(
+                        Lists.newArrayList( new MutableColumn("foo3"), new MutableColumn("bar3") ).stream()
+                                .map(SelectItem::new).collect(Collectors.toList()));
         final Row row4 = new DefaultRow(header2, new Object[] { "7", "8" });
         final DataSet ds3 = new InMemoryDataSet(header3, row4);
 
         final DataSetHeader unionHeader =
-                new SimpleDataSetHeader(new Column[] { new MutableColumn("fooUnion"), new MutableColumn("barUnion") });
+                new SimpleDataSetHeader(
+                        Lists.newArrayList( new MutableColumn("fooUnion"), new MutableColumn("barUnion") ).stream()
+                            .map(SelectItem::new).collect(Collectors.toList()));
         final DataSet unionDataSet = UnionDataSet.ofDataSets(unionHeader, Arrays.asList(ds1, ds2, ds3));
         assertTrue(unionDataSet.next());
         assertEquals("Row[values=[1, 2]]", unionDataSet.getRow().toString());

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/test/java/org/apache/metamodel/delete/AbstractRowDeletionCallbackTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/metamodel/delete/AbstractRowDeletionCallbackTest.java b/core/src/test/java/org/apache/metamodel/delete/AbstractRowDeletionCallbackTest.java
index f0774f0..0c0b98f 100644
--- a/core/src/test/java/org/apache/metamodel/delete/AbstractRowDeletionCallbackTest.java
+++ b/core/src/test/java/org/apache/metamodel/delete/AbstractRowDeletionCallbackTest.java
@@ -30,7 +30,7 @@ public class AbstractRowDeletionCallbackTest extends TestCase {
 
     public void testDelete() throws Exception {
         final MockUpdateableDataContext dc = new MockUpdateableDataContext();
-        final Table table = dc.getDefaultSchema().getTables()[0];
+        final Table table = dc.getDefaultSchema().getTables().get(0);
         DataSet ds = dc.query().from(table).selectCount().execute();
         assertTrue(ds.next());
         assertEquals("3", ds.getRow().getValue(0).toString());

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/test/java/org/apache/metamodel/intercept/InterceptableDataContextTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/metamodel/intercept/InterceptableDataContextTest.java b/core/src/test/java/org/apache/metamodel/intercept/InterceptableDataContextTest.java
index e5ee2f1..647ace4 100644
--- a/core/src/test/java/org/apache/metamodel/intercept/InterceptableDataContextTest.java
+++ b/core/src/test/java/org/apache/metamodel/intercept/InterceptableDataContextTest.java
@@ -19,6 +19,7 @@
 package org.apache.metamodel.intercept;
 
 import java.util.Arrays;
+import java.util.List;
 
 import junit.framework.TestCase;
 
@@ -35,7 +36,7 @@ public class InterceptableDataContextTest extends TestCase {
 
 	private final MockUpdateableDataContext delegateDataContext = new MockUpdateableDataContext();
 	private final Table table = delegateDataContext.getDefaultSchema()
-			.getTables()[0];
+			.getTables().get(0);
 
 	public void testInterceptSchema() throws Exception {
 		// without an interceptor
@@ -43,15 +44,15 @@ public class InterceptableDataContextTest extends TestCase {
 			DataContext dc = new InterceptableDataContext(delegateDataContext);
 
 			Schema schema = dc.getDefaultSchema();
-			Schema[] schemas = dc.getSchemas();
+			List<Schema> schemas = dc.getSchemas();
 
 			assertEquals("schema", schema.getName());
 			assertEquals(MutableSchema.class, schema.getClass());
 			assertEquals("[information_schema, schema]",
-					Arrays.toString(dc.getSchemaNames()));
-			assertEquals(2, schemas.length);
-			assertEquals("information_schema", schemas[0].getName());
-			assertEquals("schema", schemas[1].getName());
+					Arrays.toString(dc.getSchemaNames().toArray()));
+			assertEquals(2, schemas.size());
+			assertEquals("information_schema", schemas.get(0).getName());
+			assertEquals("schema", schemas.get(1).getName());
 		}
 
 		// with an interceptor
@@ -65,15 +66,15 @@ public class InterceptableDataContextTest extends TestCase {
 					});
 
 			Schema schema = dc.getDefaultSchema();
-			Schema[] schemas = dc.getSchemas();
+			List<Schema> schemas = dc.getSchemas();
 
 			assertEquals("schema foo!", schema.getName());
 			assertEquals(MutableSchema.class, schema.getClass());
 			assertEquals("[information_schema foo!, schema foo!]",
-					Arrays.toString(dc.getSchemaNames()));
-			assertEquals(2, schemas.length);
-			assertEquals("information_schema foo!", schemas[0].getName());
-			assertEquals("schema foo!", schemas[1].getName());
+					Arrays.toString(dc.getSchemaNames().toArray()));
+			assertEquals(2, schemas.size());
+			assertEquals("information_schema foo!", schemas.get(0).getName());
+			assertEquals("schema foo!", schemas.get(1).getName());
 		}
 	}
 
@@ -108,6 +109,6 @@ public class InterceptableDataContextTest extends TestCase {
 				});
 
 		DataSet ds = dc.executeQuery(new Query().from(table));
-		assertEquals("[table.foo, table.bar]", Arrays.toString(ds.getSelectItems()));
+		assertEquals("[table.foo, table.bar]", Arrays.toString(ds.getSelectItems().toArray()));
 	}
 }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/test/java/org/apache/metamodel/query/FilterItemTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/metamodel/query/FilterItemTest.java b/core/src/test/java/org/apache/metamodel/query/FilterItemTest.java
index 3b89d9d..9053625 100644
--- a/core/src/test/java/org/apache/metamodel/query/FilterItemTest.java
+++ b/core/src/test/java/org/apache/metamodel/query/FilterItemTest.java
@@ -18,6 +18,7 @@
  */
 package org.apache.metamodel.query;
 
+import com.google.common.collect.Lists;
 import junit.framework.TestCase;
 
 import org.apache.metamodel.DataContext;
@@ -43,6 +44,7 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 public class FilterItemTest extends TestCase {
 
@@ -168,7 +170,7 @@ public class FilterItemTest extends TestCase {
         Column col2 = new MutableColumn("Col2", ColumnType.DECIMAL);
         SelectItem s1 = new SelectItem(col1);
         SelectItem s2 = new SelectItem(col2);
-        SelectItem[] selectItems = new SelectItem[] { s1, s2 };
+        List<SelectItem> selectItems = Lists.newArrayList( s1, s2 );
         CachingDataSetHeader header = new CachingDataSetHeader(selectItems);
 
         FilterItem c = new FilterItem(s1, OperatorType.EQUALS_TO, null);
@@ -235,8 +237,7 @@ public class FilterItemTest extends TestCase {
     public void testEvaluateDates() throws Exception {
         Column col1 = new MutableColumn("Col1", ColumnType.DATE);
         SelectItem s1 = new SelectItem(col1);
-        SelectItem[] selectItems = new SelectItem[] { s1 };
-        CachingDataSetHeader header = new CachingDataSetHeader(selectItems);
+        CachingDataSetHeader header = new CachingDataSetHeader(Lists.newArrayList(s1));
 
         long currentTimeMillis = System.currentTimeMillis();
         FilterItem c = new FilterItem(s1, OperatorType.LESS_THAN, new java.sql.Date(currentTimeMillis));
@@ -331,8 +332,7 @@ public class FilterItemTest extends TestCase {
         FilterItem filter = new FilterItem(LogicalOperator.AND, c1, c2, c3);
         assertEquals("(Col1 LIKE 'foo%' AND Col1 LIKE '%bar' AND Col1 <> 'foobar')", filter.toString());
 
-        SelectItem[] items = new SelectItem[] { s1 };
-        CachingDataSetHeader header = new CachingDataSetHeader(items);
+        CachingDataSetHeader header = new CachingDataSetHeader(Lists.newArrayList(s1));
         assertTrue(filter.evaluate(new DefaultRow(header, new Object[] { "foo bar" })));
         assertTrue(filter.evaluate(new DefaultRow(header, new Object[] { "foosenbar" })));
         assertFalse(filter.evaluate(new DefaultRow(header, new Object[] { "foo" })));
@@ -373,15 +373,16 @@ public class FilterItemTest extends TestCase {
         DataContext dc = new QueryPostprocessDataContext() {
 
             @Override
-            public DataSet materializeMainSchemaTable(Table table, Column[] columns, int maxRows) {
+            public DataSet materializeMainSchemaTable(Table table, List<Column> columns, int maxRows) {
                 // we expect 3 columns to be materialized because the query has column references in both SELECT and WHERE clause
-                assertEquals(3, columns.length);
-                assertEquals("column_number", columns[0].getName());
-                assertEquals("name", columns[1].getName());
-                assertEquals("role", columns[2].getName());
-                SelectItem[] selectItems = new SelectItem[] { new SelectItem(col1), new SelectItem(col2),
-                        new SelectItem(col3) };
-                DataSetHeader header = new CachingDataSetHeader(selectItems);
+                assertEquals(3, columns.size());
+                assertEquals("column_number", columns.get(0).getName());
+                assertEquals("name", columns.get(1).getName());
+                assertEquals("role", columns.get(2).getName());
+
+                DataSetHeader header = new CachingDataSetHeader(Lists.newArrayList(col1, col2, col3).stream()
+                        .map(SelectItem::new)
+                        .collect(Collectors.toList()));
                 List<Row> rows = new LinkedList<Row>();
                 rows.add(new DefaultRow(header, new Object[] { "foo", "bar", 1 }));
                 rows.add(new DefaultRow(header, new Object[] { "kasper", "developer", 2 }));
@@ -462,8 +463,7 @@ public class FilterItemTest extends TestCase {
         Object operand = new String[] { "foo", "bar" };
 
         FilterItem filterItem = new FilterItem(selectItem, OperatorType.IN, operand);
-        SelectItem[] selectItems = new SelectItem[] { selectItem };
-        DataSetHeader header = new CachingDataSetHeader(selectItems);
+        DataSetHeader header = new CachingDataSetHeader(Lists.newArrayList(selectItem));
 
         assertTrue(filterItem.evaluate(new DefaultRow(header, new Object[] { "foo" })));
         assertTrue(filterItem.evaluate(new DefaultRow(header, new Object[] { "bar" })));


[17/20] metamodel git commit: Fixed unused import and deprecation warnings

Posted by ka...@apache.org.
Fixed unused import and deprecation warnings

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

Branch: refs/heads/master
Commit: d24c3e5849052560e69241c4d4db3f9a99a65f78
Parents: 840aea4
Author: Kasper Sørensen <i....@gmail.com>
Authored: Thu Aug 3 20:32:36 2017 -0700
Committer: Kasper Sørensen <i....@gmail.com>
Committed: Thu Aug 3 20:32:36 2017 -0700

----------------------------------------------------------------------
 .../apache/metamodel/data/UnionDataSetTest.java |  4 +-
 .../metamodel/couchdb/CouchDbDataContext.java   |  1 -
 .../apache/metamodel/couchdb/CouchDbUtils.java  |  8 +--
 .../nativeclient/ElasticSearchDataSet.java      |  1 -
 .../rest/JestElasticSearchDataSet.java          | 19 ++++---
 .../rest/JestElasticSearchUpdateCallback.java   |  1 -
 .../metamodel/excel/ExcelDataContext.java       | 21 +++----
 .../metamodel/excel/ExcelDeleteBuilder.java     |  7 +--
 .../org/apache/metamodel/excel/ExcelUtils.java  | 59 +++++++++-----------
 .../excel/XlsxSpreadsheetReaderDelegate.java    |  1 -
 .../fixedwidth/EbcdicConfiguration.java         |  2 +
 .../apache/metamodel/jdbc/JdbcDataContext.java  |  1 -
 .../org/apache/metamodel/jdbc/JdbcSchema.java   |  1 -
 .../metamodel/jdbc/JdbcDataContextTest.java     |  3 +-
 .../jdbc/integrationtests/FirebirdTest.java     |  4 +-
 .../jdbc/integrationtests/OracleTest.java       |  4 +-
 .../apache/metamodel/json/JsonDataContext.java  |  1 -
 .../metamodel/json/JsonDataContextTest.java     |  5 +-
 .../mongodb/mongo2/MongoDbDataSet.java          |  5 +-
 .../mongodb/mongo3/MongoDbDataSet.java          |  5 +-
 .../mongodb/mongo3/MongoDbDataContextTest.java  |  5 +-
 .../metamodel/neo4j/Neo4jDataContext.java       |  1 -
 .../metamodel/neo4j/Neo4jDataContextTest.java   |  1 -
 .../apache/metamodel/pojo/PojoDataContext.java  |  1 -
 .../salesforce/SalesforceDataContext.java       |  3 +-
 .../salesforce/SalesforceUpdateCallback.java    |  1 -
 .../apache/metamodel/xml/XmlDomDataContext.java |  1 -
 27 files changed, 69 insertions(+), 97 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/metamodel/blob/d24c3e58/core/src/test/java/org/apache/metamodel/data/UnionDataSetTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/metamodel/data/UnionDataSetTest.java b/core/src/test/java/org/apache/metamodel/data/UnionDataSetTest.java
index cce8b18..d6707e4 100644
--- a/core/src/test/java/org/apache/metamodel/data/UnionDataSetTest.java
+++ b/core/src/test/java/org/apache/metamodel/data/UnionDataSetTest.java
@@ -25,12 +25,12 @@ import static org.junit.Assert.assertTrue;
 import java.util.Arrays;
 import java.util.stream.Collectors;
 
-import com.google.common.collect.Lists;
 import org.apache.metamodel.query.SelectItem;
-import org.apache.metamodel.schema.Column;
 import org.apache.metamodel.schema.MutableColumn;
 import org.junit.Test;
 
+import com.google.common.collect.Lists;
+
 public class UnionDataSetTest {
 
     @Test

http://git-wip-us.apache.org/repos/asf/metamodel/blob/d24c3e58/couchdb/src/main/java/org/apache/metamodel/couchdb/CouchDbDataContext.java
----------------------------------------------------------------------
diff --git a/couchdb/src/main/java/org/apache/metamodel/couchdb/CouchDbDataContext.java b/couchdb/src/main/java/org/apache/metamodel/couchdb/CouchDbDataContext.java
index bc0a19d..9da47b9 100644
--- a/couchdb/src/main/java/org/apache/metamodel/couchdb/CouchDbDataContext.java
+++ b/couchdb/src/main/java/org/apache/metamodel/couchdb/CouchDbDataContext.java
@@ -22,7 +22,6 @@ import java.util.List;
 import java.util.stream.Collectors;
 
 import org.apache.metamodel.MetaModelException;
-import org.apache.metamodel.MetaModelHelper;
 import org.apache.metamodel.QueryPostprocessDataContext;
 import org.apache.metamodel.UpdateScript;
 import org.apache.metamodel.UpdateSummary;

http://git-wip-us.apache.org/repos/asf/metamodel/blob/d24c3e58/couchdb/src/main/java/org/apache/metamodel/couchdb/CouchDbUtils.java
----------------------------------------------------------------------
diff --git a/couchdb/src/main/java/org/apache/metamodel/couchdb/CouchDbUtils.java b/couchdb/src/main/java/org/apache/metamodel/couchdb/CouchDbUtils.java
index d29c95d..c1d5b4f 100644
--- a/couchdb/src/main/java/org/apache/metamodel/couchdb/CouchDbUtils.java
+++ b/couchdb/src/main/java/org/apache/metamodel/couchdb/CouchDbUtils.java
@@ -36,6 +36,8 @@ import com.fasterxml.jackson.databind.ObjectReader;
  * Convenience and utility methods for MetaModel's CouchDB adaptor
  */
 final class CouchDbUtils {
+    
+    private static final ObjectReader OBJECT_READER = new ObjectMapper().readerFor(Map.class);;
 
     /**
      * Safely calls hasNext on a row iterator
@@ -89,8 +91,7 @@ final class CouchDbUtils {
             return null;
         }
         try {
-            final ObjectReader reader = new ObjectMapper().reader(Map.class);
-            return reader.readValue(valueNode);
+            return OBJECT_READER.readValue(valueNode);
         } catch (Exception e) {
             throw new IllegalStateException(e);
         }
@@ -108,8 +109,7 @@ final class CouchDbUtils {
             return null;
         }
         try {
-            ObjectReader reader = new ObjectMapper().reader(List.class);
-            return reader.readValue(valueNode);
+            return OBJECT_READER.readValue(valueNode);
         } catch (Exception e) {
             throw new IllegalStateException(e);
         }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/d24c3e58/elasticsearch/native/src/main/java/org/apache/metamodel/elasticsearch/nativeclient/ElasticSearchDataSet.java
----------------------------------------------------------------------
diff --git a/elasticsearch/native/src/main/java/org/apache/metamodel/elasticsearch/nativeclient/ElasticSearchDataSet.java b/elasticsearch/native/src/main/java/org/apache/metamodel/elasticsearch/nativeclient/ElasticSearchDataSet.java
index 1a04bc8..4ced2c8 100644
--- a/elasticsearch/native/src/main/java/org/apache/metamodel/elasticsearch/nativeclient/ElasticSearchDataSet.java
+++ b/elasticsearch/native/src/main/java/org/apache/metamodel/elasticsearch/nativeclient/ElasticSearchDataSet.java
@@ -26,7 +26,6 @@ import org.apache.metamodel.data.AbstractDataSet;
 import org.apache.metamodel.data.DataSet;
 import org.apache.metamodel.data.Row;
 import org.apache.metamodel.query.SelectItem;
-import org.apache.metamodel.schema.Column;
 import org.elasticsearch.action.search.ClearScrollRequestBuilder;
 import org.elasticsearch.action.search.SearchResponse;
 import org.elasticsearch.client.Client;

http://git-wip-us.apache.org/repos/asf/metamodel/blob/d24c3e58/elasticsearch/rest/src/main/java/org/apache/metamodel/elasticsearch/rest/JestElasticSearchDataSet.java
----------------------------------------------------------------------
diff --git a/elasticsearch/rest/src/main/java/org/apache/metamodel/elasticsearch/rest/JestElasticSearchDataSet.java b/elasticsearch/rest/src/main/java/org/apache/metamodel/elasticsearch/rest/JestElasticSearchDataSet.java
index 0414358..37e06dc 100644
--- a/elasticsearch/rest/src/main/java/org/apache/metamodel/elasticsearch/rest/JestElasticSearchDataSet.java
+++ b/elasticsearch/rest/src/main/java/org/apache/metamodel/elasticsearch/rest/JestElasticSearchDataSet.java
@@ -18,22 +18,23 @@
  */
 package org.apache.metamodel.elasticsearch.rest;
 
-import com.google.gson.JsonArray;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonPrimitive;
-import io.searchbox.client.JestClient;
-import io.searchbox.client.JestResult;
-import io.searchbox.core.SearchScroll;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicBoolean;
+
 import org.apache.metamodel.data.AbstractDataSet;
 import org.apache.metamodel.data.DataSet;
 import org.apache.metamodel.data.Row;
 import org.apache.metamodel.query.SelectItem;
-import org.apache.metamodel.schema.Column;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.List;
-import java.util.concurrent.atomic.AtomicBoolean;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+
+import io.searchbox.client.JestClient;
+import io.searchbox.client.JestResult;
+import io.searchbox.core.SearchScroll;
 
 /**
  * {@link DataSet} implementation for ElasticSearch

http://git-wip-us.apache.org/repos/asf/metamodel/blob/d24c3e58/elasticsearch/rest/src/main/java/org/apache/metamodel/elasticsearch/rest/JestElasticSearchUpdateCallback.java
----------------------------------------------------------------------
diff --git a/elasticsearch/rest/src/main/java/org/apache/metamodel/elasticsearch/rest/JestElasticSearchUpdateCallback.java b/elasticsearch/rest/src/main/java/org/apache/metamodel/elasticsearch/rest/JestElasticSearchUpdateCallback.java
index 94e557c..a61280a 100644
--- a/elasticsearch/rest/src/main/java/org/apache/metamodel/elasticsearch/rest/JestElasticSearchUpdateCallback.java
+++ b/elasticsearch/rest/src/main/java/org/apache/metamodel/elasticsearch/rest/JestElasticSearchUpdateCallback.java
@@ -29,7 +29,6 @@ import org.apache.metamodel.drop.TableDropBuilder;
 import org.apache.metamodel.insert.RowInsertionBuilder;
 import org.apache.metamodel.schema.Schema;
 import org.apache.metamodel.schema.Table;
-import org.elasticsearch.action.bulk.BulkRequest;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 

http://git-wip-us.apache.org/repos/asf/metamodel/blob/d24c3e58/excel/src/main/java/org/apache/metamodel/excel/ExcelDataContext.java
----------------------------------------------------------------------
diff --git a/excel/src/main/java/org/apache/metamodel/excel/ExcelDataContext.java b/excel/src/main/java/org/apache/metamodel/excel/ExcelDataContext.java
index 1ce4244..713fbe8 100644
--- a/excel/src/main/java/org/apache/metamodel/excel/ExcelDataContext.java
+++ b/excel/src/main/java/org/apache/metamodel/excel/ExcelDataContext.java
@@ -20,7 +20,6 @@ package org.apache.metamodel.excel;
 
 import java.io.File;
 import java.io.IOException;
-import java.io.InputStream;
 import java.util.List;
 
 import org.apache.metamodel.DataContext;
@@ -35,7 +34,6 @@ import org.apache.metamodel.schema.MutableSchema;
 import org.apache.metamodel.schema.Schema;
 import org.apache.metamodel.schema.Table;
 import org.apache.metamodel.util.FileResource;
-import org.apache.metamodel.util.Func;
 import org.apache.metamodel.util.Resource;
 import org.apache.poi.POIXMLDocument;
 import org.slf4j.Logger;
@@ -187,19 +185,16 @@ public final class ExcelDataContext extends QueryPostprocessDataContext implemen
         if (_spreadsheetReaderDelegate == null) {
             synchronized (this) {
                 if (_spreadsheetReaderDelegate == null) {
-                    _spreadsheetReaderDelegate = _resource.read(new Func<InputStream, SpreadsheetReaderDelegate>() {
-                        @Override
-                        public SpreadsheetReaderDelegate eval(InputStream in) {
-                            try {
-                                if (POIXMLDocument.hasOOXMLHeader(in)) {
-                                    return new XlsxSpreadsheetReaderDelegate(_resource, _configuration);
-                                } else {
-                                    return new DefaultSpreadsheetReaderDelegate(_resource, _configuration);
-                                }
-                            } catch (IOException e) {
-                                logger.warn("Could not identify spreadsheet type, using default", e);
+                    _spreadsheetReaderDelegate = _resource.read(in -> {
+                        try {
+                            if (POIXMLDocument.hasOOXMLHeader(in)) {
+                                return new XlsxSpreadsheetReaderDelegate(_resource, _configuration);
+                            } else {
                                 return new DefaultSpreadsheetReaderDelegate(_resource, _configuration);
                             }
+                        } catch (IOException e) {
+                            logger.warn("Could not identify spreadsheet type, using default", e);
+                            return new DefaultSpreadsheetReaderDelegate(_resource, _configuration);
                         }
                     });
                 }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/d24c3e58/excel/src/main/java/org/apache/metamodel/excel/ExcelDeleteBuilder.java
----------------------------------------------------------------------
diff --git a/excel/src/main/java/org/apache/metamodel/excel/ExcelDeleteBuilder.java b/excel/src/main/java/org/apache/metamodel/excel/ExcelDeleteBuilder.java
index e4731b3..82eb5b6 100644
--- a/excel/src/main/java/org/apache/metamodel/excel/ExcelDeleteBuilder.java
+++ b/excel/src/main/java/org/apache/metamodel/excel/ExcelDeleteBuilder.java
@@ -24,17 +24,16 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.stream.Collectors;
 
-import org.apache.poi.ss.usermodel.Row;
-import org.apache.poi.ss.usermodel.Sheet;
-import org.apache.poi.ss.usermodel.Workbook;
 import org.apache.metamodel.MetaModelException;
-import org.apache.metamodel.MetaModelHelper;
 import org.apache.metamodel.data.DataSetHeader;
 import org.apache.metamodel.data.DefaultRow;
 import org.apache.metamodel.data.SimpleDataSetHeader;
 import org.apache.metamodel.delete.AbstractRowDeletionBuilder;
 import org.apache.metamodel.query.SelectItem;
 import org.apache.metamodel.schema.Table;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
 
 final class ExcelDeleteBuilder extends AbstractRowDeletionBuilder {
 

http://git-wip-us.apache.org/repos/asf/metamodel/blob/d24c3e58/excel/src/main/java/org/apache/metamodel/excel/ExcelUtils.java
----------------------------------------------------------------------
diff --git a/excel/src/main/java/org/apache/metamodel/excel/ExcelUtils.java b/excel/src/main/java/org/apache/metamodel/excel/ExcelUtils.java
index 1f424d6..85cc79b 100644
--- a/excel/src/main/java/org/apache/metamodel/excel/ExcelUtils.java
+++ b/excel/src/main/java/org/apache/metamodel/excel/ExcelUtils.java
@@ -19,7 +19,6 @@
 package org.apache.metamodel.excel;
 
 import java.io.File;
-import java.io.InputStream;
 import java.io.OutputStream;
 import java.text.NumberFormat;
 import java.util.Date;
@@ -30,6 +29,23 @@ import java.util.stream.Collectors;
 import javax.xml.parsers.SAXParser;
 import javax.xml.parsers.SAXParserFactory;
 
+import org.apache.metamodel.MetaModelException;
+import org.apache.metamodel.data.DataSet;
+import org.apache.metamodel.data.DataSetHeader;
+import org.apache.metamodel.data.DefaultRow;
+import org.apache.metamodel.data.EmptyDataSet;
+import org.apache.metamodel.data.Style;
+import org.apache.metamodel.data.Style.SizeUnit;
+import org.apache.metamodel.data.StyleBuilder;
+import org.apache.metamodel.query.SelectItem;
+import org.apache.metamodel.schema.Table;
+import org.apache.metamodel.util.Action;
+import org.apache.metamodel.util.DateUtils;
+import org.apache.metamodel.util.FileHelper;
+import org.apache.metamodel.util.FileResource;
+import org.apache.metamodel.util.FormatHelper;
+import org.apache.metamodel.util.InMemoryResource;
+import org.apache.metamodel.util.Resource;
 import org.apache.poi.hssf.usermodel.HSSFDateUtil;
 import org.apache.poi.hssf.usermodel.HSSFFont;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
@@ -50,25 +66,6 @@ import org.apache.poi.xssf.streaming.SXSSFWorkbook;
 import org.apache.poi.xssf.usermodel.XSSFCell;
 import org.apache.poi.xssf.usermodel.XSSFColor;
 import org.apache.poi.xssf.usermodel.XSSFFont;
-import org.apache.metamodel.MetaModelException;
-import org.apache.metamodel.MetaModelHelper;
-import org.apache.metamodel.data.DataSet;
-import org.apache.metamodel.data.DataSetHeader;
-import org.apache.metamodel.data.DefaultRow;
-import org.apache.metamodel.data.EmptyDataSet;
-import org.apache.metamodel.data.Style;
-import org.apache.metamodel.data.Style.SizeUnit;
-import org.apache.metamodel.data.StyleBuilder;
-import org.apache.metamodel.query.SelectItem;
-import org.apache.metamodel.schema.Table;
-import org.apache.metamodel.util.Action;
-import org.apache.metamodel.util.DateUtils;
-import org.apache.metamodel.util.FileHelper;
-import org.apache.metamodel.util.FileResource;
-import org.apache.metamodel.util.FormatHelper;
-import org.apache.metamodel.util.Func;
-import org.apache.metamodel.util.InMemoryResource;
-import org.apache.metamodel.util.Resource;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.xml.sax.XMLReader;
@@ -117,15 +114,12 @@ final class ExcelUtils {
             }
         }
 
-        return resource.read(new Func<InputStream, Workbook>() {
-            @Override
-            public Workbook eval(InputStream inputStream) {
-                try {
-                    return WorkbookFactory.create(inputStream);
-                } catch (Exception e) {
-                    logger.error("Could not open workbook", e);
-                    throw new IllegalStateException("Could not open workbook", e);
-                }
+        return resource.read(inputStream -> {
+            try {
+                return WorkbookFactory.create(inputStream);
+            } catch (Exception e) {
+                logger.error("Could not open workbook", e);
+                throw new IllegalStateException("Could not open workbook", e);
             }
         });
     }
@@ -277,8 +271,8 @@ final class ExcelUtils {
 
             return getCellValue(wb, evaluatedCell);
         } catch (RuntimeException e) {
-            logger.warn("Exception occurred while evaluating formula at position ({},{}): {}",
-                    new Object[] { cell.getRowIndex(), cell.getColumnIndex(), e.getMessage() });
+            logger.warn("Exception occurred while evaluating formula at position ({},{}): {}", new Object[] { cell
+                    .getRowIndex(), cell.getColumnIndex(), e.getMessage() });
             // Some exceptions we simply log - result will be then be the
             // actual formula
             if (e instanceof FormulaParseException) {
@@ -442,7 +436,8 @@ final class ExcelUtils {
     }
 
     public static DataSet getDataSet(Workbook workbook, Sheet sheet, Table table, ExcelConfiguration configuration) {
-        final List<SelectItem> selectItems = table.getColumns().stream().map(SelectItem::new).collect(Collectors.toList());
+        final List<SelectItem> selectItems = table.getColumns().stream().map(SelectItem::new).collect(Collectors
+                .toList());
         final Iterator<Row> rowIterator = getRowIterator(sheet, configuration, true);
         if (!rowIterator.hasNext()) {
             // no more rows!

http://git-wip-us.apache.org/repos/asf/metamodel/blob/d24c3e58/excel/src/main/java/org/apache/metamodel/excel/XlsxSpreadsheetReaderDelegate.java
----------------------------------------------------------------------
diff --git a/excel/src/main/java/org/apache/metamodel/excel/XlsxSpreadsheetReaderDelegate.java b/excel/src/main/java/org/apache/metamodel/excel/XlsxSpreadsheetReaderDelegate.java
index 0436a2a..81214fe 100644
--- a/excel/src/main/java/org/apache/metamodel/excel/XlsxSpreadsheetReaderDelegate.java
+++ b/excel/src/main/java/org/apache/metamodel/excel/XlsxSpreadsheetReaderDelegate.java
@@ -22,7 +22,6 @@ import java.io.Closeable;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
-import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;

http://git-wip-us.apache.org/repos/asf/metamodel/blob/d24c3e58/fixedwidth/src/main/java/org/apache/metamodel/fixedwidth/EbcdicConfiguration.java
----------------------------------------------------------------------
diff --git a/fixedwidth/src/main/java/org/apache/metamodel/fixedwidth/EbcdicConfiguration.java b/fixedwidth/src/main/java/org/apache/metamodel/fixedwidth/EbcdicConfiguration.java
index e4bff94..c2002de 100644
--- a/fixedwidth/src/main/java/org/apache/metamodel/fixedwidth/EbcdicConfiguration.java
+++ b/fixedwidth/src/main/java/org/apache/metamodel/fixedwidth/EbcdicConfiguration.java
@@ -25,6 +25,8 @@ import org.apache.metamodel.schema.naming.ColumnNamingStrategy;
  */
 public final class EbcdicConfiguration extends FixedWidthConfiguration {
 
+    private static final long serialVersionUID = 1L;
+    
     private final boolean _skipEbcdicHeader;
     private final boolean _eolPresent;
 

http://git-wip-us.apache.org/repos/asf/metamodel/blob/d24c3e58/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcDataContext.java
----------------------------------------------------------------------
diff --git a/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcDataContext.java b/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcDataContext.java
index 3f4a0ad..fbe45e0 100644
--- a/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcDataContext.java
+++ b/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcDataContext.java
@@ -25,7 +25,6 @@ import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;

http://git-wip-us.apache.org/repos/asf/metamodel/blob/d24c3e58/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcSchema.java
----------------------------------------------------------------------
diff --git a/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcSchema.java b/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcSchema.java
index ccac3f8..55ac4f0 100644
--- a/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcSchema.java
+++ b/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcSchema.java
@@ -22,7 +22,6 @@ import java.io.ObjectStreamException;
 import java.sql.Connection;
 
 import org.apache.metamodel.schema.MutableSchema;
-import org.apache.metamodel.schema.MutableTable;
 import org.apache.metamodel.schema.Schema;
 import org.apache.metamodel.schema.Table;
 

http://git-wip-us.apache.org/repos/asf/metamodel/blob/d24c3e58/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcDataContextTest.java
----------------------------------------------------------------------
diff --git a/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcDataContextTest.java b/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcDataContextTest.java
index c0f1b4e..64a31a6 100644
--- a/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcDataContextTest.java
+++ b/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcDataContextTest.java
@@ -34,7 +34,6 @@ import java.util.concurrent.TimeUnit;
 import javax.sql.DataSource;
 import javax.swing.table.TableModel;
 
-import org.easymock.EasyMock;
 import org.apache.commons.dbcp.BasicDataSource;
 import org.apache.metamodel.DataContext;
 import org.apache.metamodel.MetaModelException;
@@ -54,10 +53,10 @@ import org.apache.metamodel.query.Query;
 import org.apache.metamodel.query.QueryParameter;
 import org.apache.metamodel.query.SelectItem;
 import org.apache.metamodel.schema.Column;
-import org.apache.metamodel.schema.Relationship;
 import org.apache.metamodel.schema.Schema;
 import org.apache.metamodel.schema.Table;
 import org.apache.metamodel.schema.TableType;
+import org.easymock.EasyMock;
 
 public class JdbcDataContextTest extends JdbcTestCase {
 

http://git-wip-us.apache.org/repos/asf/metamodel/blob/d24c3e58/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/FirebirdTest.java
----------------------------------------------------------------------
diff --git a/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/FirebirdTest.java b/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/FirebirdTest.java
index 9857ea5..30c6dd2 100644
--- a/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/FirebirdTest.java
+++ b/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/FirebirdTest.java
@@ -24,10 +24,8 @@ import java.util.Date;
 import java.util.Set;
 import java.util.stream.Collectors;
 
-import javax.management.relation.Relation;
 import javax.swing.table.TableModel;
 
-import com.google.common.collect.Sets;
 import org.apache.metamodel.data.DataSet;
 import org.apache.metamodel.data.DataSetTableModel;
 import org.apache.metamodel.jdbc.JdbcDataContext;
@@ -38,6 +36,8 @@ import org.apache.metamodel.query.SelectItem;
 import org.apache.metamodel.schema.Schema;
 import org.apache.metamodel.schema.Table;
 
+import com.google.common.collect.Sets;
+
 /**
  * Integrationtests for Firebird SQL.
  * 

http://git-wip-us.apache.org/repos/asf/metamodel/blob/d24c3e58/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/OracleTest.java
----------------------------------------------------------------------
diff --git a/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/OracleTest.java b/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/OracleTest.java
index 826bc81..75baff4 100644
--- a/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/OracleTest.java
+++ b/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/OracleTest.java
@@ -28,9 +28,7 @@ import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 import javax.swing.table.TableModel;
-import javax.swing.text.html.Option;
 
-import com.google.common.collect.Sets;
 import org.apache.metamodel.DataContext;
 import org.apache.metamodel.data.DataSet;
 import org.apache.metamodel.data.DataSetTableModel;
@@ -46,6 +44,8 @@ import org.apache.metamodel.schema.Schema;
 import org.apache.metamodel.schema.Table;
 import org.apache.metamodel.schema.TableType;
 
+import com.google.common.collect.Sets;
+
 /**
  * Test case that tests oracle interaction. An express edition of the oracle
  * database can be used to run these tests.

http://git-wip-us.apache.org/repos/asf/metamodel/blob/d24c3e58/json/src/main/java/org/apache/metamodel/json/JsonDataContext.java
----------------------------------------------------------------------
diff --git a/json/src/main/java/org/apache/metamodel/json/JsonDataContext.java b/json/src/main/java/org/apache/metamodel/json/JsonDataContext.java
index 6578d7c..b0e923f 100644
--- a/json/src/main/java/org/apache/metamodel/json/JsonDataContext.java
+++ b/json/src/main/java/org/apache/metamodel/json/JsonDataContext.java
@@ -25,7 +25,6 @@ import java.util.stream.Collectors;
 
 import org.apache.metamodel.DataContext;
 import org.apache.metamodel.MetaModelException;
-import org.apache.metamodel.MetaModelHelper;
 import org.apache.metamodel.QueryPostprocessDataContext;
 import org.apache.metamodel.convert.DocumentConverter;
 import org.apache.metamodel.data.CachingDataSetHeader;

http://git-wip-us.apache.org/repos/asf/metamodel/blob/d24c3e58/json/src/test/java/org/apache/metamodel/json/JsonDataContextTest.java
----------------------------------------------------------------------
diff --git a/json/src/test/java/org/apache/metamodel/json/JsonDataContextTest.java b/json/src/test/java/org/apache/metamodel/json/JsonDataContextTest.java
index bfc1283..b27fc3d 100644
--- a/json/src/test/java/org/apache/metamodel/json/JsonDataContextTest.java
+++ b/json/src/test/java/org/apache/metamodel/json/JsonDataContextTest.java
@@ -21,11 +21,8 @@ package org.apache.metamodel.json;
 import java.io.File;
 import java.util.Arrays;
 
-import junit.framework.TestCase;
-
 import org.apache.metamodel.data.DataSet;
 import org.apache.metamodel.query.FunctionType;
-import org.apache.metamodel.schema.Column;
 import org.apache.metamodel.schema.Schema;
 import org.apache.metamodel.schema.Table;
 import org.apache.metamodel.schema.builder.SchemaBuilder;
@@ -35,6 +32,8 @@ import org.apache.metamodel.util.FileResource;
 import org.apache.metamodel.util.Resource;
 import org.apache.metamodel.util.SimpleTableDef;
 
+import junit.framework.TestCase;
+
 public class JsonDataContextTest extends TestCase {
 
     public void testReadArrayWithDocumentsFile() throws Exception {

http://git-wip-us.apache.org/repos/asf/metamodel/blob/d24c3e58/mongodb/mongo2/src/main/java/org/apache/metamodel/mongodb/mongo2/MongoDbDataSet.java
----------------------------------------------------------------------
diff --git a/mongodb/mongo2/src/main/java/org/apache/metamodel/mongodb/mongo2/MongoDbDataSet.java b/mongodb/mongo2/src/main/java/org/apache/metamodel/mongodb/mongo2/MongoDbDataSet.java
index 3197945..cffd0de 100644
--- a/mongodb/mongo2/src/main/java/org/apache/metamodel/mongodb/mongo2/MongoDbDataSet.java
+++ b/mongodb/mongo2/src/main/java/org/apache/metamodel/mongodb/mongo2/MongoDbDataSet.java
@@ -18,19 +18,18 @@
  */
 package org.apache.metamodel.mongodb.mongo2;
 
+import java.util.List;
+
 import org.apache.metamodel.data.AbstractDataSet;
 import org.apache.metamodel.data.Row;
 import org.apache.metamodel.mongodb.common.MongoDBUtils;
 import org.apache.metamodel.query.SelectItem;
-import org.apache.metamodel.schema.Column;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.mongodb.DBCursor;
 import com.mongodb.DBObject;
 
-import java.util.List;
-
 final class MongoDbDataSet extends AbstractDataSet {
 
     private static final Logger logger = LoggerFactory.getLogger(MongoDbDataSet.class);

http://git-wip-us.apache.org/repos/asf/metamodel/blob/d24c3e58/mongodb/mongo3/src/main/java/org/apache/metamodel/mongodb/mongo3/MongoDbDataSet.java
----------------------------------------------------------------------
diff --git a/mongodb/mongo3/src/main/java/org/apache/metamodel/mongodb/mongo3/MongoDbDataSet.java b/mongodb/mongo3/src/main/java/org/apache/metamodel/mongodb/mongo3/MongoDbDataSet.java
index 76a7636..3846b4a 100644
--- a/mongodb/mongo3/src/main/java/org/apache/metamodel/mongodb/mongo3/MongoDbDataSet.java
+++ b/mongodb/mongo3/src/main/java/org/apache/metamodel/mongodb/mongo3/MongoDbDataSet.java
@@ -18,19 +18,18 @@
  */
 package org.apache.metamodel.mongodb.mongo3;
 
+import java.util.List;
+
 import org.apache.metamodel.data.AbstractDataSet;
 import org.apache.metamodel.data.Row;
 import org.apache.metamodel.mongodb.common.MongoDBUtils;
 import org.apache.metamodel.query.SelectItem;
-import org.apache.metamodel.schema.Column;
 import org.bson.Document;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.mongodb.client.MongoCursor;
 
-import java.util.List;
-
 final class MongoDbDataSet extends AbstractDataSet {
 
     private static final Logger logger = LoggerFactory.getLogger(MongoDbDataSet.class);

http://git-wip-us.apache.org/repos/asf/metamodel/blob/d24c3e58/mongodb/mongo3/src/test/java/org/apache/metamodel/mongodb/mongo3/MongoDbDataContextTest.java
----------------------------------------------------------------------
diff --git a/mongodb/mongo3/src/test/java/org/apache/metamodel/mongodb/mongo3/MongoDbDataContextTest.java b/mongodb/mongo3/src/test/java/org/apache/metamodel/mongodb/mongo3/MongoDbDataContextTest.java
index 9751719..78fbddc 100644
--- a/mongodb/mongo3/src/test/java/org/apache/metamodel/mongodb/mongo3/MongoDbDataContextTest.java
+++ b/mongodb/mongo3/src/test/java/org/apache/metamodel/mongodb/mongo3/MongoDbDataContextTest.java
@@ -24,10 +24,6 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import com.mongodb.BasicDBObject;
-import com.mongodb.DBCollection;
-import com.mongodb.WriteConcern;
-
 import org.apache.metamodel.DataContext;
 import org.apache.metamodel.UpdateCallback;
 import org.apache.metamodel.UpdateScript;
@@ -43,6 +39,7 @@ import org.bson.Document;
 
 import com.mongodb.MongoClient;
 import com.mongodb.MongoClientURI;
+import com.mongodb.WriteConcern;
 import com.mongodb.client.MongoCollection;
 import com.mongodb.client.MongoDatabase;
 

http://git-wip-us.apache.org/repos/asf/metamodel/blob/d24c3e58/neo4j/src/main/java/org/apache/metamodel/neo4j/Neo4jDataContext.java
----------------------------------------------------------------------
diff --git a/neo4j/src/main/java/org/apache/metamodel/neo4j/Neo4jDataContext.java b/neo4j/src/main/java/org/apache/metamodel/neo4j/Neo4jDataContext.java
index 82f710d..2a598b5 100644
--- a/neo4j/src/main/java/org/apache/metamodel/neo4j/Neo4jDataContext.java
+++ b/neo4j/src/main/java/org/apache/metamodel/neo4j/Neo4jDataContext.java
@@ -30,7 +30,6 @@ import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClientBuilder;
 import org.apache.metamodel.DataContext;
 import org.apache.metamodel.MetaModelException;
-import org.apache.metamodel.MetaModelHelper;
 import org.apache.metamodel.QueryPostprocessDataContext;
 import org.apache.metamodel.data.DataSet;
 import org.apache.metamodel.data.DocumentSource;

http://git-wip-us.apache.org/repos/asf/metamodel/blob/d24c3e58/neo4j/src/test/java/org/apache/metamodel/neo4j/Neo4jDataContextTest.java
----------------------------------------------------------------------
diff --git a/neo4j/src/test/java/org/apache/metamodel/neo4j/Neo4jDataContextTest.java b/neo4j/src/test/java/org/apache/metamodel/neo4j/Neo4jDataContextTest.java
index 89bf977..1ac7fa2 100644
--- a/neo4j/src/test/java/org/apache/metamodel/neo4j/Neo4jDataContextTest.java
+++ b/neo4j/src/test/java/org/apache/metamodel/neo4j/Neo4jDataContextTest.java
@@ -19,7 +19,6 @@
 package org.apache.metamodel.neo4j;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;

http://git-wip-us.apache.org/repos/asf/metamodel/blob/d24c3e58/pojo/src/main/java/org/apache/metamodel/pojo/PojoDataContext.java
----------------------------------------------------------------------
diff --git a/pojo/src/main/java/org/apache/metamodel/pojo/PojoDataContext.java b/pojo/src/main/java/org/apache/metamodel/pojo/PojoDataContext.java
index f694202..97828df 100644
--- a/pojo/src/main/java/org/apache/metamodel/pojo/PojoDataContext.java
+++ b/pojo/src/main/java/org/apache/metamodel/pojo/PojoDataContext.java
@@ -28,7 +28,6 @@ import java.util.stream.Collectors;
 
 import org.apache.metamodel.DataContext;
 import org.apache.metamodel.MetaModelException;
-import org.apache.metamodel.MetaModelHelper;
 import org.apache.metamodel.QueryPostprocessDataContext;
 import org.apache.metamodel.UpdateScript;
 import org.apache.metamodel.UpdateSummary;

http://git-wip-us.apache.org/repos/asf/metamodel/blob/d24c3e58/salesforce/src/main/java/org/apache/metamodel/salesforce/SalesforceDataContext.java
----------------------------------------------------------------------
diff --git a/salesforce/src/main/java/org/apache/metamodel/salesforce/SalesforceDataContext.java b/salesforce/src/main/java/org/apache/metamodel/salesforce/SalesforceDataContext.java
index 8d25bf4..7e3a73e 100644
--- a/salesforce/src/main/java/org/apache/metamodel/salesforce/SalesforceDataContext.java
+++ b/salesforce/src/main/java/org/apache/metamodel/salesforce/SalesforceDataContext.java
@@ -164,7 +164,7 @@ public class SalesforceDataContext extends QueryPostprocessDataContext implement
         try {
             sb.append("SELECT ");
             int i = 0;
-            final List<Column> columns = new ArrayList(selectItems.size());
+            final List<Column> columns = new ArrayList<>(selectItems.size());
             for (SelectItem selectItem : selectItems) {
                 validateSoqlSupportedSelectItem(selectItem);
                 columns.set(i,selectItem.getColumn());
@@ -352,7 +352,6 @@ public class SalesforceDataContext extends QueryPostprocessDataContext implement
         }
     }
 
-    @SuppressWarnings("deprecation")
     private static void validateSoqlSupportedSelectItem(SelectItem selectItem) throws UnsupportedOperationException {
         if (selectItem.hasFunction()) {
             throw new UnsupportedOperationException("Function select items not supported: " + selectItem);

http://git-wip-us.apache.org/repos/asf/metamodel/blob/d24c3e58/salesforce/src/main/java/org/apache/metamodel/salesforce/SalesforceUpdateCallback.java
----------------------------------------------------------------------
diff --git a/salesforce/src/main/java/org/apache/metamodel/salesforce/SalesforceUpdateCallback.java b/salesforce/src/main/java/org/apache/metamodel/salesforce/SalesforceUpdateCallback.java
index bf9b43b..5db2264 100644
--- a/salesforce/src/main/java/org/apache/metamodel/salesforce/SalesforceUpdateCallback.java
+++ b/salesforce/src/main/java/org/apache/metamodel/salesforce/SalesforceUpdateCallback.java
@@ -215,7 +215,6 @@ final class SalesforceUpdateCallback extends AbstractUpdateCallback implements C
      * @param idList
      * @param whereItem
      */
-    @SuppressWarnings("deprecation")
     protected void buildIdList(List<String> idList, FilterItem whereItem) {
         if (whereItem.isCompoundFilter()) {
             final LogicalOperator logicalOperator = whereItem.getLogicalOperator();

http://git-wip-us.apache.org/repos/asf/metamodel/blob/d24c3e58/xml/src/main/java/org/apache/metamodel/xml/XmlDomDataContext.java
----------------------------------------------------------------------
diff --git a/xml/src/main/java/org/apache/metamodel/xml/XmlDomDataContext.java b/xml/src/main/java/org/apache/metamodel/xml/XmlDomDataContext.java
index cfc3686..aab6fca 100644
--- a/xml/src/main/java/org/apache/metamodel/xml/XmlDomDataContext.java
+++ b/xml/src/main/java/org/apache/metamodel/xml/XmlDomDataContext.java
@@ -34,7 +34,6 @@ import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
 
 import org.apache.metamodel.MetaModelException;
-import org.apache.metamodel.MetaModelHelper;
 import org.apache.metamodel.QueryPostprocessDataContext;
 import org.apache.metamodel.data.CachingDataSetHeader;
 import org.apache.metamodel.data.DataSet;


[08/20] metamodel git commit: less intrusive conversion, due to failing test cases

Posted by ka...@apache.org.
less intrusive conversion, due to failing test cases


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

Branch: refs/heads/master
Commit: 7f76973edc8e9e72bd404484585c11f156766926
Parents: 2d156bc
Author: Jörg Unbehauen <jo...@unbehauen.net>
Authored: Thu Jul 27 18:18:12 2017 +0200
Committer: Jörg Unbehauen <jo...@unbehauen.net>
Committed: Thu Jul 27 18:18:12 2017 +0200

----------------------------------------------------------------------
 .../apache/metamodel/xml/XmlDomDataContext.java | 67 +++++++++++---------
 1 file changed, 38 insertions(+), 29 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/metamodel/blob/7f76973e/xml/src/main/java/org/apache/metamodel/xml/XmlDomDataContext.java
----------------------------------------------------------------------
diff --git a/xml/src/main/java/org/apache/metamodel/xml/XmlDomDataContext.java b/xml/src/main/java/org/apache/metamodel/xml/XmlDomDataContext.java
index 3c4d0cd..ad8181c 100644
--- a/xml/src/main/java/org/apache/metamodel/xml/XmlDomDataContext.java
+++ b/xml/src/main/java/org/apache/metamodel/xml/XmlDomDataContext.java
@@ -21,7 +21,11 @@ package org.apache.metamodel.xml;
 import java.io.File;
 import java.io.InputStream;
 import java.net.URL;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 import java.util.Map.Entry;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
@@ -175,7 +179,7 @@ public class XmlDomDataContext extends QueryPostprocessDataContext {
     }
 
     @Override
-    public DataSet materializeMainSchemaTable(Table table, List<Column> columns, int maxRows) {
+    public DataSet materializeMainSchemaTable(Table table, List<Column> columnList, int maxRows) {
         loadSchema();
         List<Object[]> tableData = _tableData.get(table.getName());
         if (tableData == null) {
@@ -183,8 +187,9 @@ public class XmlDomDataContext extends QueryPostprocessDataContext {
                     + _tableData.keySet());
         }
 
-        final List<SelectItem> selectItems = columns.stream().map(SelectItem::new).collect(Collectors.toList());
+        final List<SelectItem> selectItems = columnList.stream().map(SelectItem::new).collect(Collectors.toList());
         final DataSetHeader header = new CachingDataSetHeader(selectItems);
+        final Column[] columns = columnList.toArray(new Column[columnList.size()]);
 
         final List<Row> resultData = new ArrayList<Row>();
         for (Object[] tableDataRow : tableData) {
@@ -192,9 +197,9 @@ public class XmlDomDataContext extends QueryPostprocessDataContext {
                 break;
             }
             maxRows--;
-            Object[] dataValues = new Object[columns.size()];
-            for (int i = 0; i < columns.size(); i++) {
-                Column column = columns.get(i);
+            Object[] dataValues = new Object[columns.length];
+            for (int i = 0; i < columns.length; i++) {
+                Column column = columns[i];
                 int columnNumber = column.getColumnNumber();
                 // Some rows may not contain values for all columns
                 // (attributes)
@@ -256,7 +261,7 @@ public class XmlDomDataContext extends QueryPostprocessDataContext {
 
         // Remove tables from schema that has no data (typically root
         // node or pure XML structure)
-        List<Table> tables = _schema.getTables();
+        Table[] tables = _schema.getTables().toArray(new Table[0]);
         for (Table table : tables) {
             String tableName = table.getName();
             List<Object[]> tableRows = _tableData.get(tableName);
@@ -328,7 +333,7 @@ public class XmlDomDataContext extends QueryPostprocessDataContext {
                     table.addColumn(foreignKeyColumn);
 
                     MutableRelationship.createRelationship(parentKeyColumn ,
-                            foreignKeyColumn );
+                            foreignKeyColumn);
 
                 } else {
                     foreignKeyColumn = null;
@@ -336,9 +341,9 @@ public class XmlDomDataContext extends QueryPostprocessDataContext {
             } else {
                 idColumn = getIdColumn(table);
                 tableRows = _tableData.get(tableName);
-                List<Column> foreignKeys = table.getForeignKeys();
-                if (foreignKeys.size() == 1) {
-                    foreignKeyColumn = (MutableColumn) foreignKeys.get(0);
+                Column[] foreignKeys = table.getForeignKeys().toArray(new Column[0]);
+                if (foreignKeys.length == 1) {
+                    foreignKeyColumn = (MutableColumn) foreignKeys[0];
                 } else {
                     foreignKeyColumn = null;
                 }
@@ -398,9 +403,8 @@ public class XmlDomDataContext extends QueryPostprocessDataContext {
     }
 
     private Column getTextContentColumn(MutableTable table, String preferredColumnName) {
-        List<Column> columns = table.getColumns();
         MutableColumn column = null;
-        for (Column col : columns) {
+        for (Column col : table.getColumns()) {
             if (NATIVE_TYPE_TEXT.equals(col.getNativeType())) {
                 column = (MutableColumn) col;
                 break;
@@ -417,9 +421,8 @@ public class XmlDomDataContext extends QueryPostprocessDataContext {
     }
 
     private MutableColumn getIdColumn(MutableTable table) {
-        List<Column> columns = table.getColumns();
         MutableColumn column = null;
-        for (Column col : columns) {
+        for (Column col : table.getColumns()) {
             if (NATIVE_TYPE_PRIMARY_KEY.equals(col.getNativeType())) {
                 column = (MutableColumn) col;
                 break;
@@ -504,15 +507,18 @@ public class XmlDomDataContext extends QueryPostprocessDataContext {
         // Check that foreignTable is not primary table in other relationships
         // (if so we can't flatten as that would require id-rewriting of those
         // foreign tables as well)
-        if (!foreignTable.getPrimaryKeyRelationships().isEmpty()) {
-            Collection<Relationship> foreignPrimaryRelationships = foreignTable.getPrimaryKeyRelationships();
+        if (foreignTable.getPrimaryKeyRelationships().size() != 0) {
+            Relationship[] foreignPrimaryRelationships = foreignTable.getPrimaryKeyRelationships().toArray(new Relationship[0]);
+            String[] foreignPrimaryNames = new String[foreignPrimaryRelationships.length];
+            for (int i = 0; i < foreignPrimaryRelationships.length; i++) {
+                foreignPrimaryNames[i] = foreignPrimaryRelationships[i].getForeignTable().getName();
+            }
             throw new UnsupportedOperationException("Cannot flatten foreign table '" + foreignTable.getName()
-                    + "' as it acts as primary table for tables: " + foreignPrimaryRelationships.stream()
-                    .map(ftRel -> ftRel.getForeignTable().getName()).collect(Collectors.joining(", ")));
+                    + "' as it acts as primary table for tables: " + Arrays.toString(foreignPrimaryNames));
         }
 
-        List<Column> primaryColumns = new ArrayList<>(primaryTable.getColumns());
-        List<Column> foreignColumns = new ArrayList<>(foreignTable.getColumns());
+        List<Column> primaryColumns = new ArrayList<Column>(primaryTable.getColumns());
+        List<Column> foreignColumns = new ArrayList<Column>(foreignTable.getColumns());
 
         // Remove the surrogate id
         String primaryTableName = primaryTable.getName();
@@ -521,7 +527,8 @@ public class XmlDomDataContext extends QueryPostprocessDataContext {
         foreignColumns.remove(idColumn);
 
         // Remove the foreign keys
-        for (Column foreignKey : foreignTable.getForeignKeys()) {
+        Column[] foreignKeys = foreignTable.getForeignKeys().toArray(new Column[0]);
+        for (Column foreignKey : foreignKeys) {
             foreignColumns.remove(foreignKey);
         }
 
@@ -567,20 +574,22 @@ public class XmlDomDataContext extends QueryPostprocessDataContext {
      * mapped tables).
      */
     public XmlDomDataContext autoFlattenTables() {
-        for (Table table : _schema.getTables()) {
+        Table[] tables = _schema.getTables().toArray(new Table[0]);
+        for (Table table : tables) {
             // First check to see that this table still exist (ie. has not been
             // flattened in a previous loop)
             if (_tableData.containsKey(table.getName())) {
                 // Find all tables that represent inner tags
-                Collection<Relationship> foreignKeyRelationships = table.getForeignKeyRelationships();
-                if (foreignKeyRelationships.size() == 1 && table.getPrimaryKeyRelationships().size() == 0) {
-                    Relationship foreignKeyRelationship = foreignKeyRelationships.iterator().next();
+                Relationship[] foreignKeyRelationships = table.getForeignKeyRelationships().toArray(new Relationship[0]);
+                if (foreignKeyRelationships.length == 1 && table.getPrimaryKeyRelationships().size() == 0) {
+                    Relationship foreignKeyRelationship = foreignKeyRelationships[0];
 
                     // If there is exactly one inner tag then we can probably
                     // flatten the tables, but it's only relevant if the inner
                     // tag only carry a single data column
                     int nonDataColumns = 0;
-                    for (Column column : table.getColumns()) {
+                    Column[] columns = table.getColumns().toArray(new Column[0]);
+                    for (Column column : columns) {
                         String nativeType = column.getNativeType();
                         // Use the native column type constants to determine if
                         // the column is an artificial column
@@ -589,14 +598,14 @@ public class XmlDomDataContext extends QueryPostprocessDataContext {
                         }
                     }
 
-                    if (table.getColumns().size() == nonDataColumns + 1) {
+                    if (columns.length == nonDataColumns + 1) {
                         // If the foreign key is unique for all rows, we will
                         // flatten it (otherwise it means that multiple inner
                         // tags occur, which requires two tables to deal with
                         // multiplicity)
                         boolean uniqueForeignKeys = true;
 
-                        List<Column> foreignColumns = foreignKeyRelationship.getForeignColumns();
+                        Column[] foreignColumns = foreignKeyRelationship.getForeignColumns().toArray(new Column[0]);
 
                         SelectItem countAllItem = SelectItem.getCountAllItem();
                         Query q = new Query().select(foreignColumns).select(countAllItem).from(table).groupBy(


[06/20] metamodel git commit: now all compiling

Posted by ka...@apache.org.
http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/excel/src/main/java/org/apache/metamodel/excel/ExcelUtils.java
----------------------------------------------------------------------
diff --git a/excel/src/main/java/org/apache/metamodel/excel/ExcelUtils.java b/excel/src/main/java/org/apache/metamodel/excel/ExcelUtils.java
index 7504d64..1f424d6 100644
--- a/excel/src/main/java/org/apache/metamodel/excel/ExcelUtils.java
+++ b/excel/src/main/java/org/apache/metamodel/excel/ExcelUtils.java
@@ -24,6 +24,8 @@ import java.io.OutputStream;
 import java.text.NumberFormat;
 import java.util.Date;
 import java.util.Iterator;
+import java.util.List;
+import java.util.stream.Collectors;
 
 import javax.xml.parsers.SAXParser;
 import javax.xml.parsers.SAXParserFactory;
@@ -440,7 +442,7 @@ final class ExcelUtils {
     }
 
     public static DataSet getDataSet(Workbook workbook, Sheet sheet, Table table, ExcelConfiguration configuration) {
-        final SelectItem[] selectItems = MetaModelHelper.createSelectItems(table.getColumns());
+        final List<SelectItem> selectItems = table.getColumns().stream().map(SelectItem::new).collect(Collectors.toList());
         final Iterator<Row> rowIterator = getRowIterator(sheet, configuration, true);
         if (!rowIterator.hasNext()) {
             // no more rows!

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/excel/src/main/java/org/apache/metamodel/excel/SpreadsheetReaderDelegate.java
----------------------------------------------------------------------
diff --git a/excel/src/main/java/org/apache/metamodel/excel/SpreadsheetReaderDelegate.java b/excel/src/main/java/org/apache/metamodel/excel/SpreadsheetReaderDelegate.java
index 1181b07..5fdd7ec 100644
--- a/excel/src/main/java/org/apache/metamodel/excel/SpreadsheetReaderDelegate.java
+++ b/excel/src/main/java/org/apache/metamodel/excel/SpreadsheetReaderDelegate.java
@@ -23,6 +23,8 @@ import org.apache.metamodel.schema.Column;
 import org.apache.metamodel.schema.Schema;
 import org.apache.metamodel.schema.Table;
 
+import java.util.List;
+
 /**
  * Delegate for spreadsheet-implementation specific operations in an
  * {@link ExcelDataContext}.
@@ -33,6 +35,6 @@ interface SpreadsheetReaderDelegate {
 
     public Schema createSchema(String schemaName) throws Exception;
 
-    public DataSet executeQuery(Table table, Column[] columns, int maxRows) throws Exception;
+    public DataSet executeQuery(Table table, List<Column> columns, int maxRows) throws Exception;
 
 }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/excel/src/main/java/org/apache/metamodel/excel/XlsDataSet.java
----------------------------------------------------------------------
diff --git a/excel/src/main/java/org/apache/metamodel/excel/XlsDataSet.java b/excel/src/main/java/org/apache/metamodel/excel/XlsDataSet.java
index 4e097e4..e0f4986 100644
--- a/excel/src/main/java/org/apache/metamodel/excel/XlsDataSet.java
+++ b/excel/src/main/java/org/apache/metamodel/excel/XlsDataSet.java
@@ -19,6 +19,7 @@
 package org.apache.metamodel.excel;
 
 import java.util.Iterator;
+import java.util.List;
 
 import org.apache.poi.ss.usermodel.Workbook;
 import org.apache.metamodel.data.AbstractDataSet;
@@ -46,8 +47,8 @@ final class XlsDataSet extends AbstractDataSet {
      * @param workbook
      * @param rowIterator
      */
-    public XlsDataSet(SelectItem[] selectItems, Workbook workbook,
-            Iterator<org.apache.poi.ss.usermodel.Row> rowIterator) {
+    public XlsDataSet(List<SelectItem> selectItems, Workbook workbook,
+                      Iterator<org.apache.poi.ss.usermodel.Row> rowIterator) {
         super(selectItems);
         _workbook = workbook;
         _rowIterator = rowIterator;

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/excel/src/main/java/org/apache/metamodel/excel/XlsxRowPublisherAction.java
----------------------------------------------------------------------
diff --git a/excel/src/main/java/org/apache/metamodel/excel/XlsxRowPublisherAction.java b/excel/src/main/java/org/apache/metamodel/excel/XlsxRowPublisherAction.java
index a154251..5635de6 100644
--- a/excel/src/main/java/org/apache/metamodel/excel/XlsxRowPublisherAction.java
+++ b/excel/src/main/java/org/apache/metamodel/excel/XlsxRowPublisherAction.java
@@ -38,12 +38,12 @@ class XlsxRowPublisherAction implements Action<RowPublisher> {
 			.getLogger(XlsxRowPublisherAction.class);
 
 	private final ExcelConfiguration _configuration;
-	private final Column[] _columns;
+	private final List<Column> _columns;
 	private final String _relationshipId;
 	private final XSSFReader _xssfReader;
 
 	public XlsxRowPublisherAction(ExcelConfiguration configuration,
-			Column[] columns, String relationshipId, XSSFReader xssfReader) {
+			List<Column> columns, String relationshipId, XSSFReader xssfReader) {
 		_configuration = configuration;
 		_columns = columns;
 		_relationshipId = relationshipId;
@@ -66,10 +66,10 @@ class XlsxRowPublisherAction implements Action<RowPublisher> {
 					}
 				}
 
-				Object[] rowData = new Object[_columns.length];
-				Style[] styleData = new Style[_columns.length];
-				for (int i = 0; i < _columns.length; i++) {
-					int columnNumber = _columns[i].getColumnNumber();
+				Object[] rowData = new Object[_columns.size()];
+				Style[] styleData = new Style[_columns.size()];
+				for (int i = 0; i < _columns.size(); i++) {
+					int columnNumber = _columns.get(i).getColumnNumber();
 					if (columnNumber < values.size()) {
 						rowData[i] = values.get(columnNumber);
 						styleData[i] = styles.get(columnNumber);

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/excel/src/main/java/org/apache/metamodel/excel/XlsxSpreadsheetReaderDelegate.java
----------------------------------------------------------------------
diff --git a/excel/src/main/java/org/apache/metamodel/excel/XlsxSpreadsheetReaderDelegate.java b/excel/src/main/java/org/apache/metamodel/excel/XlsxSpreadsheetReaderDelegate.java
index 94a9ff7..0436a2a 100644
--- a/excel/src/main/java/org/apache/metamodel/excel/XlsxSpreadsheetReaderDelegate.java
+++ b/excel/src/main/java/org/apache/metamodel/excel/XlsxSpreadsheetReaderDelegate.java
@@ -27,6 +27,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Collectors;
 
 import org.apache.metamodel.data.DataSet;
 import org.apache.metamodel.data.RowPublisherDataSet;
@@ -72,7 +73,7 @@ final class XlsxSpreadsheetReaderDelegate implements SpreadsheetReaderDelegate {
     }
 
     @Override
-    public DataSet executeQuery(Table table, Column[] columns, int maxRows) throws Exception {
+    public DataSet executeQuery(Table table, List<Column> columns, int maxRows) throws Exception {
         final OPCPackage pkg = openOPCPackage();
         final XSSFReader xssfReader = new XSSFReader(pkg);
         final String relationshipId = _tableNamesToInternalIds.get(table.getName());
@@ -136,13 +137,10 @@ final class XlsxSpreadsheetReaderDelegate implements SpreadsheetReaderDelegate {
         }
     }
 
-    private DataSet buildDataSet(final Column[] columns, int maxRows, final String relationshipId,
+    private DataSet buildDataSet(final List<Column> columns, int maxRows, final String relationshipId,
             final XSSFReader xssfReader, final OPCPackage pkg) throws Exception {
 
-        List<SelectItem> selectItems = new ArrayList<SelectItem>(columns.length);
-        for (Column column : columns) {
-            selectItems.add(new SelectItem(column));
-        }
+        List<SelectItem> selectItems = columns.stream().map(SelectItem::new).collect(Collectors.toList());
         final XlsxRowPublisherAction publishAction = new XlsxRowPublisherAction(_configuration, columns, relationshipId,
                 xssfReader);
 

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/excel/src/test/java/org/apache/metamodel/excel/DefaultSpreadsheetReaderDelegateTest.java
----------------------------------------------------------------------
diff --git a/excel/src/test/java/org/apache/metamodel/excel/DefaultSpreadsheetReaderDelegateTest.java b/excel/src/test/java/org/apache/metamodel/excel/DefaultSpreadsheetReaderDelegateTest.java
index 96d7dff..91d336b 100644
--- a/excel/src/test/java/org/apache/metamodel/excel/DefaultSpreadsheetReaderDelegateTest.java
+++ b/excel/src/test/java/org/apache/metamodel/excel/DefaultSpreadsheetReaderDelegateTest.java
@@ -20,6 +20,7 @@ package org.apache.metamodel.excel;
 
 import java.io.File;
 import java.lang.reflect.Field;
+import java.util.List;
 
 import org.apache.metamodel.data.DataSet;
 import org.apache.metamodel.data.Row;
@@ -85,31 +86,31 @@ public class DefaultSpreadsheetReaderDelegateTest extends TestCase {
 
         assertEquals(DefaultSpreadsheetReaderDelegate.class, mainDataContext.getSpreadsheetReaderDelegateClass());
 
-        Table[] tables = schema.getTables();
-        assertTrue(tables.length > 0);
+        List<Table> tables = schema.getTables();
+        assertTrue(tables.size() > 0);
 
-        Table[] comparedTables = null;
+        List<Table> comparedTables = null;
         if (comparedDataContext != null) {
             assertEquals(XlsxSpreadsheetReaderDelegate.class, comparedDataContext.getSpreadsheetReaderDelegateClass());
             comparedTables = comparedDataContext.getDefaultSchema().getTables();
-            assertEquals(comparedTables.length, tables.length);
+            assertEquals(comparedTables.size(), tables.size());
         }
 
-        for (int i = 0; i < tables.length; i++) {
-            Table table = tables[i];
-            Column[] columns = table.getColumns();
+        for (int i = 0; i < tables.size(); i++) {
+            Table table = tables.get(i);
+            List<Column> columns = table.getColumns();
             Query query = mainDataContext.query().from(table).select(columns).toQuery();
             DataSet dataSet = mainDataContext.executeQuery(query);
 
             DataSet comparedDataSet = null;
             if (comparedDataContext != null) {
-                Table comparedTable = comparedTables[i];
+                Table comparedTable = comparedTables.get(i);
                 assertEquals(comparedTable.getName(), table.getName());
                 assertEquals(comparedTable.getColumnCount(), table.getColumnCount());
 
-                Column[] comparedColumns = comparedTable.getColumns();
-                for (int j = 0; j < comparedColumns.length; j++) {
-                    assertEquals(columns[j].getColumnNumber(), comparedColumns[j].getColumnNumber());
+                List<Column> comparedColumns = comparedTable.getColumns();
+                for (int j = 0; j < comparedColumns.size(); j++) {
+                    assertEquals(columns.get(j).getColumnNumber(), comparedColumns.get(j).getColumnNumber());
                 }
 
                 Query comparedQuery = comparedDataContext.query().from(comparedTable).select(comparedColumns).toQuery();
@@ -173,7 +174,7 @@ public class DefaultSpreadsheetReaderDelegateTest extends TestCase {
         ExcelDataContext dc = new ExcelDataContext(copyOf("src/test/resources/Spreadsheet2007.xlsx"));
         applyReaderDelegate(dc);
 
-        Table table = dc.getDefaultSchema().getTables()[0];
+        Table table = dc.getDefaultSchema().getTables().get(0);
 
         final String expectedStyling = "";
 
@@ -194,7 +195,7 @@ public class DefaultSpreadsheetReaderDelegateTest extends TestCase {
         ExcelDataContext dc = new ExcelDataContext(copyOf("src/test/resources/formulas.xlsx"));
         applyReaderDelegate(dc);
 
-        Table table = dc.getDefaultSchema().getTables()[0];
+        Table table = dc.getDefaultSchema().getTables().get(0);
 
         DataSet dataSet = dc.query().from(table).select("Foo").and("Bar").where("Foo").isEquals("7").execute();
         assertTrue(dataSet.next());

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/excel/src/test/java/org/apache/metamodel/excel/ExcelDataContextTest.java
----------------------------------------------------------------------
diff --git a/excel/src/test/java/org/apache/metamodel/excel/ExcelDataContextTest.java b/excel/src/test/java/org/apache/metamodel/excel/ExcelDataContextTest.java
index ecd6691..844522e 100644
--- a/excel/src/test/java/org/apache/metamodel/excel/ExcelDataContextTest.java
+++ b/excel/src/test/java/org/apache/metamodel/excel/ExcelDataContextTest.java
@@ -82,7 +82,7 @@ public class ExcelDataContextTest extends TestCase {
         assertNull(dc.getSpreadsheetReaderDelegateClass());
         assertEquals(1, dc.getDefaultSchema().getTableCount());
 
-        Table table = dc.getDefaultSchema().getTables()[0];
+        Table table = dc.getDefaultSchema().getTables().get(0);
         assertEquals("sheet", table.getName());
         assertEquals(0, table.getColumnCount());
 
@@ -94,7 +94,7 @@ public class ExcelDataContextTest extends TestCase {
                 ExcelConfiguration.NO_COLUMN_NAME_LINE, false, false));
         assertEquals(1, dc.getDefaultSchema().getTableCount());
 
-        Table table = dc.getDefaultSchema().getTables()[0];
+        Table table = dc.getDefaultSchema().getTables().get(0);
         assertEquals("sheet", table.getName());
         assertEquals(0, table.getColumnCount());
     }
@@ -104,7 +104,7 @@ public class ExcelDataContextTest extends TestCase {
                 true, false));
         assertEquals(1, dc.getDefaultSchema().getTableCount());
 
-        Table table = dc.getDefaultSchema().getTables()[0];
+        Table table = dc.getDefaultSchema().getTables().get(0);
         assertEquals("xls_people", table.getName());
         assertEquals(0, table.getColumnCount());
     }
@@ -112,8 +112,8 @@ public class ExcelDataContextTest extends TestCase {
     public void testSkipEmptyColumns() throws Exception {
         ExcelConfiguration conf = new ExcelConfiguration(ExcelConfiguration.DEFAULT_COLUMN_NAME_LINE, true, true);
         ExcelDataContext dc = new ExcelDataContext(copyOf("src/test/resources/skipped_lines.xlsx"), conf);
-        Table table = dc.getDefaultSchema().getTables()[0];
-        assertEquals("[hello, world]", Arrays.toString(table.getColumnNames()));
+        Table table = dc.getDefaultSchema().getTables().get(0);
+        assertEquals("[hello, world]", Arrays.toString(table.getColumnNames().toArray()));
 
         DataSet ds = dc.executeQuery(dc.query().from(table).select("hello").toQuery());
         assertTrue(ds.next());
@@ -123,8 +123,8 @@ public class ExcelDataContextTest extends TestCase {
     public void testDontSkipEmptyLinesNoHeader() throws Exception {
         ExcelConfiguration conf = new ExcelConfiguration(ExcelConfiguration.NO_COLUMN_NAME_LINE, false, true);
         ExcelDataContext dc = new ExcelDataContext(copyOf("src/test/resources/skipped_lines.xlsx"), conf);
-        Table table = dc.getDefaultSchema().getTables()[0];
-        assertEquals("[G, H]", Arrays.toString(table.getColumnNames()));
+        Table table = dc.getDefaultSchema().getTables().get(0);
+        assertEquals("[G, H]", Arrays.toString(table.getColumnNames().toArray()));
 
         assertEquals(6, table.getColumnByName("G").getColumnNumber());
         assertEquals(7, table.getColumnByName("H").getColumnNumber());
@@ -147,8 +147,8 @@ public class ExcelDataContextTest extends TestCase {
     public void testDontSkipEmptyLinesAbsoluteHeader() throws Exception {
         ExcelConfiguration conf = new ExcelConfiguration(6, false, true);
         ExcelDataContext dc = new ExcelDataContext(copyOf("src/test/resources/skipped_lines.xlsx"), conf);
-        Table table = dc.getDefaultSchema().getTables()[0];
-        assertEquals("[hello, world]", Arrays.toString(table.getColumnNames()));
+        Table table = dc.getDefaultSchema().getTables().get(0);
+        assertEquals("[hello, world]", Arrays.toString(table.getColumnNames().toArray()));
         assertEquals(6, table.getColumnByName("hello").getColumnNumber());
         assertEquals(7, table.getColumnByName("world").getColumnNumber());
 
@@ -159,9 +159,9 @@ public class ExcelDataContextTest extends TestCase {
 
     public void testInvalidFormula() throws Exception {
         ExcelDataContext dc = new ExcelDataContext(copyOf("src/test/resources/invalid_formula.xls"));
-        Table table = dc.getDefaultSchema().getTables()[0];
+        Table table = dc.getDefaultSchema().getTables().get(0);
 
-        assertEquals("[name]", Arrays.toString(table.getColumnNames()));
+        assertEquals("[name]", Arrays.toString(table.getColumnNames().toArray()));
 
         Query q = dc.query().from(table).select("name").toQuery();
 
@@ -197,11 +197,11 @@ public class ExcelDataContextTest extends TestCase {
     public void testEvaluateFormula() throws Exception {
         ExcelDataContext dc = new ExcelDataContext(copyOf("src/test/resources/xls_formulas.xls"));
 
-        Table table = dc.getDefaultSchema().getTables()[0];
-        Column[] columns = table.getColumns();
+        Table table = dc.getDefaultSchema().getTables().get(0);
+        Column[] columns = table.getColumns().toArray(new Column[0]);
 
         assertEquals("[some number, some mixed formula, some int only formula]",
-                Arrays.toString(table.getColumnNames()));
+                Arrays.toString(table.getColumnNames().toArray()));
 
         Query q = dc.query().from(table).select(columns).toQuery();
         DataSet ds = dc.executeQuery(q);
@@ -277,7 +277,7 @@ public class ExcelDataContextTest extends TestCase {
 
         assertNotNull(table);
 
-        assertEquals("[A, hello]", Arrays.toString(table.getColumnNames()));
+        assertEquals("[A, hello]", Arrays.toString(table.getColumnNames().toArray()));
 
         Query q = dc.query().from(table).select(table.getColumns()).toQuery();
         DataSet ds = dc.executeQuery(q);
@@ -289,14 +289,14 @@ public class ExcelDataContextTest extends TestCase {
         Schema schema = dc.getDefaultSchema();
         assertEquals("Schema[name=testOpenXlsxFormat-Spreadsheet2007.xlsx]", schema.toString());
 
-        assertEquals("[Sheet1, Sheet2, Sheet3]", Arrays.toString(schema.getTableNames()));
+        assertEquals("[Sheet1, Sheet2, Sheet3]", Arrays.toString(schema.getTableNames().toArray()));
 
         assertEquals(0, schema.getTableByName("Sheet2").getColumnCount());
         assertEquals(0, schema.getTableByName("Sheet3").getColumnCount());
 
         Table table = schema.getTableByName("Sheet1");
 
-        assertEquals("[string, number, date]", Arrays.toString(table.getColumnNames()));
+        assertEquals("[string, number, date]", Arrays.toString(table.getColumnNames().toArray()));
 
         Query q = dc.query().from(table).select(table.getColumns()).orderBy(table.getColumnByName("number")).toQuery();
         DataSet ds = dc.executeQuery(q);
@@ -312,9 +312,9 @@ public class ExcelDataContextTest extends TestCase {
         File file = copyOf("src/test/resources/xls_people.xls");
         DataContext dc = new ExcelDataContext(file, new ExcelConfiguration(ExcelConfiguration.NO_COLUMN_NAME_LINE,
                 true, true));
-        Table table = dc.getDefaultSchema().getTables()[0];
+        Table table = dc.getDefaultSchema().getTables().get(0);
 
-        String[] columnNames = table.getColumnNames();
+        String[] columnNames = table.getColumnNames().toArray(new String[0]);
         assertEquals("[A, B, C, D]", Arrays.toString(columnNames));
 
         Query q = dc.query().from(table).select(table.getColumnByName("A")).toQuery();
@@ -334,9 +334,9 @@ public class ExcelDataContextTest extends TestCase {
     public void testConfigurationNonDefaultColumnNameLineNumber() throws Exception {
         File file = copyOf("src/test/resources/xls_people.xls");
         DataContext dc = new ExcelDataContext(file, new ExcelConfiguration(2, true, true));
-        Table table = dc.getDefaultSchema().getTables()[0];
+        Table table = dc.getDefaultSchema().getTables().get(0);
 
-        String[] columnNames = table.getColumnNames();
+        String[] columnNames = table.getColumnNames().toArray(new String[0]);
         assertEquals("[1, mike, male, 18]", Arrays.toString(columnNames));
 
         Query q = dc.query().from(table).select(table.getColumnByName("1")).toQuery();
@@ -355,18 +355,18 @@ public class ExcelDataContextTest extends TestCase {
     public void testGetSchemas() throws Exception {
         File file = copyOf("src/test/resources/xls_people.xls");
         DataContext dc = new ExcelDataContext(file);
-        Schema[] schemas = dc.getSchemas();
+        Schema[] schemas = dc.getSchemas().toArray(new Schema[0]);
         assertEquals(2, schemas.length);
         Schema schema = schemas[1];
         assertEquals("testGetSchemas-xls_people.xls", schema.getName());
         assertEquals(1, schema.getTableCount());
-        Table table = schema.getTables()[0];
+        Table table = schema.getTables().get(0);
         assertEquals("xls_people", table.getName());
 
         assertEquals(4, table.getColumnCount());
         assertEquals(0, table.getRelationshipCount());
 
-        Column[] columns = table.getColumns();
+        Column[] columns = table.getColumns().toArray(new Column[0]);
         assertEquals("id", columns[0].getName());
         assertEquals("name", columns[1].getName());
         assertEquals("gender", columns[2].getName());
@@ -376,7 +376,7 @@ public class ExcelDataContextTest extends TestCase {
     public void testMaterializeTable() throws Exception {
         File file = copyOf("src/test/resources/xls_people.xls");
         ExcelDataContext dc = new ExcelDataContext(file);
-        Table table = dc.getDefaultSchema().getTables()[0];
+        Table table = dc.getDefaultSchema().getTables().get(0);
         DataSet dataSet = dc.materializeMainSchemaTable(table, table.getColumns(), -1);
         assertTrue(dataSet.next());
         assertEquals("Row[values=[1, mike, male, 18]]", dataSet.getRow().toString());
@@ -401,12 +401,12 @@ public class ExcelDataContextTest extends TestCase {
         Schema schema = dc.getDefaultSchema();
         assertEquals(1, schema.getTableCount());
 
-        Table table = schema.getTables()[0];
+        Table table = schema.getTables().get(0);
         assertEquals("[Column[name=a,columnNumber=0,type=VARCHAR,nullable=true,nativeType=null,columnSize=null], "
                 + "Column[name=b,columnNumber=1,type=VARCHAR,nullable=true,nativeType=null,columnSize=null], "
                 + "Column[name=c,columnNumber=2,type=VARCHAR,nullable=true,nativeType=null,columnSize=null], "
                 + "Column[name=d,columnNumber=3,type=VARCHAR,nullable=true,nativeType=null,columnSize=null]]",
-                Arrays.toString(table.getColumns()));
+                Arrays.toString(table.getColumns().toArray()));
 
         Query q = new Query().select(table.getColumns()).from(table);
         DataSet ds = dc.executeQuery(q);
@@ -425,12 +425,12 @@ public class ExcelDataContextTest extends TestCase {
         Schema schema = dc.getDefaultSchema();
         assertEquals(1, schema.getTableCount());
 
-        Table table = schema.getTables()[0];
+        Table table = schema.getTables().get(0);
         assertEquals("[Column[name=a,columnNumber=0,type=VARCHAR,nullable=true,nativeType=null,columnSize=null], "
                 + "Column[name=b,columnNumber=1,type=VARCHAR,nullable=true,nativeType=null,columnSize=null], "
                 + "Column[name=A,columnNumber=2,type=VARCHAR,nullable=true,nativeType=null,columnSize=null], "
                 + "Column[name=d,columnNumber=3,type=VARCHAR,nullable=true,nativeType=null,columnSize=null]]",
-                Arrays.toString(table.getColumns()));
+                Arrays.toString(table.getColumns().toArray()));
 
         Query q = new Query().select(table.getColumns()).from(table);
         DataSet ds = dc.executeQuery(q);
@@ -447,11 +447,11 @@ public class ExcelDataContextTest extends TestCase {
         File file = copyOf("src/test/resources/formulas.xlsx");
         ExcelDataContext dc = new ExcelDataContext(file);
 
-        assertEquals("[sh1]", Arrays.toString(dc.getDefaultSchema().getTableNames()));
+        assertEquals("[sh1]", Arrays.toString(dc.getDefaultSchema().getTableNames().toArray()));
         assertEquals(XlsxSpreadsheetReaderDelegate.class, dc.getSpreadsheetReaderDelegateClass());
 
         Table table = dc.getDefaultSchema().getTableByName("sh1");
-        assertEquals("[Foo, Bar]", Arrays.toString(table.getColumnNames()));
+        assertEquals("[Foo, Bar]", Arrays.toString(table.getColumnNames().toArray()));
 
         Query q = dc.query().from(table).select("Foo").toQuery();
         DataSet ds = dc.executeQuery(q);
@@ -525,7 +525,7 @@ public class ExcelDataContextTest extends TestCase {
         Schema schema = dc.getDefaultSchema();
         assertEquals(
                 "[Table[name=Sheet1,type=null,remarks=null], Table[name=Sheet2,type=null,remarks=null], Table[name=Sheet3,type=null,remarks=null]]",
-                Arrays.toString(schema.getTables()));
+                Arrays.toString(schema.getTables().toArray()));
 
         assertEquals(0, schema.getTableByName("Sheet2").getColumnCount());
         assertEquals(0, schema.getTableByName("Sheet3").getColumnCount());
@@ -537,14 +537,14 @@ public class ExcelDataContextTest extends TestCase {
                         + "Column[name=Description,columnNumber=1,type=VARCHAR,nullable=true,nativeType=null,columnSize=null], "
                         + "Column[name=Room,columnNumber=2,type=VARCHAR,nullable=true,nativeType=null,columnSize=null], "
                         + "Column[name=Level,columnNumber=3,type=VARCHAR,nullable=true,nativeType=null,columnSize=null]]",
-                Arrays.toString(table.getColumns()));
+                Arrays.toString(table.getColumns().toArray()));
     }
 
     public void testInsertInto() throws Exception {
         final File file = copyOf("src/test/resources/xls_people.xls");
 
         final ExcelDataContext dc = new ExcelDataContext(file);
-        final Table table = dc.getDefaultSchema().getTables()[0];
+        final Table table = dc.getDefaultSchema().getTables().get(0);
         final Column nameColumn = table.getColumnByName("name");
 
         dc.executeUpdate(new UpdateScript() {
@@ -620,13 +620,13 @@ public class ExcelDataContextTest extends TestCase {
 
                 assertEquals(1, schema.getTableCount());
                 assertSame(table1.getSchema(), schema);
-                assertSame(table1, schema.getTables()[0]);
+                assertSame(table1, schema.getTables().get(0));
 
                 Table table2 = cb.createTable(schema, "my_table_2").withColumn("foo").withColumn("bar")
                         .withColumn("baz").execute();
 
                 assertSame(table2.getSchema(), schema);
-                assertSame(table2, schema.getTables()[1]);
+                assertSame(table2, schema.getTables().get(1));
                 assertEquals(2, schema.getTableCount());
 
                 cb.insertInto(table1).value("foo", 123.0).value("bar", "str 1").value("baz", true).execute();
@@ -637,7 +637,7 @@ public class ExcelDataContextTest extends TestCase {
 
         Schema schema = dc.getDefaultSchema();
         assertEquals(2, schema.getTableCount());
-        assertEquals("[my_table_1, my_table_2]", Arrays.toString(schema.getTableNames()));
+        assertEquals("[my_table_1, my_table_2]", Arrays.toString(schema.getTableNames().toArray()));
 
         dc.executeUpdate(new UpdateScript() {
             @Override
@@ -689,18 +689,18 @@ public class ExcelDataContextTest extends TestCase {
             }
         });
 
-        assertEquals("[my_table_2]", Arrays.toString(schema.getTableNames()));
+        assertEquals("[my_table_2]", Arrays.toString(schema.getTableNames().toArray()));
 
         dc.refreshSchemas();
 
-        assertEquals("[my_table_2]", Arrays.toString(dc.getDefaultSchema().getTableNames()));
+        assertEquals("[my_table_2]", Arrays.toString(dc.getDefaultSchema().getTableNames().toArray()));
         assertEquals(1, dc.getDefaultSchema().getTableCount());
     }
 
     public void testGetStyles() throws Exception {
         DataContext dc = new ExcelDataContext(copyOf("src/test/resources/styles.xlsx"));
-        Table table = dc.getDefaultSchema().getTables()[0];
-        assertEquals("[style name, example]", Arrays.toString(table.getColumnNames()));
+        Table table = dc.getDefaultSchema().getTables().get(0);
+        assertEquals("[style name, example]", Arrays.toString(table.getColumnNames().toArray()));
 
         DataSet ds = dc.query().from(table).select(table.getColumns()).execute();
         assertTrue(ds.next());

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/excel/src/test/java/org/apache/metamodel/excel/ExcelUpdateCallbackTest.java
----------------------------------------------------------------------
diff --git a/excel/src/test/java/org/apache/metamodel/excel/ExcelUpdateCallbackTest.java b/excel/src/test/java/org/apache/metamodel/excel/ExcelUpdateCallbackTest.java
index 97101bd..a181248 100644
--- a/excel/src/test/java/org/apache/metamodel/excel/ExcelUpdateCallbackTest.java
+++ b/excel/src/test/java/org/apache/metamodel/excel/ExcelUpdateCallbackTest.java
@@ -84,11 +84,11 @@ public class ExcelUpdateCallbackTest extends TestCase {
 		{
 			ExcelDataContext dc = new ExcelDataContext(file);
 			assertEquals("[foobar]",
-					Arrays.toString(dc.getDefaultSchema().getTableNames()));
+					Arrays.toString(dc.getDefaultSchema().getTableNames().toArray()));
 
 			Table table = dc.getDefaultSchema().getTableByName("foobar");
 
-			assertEquals("[value0]", Arrays.toString(table.getColumnNames()));
+			assertEquals("[value0]", Arrays.toString(table.getColumnNames().toArray()));
 
 			DataSet ds = dc.query().from(table).select("value0").execute();
 			int recordNo = 1;

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/fixedwidth/src/main/java/org/apache/metamodel/fixedwidth/FixedWidthDataContext.java
----------------------------------------------------------------------
diff --git a/fixedwidth/src/main/java/org/apache/metamodel/fixedwidth/FixedWidthDataContext.java b/fixedwidth/src/main/java/org/apache/metamodel/fixedwidth/FixedWidthDataContext.java
index 952c4b5..aac5ada 100644
--- a/fixedwidth/src/main/java/org/apache/metamodel/fixedwidth/FixedWidthDataContext.java
+++ b/fixedwidth/src/main/java/org/apache/metamodel/fixedwidth/FixedWidthDataContext.java
@@ -21,6 +21,7 @@ package org.apache.metamodel.fixedwidth;
 import java.io.BufferedInputStream;
 import java.io.File;
 import java.io.InputStream;
+import java.util.List;
 
 import org.apache.metamodel.MetaModelException;
 import org.apache.metamodel.QueryPostprocessDataContext;
@@ -130,7 +131,7 @@ public class FixedWidthDataContext extends QueryPostprocessDataContext {
     }
 
     @Override
-    public DataSet materializeMainSchemaTable(Table table, Column[] columns, int maxRows) {
+    public DataSet materializeMainSchemaTable(Table table, List<Column> columns, int maxRows) {
         final FixedWidthReader reader = createReader();
         try {
             for (int i = 1; i <= _configuration.getColumnNameLineNumber(); i++) {

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/fixedwidth/src/main/java/org/apache/metamodel/fixedwidth/FixedWidthDataSet.java
----------------------------------------------------------------------
diff --git a/fixedwidth/src/main/java/org/apache/metamodel/fixedwidth/FixedWidthDataSet.java b/fixedwidth/src/main/java/org/apache/metamodel/fixedwidth/FixedWidthDataSet.java
index 4f78bab..ae469c1 100644
--- a/fixedwidth/src/main/java/org/apache/metamodel/fixedwidth/FixedWidthDataSet.java
+++ b/fixedwidth/src/main/java/org/apache/metamodel/fixedwidth/FixedWidthDataSet.java
@@ -21,9 +21,13 @@ package org.apache.metamodel.fixedwidth;
 import org.apache.metamodel.data.AbstractDataSet;
 import org.apache.metamodel.data.DefaultRow;
 import org.apache.metamodel.data.Row;
+import org.apache.metamodel.query.SelectItem;
 import org.apache.metamodel.schema.Column;
 import org.apache.metamodel.util.FileHelper;
 
+import java.util.List;
+import java.util.stream.Collectors;
+
 /**
  * DataSet implementation for fixed width values.
  */
@@ -33,9 +37,9 @@ class FixedWidthDataSet extends AbstractDataSet {
 	private volatile Integer _rowsRemaining;
 	private volatile Row _row;
 
-	public FixedWidthDataSet(FixedWidthReader reader, Column[] columns,
+	public FixedWidthDataSet(FixedWidthReader reader, List<Column> columns,
 			Integer maxRows) {
-		super(columns);
+		super(columns.stream().map(SelectItem::new).collect(Collectors.toList()));
 		_reader = reader;
 		_rowsRemaining = maxRows;
 	}

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/fixedwidth/src/test/java/org/apache/metamodel/fixedwidth/FixedWidthConfigurationReaderTest.java
----------------------------------------------------------------------
diff --git a/fixedwidth/src/test/java/org/apache/metamodel/fixedwidth/FixedWidthConfigurationReaderTest.java b/fixedwidth/src/test/java/org/apache/metamodel/fixedwidth/FixedWidthConfigurationReaderTest.java
index c34b294..61e10d4 100644
--- a/fixedwidth/src/test/java/org/apache/metamodel/fixedwidth/FixedWidthConfigurationReaderTest.java
+++ b/fixedwidth/src/test/java/org/apache/metamodel/fixedwidth/FixedWidthConfigurationReaderTest.java
@@ -69,7 +69,7 @@ public class FixedWidthConfigurationReaderTest {
      */
     private void performAssertionsOnSpec1(FixedWidthDataContext dataContext) {
         final Table table = dataContext.getDefaultSchema().getTable(0);
-        final String[] columnNames = table.getColumnNames();
+        final String[] columnNames = table.getColumnNames().toArray(new String[0]);
         assertEquals("[Record type, Description, Initials]", Arrays.toString(columnNames));
 
         try (final DataSet dataSet = dataContext.query().from(table).selectAll().execute()) {

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/fixedwidth/src/test/java/org/apache/metamodel/fixedwidth/FixedWidthDataContextTest.java
----------------------------------------------------------------------
diff --git a/fixedwidth/src/test/java/org/apache/metamodel/fixedwidth/FixedWidthDataContextTest.java b/fixedwidth/src/test/java/org/apache/metamodel/fixedwidth/FixedWidthDataContextTest.java
index 7a4b75f..16f2c5b 100644
--- a/fixedwidth/src/test/java/org/apache/metamodel/fixedwidth/FixedWidthDataContextTest.java
+++ b/fixedwidth/src/test/java/org/apache/metamodel/fixedwidth/FixedWidthDataContextTest.java
@@ -37,7 +37,7 @@ public class FixedWidthDataContextTest extends TestCase {
                 new FixedWidthConfiguration(10));
         assertEquals(1, dc.getDefaultSchema().getTableCount());
 
-        Table table = dc.getDefaultSchema().getTables()[0];
+        Table table = dc.getDefaultSchema().getTables().get(0);
         assertEquals("empty_file.txt", table.getName());
         assertEquals(0, table.getColumnCount());
     }
@@ -47,7 +47,7 @@ public class FixedWidthDataContextTest extends TestCase {
                 new FixedWidthConfiguration(FixedWidthConfiguration.NO_COLUMN_NAME_LINE, "UTF8", 10));
         assertEquals(1, dc.getDefaultSchema().getTableCount());
 
-        Table table = dc.getDefaultSchema().getTables()[0];
+        Table table = dc.getDefaultSchema().getTables().get(0);
         assertEquals("empty_file.txt", table.getName());
         assertEquals(0, table.getColumnCount());
     }
@@ -57,7 +57,7 @@ public class FixedWidthDataContextTest extends TestCase {
                 new FixedWidthConfiguration(20, "UTF8", 10));
         assertEquals(1, dc.getDefaultSchema().getTableCount());
 
-        Table table = dc.getDefaultSchema().getTables()[0];
+        Table table = dc.getDefaultSchema().getTables().get(0);
         assertEquals("example_simple1.txt", table.getName());
         assertEquals(0, table.getColumnCount());
     }
@@ -66,7 +66,7 @@ public class FixedWidthDataContextTest extends TestCase {
         FixedWidthConfiguration conf = new FixedWidthConfiguration(10);
         FixedWidthDataContext dc = new FixedWidthDataContext(new File("src/test/resources/example_simple1.txt"), conf);
 
-        String[] schemaNames = dc.getSchemaNames();
+        String[] schemaNames = dc.getSchemaNames().toArray(new String[0]);
         assertEquals(2, schemaNames.length);
         assertEquals("[information_schema, resources]", Arrays.toString(schemaNames));
 
@@ -78,7 +78,7 @@ public class FixedWidthDataContextTest extends TestCase {
         Table table = schema.getTableByName("example_simple1.txt");
         assertEquals("Table[name=example_simple1.txt,type=TABLE,remarks=null]", table.toString());
 
-        assertEquals("[greeting, greeter]", Arrays.toString(table.getColumnNames()));
+        assertEquals("[greeting, greeter]", Arrays.toString(table.getColumnNames().toArray()));
         assertEquals(10, table.getColumnByName("greeting").getColumnSize().intValue());
         assertEquals(10, table.getColumnByName("greeter").getColumnSize().intValue());
 
@@ -99,7 +99,7 @@ public class FixedWidthDataContextTest extends TestCase {
                 10, true);
         FixedWidthDataContext dc = new FixedWidthDataContext(new File("src/test/resources/example_simple1.txt"), conf);
 
-        String[] schemaNames = dc.getSchemaNames();
+        String[] schemaNames = dc.getSchemaNames().toArray(new String[0]);
         assertEquals(2, schemaNames.length);
         assertEquals("[information_schema, resources]", Arrays.toString(schemaNames));
 
@@ -111,7 +111,7 @@ public class FixedWidthDataContextTest extends TestCase {
         Table table = schema.getTableByName("example_simple1.txt");
         assertEquals("Table[name=example_simple1.txt,type=TABLE,remarks=null]", table.toString());
 
-        assertEquals("[A, B]", Arrays.toString(table.getColumnNames()));
+        assertEquals("[A, B]", Arrays.toString(table.getColumnNames().toArray()));
 
         Query q = dc.query().from(table).select(table.getColumns()).toQuery();
         DataSet ds = dc.executeQuery(q);
@@ -137,8 +137,8 @@ public class FixedWidthDataContextTest extends TestCase {
     public void testVaryingValueLengthsCorrect() throws Exception {
         DataContext dc = new FixedWidthDataContext(new File("src/test/resources/example_simple2.txt"),
                 new FixedWidthConfiguration(new int[] { 1, 8, 7 }));
-        Table table = dc.getDefaultSchema().getTables()[0];
-        assertEquals("[i, greeting, greeter]", Arrays.toString(table.getColumnNames()));
+        Table table = dc.getDefaultSchema().getTables().get(0);
+        assertEquals("[i, greeting, greeter]", Arrays.toString(table.getColumnNames().toArray()));
 
         assertEquals(1, table.getColumnByName("i").getColumnSize().intValue());
         assertEquals(8, table.getColumnByName("greeting").getColumnSize().intValue());
@@ -174,8 +174,8 @@ public class FixedWidthDataContextTest extends TestCase {
                 new FixedWidthConfiguration(FixedWidthConfiguration.DEFAULT_COLUMN_NAME_LINE, "UTF8", new int[] { 1, 5,
                         7 }, false));
 
-        Table table = dc.getDefaultSchema().getTables()[0];
-        assertEquals("[i, greet, inggree]", Arrays.toString(table.getColumnNames()));
+        Table table = dc.getDefaultSchema().getTables().get(0);
+        assertEquals("[i, greet, inggree]", Arrays.toString(table.getColumnNames().toArray()));
 
         Query q = dc.query().from(table).select(table.getColumns()).toQuery();
         DataSet ds = dc.executeQuery(q);
@@ -208,8 +208,8 @@ public class FixedWidthDataContextTest extends TestCase {
                 new FixedWidthConfiguration(FixedWidthConfiguration.DEFAULT_COLUMN_NAME_LINE, "UTF8", new int[] { 1, 8,
                         9 }, false));
 
-        Table table = dc.getDefaultSchema().getTables()[0];
-        assertEquals("[i, greeting, greeter]", Arrays.toString(table.getColumnNames()));
+        Table table = dc.getDefaultSchema().getTables().get(0);
+        assertEquals("[i, greeting, greeter]", Arrays.toString(table.getColumnNames().toArray()));
 
         Query q = dc.query().from(table).select(table.getColumns()).toQuery();
         DataSet ds = dc.executeQuery(q);

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/hbase/src/main/java/org/apache/metamodel/hbase/HBaseDataContext.java
----------------------------------------------------------------------
diff --git a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseDataContext.java b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseDataContext.java
index e49076e..55e4f41 100644
--- a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseDataContext.java
+++ b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseDataContext.java
@@ -211,7 +211,7 @@ public class HBaseDataContext extends QueryPostprocessDataContext {
     }
 
     @Override
-    protected DataSet materializeMainSchemaTable(Table table, Column[] columns, int maxRows) {
+    protected DataSet materializeMainSchemaTable(Table table, List<Column> columns, int maxRows) {
         final Scan scan = new Scan();
         for (Column column : columns) {
             if (!column.isPrimaryKey()) {

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/hbase/src/main/java/org/apache/metamodel/hbase/HBaseDataSet.java
----------------------------------------------------------------------
diff --git a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseDataSet.java b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseDataSet.java
index a4158d5..c68e6da 100644
--- a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseDataSet.java
+++ b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseDataSet.java
@@ -19,12 +19,15 @@
 package org.apache.metamodel.hbase;
 
 import java.io.IOException;
+import java.util.List;
+import java.util.stream.Collectors;
 
 import org.apache.hadoop.hbase.client.Result;
 import org.apache.hadoop.hbase.client.ResultScanner;
 import org.apache.metamodel.MetaModelException;
 import org.apache.metamodel.data.AbstractDataSet;
 import org.apache.metamodel.data.Row;
+import org.apache.metamodel.query.SelectItem;
 import org.apache.metamodel.schema.Column;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -37,8 +40,8 @@ final class HBaseDataSet extends AbstractDataSet {
     private final org.apache.hadoop.hbase.client.Table _hTable;
     private volatile Result _nextResult;
 
-    public HBaseDataSet(Column[] columns, ResultScanner scanner, org.apache.hadoop.hbase.client.Table hTable) {
-        super(columns);
+    public HBaseDataSet(List<Column> columns, ResultScanner scanner, org.apache.hadoop.hbase.client.Table hTable) {
+        super(columns.stream().map(SelectItem::new).collect(Collectors.toList()));
         _scanner = scanner;
         _hTable = hTable;
     }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/hbase/src/test/java/org/apache/metamodel/hbase/HBaseDataContextTest.java
----------------------------------------------------------------------
diff --git a/hbase/src/test/java/org/apache/metamodel/hbase/HBaseDataContextTest.java b/hbase/src/test/java/org/apache/metamodel/hbase/HBaseDataContextTest.java
index eb0ba48..6187f2c 100644
--- a/hbase/src/test/java/org/apache/metamodel/hbase/HBaseDataContextTest.java
+++ b/hbase/src/test/java/org/apache/metamodel/hbase/HBaseDataContextTest.java
@@ -59,7 +59,7 @@ public class HBaseDataContextTest extends HBaseTestCase {
         final Table table = _dataContext.getDefaultSchema().getTableByName(EXAMPLE_TABLE_NAME);
         assertNotNull(table);
 
-        assertEquals("[_id, bar, foo]", Arrays.toString(table.getColumnNames()));
+        assertEquals("[_id, bar, foo]", Arrays.toString(table.getColumnNames().toArray()));
         assertEquals(ColumnType.MAP, table.getColumn(1).getType());
 
         // insert two records

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcCreateTableBuilder.java
----------------------------------------------------------------------
diff --git a/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcCreateTableBuilder.java b/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcCreateTableBuilder.java
index d20f369..0612b3e 100644
--- a/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcCreateTableBuilder.java
+++ b/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcCreateTableBuilder.java
@@ -21,6 +21,7 @@ package org.apache.metamodel.jdbc;
 import java.sql.Connection;
 import java.sql.SQLException;
 import java.sql.Statement;
+import java.util.List;
 
 import org.apache.metamodel.create.AbstractTableCreationBuilder;
 import org.apache.metamodel.jdbc.dialects.IQueryRewriter;
@@ -84,9 +85,9 @@ final class JdbcCreateTableBuilder extends AbstractTableCreationBuilder<JdbcUpda
         }
         sb.append(getUpdateCallback().quoteIfNescesary(table.getName()));
         sb.append(" (");
-        final Column[] columns = table.getColumns();
-        for (int i = 0; i < columns.length; i++) {
-            final Column column = columns[i];
+        final List<Column> columns = table.getColumns();
+        for (int i = 0; i < columns.size(); i++) {
+            final Column column = columns.get(i);
             if (i != 0) {
                 sb.append(", ");
             }
@@ -114,15 +115,15 @@ final class JdbcCreateTableBuilder extends AbstractTableCreationBuilder<JdbcUpda
             }
         }
         boolean primaryKeyExists = false;
-        for (int i = 0; i < columns.length; i++) {
-            if (columns[i].isPrimaryKey()) {
+        for (int i = 0; i < columns.size(); i++) {
+            if (columns.get(i).isPrimaryKey()) {
                 if (!primaryKeyExists) {
                     sb.append(", PRIMARY KEY(");
-                    sb.append(columns[i].getName());
+                    sb.append(columns.get(i).getName());
                     primaryKeyExists = true;
                 } else {
                     sb.append(",");
-                    sb.append(columns[i].getName());
+                    sb.append(columns.get(i).getName());
                 }
             }
         }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcDataContext.java
----------------------------------------------------------------------
diff --git a/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcDataContext.java b/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcDataContext.java
index 5a9b784..3f4a0ad 100644
--- a/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcDataContext.java
+++ b/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcDataContext.java
@@ -643,12 +643,12 @@ public class JdbcDataContext extends AbstractDataContext implements UpdateableDa
         // databases).
         boolean found = false;
         String result = null;
-        String[] schemaNames = getSchemaNames();
+        List<String> schemaNames = getSchemaNames();
 
         // First strategy: If there's only one schema available, that must
         // be it
-        if (schemaNames.length == 1) {
-            result = schemaNames[0];
+        if (schemaNames.size() == 1) {
+            result = schemaNames.get(0);
             found = true;
         }
 
@@ -669,7 +669,7 @@ public class JdbcDataContext extends AbstractDataContext implements UpdateableDa
                         }
                     }
                     if (url != null && url.length() > 0) {
-                        if (schemaNames.length > 0) {
+                        if (schemaNames.size() > 0) {
                             StringTokenizer st = new StringTokenizer(url, "/\\:");
                             int tokenCount = st.countTokens();
                             if (tokenCount > 0) {
@@ -678,8 +678,8 @@ public class JdbcDataContext extends AbstractDataContext implements UpdateableDa
                                 }
                                 String lastToken = st.nextToken();
 
-                                for (int i = 0; i < schemaNames.length && !found; i++) {
-                                    String schemaName = schemaNames[i];
+                                for (int i = 0; i < schemaNames.size() && !found; i++) {
+                                    String schemaName = schemaNames.get(i);
                                     if (lastToken.indexOf(schemaName) != -1) {
                                         result = schemaName;
                                         found = true;
@@ -701,9 +701,9 @@ public class JdbcDataContext extends AbstractDataContext implements UpdateableDa
                         }
                     }
                     if (username != null) {
-                        for (int i = 0; i < schemaNames.length && !found; i++) {
-                            if (username.equalsIgnoreCase(schemaNames[i])) {
-                                result = schemaNames[i];
+                        for (int i = 0; i < schemaNames.size() && !found; i++) {
+                            if (username.equalsIgnoreCase(schemaNames.get(i))) {
+                                result = schemaNames.get(i);
                                 found = true;
                             }
                         }
@@ -741,7 +741,7 @@ public class JdbcDataContext extends AbstractDataContext implements UpdateableDa
         return result;
     }
 
-    private String findDefaultSchema(final String defaultName, final String[] schemaNames) {
+    private String findDefaultSchema(final String defaultName, final List<String> schemaNames) {
         for (String schemaName : schemaNames) {
             if (defaultName.equals(schemaName)) {
                 return schemaName;
@@ -785,14 +785,14 @@ public class JdbcDataContext extends AbstractDataContext implements UpdateableDa
     }
 
     @Override
-    protected String[] getSchemaNamesInternal() {
+    protected List<String> getSchemaNamesInternal() {
         Connection connection = getConnection();
         try {
             DatabaseMetaData metaData = connection.getMetaData();
-            Collection<String> result = new ArrayList<>();
+            List<String> result = new ArrayList<>();
 
             if (DATABASE_PRODUCT_SQLSERVER.equals(_databaseProductName)) {
-                result = getSchemaSQLServerNames(metaData);
+                result = new ArrayList<>(getSchemaSQLServerNames(metaData));
             } else if (_usesCatalogsAsSchemas) {
                 String[] catalogNames = getCatalogNames();
                 for (String name : catalogNames) {
@@ -818,7 +818,7 @@ public class JdbcDataContext extends AbstractDataContext implements UpdateableDa
                 logger.info("No schemas or catalogs found. Creating unnamed schema.");
                 result.add(null);
             }
-            return result.toArray(new String[result.size()]);
+            return result;
         } catch (SQLException e) {
             throw JdbcUtils.wrapException(e, "get schema names");
         } finally {

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcMetadataLoader.java
----------------------------------------------------------------------
diff --git a/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcMetadataLoader.java b/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcMetadataLoader.java
index 837fb18..49e242b 100644
--- a/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcMetadataLoader.java
+++ b/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcMetadataLoader.java
@@ -398,9 +398,8 @@ final class JdbcMetadataLoader implements MetadataLoader {
                 return;
             }
             try {
-                final Table[] tables = schema.getTables();
                 final DatabaseMetaData metaData = connection.getMetaData();
-                for (Table table : tables) {
+                for (Table table : schema.getTables()) {
                     loadRelations(table, metaData);
                 }
                 _loadedRelations.add(identity);
@@ -453,7 +452,7 @@ final class JdbcMetadataLoader implements MetadataLoader {
                 logger.error("pkColumn={}", pkColumn);
                 logger.error("fkColumn={}", fkColumn);
             } else {
-                MutableRelationship.createRelationship(new Column[] { pkColumn }, new Column[] { fkColumn });
+                MutableRelationship.createRelationship(pkColumn, fkColumn);
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcSchema.java
----------------------------------------------------------------------
diff --git a/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcSchema.java b/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcSchema.java
index 06aa93c..0dc0381 100644
--- a/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcSchema.java
+++ b/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcSchema.java
@@ -59,8 +59,7 @@ final class JdbcSchema extends MutableSchema {
     }
 
     public Schema toSerializableForm() {
-        MutableTable[] tables = getTables();
-        for (MutableTable table : tables) {
+        for (MutableTable table : getMutableTables()) {
             table.getColumns();
             table.getIndexedColumns();
             table.getPrimaryKeys();

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/jdbc/src/main/java/org/apache/metamodel/jdbc/QuerySplitter.java
----------------------------------------------------------------------
diff --git a/jdbc/src/main/java/org/apache/metamodel/jdbc/QuerySplitter.java b/jdbc/src/main/java/org/apache/metamodel/jdbc/QuerySplitter.java
index bbb09c9..07a0db2 100644
--- a/jdbc/src/main/java/org/apache/metamodel/jdbc/QuerySplitter.java
+++ b/jdbc/src/main/java/org/apache/metamodel/jdbc/QuerySplitter.java
@@ -274,9 +274,7 @@ public final class QuerySplitter {
     }
 
     private static void addColumnsToResult(Table table, List<Column> result) {
-        Column[] numberColumns = table.getNumberColumns();
-        for (int i = 0; i < numberColumns.length; i++) {
-            Column column = numberColumns[i];
+        for (Column column: table.getNumberColumns()) {
             if (column.isIndexed()) {
                 // Indexed columns have first priority, they will be
                 // added to the beginning of the list

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/jdbc/src/test/java/org/apache/metamodel/jdbc/DerbyTest.java
----------------------------------------------------------------------
diff --git a/jdbc/src/test/java/org/apache/metamodel/jdbc/DerbyTest.java b/jdbc/src/test/java/org/apache/metamodel/jdbc/DerbyTest.java
index ff6ef22..eb026d8 100644
--- a/jdbc/src/test/java/org/apache/metamodel/jdbc/DerbyTest.java
+++ b/jdbc/src/test/java/org/apache/metamodel/jdbc/DerbyTest.java
@@ -139,7 +139,7 @@ public class DerbyTest extends TestCase {
                 q.toSql());
 
         DataSet dataSet = dc.executeQuery(q);
-        assertEquals("[\"CUSTOMERS\".\"CUSTOMERNUMBER\"]", Arrays.toString(dataSet.getSelectItems()));
+        assertEquals("[\"CUSTOMERS\".\"CUSTOMERNUMBER\"]", Arrays.toString(dataSet.getSelectItems().toArray()));
         assertTrue(dataSet.next());
         assertEquals("Row[values=[114]]", dataSet.getRow().toString());
         assertTrue(dataSet.next());
@@ -152,7 +152,7 @@ public class DerbyTest extends TestCase {
 
     public void testGetSchemaNormalTableTypes() throws Exception {
         DataContext dc = new JdbcDataContext(_connection, new TableType[] { TableType.TABLE, TableType.VIEW }, null);
-        Schema[] schemas = dc.getSchemas();
+        Schema[] schemas = dc.getSchemas().toArray(new Schema[dc.getSchemas().size()]);
 
         assertEquals(11, schemas.length);
         assertEquals("Schema[name=APP]", schemas[0].toString());
@@ -182,7 +182,7 @@ public class DerbyTest extends TestCase {
     public void testGetSchemaAllTableTypes() throws Exception {
         DataContext dc = new JdbcDataContext(_connection,
                 new TableType[] { TableType.OTHER, TableType.GLOBAL_TEMPORARY }, null);
-        Schema[] schemas = dc.getSchemas();
+        Schema[] schemas = dc.getSchemas().toArray(new Schema[dc.getSchemas().size()]);
 
         assertEquals(11, schemas.length);
         assertEquals("Schema[name=APP]", schemas[0].toString());
@@ -194,7 +194,7 @@ public class DerbyTest extends TestCase {
                 + "Table[name=ORDERS,type=TABLE,remarks=], " + "Table[name=PAYMENTS,type=TABLE,remarks=], "
                 + "Table[name=PRODUCTS,type=TABLE,remarks=], " + "Table[name=QUADRANT_ACTUALS,type=TABLE,remarks=], "
                 + "Table[name=TIME,type=TABLE,remarks=], " + "Table[name=TRIAL_BALANCE,type=TABLE,remarks=]]",
-                Arrays.toString(schemas[0].getTables()));
+                Arrays.toString(schemas[0].getTables().toArray()));
         assertEquals("Schema[name=NULLID]", schemas[1].toString());
         assertEquals(0, schemas[1].getTableCount());
         assertEquals("Schema[name=SQLJ]", schemas[2].toString());
@@ -210,7 +210,7 @@ public class DerbyTest extends TestCase {
                 + "Table[name=SYSSCHEMAS,type=OTHER,remarks=], " + "Table[name=SYSSTATEMENTS,type=OTHER,remarks=], "
                 + "Table[name=SYSSTATISTICS,type=OTHER,remarks=], " + "Table[name=SYSTABLEPERMS,type=OTHER,remarks=], "
                 + "Table[name=SYSTABLES,type=OTHER,remarks=], " + "Table[name=SYSTRIGGERS,type=OTHER,remarks=], "
-                + "Table[name=SYSVIEWS,type=OTHER,remarks=]]", Arrays.toString(schemas[3].getTables()));
+                + "Table[name=SYSVIEWS,type=OTHER,remarks=]]", Arrays.toString(schemas[3].getTables().toArray()));
         assertEquals("Schema[name=SYSCAT]", schemas[4].toString());
         assertEquals(0, schemas[4].getTableCount());
         assertEquals("Schema[name=SYSCS_DIAG]", schemas[5].toString());
@@ -221,7 +221,7 @@ public class DerbyTest extends TestCase {
         assertEquals(0, schemas[7].getTableCount());
         assertEquals("Schema[name=SYSIBM]", schemas[8].toString());
         assertEquals(1, schemas[8].getTableCount());
-        assertEquals("[Table[name=SYSDUMMY1,type=OTHER,remarks=]]", Arrays.toString(schemas[8].getTables()));
+        assertEquals("[Table[name=SYSDUMMY1,type=OTHER,remarks=]]", Arrays.toString(schemas[8].getTables().toArray()));
         assertEquals("Schema[name=SYSPROC]", schemas[9].toString());
         assertEquals(0, schemas[9].getTableCount());
         assertEquals("Schema[name=SYSSTAT]", schemas[10].toString());
@@ -241,7 +241,7 @@ public class DerbyTest extends TestCase {
                         + "Column[name=COUNTRY,columnNumber=10,type=VARCHAR,nullable=true,nativeType=VARCHAR,columnSize=255], "
                         + "Column[name=SALESREPEMPLOYEENUMBER,columnNumber=11,type=INTEGER,nullable=true,nativeType=INTEGER,columnSize=10], "
                         + "Column[name=CREDITLIMIT,columnNumber=12,type=BIGINT,nullable=true,nativeType=BIGINT,columnSize=19]]",
-                Arrays.toString(schemas[0].getTableByName("CUSTOMERS").getColumns()));
+                Arrays.toString(schemas[0].getTableByName("CUSTOMERS").getColumns().toArray()));
     }
 
     public void testQueryRewriterQuoteAliases() throws Exception {
@@ -328,7 +328,7 @@ public class DerbyTest extends TestCase {
             assertSame(conn, dc.getConnection());
 
             final Table readTable = dc.getDefaultSchema().getTableByName("test_table");
-            assertEquals("[ID, NAME, AGE]", Arrays.toString(readTable.getColumnNames()));
+            assertEquals("[ID, NAME, AGE]", Arrays.toString(readTable.getColumnNames().toArray()));
             assertTrue(readTable.getColumnByName("id").isPrimaryKey());
             assertFalse(readTable.getColumnByName("age").isPrimaryKey());
             assertFalse(readTable.getColumnByName("name").isPrimaryKey());

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/jdbc/src/test/java/org/apache/metamodel/jdbc/H2databaseTest.java
----------------------------------------------------------------------
diff --git a/jdbc/src/test/java/org/apache/metamodel/jdbc/H2databaseTest.java b/jdbc/src/test/java/org/apache/metamodel/jdbc/H2databaseTest.java
index 6e21ae5..e7b5386 100644
--- a/jdbc/src/test/java/org/apache/metamodel/jdbc/H2databaseTest.java
+++ b/jdbc/src/test/java/org/apache/metamodel/jdbc/H2databaseTest.java
@@ -143,16 +143,16 @@ public class H2databaseTest extends TestCase {
         }
 
         JdbcDataContext dc = new JdbcDataContext(conn);
-        assertEquals("[INFORMATION_SCHEMA, PUBLIC]", Arrays.toString(dc.getSchemaNames()));
+        assertEquals("[INFORMATION_SCHEMA, PUBLIC]", Arrays.toString(dc.getSchemaNames().toArray()));
 
         Schema schema = dc.getDefaultSchema();
         assertEquals("PUBLIC", schema.getName());
 
-        assertEquals("[TEST_TABLE]", Arrays.toString(schema.getTableNames()));
+        assertEquals("[TEST_TABLE]", Arrays.toString(schema.getTableNames().toArray()));
 
         Table table = schema.getTableByName("test_table");
 
-        assertEquals("[ID, NAME, AGE]", Arrays.toString(table.getColumnNames()));
+        assertEquals("[ID, NAME, AGE]", Arrays.toString(table.getColumnNames().toArray()));
 
         Column idColumn = table.getColumnByName("ID");
         assertEquals("Column[name=ID,columnNumber=0,type=INTEGER,nullable=false,nativeType=INTEGER,columnSize=10]",
@@ -283,18 +283,18 @@ public class H2databaseTest extends TestCase {
                 String sql = createTableBuilder.createSqlStatement();
                 assertEquals("CREATE TABLE PUBLIC.test_table (id INTEGER, name VARCHAR(255), age INTEGER, PRIMARY KEY(id))", sql);
                 assertNotNull(writtenTable);
-                assertEquals("[ID, NAME, AGE]", Arrays.toString(writtenTable.getColumnNames()));
+                assertEquals("[ID, NAME, AGE]", Arrays.toString(writtenTable.getColumnNames().toArray()));
 
                 writtenTableRef.set(writtenTable);
             }
         });
 
-        assertEquals("[TEST_TABLE]", Arrays.toString(dc.getDefaultSchema().getTableNames()));
+        assertEquals("[TEST_TABLE]", Arrays.toString(dc.getDefaultSchema().getTableNames().toArray()));
 
         readTable = dc.getDefaultSchema().getTableByName("test_table");
-        assertEquals("[ID, NAME, AGE]", Arrays.toString(readTable.getColumnNames()));
+        assertEquals("[ID, NAME, AGE]", Arrays.toString(readTable.getColumnNames().toArray()));
         assertEquals("[Column[name=ID,columnNumber=0,type=INTEGER,nullable=false,nativeType=INTEGER,columnSize=10]]",
-                Arrays.toString(readTable.getPrimaryKeys()));
+                Arrays.toString(readTable.getPrimaryKeys().toArray()));
         assertEquals(writtenTableRef.get(), readTable);
 
         assertFalse(conn.isReadOnly());
@@ -303,7 +303,7 @@ public class H2databaseTest extends TestCase {
         assertSame(conn, dc.getConnection());
 
         readTable = dc.getDefaultSchema().getTableByName("test_table");
-        assertEquals("[ID, NAME, AGE]", Arrays.toString(readTable.getColumnNames()));
+        assertEquals("[ID, NAME, AGE]", Arrays.toString(readTable.getColumnNames().toArray()));
         assertTrue(writtenTableRef.get().getQualifiedLabel().equalsIgnoreCase(readTable.getQualifiedLabel()));
 
         dc.executeUpdate(new UpdateScript() {
@@ -362,7 +362,7 @@ public class H2databaseTest extends TestCase {
         assertFalse(ds.next());
         ds.close();
 
-        assertEquals("[TEST_TABLE]", Arrays.toString(dc.getDefaultSchema().getTableNames()));
+        assertEquals("[TEST_TABLE]", Arrays.toString(dc.getDefaultSchema().getTableNames().toArray()));
 
         dc.executeUpdate(new UpdateScript() {
             @Override
@@ -371,7 +371,7 @@ public class H2databaseTest extends TestCase {
             }
         });
 
-        assertEquals("[]", Arrays.toString(dc.getDefaultSchema().getTableNames()));
+        assertEquals("[]", Arrays.toString(dc.getDefaultSchema().getTableNames().toArray()));
     }
 
     public void testSelectItemsThatReferencesDifferentFromItems() throws Exception {

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/jdbc/src/test/java/org/apache/metamodel/jdbc/HsqldbTest.java
----------------------------------------------------------------------
diff --git a/jdbc/src/test/java/org/apache/metamodel/jdbc/HsqldbTest.java b/jdbc/src/test/java/org/apache/metamodel/jdbc/HsqldbTest.java
index 12d5fe2..bf64fdd 100644
--- a/jdbc/src/test/java/org/apache/metamodel/jdbc/HsqldbTest.java
+++ b/jdbc/src/test/java/org/apache/metamodel/jdbc/HsqldbTest.java
@@ -100,12 +100,12 @@ public class HsqldbTest extends TestCase {
     public void testGetSchemas() throws Exception {
         assertNotNull(_connection);
         JdbcDataContext dc = new JdbcDataContext(_connection);
-        assertEquals("[Schema[name=INFORMATION_SCHEMA], " + "Schema[name=PUBLIC]]", Arrays.toString(dc.getSchemas()));
+        assertEquals("[Schema[name=INFORMATION_SCHEMA], " + "Schema[name=PUBLIC]]", Arrays.toString(dc.getSchemas().toArray()));
 
         Schema defaultSchema = dc.getDefaultSchema();
         Schema publicSchema = dc.getSchemaByName("PUBLIC");
         assertSame(defaultSchema, publicSchema);
-        Table[] tables = publicSchema.getTables();
+        Table[] tables = publicSchema.getTables().toArray(new Table[publicSchema.getTables().size()]);
         assertEquals(13, tables.length);
         assertEquals("[Table[name=CUSTOMERS,type=TABLE,remarks=null], "
                 + "Table[name=CUSTOMER_W_TER,type=TABLE,remarks=null], "
@@ -128,16 +128,16 @@ public class HsqldbTest extends TestCase {
                         + "Column[name=OFFICECODE,columnNumber=5,type=VARCHAR,nullable=false,nativeType=VARCHAR,columnSize=20], "
                         + "Column[name=REPORTSTO,columnNumber=6,type=INTEGER,nullable=true,nativeType=INTEGER,columnSize=0], "
                         + "Column[name=JOBTITLE,columnNumber=7,type=VARCHAR,nullable=false,nativeType=VARCHAR,columnSize=50]]",
-                Arrays.toString(empTable.getColumns()));
+                Arrays.toString(empTable.getColumns().toArray()));
 
         assertEquals(
                 "[Column[name=EMPLOYEENUMBER,columnNumber=0,type=INTEGER,nullable=false,nativeType=INTEGER,columnSize=0]]",
-                Arrays.toString(empTable.getPrimaryKeys()));
+                Arrays.toString(empTable.getPrimaryKeys().toArray()));
 
         // Only a single relationship registered in the database
         assertEquals(
                 "[Relationship[primaryTable=PRODUCTS,primaryColumns=[PRODUCTCODE],foreignTable=ORDERFACT,foreignColumns=[PRODUCTCODE]]]",
-                Arrays.toString(publicSchema.getRelationships()));
+                Arrays.toString(publicSchema.getRelationships().toArray()));
     }
 
     public void testExecuteQuery() throws Exception {
@@ -146,8 +146,8 @@ public class HsqldbTest extends TestCase {
         Table productsTable = schema.getTableByName("PRODUCTS");
         Table factTable = schema.getTableByName("ORDERFACT");
 
-        Query q = new Query().from(new FromItem(JoinType.INNER, productsTable.getRelationships(factTable)[0])).select(
-                productsTable.getColumns()[0], factTable.getColumns()[0]);
+        Query q = new Query().from(new FromItem(JoinType.INNER, productsTable.getRelationships(factTable).iterator().next())).select(
+                productsTable.getColumns().get(0), factTable.getColumns().get(0));
         assertEquals(
                 "SELECT \"PRODUCTS\".\"PRODUCTCODE\", \"ORDERFACT\".\"ORDERNUMBER\" FROM PUBLIC.\"PRODUCTS\" INNER JOIN PUBLIC.\"ORDERFACT\" ON \"PRODUCTS\".\"PRODUCTCODE\" = \"ORDERFACT\".\"PRODUCTCODE\"",
                 q.toString());

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcDataContextTest.java
----------------------------------------------------------------------
diff --git a/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcDataContextTest.java b/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcDataContextTest.java
index 17b86fa..c0f1b4e 100644
--- a/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcDataContextTest.java
+++ b/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcDataContextTest.java
@@ -79,7 +79,7 @@ public class JdbcDataContextTest extends JdbcTestCase {
     public void testQueryMaxRows0() throws Exception {
         final Connection con = getTestDbConnection();
         final DataContext dc = new JdbcDataContext(con);
-        final Table table = dc.getDefaultSchema().getTables()[0];
+        final Table table = dc.getDefaultSchema().getTables().get(0);
         final DataSet dataSet = dc.query().from(table).selectAll().limit(0).execute();
         assertTrue(dataSet instanceof EmptyDataSet);
         assertFalse(dataSet.next());
@@ -142,7 +142,7 @@ public class JdbcDataContextTest extends JdbcTestCase {
         Schema schema = strategy.getSchemaByName(strategy.getDefaultSchemaName());
 
         Query q = new Query();
-        Table table = schema.getTables()[0];
+        Table table = schema.getTables().get(0);
         q.from(table, "a");
         q.select(table.getColumns());
         assertEquals(
@@ -174,7 +174,7 @@ public class JdbcDataContextTest extends JdbcTestCase {
         QueryParameter queryParameter = new QueryParameter();
 
         Query q = new Query();
-        Table table = schema.getTables()[0];
+        Table table = schema.getTables().get(0);
         q.select(table.getColumns());
         q.from(table, "a");
         q.where(table.getColumnByName("CUSTOMERNUMBER"), OperatorType.EQUALS_TO, queryParameter);
@@ -232,7 +232,7 @@ public class JdbcDataContextTest extends JdbcTestCase {
                 .select(FunctionType.TO_DATE, "creditlimit").select("creditlimit").limit(2).execute();
         try {
             assertEquals("[_CUSTOMERS_._CREDITLIMIT_, TO_DATE(_CUSTOMERS_._CREDITLIMIT_), _CUSTOMERS_._CREDITLIMIT_]",
-                    Arrays.toString(dataSet.getSelectItems()).replaceAll("\"", "_"));
+                    Arrays.toString(dataSet.getSelectItems().toArray()).replaceAll("\"", "_"));
 
             assertTrue(dataSet.next());
             final Object value0 = dataSet.getRow().getValue(0);
@@ -282,7 +282,7 @@ public class JdbcDataContextTest extends JdbcTestCase {
         QueryParameter queryParameter = new QueryParameter();
 
         Query q = new Query();
-        Table table = schema.getTables()[0];
+        Table table = schema.getTables().get(0);
         q.select(new SelectItem("COUNT(*)", null));
         q.from(table, "a");
         q.where(table.getColumnByName("CREDITLIMIT"), OperatorType.GREATER_THAN_OR_EQUAL, queryParameter);
@@ -338,7 +338,7 @@ public class JdbcDataContextTest extends JdbcTestCase {
         QueryParameter queryParameter = new QueryParameter();
 
         Query q = new Query();
-        Table table = schema.getTables()[0];
+        Table table = schema.getTables().get(0);
         q.select(new SelectItem("COUNT(*)", null));
         q.from(table, "a");
         q.where(table.getColumnByName("CREDITLIMIT"), OperatorType.LESS_THAN_OR_EQUAL, queryParameter);
@@ -388,7 +388,7 @@ public class JdbcDataContextTest extends JdbcTestCase {
     public void testGetSchemaNormalTableTypes() throws Exception {
         Connection connection = getTestDbConnection();
         JdbcDataContext dc = new JdbcDataContext(connection, new TableType[] { TableType.TABLE, TableType.VIEW }, null);
-        Schema[] schemas = dc.getSchemas();
+        Schema[] schemas = dc.getSchemas().toArray(new Schema[dc.getSchemas().size()]);
 
         assertEquals(2, schemas.length);
         assertEquals("Schema[name=INFORMATION_SCHEMA]", schemas[0].toString());
@@ -405,7 +405,6 @@ public class JdbcDataContextTest extends JdbcTestCase {
                 TableType.GLOBAL_TEMPORARY }, null);
         Schema schema = dc.getDefaultSchema();
         Table customersTable = schema.getTableByName("CUSTOMERS");
-        Column[] columns = customersTable.getColumns();
         assertEquals(
                 "[Column[name=CUSTOMERNUMBER,columnNumber=0,type=INTEGER,nullable=false,nativeType=INTEGER,columnSize=0], "
                         + "Column[name=CUSTOMERNAME,columnNumber=1,type=VARCHAR,nullable=false,nativeType=VARCHAR,columnSize=50], "
@@ -423,7 +422,7 @@ public class JdbcDataContextTest extends JdbcTestCase {
                         + "Column[name=SALESREPEMPLOYEENUMBER,columnNumber=11,type=INTEGER,nullable=true,nativeType=INTEGER,"
                         + "columnSize=0], "
                         + "Column[name=CREDITLIMIT,columnNumber=12,type=NUMERIC,nullable=true,nativeType=NUMERIC,columnSize=17]]",
-                Arrays.toString(columns));
+                Arrays.toString(customersTable.getColumns().toArray()));
         connection.close();
     }
 
@@ -432,18 +431,16 @@ public class JdbcDataContextTest extends JdbcTestCase {
         JdbcDataContext dc = new JdbcDataContext(connection, new TableType[] { TableType.TABLE }, null);
         Schema schema = dc.getDefaultSchema();
         Table productsTable = schema.getTableByName("PRODUCTS");
-        Relationship[] relations = productsTable.getRelationships();
 
         /**
          * TODO: A single constraint now exists, create more ...
          */
         assertEquals("[Relationship[primaryTable=PRODUCTS,primaryColumns=[PRODUCTCODE],foreignTable=ORDERFACT,"
-                + "foreignColumns=[PRODUCTCODE]]]", Arrays.toString(relations));
+                + "foreignColumns=[PRODUCTCODE]]]", Arrays.toString(productsTable.getRelationships().toArray()));
 
-        Column[] indexedColumns = productsTable.getIndexedColumns();
         assertEquals(
                 "[Column[name=PRODUCTCODE,columnNumber=0,type=VARCHAR,nullable=false,nativeType=VARCHAR,columnSize=50]]",
-                Arrays.toString(indexedColumns));
+                Arrays.toString(productsTable.getIndexedColumns().toArray()));
 
         connection.close();
     }
@@ -494,7 +491,7 @@ public class JdbcDataContextTest extends JdbcTestCase {
         Schema schema = dc.getDefaultSchema();
 
         Query q = new Query().setMaxRows(3);
-        Table table = schema.getTables()[0];
+        Table table = schema.getTables().get(0);
         q.from(table, "a");
         q.select(table.getColumns());
         assertEquals("SELECT a.\"CUSTOMERNUMBER\", a.\"CUSTOMERNAME\", a.\"CONTACTLASTNAME\", a.\"CONTACTFIRSTNAME\", "
@@ -540,7 +537,7 @@ public class JdbcDataContextTest extends JdbcTestCase {
         final DataContext dataContext1 = new JdbcDataContext(connection);
         final DataContext dataContext2 = new QueryPostprocessDataContext() {
             @Override
-            public DataSet materializeMainSchemaTable(Table table, Column[] columns, int maxRows) {
+            public DataSet materializeMainSchemaTable(Table table, List<Column> columns, int maxRows) {
                 Query q = new Query();
                 q.from(table, "a");
                 q.select(columns);
@@ -578,7 +575,7 @@ public class JdbcDataContextTest extends JdbcTestCase {
                         + "Column[name=SALESREPEMPLOYEENUMBER,columnNumber=11,type=INTEGER,nullable=true,nativeType=INTEGER,"
                         + "columnSize=0], "
                         + "Column[name=CREDITLIMIT,columnNumber=12,type=NUMERIC,nullable=true,nativeType=NUMERIC,columnSize=17]]",
-                Arrays.toString(customersTable.getColumns()));
+                Arrays.toString(customersTable.getColumns().toArray()));
         assertEquals(
                 "[Column[name=EMPLOYEENUMBER,columnNumber=0,type=INTEGER,nullable=false,nativeType=INTEGER,columnSize=0], "
                         + "Column[name=LASTNAME,columnNumber=1,type=VARCHAR,nullable=false,nativeType=VARCHAR,columnSize=50], "
@@ -588,7 +585,7 @@ public class JdbcDataContextTest extends JdbcTestCase {
                         + "Column[name=OFFICECODE,columnNumber=5,type=VARCHAR,nullable=false,nativeType=VARCHAR,columnSize=20], "
                         + "Column[name=REPORTSTO,columnNumber=6,type=INTEGER,nullable=true,nativeType=INTEGER,columnSize=0], "
                         + "Column[name=JOBTITLE,columnNumber=7,type=VARCHAR,nullable=false,nativeType=VARCHAR,columnSize=50]]",
-                Arrays.toString(employeeTable.getColumns()));
+                Arrays.toString(employeeTable.getColumns().toArray()));
 
         Column employeeNumberColumn1 = customersTable.getColumnByName("SALESREPEMPLOYEENUMBER");
         Column countryColumn = customersTable.getColumnByName("COUNTRY");

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcDeleteBuilderTest.java
----------------------------------------------------------------------
diff --git a/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcDeleteBuilderTest.java b/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcDeleteBuilderTest.java
index dbade6a..fa1b064 100644
--- a/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcDeleteBuilderTest.java
+++ b/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcDeleteBuilderTest.java
@@ -50,7 +50,7 @@ public class JdbcDeleteBuilderTest extends JdbcTestCase {
                 dataContext), true);
 
         assertEquals("[EMPLOYEENUMBER, LASTNAME, FIRSTNAME, EXTENSION, EMAIL, OFFICECODE, REPORTSTO, JOBTITLE]",
-                Arrays.toString(table.getColumnNames()));
+                Arrays.toString(table.getColumnNames().toArray()));
 
         updateBuilder.where("firstname").isNull().where("lastname").isNotNull();
         assertEquals(
@@ -64,7 +64,7 @@ public class JdbcDeleteBuilderTest extends JdbcTestCase {
         JdbcUpdateCallback updateCallback = new JdbcSimpleUpdateCallback(dataContext);
 
         assertEquals("[EMPLOYEENUMBER, LASTNAME, FIRSTNAME, EXTENSION, EMAIL, OFFICECODE, REPORTSTO, JOBTITLE]",
-                Arrays.toString(table.getColumnNames()));
+                Arrays.toString(table.getColumnNames().toArray()));
 
         JdbcDeleteBuilder updateBuilder = new JdbcDeleteBuilder(updateCallback, table, new DefaultQueryRewriter(
                 dataContext), false);

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcInsertBuilderTest.java
----------------------------------------------------------------------
diff --git a/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcInsertBuilderTest.java b/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcInsertBuilderTest.java
index 8b56e05..2a29943 100644
--- a/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcInsertBuilderTest.java
+++ b/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcInsertBuilderTest.java
@@ -33,7 +33,7 @@ public class JdbcInsertBuilderTest extends JdbcTestCase {
 				new DefaultQueryRewriter(dataContext));
 
 		assertEquals("[EMPLOYEENUMBER, LASTNAME, FIRSTNAME, EXTENSION, EMAIL, OFFICECODE, REPORTSTO, JOBTITLE]",
-				Arrays.toString(table.getColumnNames()));
+				Arrays.toString(table.getColumnNames().toArray()));
 
 		insertBuilder.value("LASTNAME", "foo").value("firstname", "BAR");
 		assertEquals("INSERT INTO PUBLIC._EMPLOYEES_ (LASTNAME,FIRSTNAME) VALUES ('foo','BAR')", insertBuilder.createSqlStatement()
@@ -53,7 +53,7 @@ public class JdbcInsertBuilderTest extends JdbcTestCase {
 				new DefaultQueryRewriter(dataContext));
 
 		assertEquals("[EMPLOYEENUMBER, LASTNAME, FIRSTNAME, EXTENSION, EMAIL, OFFICECODE, REPORTSTO, JOBTITLE]",
-				Arrays.toString(table.getColumnNames()));
+				Arrays.toString(table.getColumnNames().toArray()));
 
 		insertBuilder.value("LASTNAME", "foo").value("firstname", null);
 		assertEquals("INSERT INTO PUBLIC._EMPLOYEES_ (LASTNAME,FIRSTNAME) VALUES ('foo',NULL)", insertBuilder.createSqlStatement()
@@ -68,7 +68,7 @@ public class JdbcInsertBuilderTest extends JdbcTestCase {
 				new DefaultQueryRewriter(dataContext));
 
 		assertEquals("[EMPLOYEENUMBER, LASTNAME, FIRSTNAME, EXTENSION, EMAIL, OFFICECODE, REPORTSTO, JOBTITLE]",
-				Arrays.toString(table.getColumnNames()));
+				Arrays.toString(table.getColumnNames().toArray()));
 
 		insertBuilder.value("LASTNAME", "foo").value("firstname", "BAR");
 		assertEquals("INSERT INTO PUBLIC._EMPLOYEES_ (LASTNAME,FIRSTNAME) VALUES ('foo','BAR')", insertBuilder.createSqlStatement()

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcSchemaTest.java
----------------------------------------------------------------------
diff --git a/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcSchemaTest.java b/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcSchemaTest.java
index 020b37d..8654679 100644
--- a/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcSchemaTest.java
+++ b/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcSchemaTest.java
@@ -54,7 +54,7 @@ public class JdbcSchemaTest extends JdbcTestCase {
 
 		assertEquals(
 				"[CUSTOMERS, CUSTOMER_W_TER, DEPARTMENT_MANAGERS, DIM_TIME, EMPLOYEES, OFFICES, ORDERDETAILS, ORDERFACT, ORDERS, PAYMENTS, PRODUCTS, QUADRANT_ACTUALS, TRIAL_BALANCE]",
-				Arrays.toString(schema.getTableNames()));
+				Arrays.toString(schema.getTableNames().toArray()));
 
 		connection.close();
 		dataContext = null;
@@ -72,14 +72,14 @@ public class JdbcSchemaTest extends JdbcTestCase {
 
 		assertEquals(
 				"[CUSTOMERS, CUSTOMER_W_TER, DEPARTMENT_MANAGERS, DIM_TIME, EMPLOYEES, OFFICES, ORDERDETAILS, ORDERFACT, ORDERS, PAYMENTS, PRODUCTS, QUADRANT_ACTUALS, TRIAL_BALANCE]",
-				Arrays.toString(schema.getTableNames()));
+				Arrays.toString(schema.getTableNames().toArray()));
 
 		Table table = schema.getTableByName("CUSTOMERS");
 		assertTrue(table instanceof JdbcTable);
 		assertNotNull(table);
 		assertEquals(
 				"[CUSTOMERNUMBER, CUSTOMERNAME, CONTACTLASTNAME, CONTACTFIRSTNAME, PHONE, ADDRESSLINE1, ADDRESSLINE2, CITY, STATE, POSTALCODE, COUNTRY, SALESREPEMPLOYEENUMBER, CREDITLIMIT]",
-				Arrays.toString(table.getColumnNames()));
+				Arrays.toString(table.getColumnNames().toArray()));
 	}
 
 	public void testToSerializableForm() throws Exception {
@@ -92,10 +92,10 @@ public class JdbcSchemaTest extends JdbcTestCase {
 		Table table = schema.getTableByName("CUSTOMERS");
 		assertEquals(
 				"[CUSTOMERNUMBER, CUSTOMERNAME, CONTACTLASTNAME, CONTACTFIRSTNAME, PHONE, ADDRESSLINE1, ADDRESSLINE2, CITY, STATE, POSTALCODE, COUNTRY, SALESREPEMPLOYEENUMBER, CREDITLIMIT]",
-				Arrays.toString(table.getColumnNames()));
+				Arrays.toString(table.getColumnNames().toArray()));
 
 		assertEquals(
 				"[Relationship[primaryTable=PRODUCTS,primaryColumns=[PRODUCTCODE],foreignTable=ORDERFACT,foreignColumns=[PRODUCTCODE]]]",
-				Arrays.toString(schema.getRelationships()));
+				Arrays.toString(schema.getRelationships().toArray()));
 	}
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcTestTemplates.java
----------------------------------------------------------------------
diff --git a/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcTestTemplates.java b/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcTestTemplates.java
index 0f6d82d..aca3780 100644
--- a/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcTestTemplates.java
+++ b/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcTestTemplates.java
@@ -626,7 +626,7 @@ public class JdbcTestTemplates {
             final Table table = defaultSchema.getTableByName(testTableName);
             assertNotNull(table);
 
-            Column[] primaryKeys = table.getPrimaryKeys();
+            Column[] primaryKeys = table.getPrimaryKeys().toArray(new Column[table.getPrimaryKeys().size()]);
             assertEquals(2, primaryKeys.length);
             assertEquals("mykey1", primaryKeys[0].getName().toLowerCase());
             assertEquals("mykey2", primaryKeys[1].getName().toLowerCase());

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcUpdateBuilderTest.java
----------------------------------------------------------------------
diff --git a/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcUpdateBuilderTest.java b/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcUpdateBuilderTest.java
index f44c77b..3c338ff 100644
--- a/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcUpdateBuilderTest.java
+++ b/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcUpdateBuilderTest.java
@@ -33,7 +33,7 @@ public class JdbcUpdateBuilderTest extends JdbcTestCase {
                 dataContext), true);
 
         assertEquals("[EMPLOYEENUMBER, LASTNAME, FIRSTNAME, EXTENSION, EMAIL, OFFICECODE, REPORTSTO, JOBTITLE]",
-                Arrays.toString(table.getColumnNames()));
+                Arrays.toString(table.getColumnNames().toArray()));
 
         updateBuilder.value("LASTNAME", "foo").value("firstname", "BAR");
         assertEquals("UPDATE PUBLIC._EMPLOYEES_ SET LASTNAME='foo',FIRSTNAME='BAR'", updateBuilder.createSqlStatement()
@@ -58,7 +58,7 @@ public class JdbcUpdateBuilderTest extends JdbcTestCase {
                 dataContext), true);
 
         assertEquals("[EMPLOYEENUMBER, LASTNAME, FIRSTNAME, EXTENSION, EMAIL, OFFICECODE, REPORTSTO, JOBTITLE]",
-                Arrays.toString(table.getColumnNames()));
+                Arrays.toString(table.getColumnNames().toArray()));
 
         updateBuilder.value("LASTNAME", "foo").value("firstname", null);
         assertEquals("UPDATE PUBLIC._EMPLOYEES_ SET LASTNAME='foo',FIRSTNAME=NULL", updateBuilder.createSqlStatement()
@@ -71,7 +71,7 @@ public class JdbcUpdateBuilderTest extends JdbcTestCase {
         JdbcUpdateCallback updateCallback = new JdbcSimpleUpdateCallback(dataContext);
 
         assertEquals("[EMPLOYEENUMBER, LASTNAME, FIRSTNAME, EXTENSION, EMAIL, OFFICECODE, REPORTSTO, JOBTITLE]",
-                Arrays.toString(table.getColumnNames()));
+                Arrays.toString(table.getColumnNames().toArray()));
 
         JdbcUpdateBuilder updateBuilder = new JdbcUpdateBuilder(updateCallback, table, new DefaultQueryRewriter(
                 dataContext), false);
@@ -89,7 +89,7 @@ public class JdbcUpdateBuilderTest extends JdbcTestCase {
                 dataContext), true);
 
         assertEquals("[EMPLOYEENUMBER, LASTNAME, FIRSTNAME, EXTENSION, EMAIL, OFFICECODE, REPORTSTO, JOBTITLE]",
-                Arrays.toString(table.getColumnNames()));
+                Arrays.toString(table.getColumnNames().toArray()));
 
         updateBuilder.value("LASTNAME", "foo").value("firstname", "BAR");
         assertEquals("UPDATE PUBLIC._EMPLOYEES_ SET LASTNAME='foo',FIRSTNAME='BAR'", updateBuilder.createSqlStatement()


[11/20] metamodel git commit: removed unnecessary braces

Posted by ka...@apache.org.
removed unnecessary braces


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

Branch: refs/heads/master
Commit: 5a9d2d146cd659b7284a65d617d7362b1ce7a5bc
Parents: 44571b9
Author: Jörg Unbehauen <jo...@unbehauen.net>
Authored: Fri Jul 28 14:15:53 2017 +0200
Committer: Jörg Unbehauen <jo...@unbehauen.net>
Committed: Fri Jul 28 14:15:53 2017 +0200

----------------------------------------------------------------------
 core/src/main/java/org/apache/metamodel/convert/Converters.java | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/metamodel/blob/5a9d2d14/core/src/main/java/org/apache/metamodel/convert/Converters.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/convert/Converters.java b/core/src/main/java/org/apache/metamodel/convert/Converters.java
index 142987e..97b4e65 100644
--- a/core/src/main/java/org/apache/metamodel/convert/Converters.java
+++ b/core/src/main/java/org/apache/metamodel/convert/Converters.java
@@ -144,9 +144,8 @@ public final class Converters {
                 // group by table
                 .collect(Collectors.toMap(Column::getTable,Arrays::asList))
                 //and detect it
-                .forEach((tab, cols) ->{
-                    autoDetectConvertersInternally(dataContext,tab,cols,sampleSize,result);
-        });
+                .forEach((tab, cols) ->
+                    autoDetectConvertersInternally(dataContext,tab,cols,sampleSize,result));
 
         return result;
     }


[04/20] metamodel git commit: now all compiling

Posted by ka...@apache.org.
http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/pojo/src/test/java/org/apache/metamodel/pojo/PojoDataContextTest.java
----------------------------------------------------------------------
diff --git a/pojo/src/test/java/org/apache/metamodel/pojo/PojoDataContextTest.java b/pojo/src/test/java/org/apache/metamodel/pojo/PojoDataContextTest.java
index d5e093c..97f1a9f 100644
--- a/pojo/src/test/java/org/apache/metamodel/pojo/PojoDataContextTest.java
+++ b/pojo/src/test/java/org/apache/metamodel/pojo/PojoDataContextTest.java
@@ -65,7 +65,7 @@ public class PojoDataContextTest extends TestCase {
         DataSet dataSet = dc.query().from("persons").innerJoin("titles").on("name", "name").selectAll().execute();
 
         assertEquals("[persons.age, persons.name, titles.name, titles.title]",
-                Arrays.toString(dataSet.getSelectItems()));
+                Arrays.toString(dataSet.getSelectItems().toArray()));
         assertTrue(dataSet.next());
         assertEquals("Row[values=[42, Elvis Presley, Elvis Presley, The King]]", dataSet.getRow().toString());
         assertFalse(dataSet.next());
@@ -117,7 +117,7 @@ public class PojoDataContextTest extends TestCase {
         final Table table = schema.getTable(0);
         assertEquals("foo.bar", table.getQualifiedLabel());
 
-        assertEquals("[col1, col2, col3]", Arrays.toString(table.getColumnNames()));
+        assertEquals("[col1, col2, col3]", Arrays.toString(table.getColumnNames().toArray()));
 
         DataSet ds = dc.query().from("bar").select("col2").where("col3").eq(true).execute();
         assertTrue(ds.next());

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/salesforce/src/main/java/org/apache/metamodel/salesforce/SalesforceDataContext.java
----------------------------------------------------------------------
diff --git a/salesforce/src/main/java/org/apache/metamodel/salesforce/SalesforceDataContext.java b/salesforce/src/main/java/org/apache/metamodel/salesforce/SalesforceDataContext.java
index 37467b7..8d25bf4 100644
--- a/salesforce/src/main/java/org/apache/metamodel/salesforce/SalesforceDataContext.java
+++ b/salesforce/src/main/java/org/apache/metamodel/salesforce/SalesforceDataContext.java
@@ -19,10 +19,7 @@
 package org.apache.metamodel.salesforce;
 
 import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.List;
-import java.util.Locale;
-import java.util.TimeZone;
+import java.util.*;
 
 import com.sforce.ws.ConnectorConfig;
 
@@ -167,14 +164,14 @@ public class SalesforceDataContext extends QueryPostprocessDataContext implement
         try {
             sb.append("SELECT ");
             int i = 0;
-            final Column[] columns = new Column[selectItems.size()];
+            final List<Column> columns = new ArrayList(selectItems.size());
             for (SelectItem selectItem : selectItems) {
                 validateSoqlSupportedSelectItem(selectItem);
-                columns[i] = selectItem.getColumn();
+                columns.set(i,selectItem.getColumn());
                 if (i != 0) {
                     sb.append(", ");
                 }
-                sb.append(columns[i].getName());
+                sb.append(columns.get(i).getName());
                 i++;
             }
 
@@ -366,14 +363,14 @@ public class SalesforceDataContext extends QueryPostprocessDataContext implement
     }
 
     @Override
-    protected DataSet materializeMainSchemaTable(Table table, Column[] columns, int maxRows) {
+    protected DataSet materializeMainSchemaTable(Table table, List<Column> columns, int maxRows) {
         final StringBuilder sb = new StringBuilder();
         sb.append("SELECT ");
-        for (int i = 0; i < columns.length; i++) {
+        for (int i = 0; i < columns.size(); i++) {
             if (i != 0) {
                 sb.append(',');
             }
-            sb.append(columns[i].getName());
+            sb.append(columns.get(i).getName());
         }
         sb.append(" FROM ");
         sb.append(table.getName());

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/salesforce/src/main/java/org/apache/metamodel/salesforce/SalesforceDataSet.java
----------------------------------------------------------------------
diff --git a/salesforce/src/main/java/org/apache/metamodel/salesforce/SalesforceDataSet.java b/salesforce/src/main/java/org/apache/metamodel/salesforce/SalesforceDataSet.java
index 85f2d9a..55993bc 100644
--- a/salesforce/src/main/java/org/apache/metamodel/salesforce/SalesforceDataSet.java
+++ b/salesforce/src/main/java/org/apache/metamodel/salesforce/SalesforceDataSet.java
@@ -20,13 +20,16 @@ package org.apache.metamodel.salesforce;
 
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
+import java.util.List;
 import java.util.Locale;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
 
 import org.apache.metamodel.data.AbstractDataSet;
 import org.apache.metamodel.data.DataSetHeader;
 import org.apache.metamodel.data.DefaultRow;
 import org.apache.metamodel.data.Row;
+import org.apache.metamodel.query.SelectItem;
 import org.apache.metamodel.schema.Column;
 import org.apache.metamodel.schema.ColumnType;
 import org.apache.metamodel.util.BooleanComparator;
@@ -48,8 +51,8 @@ final class SalesforceDataSet extends AbstractDataSet {
     private SObject[] _records;
     private SObject _record;
 
-    public SalesforceDataSet(Column[] columns, QueryResult queryResult, PartnerConnection connection) {
-        super(columns);
+    public SalesforceDataSet(List<Column> columns, QueryResult queryResult, PartnerConnection connection) {
+        super(columns.stream().map(SelectItem::new).collect(Collectors.toList()));
         _connection = connection;
         _queryResult = queryResult;
         _records = _queryResult.getRecords();

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/salesforce/src/main/java/org/apache/metamodel/salesforce/SalesforceSchema.java
----------------------------------------------------------------------
diff --git a/salesforce/src/main/java/org/apache/metamodel/salesforce/SalesforceSchema.java b/salesforce/src/main/java/org/apache/metamodel/salesforce/SalesforceSchema.java
index d5f70c9..b11add5 100644
--- a/salesforce/src/main/java/org/apache/metamodel/salesforce/SalesforceSchema.java
+++ b/salesforce/src/main/java/org/apache/metamodel/salesforce/SalesforceSchema.java
@@ -19,6 +19,7 @@
 package org.apache.metamodel.salesforce;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.function.Supplier;
 
@@ -78,9 +79,8 @@ final class SalesforceSchema extends AbstractSchema {
     }
 
     @Override
-    public Table[] getTables() {
-        List<Table> tables = _tableRef.get();
-        return tables.toArray(new Table[tables.size()]);
+    public List<Table> getTables() {
+        return Collections.unmodifiableList(_tableRef.get());
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/salesforce/src/main/java/org/apache/metamodel/salesforce/SalesforceTable.java
----------------------------------------------------------------------
diff --git a/salesforce/src/main/java/org/apache/metamodel/salesforce/SalesforceTable.java b/salesforce/src/main/java/org/apache/metamodel/salesforce/SalesforceTable.java
index 5db2b47..9648bb9 100644
--- a/salesforce/src/main/java/org/apache/metamodel/salesforce/SalesforceTable.java
+++ b/salesforce/src/main/java/org/apache/metamodel/salesforce/SalesforceTable.java
@@ -19,6 +19,7 @@
 package org.apache.metamodel.salesforce;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.function.Supplier;
 
@@ -135,12 +136,12 @@ final class SalesforceTable extends AbstractTable {
     }
 
     @Override
-    public Column[] getColumns() {
+    public List<Column> getColumns() {
         if (_columnRef == null) {
-            return new Column[0];
+            return new ArrayList<>();
         }
         List<Column> columns = _columnRef.get();
-        return columns.toArray(new Column[columns.size()]);
+        return Collections.unmodifiableList(columns);
     }
 
     @Override
@@ -154,8 +155,8 @@ final class SalesforceTable extends AbstractTable {
     }
 
     @Override
-    public Relationship[] getRelationships() {
-        return new Relationship[0];
+    public List<Relationship> getRelationships() {
+        return new ArrayList<>();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/salesforce/src/test/java/org/apache/metamodel/salesforce/SalesforceDataContextTest.java
----------------------------------------------------------------------
diff --git a/salesforce/src/test/java/org/apache/metamodel/salesforce/SalesforceDataContextTest.java b/salesforce/src/test/java/org/apache/metamodel/salesforce/SalesforceDataContextTest.java
index 7cb6fb6..64f4eac 100644
--- a/salesforce/src/test/java/org/apache/metamodel/salesforce/SalesforceDataContextTest.java
+++ b/salesforce/src/test/java/org/apache/metamodel/salesforce/SalesforceDataContextTest.java
@@ -51,7 +51,7 @@ public class SalesforceDataContextTest extends SalesforceTestCase {
         }
         SalesforceDataContext dc = getSalesforceDataContext();
 
-        Column[] timeColumns = dc.getDefaultSchema().getTableByName("Contact").getTimeBasedColumns();
+        List<Column> timeColumns = dc.getDefaultSchema().getTableByName("Contact").getTimeBasedColumns();
         assertEquals(
                 "[Column[name=Birthdate,columnNumber=30,type=DATE,nullable=true,nativeType=date,columnSize=0], "
                         + "Column[name=CreatedDate,columnNumber=33,type=TIMESTAMP,nullable=false,nativeType=datetime,columnSize=0], "
@@ -61,7 +61,7 @@ public class SalesforceDataContextTest extends SalesforceTestCase {
                         + "Column[name=LastCURequestDate,columnNumber=39,type=TIMESTAMP,nullable=true,nativeType=datetime,columnSize=0], "
                         + "Column[name=LastCUUpdateDate,columnNumber=40,type=TIMESTAMP,nullable=true,nativeType=datetime,columnSize=0], "
                         + "Column[name=EmailBouncedDate,columnNumber=42,type=TIMESTAMP,nullable=true,nativeType=datetime,columnSize=0]]",
-                Arrays.toString(timeColumns));
+                Arrays.toString(timeColumns.toArray()));
         DataSet ds = dc.query().from("Contact").select("LastModifiedDate").where("Id").eq("003b0000006xfAUAAY")
                 .execute();
         if (ds.next()) {
@@ -121,15 +121,15 @@ public class SalesforceDataContextTest extends SalesforceTestCase {
 
         assertEquals("Salesforce", schema.getName());
 
-        String[] tableNames = schema.getTableNames();
+        List<String> tableNames = schema.getTableNames();
 
-        System.out.println("All tables:\n" + Arrays.toString(tableNames));
+        System.out.println("All tables:\n" + Arrays.toString(tableNames.toArray()));
 
         Table accountTable = schema.getTableByName("Account");
         assertNotNull(accountTable);
 
-        String[] columnNames = accountTable.getColumnNames();
-        System.out.println("Account table columns: " + Arrays.toString(columnNames));
+        List<String> columnNames = accountTable.getColumnNames();
+        System.out.println("Account table columns: " + Arrays.toString(columnNames.toArray()));
 
         Column idColumn = accountTable.getColumnByName("Id");
         Column nameColumn = accountTable.getColumnByName("Name");
@@ -165,7 +165,7 @@ public class SalesforceDataContextTest extends SalesforceTestCase {
         q.setMaxRows(1);
 
         final DataSet ds = dc.executeQuery(q);
-        final SelectItem[] selectItems = ds.getSelectItems();
+        final List<SelectItem> selectItems = ds.getSelectItems();
         while (ds.next()) {
             Row row = ds.getRow();
 

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/salesforce/src/test/java/org/apache/metamodel/salesforce/SalesforceDataSetTest.java
----------------------------------------------------------------------
diff --git a/salesforce/src/test/java/org/apache/metamodel/salesforce/SalesforceDataSetTest.java b/salesforce/src/test/java/org/apache/metamodel/salesforce/SalesforceDataSetTest.java
index 838e386..a16cf13 100644
--- a/salesforce/src/test/java/org/apache/metamodel/salesforce/SalesforceDataSetTest.java
+++ b/salesforce/src/test/java/org/apache/metamodel/salesforce/SalesforceDataSetTest.java
@@ -18,18 +18,21 @@
  */
 package org.apache.metamodel.salesforce;
 
+import com.google.common.collect.Lists;
 import com.sforce.soap.partner.QueryResult;
 import com.sforce.ws.ConnectionException;
 import com.sforce.ws.bind.TypeMapper;
 import com.sforce.ws.parser.PullParserException;
 import com.sforce.ws.parser.XmlInputStream;
 import org.apache.metamodel.data.Row;
+import org.apache.metamodel.query.SelectItem;
 import org.apache.metamodel.schema.Column;
 import org.apache.metamodel.schema.ColumnType;
 import org.apache.metamodel.schema.MutableColumn;
 import org.junit.Test;
 
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.List;
 
 import static org.junit.Assert.assertEquals;
@@ -41,7 +44,7 @@ public class SalesforceDataSetTest {
         QueryResult qr = queryResult("/result/double-value.xml");
         MutableColumn version = new MutableColumn("Version", ColumnType.DOUBLE);
 
-        SalesforceDataSet dataSet = new SalesforceDataSet(new Column[] { version }, qr, null);
+        SalesforceDataSet dataSet = new SalesforceDataSet(Lists.newArrayList(version), qr, null);
         List<Row> rows = dataSet.toRows();
 
         assertEquals(5386.21, rows.get(0).getValue(version));

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/spring/src/test/java/org/apache/metamodel/spring/CsvDefaultConfigurationFromResourceTest.java
----------------------------------------------------------------------
diff --git a/spring/src/test/java/org/apache/metamodel/spring/CsvDefaultConfigurationFromResourceTest.java b/spring/src/test/java/org/apache/metamodel/spring/CsvDefaultConfigurationFromResourceTest.java
index 87ffef0..c43bf9d 100644
--- a/spring/src/test/java/org/apache/metamodel/spring/CsvDefaultConfigurationFromResourceTest.java
+++ b/spring/src/test/java/org/apache/metamodel/spring/CsvDefaultConfigurationFromResourceTest.java
@@ -53,6 +53,6 @@ public class CsvDefaultConfigurationFromResourceTest {
 
         assertEquals("example.csv", resource.getName());
 
-        assertEquals("[foo, bar]", Arrays.toString(csv.getDefaultSchema().getTable(0).getColumnNames()));
+        assertEquals("[foo, bar]", Arrays.toString(csv.getDefaultSchema().getTable(0).getColumnNames().toArray()));
     }
 }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/spring/src/test/java/org/apache/metamodel/spring/CsvSpecifiedConfigurationFromFilenameTest.java
----------------------------------------------------------------------
diff --git a/spring/src/test/java/org/apache/metamodel/spring/CsvSpecifiedConfigurationFromFilenameTest.java b/spring/src/test/java/org/apache/metamodel/spring/CsvSpecifiedConfigurationFromFilenameTest.java
index 01b6120..ec97106 100644
--- a/spring/src/test/java/org/apache/metamodel/spring/CsvSpecifiedConfigurationFromFilenameTest.java
+++ b/spring/src/test/java/org/apache/metamodel/spring/CsvSpecifiedConfigurationFromFilenameTest.java
@@ -51,7 +51,7 @@ public class CsvSpecifiedConfigurationFromFilenameTest {
 
         assertEquals("example.csv", resource.getName());
 
-        assertEquals("[\"foo\", bar]", Arrays.toString(csv.getDefaultSchema().getTable(0).getColumnNames()));
+        assertEquals("[\"foo\", bar]", Arrays.toString(csv.getDefaultSchema().getTable(0).getColumnNames().toArray()));
 
         Assert.assertFalse(csv.getConfiguration().isMultilineValues());
     }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/spring/src/test/java/org/apache/metamodel/spring/ExcelSpecifiedConfigurationFromFilenameTest.java
----------------------------------------------------------------------
diff --git a/spring/src/test/java/org/apache/metamodel/spring/ExcelSpecifiedConfigurationFromFilenameTest.java b/spring/src/test/java/org/apache/metamodel/spring/ExcelSpecifiedConfigurationFromFilenameTest.java
index 58a9317..a4589fc 100644
--- a/spring/src/test/java/org/apache/metamodel/spring/ExcelSpecifiedConfigurationFromFilenameTest.java
+++ b/spring/src/test/java/org/apache/metamodel/spring/ExcelSpecifiedConfigurationFromFilenameTest.java
@@ -51,7 +51,7 @@ public class ExcelSpecifiedConfigurationFromFilenameTest {
 
         assertEquals("example.xlsx", resource.getName());
 
-        assertEquals("[hello, world]", Arrays.toString(excel.getDefaultSchema().getTable(0).getColumnNames()));
+        assertEquals("[hello, world]", Arrays.toString(excel.getDefaultSchema().getTable(0).getColumnNames().toArray()));
 
         Assert.assertTrue(excel.getConfiguration().isSkipEmptyLines());
         Assert.assertTrue(excel.getConfiguration().isSkipEmptyColumns());

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/spring/src/test/java/org/apache/metamodel/spring/PojoDataContextFactoryBeanDelegateTest.java
----------------------------------------------------------------------
diff --git a/spring/src/test/java/org/apache/metamodel/spring/PojoDataContextFactoryBeanDelegateTest.java b/spring/src/test/java/org/apache/metamodel/spring/PojoDataContextFactoryBeanDelegateTest.java
index 558cda4..471dc96 100644
--- a/spring/src/test/java/org/apache/metamodel/spring/PojoDataContextFactoryBeanDelegateTest.java
+++ b/spring/src/test/java/org/apache/metamodel/spring/PojoDataContextFactoryBeanDelegateTest.java
@@ -39,15 +39,15 @@ public class PojoDataContextFactoryBeanDelegateTest extends TestCase {
 
         Schema schema = dataContext.getDefaultSchema();
         assertEquals("my db", schema.getName());
-        assertEquals("[foo, hello world]", Arrays.toString(schema.getTableNames()));
+        assertEquals("[foo, hello world]", Arrays.toString(schema.getTableNames().toArray()));
 
         assertEquals(
                 "[Column[name=greeting,columnNumber=0,type=VARCHAR,nullable=true,nativeType=null,columnSize=null], "
                         + "Column[name=who,columnNumber=1,type=VARCHAR,nullable=true,nativeType=null,columnSize=null]]",
-                Arrays.toString(schema.getTableByName("hello world").getColumns()));
+                Arrays.toString(schema.getTableByName("hello world").getColumns().toArray()));
 
         assertEquals("[Column[name=bar,columnNumber=0,type=INTEGER,nullable=true,nativeType=null,columnSize=null], "
                 + "Column[name=baz,columnNumber=1,type=DATE,nullable=true,nativeType=null,columnSize=null]]",
-                Arrays.toString(schema.getTableByName("foo").getColumns()));
+                Arrays.toString(schema.getTableByName("foo").getColumns().toArray()));
     }
 }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/sugarcrm/src/main/java/org/apache/metamodel/sugarcrm/SugarCrmDataContext.java
----------------------------------------------------------------------
diff --git a/sugarcrm/src/main/java/org/apache/metamodel/sugarcrm/SugarCrmDataContext.java b/sugarcrm/src/main/java/org/apache/metamodel/sugarcrm/SugarCrmDataContext.java
index e3908c0..9abe5da 100644
--- a/sugarcrm/src/main/java/org/apache/metamodel/sugarcrm/SugarCrmDataContext.java
+++ b/sugarcrm/src/main/java/org/apache/metamodel/sugarcrm/SugarCrmDataContext.java
@@ -38,7 +38,7 @@ import org.apache.metamodel.util.LazyRef;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.sugarcrm.ws.soapyxyx.EntryValue;
+import com.sugarcrm.ws.soap.EntryValue;
 import com.sugarcrm.ws.soap.GetEntriesCountResult;
 import com.sugarcrm.ws.soap.GetEntryListResultVersion2;
 import com.sugarcrm.ws.soap.LinkNamesToFieldsArray;
@@ -147,7 +147,7 @@ public class SugarCrmDataContext extends QueryPostprocessDataContext implements
     }
 
     @Override
-    protected DataSet materializeMainSchemaTable(final Table table, final Column[] columns, final int maxRows) {
+    protected DataSet materializeMainSchemaTable(final Table table, final List<Column> columns, final int maxRows) {
 
         final String session = _sessionId.get();
         final String moduleName = table.getName();

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/sugarcrm/src/main/java/org/apache/metamodel/sugarcrm/SugarCrmDataSet.java
----------------------------------------------------------------------
diff --git a/sugarcrm/src/main/java/org/apache/metamodel/sugarcrm/SugarCrmDataSet.java b/sugarcrm/src/main/java/org/apache/metamodel/sugarcrm/SugarCrmDataSet.java
index a754ce6..7558c6d 100644
--- a/sugarcrm/src/main/java/org/apache/metamodel/sugarcrm/SugarCrmDataSet.java
+++ b/sugarcrm/src/main/java/org/apache/metamodel/sugarcrm/SugarCrmDataSet.java
@@ -22,6 +22,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
 
 import org.apache.metamodel.data.AbstractDataSet;
 import org.apache.metamodel.data.DataSetHeader;
@@ -54,9 +55,9 @@ final class SugarCrmDataSet extends AbstractDataSet {
     private List<Object> _records;
     private Node _record;
 
-    public SugarCrmDataSet(Column[] columns, SugarsoapPortType service, String session,
+    public SugarCrmDataSet(List<Column> columns, SugarsoapPortType service, String session,
             GetEntryListResultVersion2 entryList) {
-        super(columns);
+        super(columns.stream().map(SelectItem::new).collect(Collectors.toList()));
         _recordIndex = new AtomicInteger();
         _service = service;
         _session = session;
@@ -80,12 +81,9 @@ final class SugarCrmDataSet extends AbstractDataSet {
             }
 
             final DataSetHeader header = getHeader();
-            final SelectItem[] selectItems = header.getSelectItems();
-            final Column[] columns = new Column[selectItems.length];
-            for (int i = 0; i < columns.length; i++) {
-                columns[i] = selectItems[i].getColumn();
-            }
-            final String moduleName = selectItems[0].getColumn().getTable().getName();
+            final List<SelectItem> selectItems = header.getSelectItems();
+            final List<Column> columns = selectItems.stream().map(si -> si.getColumn()).collect(Collectors.toList());
+            final String moduleName = selectItems.get(0).getColumn().getTable().getName();
             final SelectFields selectFields = SugarCrmXmlHelper.createSelectFields(columns);
 
             _entryList = _service.getEntryList(_session, moduleName, "", "", nextOffset, selectFields,

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/sugarcrm/src/main/java/org/apache/metamodel/sugarcrm/SugarCrmSchema.java
----------------------------------------------------------------------
diff --git a/sugarcrm/src/main/java/org/apache/metamodel/sugarcrm/SugarCrmSchema.java b/sugarcrm/src/main/java/org/apache/metamodel/sugarcrm/SugarCrmSchema.java
index 49e24e7..1db4090 100644
--- a/sugarcrm/src/main/java/org/apache/metamodel/sugarcrm/SugarCrmSchema.java
+++ b/sugarcrm/src/main/java/org/apache/metamodel/sugarcrm/SugarCrmSchema.java
@@ -19,6 +19,7 @@
 package org.apache.metamodel.sugarcrm;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.function.Supplier;
 
@@ -58,8 +59,8 @@ final class SugarCrmSchema extends AbstractSchema {
     }
 
     @Override
-    public Table[] getTables() {
-        return _tables.toArray(new Table[_tables.size()]);
+    public List<Table> getTables() {
+        return Collections.unmodifiableList(_tables);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/sugarcrm/src/main/java/org/apache/metamodel/sugarcrm/SugarCrmTable.java
----------------------------------------------------------------------
diff --git a/sugarcrm/src/main/java/org/apache/metamodel/sugarcrm/SugarCrmTable.java b/sugarcrm/src/main/java/org/apache/metamodel/sugarcrm/SugarCrmTable.java
index 1926d83..7ef82bf 100644
--- a/sugarcrm/src/main/java/org/apache/metamodel/sugarcrm/SugarCrmTable.java
+++ b/sugarcrm/src/main/java/org/apache/metamodel/sugarcrm/SugarCrmTable.java
@@ -18,10 +18,7 @@
  */
 package org.apache.metamodel.sugarcrm;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.function.Supplier;
 
 import org.apache.metamodel.schema.AbstractTable;
@@ -119,9 +116,9 @@ final class SugarCrmTable extends AbstractTable {
     }
 
     @Override
-    public Column[] getColumns() {
+    public List<Column> getColumns() {
         final List<Column> columns = _columnsRef.get();
-        return columns.toArray(new Column[columns.size()]);
+        return Collections.unmodifiableList(columns);
     }
 
     @Override
@@ -135,8 +132,8 @@ final class SugarCrmTable extends AbstractTable {
     }
 
     @Override
-    public Relationship[] getRelationships() {
-        return new Relationship[0];
+    public List<Relationship> getRelationships() {
+        return new ArrayList<>();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/sugarcrm/src/main/java/org/apache/metamodel/sugarcrm/SugarCrmXmlHelper.java
----------------------------------------------------------------------
diff --git a/sugarcrm/src/main/java/org/apache/metamodel/sugarcrm/SugarCrmXmlHelper.java b/sugarcrm/src/main/java/org/apache/metamodel/sugarcrm/SugarCrmXmlHelper.java
index a49b934..394cd6d 100644
--- a/sugarcrm/src/main/java/org/apache/metamodel/sugarcrm/SugarCrmXmlHelper.java
+++ b/sugarcrm/src/main/java/org/apache/metamodel/sugarcrm/SugarCrmXmlHelper.java
@@ -39,7 +39,7 @@ import com.sugarcrm.ws.soap.SelectFields;
  */
 final class SugarCrmXmlHelper {
     
-    public static SelectFields createSelectFields(Column ... columns) {
+    public static SelectFields createSelectFields(List<Column> columns) {
         final SelectFields selectFields = new SelectFields();
         selectFields.setArrayType("xsd:string[]");
 

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/sugarcrm/src/test/java/org/apache/metamodel/sugarcrm/SugarCrmDataContextTest.java
----------------------------------------------------------------------
diff --git a/sugarcrm/src/test/java/org/apache/metamodel/sugarcrm/SugarCrmDataContextTest.java b/sugarcrm/src/test/java/org/apache/metamodel/sugarcrm/SugarCrmDataContextTest.java
index d9cf1e8..4fa4a7c 100644
--- a/sugarcrm/src/test/java/org/apache/metamodel/sugarcrm/SugarCrmDataContextTest.java
+++ b/sugarcrm/src/test/java/org/apache/metamodel/sugarcrm/SugarCrmDataContextTest.java
@@ -20,6 +20,7 @@ package org.apache.metamodel.sugarcrm;
 
 import java.util.Arrays;
 import java.util.Date;
+import java.util.List;
 
 import org.apache.metamodel.data.DataSet;
 import org.apache.metamodel.data.InMemoryDataSet;
@@ -107,12 +108,12 @@ public class SugarCrmDataContextTest extends SugarCrmTestCase {
 
         final Schema schema = dataContext.getDefaultSchema();
         final Table table = schema.getTableByName("Prospects");
-        final Column[] numberColumns = table.getNumberColumns();
-        final Column[] booleanColumns = table.getBooleanColumns();
-        final Column[] timeBasedColumns = table.getTimeBasedColumns();
-        assertTrue(numberColumns.length > 0);
-        assertTrue(booleanColumns.length > 0);
-        assertTrue(timeBasedColumns.length > 0);
+        final List<Column> numberColumns = table.getNumberColumns();
+        final List<Column> booleanColumns = table.getBooleanColumns();
+        final List<Column> timeBasedColumns = table.getTimeBasedColumns();
+        assertTrue(numberColumns.size() > 0);
+        assertTrue(booleanColumns.size() > 0);
+        assertTrue(timeBasedColumns.size() > 0);
 
         DataSet ds = dataContext.query().from(table).selectAll().limit(5).execute();
         int rowCounter = 0;
@@ -146,9 +147,9 @@ public class SugarCrmDataContextTest extends SugarCrmTestCase {
         }
         ds.close();
         assertTrue(rowCounter > 0);
-        assertTrue("No non-null values found in: " + Arrays.toString(numberColumns), numberCounter > 0);
-        assertTrue("No non-null values found in: " + Arrays.toString(booleanColumns), booleanCounter > 0);
-        assertTrue("No non-null values found in: " + Arrays.toString(timeBasedColumns), timeBasedCounter > 0);
+        assertTrue("No non-null values found in: " + Arrays.toString(numberColumns.toArray()), numberCounter > 0);
+        assertTrue("No non-null values found in: " + Arrays.toString(booleanColumns.toArray()), booleanCounter > 0);
+        assertTrue("No non-null values found in: " + Arrays.toString(timeBasedColumns.toArray()), timeBasedCounter > 0);
     }
 
     public void testMaxRowsQuery() throws Exception {
@@ -189,7 +190,7 @@ public class SugarCrmDataContextTest extends SugarCrmTestCase {
 
         Table table = schema.getTableByName("Accounts");
 
-        String[] columnNames = table.getColumnNames();
+        List<String> columnNames = table.getColumnNames();
         assertEquals(
                 "[id, name, date_entered, date_modified, modified_user_id, modified_by_name, created_by, created_by_name, "
                         + "description, deleted, assigned_user_id, assigned_user_name, account_type, industry, annual_revenue, phone_fax, "
@@ -199,7 +200,7 @@ public class SugarCrmDataContextTest extends SugarCrmTestCase {
                         + "shipping_address_street_2, shipping_address_street_3, shipping_address_street_4, shipping_address_city, "
                         + "shipping_address_state, shipping_address_postalcode, shipping_address_country, email1, parent_id, sic_code, parent_name, "
                         + "email_opt_out, invalid_email, email, campaign_id, campaign_name]",
-                Arrays.toString(columnNames));
+                Arrays.toString(columnNames.toArray()));
 
         Column nameColumn = table.getColumnByName("name");
         String nativeType = nameColumn.getNativeType();
@@ -207,8 +208,7 @@ public class SugarCrmDataContextTest extends SugarCrmTestCase {
         ColumnType type = nameColumn.getType();
         assertEquals("name|Name:|VARCHAR", nativeType + "|" + remarks + "|" + type);
 
-        Column[] columns = table.getColumns();
-        for (Column column : columns) {
+        for (Column column : table.getColumns()) {
             type = column.getType();
             if (type == null || type == ColumnType.OTHER) {
                 fail("No type mapping for native type: " + column.getNativeType() + " (found in column: " + column
@@ -228,10 +228,9 @@ public class SugarCrmDataContextTest extends SugarCrmTestCase {
                         + "alt_address_postalcode, alt_address_country, assistant, assistant_phone, email_and_name1, lead_source, account_name, account_id, "
                         + "opportunity_role_fields, opportunity_role_id, opportunity_role, reports_to_id, report_to_name, birthdate, campaign_id, campaign_name, "
                         + "c_accept_status_fields, m_accept_status_fields, accept_status_id, accept_status_name, sync_contact]",
-                Arrays.toString(columnNames));
+                Arrays.toString(columnNames.toArray()));
 
-        columns = table.getColumns();
-        for (Column column : columns) {
+        for (Column column : table.getColumns()) {
             type = column.getType();
             if (type == null || type == ColumnType.OTHER) {
                 fail("No type mapping for native type: " + column.getNativeType() + " (found in column: " + column

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/xml/src/main/java/org/apache/metamodel/xml/XmlDomDataContext.java
----------------------------------------------------------------------
diff --git a/xml/src/main/java/org/apache/metamodel/xml/XmlDomDataContext.java b/xml/src/main/java/org/apache/metamodel/xml/XmlDomDataContext.java
index 0d0bebb..3c4d0cd 100644
--- a/xml/src/main/java/org/apache/metamodel/xml/XmlDomDataContext.java
+++ b/xml/src/main/java/org/apache/metamodel/xml/XmlDomDataContext.java
@@ -511,8 +511,8 @@ public class XmlDomDataContext extends QueryPostprocessDataContext {
                     .map(ftRel -> ftRel.getForeignTable().getName()).collect(Collectors.joining(", ")));
         }
 
-        List<Column> primaryColumns = primaryTable.getColumns();
-        List<Column> foreignColumns = foreignTable.getColumns();
+        List<Column> primaryColumns = new ArrayList<>(primaryTable.getColumns());
+        List<Column> foreignColumns = new ArrayList<>(foreignTable.getColumns());
 
         // Remove the surrogate id
         String primaryTableName = primaryTable.getName();


[05/20] metamodel git commit: now all compiling

Posted by ka...@apache.org.
http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/jdbc/src/test/java/org/apache/metamodel/jdbc/QuerySplitterTest.java
----------------------------------------------------------------------
diff --git a/jdbc/src/test/java/org/apache/metamodel/jdbc/QuerySplitterTest.java b/jdbc/src/test/java/org/apache/metamodel/jdbc/QuerySplitterTest.java
index 8e4842c..a67dc63 100644
--- a/jdbc/src/test/java/org/apache/metamodel/jdbc/QuerySplitterTest.java
+++ b/jdbc/src/test/java/org/apache/metamodel/jdbc/QuerySplitterTest.java
@@ -43,7 +43,7 @@ public class QuerySplitterTest extends JdbcTestCase {
 		Table customersTable = schema.getTableByName("CUSTOMERS");
 		Query q = new Query().from(employeesTable, "e").from(customersTable,
 				"c");
-		q.select(employeesTable.getColumns()[0], customersTable.getColumns()[0]);
+		q.select(employeesTable.getColumns().get(0), customersTable.getColumns().get(0));
 		assertEquals(
 				"SELECT e._EMPLOYEENUMBER_, c._CUSTOMERNUMBER_ FROM PUBLIC._EMPLOYEES_ e, PUBLIC._CUSTOMERS_ c",
 				q.toString().replace('\"', '_'));
@@ -83,10 +83,10 @@ public class QuerySplitterTest extends JdbcTestCase {
 		Table orderDetailsTable = schema.getTableByName("ORDERDETAILS");
 		Query q = new Query().from(employeesTable, "e").from(orderDetailsTable,
 				"c");
-		q.select(orderDetailsTable.getColumns()[0])
+		q.select(orderDetailsTable.getColumns().get(0))
 				.select(new SelectItem(FunctionType.MAX, employeesTable
-						.getColumns()[0]));
-		q.groupBy(orderDetailsTable.getColumns()[0]);
+						.getColumns().get(0)));
+		q.groupBy(orderDetailsTable.getColumns().get(0));
 		assertEquals(
 				"SELECT c._ORDERNUMBER_, MAX(e._EMPLOYEENUMBER_) FROM PUBLIC._EMPLOYEES_ e, PUBLIC._ORDERDETAILS_ c GROUP BY c._ORDERNUMBER_",
 				q.toString().replace('\"', '_'));
@@ -121,8 +121,7 @@ public class QuerySplitterTest extends JdbcTestCase {
 		DataContext dc = new JdbcDataContext(con);
 		Schema schema = dc.getDefaultSchema();
 		Table productsTable = schema.getTableByName("PRODUCTS");
-		Relationship[] relationships = productsTable.getRelationships();
-		Relationship relationship = relationships[0];
+		Relationship relationship = productsTable.getRelationships().iterator().next();
 		assertEquals(
 				"Relationship[primaryTable=PRODUCTS,primaryColumns=[PRODUCTCODE],foreignTable=ORDERFACT,foreignColumns=[PRODUCTCODE]]",
 				relationship.toString());
@@ -153,9 +152,9 @@ public class QuerySplitterTest extends JdbcTestCase {
 		Query sq = new Query().from(employeesTable, "e").from(customersTable,
 				"c");
 		SelectItem empSelectItem = new SelectItem(
-				employeesTable.getColumns()[0]);
+				employeesTable.getColumns().get(0));
 		SelectItem custSelectItem = new SelectItem(
-				customersTable.getColumns()[0]);
+				customersTable.getColumns().get(0));
 		sq.select(empSelectItem, custSelectItem);
 		assertEquals(
 				"SELECT e._EMPLOYEENUMBER_, c._CUSTOMERNUMBER_ FROM PUBLIC._EMPLOYEES_ e, PUBLIC._CUSTOMERS_ c",

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/jdbc/src/test/java/org/apache/metamodel/jdbc/SqliteTest.java
----------------------------------------------------------------------
diff --git a/jdbc/src/test/java/org/apache/metamodel/jdbc/SqliteTest.java b/jdbc/src/test/java/org/apache/metamodel/jdbc/SqliteTest.java
index 3a8d1a4..6e4b417 100644
--- a/jdbc/src/test/java/org/apache/metamodel/jdbc/SqliteTest.java
+++ b/jdbc/src/test/java/org/apache/metamodel/jdbc/SqliteTest.java
@@ -97,14 +97,13 @@ public class SqliteTest extends TestCase {
 
     public void testGetSchemas() throws Exception {
         DataContext dc = new JdbcDataContext(_connection);
-        String[] schemaNames = dc.getSchemaNames();
+        String[] schemaNames = dc.getSchemaNames().toArray(new String[dc.getSchemaNames().size()]);
         assertEquals("[null]", Arrays.toString(schemaNames));
 
         Schema schema = dc.getDefaultSchema();
         assertNotNull(schema);
         assertNull(schema.getName());
 
-        Table[] tables = schema.getTables();
         assertEquals("[Table[name=system,type=TABLE,remarks=null], "
                 + "Table[name=permission,type=TABLE,remarks=null], "
                 + "Table[name=auth_cookie,type=TABLE,remarks=null], " + "Table[name=session,type=TABLE,remarks=null], "
@@ -115,11 +114,11 @@ public class SqliteTest extends TestCase {
                 + "Table[name=ticket_custom,type=TABLE,remarks=null], " + "Table[name=enum,type=TABLE,remarks=null], "
                 + "Table[name=component,type=TABLE,remarks=null], " + "Table[name=milestone,type=TABLE,remarks=null], "
                 + "Table[name=version,type=TABLE,remarks=null], " + "Table[name=report,type=TABLE,remarks=null]]",
-                Arrays.toString(tables));
+                Arrays.toString(schema.getTables().toArray()));
 
         // Index- and key-info is not yet implemented in the JDBC driver
 
-        assertEquals("[]", Arrays.toString(schema.getRelationships()));
+        assertEquals("[]", Arrays.toString(schema.getRelationships().toArray()));
 
         Table wikiTable = schema.getTableByName("WIKI");
         assertEquals(
@@ -131,13 +130,13 @@ public class SqliteTest extends TestCase {
                         + "Column[name=text,columnNumber=5,type=VARCHAR,nullable=true,nativeType=TEXT,columnSize=2000000000], "
                         + "Column[name=comment,columnNumber=6,type=VARCHAR,nullable=true,nativeType=TEXT,columnSize=2000000000], "
                         + "Column[name=readonly,columnNumber=7,type=INTEGER,nullable=true,nativeType=INTEGER,columnSize=2000000000]]",
-                Arrays.toString(wikiTable.getColumns()));
+                Arrays.toString(wikiTable.getColumns().toArray()));
 
         Table permissionTable = schema.getTableByName("PERMISSION");
         assertEquals(
                 "[Column[name=username,columnNumber=0,type=VARCHAR,nullable=true,nativeType=TEXT,columnSize=2000000000], "
                         + "Column[name=action,columnNumber=1,type=VARCHAR,nullable=true,nativeType=TEXT,columnSize=2000000000]]",
-                Arrays.toString(permissionTable.getColumns()));
+                Arrays.toString(permissionTable.getColumns().toArray()));
     }
 
     public void testExecuteQuery() throws Exception {

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/DB2Test.java
----------------------------------------------------------------------
diff --git a/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/DB2Test.java b/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/DB2Test.java
index aef6f51..f4a7df7 100644
--- a/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/DB2Test.java
+++ b/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/DB2Test.java
@@ -85,8 +85,7 @@ public class DB2Test extends AbstractJdbIntegrationTest {
         }
         JdbcDataContext dc = new JdbcDataContext(getConnection());
         Schema schema = dc.getDefaultSchema();
-        String[] tableNames = schema.getTableNames();
-        System.out.println("Tables: " + Arrays.toString(tableNames));
+        System.out.println("Tables: " + Arrays.toString(schema.getTableNames().toArray()));
 
         Table countryTable = schema.getTableByName("COUNTRY");
         assertNotNull(countryTable);
@@ -110,8 +109,7 @@ public class DB2Test extends AbstractJdbIntegrationTest {
         }
         JdbcDataContext dc = new JdbcDataContext(getConnection());
         Schema schema = dc.getDefaultSchema();
-        String[] tableNames = schema.getTableNames();
-        System.out.println("Tables: " + Arrays.toString(tableNames));
+        System.out.println("Tables: " + Arrays.toString(schema.getTableNames().toArray()));
 
         Table countryTable = schema.getTableByName("COUNTRY");
         assertNotNull(countryTable);

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/FirebirdTest.java
----------------------------------------------------------------------
diff --git a/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/FirebirdTest.java b/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/FirebirdTest.java
index f883e83..9857ea5 100644
--- a/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/FirebirdTest.java
+++ b/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/FirebirdTest.java
@@ -21,9 +21,13 @@ package org.apache.metamodel.jdbc.integrationtests;
 import java.text.SimpleDateFormat;
 import java.util.Arrays;
 import java.util.Date;
+import java.util.Set;
+import java.util.stream.Collectors;
 
+import javax.management.relation.Relation;
 import javax.swing.table.TableModel;
 
+import com.google.common.collect.Sets;
 import org.apache.metamodel.data.DataSet;
 import org.apache.metamodel.data.DataSetTableModel;
 import org.apache.metamodel.jdbc.JdbcDataContext;
@@ -56,7 +60,7 @@ public class FirebirdTest extends AbstractJdbIntegrationTest {
 	        return;
 	    }
 		JdbcDataContext dataContext = getDataContext();
-        Schema[] schemas = dataContext.getSchemas();
+        Schema[] schemas = dataContext.getSchemas().toArray(new Schema[dataContext.getSchemas().size()]);
 		assertEquals(1, schemas.length);
 		Schema schema = dataContext.getDefaultSchema();
 		assertEquals("{JdbcTable[name=COUNTRY,type=TABLE,remarks=<null>],"
@@ -69,26 +73,28 @@ public class FirebirdTest extends AbstractJdbIntegrationTest {
 				+ "JdbcTable[name=PROJECT,type=TABLE,remarks=<null>],"
 				+ "JdbcTable[name=PROJ_DEPT_BUDGET,type=TABLE,remarks=<null>],"
 				+ "JdbcTable[name=SALARY_HISTORY,type=TABLE,remarks=<null>],"
-				+ "JdbcTable[name=SALES,type=TABLE,remarks=<null>]}", Arrays.toString(schema.getTables()));
-
-		assertEquals(
-				"{Relationship[primaryTable=COUNTRY,primaryColumns={COUNTRY},foreignTable=CUSTOMER,foreignColumns={COUNTRY}],"
-						+ "Relationship[primaryTable=COUNTRY,primaryColumns={COUNTRY},foreignTable=JOB,foreignColumns={JOB_COUNTRY}],"
-						+ "Relationship[primaryTable=CUSTOMER,primaryColumns={CUST_NO},foreignTable=SALES,foreignColumns={CUST_NO}],"
-						+ "Relationship[primaryTable=DEPARTMENT,primaryColumns={DEPT_NO},foreignTable=DEPARTMENT,foreignColumns={HEAD_DEPT}],"
-						+ "Relationship[primaryTable=DEPARTMENT,primaryColumns={DEPT_NO},foreignTable=EMPLOYEE,foreignColumns={DEPT_NO}],"
-						+ "Relationship[primaryTable=DEPARTMENT,primaryColumns={DEPT_NO},foreignTable=PROJ_DEPT_BUDGET,foreignColumns={DEPT_NO}],"
-						+ "Relationship[primaryTable=EMPLOYEE,primaryColumns={EMP_NO},foreignTable=DEPARTMENT,foreignColumns={MNGR_NO}],"
-						+ "Relationship[primaryTable=EMPLOYEE,primaryColumns={EMP_NO},foreignTable=EMPLOYEE_PROJECT,foreignColumns={EMP_NO}],"
-						+ "Relationship[primaryTable=EMPLOYEE,primaryColumns={EMP_NO},foreignTable=PROJECT,foreignColumns={TEAM_LEADER}],"
-						+ "Relationship[primaryTable=EMPLOYEE,primaryColumns={EMP_NO},foreignTable=SALARY_HISTORY,foreignColumns={EMP_NO}],"
-						+ "Relationship[primaryTable=EMPLOYEE,primaryColumns={EMP_NO},foreignTable=SALES,foreignColumns={SALES_REP}],"
-						+ "Relationship[primaryTable=JOB,primaryColumns={JOB_CODE},foreignTable=EMPLOYEE,foreignColumns={JOB_CODE}],"
-						+ "Relationship[primaryTable=JOB,primaryColumns={JOB_GRADE},foreignTable=EMPLOYEE,foreignColumns={JOB_GRADE}],"
-						+ "Relationship[primaryTable=JOB,primaryColumns={JOB_COUNTRY},foreignTable=EMPLOYEE,foreignColumns={JOB_COUNTRY}],"
-						+ "Relationship[primaryTable=PROJECT,primaryColumns={PROJ_ID},foreignTable=EMPLOYEE_PROJECT,foreignColumns={PROJ_ID}],"
-						+ "Relationship[primaryTable=PROJECT,primaryColumns={PROJ_ID},foreignTable=PROJ_DEPT_BUDGET,foreignColumns={PROJ_ID}]}",
-				Arrays.toString(schema.getRelationships()));
+				+ "JdbcTable[name=SALES,type=TABLE,remarks=<null>]}", Arrays.toString(schema.getTables().toArray()));
+		
+		Set<String> relationStrings = schema.getRelationships().stream().map(rel -> rel.toString()).collect(Collectors.toSet());
+		Set<String> referenceRelationStrings = Sets.newHashSet(
+				"Relationship[primaryTable=COUNTRY,primaryColumns={COUNTRY},foreignTable=CUSTOMER,foreignColumns={COUNTRY}]",
+						"Relationship[primaryTable=COUNTRY,primaryColumns={COUNTRY},foreignTable=JOB,foreignColumns={JOB_COUNTRY}]",
+						"Relationship[primaryTable=CUSTOMER,primaryColumns={CUST_NO},foreignTable=SALES,foreignColumns={CUST_NO}]",
+						"Relationship[primaryTable=DEPARTMENT,primaryColumns={DEPT_NO},foreignTable=DEPARTMENT,foreignColumns={HEAD_DEPT}]",
+						"Relationship[primaryTable=DEPARTMENT,primaryColumns={DEPT_NO},foreignTable=EMPLOYEE,foreignColumns={DEPT_NO}]",
+						"Relationship[primaryTable=DEPARTMENT,primaryColumns={DEPT_NO},foreignTable=PROJ_DEPT_BUDGET,foreignColumns={DEPT_NO}]",
+						"Relationship[primaryTable=EMPLOYEE,primaryColumns={EMP_NO},foreignTable=DEPARTMENT,foreignColumns={MNGR_NO}]",
+						"Relationship[primaryTable=EMPLOYEE,primaryColumns={EMP_NO},foreignTable=EMPLOYEE_PROJECT,foreignColumns={EMP_NO}]",
+						"Relationship[primaryTable=EMPLOYEE,primaryColumns={EMP_NO},foreignTable=PROJECT,foreignColumns={TEAM_LEADER}]",
+						"Relationship[primaryTable=EMPLOYEE,primaryColumns={EMP_NO},foreignTable=SALARY_HISTORY,foreignColumns={EMP_NO}]",
+						"Relationship[primaryTable=EMPLOYEE,primaryColumns={EMP_NO},foreignTable=SALES,foreignColumns={SALES_REP}]",
+						"Relationship[primaryTable=JOB,primaryColumns={JOB_CODE},foreignTable=EMPLOYEE,foreignColumns={JOB_CODE}]",
+						"Relationship[primaryTable=JOB,primaryColumns={JOB_GRADE},foreignTable=EMPLOYEE,foreignColumns={JOB_GRADE}]",
+						"Relationship[primaryTable=JOB,primaryColumns={JOB_COUNTRY},foreignTable=EMPLOYEE,foreignColumns={JOB_COUNTRY}]",
+						"Relationship[primaryTable=PROJECT,primaryColumns={PROJ_ID},foreignTable=EMPLOYEE_PROJECT,foreignColumns={PROJ_ID}]",
+						"Relationship[primaryTable=PROJECT,primaryColumns={PROJ_ID},foreignTable=PROJ_DEPT_BUDGET,foreignColumns={PROJ_ID}]"
+		);
+		assertEquals(relationStrings,referenceRelationStrings);
 	}
 
 	public void testExecuteQuery() throws Exception {
@@ -99,9 +105,9 @@ public class FirebirdTest extends AbstractJdbIntegrationTest {
         Schema schema = dataContext.getDefaultSchema();
 		Table departmentTable = schema.getTableByName("DEPARTMENT");
 		Table employeeTable = schema.getTableByName("EMPLOYEE");
-		Query q = new Query().from(new FromItem(JoinType.INNER, departmentTable.getRelationships(employeeTable)[0]));
-		q.select(departmentTable.getColumns()[1]);
-		q.select(new SelectItem(employeeTable.getColumns()[4]).setAlias("hire-date"));
+		Query q = new Query().from(new FromItem(JoinType.INNER, departmentTable.getRelationships(employeeTable).iterator().next()));
+		q.select(departmentTable.getColumns().get(1));
+		q.select(new SelectItem(employeeTable.getColumns().get(4)).setAlias("hire-date"));
 		assertEquals(
 				"SELECT \"DEPARTMENT\".\"DEPARTMENT\", \"EMPLOYEE\".\"HIRE_DATE\" AS hire-date FROM \"EMPLOYEE\" INNER JOIN \"DEPARTMENT\" ON \"EMPLOYEE\".\"EMP_NO\" = \"DEPARTMENT\".\"MNGR_NO\"",
 				q.toString());

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/MysqlTest.java
----------------------------------------------------------------------
diff --git a/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/MysqlTest.java b/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/MysqlTest.java
index c5485ca..dc93a28 100644
--- a/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/MysqlTest.java
+++ b/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/MysqlTest.java
@@ -227,17 +227,17 @@ public class MysqlTest extends AbstractJdbIntegrationTest {
         Table actorTable = schema.getTableByName("actor");
         assertEquals(
                 "[Column[name=actor_id,columnNumber=0,type=SMALLINT,nullable=false,nativeType=SMALLINT UNSIGNED,columnSize=5], Column[name=first_name,columnNumber=1,type=VARCHAR,nullable=false,nativeType=VARCHAR,columnSize=45], Column[name=last_name,columnNumber=2,type=VARCHAR,nullable=false,nativeType=VARCHAR,columnSize=45], Column[name=last_update,columnNumber=3,type=TIMESTAMP,nullable=false,nativeType=TIMESTAMP,columnSize=19]]",
-                Arrays.toString(actorTable.getColumns()));
+                Arrays.toString(actorTable.getColumns().toArray()));
         Table filmTable = schema.getTableByName("film");
         assertEquals(
                 "[Column[name=film_id,columnNumber=0,type=SMALLINT,nullable=false,nativeType=SMALLINT UNSIGNED,columnSize=5], Column[name=title,columnNumber=1,type=VARCHAR,nullable=false,nativeType=VARCHAR,columnSize=255], Column[name=description,columnNumber=2,type=LONGVARCHAR,nullable=true,nativeType=TEXT,columnSize=65535], Column[name=release_year,columnNumber=3,type=DATE,nullable=true,nativeType=YEAR,columnSize=0], Column[name=language_id,columnNumber=4,type=TINYINT,nullable=false,nativeType=TINYINT UNSIGNED,columnSize=3], Column[name=original_language_id,columnNumber=5,type=TINYINT,nullable=true,nativeType=TINYINT UNSIGNED,columnSize=3], Column[name=rental_duration,columnNumber=6,type=TINYINT,nullable=false,nativeType=TINYINT UNSIGNED,columnSize=3], Column[name=rental_rate,columnNumber=7,type=DECIMAL,nullable=false,nativeType=DECIMAL,columnSize=4], Column[name=length,columnNumber=8,type=SMALLINT,nullable=true,nativeType=SMALLINT UNSIGNED,columnSize=5], Column[name=replacement_c
 ost,columnNumber=9,type=DECIMAL,nullable=false,nativeType=DECIMAL,columnSize=5], Column[name=rating,columnNumber=10,type=CHAR,nullable=true,nativeType=ENUM,columnSize=5], Column[name=special_features,columnNumber=11,type=CHAR,nullable=true,nativeType=SET,columnSize=54], Column[name=last_update,columnNumber=12,type=TIMESTAMP,nullable=false,nativeType=TIMESTAMP,columnSize=19]]",
-                Arrays.toString(filmTable.getColumns()));
+                Arrays.toString(filmTable.getColumns().toArray()));
         Table filmActorJoinTable = schema.getTableByName("film_actor");
         assertEquals(
                 "[Column[name=actor_id,columnNumber=0,type=SMALLINT,nullable=false,nativeType=SMALLINT UNSIGNED,columnSize=5], "
                         + "Column[name=film_id,columnNumber=1,type=SMALLINT,nullable=false,nativeType=SMALLINT UNSIGNED,columnSize=5], "
                         + "Column[name=last_update,columnNumber=2,type=TIMESTAMP,nullable=false,nativeType=TIMESTAMP,columnSize=19]]",
-                Arrays.toString(filmActorJoinTable.getColumns()));
+                Arrays.toString(filmActorJoinTable.getColumns().toArray()));
 
         Query q = new Query();
         q.from(new FromItem(actorTable).setAlias("a"));
@@ -314,7 +314,7 @@ public class MysqlTest extends AbstractJdbIntegrationTest {
                 + "Table[name=nicer_but_slower_film_list,type=VIEW,remarks=], "
                 + "Table[name=sales_by_film_category,type=VIEW,remarks=], "
                 + "Table[name=sales_by_store,type=VIEW,remarks=], " + "Table[name=staff_list,type=VIEW,remarks=]]",
-                Arrays.toString(schema.getTables()));
+                Arrays.toString(schema.getTables().toArray()));
 
         Table filmTable = schema.getTableByName("film");
         assertEquals(
@@ -331,10 +331,10 @@ public class MysqlTest extends AbstractJdbIntegrationTest {
                         + "Column[name=rating,columnNumber=10,type=CHAR,nullable=true,nativeType=ENUM,columnSize=5], "
                         + "Column[name=special_features,columnNumber=11,type=CHAR,nullable=true,nativeType=SET,columnSize=54], "
                         + "Column[name=last_update,columnNumber=12,type=TIMESTAMP,nullable=false,nativeType=TIMESTAMP,columnSize=19]]",
-                Arrays.toString(filmTable.getColumns()));
+                Arrays.toString(filmTable.getColumns().toArray()));
         assertEquals(
                 "[Relationship[primaryTable=language,primaryColumns=[language_id],foreignTable=film,foreignColumns=[language_id]], Relationship[primaryTable=language,primaryColumns=[language_id],foreignTable=film,foreignColumns=[original_language_id]], Relationship[primaryTable=film,primaryColumns=[film_id],foreignTable=film_actor,foreignColumns=[film_id]], Relationship[primaryTable=film,primaryColumns=[film_id],foreignTable=film_category,foreignColumns=[film_id]], Relationship[primaryTable=film,primaryColumns=[film_id],foreignTable=inventory,foreignColumns=[film_id]]]",
-                Arrays.toString(filmTable.getRelationships()));
+                Arrays.toString(filmTable.getRelationships().toArray()));
 
         assertEquals("[Table[name=actor,type=TABLE,remarks=], " + "Table[name=address,type=TABLE,remarks=], "
                 + "Table[name=category,type=TABLE,remarks=], " + "Table[name=city,type=TABLE,remarks=], "
@@ -349,7 +349,7 @@ public class MysqlTest extends AbstractJdbIntegrationTest {
                 + "Table[name=nicer_but_slower_film_list,type=VIEW,remarks=], "
                 + "Table[name=sales_by_film_category,type=VIEW,remarks=], "
                 + "Table[name=sales_by_store,type=VIEW,remarks=], " + "Table[name=staff_list,type=VIEW,remarks=]]",
-                Arrays.toString(schema.getTables()));
+                Arrays.toString(schema.getTables().toArray()));
 
         Table staffView = schema.getTableByName("staff_list");
         assertEquals(
@@ -361,7 +361,7 @@ public class MysqlTest extends AbstractJdbIntegrationTest {
                         + "Column[name=city,columnNumber=5,type=VARCHAR,nullable=false,nativeType=VARCHAR,columnSize=50], "
                         + "Column[name=country,columnNumber=6,type=VARCHAR,nullable=false,nativeType=VARCHAR,columnSize=50], "
                         + "Column[name=SID,columnNumber=7,type=TINYINT,nullable=false,nativeType=TINYINT UNSIGNED,columnSize=3]]",
-                Arrays.toString(staffView.getColumns()));
+                Arrays.toString(staffView.getColumns().toArray()));
     }
 
     public void testSplitQuery() throws Exception {
@@ -377,7 +377,7 @@ public class MysqlTest extends AbstractJdbIntegrationTest {
         assertNotNull(paymentTable);
         Column countryColumn = staffListTable.getColumnByName("country");
         assertNotNull(countryColumn);
-        Column paymentColumn = paymentTable.getColumns()[0];
+        Column paymentColumn = paymentTable.getColumns().get(0);
         assertNotNull(paymentColumn);
         Query q = new Query().from(staffListTable, "sl").from(paymentTable, "e").select(countryColumn, paymentColumn);
         assertEquals("SELECT sl.`country`, e.`payment_id` FROM sakila.`staff_list` sl, sakila.`payment` e",

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/OracleTest.java
----------------------------------------------------------------------
diff --git a/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/OracleTest.java b/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/OracleTest.java
index 6924362..826bc81 100644
--- a/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/OracleTest.java
+++ b/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/OracleTest.java
@@ -21,10 +21,16 @@ package org.apache.metamodel.jdbc.integrationtests;
 import java.sql.Connection;
 import java.sql.ResultSet;
 import java.util.Arrays;
+import java.util.Collection;
+import java.util.Optional;
+import java.util.Set;
 import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 
 import javax.swing.table.TableModel;
+import javax.swing.text.html.Option;
 
+import com.google.common.collect.Sets;
 import org.apache.metamodel.DataContext;
 import org.apache.metamodel.data.DataSet;
 import org.apache.metamodel.data.DataSetTableModel;
@@ -126,7 +132,7 @@ public class OracleTest extends AbstractJdbIntegrationTest {
             return;
         }
         DataContext dc = new JdbcDataContext(getConnection());
-        String[] schemaNames = dc.getSchemaNames();
+        String[] schemaNames = dc.getSchemaNames().toArray(new String[dc.getSchemas().size()]);
 
         String concatSchemas = Arrays.toString(schemaNames);
 
@@ -198,16 +204,19 @@ public class OracleTest extends AbstractJdbIntegrationTest {
                 + ",JdbcTable[name=JOB_HISTORY,type=TABLE,remarks=<null>]"
                 + ",JdbcTable[name=LOCATIONS,type=TABLE,remarks=<null>]"
                 + ",JdbcTable[name=REGIONS,type=TABLE,remarks=<null>]"
-                + ",JdbcTable[name=EMP_DETAILS_VIEW,type=VIEW,remarks=<null>]}", Arrays.toString(schema.getTables()));
+                + ",JdbcTable[name=EMP_DETAILS_VIEW,type=VIEW,remarks=<null>]}", Arrays.toString(schema.getTables().toArray()));
 
-        Relationship[] employeeRelationships = schema.getTableByName("EMPLOYEES").getRelationships();
-        assertEquals(
-                "{Relationship[primaryTable=EMPLOYEES,primaryColumns={EMPLOYEE_ID},foreignTable=DEPARTMENTS,foreignColumns={MANAGER_ID}],"
-                        + "Relationship[primaryTable=DEPARTMENTS,primaryColumns={DEPARTMENT_ID},foreignTable=EMPLOYEES,foreignColumns={DEPARTMENT_ID}],"
-                        + "Relationship[primaryTable=EMPLOYEES,primaryColumns={EMPLOYEE_ID},foreignTable=EMPLOYEES,foreignColumns={MANAGER_ID}],"
-                        + "Relationship[primaryTable=JOBS,primaryColumns={JOB_ID},foreignTable=EMPLOYEES,foreignColumns={JOB_ID}],"
-                        + "Relationship[primaryTable=EMPLOYEES,primaryColumns={EMPLOYEE_ID},foreignTable=JOB_HISTORY,foreignColumns={EMPLOYEE_ID}]}",
-                Arrays.toString(employeeRelationships));
+        Collection<Relationship> employeeRelationships = schema.getTableByName("EMPLOYEES").getRelationships();
+
+        Set<String> employeeRelStrings = employeeRelationships.stream().map(rel -> rel.toString()).collect(Collectors.toSet());
+
+        assertEquals(Sets.newHashSet(
+                "Relationship[primaryTable=EMPLOYEES,primaryColumns={EMPLOYEE_ID},foreignTable=DEPARTMENTS,foreignColumns={MANAGER_ID}]",
+                        "Relationship[primaryTable=DEPARTMENTS,primaryColumns={DEPARTMENT_ID},foreignTable=EMPLOYEES,foreignColumns={DEPARTMENT_ID}]",
+                        "Relationship[primaryTable=EMPLOYEES,primaryColumns={EMPLOYEE_ID},foreignTable=EMPLOYEES,foreignColumns={MANAGER_ID}]",
+                        "Relationship[primaryTable=JOBS,primaryColumns={JOB_ID},foreignTable=EMPLOYEES,foreignColumns={JOB_ID}]",
+                        "Relationship[primaryTable=EMPLOYEES,primaryColumns={EMPLOYEE_ID},foreignTable=JOB_HISTORY,foreignColumns={EMPLOYEE_ID}]"),
+                employeeRelStrings);
 
         assertEquals(
                 "{JdbcColumn[name=EMPLOYEE_ID,columnNumber=0,type=DECIMAL,nullable=false,nativeType=NUMBER,columnSize=6],"
@@ -221,14 +230,14 @@ public class OracleTest extends AbstractJdbIntegrationTest {
                         + "JdbcColumn[name=COMMISSION_PCT,columnNumber=8,type=DECIMAL,nullable=true,nativeType=NUMBER,columnSize=2],"
                         + "JdbcColumn[name=MANAGER_ID,columnNumber=9,type=DECIMAL,nullable=true,nativeType=NUMBER,columnSize=6],"
                         + "JdbcColumn[name=DEPARTMENT_ID,columnNumber=10,type=DECIMAL,nullable=true,nativeType=NUMBER,columnSize=4]}",
-                Arrays.toString(schema.getTableByName("EMPLOYEES").getColumns()));
+                Arrays.toString(schema.getTableByName("EMPLOYEES").getColumns().toArray()));
 
         assertEquals(
                 "{JdbcColumn[name=DEPARTMENT_ID,columnNumber=0,type=DECIMAL,nullable=false,nativeType=NUMBER,columnSize=4],"
                         + "JdbcColumn[name=DEPARTMENT_NAME,columnNumber=1,type=VARCHAR,nullable=false,nativeType=VARCHAR2,columnSize=30],"
                         + "JdbcColumn[name=MANAGER_ID,columnNumber=2,type=DECIMAL,nullable=true,nativeType=NUMBER,columnSize=6],"
                         + "JdbcColumn[name=LOCATION_ID,columnNumber=3,type=DECIMAL,nullable=true,nativeType=NUMBER,columnSize=4]}",
-                Arrays.toString(schema.getTableByName("DEPARTMENTS").getColumns()));
+                Arrays.toString(schema.getTableByName("DEPARTMENTS").getColumns().toArray()));
     }
 
     public void testExecuteQuery() throws Exception {
@@ -238,12 +247,12 @@ public class OracleTest extends AbstractJdbIntegrationTest {
         Schema schema = getDataContext().getSchemaByName("HR");
         Table employeeTable = schema.getTableByName("EMPLOYEES");
         Table departmentsTable = schema.getTableByName("DEPARTMENTS");
-        Relationship relationship = employeeTable.getRelationships(departmentsTable)[0];
-        assertEquals(
-                "Relationship[primaryTable=EMPLOYEES,primaryColumns={EMPLOYEE_ID},foreignTable=DEPARTMENTS,foreignColumns={MANAGER_ID}]",
-                relationship.toString());
+        Optional<Relationship> relationship = employeeTable.getRelationships(departmentsTable).stream()
+                .filter(rel-> rel.toString().equals("Relationship[primaryTable=EMPLOYEES,primaryColumns={EMPLOYEE_ID},foreignTable=DEPARTMENTS,foreignColumns={MANAGER_ID}]"))
+                .findFirst();
+        assertTrue(relationship.isPresent());
 
-        Query q = new Query().from(new FromItem(JoinType.INNER, relationship)).select(
+        Query q = new Query().from(new FromItem(JoinType.INNER, relationship.get())).select(
                 employeeTable.getColumnByName("EMAIL"), departmentsTable.getColumnByName("DEPARTMENT_NAME"));
         q.getSelectClause().getItem(0).setAlias("e-mail");
 

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/PostgresqlTest.java
----------------------------------------------------------------------
diff --git a/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/PostgresqlTest.java b/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/PostgresqlTest.java
index 6f8fb09..a34be81 100644
--- a/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/PostgresqlTest.java
+++ b/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/PostgresqlTest.java
@@ -21,11 +21,7 @@ package org.apache.metamodel.jdbc.integrationtests;
 import java.lang.reflect.Method;
 import java.sql.Connection;
 import java.sql.DatabaseMetaData;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Optional;
-import java.util.Map;
+import java.util.*;
 import java.util.concurrent.TimeUnit;
 
 import javax.swing.table.TableModel;
@@ -455,15 +451,15 @@ public class PostgresqlTest extends AbstractJdbIntegrationTest {
         try {
             DataSet ds = dc.query().from("my_table").select("some_double").execute();
             assertTrue(ds.next());
-            Double minVal = (Double) ds.getRow().getValue(ds.getSelectItems()[0]);
+            Double minVal = (Double) ds.getRow().getValue(ds.getSelectItems().get(0));
             assertTrue(ds.next());
-            Double maxVal = (Double) ds.getRow().getValue(ds.getSelectItems()[0]);
+            Double maxVal = (Double) ds.getRow().getValue(ds.getSelectItems().get(0));
             assertTrue(ds.next());
-            Double negInf = (Double) ds.getRow().getValue(ds.getSelectItems()[0]);
+            Double negInf = (Double) ds.getRow().getValue(ds.getSelectItems().get(0));
             assertTrue(ds.next());
-            Double posInf = (Double) ds.getRow().getValue(ds.getSelectItems()[0]);
+            Double posInf = (Double) ds.getRow().getValue(ds.getSelectItems().get(0));
             assertTrue(ds.next());
-            Double nAn = (Double) ds.getRow().getValue(ds.getSelectItems()[0]);
+            Double nAn = (Double) ds.getRow().getValue(ds.getSelectItems().get(0));
             assertFalse(ds.next());
 
             assertEquals(Double.MIN_VALUE, minVal, DELTA);
@@ -604,7 +600,7 @@ public class PostgresqlTest extends AbstractJdbIntegrationTest {
                     Table table = cb.createTable(schema, "my_table").withColumn("id").ofType(ColumnType.INTEGER)
                             .ofNativeType("SERIAL").nullable(false).withColumn("person name").ofSize(255).withColumn(
                                     "age").ofType(ColumnType.INTEGER).execute();
-                    assertEquals("[id, person name, age]", Arrays.toString(table.getColumnNames()));
+                    assertEquals("[id, person name, age]", Arrays.toString(table.getColumnNames().toArray()));
                     assertEquals(
                             "Column[name=id,columnNumber=0,type=INTEGER,nullable=false,nativeType=serial,columnSize=10]",
                             table.getColumnByName("id").toString());
@@ -670,7 +666,7 @@ public class PostgresqlTest extends AbstractJdbIntegrationTest {
                     Table table = cb.createTable(schema, "my_table").withColumn("id").ofType(ColumnType.INTEGER)
                             .ofNativeType("SERIAL").nullable(false).withColumn("person name").ofSize(255).withColumn(
                                     "age").ofType(ColumnType.INTEGER).execute();
-                    assertEquals("[id, person name, age]", Arrays.toString(table.getColumnNames()));
+                    assertEquals("[id, person name, age]", Arrays.toString(table.getColumnNames().toArray()));
                     assertEquals(
                             "Column[name=id,columnNumber=0,type=INTEGER,nullable=false,nativeType=serial,columnSize=10]",
                             table.getColumnByName("id").toString());
@@ -723,7 +719,7 @@ public class PostgresqlTest extends AbstractJdbIntegrationTest {
                     Table table = cb.createTable(schema, "my_table").withColumn("id").ofType(ColumnType.INTEGER)
                             .ofNativeType("SERIAL").nullable(false).withColumn("person name").ofSize(255).withColumn(
                                     "age").ofType(ColumnType.INTEGER).execute();
-                    assertEquals("[id, person name, age]", Arrays.toString(table.getColumnNames()));
+                    assertEquals("[id, person name, age]", Arrays.toString(table.getColumnNames().toArray()));
                     assertEquals(
                             "Column[name=id,columnNumber=0,type=INTEGER,nullable=false,nativeType=serial,columnSize=10]",
                             table.getColumnByName("id").toString());
@@ -781,8 +777,8 @@ public class PostgresqlTest extends AbstractJdbIntegrationTest {
         }
 
         DataContext dc = new JdbcDataContext(getConnection());
-        Schema[] schemas = dc.getSchemas();
-        assertTrue(schemas.length >= 3);
+        List<Schema> schemas = dc.getSchemas();
+        assertTrue(schemas.size() >= 3);
 
         assertNotNull(dc.getSchemaByName("information_schema"));
         assertNotNull(dc.getSchemaByName("pg_catalog"));
@@ -794,7 +790,7 @@ public class PostgresqlTest extends AbstractJdbIntegrationTest {
                 + "Table[name=cust_hist,type=TABLE,remarks=null], " + "Table[name=customers,type=TABLE,remarks=null], "
                 + "Table[name=inventory,type=TABLE,remarks=null], " + "Table[name=orderlines,type=TABLE,remarks=null], "
                 + "Table[name=orders,type=TABLE,remarks=null], " + "Table[name=products,type=TABLE,remarks=null], "
-                + "Table[name=reorder,type=TABLE,remarks=null]]", Arrays.toString(schema.getTables()));
+                + "Table[name=reorder,type=TABLE,remarks=null]]", Arrays.toString(schema.getTables().toArray()));
 
         Table productsTable = schema.getTableByName("products");
         assertEquals(
@@ -805,7 +801,7 @@ public class PostgresqlTest extends AbstractJdbIntegrationTest {
                         + "Column[name=price,columnNumber=4,type=NUMERIC,nullable=false,nativeType=numeric,columnSize=12], "
                         + "Column[name=special,columnNumber=5,type=SMALLINT,nullable=true,nativeType=int2,columnSize=5], "
                         + "Column[name=common_prod_id,columnNumber=6,type=INTEGER,nullable=false,nativeType=int4,columnSize=10]]",
-                Arrays.toString(productsTable.getColumns()));
+                Arrays.toString(productsTable.getColumns().toArray()));
         Table customersTable = schema.getTableByName("customers");
         assertEquals(
                 "[Column[name=customerid,columnNumber=0,type=INTEGER,nullable=false,nativeType=serial,columnSize=10], "
@@ -828,17 +824,19 @@ public class PostgresqlTest extends AbstractJdbIntegrationTest {
                         + "Column[name=age,columnNumber=17,type=SMALLINT,nullable=true,nativeType=int2,columnSize=5], "
                         + "Column[name=income,columnNumber=18,type=INTEGER,nullable=true,nativeType=int4,columnSize=10], "
                         + "Column[name=gender,columnNumber=19,type=VARCHAR,nullable=true,nativeType=varchar,columnSize=1]]",
-                Arrays.toString(customersTable.getColumns()));
-        Relationship[] relations = customersTable.getRelationships();
-        assertEquals(2, relations.length);
+                Arrays.toString(customersTable.getColumns().toArray()));
+        List<Relationship> relations = new ArrayList<>(customersTable.getRelationships());
+        // bit o a hack to ensure ordering
+        Collections.sort(relations, (rel1,rel2) -> rel1.getForeignTable().getName().compareTo(rel2.getForeignTable().getName()));
+        assertEquals(2, relations.size());
         assertEquals(
                 "[Relationship[primaryTable=customers,primaryColumns=[customerid],foreignTable=cust_hist,foreignColumns=[customerid]], "
                         + "Relationship[primaryTable=customers,primaryColumns=[customerid],foreignTable=orders,foreignColumns=[customerid]]]",
-                Arrays.toString(relations));
-        assertEquals("Table[name=customers,type=TABLE,remarks=null]", relations[0].getPrimaryTable().toString());
-        assertEquals("Table[name=cust_hist,type=TABLE,remarks=null]", relations[0].getForeignTable().toString());
-        assertEquals("Table[name=customers,type=TABLE,remarks=null]", relations[1].getPrimaryTable().toString());
-        assertEquals("Table[name=orders,type=TABLE,remarks=null]", relations[1].getForeignTable().toString());
+                Arrays.toString(relations.toArray()));
+        assertEquals("Table[name=customers,type=TABLE,remarks=null]", relations.get(0).getPrimaryTable().toString());
+        assertEquals("Table[name=cust_hist,type=TABLE,remarks=null]", relations.get(0).getForeignTable().toString());
+        assertEquals("Table[name=customers,type=TABLE,remarks=null]", relations.get(1).getPrimaryTable().toString());
+        assertEquals("Table[name=orders,type=TABLE,remarks=null]", relations.get(1).getForeignTable().toString());
 
         Table ordersTable = schema.getTableByName("orderlines");
         assertEquals(
@@ -847,7 +845,7 @@ public class PostgresqlTest extends AbstractJdbIntegrationTest {
                         + "Column[name=prod_id,columnNumber=2,type=INTEGER,nullable=false,nativeType=int4,columnSize=10], "
                         + "Column[name=quantity,columnNumber=3,type=SMALLINT,nullable=false,nativeType=int2,columnSize=5], "
                         + "Column[name=orderdate,columnNumber=4,type=DATE,nullable=false,nativeType=date,columnSize=13]]",
-                Arrays.toString(ordersTable.getColumns()));
+                Arrays.toString(ordersTable.getColumns().toArray()));
     }
 
     public void testExecuteQueryInPublicSchema() throws Exception {
@@ -945,7 +943,7 @@ public class PostgresqlTest extends AbstractJdbIntegrationTest {
                     Table table = cb.createTable(schema, "my_table").withColumn("id").ofType(ColumnType.INTEGER)
                             .ofNativeType("SERIAL").nullable(false).withColumn("person name").ofSize(255).withColumn(
                                     "age").ofType(ColumnType.INTEGER).execute();
-                    assertEquals("[id, person name, age]", Arrays.toString(table.getColumnNames()));
+                    assertEquals("[id, person name, age]", Arrays.toString(table.getColumnNames().toArray()));
                     assertEquals(
                             "Column[name=id,columnNumber=0,type=INTEGER,nullable=false,nativeType=serial,columnSize=10]",
                             table.getColumnByName("id").toString());

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/SQLServerJtdsDriverTest.java
----------------------------------------------------------------------
diff --git a/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/SQLServerJtdsDriverTest.java b/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/SQLServerJtdsDriverTest.java
index c72d2f3..9926b64 100644
--- a/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/SQLServerJtdsDriverTest.java
+++ b/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/SQLServerJtdsDriverTest.java
@@ -161,7 +161,7 @@ public class SQLServerJtdsDriverTest extends AbstractJdbIntegrationTest {
         // the jdbc driver represents the date as a VARCHAR
         assertEquals("[Column[name=id,columnNumber=0,type=INTEGER,nullable=false,nativeType=int,columnSize=10], "
                 + "Column[name=birthdate,columnNumber=1,type=VARCHAR,nullable=true,nativeType=date,columnSize=10]]",
-                Arrays.toString(table.getColumns()));
+                Arrays.toString(table.getColumns().toArray()));
 
         DataSet ds = dc.query().from(table).select("id").and("birthdate").execute();
         assertTrue(ds.next());
@@ -184,7 +184,7 @@ public class SQLServerJtdsDriverTest extends AbstractJdbIntegrationTest {
                 TableType.VIEW }, DATABASE_NAME);
         Query q = new Query().select("Name").from("Production.Product").where("COlor IS NOT NULL").setMaxRows(5);
         DataSet dataSet = strategy.executeQuery(q);
-        assertEquals("[Name]", Arrays.toString(dataSet.getSelectItems()));
+        assertEquals("[Name]", Arrays.toString(dataSet.getSelectItems().toArray()));
         assertTrue(dataSet.next());
         assertEquals("Row[values=[LL Crankarm]]", dataSet.getRow().toString());
         assertTrue(dataSet.next());
@@ -200,7 +200,7 @@ public class SQLServerJtdsDriverTest extends AbstractJdbIntegrationTest {
         }
         JdbcDataContext dc = new JdbcDataContext(getConnection(), new TableType[] { TableType.TABLE, TableType.VIEW },
                 DATABASE_NAME);
-        Schema[] schemas = dc.getSchemas();
+        Schema[] schemas = dc.getSchemas().toArray(new Schema[dc.getSchemas().size()]);
 
         assertEquals(8, schemas.length);
         assertEquals("Schema[name=HumanResources]", schemas[0].toString());
@@ -228,7 +228,7 @@ public class SQLServerJtdsDriverTest extends AbstractJdbIntegrationTest {
         assertEquals("dbo", schema.getName());
 
         assertEquals("[Sales, HumanResources, dbo, Purchasing, sys, Production, INFORMATION_SCHEMA, Person]",
-                Arrays.toString(strategy.getSchemaNames()));
+                Arrays.toString(strategy.getSchemaNames().toArray()));
     }
 
     public void testQueryRewriterQuoteAliases() throws Exception {

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/SQLServerMicrosoftDriverTest.java
----------------------------------------------------------------------
diff --git a/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/SQLServerMicrosoftDriverTest.java b/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/SQLServerMicrosoftDriverTest.java
index 2fcd0ff..f297622 100644
--- a/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/SQLServerMicrosoftDriverTest.java
+++ b/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/SQLServerMicrosoftDriverTest.java
@@ -56,7 +56,7 @@ public class SQLServerMicrosoftDriverTest extends AbstractJdbIntegrationTest {
                 new TableType[] { TableType.TABLE, TableType.VIEW }, DATABASE_NAME);
         Query q = new Query().select("Name").from("Production.Product").where("COlor IS NOT NULL").setMaxRows(5);
         DataSet dataSet = strategy.executeQuery(q);
-        assertEquals("[Name]", Arrays.toString(dataSet.getSelectItems()));
+        assertEquals("[Name]", Arrays.toString(dataSet.getSelectItems().toArray()));
         assertTrue(dataSet.next());
         assertEquals("Row[values=[LL Crankarm]]", dataSet.getRow().toString());
         assertTrue(dataSet.next());
@@ -73,7 +73,7 @@ public class SQLServerMicrosoftDriverTest extends AbstractJdbIntegrationTest {
         
         JdbcDataContext dc = new JdbcDataContext(getConnection(), new TableType[] { TableType.TABLE, TableType.VIEW },
                 DATABASE_NAME);
-        Schema[] schemas = dc.getSchemas();
+        Schema[] schemas = dc.getSchemas().toArray(new Schema[dc.getSchemas().size()]);
 
         assertEquals(8, schemas.length);
         assertEquals("Schema[name=HumanResources]", schemas[0].toString());
@@ -100,7 +100,7 @@ public class SQLServerMicrosoftDriverTest extends AbstractJdbIntegrationTest {
                 TableType.GLOBAL_TEMPORARY }, DATABASE_NAME);
 
         assertEquals("[Sales, HumanResources, dbo, Purchasing, sys, Production, INFORMATION_SCHEMA, Person]",
-                Arrays.toString(strategy.getSchemaNames()));
+                Arrays.toString(strategy.getSchemaNames().toArray()));
 
         assertEquals("Schema[name=dbo]", strategy.getDefaultSchema().toString());
     }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/json/src/main/java/org/apache/metamodel/json/JsonDataContext.java
----------------------------------------------------------------------
diff --git a/json/src/main/java/org/apache/metamodel/json/JsonDataContext.java b/json/src/main/java/org/apache/metamodel/json/JsonDataContext.java
index 90f726d..6578d7c 100644
--- a/json/src/main/java/org/apache/metamodel/json/JsonDataContext.java
+++ b/json/src/main/java/org/apache/metamodel/json/JsonDataContext.java
@@ -20,6 +20,8 @@ package org.apache.metamodel.json;
 
 import java.io.File;
 import java.io.InputStream;
+import java.util.List;
+import java.util.stream.Collectors;
 
 import org.apache.metamodel.DataContext;
 import org.apache.metamodel.MetaModelException;
@@ -85,9 +87,9 @@ public class JsonDataContext extends QueryPostprocessDataContext implements Docu
     }
 
     @Override
-    protected DataSet materializeMainSchemaTable(Table table, Column[] columns, int maxRows) {
+    protected DataSet materializeMainSchemaTable(Table table, List<Column> columns, int maxRows) {
         final DocumentConverter documentConverter = _schemaBuilder.getDocumentConverter(table);
-        final SelectItem[] selectItems = MetaModelHelper.createSelectItems(columns);
+        final List<SelectItem> selectItems = columns.stream().map(SelectItem::new).collect(Collectors.toList());
         final DataSetHeader header = new CachingDataSetHeader(selectItems);
         final DocumentSource documentSource = getDocumentSourceForTable(table.getName());
 

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/json/src/test/java/org/apache/metamodel/json/JsonDataContextTest.java
----------------------------------------------------------------------
diff --git a/json/src/test/java/org/apache/metamodel/json/JsonDataContextTest.java b/json/src/test/java/org/apache/metamodel/json/JsonDataContextTest.java
index 0dba661..bfc1283 100644
--- a/json/src/test/java/org/apache/metamodel/json/JsonDataContextTest.java
+++ b/json/src/test/java/org/apache/metamodel/json/JsonDataContextTest.java
@@ -55,7 +55,7 @@ public class JsonDataContextTest extends TestCase {
         final Table table = dc.getDefaultSchema().getTable(0);
         assertEquals("tbl", table.getName());
 
-        assertEquals("[cl]", Arrays.toString(table.getColumnNames()));
+        assertEquals("[cl]", Arrays.toString(table.getColumnNames().toArray()));
 
         final DataSet dataSet = dc.query().from("tbl").select("cl").execute();
         assertTrue(dataSet.next());
@@ -68,10 +68,9 @@ public class JsonDataContextTest extends TestCase {
 
     private void runParseabilityTest(JsonDataContext dc) {
         final Table table = dc.getDefaultSchema().getTable(0);
-        assertEquals("[country, gender, id, name]", Arrays.toString(table.getColumnNames()));
-        final Column[] columns = table.getColumns();
+        assertEquals("[country, gender, id, name]", Arrays.toString(table.getColumnNames().toArray()));
 
-        final DataSet dataSet = dc.materializeMainSchemaTable(table, columns, 100000);
+        final DataSet dataSet = dc.materializeMainSchemaTable(table, table.getColumns(), 100000);
         assertTrue(dataSet.next());
         assertEquals("Row[values=[US, null, 1234, John Doe]]", dataSet.getRow().toString());
         assertTrue(dataSet.next());
@@ -105,7 +104,7 @@ public class JsonDataContextTest extends TestCase {
         final JsonDataContext dataContext = new JsonDataContext(resource);
 
         final Schema schema = dataContext.getDefaultSchema();
-        assertEquals("[nested_fields.json]", Arrays.toString(schema.getTableNames()));
+        assertEquals("[nested_fields.json]", Arrays.toString(schema.getTableNames().toArray()));
 
         final DataSet ds = dataContext.query().from(schema.getTable(0))
                 .select(FunctionType.MAP_VALUE, "name", new Object[] { "first" }).execute();
@@ -125,7 +124,7 @@ public class JsonDataContextTest extends TestCase {
         final JsonDataContext dataContext = new JsonDataContext(resource);
 
         final Schema schema = dataContext.getDefaultSchema();
-        assertEquals("[nested_fields.json]", Arrays.toString(schema.getTableNames()));
+        assertEquals("[nested_fields.json]", Arrays.toString(schema.getTableNames().toArray()));
 
         final DataSet ds = dataContext.query().from(schema.getTable(0)).select("name.first").execute();
         try {

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/mongodb/mongo2/src/main/java/org/apache/metamodel/mongodb/mongo2/MongoDbDataContext.java
----------------------------------------------------------------------
diff --git a/mongodb/mongo2/src/main/java/org/apache/metamodel/mongodb/mongo2/MongoDbDataContext.java b/mongodb/mongo2/src/main/java/org/apache/metamodel/mongodb/mongo2/MongoDbDataContext.java
index 84ae8db..d5d0432 100644
--- a/mongodb/mongo2/src/main/java/org/apache/metamodel/mongodb/mongo2/MongoDbDataContext.java
+++ b/mongodb/mongo2/src/main/java/org/apache/metamodel/mongodb/mongo2/MongoDbDataContext.java
@@ -26,6 +26,7 @@ import java.util.Set;
 import java.util.SortedMap;
 import java.util.TreeMap;
 import java.util.regex.Pattern;
+import java.util.stream.Collectors;
 
 import org.apache.metamodel.DataContext;
 import org.apache.metamodel.MetaModelException;
@@ -200,8 +201,7 @@ public class MongoDbDataContext extends QueryPostprocessDataContext implements U
             for (SimpleTableDef tableDef : _tableDefs) {
 
                 MutableTable table = tableDef.toTable().setSchema(schema);
-                Column[] rowIdColumns = table.getColumnsOfType(ColumnType.ROWID);
-                for (Column column : rowIdColumns) {
+                for (Column column : table.getColumnsOfType(ColumnType.ROWID)) {
                     if (column instanceof MutableColumn) {
                         ((MutableColumn) column).setPrimaryKey(true);
                     }
@@ -286,10 +286,7 @@ public class MongoDbDataContext extends QueryPostprocessDataContext implements U
                     logger.debug("Query can be expressed in full MongoDB, no post processing needed.");
 
                     // prepare for a non-post-processed query
-                    Column[] columns = new Column[selectItems.size()];
-                    for (int i = 0; i < columns.length; i++) {
-                        columns[i] = selectItems.get(i).getColumn();
-                    }
+
 
                     // checking if the query is a primary key lookup query
                     if (whereItems.size() == 1) {
@@ -324,16 +321,15 @@ public class MongoDbDataContext extends QueryPostprocessDataContext implements U
                     }
 
                     if (thereIsAtLeastOneAlias) {
-                        final SelectItem[] selectItemsAsArray = selectItems.toArray(new SelectItem[selectItems.size()]);
                         final DataSet dataSet = materializeMainSchemaTableInternal(
                                 table,
-                                selectItemsAsArray,
+                                selectItems,
                                 whereItems,
                                 firstRow,
                                 maxRows, false);
                         return dataSet;
                     } else {
-                        final DataSet dataSet = materializeMainSchemaTableInternal(table, columns, whereItems, firstRow,
+                        final DataSet dataSet = materializeMainSchemaTableInternal(table, selectItems, whereItems, firstRow,
                                 maxRows, false);
                         return dataSet;
                     }
@@ -345,14 +341,9 @@ public class MongoDbDataContext extends QueryPostprocessDataContext implements U
         return super.executeQuery(query);
     }
 
-    private DataSet materializeMainSchemaTableInternal(Table table, Column[] columns, List<FilterItem> whereItems,
-            int firstRow, int maxRows, boolean queryPostProcessed) {
-        DBCursor cursor = getCursor(table, whereItems, firstRow, maxRows);
 
-        return new MongoDbDataSet(cursor, columns, queryPostProcessed);
-    }
 
-    private DataSet materializeMainSchemaTableInternal(Table table, SelectItem[] selectItems,
+    private DataSet materializeMainSchemaTableInternal(Table table, List<SelectItem> selectItems,
             List<FilterItem> whereItems, int firstRow, int maxRows, boolean queryPostProcessed) {
         DBCursor cursor = getCursor(table, whereItems, firstRow, maxRows);
 
@@ -478,13 +469,25 @@ public class MongoDbDataContext extends QueryPostprocessDataContext implements U
     }
 
     @Override
-    protected DataSet materializeMainSchemaTable(Table table, Column[] columns, int maxRows) {
-        return materializeMainSchemaTableInternal(table, columns, null, 1, maxRows, true);
+    protected DataSet materializeMainSchemaTable(Table table, List<Column> columns, int maxRows) {
+        return materializeMainSchemaTableInternal(
+                table,
+                columns.stream().map(SelectItem::new).collect(Collectors.toList()),
+                null,
+                1,
+                maxRows,
+                true);
     }
 
     @Override
-    protected DataSet materializeMainSchemaTable(Table table, Column[] columns, int firstRow, int maxRows) {
-        return materializeMainSchemaTableInternal(table, columns, null, firstRow, maxRows, true);
+    protected DataSet materializeMainSchemaTable(Table table, List<Column> columns, int firstRow, int maxRows) {
+        return materializeMainSchemaTableInternal(
+                table,
+                columns.stream().map(SelectItem::new).collect(Collectors.toList()),
+                null,
+                firstRow,
+                maxRows,
+                true);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/mongodb/mongo2/src/main/java/org/apache/metamodel/mongodb/mongo2/MongoDbDataSet.java
----------------------------------------------------------------------
diff --git a/mongodb/mongo2/src/main/java/org/apache/metamodel/mongodb/mongo2/MongoDbDataSet.java b/mongodb/mongo2/src/main/java/org/apache/metamodel/mongodb/mongo2/MongoDbDataSet.java
index ea7cd9e..3197945 100644
--- a/mongodb/mongo2/src/main/java/org/apache/metamodel/mongodb/mongo2/MongoDbDataSet.java
+++ b/mongodb/mongo2/src/main/java/org/apache/metamodel/mongodb/mongo2/MongoDbDataSet.java
@@ -29,6 +29,8 @@ import org.slf4j.LoggerFactory;
 import com.mongodb.DBCursor;
 import com.mongodb.DBObject;
 
+import java.util.List;
+
 final class MongoDbDataSet extends AbstractDataSet {
 
     private static final Logger logger = LoggerFactory.getLogger(MongoDbDataSet.class);
@@ -39,14 +41,9 @@ final class MongoDbDataSet extends AbstractDataSet {
     private boolean _closed;
     private volatile DBObject _dbObject;
 
-    public MongoDbDataSet(DBCursor cursor, Column[] columns, boolean queryPostProcessed) {
-        super(columns);
-        _cursor = cursor;
-        _queryPostProcessed = queryPostProcessed;
-        _closed = false;
-    }
 
-    public MongoDbDataSet(DBCursor cursor, SelectItem[] selectItems, boolean queryPostProcessed) {
+
+    public MongoDbDataSet(DBCursor cursor, List<SelectItem> selectItems, boolean queryPostProcessed) {
         super(selectItems);
         _cursor = cursor;
         _queryPostProcessed = queryPostProcessed;

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/mongodb/mongo2/src/test/java/org/apache/metamodel/mongodb/mongo2/MongoDbDataContextTest.java
----------------------------------------------------------------------
diff --git a/mongodb/mongo2/src/test/java/org/apache/metamodel/mongodb/mongo2/MongoDbDataContextTest.java b/mongodb/mongo2/src/test/java/org/apache/metamodel/mongodb/mongo2/MongoDbDataContextTest.java
index da99955..398c408 100644
--- a/mongodb/mongo2/src/test/java/org/apache/metamodel/mongodb/mongo2/MongoDbDataContextTest.java
+++ b/mongodb/mongo2/src/test/java/org/apache/metamodel/mongodb/mongo2/MongoDbDataContextTest.java
@@ -280,7 +280,7 @@ public class MongoDbDataContextTest extends MongoDbTestCase {
 
         assertTrue(Arrays.asList(dataContext.getDefaultSchema().getTableNames()).contains(getCollectionName()));
         Table table = dataContext.getDefaultSchema().getTableByName(getCollectionName());
-        assertEquals("[_id, baz, foo, id, list, name]", Arrays.toString(table.getColumnNames()));
+        assertEquals("[_id, baz, foo, id, list, name]", Arrays.toString(table.getColumnNames().toArray()));
 
         assertEquals(ColumnType.MAP, table.getColumnByName("baz").getType());
         assertEquals(ColumnType.STRING, table.getColumnByName("foo").getType());
@@ -460,7 +460,7 @@ public class MongoDbDataContextTest extends MongoDbTestCase {
         // do a query that we cannot push to mongo
         // Replace column index 0 by 1
         ds = dataContext.query().from(getCollectionName())
-                .select(FunctionType.SUM, dataContext.getDefaultSchema().getTables()[0].getColumnByName("id"))
+                .select(FunctionType.SUM, dataContext.getDefaultSchema().getTables().get(0).getColumnByName("id"))
                 .where("foo").isEquals("bar").execute();
         assertEquals(InMemoryDataSet.class, ds.getClass());
 
@@ -478,8 +478,7 @@ public class MongoDbDataContextTest extends MongoDbTestCase {
         dc.executeUpdate(new UpdateScript() {
             @Override
             public void run(UpdateCallback callback) {
-                Table[] tables = defaultSchema.getTables();
-                for (Table table : tables) {
+                for (Table table : defaultSchema.getTables()) {
                     callback.deleteFrom(table).execute();
                 }
             }
@@ -514,8 +513,8 @@ public class MongoDbDataContextTest extends MongoDbTestCase {
         dataSet = dc.query().from("some_entries").selectCount().execute();
         dataSet.close();
         assertTrue(dataSet.next());
-        assertEquals(1, dataSet.getSelectItems().length);
-        assertEquals(SelectItem.getCountAllItem(), dataSet.getSelectItems()[0]);
+        assertEquals(1, dataSet.getSelectItems().size());
+        assertEquals(SelectItem.getCountAllItem(), dataSet.getSelectItems().get(0));
         assertEquals(4l, dataSet.getRow().getValue(SelectItem.getCountAllItem()));
         assertFalse(dataSet.next());
         assertEquals(InMemoryDataSet.class, dataSet.getClass());
@@ -524,8 +523,8 @@ public class MongoDbDataContextTest extends MongoDbTestCase {
         dataSet = dc.query().from("some_entries").selectCount().where("foo").greaterThan(2).execute();
         dataSet.close();
         assertTrue(dataSet.next());
-        assertEquals(1, dataSet.getSelectItems().length);
-        assertEquals(SelectItem.getCountAllItem(), dataSet.getSelectItems()[0]);
+        assertEquals(1, dataSet.getSelectItems().size());
+        assertEquals(SelectItem.getCountAllItem(), dataSet.getSelectItems().get(0));
         assertEquals(2l, dataSet.getRow().getValue(SelectItem.getCountAllItem()));
         assertFalse(dataSet.next());
         assertEquals(InMemoryDataSet.class, dataSet.getClass());
@@ -657,7 +656,7 @@ public class MongoDbDataContextTest extends MongoDbTestCase {
                 "addresses[5].foobar" }));
 
         final DataSet ds1 = dc.executeQuery("select gender AS my_gender, name.first AS my_name from my_collection where gender LIKE '%MALE%'");
-        final SelectItem[] selectItems = ds1.getSelectItems();
+        final SelectItem[] selectItems = ds1.getSelectItems().toArray(new SelectItem[ds1.getSelectItems().size()]);
         SelectItem firstSelectItem = selectItems[0];
         SelectItem secondSelectItem = selectItems[1];
         try {

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/mongodb/mongo2/src/test/java/org/apache/metamodel/mongodb/mongo2/MongoDbDataCopyer.java
----------------------------------------------------------------------
diff --git a/mongodb/mongo2/src/test/java/org/apache/metamodel/mongodb/mongo2/MongoDbDataCopyer.java b/mongodb/mongo2/src/test/java/org/apache/metamodel/mongodb/mongo2/MongoDbDataCopyer.java
index b0aa9dc..becda44 100644
--- a/mongodb/mongo2/src/test/java/org/apache/metamodel/mongodb/mongo2/MongoDbDataCopyer.java
+++ b/mongodb/mongo2/src/test/java/org/apache/metamodel/mongodb/mongo2/MongoDbDataCopyer.java
@@ -21,6 +21,7 @@ package org.apache.metamodel.mongodb.mongo2;
 import java.io.File;
 import java.sql.Connection;
 import java.sql.DriverManager;
+import java.util.List;
 
 import org.apache.metamodel.DataContext;
 import org.apache.metamodel.UpdateCallback;
@@ -95,7 +96,7 @@ public class MongoDbDataCopyer {
                 final Table sourceTable = getSourceTable();
                 final Table targetTable = callback.createTable(targetDataContext.getDefaultSchema(), _collectionName)
                         .like(sourceTable).execute();
-                final Column[] sourceColumns = sourceTable.getColumns();
+                final List<Column> sourceColumns = sourceTable.getColumns();
                 final DataSet dataSet = _sourceDataContext.query().from(sourceTable).select(sourceColumns).execute();
                 while (dataSet.next()) {
                     final Row row = dataSet.getRow();

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/mongodb/mongo3/src/main/java/org/apache/metamodel/mongodb/mongo3/MongoDbDataContext.java
----------------------------------------------------------------------
diff --git a/mongodb/mongo3/src/main/java/org/apache/metamodel/mongodb/mongo3/MongoDbDataContext.java b/mongodb/mongo3/src/main/java/org/apache/metamodel/mongodb/mongo3/MongoDbDataContext.java
index ddb18d5..9bdec81 100644
--- a/mongodb/mongo3/src/main/java/org/apache/metamodel/mongodb/mongo3/MongoDbDataContext.java
+++ b/mongodb/mongo3/src/main/java/org/apache/metamodel/mongodb/mongo3/MongoDbDataContext.java
@@ -27,6 +27,7 @@ import java.util.Set;
 import java.util.SortedMap;
 import java.util.TreeMap;
 import java.util.regex.Pattern;
+import java.util.stream.Collectors;
 
 import org.apache.metamodel.DataContext;
 import org.apache.metamodel.MetaModelException;
@@ -200,7 +201,7 @@ public class MongoDbDataContext extends QueryPostprocessDataContext implements U
             for (SimpleTableDef tableDef : _tableDefs) {
 
                 MutableTable table = tableDef.toTable().setSchema(schema);
-                Column[] rowIdColumns = table.getColumnsOfType(ColumnType.ROWID);
+                List<Column> rowIdColumns = table.getColumnsOfType(ColumnType.ROWID);
                 for (Column column : rowIdColumns) {
                     if (column instanceof MutableColumn) {
                         ((MutableColumn) column).setPrimaryKey(true);
@@ -286,10 +287,7 @@ public class MongoDbDataContext extends QueryPostprocessDataContext implements U
                     logger.debug("Query can be expressed in full MongoDB, no post processing needed.");
 
                     // prepare for a non-post-processed query
-                    Column[] columns = new Column[selectItems.size()];
-                    for (int i = 0; i < columns.length; i++) {
-                        columns[i] = selectItems.get(i).getColumn();
-                    }
+
 
                     // checking if the query is a primary key lookup query
                     if (whereItems.size() == 1) {
@@ -325,16 +323,15 @@ public class MongoDbDataContext extends QueryPostprocessDataContext implements U
                     }
 
                     if (thereIsAtLeastOneAlias) {
-                        final SelectItem[] selectItemsAsArray = selectItems.toArray(new SelectItem[selectItems.size()]);
                         final DataSet dataSet = materializeMainSchemaTableInternal(
                                 table,
-                                selectItemsAsArray,
+                                selectItems,
                                 whereItems,
                                 firstRow,
                                 maxRows, false);
                         return dataSet;
                     } else {
-                        final DataSet dataSet = materializeMainSchemaTableInternal(table, columns, whereItems, firstRow,
+                        final DataSet dataSet = materializeMainSchemaTableInternal(table, selectItems, whereItems, firstRow,
                                 maxRows, false);
                         return dataSet;
                     }
@@ -346,14 +343,8 @@ public class MongoDbDataContext extends QueryPostprocessDataContext implements U
         return super.executeQuery(query);
     }
 
-    private DataSet materializeMainSchemaTableInternal(Table table, Column[] columns, List<FilterItem> whereItems,
-            int firstRow, int maxRows, boolean queryPostProcessed) {
-        MongoCursor<Document> cursor = getDocumentMongoCursor(table, whereItems, firstRow, maxRows);
-
-        return new MongoDbDataSet(cursor, columns, queryPostProcessed);
-    }
 
-    private DataSet materializeMainSchemaTableInternal(Table table, SelectItem[] selectItems, List<FilterItem> whereItems,
+    private DataSet materializeMainSchemaTableInternal(Table table, List<SelectItem> selectItems, List<FilterItem> whereItems,
             int firstRow, int maxRows, boolean queryPostProcessed) {
         MongoCursor<Document> cursor = getDocumentMongoCursor(table, whereItems, firstRow, maxRows);
 
@@ -507,13 +498,26 @@ public class MongoDbDataContext extends QueryPostprocessDataContext implements U
     }
 
     @Override
-    protected DataSet materializeMainSchemaTable(Table table, Column[] columns, int maxRows) {
-        return materializeMainSchemaTableInternal(table, columns, null, 1, maxRows, true);
+    protected DataSet materializeMainSchemaTable(Table table, List<Column> columns, int maxRows) {
+
+        return materializeMainSchemaTableInternal(
+                table,
+                columns.stream().map(SelectItem::new).collect(Collectors.toList()),
+                null,
+                1,
+                maxRows,
+                true);
     }
 
     @Override
-    protected DataSet materializeMainSchemaTable(Table table, Column[] columns, int firstRow, int maxRows) {
-        return materializeMainSchemaTableInternal(table, columns, null, firstRow, maxRows, true);
+    protected DataSet materializeMainSchemaTable(Table table, List<Column> columns, int firstRow, int maxRows) {
+        return materializeMainSchemaTableInternal(
+                table,
+                columns.stream().map(SelectItem::new).collect(Collectors.toList()),
+                null,
+                firstRow,
+                maxRows,
+                true);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/mongodb/mongo3/src/main/java/org/apache/metamodel/mongodb/mongo3/MongoDbDataSet.java
----------------------------------------------------------------------
diff --git a/mongodb/mongo3/src/main/java/org/apache/metamodel/mongodb/mongo3/MongoDbDataSet.java b/mongodb/mongo3/src/main/java/org/apache/metamodel/mongodb/mongo3/MongoDbDataSet.java
index 19e543f..76a7636 100644
--- a/mongodb/mongo3/src/main/java/org/apache/metamodel/mongodb/mongo3/MongoDbDataSet.java
+++ b/mongodb/mongo3/src/main/java/org/apache/metamodel/mongodb/mongo3/MongoDbDataSet.java
@@ -29,6 +29,8 @@ import org.slf4j.LoggerFactory;
 
 import com.mongodb.client.MongoCursor;
 
+import java.util.List;
+
 final class MongoDbDataSet extends AbstractDataSet {
 
     private static final Logger logger = LoggerFactory.getLogger(MongoDbDataSet.class);
@@ -39,14 +41,8 @@ final class MongoDbDataSet extends AbstractDataSet {
     private boolean _closed;
     private volatile Document _document;
 
-    public MongoDbDataSet(MongoCursor<Document> cursor, Column[] columns, boolean queryPostProcessed) {
-        super(columns);
-        _cursor = cursor;
-        _queryPostProcessed = queryPostProcessed;
-        _closed = false;
-    }
 
-    public MongoDbDataSet(MongoCursor<Document> cursor, SelectItem[] selectItems, boolean queryPostProcessed) {
+    public MongoDbDataSet(MongoCursor<Document> cursor, List<SelectItem> selectItems, boolean queryPostProcessed) {
         super(selectItems);
         _cursor = cursor;
         _queryPostProcessed = queryPostProcessed;

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/mongodb/mongo3/src/test/java/org/apache/metamodel/mongodb/mongo3/MongoDbDataContextTest.java
----------------------------------------------------------------------
diff --git a/mongodb/mongo3/src/test/java/org/apache/metamodel/mongodb/mongo3/MongoDbDataContextTest.java b/mongodb/mongo3/src/test/java/org/apache/metamodel/mongodb/mongo3/MongoDbDataContextTest.java
index 197fae9..9751719 100644
--- a/mongodb/mongo3/src/test/java/org/apache/metamodel/mongodb/mongo3/MongoDbDataContextTest.java
+++ b/mongodb/mongo3/src/test/java/org/apache/metamodel/mongodb/mongo3/MongoDbDataContextTest.java
@@ -265,7 +265,7 @@ public class MongoDbDataContextTest extends MongoDbTestCase {
         assertTrue(Arrays.asList(dataContext.getDefaultSchema().getTableNames()).contains(getCollectionName()));
         
         Table table = dataContext.getDefaultSchema().getTableByName(getCollectionName());
-        assertEquals("[_id, baz, foo, id, list, name]", Arrays.toString(table.getColumnNames()));
+        assertEquals("[_id, baz, foo, id, list, name]", Arrays.toString(table.getColumnNames().toArray()));
 
         assertEquals(ColumnType.MAP, table.getColumnByName("baz").getType());
         assertEquals(ColumnType.STRING, table.getColumnByName("foo").getType());
@@ -445,7 +445,7 @@ public class MongoDbDataContextTest extends MongoDbTestCase {
         // do a query that we cannot push to mongo
         // Replace column index 0 by 1
         ds = dataContext.query().from(getCollectionName())
-                .select(FunctionType.SUM, dataContext.getDefaultSchema().getTables()[0].getColumnByName("id"))
+                .select(FunctionType.SUM, dataContext.getDefaultSchema().getTables().get(0).getColumnByName("id"))
                 .where("foo").isEquals("bar").execute();
         assertEquals(InMemoryDataSet.class, ds.getClass());
 
@@ -463,8 +463,7 @@ public class MongoDbDataContextTest extends MongoDbTestCase {
         dc.executeUpdate(new UpdateScript() {
             @Override
             public void run(UpdateCallback callback) {
-                Table[] tables = defaultSchema.getTables();
-                for (Table table : tables) {
+                for (Table table : defaultSchema.getTables()) {
                     callback.deleteFrom(table).execute();
                 }
             }
@@ -499,8 +498,8 @@ public class MongoDbDataContextTest extends MongoDbTestCase {
         dataSet = dc.query().from("some_entries").selectCount().execute();
         dataSet.close();
         assertTrue(dataSet.next());
-        assertEquals(1, dataSet.getSelectItems().length);
-        assertEquals(SelectItem.getCountAllItem(), dataSet.getSelectItems()[0]);
+        assertEquals(1, dataSet.getSelectItems().size());
+        assertEquals(SelectItem.getCountAllItem(), dataSet.getSelectItems().get(0));
         assertEquals(4l, dataSet.getRow().getValue(SelectItem.getCountAllItem()));
         assertFalse(dataSet.next());
         assertEquals(InMemoryDataSet.class, dataSet.getClass());
@@ -509,8 +508,8 @@ public class MongoDbDataContextTest extends MongoDbTestCase {
         dataSet = dc.query().from("some_entries").selectCount().where("foo").greaterThan(2).execute();
         dataSet.close();
         assertTrue(dataSet.next());
-        assertEquals(1, dataSet.getSelectItems().length);
-        assertEquals(SelectItem.getCountAllItem(), dataSet.getSelectItems()[0]);
+        assertEquals(1, dataSet.getSelectItems().size());
+        assertEquals(SelectItem.getCountAllItem(), dataSet.getSelectItems().get(0));
         assertEquals(2l, dataSet.getRow().getValue(SelectItem.getCountAllItem()));
         assertFalse(dataSet.next());
         assertEquals(InMemoryDataSet.class, dataSet.getClass());
@@ -633,7 +632,7 @@ public class MongoDbDataContextTest extends MongoDbTestCase {
                         "addresses[5].foobar" }));
 
         final DataSet ds1 = dc.executeQuery("select gender as my_gender, name.first as my_name from my_collection where gender LIKE '%MALE%'");
-        final SelectItem[] selectItems = ds1.getSelectItems();
+        final SelectItem[] selectItems = ds1.getSelectItems().toArray(new SelectItem[ds1.getSelectItems().size()]);
         SelectItem firstSelectItem = selectItems[0];
         SelectItem secondSelectItem = selectItems[1];
         try {

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/mongodb/mongo3/src/test/java/org/apache/metamodel/mongodb/mongo3/MongoDbDataCopyer.java
----------------------------------------------------------------------
diff --git a/mongodb/mongo3/src/test/java/org/apache/metamodel/mongodb/mongo3/MongoDbDataCopyer.java b/mongodb/mongo3/src/test/java/org/apache/metamodel/mongodb/mongo3/MongoDbDataCopyer.java
index 42ef536..351d6ee 100644
--- a/mongodb/mongo3/src/test/java/org/apache/metamodel/mongodb/mongo3/MongoDbDataCopyer.java
+++ b/mongodb/mongo3/src/test/java/org/apache/metamodel/mongodb/mongo3/MongoDbDataCopyer.java
@@ -98,7 +98,7 @@ public class MongoDbDataCopyer {
                 final Table sourceTable = getSourceTable();
                 final Table targetTable = callback.createTable(targetDataContext.getDefaultSchema(), _collectionName)
                         .like(sourceTable).execute();
-                final Column[] sourceColumns = sourceTable.getColumns();
+                final Column[] sourceColumns = sourceTable.getColumns().toArray(new Column[sourceTable.getColumns().size()]);
                 final DataSet dataSet = _sourceDataContext.query().from(sourceTable).select(sourceColumns).execute();
                 while (dataSet.next()) {
                     final Row row = dataSet.getRow();

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/neo4j/src/main/java/org/apache/metamodel/neo4j/Neo4jCypherQueryBuilder.java
----------------------------------------------------------------------
diff --git a/neo4j/src/main/java/org/apache/metamodel/neo4j/Neo4jCypherQueryBuilder.java b/neo4j/src/main/java/org/apache/metamodel/neo4j/Neo4jCypherQueryBuilder.java
index 5d3ac6c..38079ce 100644
--- a/neo4j/src/main/java/org/apache/metamodel/neo4j/Neo4jCypherQueryBuilder.java
+++ b/neo4j/src/main/java/org/apache/metamodel/neo4j/Neo4jCypherQueryBuilder.java
@@ -22,6 +22,7 @@ import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import org.apache.metamodel.query.FilterItem;
 import org.apache.metamodel.schema.Column;
@@ -29,15 +30,14 @@ import org.apache.metamodel.schema.Table;
 
 public class Neo4jCypherQueryBuilder {
 
-    public static String buildSelectQuery(Table table, Column[] columns, int firstRow, int maxRows) {
-        String[] columnNames = new String[columns.length];
-        for (int i = 0; i < columns.length; i++) {
-            columnNames[i] = columns[i].getName();
-        }
+    public static String buildSelectQuery(Table table, List<Column> columns, int firstRow, int maxRows) {
+        List<String> columnNames = columns.stream()
+                .map(col -> col.getName())
+                .collect(Collectors.toList());
         return buildSelectQuery(table.getName(), columnNames, firstRow, maxRows);
     }
 
-    public static String buildSelectQuery(String tableName, String[] columnNames, int firstRow, int maxRows) {
+    public static String buildSelectQuery(String tableName, List<String> columnNames, int firstRow, int maxRows) {
         Map<String, String> returnClauseMap = new LinkedHashMap<>();
         Map<String, Integer> relationshipIndexMap = new LinkedHashMap<>();
         for (String columnName : columnNames) {

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/neo4j/src/main/java/org/apache/metamodel/neo4j/Neo4jDataContext.java
----------------------------------------------------------------------
diff --git a/neo4j/src/main/java/org/apache/metamodel/neo4j/Neo4jDataContext.java b/neo4j/src/main/java/org/apache/metamodel/neo4j/Neo4jDataContext.java
index cb0b2ac..82f710d 100644
--- a/neo4j/src/main/java/org/apache/metamodel/neo4j/Neo4jDataContext.java
+++ b/neo4j/src/main/java/org/apache/metamodel/neo4j/Neo4jDataContext.java
@@ -22,6 +22,7 @@ import java.util.ArrayList;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 import org.apache.http.HttpHost;
 import org.apache.http.client.methods.HttpGet;
@@ -296,14 +297,14 @@ public class Neo4jDataContext extends QueryPostprocessDataContext implements Dat
     }
 
     @Override
-    protected DataSet materializeMainSchemaTable(Table table, Column[] columns, int firstRow, int maxRows) {
-        if ((columns != null) && (columns.length > 0)) {
+    protected DataSet materializeMainSchemaTable(Table table, List<Column> columns, int firstRow, int maxRows) {
+        if ((columns != null) && (columns.size() > 0)) {
             Neo4jDataSet dataSet = null;
             try {
                 String selectQuery = Neo4jCypherQueryBuilder.buildSelectQuery(table, columns, firstRow, maxRows);
                 String responseJSONString = _requestWrapper.executeCypherQuery(selectQuery);
                 JSONObject resultJSONObject = new JSONObject(responseJSONString);
-                final SelectItem[] selectItems = MetaModelHelper.createSelectItems(columns);
+                final List<SelectItem> selectItems = columns.stream().map(SelectItem::new).collect(Collectors.toList());
                 dataSet = new Neo4jDataSet(selectItems, resultJSONObject);
             } catch (JSONException e) {
                 logger.error("Error occured in parsing JSON while materializing the schema: ", e);
@@ -318,7 +319,7 @@ public class Neo4jDataContext extends QueryPostprocessDataContext implements Dat
     }
 
     @Override
-    protected DataSet materializeMainSchemaTable(Table table, Column[] columns, int maxRows) {
+    protected DataSet materializeMainSchemaTable(Table table, List<Column> columns, int maxRows) {
         return materializeMainSchemaTable(table, columns, 1, maxRows);
     }
 

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/neo4j/src/main/java/org/apache/metamodel/neo4j/Neo4jDataSet.java
----------------------------------------------------------------------
diff --git a/neo4j/src/main/java/org/apache/metamodel/neo4j/Neo4jDataSet.java b/neo4j/src/main/java/org/apache/metamodel/neo4j/Neo4jDataSet.java
index bf132e8..537a068 100644
--- a/neo4j/src/main/java/org/apache/metamodel/neo4j/Neo4jDataSet.java
+++ b/neo4j/src/main/java/org/apache/metamodel/neo4j/Neo4jDataSet.java
@@ -27,13 +27,15 @@ import org.json.JSONArray;
 import org.json.JSONException;
 import org.json.JSONObject;
 
+import java.util.List;
+
 final class Neo4jDataSet extends AbstractDataSet {
 
     private JSONObject _resultJSONObject;
     private int _currentRowIndex;
     private Row _row;
 
-    public Neo4jDataSet(SelectItem[] selectItems, JSONObject resultJSONObject) {
+    public Neo4jDataSet(List<SelectItem> selectItems, JSONObject resultJSONObject) {
         super(selectItems);
         _resultJSONObject = resultJSONObject;
         _currentRowIndex = 0;

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/neo4j/src/test/java/org/apache/metamodel/neo4j/Neo4jDataContextTest.java
----------------------------------------------------------------------
diff --git a/neo4j/src/test/java/org/apache/metamodel/neo4j/Neo4jDataContextTest.java b/neo4j/src/test/java/org/apache/metamodel/neo4j/Neo4jDataContextTest.java
index 1246ce2..89bf977 100644
--- a/neo4j/src/test/java/org/apache/metamodel/neo4j/Neo4jDataContextTest.java
+++ b/neo4j/src/test/java/org/apache/metamodel/neo4j/Neo4jDataContextTest.java
@@ -78,13 +78,13 @@ public class Neo4jDataContextTest extends Neo4jTestCase {
 
         // Do not check the precise count, Neo4j keeps labels forever, there are
         // probably many more than you imagine...
-        List<String> tableNames = Arrays.asList(schema.getTableNames());
+        List<String> tableNames = schema.getTableNames();
         logger.info("Tables (labels) detected: " + tableNames);
         assertTrue(tableNames.contains("JUnitLabel"));
         assertFalse(tableNames.contains("JUnitLabelTemp"));
 
         Table table = schema.getTableByName("JUnitLabel");
-        List<String> columnNames = Arrays.asList(table.getColumnNames());
+        List<String> columnNames = table.getColumnNames();
         assertTrue(columnNames.contains("property1"));
         assertTrue(columnNames.contains("property2"));
     }
@@ -122,18 +122,18 @@ public class Neo4jDataContextTest extends Neo4jTestCase {
 
         // Do not check the precise count, Neo4j keeps labels forever, there are
         // probably many more than you imagine...
-        List<String> tableNames = Arrays.asList(schema.getTableNames());
+        List<String> tableNames = schema.getTableNames();
         logger.info("Tables (labels) detected: " + tableNames);
         assertTrue(tableNames.contains("JUnitPerson"));
         assertTrue(tableNames.contains("JUnitBook"));
 
         Table tablePerson = schema.getTableByName("JUnitPerson");
-        List<String> personColumnNames = Arrays.asList(tablePerson.getColumnNames());
+        List<String> personColumnNames = tablePerson.getColumnNames();
         assertEquals("[_id, name, age, rel_HAS_READ, rel_HAS_READ#rating, rel_HAS_BROWSED]",
                 personColumnNames.toString());
 
         Table tableBook = schema.getTableByName("JUnitBook");
-        List<String> bookColumnNames = Arrays.asList(tableBook.getColumnNames());
+        List<String> bookColumnNames = tableBook.getColumnNames();
         assertEquals("[_id, title]", bookColumnNames.toString());
     }
 

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/openoffice/src/main/java/org/apache/metamodel/openoffice/OpenOfficeDataContext.java
----------------------------------------------------------------------
diff --git a/openoffice/src/main/java/org/apache/metamodel/openoffice/OpenOfficeDataContext.java b/openoffice/src/main/java/org/apache/metamodel/openoffice/OpenOfficeDataContext.java
index 25275a5..7df2350 100644
--- a/openoffice/src/main/java/org/apache/metamodel/openoffice/OpenOfficeDataContext.java
+++ b/openoffice/src/main/java/org/apache/metamodel/openoffice/OpenOfficeDataContext.java
@@ -26,6 +26,7 @@ import java.io.OutputStream;
 import java.sql.Connection;
 import java.sql.DriverManager;
 import java.util.Enumeration;
+import java.util.List;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipFile;
 
@@ -114,7 +115,7 @@ public class OpenOfficeDataContext extends AbstractDataContext {
 	}
 
 	@Override
-	protected String[] getSchemaNamesInternal() {
+	protected List<String> getSchemaNamesInternal() {
 		return _dataContextDelegate.getSchemaNames();
 	}
 

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/openoffice/src/test/java/org/apache/metamodel/openoffice/OpenOfficeDataContextTest.java
----------------------------------------------------------------------
diff --git a/openoffice/src/test/java/org/apache/metamodel/openoffice/OpenOfficeDataContextTest.java b/openoffice/src/test/java/org/apache/metamodel/openoffice/OpenOfficeDataContextTest.java
index 78015d2..0ac3462 100644
--- a/openoffice/src/test/java/org/apache/metamodel/openoffice/OpenOfficeDataContextTest.java
+++ b/openoffice/src/test/java/org/apache/metamodel/openoffice/OpenOfficeDataContextTest.java
@@ -57,7 +57,7 @@ public class OpenOfficeDataContextTest extends TestCase {
 
 	public void testGetSchemas() throws Exception {
 		assertEquals("[INFORMATION_SCHEMA, PUBLIC]",
-				Arrays.toString(_dataContext.getSchemaNames()));
+				Arrays.toString(_dataContext.getSchemaNames().toArray()));
 
 		Schema informationSchema = _dataContext
 				.getSchemaByName("INFORMATION_SCHEMA");
@@ -68,10 +68,10 @@ public class OpenOfficeDataContextTest extends TestCase {
 
 		assertEquals(
 				"[Table[name=CONTRIBUTORS,type=TABLE,remarks=null], Table[name=projects,type=TABLE,remarks=null]]",
-				Arrays.toString(schema.getTables()));
+				Arrays.toString(schema.getTables().toArray()));
 		assertEquals(
 				"[Relationship[primaryTable=CONTRIBUTORS,primaryColumns=[ID],foreignTable=projects,foreignColumns=[admin]]]",
-				Arrays.toString(schema.getRelationships()));
+				Arrays.toString(schema.getRelationships().toArray()));
 	}
 
 	public void testQueryUppercaseTable() throws Exception {

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/pojo/src/main/java/org/apache/metamodel/pojo/PojoDataContext.java
----------------------------------------------------------------------
diff --git a/pojo/src/main/java/org/apache/metamodel/pojo/PojoDataContext.java b/pojo/src/main/java/org/apache/metamodel/pojo/PojoDataContext.java
index 9369e96..f694202 100644
--- a/pojo/src/main/java/org/apache/metamodel/pojo/PojoDataContext.java
+++ b/pojo/src/main/java/org/apache/metamodel/pojo/PojoDataContext.java
@@ -24,6 +24,7 @@ import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.TreeMap;
+import java.util.stream.Collectors;
 
 import org.apache.metamodel.DataContext;
 import org.apache.metamodel.MetaModelException;
@@ -103,13 +104,13 @@ public class PojoDataContext extends QueryPostprocessDataContext implements Upda
     }
 
     @Override
-    protected DataSet materializeMainSchemaTable(Table table, Column[] columns, int maxRows) {
+    protected DataSet materializeMainSchemaTable(Table table, List<Column> columns, int maxRows) {
         final TableDataProvider<?> pojoTable = _tables.get(table.getName());
         if (pojoTable == null) {
             throw new IllegalArgumentException("No such POJO table: " + table.getName());
         }
 
-        final SelectItem[] selectItems = MetaModelHelper.createSelectItems(columns);
+        final List<SelectItem> selectItems = columns.stream().map(SelectItem::new).collect(Collectors.toList());
 
         @SuppressWarnings({ "rawtypes", "unchecked" })
         DataSet dataSet = new PojoDataSet(pojoTable, selectItems);

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/pojo/src/main/java/org/apache/metamodel/pojo/PojoDataSet.java
----------------------------------------------------------------------
diff --git a/pojo/src/main/java/org/apache/metamodel/pojo/PojoDataSet.java b/pojo/src/main/java/org/apache/metamodel/pojo/PojoDataSet.java
index 1c86ef1..952d85c 100644
--- a/pojo/src/main/java/org/apache/metamodel/pojo/PojoDataSet.java
+++ b/pojo/src/main/java/org/apache/metamodel/pojo/PojoDataSet.java
@@ -19,6 +19,7 @@
 package org.apache.metamodel.pojo;
 
 import java.util.Iterator;
+import java.util.List;
 
 import org.apache.metamodel.data.AbstractDataSet;
 import org.apache.metamodel.data.DataSet;
@@ -38,7 +39,7 @@ final class PojoDataSet<E> extends AbstractDataSet {
     private final Iterator<E> _iterator;
     private E _next;
 
-    public PojoDataSet(TableDataProvider<E> pojoTable, SelectItem[] selectItems) {
+    public PojoDataSet(TableDataProvider<E> pojoTable, List<SelectItem> selectItems) {
         super(selectItems);
         _pojoTable = pojoTable;
 


[07/20] metamodel git commit: now all compiling

Posted by ka...@apache.org.
now all compiling


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

Branch: refs/heads/master
Commit: 2d156bcd0721f436ea42c3bc4a0af314375873b4
Parents: ab5c948
Author: Jörg Unbehauen <jo...@unbehauen.net>
Authored: Thu Jul 27 18:05:40 2017 +0200
Committer: Jörg Unbehauen <jo...@unbehauen.net>
Committed: Thu Jul 27 18:05:40 2017 +0200

----------------------------------------------------------------------
 .../cassandra/CassandraDataContext.java         |  3 +-
 .../metamodel/cassandra/CassandraDataSet.java   |  7 +-
 .../cassandra/CassandraDataContextTest.java     |  2 +-
 .../apache/metamodel/data/AbstractDataSet.java  |  3 -
 .../org/apache/metamodel/data/EmptyDataSet.java |  5 ++
 .../metamodel/data/SimpleDataSetHeader.java     |  5 ++
 .../intercept/InterceptableDataContext.java     | 20 +++--
 .../metamodel/schema/MutableRelationship.java   |  2 +-
 .../apache/metamodel/schema/MutableSchema.java  |  5 ++
 .../create/AbstractCreateTableBuilderTest.java  |  2 +-
 .../metamodel/couchdb/CouchDbDataContext.java   |  7 +-
 .../metamodel/couchdb/CouchDbDataSet.java       |  3 +-
 .../CouchDbSimpleTableDefSchemaBuilder.java     |  3 +-
 .../couchdb/CouchDbDataContextTest.java         | 10 +--
 .../metamodel/csv/CsvCreateTableBuilder.java    |  6 +-
 .../apache/metamodel/csv/CsvDataContext.java    |  4 +-
 .../org/apache/metamodel/csv/CsvDataSet.java    |  9 ++-
 .../org/apache/metamodel/csv/CsvSchema.java     | 10 ++-
 .../java/org/apache/metamodel/csv/CsvTable.java | 29 +++----
 .../metamodel/csv/SingleLineCsvDataSet.java     |  9 ++-
 .../metamodel/csv/CsvBigFileMemoryTest.java     |  4 +-
 .../metamodel/csv/CsvDataContextTest.java       | 74 +++++++++---------
 .../metamodel/csv/SingleLineCsvRowTest.java     |  4 +-
 .../InterceptionCsvIntegrationTest.java         |  6 +-
 .../metamodel/dynamodb/DynamoDbDataContext.java |  8 +-
 .../metamodel/dynamodb/DynamoDbDataSet.java     |  7 +-
 .../dynamodb/DynamoDbTableCreationBuilder.java  |  3 +-
 .../DynamoDbDataContextIntegrationTest.java     |  2 +-
 .../nativeclient/ElasticSearchDataContext.java  |  7 +-
 .../nativeclient/ElasticSearchDataSet.java      |  9 +--
 .../ElasticSearchDataContextTest.java           | 16 ++--
 .../rest/ElasticSearchRestDataContext.java      |  7 +-
 .../rest/JestElasticSearchDataSet.java          |  6 --
 .../rest/JestElasticSearchDataContextTest.java  | 16 ++--
 .../rest/JestElasticSearchUtilsTest.java        | 14 ++--
 .../excel/DefaultSpreadsheetReaderDelegate.java |  7 +-
 .../metamodel/excel/ExcelDataContext.java       |  3 +-
 .../metamodel/excel/ExcelDeleteBuilder.java     |  3 +-
 .../excel/ExcelTableCreationBuilder.java        |  4 +-
 .../org/apache/metamodel/excel/ExcelUtils.java  |  4 +-
 .../excel/SpreadsheetReaderDelegate.java        |  4 +-
 .../org/apache/metamodel/excel/XlsDataSet.java  |  5 +-
 .../metamodel/excel/XlsxRowPublisherAction.java | 12 +--
 .../excel/XlsxSpreadsheetReaderDelegate.java    | 10 +--
 .../DefaultSpreadsheetReaderDelegateTest.java   | 27 +++----
 .../metamodel/excel/ExcelDataContextTest.java   | 82 ++++++++++----------
 .../excel/ExcelUpdateCallbackTest.java          |  4 +-
 .../fixedwidth/FixedWidthDataContext.java       |  3 +-
 .../metamodel/fixedwidth/FixedWidthDataSet.java |  8 +-
 .../FixedWidthConfigurationReaderTest.java      |  2 +-
 .../fixedwidth/FixedWidthDataContextTest.java   | 26 +++----
 .../metamodel/hbase/HBaseDataContext.java       |  2 +-
 .../apache/metamodel/hbase/HBaseDataSet.java    |  7 +-
 .../metamodel/hbase/HBaseDataContextTest.java   |  2 +-
 .../metamodel/jdbc/JdbcCreateTableBuilder.java  | 15 ++--
 .../apache/metamodel/jdbc/JdbcDataContext.java  | 28 +++----
 .../metamodel/jdbc/JdbcMetadataLoader.java      |  5 +-
 .../org/apache/metamodel/jdbc/JdbcSchema.java   |  3 +-
 .../apache/metamodel/jdbc/QuerySplitter.java    |  4 +-
 .../org/apache/metamodel/jdbc/DerbyTest.java    | 16 ++--
 .../apache/metamodel/jdbc/H2databaseTest.java   | 20 ++---
 .../org/apache/metamodel/jdbc/HsqldbTest.java   | 14 ++--
 .../metamodel/jdbc/JdbcDataContextTest.java     | 31 ++++----
 .../metamodel/jdbc/JdbcDeleteBuilderTest.java   |  4 +-
 .../metamodel/jdbc/JdbcInsertBuilderTest.java   |  6 +-
 .../apache/metamodel/jdbc/JdbcSchemaTest.java   | 10 +--
 .../metamodel/jdbc/JdbcTestTemplates.java       |  2 +-
 .../metamodel/jdbc/JdbcUpdateBuilderTest.java   |  8 +-
 .../metamodel/jdbc/QuerySplitterTest.java       | 15 ++--
 .../org/apache/metamodel/jdbc/SqliteTest.java   | 11 ++-
 .../jdbc/integrationtests/DB2Test.java          |  6 +-
 .../jdbc/integrationtests/FirebirdTest.java     | 54 +++++++------
 .../jdbc/integrationtests/MysqlTest.java        | 18 ++---
 .../jdbc/integrationtests/OracleTest.java       | 43 ++++++----
 .../jdbc/integrationtests/PostgresqlTest.java   | 52 ++++++-------
 .../SQLServerJtdsDriverTest.java                |  8 +-
 .../SQLServerMicrosoftDriverTest.java           |  6 +-
 .../apache/metamodel/json/JsonDataContext.java  |  6 +-
 .../metamodel/json/JsonDataContextTest.java     | 11 ++-
 .../mongodb/mongo2/MongoDbDataContext.java      | 41 +++++-----
 .../mongodb/mongo2/MongoDbDataSet.java          | 11 +--
 .../mongodb/mongo2/MongoDbDataContextTest.java  | 17 ++--
 .../mongodb/mongo2/MongoDbDataCopyer.java       |  3 +-
 .../mongodb/mongo3/MongoDbDataContext.java      | 42 +++++-----
 .../mongodb/mongo3/MongoDbDataSet.java          | 10 +--
 .../mongodb/mongo3/MongoDbDataContextTest.java  | 17 ++--
 .../mongodb/mongo3/MongoDbDataCopyer.java       |  2 +-
 .../neo4j/Neo4jCypherQueryBuilder.java          | 12 +--
 .../metamodel/neo4j/Neo4jDataContext.java       |  9 ++-
 .../apache/metamodel/neo4j/Neo4jDataSet.java    |  4 +-
 .../metamodel/neo4j/Neo4jDataContextTest.java   | 10 +--
 .../openoffice/OpenOfficeDataContext.java       |  3 +-
 .../openoffice/OpenOfficeDataContextTest.java   |  6 +-
 .../apache/metamodel/pojo/PojoDataContext.java  |  5 +-
 .../org/apache/metamodel/pojo/PojoDataSet.java  |  3 +-
 .../metamodel/pojo/PojoDataContextTest.java     |  4 +-
 .../salesforce/SalesforceDataContext.java       | 17 ++--
 .../metamodel/salesforce/SalesforceDataSet.java |  7 +-
 .../metamodel/salesforce/SalesforceSchema.java  |  6 +-
 .../metamodel/salesforce/SalesforceTable.java   | 11 +--
 .../salesforce/SalesforceDataContextTest.java   | 14 ++--
 .../salesforce/SalesforceDataSetTest.java       |  5 +-
 ...CsvDefaultConfigurationFromResourceTest.java |  2 +-
 ...vSpecifiedConfigurationFromFilenameTest.java |  2 +-
 ...lSpecifiedConfigurationFromFilenameTest.java |  2 +-
 .../PojoDataContextFactoryBeanDelegateTest.java |  6 +-
 .../metamodel/sugarcrm/SugarCrmDataContext.java |  4 +-
 .../metamodel/sugarcrm/SugarCrmDataSet.java     | 14 ++--
 .../metamodel/sugarcrm/SugarCrmSchema.java      |  5 +-
 .../metamodel/sugarcrm/SugarCrmTable.java       | 13 ++--
 .../metamodel/sugarcrm/SugarCrmXmlHelper.java   |  2 +-
 .../sugarcrm/SugarCrmDataContextTest.java       | 31 ++++----
 .../apache/metamodel/xml/XmlDomDataContext.java |  4 +-
 113 files changed, 662 insertions(+), 620 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/cassandra/src/main/java/org/apache/metamodel/cassandra/CassandraDataContext.java
----------------------------------------------------------------------
diff --git a/cassandra/src/main/java/org/apache/metamodel/cassandra/CassandraDataContext.java b/cassandra/src/main/java/org/apache/metamodel/cassandra/CassandraDataContext.java
index 3a1684e..08d3fd9 100644
--- a/cassandra/src/main/java/org/apache/metamodel/cassandra/CassandraDataContext.java
+++ b/cassandra/src/main/java/org/apache/metamodel/cassandra/CassandraDataContext.java
@@ -69,7 +69,6 @@ import com.datastax.driver.core.querybuilder.Select.Selection;
 public class CassandraDataContext extends QueryPostprocessDataContext implements DataContext {
 
     private static final Logger logger = LoggerFactory.getLogger(CassandraDataContext.class);
-
     private final Cluster cassandraCluster;
     private final SimpleTableDef[] tableDefs;
     private final String keySpaceName;
@@ -188,7 +187,7 @@ public class CassandraDataContext extends QueryPostprocessDataContext implements
     }
 
     @Override
-    protected DataSet materializeMainSchemaTable(Table table, Column[] columns, int maxRows) {
+    protected DataSet materializeMainSchemaTable(Table table, List<Column> columns, int maxRows) {
         final Select query = QueryBuilder.select().all().from(keySpaceName, table.getName());
         if (limitMaxRowsIsSet(maxRows)) {
             query.limit(maxRows);

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/cassandra/src/main/java/org/apache/metamodel/cassandra/CassandraDataSet.java
----------------------------------------------------------------------
diff --git a/cassandra/src/main/java/org/apache/metamodel/cassandra/CassandraDataSet.java b/cassandra/src/main/java/org/apache/metamodel/cassandra/CassandraDataSet.java
index ea02176..ff222a1 100644
--- a/cassandra/src/main/java/org/apache/metamodel/cassandra/CassandraDataSet.java
+++ b/cassandra/src/main/java/org/apache/metamodel/cassandra/CassandraDataSet.java
@@ -20,10 +20,13 @@
 package org.apache.metamodel.cassandra;
 
 import java.util.Iterator;
+import java.util.List;
+import java.util.stream.Collectors;
 
 import org.apache.metamodel.data.AbstractDataSet;
 import org.apache.metamodel.data.DataSet;
 import org.apache.metamodel.data.Row;
+import org.apache.metamodel.query.SelectItem;
 import org.apache.metamodel.schema.Column;
 
 /**
@@ -36,8 +39,8 @@ final class CassandraDataSet extends AbstractDataSet {
 
     private volatile com.datastax.driver.core.Row _dbObject;
 
-    public CassandraDataSet(Iterator<com.datastax.driver.core.Row> cursor, Column[] columns) {
-        super(columns);
+    public CassandraDataSet(Iterator<com.datastax.driver.core.Row> cursor, List<Column> columns) {
+        super(columns.stream().map(SelectItem::new).collect(Collectors.toList()));
         _cursor = cursor;
     }
 

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/cassandra/src/test/java/org/apache/metamodel/cassandra/CassandraDataContextTest.java
----------------------------------------------------------------------
diff --git a/cassandra/src/test/java/org/apache/metamodel/cassandra/CassandraDataContextTest.java b/cassandra/src/test/java/org/apache/metamodel/cassandra/CassandraDataContextTest.java
index a9d9605..575bb5f 100644
--- a/cassandra/src/test/java/org/apache/metamodel/cassandra/CassandraDataContextTest.java
+++ b/cassandra/src/test/java/org/apache/metamodel/cassandra/CassandraDataContextTest.java
@@ -83,7 +83,7 @@ public class CassandraDataContextTest {
 
     @Test
     public void testSchemaAndSimpleQuery() throws Exception {
-        String existingTables = Arrays.toString(dc.getDefaultSchema().getTableNames());
+        String existingTables = Arrays.toString(dc.getDefaultSchema().getTableNames().toArray());
         assertTrue(existingTables.contains(testTableName));
         assertTrue(existingTables.contains(testCounterTableName));
 

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/core/src/main/java/org/apache/metamodel/data/AbstractDataSet.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/data/AbstractDataSet.java b/core/src/main/java/org/apache/metamodel/data/AbstractDataSet.java
index 6e64446..17699b5 100644
--- a/core/src/main/java/org/apache/metamodel/data/AbstractDataSet.java
+++ b/core/src/main/java/org/apache/metamodel/data/AbstractDataSet.java
@@ -64,9 +64,6 @@ public abstract class AbstractDataSet extends BaseObject implements DataSet {
         _header = Objects.requireNonNull(header);
     }
 
-    public AbstractDataSet(Column[] columns) {
-        this(MetaModelHelper.createSelectItems(columns));
-    }
 
     /**
      * {@inheritDoc}

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/core/src/main/java/org/apache/metamodel/data/EmptyDataSet.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/data/EmptyDataSet.java b/core/src/main/java/org/apache/metamodel/data/EmptyDataSet.java
index fd71be3..89d5d35 100644
--- a/core/src/main/java/org/apache/metamodel/data/EmptyDataSet.java
+++ b/core/src/main/java/org/apache/metamodel/data/EmptyDataSet.java
@@ -19,6 +19,7 @@
 package org.apache.metamodel.data;
 
 import java.util.List;
+import java.util.stream.Collectors;
 
 import org.apache.metamodel.query.SelectItem;
 import org.apache.metamodel.schema.Column;
@@ -36,6 +37,10 @@ public final class EmptyDataSet extends AbstractDataSet {
        this(new SimpleDataSetHeader(selectItems));
     }
 
+    public static EmptyDataSet fromColumns(List<Column> cols){
+        return new EmptyDataSet(cols.stream().map(SelectItem::new).collect(Collectors.toList()));
+    }
+
     @Override
     public boolean next() {
         return false;

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/core/src/main/java/org/apache/metamodel/data/SimpleDataSetHeader.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/data/SimpleDataSetHeader.java b/core/src/main/java/org/apache/metamodel/data/SimpleDataSetHeader.java
index afc6226..71703d5 100644
--- a/core/src/main/java/org/apache/metamodel/data/SimpleDataSetHeader.java
+++ b/core/src/main/java/org/apache/metamodel/data/SimpleDataSetHeader.java
@@ -49,6 +49,11 @@ public class SimpleDataSetHeader implements DataSetHeader {
     }
 
 
+    public static SimpleDataSetHeader fromColumns(List<Column> cols){
+        return new SimpleDataSetHeader(cols.stream().map(SelectItem::new).collect(Collectors.toList()));
+    }
+
+
     @Override
     public final List<SelectItem> getSelectItems() {
         return Collections.unmodifiableList(_items);

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/core/src/main/java/org/apache/metamodel/intercept/InterceptableDataContext.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/intercept/InterceptableDataContext.java b/core/src/main/java/org/apache/metamodel/intercept/InterceptableDataContext.java
index 1811e78..3076ca8 100644
--- a/core/src/main/java/org/apache/metamodel/intercept/InterceptableDataContext.java
+++ b/core/src/main/java/org/apache/metamodel/intercept/InterceptableDataContext.java
@@ -194,17 +194,15 @@ public class InterceptableDataContext implements UpdateableDataContext {
 
     @Override
     public List<Schema> getSchemas() throws MetaModelException {
-        List<Schema> schemas = _delegate.getSchemas();
-        List<Schema> result = new ArrayList<>(schemas.size());
-        if (!_schemaInterceptors.isEmpty()) {
-            for (int i = 0; i < schemas.size(); i++) {
-                schemas.set(i, _schemaInterceptors.interceptAll(schemas.get(i)));
-            }
-        }else {
-            result = schemas;
-        }
-        return result;
-
+        return _delegate.getSchemas().stream()
+                .map(schema -> {
+                    if(_schemaInterceptors.isEmpty()){
+                        return schema;
+                    }else{
+                        return _schemaInterceptors.interceptAll(schema);
+                    }
+
+                }).collect(Collectors.toList());
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/core/src/main/java/org/apache/metamodel/schema/MutableRelationship.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/schema/MutableRelationship.java b/core/src/main/java/org/apache/metamodel/schema/MutableRelationship.java
index 466244c..3ea624c 100644
--- a/core/src/main/java/org/apache/metamodel/schema/MutableRelationship.java
+++ b/core/src/main/java/org/apache/metamodel/schema/MutableRelationship.java
@@ -110,7 +110,7 @@ public class MutableRelationship extends AbstractRelationship implements
 		List<Column> pcols = new ArrayList<>();
 		pcols.add(primaryColumn);
 		List<Column> fcols = new ArrayList<>();
-		pcols.add(foreignColumn);
+		fcols.add(foreignColumn);
 
 
 		return createRelationship(pcols, fcols);

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/core/src/main/java/org/apache/metamodel/schema/MutableSchema.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/schema/MutableSchema.java b/core/src/main/java/org/apache/metamodel/schema/MutableSchema.java
index 29d361b..f01b5c0 100644
--- a/core/src/main/java/org/apache/metamodel/schema/MutableSchema.java
+++ b/core/src/main/java/org/apache/metamodel/schema/MutableSchema.java
@@ -68,6 +68,11 @@ public class MutableSchema extends AbstractSchema implements Serializable,
 		return Collections.unmodifiableList(_tables);
 	}
 
+	public List<MutableTable> getMutableTables() {
+		return Collections.unmodifiableList(_tables);
+	}
+
+
 	public MutableSchema setTables(Collection<? extends MutableTable> tables) {
 	    clearTables();
 		for (MutableTable table : tables) {

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/core/src/test/java/org/apache/metamodel/create/AbstractCreateTableBuilderTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/metamodel/create/AbstractCreateTableBuilderTest.java b/core/src/test/java/org/apache/metamodel/create/AbstractCreateTableBuilderTest.java
index f5e7356..e108277 100644
--- a/core/src/test/java/org/apache/metamodel/create/AbstractCreateTableBuilderTest.java
+++ b/core/src/test/java/org/apache/metamodel/create/AbstractCreateTableBuilderTest.java
@@ -102,6 +102,6 @@ public class AbstractCreateTableBuilderTest extends TestCase {
         assertEquals("Column[name=bar,columnNumber=1,type=null,nullable=null,nativeType=null,columnSize=null]",
                 table.getColumn(1).toString());
         assertEquals("Column[name=baz,columnNumber=2,type=null,nullable=null,nativeType=null,columnSize=null]",
-                table.getColumn(1).toString());
+                table.getColumn(2).toString());
     }
 }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/couchdb/src/main/java/org/apache/metamodel/couchdb/CouchDbDataContext.java
----------------------------------------------------------------------
diff --git a/couchdb/src/main/java/org/apache/metamodel/couchdb/CouchDbDataContext.java b/couchdb/src/main/java/org/apache/metamodel/couchdb/CouchDbDataContext.java
index f98fa81..bc0a19d 100644
--- a/couchdb/src/main/java/org/apache/metamodel/couchdb/CouchDbDataContext.java
+++ b/couchdb/src/main/java/org/apache/metamodel/couchdb/CouchDbDataContext.java
@@ -19,6 +19,7 @@
 package org.apache.metamodel.couchdb;
 
 import java.util.List;
+import java.util.stream.Collectors;
 
 import org.apache.metamodel.MetaModelException;
 import org.apache.metamodel.MetaModelHelper;
@@ -111,7 +112,7 @@ public class CouchDbDataContext extends QueryPostprocessDataContext implements U
     }
 
     @Override
-    protected DataSet materializeMainSchemaTable(Table table, Column[] columns, int firstRow, int maxRows) {
+    protected DataSet materializeMainSchemaTable(Table table, List<Column> columns, int firstRow, int maxRows) {
         // the connector represents a handle to the the couchdb "database".
         final String databaseName = table.getName();
         final CouchDbConnector connector = _couchDbInstance.createConnector(databaseName, false);
@@ -128,12 +129,12 @@ public class CouchDbDataContext extends QueryPostprocessDataContext implements U
 
         final StreamingViewResult streamingView = connector.queryForStreamingView(query);
 
-        final SelectItem[] selectItems = MetaModelHelper.createSelectItems(columns);
+        final List<SelectItem> selectItems = columns.stream().map(SelectItem::new).collect(Collectors.toList());
         return new CouchDbDataSet(selectItems, streamingView);
     }
 
     @Override
-    protected DataSet materializeMainSchemaTable(Table table, Column[] columns, int maxRows) {
+    protected DataSet materializeMainSchemaTable(Table table, List<Column> columns, int maxRows) {
         return materializeMainSchemaTable(table, columns, 1, maxRows);
     }
 

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/couchdb/src/main/java/org/apache/metamodel/couchdb/CouchDbDataSet.java
----------------------------------------------------------------------
diff --git a/couchdb/src/main/java/org/apache/metamodel/couchdb/CouchDbDataSet.java b/couchdb/src/main/java/org/apache/metamodel/couchdb/CouchDbDataSet.java
index 47b0ac9..fef648e 100644
--- a/couchdb/src/main/java/org/apache/metamodel/couchdb/CouchDbDataSet.java
+++ b/couchdb/src/main/java/org/apache/metamodel/couchdb/CouchDbDataSet.java
@@ -19,6 +19,7 @@
 package org.apache.metamodel.couchdb;
 
 import java.util.Iterator;
+import java.util.List;
 
 import org.apache.metamodel.data.AbstractDataSet;
 import org.apache.metamodel.data.DataSetHeader;
@@ -37,7 +38,7 @@ final class CouchDbDataSet extends AbstractDataSet {
     private final StreamingViewResult _streamingViewResult;
     private Row _row;
 
-    public CouchDbDataSet(SelectItem[] selectItems, StreamingViewResult streamingViewResult) {
+    public CouchDbDataSet(List<SelectItem> selectItems, StreamingViewResult streamingViewResult) {
         super(selectItems);
         _streamingViewResult = streamingViewResult;
 

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/couchdb/src/main/java/org/apache/metamodel/couchdb/CouchDbSimpleTableDefSchemaBuilder.java
----------------------------------------------------------------------
diff --git a/couchdb/src/main/java/org/apache/metamodel/couchdb/CouchDbSimpleTableDefSchemaBuilder.java b/couchdb/src/main/java/org/apache/metamodel/couchdb/CouchDbSimpleTableDefSchemaBuilder.java
index 308d8f2..97e0f8b 100644
--- a/couchdb/src/main/java/org/apache/metamodel/couchdb/CouchDbSimpleTableDefSchemaBuilder.java
+++ b/couchdb/src/main/java/org/apache/metamodel/couchdb/CouchDbSimpleTableDefSchemaBuilder.java
@@ -40,8 +40,7 @@ public class CouchDbSimpleTableDefSchemaBuilder extends SimpleTableDefSchemaBuil
     @Override
     public MutableSchema build() {
         MutableSchema schema = super.build();
-        MutableTable[] tables = schema.getTables();
-        for (MutableTable table : tables) {
+        for (MutableTable table : schema.getMutableTables()) {
             CouchDbTableCreationBuilder.addMandatoryColumns(table);
         }
         return schema;

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/couchdb/src/test/java/org/apache/metamodel/couchdb/CouchDbDataContextTest.java
----------------------------------------------------------------------
diff --git a/couchdb/src/test/java/org/apache/metamodel/couchdb/CouchDbDataContextTest.java b/couchdb/src/test/java/org/apache/metamodel/couchdb/CouchDbDataContextTest.java
index c2ec998..508f3f1 100644
--- a/couchdb/src/test/java/org/apache/metamodel/couchdb/CouchDbDataContextTest.java
+++ b/couchdb/src/test/java/org/apache/metamodel/couchdb/CouchDbDataContextTest.java
@@ -166,7 +166,7 @@ public class CouchDbDataContextTest extends CouchDbTestCase {
                 + "Column[name=bar,columnNumber=2,type=STRING,nullable=null,nativeType=null,columnSize=null], "
                 + "Column[name=baz,columnNumber=3,type=INTEGER,nullable=null,nativeType=null,columnSize=null], "
                 + "Column[name=foo,columnNumber=4,type=STRING,nullable=null,nativeType=null,columnSize=null]]",
-                Arrays.toString(table.getColumns()));
+                Arrays.toString(table.getColumns().toArray()));
 
         // first delete the manually created database!
         dc.executeUpdate(new UpdateScript() {
@@ -184,7 +184,7 @@ public class CouchDbDataContextTest extends CouchDbTestCase {
             public void run(UpdateCallback callback) {
                 Table table = callback.createTable(dc.getDefaultSchema(), databaseName).withColumn("foo")
                         .ofType(ColumnType.STRING).withColumn("greeting").ofType(ColumnType.STRING).execute();
-                assertEquals("[_id, _rev, foo, greeting]", Arrays.toString(table.getColumnNames()));
+                assertEquals("[_id, _rev, foo, greeting]", Arrays.toString(table.getColumnNames().toArray()));
             }
         });
 
@@ -256,10 +256,10 @@ public class CouchDbDataContextTest extends CouchDbTestCase {
 
         // verify schema and execute query
         Schema schema = dc.getMainSchema();
-        assertEquals("[" + getDatabaseName() + "]", Arrays.toString(schema.getTableNames()));
+        assertEquals("[" + getDatabaseName() + "]", Arrays.toString(schema.getTableNames().toArray()));
 
         assertEquals("[_id, _rev, age, gender, name]",
-                Arrays.toString(schema.getTableByName(getDatabaseName()).getColumnNames()));
+                Arrays.toString(schema.getTableByName(getDatabaseName()).getColumnNames().toArray()));
         Column idColumn = schema.getTableByName(getDatabaseName()).getColumnByName("_id");
         assertEquals("Column[name=_id,columnNumber=0,type=STRING,nullable=false,nativeType=null,columnSize=null]",
                 idColumn.toString());
@@ -404,7 +404,7 @@ public class CouchDbDataContextTest extends CouchDbTestCase {
         Table table = dc.getTableByQualifiedLabel(getDatabaseName());
         assertNotNull(table);
 
-        assertEquals("[_id, _rev, name, gender, age]", Arrays.toString(table.getColumnNames()));
+        assertEquals("[_id, _rev, name, gender, age]", Arrays.toString(table.getColumnNames().toArray()));
 
         DataSet ds;
 

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/csv/src/main/java/org/apache/metamodel/csv/CsvCreateTableBuilder.java
----------------------------------------------------------------------
diff --git a/csv/src/main/java/org/apache/metamodel/csv/CsvCreateTableBuilder.java b/csv/src/main/java/org/apache/metamodel/csv/CsvCreateTableBuilder.java
index cd0bb38..b197f31 100644
--- a/csv/src/main/java/org/apache/metamodel/csv/CsvCreateTableBuilder.java
+++ b/csv/src/main/java/org/apache/metamodel/csv/CsvCreateTableBuilder.java
@@ -23,6 +23,8 @@ import org.apache.metamodel.schema.MutableTable;
 import org.apache.metamodel.schema.Schema;
 import org.apache.metamodel.schema.Table;
 
+import java.util.List;
+
 final class CsvCreateTableBuilder extends AbstractTableCreationBuilder<CsvUpdateCallback> {
 
     public CsvCreateTableBuilder(CsvUpdateCallback updateCallback, Schema schema, String name) {
@@ -37,12 +39,12 @@ final class CsvCreateTableBuilder extends AbstractTableCreationBuilder<CsvUpdate
         CsvUpdateCallback csvUpdateCallback = getUpdateCallback();
 
         MutableTable table = getTable();
-        String[] columnNames = table.getColumnNames();
+        List<String> columnNames = table.getColumnNames();
 
         CsvDataContext csvDataContext = (CsvDataContext) csvUpdateCallback.getDataContext();
 
         if (csvDataContext.getConfiguration().getColumnNameLineNumber() != CsvConfiguration.NO_COLUMN_NAME_LINE) {
-            csvUpdateCallback.writeRow(columnNames, false);
+            csvUpdateCallback.writeRow(columnNames.toArray(new String[columnNames.size()]), false);
         }
 
         CsvSchema schema = (CsvSchema) table.getSchema();

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/csv/src/main/java/org/apache/metamodel/csv/CsvDataContext.java
----------------------------------------------------------------------
diff --git a/csv/src/main/java/org/apache/metamodel/csv/CsvDataContext.java b/csv/src/main/java/org/apache/metamodel/csv/CsvDataContext.java
index 2e66ebe..34b25fa 100644
--- a/csv/src/main/java/org/apache/metamodel/csv/CsvDataContext.java
+++ b/csv/src/main/java/org/apache/metamodel/csv/CsvDataContext.java
@@ -270,7 +270,7 @@ public final class CsvDataContext extends QueryPostprocessDataContext implements
     }
 
     @Override
-    public DataSet materializeMainSchemaTable(Table table, Column[] columns, int maxRows) {
+    public DataSet materializeMainSchemaTable(Table table, List<Column> columns, int maxRows) {
         final int lineNumber = _configuration.getColumnNameLineNumber();
         final int columnCount = table.getColumnCount();
 
@@ -282,7 +282,7 @@ public final class CsvDataContext extends QueryPostprocessDataContext implements
                 String line = reader.readLine();
                 if (line == null) {
                     FileHelper.safeClose(reader);
-                    return new EmptyDataSet(columns);
+                    return EmptyDataSet.fromColumns(columns);
                 }
             }
         } catch (IOException e) {

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/csv/src/main/java/org/apache/metamodel/csv/CsvDataSet.java
----------------------------------------------------------------------
diff --git a/csv/src/main/java/org/apache/metamodel/csv/CsvDataSet.java b/csv/src/main/java/org/apache/metamodel/csv/CsvDataSet.java
index b93db3e..96acae7 100644
--- a/csv/src/main/java/org/apache/metamodel/csv/CsvDataSet.java
+++ b/csv/src/main/java/org/apache/metamodel/csv/CsvDataSet.java
@@ -19,11 +19,14 @@
 package org.apache.metamodel.csv;
 
 import java.io.IOException;
+import java.util.List;
+import java.util.stream.Collectors;
 
 import org.apache.metamodel.MetaModelException;
 import org.apache.metamodel.data.AbstractDataSet;
 import org.apache.metamodel.data.DefaultRow;
 import org.apache.metamodel.data.Row;
+import org.apache.metamodel.query.SelectItem;
 import org.apache.metamodel.schema.Column;
 import org.apache.metamodel.util.FileHelper;
 
@@ -41,9 +44,9 @@ final class CsvDataSet extends AbstractDataSet {
     private volatile Integer _rowsRemaining;
     private volatile Row _row;
 
-    public CsvDataSet(CSVReader reader, Column[] columns, Integer maxRows, int columnsInTable,
-            boolean failOnInconsistentRowLength) {
-        super(columns);
+    public CsvDataSet(CSVReader reader, List<Column> columns, Integer maxRows, int columnsInTable,
+                      boolean failOnInconsistentRowLength) {
+        super(columns.stream().map(SelectItem::new).collect(Collectors.toList()));
         _reader = reader;
         _columnsInTable = columnsInTable;
         _failOnInconsistentRowLength = failOnInconsistentRowLength;

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/csv/src/main/java/org/apache/metamodel/csv/CsvSchema.java
----------------------------------------------------------------------
diff --git a/csv/src/main/java/org/apache/metamodel/csv/CsvSchema.java b/csv/src/main/java/org/apache/metamodel/csv/CsvSchema.java
index 6de36a6..6c9a01e 100644
--- a/csv/src/main/java/org/apache/metamodel/csv/CsvSchema.java
+++ b/csv/src/main/java/org/apache/metamodel/csv/CsvSchema.java
@@ -18,9 +18,13 @@
  */
 package org.apache.metamodel.csv;
 
+import com.google.common.collect.Lists;
 import org.apache.metamodel.schema.AbstractSchema;
 import org.apache.metamodel.schema.Table;
 
+import java.util.ArrayList;
+import java.util.List;
+
 final class CsvSchema extends AbstractSchema {
 
     private static final long serialVersionUID = 1L;
@@ -54,10 +58,10 @@ final class CsvSchema extends AbstractSchema {
 	}
 
 	@Override
-	public Table[] getTables() {
+	public List<Table> getTables() {
 		if (_table == null) {
-			return new Table[0];
+			return new ArrayList<>();
 		}
-		return new Table[] { _table };
+		return Lists.newArrayList(_table);
 	}
 }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/csv/src/main/java/org/apache/metamodel/csv/CsvTable.java
----------------------------------------------------------------------
diff --git a/csv/src/main/java/org/apache/metamodel/csv/CsvTable.java b/csv/src/main/java/org/apache/metamodel/csv/CsvTable.java
index 0887eee..c786e70 100644
--- a/csv/src/main/java/org/apache/metamodel/csv/CsvTable.java
+++ b/csv/src/main/java/org/apache/metamodel/csv/CsvTable.java
@@ -19,7 +19,9 @@
 package org.apache.metamodel.csv;
 
 import java.io.IOException;
+import java.util.*;
 
+import com.google.common.collect.Lists;
 import org.apache.metamodel.schema.AbstractTable;
 import org.apache.metamodel.schema.Column;
 import org.apache.metamodel.schema.ColumnType;
@@ -40,7 +42,7 @@ final class CsvTable extends AbstractTable {
 
     private final CsvSchema _schema;
     private final String _tableName;
-    private Column[] _columns;
+    private List<Column> _columns;
 
     /**
      * Constructor for creating a new CSV table which has not yet been written.
@@ -48,7 +50,7 @@ final class CsvTable extends AbstractTable {
      * @param schema
      * @param columnNames
      */
-    public CsvTable(CsvSchema schema, String tableName, String[] columnNames) {
+    public CsvTable(CsvSchema schema, String tableName, List<String> columnNames) {
         this(schema, tableName);
         _columns = buildColumns(columnNames);
     }
@@ -75,7 +77,7 @@ final class CsvTable extends AbstractTable {
     }
 
     @Override
-    public Column[] getColumns() {
+    public List<Column> getColumns() {
         if (_columns == null) {
             synchronized (this) {
                 if (_columns == null) {
@@ -86,7 +88,7 @@ final class CsvTable extends AbstractTable {
         return _columns;
     }
 
-    private Column[] buildColumns() {
+    private List<Column> buildColumns() {
         CSVReader reader = null;
         try {
             reader = _schema.getDataContext().createCsvReader(0);
@@ -95,7 +97,7 @@ final class CsvTable extends AbstractTable {
             for (int i = 1; i < columnNameLineNumber; i++) {
                 reader.readNext();
             }
-            final String[] columnHeaders = reader.readNext();
+            final List<String> columnHeaders = Arrays.asList(Optional.ofNullable(reader.readNext()).orElse(new String[0]));
 
             reader.close();
             return buildColumns(columnHeaders);
@@ -107,9 +109,9 @@ final class CsvTable extends AbstractTable {
         }
     }
 
-    private Column[] buildColumns(final String[] columnNames) {
+    private List<Column> buildColumns(final List<String> columnNames) {
         if (columnNames == null) {
-            return new Column[0];
+            return new ArrayList<>();
         }
         
         final CsvConfiguration configuration = _schema.getDataContext().getConfiguration();
@@ -117,16 +119,17 @@ final class CsvTable extends AbstractTable {
         final boolean nullable = !configuration.isFailOnInconsistentRowLength();
         final ColumnNamingStrategy columnNamingStrategy = configuration.getColumnNamingStrategy();
 
-        final Column[] columns = new Column[columnNames.length];
+        List<Column> columns = new ArrayList<>();
+
         try (final ColumnNamingSession namingSession = columnNamingStrategy.startColumnNamingSession()) {
-            for (int i = 0; i < columnNames.length; i++) {
+            for (int i = 0; i < columnNames.size(); i++) {
                 final String intrinsicColumnName = columnNameLineNumber == CsvConfiguration.NO_COLUMN_NAME_LINE ? null
-                        : columnNames[i];
+                        : columnNames.get(i);
                 final String columnName = namingSession.getNextColumnName(new ColumnNamingContextImpl(this,
                         intrinsicColumnName, i));
                 final Column column = new MutableColumn(columnName, ColumnType.STRING, this, i, null, null, nullable,
                         null, false, null);
-                columns[i] = column;
+                columns.add(column);
             }
         }
         return columns;
@@ -143,8 +146,8 @@ final class CsvTable extends AbstractTable {
     }
 
     @Override
-    public Relationship[] getRelationships() {
-        return new Relationship[0];
+    public Collection<Relationship> getRelationships() {
+        return Lists.newArrayList();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/csv/src/main/java/org/apache/metamodel/csv/SingleLineCsvDataSet.java
----------------------------------------------------------------------
diff --git a/csv/src/main/java/org/apache/metamodel/csv/SingleLineCsvDataSet.java b/csv/src/main/java/org/apache/metamodel/csv/SingleLineCsvDataSet.java
index 250c249..4b24892 100644
--- a/csv/src/main/java/org/apache/metamodel/csv/SingleLineCsvDataSet.java
+++ b/csv/src/main/java/org/apache/metamodel/csv/SingleLineCsvDataSet.java
@@ -20,11 +20,14 @@ package org.apache.metamodel.csv;
 
 import java.io.BufferedReader;
 import java.io.IOException;
+import java.util.List;
+import java.util.stream.Collectors;
 
 import org.apache.metamodel.MetaModelException;
 import org.apache.metamodel.data.AbstractDataSet;
 import org.apache.metamodel.data.DataSetHeader;
 import org.apache.metamodel.data.Row;
+import org.apache.metamodel.query.SelectItem;
 import org.apache.metamodel.schema.Column;
 import org.apache.metamodel.util.FileHelper;
 
@@ -46,9 +49,9 @@ final class SingleLineCsvDataSet extends AbstractDataSet {
     private volatile Integer _rowsRemaining;
     private volatile Row _row;
 
-    public SingleLineCsvDataSet(BufferedReader reader, ICSVParser csvParser, Column[] columns, Integer maxRows,
-            int columnsInTable, boolean failOnInconsistentRowLength) {
-        super(columns);
+    public SingleLineCsvDataSet(BufferedReader reader, ICSVParser csvParser, List<Column> columns, Integer maxRows,
+                                int columnsInTable, boolean failOnInconsistentRowLength) {
+        super(columns.stream().map(SelectItem::new).collect(Collectors.toList()));
         _reader = reader;
         _csvParser = csvParser;
         _columnsInTable = columnsInTable;

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/csv/src/test/java/org/apache/metamodel/csv/CsvBigFileMemoryTest.java
----------------------------------------------------------------------
diff --git a/csv/src/test/java/org/apache/metamodel/csv/CsvBigFileMemoryTest.java b/csv/src/test/java/org/apache/metamodel/csv/CsvBigFileMemoryTest.java
index cf76c75..5c7d229 100644
--- a/csv/src/test/java/org/apache/metamodel/csv/CsvBigFileMemoryTest.java
+++ b/csv/src/test/java/org/apache/metamodel/csv/CsvBigFileMemoryTest.java
@@ -62,7 +62,7 @@ public class CsvBigFileMemoryTest extends TestCase {
         System.out.println("time at start: " + timeAtStart);
 
         final DataContext dc = new CsvDataContext(file, new CsvConfiguration(1, false, false));
-        final Table t = dc.getDefaultSchema().getTables()[0];
+        final Table t = dc.getDefaultSchema().getTables().get(0);
 
         final long timeAfterDataContext = System.currentTimeMillis();
         System.out.println("time after DataContext: " + timeAfterDataContext);
@@ -116,7 +116,7 @@ public class CsvBigFileMemoryTest extends TestCase {
     public void testApproximatedCountHugeFile() throws Exception {
         DataContext dc = new CsvDataContext(getHugeFile());
 
-        Table table = dc.getDefaultSchema().getTables()[0];
+        Table table = dc.getDefaultSchema().getTables().get(0);
         Query q = dc.query().from(table).selectCount().toQuery();
         SelectItem selectItem = q.getSelectClause().getItem(0);
         selectItem.setFunctionApproximationAllowed(true);

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/csv/src/test/java/org/apache/metamodel/csv/CsvDataContextTest.java
----------------------------------------------------------------------
diff --git a/csv/src/test/java/org/apache/metamodel/csv/CsvDataContextTest.java b/csv/src/test/java/org/apache/metamodel/csv/CsvDataContextTest.java
index 39f9d43..029a179 100644
--- a/csv/src/test/java/org/apache/metamodel/csv/CsvDataContextTest.java
+++ b/csv/src/test/java/org/apache/metamodel/csv/CsvDataContextTest.java
@@ -79,10 +79,10 @@ public class CsvDataContextTest extends TestCase {
         
         CsvDataContext dc1 = new CsvDataContext(file, csvConfiguration);
 
-        Table[] tables = dc1.getDefaultSchema().getTables();
-        assertEquals(1, tables.length);
+        List<Table> tables = dc1.getDefaultSchema().getTables();
+        assertEquals(1, tables.size());
         
-        Table table = tables[0];
+        Table table = tables.get(0);
         assertEquals("testEmptyFileNoColumnHeaderLine.csv", table.getName());
         assertEquals(2, table.getColumnCount());
         
@@ -100,7 +100,7 @@ public class CsvDataContextTest extends TestCase {
         final CsvDataContext dc = new CsvDataContext(file);
         assertEquals(1, dc.getDefaultSchema().getTableCount());
 
-        final Table table1 = dc.getDefaultSchema().getTables()[0];
+        final Table table1 = dc.getDefaultSchema().getTables().get(0);
         assertEquals("testEmptyFileNoColumnHeaderLine.csv", table1.getName());
         assertEquals(0, table1.getColumnCount());
 
@@ -139,7 +139,7 @@ public class CsvDataContextTest extends TestCase {
                 .replaceAll("\n", "!LINEBREAK!"));
 
         final CsvDataContext dc = new CsvDataContext(targetFile);
-        final Table table = dc.getDefaultSchema().getTables()[0];
+        final Table table = dc.getDefaultSchema().getTables().get(0);
 
         dc.executeUpdate(new UpdateScript() {
             @Override
@@ -181,7 +181,7 @@ public class CsvDataContextTest extends TestCase {
                 CsvConfiguration.NO_COLUMN_NAME_LINE));
         assertEquals(1, dc.getDefaultSchema().getTableCount());
 
-        Table table = dc.getDefaultSchema().getTables()[0];
+        Table table = dc.getDefaultSchema().getTables().get(0);
         assertEquals("empty_file.csv", table.getName());
         assertEquals(0, table.getColumnCount());
     }
@@ -190,7 +190,7 @@ public class CsvDataContextTest extends TestCase {
         DataContext dc = new CsvDataContext(new File("src/test/resources/csv_people.csv"), new CsvConfiguration(20));
         assertEquals(1, dc.getDefaultSchema().getTableCount());
 
-        Table table = dc.getDefaultSchema().getTables()[0];
+        Table table = dc.getDefaultSchema().getTables().get(0);
         assertEquals("csv_people.csv", table.getName());
         assertEquals(0, table.getColumnCount());
     }
@@ -236,7 +236,7 @@ public class CsvDataContextTest extends TestCase {
     public void testApproximatedCountSmallFile() throws Exception {
         DataContext dc = new CsvDataContext(new File("src/test/resources/csv_people.csv"));
 
-        Table table = dc.getDefaultSchema().getTables()[0];
+        Table table = dc.getDefaultSchema().getTables().get(0);
         Query q = dc.query().from(table).selectCount().toQuery();
         SelectItem selectItem = q.getSelectClause().getItem(0);
         selectItem.setFunctionApproximationAllowed(true);
@@ -252,7 +252,7 @@ public class CsvDataContextTest extends TestCase {
 
     public void testFilterOnNumberColumn() throws Exception {
         CsvDataContext dc = new CsvDataContext(new File("src/test/resources/csv_people.csv"));
-        Table table = dc.getDefaultSchema().getTables()[0];
+        Table table = dc.getDefaultSchema().getTables().get(0);
 
         Query q = dc.query().from(table).select("name").where("age").greaterThan(18).toQuery();
         List<Object[]> result = dc.executeQuery(q).toObjectArrays();
@@ -297,7 +297,7 @@ public class CsvDataContextTest extends TestCase {
     }
 
     public void doTicketFileTests(DataContext dc) {
-        Table table = dc.getDefaultSchema().getTables()[0];
+        Table table = dc.getDefaultSchema().getTables().get(0);
         Query q = dc.query().from(table).select(table.getColumns()).toQuery();
 
         DataSet dataSet = dc.executeQuery(q);
@@ -318,18 +318,18 @@ public class CsvDataContextTest extends TestCase {
     public void testHighColumnNameLineNumber() throws Exception {
         File file = new File("src/test/resources/csv_people.csv");
         QueryPostprocessDataContext dc = new CsvDataContext(file, new CsvConfiguration(3));
-        Schema[] schemas = dc.getSchemas();
-        assertEquals(2, schemas.length);
+
+        assertEquals(2, dc.getSchemas().size());
         Schema schema = dc.getDefaultSchema();
         assertEquals("resources", schema.getName());
         assertEquals(1, schema.getTableCount());
-        Table table = schema.getTables()[0];
+        Table table = schema.getTables().get(0);
         assertEquals("csv_people.csv", table.getName());
 
         assertEquals(4, table.getColumnCount());
         assertEquals(0, table.getRelationshipCount());
 
-        Column[] columns = table.getColumns();
+        Column[] columns = table.getColumns().toArray(new Column[0]);
         assertEquals("2", columns[0].getName());
         assertEquals("michael", columns[1].getName());
         assertEquals("male", columns[2].getName());
@@ -350,18 +350,17 @@ public class CsvDataContextTest extends TestCase {
         File file = new File("src/test/resources/csv_people.csv");
         QueryPostprocessDataContext dc = new CsvDataContext(file, new CsvConfiguration(
                 CsvConfiguration.NO_COLUMN_NAME_LINE));
-        Schema[] schemas = dc.getSchemas();
-        assertEquals(2, schemas.length);
+        assertEquals(2, dc.getSchemas().size());
         Schema schema = dc.getDefaultSchema();
         assertEquals("resources", schema.getName());
         assertEquals(1, schema.getTableCount());
-        Table table = schema.getTables()[0];
+        Table table = schema.getTables().get(0);
         assertEquals("csv_people.csv", table.getName());
 
         assertEquals(4, table.getColumnCount());
         assertEquals(0, table.getRelationshipCount());
 
-        Column[] columns = table.getColumns();
+        Column[] columns = table.getColumns().toArray(new Column[0]);
         assertEquals("A", columns[0].getName());
         assertEquals("B", columns[1].getName());
         assertEquals("C", columns[2].getName());
@@ -381,18 +380,17 @@ public class CsvDataContextTest extends TestCase {
     public void testGetSchemas() throws Exception {
         File file = new File("src/test/resources/csv_people.csv");
         QueryPostprocessDataContext dc = new CsvDataContext(file);
-        Schema[] schemas = dc.getSchemas();
-        assertEquals(2, schemas.length);
+        assertEquals(2, dc.getSchemas().size());
         Schema schema = dc.getDefaultSchema();
         assertEquals("resources", schema.getName());
         assertEquals(1, schema.getTableCount());
-        Table table = schema.getTables()[0];
+        Table table = schema.getTables().get(0);
         assertEquals("csv_people.csv", table.getName());
 
         assertEquals(4, table.getColumnCount());
         assertEquals(0, table.getRelationshipCount());
 
-        Column[] columns = table.getColumns();
+        Column[] columns = table.getColumns().toArray(new Column[0]);
         assertEquals("id", columns[0].getName());
         assertEquals("name", columns[1].getName());
         assertEquals("gender", columns[2].getName());
@@ -452,7 +450,7 @@ public class CsvDataContextTest extends TestCase {
         DataSet data = dc.executeQuery(q);
         assertEquals(
                 "[csv_people.csv.gender, MAX(csv_people.csv.age), MIN(csv_people.csv.age), COUNT(*) AS total, MIN(csv_people.csv.id) AS firstId]",
-                Arrays.toString(data.getSelectItems()));
+                Arrays.toString(data.getSelectItems().toArray()));
 
         String[] expectations = new String[] { "Row[values=[female, 20, 17, 5, 5]]", "Row[values=[male, 19, 17, 4, 1]]" };
 
@@ -466,7 +464,7 @@ public class CsvDataContextTest extends TestCase {
     public void testMaterializeTable() throws Exception {
         File file = new File("src/test/resources/csv_people.csv");
         CsvDataContext dc = new CsvDataContext(file, new CsvConfiguration(1, false, false));
-        Table table = dc.getSchemas()[0].getTables()[0];
+        Table table = dc.getSchemas().get(0).getTables().get(0);
         DataSet dataSet = dc.materializeMainSchemaTable(table, table.getColumns(), -1);
         assertNull(dataSet.getRow());
         assertTrue(dataSet.next());
@@ -494,7 +492,7 @@ public class CsvDataContextTest extends TestCase {
     public void testAlternativeDelimitors() throws Exception {
         File file = new File("src/test/resources/csv_semicolon_singlequote.csv");
         CsvDataContext dc = new CsvDataContext(file, semicolonConfiguration);
-        Table table = dc.getSchemas()[0].getTables()[0];
+        Table table = dc.getSchemas().get(0).getTables().get(0);
         DataSet dataSet = dc.materializeMainSchemaTable(table, table.getColumns(), -1);
         assertTrue(dataSet.next());
         assertEquals("Row[values=[1, mike, male, 18]]", dataSet.getRow().toString());
@@ -517,7 +515,7 @@ public class CsvDataContextTest extends TestCase {
     public void testMaxRows() throws Exception {
         File file = new File("src/test/resources/csv_semicolon_singlequote.csv");
         CsvDataContext dc = new CsvDataContext(file, semicolonConfiguration);
-        Table table = dc.getDefaultSchema().getTables()[0];
+        Table table = dc.getDefaultSchema().getTables().get(0);
         Query query = new Query().from(table).select(table.getColumns()).setMaxRows(5);
         DataSet dataSet = dc.executeQuery(query);
 
@@ -528,7 +526,7 @@ public class CsvDataContextTest extends TestCase {
     public void testQueryOnlyAggregate() throws Exception {
         File file = new File("src/test/resources/csv_people.csv");
         QueryPostprocessDataContext dc = new CsvDataContext(file);
-        Table table = dc.getDefaultSchema().getTables()[0];
+        Table table = dc.getDefaultSchema().getTables().get(0);
 
         Query q = new Query().selectCount().from(table);
         assertEquals("SELECT COUNT(*) FROM resources.csv_people.csv", q.toString());
@@ -539,7 +537,7 @@ public class CsvDataContextTest extends TestCase {
         assertEquals(1, row.length);
         assertEquals("[9]", Arrays.toString(row));
 
-        q.select(table.getColumns()[0]);
+        q.select(table.getColumns().get(0));
         assertEquals("SELECT COUNT(*), csv_people.csv.id FROM resources.csv_people.csv", q.toString());
         data = dc.executeQuery(q).toObjectArrays();
         assertEquals(9, data.size());
@@ -563,7 +561,7 @@ public class CsvDataContextTest extends TestCase {
     public void testOffsetAndMaxrows() throws Exception {
         DataContext dc = new CsvDataContext(new File("src/test/resources/csv_people.csv"));
 
-        Table table = dc.getDefaultSchema().getTables()[0];
+        Table table = dc.getDefaultSchema().getTables().get(0);
         Query q = dc.query().from(table).select(table.getColumnByName("name")).toQuery();
         q.setFirstRow(3);
         q.setMaxRows(2);
@@ -571,7 +569,7 @@ public class CsvDataContextTest extends TestCase {
         DataSet ds;
 
         ds = dc.executeQuery(q);
-        assertEquals(1, ds.getSelectItems().length);
+        assertEquals(1, ds.getSelectItems().size());
         assertTrue(ds.next());
         assertEquals("peter", ds.getRow().getValue(0).toString());
         assertTrue(ds.next());
@@ -594,7 +592,7 @@ public class CsvDataContextTest extends TestCase {
         FileHelper.copy(new File("src/test/resources/csv_to_be_truncated.csv"), file);
 
         CsvDataContext dc = new CsvDataContext(file, new CsvConfiguration(1, "UTF8", ',', '"', '\\', true));
-        assertEquals("[id, name, gender, age]", Arrays.toString(dc.getDefaultSchema().getTable(0).getColumnNames()));
+        assertEquals("[id, name, gender, age]", Arrays.toString(dc.getDefaultSchema().getTable(0).getColumnNames().toArray()));
 
         dc.executeUpdate(new UpdateScript() {
             @Override
@@ -628,10 +626,10 @@ public class CsvDataContextTest extends TestCase {
                 Table table = cb.createTable(schema, "foobar").withColumn("foo").withColumn("bar").execute();
                 tableRef.set(table);
                 assertEquals(schema, table.getSchema());
-                assertEquals(schema.getTables()[0], table);
+                assertEquals(schema.getTables().get(0), table);
                 assertTrue(file.exists());
 
-                assertEquals("[foo, bar]", Arrays.toString(table.getColumnNames()));
+                assertEquals("[foo, bar]", Arrays.toString(table.getColumnNames().toArray()));
 
                 cb.insertInto(table).value(0, "f").value(1, "b").execute();
                 cb.insertInto(table).value(0, "o").value(table.getColumnByName("bar"), "a").execute();
@@ -640,9 +638,9 @@ public class CsvDataContextTest extends TestCase {
         });
 
         // query the file to check results
-        final Table readTable = schema.getTables()[0];
+        final Table readTable = schema.getTables().get(0);
         assertEquals(tableRef.get(), readTable);
-        assertEquals("[foo, bar]", Arrays.toString(readTable.getColumnNames()));
+        assertEquals("[foo, bar]", Arrays.toString(readTable.getColumnNames().toArray()));
 
         final Query query = dc.query().from(readTable).select("bar").and("foo").toQuery();
         DataSet ds = dc.executeQuery(query);
@@ -723,15 +721,15 @@ public class CsvDataContextTest extends TestCase {
     public void testOnlyNumberOneSymbol() throws Exception {
         DataContext dc = new CsvDataContext(new File("src/test/resources/csv_only_number_one.csv"));
         Map<Column, TypeConverter<?, ?>> converters = Converters.autoDetectConverters(dc, dc.getDefaultSchema()
-                .getTables()[0], 1000);
+                .getTables().get(0), 1000);
 
         assertEquals(1, converters.size());
         assertEquals(StringToBooleanConverter.class, converters.values().iterator().next().getClass());
 
         dc = Converters.addTypeConverters(dc, converters);
 
-        Table table = dc.getDefaultSchema().getTables()[0];
-        MutableColumn col = (MutableColumn) table.getColumns()[0];
+        Table table = dc.getDefaultSchema().getTables().get(0);
+        MutableColumn col = (MutableColumn) table.getColumns().get(0);
         Query q = dc.query().from(table).select(col).toQuery();
         assertEquals("SELECT csv_only_number_one.csv.number FROM resources.csv_only_number_one.csv", q.toSql());
 

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/csv/src/test/java/org/apache/metamodel/csv/SingleLineCsvRowTest.java
----------------------------------------------------------------------
diff --git a/csv/src/test/java/org/apache/metamodel/csv/SingleLineCsvRowTest.java b/csv/src/test/java/org/apache/metamodel/csv/SingleLineCsvRowTest.java
index a01821c..0686cab 100644
--- a/csv/src/test/java/org/apache/metamodel/csv/SingleLineCsvRowTest.java
+++ b/csv/src/test/java/org/apache/metamodel/csv/SingleLineCsvRowTest.java
@@ -22,7 +22,9 @@ import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
+import java.util.List;
 
+import com.google.common.collect.Lists;
 import org.apache.metamodel.data.Row;
 import org.apache.metamodel.schema.Column;
 import org.apache.metamodel.schema.MutableColumn;
@@ -35,7 +37,7 @@ public class SingleLineCsvRowTest {
 
     @Test
     public void testSerialize() throws Exception {
-        final Column[] columns = new Column[] { new MutableColumn("1"), new MutableColumn("2") };
+        final List<Column> columns = Lists.newArrayList( new MutableColumn("1"), new MutableColumn("2"));
         CSVParser csvParser = new CSVParser();
         final SingleLineCsvDataSet dataSet = new SingleLineCsvDataSet(null, csvParser, columns, null, 2, false);
         final SingleLineCsvRow originalRow = new SingleLineCsvRow(dataSet, "foo,bar", 2, false, 1);

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/csv/src/test/java/org/apache/metamodel/intercept/InterceptionCsvIntegrationTest.java
----------------------------------------------------------------------
diff --git a/csv/src/test/java/org/apache/metamodel/intercept/InterceptionCsvIntegrationTest.java b/csv/src/test/java/org/apache/metamodel/intercept/InterceptionCsvIntegrationTest.java
index 7974beb..06c1822 100644
--- a/csv/src/test/java/org/apache/metamodel/intercept/InterceptionCsvIntegrationTest.java
+++ b/csv/src/test/java/org/apache/metamodel/intercept/InterceptionCsvIntegrationTest.java
@@ -68,10 +68,10 @@ public class InterceptionCsvIntegrationTest extends TestCase {
 		});
 
 		assertEquals("[table]",
-				Arrays.toString(dc.getDefaultSchema().getTableNames()));
-		Table table = dc.getDefaultSchema().getTables()[0];
+				Arrays.toString(dc.getDefaultSchema().getTableNames().toArray()));
+		Table table = dc.getDefaultSchema().getTables().get(0);
 		assertEquals("[col1, col2, foobar]",
-				Arrays.toString(table.getColumnNames()));
+				Arrays.toString(table.getColumnNames().toArray()));
 
 		DataSet ds = dc.query().from(table).select(table.getColumns())
 				.execute();

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/dynamodb/src/main/java/org/apache/metamodel/dynamodb/DynamoDbDataContext.java
----------------------------------------------------------------------
diff --git a/dynamodb/src/main/java/org/apache/metamodel/dynamodb/DynamoDbDataContext.java b/dynamodb/src/main/java/org/apache/metamodel/dynamodb/DynamoDbDataContext.java
index 255120c..504769d 100644
--- a/dynamodb/src/main/java/org/apache/metamodel/dynamodb/DynamoDbDataContext.java
+++ b/dynamodb/src/main/java/org/apache/metamodel/dynamodb/DynamoDbDataContext.java
@@ -24,6 +24,7 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import org.apache.metamodel.MetaModelException;
 import org.apache.metamodel.QueryPostprocessDataContext;
@@ -257,11 +258,8 @@ public class DynamoDbDataContext extends QueryPostprocessDataContext implements
     }
 
     @Override
-    protected DataSet materializeMainSchemaTable(Table table, Column[] columns, int maxRows) {
-        final List<String> attributeNames = new ArrayList<>(columns.length);
-        for (final Column column : columns) {
-            attributeNames.add(column.getName());
-        }
+    protected DataSet materializeMainSchemaTable(Table table, List<Column> columns, int maxRows) {
+        final List<String> attributeNames = columns.stream().map(col-> col.getName()).collect(Collectors.toList());
         final ScanRequest scanRequest = new ScanRequest(table.getName());
         scanRequest.setAttributesToGet(attributeNames);
         if (maxRows > 0) {

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/dynamodb/src/main/java/org/apache/metamodel/dynamodb/DynamoDbDataSet.java
----------------------------------------------------------------------
diff --git a/dynamodb/src/main/java/org/apache/metamodel/dynamodb/DynamoDbDataSet.java b/dynamodb/src/main/java/org/apache/metamodel/dynamodb/DynamoDbDataSet.java
index 17b781b..887b3e4 100644
--- a/dynamodb/src/main/java/org/apache/metamodel/dynamodb/DynamoDbDataSet.java
+++ b/dynamodb/src/main/java/org/apache/metamodel/dynamodb/DynamoDbDataSet.java
@@ -19,12 +19,15 @@
 package org.apache.metamodel.dynamodb;
 
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import org.apache.metamodel.data.AbstractDataSet;
 import org.apache.metamodel.data.DataSetHeader;
 import org.apache.metamodel.data.DefaultRow;
 import org.apache.metamodel.data.Row;
+import org.apache.metamodel.query.SelectItem;
 import org.apache.metamodel.schema.Column;
 
 import com.amazonaws.services.dynamodbv2.model.AttributeValue;
@@ -35,8 +38,8 @@ final class DynamoDbDataSet extends AbstractDataSet {
     private final Iterator<Map<String, AttributeValue>> _iterator;
     private Map<String, AttributeValue> _currentItem;
 
-    public DynamoDbDataSet(Column[] columns, ScanResult result) {
-        super(columns);
+    public DynamoDbDataSet(List<Column> columns, ScanResult result) {
+        super(columns.stream().map(SelectItem::new).collect(Collectors.toList()));
         _iterator = result.getItems().iterator();
     }
 

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/dynamodb/src/main/java/org/apache/metamodel/dynamodb/DynamoDbTableCreationBuilder.java
----------------------------------------------------------------------
diff --git a/dynamodb/src/main/java/org/apache/metamodel/dynamodb/DynamoDbTableCreationBuilder.java b/dynamodb/src/main/java/org/apache/metamodel/dynamodb/DynamoDbTableCreationBuilder.java
index c9779df..f989b5d 100644
--- a/dynamodb/src/main/java/org/apache/metamodel/dynamodb/DynamoDbTableCreationBuilder.java
+++ b/dynamodb/src/main/java/org/apache/metamodel/dynamodb/DynamoDbTableCreationBuilder.java
@@ -63,8 +63,7 @@ class DynamoDbTableCreationBuilder extends AbstractTableCreationBuilder<DynamoDb
                 DynamoDbDataContext.SYSTEM_PROPERTY_THROUGHPUT_WRITE_CAPACITY, "5"));
         final ProvisionedThroughput provisionedThroughput = new ProvisionedThroughput(readCapacity, writeCapacity);
 
-        final Column[] columns = table.getColumns();
-        for (Column column : columns) {
+        for (Column column : table.getColumns()) {
             if (column.isPrimaryKey()) {
                 final KeyType keyType = getKeyType(column.getRemarks());
                 keySchema.add(new KeySchemaElement(column.getName(), keyType));

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/dynamodb/src/test/java/org/apache/metamodel/dynamodb/DynamoDbDataContextIntegrationTest.java
----------------------------------------------------------------------
diff --git a/dynamodb/src/test/java/org/apache/metamodel/dynamodb/DynamoDbDataContextIntegrationTest.java b/dynamodb/src/test/java/org/apache/metamodel/dynamodb/DynamoDbDataContextIntegrationTest.java
index 967655d..ba60096 100644
--- a/dynamodb/src/test/java/org/apache/metamodel/dynamodb/DynamoDbDataContextIntegrationTest.java
+++ b/dynamodb/src/test/java/org/apache/metamodel/dynamodb/DynamoDbDataContextIntegrationTest.java
@@ -147,7 +147,7 @@ public class DynamoDbDataContextIntegrationTest {
                 assertEquals(tableName, table.getName());
 
                 // Right now we can only discover indexed columns
-                assertEquals("[id, counter, project, foundation]", Arrays.toString(table.getColumnNames()));
+                assertEquals("[id, counter, project, foundation]", Arrays.toString(table.getColumnNames().toArray()));
 
                 final Column idColumn = table.getColumnByName("id");
                 assertEquals(true, idColumn.isPrimaryKey());

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/elasticsearch/native/src/main/java/org/apache/metamodel/elasticsearch/nativeclient/ElasticSearchDataContext.java
----------------------------------------------------------------------
diff --git a/elasticsearch/native/src/main/java/org/apache/metamodel/elasticsearch/nativeclient/ElasticSearchDataContext.java b/elasticsearch/native/src/main/java/org/apache/metamodel/elasticsearch/nativeclient/ElasticSearchDataContext.java
index 7353cbd..83d89c7 100644
--- a/elasticsearch/native/src/main/java/org/apache/metamodel/elasticsearch/nativeclient/ElasticSearchDataContext.java
+++ b/elasticsearch/native/src/main/java/org/apache/metamodel/elasticsearch/nativeclient/ElasticSearchDataContext.java
@@ -24,6 +24,7 @@ import java.util.Arrays;
 import java.util.Comparator;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import org.apache.metamodel.DataContext;
 import org.apache.metamodel.MetaModelException;
@@ -253,7 +254,7 @@ public class ElasticSearchDataContext extends QueryPostprocessDataContext implem
             dynamicTableDefinitions.clear();
             dynamicTableDefinitions.addAll(Arrays.asList(tables));
             for (final SimpleTableDef tableDef : dynamicTableDefinitions) {
-                final List<String> tableNames = Arrays.asList(theSchema.getTableNames());
+                final List<String> tableNames = theSchema.getTableNames();
 
                 if (!tableNames.contains(tableDef.getName())) {
                     addTable(theSchema, tableDef);
@@ -294,10 +295,10 @@ public class ElasticSearchDataContext extends QueryPostprocessDataContext implem
     }
 
     @Override
-    protected DataSet materializeMainSchemaTable(Table table, Column[] columns, int maxRows) {
+    protected DataSet materializeMainSchemaTable(Table table, List<Column> columns, int maxRows) {
         final SearchRequestBuilder searchRequest = createSearchRequest(table, 1, maxRows, null);
         final SearchResponse response = searchRequest.execute().actionGet();
-        return new ElasticSearchDataSet(elasticSearchClient, response, columns, false);
+        return new ElasticSearchDataSet(elasticSearchClient, response, columns.stream().map(SelectItem::new).collect(Collectors.toList()), false);
     }
 
     private SearchRequestBuilder createSearchRequest(Table table, int firstRow, int maxRows, QueryBuilder queryBuilder) {

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/elasticsearch/native/src/main/java/org/apache/metamodel/elasticsearch/nativeclient/ElasticSearchDataSet.java
----------------------------------------------------------------------
diff --git a/elasticsearch/native/src/main/java/org/apache/metamodel/elasticsearch/nativeclient/ElasticSearchDataSet.java b/elasticsearch/native/src/main/java/org/apache/metamodel/elasticsearch/nativeclient/ElasticSearchDataSet.java
index 7f4048a..1a04bc8 100644
--- a/elasticsearch/native/src/main/java/org/apache/metamodel/elasticsearch/nativeclient/ElasticSearchDataSet.java
+++ b/elasticsearch/native/src/main/java/org/apache/metamodel/elasticsearch/nativeclient/ElasticSearchDataSet.java
@@ -55,14 +55,7 @@ final class ElasticSearchDataSet extends AbstractDataSet {
         _searchResponse = searchResponse;
         _closed = new AtomicBoolean(false);
     }
-    
-    public ElasticSearchDataSet(Client client, SearchResponse searchResponse, Column[] columns,
-            boolean queryPostProcessed) {
-        super(columns);
-        _client = client;
-        _searchResponse = searchResponse;
-        _closed = new AtomicBoolean(false);
-    }
+
 
     @Override
     public void close() {

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/elasticsearch/native/src/test/java/org/apache/metamodel/elasticsearch/nativeclient/ElasticSearchDataContextTest.java
----------------------------------------------------------------------
diff --git a/elasticsearch/native/src/test/java/org/apache/metamodel/elasticsearch/nativeclient/ElasticSearchDataContextTest.java b/elasticsearch/native/src/test/java/org/apache/metamodel/elasticsearch/nativeclient/ElasticSearchDataContextTest.java
index 8a83263..ec5ecba 100644
--- a/elasticsearch/native/src/test/java/org/apache/metamodel/elasticsearch/nativeclient/ElasticSearchDataContextTest.java
+++ b/elasticsearch/native/src/test/java/org/apache/metamodel/elasticsearch/nativeclient/ElasticSearchDataContextTest.java
@@ -125,11 +125,11 @@ public class ElasticSearchDataContextTest {
     @Test
     public void testSimpleQuery() throws Exception {
         assertEquals("[bulktype, peopletype, tweet1, tweet2]",
-                Arrays.toString(dataContext.getDefaultSchema().getTableNames()));
+                Arrays.toString(dataContext.getDefaultSchema().getTableNames().toArray()));
 
         Table table = dataContext.getDefaultSchema().getTableByName("tweet1");
 
-        assertEquals("[_id, message, postDate, user]", Arrays.toString(table.getColumnNames()));
+        assertEquals("[_id, message, postDate, user]", Arrays.toString(table.getColumnNames().toArray()));
 
         assertEquals(ColumnType.STRING, table.getColumnByName("user").getType());
         assertEquals(ColumnType.DATE, table.getColumnByName("postDate").getType());
@@ -146,7 +146,7 @@ public class ElasticSearchDataContextTest {
     @Test
     public void testDocumentIdAsPrimaryKey() throws Exception {
         Table table = dataContext.getDefaultSchema().getTableByName("tweet2");
-        Column[] pks = table.getPrimaryKeys();
+        Column[] pks = table.getPrimaryKeys().toArray(new Column[0]);
         assertEquals(1, pks.length);
         assertEquals("_id", pks[0].getName());
 
@@ -159,7 +159,7 @@ public class ElasticSearchDataContextTest {
     @Test
     public void testExecutePrimaryKeyLookupQuery() throws Exception {
         Table table = dataContext.getDefaultSchema().getTableByName("tweet2");
-        Column[] pks = table.getPrimaryKeys();
+        Column[] pks = table.getPrimaryKeys().toArray(new Column[0]);
 
         try (DataSet ds = dataContext.query().from(table).selectAll().where(pks[0]).eq("tweet_tweet2_1").execute()) {
             assertTrue(ds.next());
@@ -209,10 +209,10 @@ public class ElasticSearchDataContextTest {
         dataContext.executeUpdate(createTable);
 
         final Table table = schema.getTableByName("testCreateTable");
-        assertEquals("[" + ElasticSearchUtils.FIELD_ID + ", foo, bar]", Arrays.toString(table.getColumnNames()));
+        assertEquals("[" + ElasticSearchUtils.FIELD_ID + ", foo, bar]", Arrays.toString(table.getColumnNames().toArray()));
 
         final Column fooColumn = table.getColumnByName("foo");
-        final Column idColumn = table.getPrimaryKeys()[0];
+        final Column idColumn = table.getPrimaryKeys().get(0);
         assertEquals("Column[name=_id,columnNumber=0,type=STRING,nullable=null,nativeType=null,columnSize=null]",
                 idColumn.toString());
 
@@ -491,7 +491,7 @@ public class ElasticSearchDataContextTest {
         DataSet data = dataContext.executeQuery(q);
         assertEquals(
                 "[peopletype.gender, MAX(peopletype.age), MIN(peopletype.age), COUNT(*) AS total, MIN(peopletype.id) AS firstId]",
-                Arrays.toString(data.getSelectItems()));
+                Arrays.toString(data.getSelectItems().toArray()));
 
         assertTrue(data.next());
         assertEquals("Row[values=[female, 20, 17, 5, 5]]", data.getRow().toString());
@@ -553,7 +553,7 @@ public class ElasticSearchDataContextTest {
 
         ElasticSearchDataContext dataContext2 = new ElasticSearchDataContext(client, indexName2);
 
-        assertEquals("[tweet3]", Arrays.toString(dataContext2.getDefaultSchema().getTableNames()));
+        assertEquals("[tweet3]", Arrays.toString(dataContext2.getDefaultSchema().getTableNames().toArray()));
     }
 
     private static void createIndex() {

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/elasticsearch/rest/src/main/java/org/apache/metamodel/elasticsearch/rest/ElasticSearchRestDataContext.java
----------------------------------------------------------------------
diff --git a/elasticsearch/rest/src/main/java/org/apache/metamodel/elasticsearch/rest/ElasticSearchRestDataContext.java b/elasticsearch/rest/src/main/java/org/apache/metamodel/elasticsearch/rest/ElasticSearchRestDataContext.java
index 57ad267..8d89c05 100644
--- a/elasticsearch/rest/src/main/java/org/apache/metamodel/elasticsearch/rest/ElasticSearchRestDataContext.java
+++ b/elasticsearch/rest/src/main/java/org/apache/metamodel/elasticsearch/rest/ElasticSearchRestDataContext.java
@@ -25,6 +25,7 @@ import java.util.Comparator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 import org.apache.metamodel.BatchUpdateScript;
 import org.apache.metamodel.DataContext;
@@ -234,7 +235,7 @@ public class ElasticSearchRestDataContext extends QueryPostprocessDataContext im
             dynamicTableDefinitions.clear();
             dynamicTableDefinitions.addAll(Arrays.asList(tables));
             for (final SimpleTableDef tableDef : dynamicTableDefinitions) {
-                final List<String> tableNames = Arrays.asList(theSchema.getTableNames());
+                final List<String> tableNames = theSchema.getTableNames();
 
                 if (!tableNames.contains(tableDef.getName())) {
                     addTable(theSchema, tableDef);
@@ -299,11 +300,11 @@ public class ElasticSearchRestDataContext extends QueryPostprocessDataContext im
     }
 
     @Override
-    protected DataSet materializeMainSchemaTable(Table table, Column[] columns, int maxRows) {
+    protected DataSet materializeMainSchemaTable(Table table, List<Column> columns, int maxRows) {
         SearchResult searchResult = executeSearch(table, createSearchRequest(1, maxRows, null), scrollNeeded(
                 maxRows));
 
-        return new JestElasticSearchDataSet(elasticSearchClient, searchResult, columns);
+        return new JestElasticSearchDataSet(elasticSearchClient, searchResult, columns.stream().map(SelectItem::new).collect(Collectors.toList()));
     }
 
     private SearchSourceBuilder createSearchRequest(int firstRow, int maxRows, QueryBuilder queryBuilder) {

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/elasticsearch/rest/src/main/java/org/apache/metamodel/elasticsearch/rest/JestElasticSearchDataSet.java
----------------------------------------------------------------------
diff --git a/elasticsearch/rest/src/main/java/org/apache/metamodel/elasticsearch/rest/JestElasticSearchDataSet.java b/elasticsearch/rest/src/main/java/org/apache/metamodel/elasticsearch/rest/JestElasticSearchDataSet.java
index 7f485ba..0414358 100644
--- a/elasticsearch/rest/src/main/java/org/apache/metamodel/elasticsearch/rest/JestElasticSearchDataSet.java
+++ b/elasticsearch/rest/src/main/java/org/apache/metamodel/elasticsearch/rest/JestElasticSearchDataSet.java
@@ -56,12 +56,6 @@ final class JestElasticSearchDataSet extends AbstractDataSet {
         _closed = new AtomicBoolean(false);
     }
 
-    public JestElasticSearchDataSet(JestClient client, JestResult searchResponse, Column[] columns) {
-        super(columns);
-        _client = client;
-        _searchResponse = searchResponse;
-        _closed = new AtomicBoolean(false);
-    }
 
     @Override
     public void close() {

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/elasticsearch/rest/src/test/java/org/apache/metamodel/elasticsearch/rest/JestElasticSearchDataContextTest.java
----------------------------------------------------------------------
diff --git a/elasticsearch/rest/src/test/java/org/apache/metamodel/elasticsearch/rest/JestElasticSearchDataContextTest.java b/elasticsearch/rest/src/test/java/org/apache/metamodel/elasticsearch/rest/JestElasticSearchDataContextTest.java
index 9d7d2a8..53dbdf6 100644
--- a/elasticsearch/rest/src/test/java/org/apache/metamodel/elasticsearch/rest/JestElasticSearchDataContextTest.java
+++ b/elasticsearch/rest/src/test/java/org/apache/metamodel/elasticsearch/rest/JestElasticSearchDataContextTest.java
@@ -124,11 +124,11 @@ public class JestElasticSearchDataContextTest {
     @Test
     public void testSimpleQuery() throws Exception {
         assertEquals("[bulktype, peopletype, tweet1, tweet2]",
-                Arrays.toString(dataContext.getDefaultSchema().getTableNames()));
+                Arrays.toString(dataContext.getDefaultSchema().getTableNames().toArray()));
 
         Table table = dataContext.getDefaultSchema().getTableByName("tweet1");
 
-        assertEquals("[_id, message, postDate, user]", Arrays.toString(table.getColumnNames()));
+        assertEquals("[_id, message, postDate, user]", Arrays.toString(table.getColumnNames().toArray()));
 
         assertEquals(ColumnType.STRING, table.getColumnByName("user").getType());
         assertEquals(ColumnType.DATE, table.getColumnByName("postDate").getType());
@@ -145,7 +145,7 @@ public class JestElasticSearchDataContextTest {
     @Test
     public void testDocumentIdAsPrimaryKey() throws Exception {
         Table table = dataContext.getDefaultSchema().getTableByName("tweet2");
-        Column[] pks = table.getPrimaryKeys();
+        Column[] pks = table.getPrimaryKeys().toArray(new Column[0]);
         assertEquals(1, pks.length);
         assertEquals("_id", pks[0].getName());
 
@@ -158,7 +158,7 @@ public class JestElasticSearchDataContextTest {
     @Test
     public void testExecutePrimaryKeyLookupQuery() throws Exception {
         Table table = dataContext.getDefaultSchema().getTableByName("tweet2");
-        Column[] pks = table.getPrimaryKeys();
+        Column[] pks = table.getPrimaryKeys().toArray(new Column[0]);
 
         try (DataSet ds = dataContext.query().from(table).selectAll().where(pks[0]).eq("tweet_tweet2_1").execute()) {
             assertTrue(ds.next());
@@ -209,10 +209,10 @@ public class JestElasticSearchDataContextTest {
 
         final Table table = schema.getTableByName("testCreateTable");
         assertNotNull(table);
-        assertEquals("[" + ElasticSearchRestDataContext.FIELD_ID + ", foo, bar]", Arrays.toString(table.getColumnNames()));
+        assertEquals("[" + ElasticSearchRestDataContext.FIELD_ID + ", foo, bar]", Arrays.toString(table.getColumnNames().toArray()));
 
         final Column fooColumn = table.getColumnByName("foo");
-        final Column idColumn = table.getPrimaryKeys()[0];
+        final Column idColumn = table.getPrimaryKeys().get(0);
         assertEquals("Column[name=_id,columnNumber=0,type=STRING,nullable=null,nativeType=null,columnSize=null]",
                 idColumn.toString());
 
@@ -490,7 +490,7 @@ public class JestElasticSearchDataContextTest {
         DataSet data = dataContext.executeQuery(q);
         assertEquals(
                 "[peopletype.gender, MAX(peopletype.age), MIN(peopletype.age), COUNT(*) AS total, MIN(peopletype.id) AS firstId]",
-                Arrays.toString(data.getSelectItems()));
+                Arrays.toString(data.getSelectItems().toArray()));
 
         assertTrue(data.next());
         assertEquals("Row[values=[female, 20, 17, 5, 5]]", data.getRow().toString());
@@ -552,7 +552,7 @@ public class JestElasticSearchDataContextTest {
 
         ElasticSearchRestDataContext dataContext2 = new ElasticSearchRestDataContext(client, indexName2);
 
-        assertEquals("[tweet3]", Arrays.toString(dataContext2.getDefaultSchema().getTableNames()));
+        assertEquals("[tweet3]", Arrays.toString(dataContext2.getDefaultSchema().getTableNames().toArray()));
     }
 
     private static void createIndex() {

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/elasticsearch/rest/src/test/java/org/apache/metamodel/elasticsearch/rest/JestElasticSearchUtilsTest.java
----------------------------------------------------------------------
diff --git a/elasticsearch/rest/src/test/java/org/apache/metamodel/elasticsearch/rest/JestElasticSearchUtilsTest.java b/elasticsearch/rest/src/test/java/org/apache/metamodel/elasticsearch/rest/JestElasticSearchUtilsTest.java
index f114826..4c8cca1 100644
--- a/elasticsearch/rest/src/test/java/org/apache/metamodel/elasticsearch/rest/JestElasticSearchUtilsTest.java
+++ b/elasticsearch/rest/src/test/java/org/apache/metamodel/elasticsearch/rest/JestElasticSearchUtilsTest.java
@@ -26,7 +26,9 @@ import java.util.Collections;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
+import com.google.common.collect.Lists;
 import org.apache.metamodel.data.DataSetHeader;
 import org.apache.metamodel.data.Row;
 import org.apache.metamodel.data.SimpleDataSetHeader;
@@ -62,7 +64,7 @@ public class JestElasticSearchUtilsTest {
     public void testCreateRowWithNullValues() throws Exception {
         final Column col1 = new MutableColumn("col1", ColumnType.STRING);
         final Column col2 = new MutableColumn("col2", ColumnType.STRING);
-        final DataSetHeader header = new SimpleDataSetHeader(new Column[] { col1, col2 });
+        final DataSetHeader header = new SimpleDataSetHeader(Lists.newArrayList(col1, col2).stream().map(SelectItem::new).collect(Collectors.toList()));
         final JsonObject source = new JsonObject();
         source.addProperty("col1", "foo");
         source.addProperty("col2", (String) null);
@@ -75,7 +77,7 @@ public class JestElasticSearchUtilsTest {
     @Test
     public void testCreateRowWithNumberValueAndStringType() throws Exception {
         final Column col1 = new MutableColumn("col1", ColumnType.STRING);
-        final DataSetHeader header = new SimpleDataSetHeader(new Column[] { col1 });
+        final DataSetHeader header =  SimpleDataSetHeader.fromColumns(Lists.newArrayList(col1));
         final JsonObject source = new JsonObject();
         source.addProperty("col1", 42);
         final String documentId = "row1";
@@ -87,7 +89,7 @@ public class JestElasticSearchUtilsTest {
     @Test
     public void testCreateRowWithStringValueAndNumberType() throws Exception {
         final Column col1 = new MutableColumn("col1", ColumnType.NUMBER);
-        final DataSetHeader header = new SimpleDataSetHeader(new Column[] { col1 });
+        final DataSetHeader header = SimpleDataSetHeader.fromColumns(Lists.newArrayList(col1));
         final JsonObject source = new JsonObject();
         source.addProperty("col1", "hello world");
         final String documentId = "row1";
@@ -104,7 +106,7 @@ public class JestElasticSearchUtilsTest {
     @Test
     public void testCreateRowWithJsonObject() throws Exception {
         final Column col1 = new MutableColumn("col1", ColumnType.MAP);
-        final DataSetHeader header = new SimpleDataSetHeader(new Column[] { col1 });
+        final DataSetHeader header = SimpleDataSetHeader.fromColumns(Lists.newArrayList(col1));
         final JsonObject source = new JsonObject();
         final JsonObject value = new JsonObject();
         value.addProperty("foo1", "bar");
@@ -122,7 +124,7 @@ public class JestElasticSearchUtilsTest {
     @Test
     public void testCreateRowWithJsonArray() throws Exception {
         final Column col1 = new MutableColumn("col1", ColumnType.LIST);
-        final DataSetHeader header = new SimpleDataSetHeader(new Column[] { col1 });
+        final DataSetHeader header = SimpleDataSetHeader.fromColumns(Lists.newArrayList(col1));
         final JsonObject source = new JsonObject();
         final JsonArray value = new JsonArray();
         value.add(new JsonPrimitive("foo"));
@@ -140,7 +142,7 @@ public class JestElasticSearchUtilsTest {
     @Test
     public void testCreateRowWithDeepNesting() throws Exception {
         final Column col1 = new MutableColumn("col1", ColumnType.LIST);
-        final DataSetHeader header = new SimpleDataSetHeader(new Column[] { col1 });
+        final DataSetHeader header = SimpleDataSetHeader.fromColumns(Lists.newArrayList(col1));
         final JsonObject source = new JsonObject();
 
         final JsonObject obj2 = new JsonObject();

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/excel/src/main/java/org/apache/metamodel/excel/DefaultSpreadsheetReaderDelegate.java
----------------------------------------------------------------------
diff --git a/excel/src/main/java/org/apache/metamodel/excel/DefaultSpreadsheetReaderDelegate.java b/excel/src/main/java/org/apache/metamodel/excel/DefaultSpreadsheetReaderDelegate.java
index 009fad4..934d47c 100644
--- a/excel/src/main/java/org/apache/metamodel/excel/DefaultSpreadsheetReaderDelegate.java
+++ b/excel/src/main/java/org/apache/metamodel/excel/DefaultSpreadsheetReaderDelegate.java
@@ -19,10 +19,13 @@
 package org.apache.metamodel.excel;
 
 import java.util.Iterator;
+import java.util.List;
+import java.util.stream.Collectors;
 
 import org.apache.metamodel.data.DataSet;
 import org.apache.metamodel.data.EmptyDataSet;
 import org.apache.metamodel.data.MaxRowsDataSet;
+import org.apache.metamodel.query.SelectItem;
 import org.apache.metamodel.schema.Column;
 import org.apache.metamodel.schema.ColumnType;
 import org.apache.metamodel.schema.MutableColumn;
@@ -78,12 +81,12 @@ final class DefaultSpreadsheetReaderDelegate implements SpreadsheetReaderDelegat
     }
 
     @Override
-    public DataSet executeQuery(Table table, Column[] columns, int maxRows) {
+    public DataSet executeQuery(Table table, List<Column> columns, int maxRows) {
         final Workbook wb = ExcelUtils.readWorkbook(_resource);
         final Sheet sheet = wb.getSheet(table.getName());
 
         if (sheet == null || sheet.getPhysicalNumberOfRows() == 0) {
-            return new EmptyDataSet(columns);
+            return new EmptyDataSet(columns.stream().map(SelectItem::new).collect(Collectors.toList()));
         }
 
         DataSet dataSet = ExcelUtils.getDataSet(wb, sheet, table, _configuration);

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/excel/src/main/java/org/apache/metamodel/excel/ExcelDataContext.java
----------------------------------------------------------------------
diff --git a/excel/src/main/java/org/apache/metamodel/excel/ExcelDataContext.java b/excel/src/main/java/org/apache/metamodel/excel/ExcelDataContext.java
index 9ef931b..1ce4244 100644
--- a/excel/src/main/java/org/apache/metamodel/excel/ExcelDataContext.java
+++ b/excel/src/main/java/org/apache/metamodel/excel/ExcelDataContext.java
@@ -21,6 +21,7 @@ package org.apache.metamodel.excel;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.List;
 
 import org.apache.metamodel.DataContext;
 import org.apache.metamodel.MetaModelException;
@@ -128,7 +129,7 @@ public final class ExcelDataContext extends QueryPostprocessDataContext implemen
     }
 
     @Override
-    public DataSet materializeMainSchemaTable(Table table, Column[] columns, int maxRows) {
+    public DataSet materializeMainSchemaTable(Table table, List<Column> columns, int maxRows) {
         try {
             SpreadsheetReaderDelegate delegate = getSpreadsheetReaderDelegate();
 

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/excel/src/main/java/org/apache/metamodel/excel/ExcelDeleteBuilder.java
----------------------------------------------------------------------
diff --git a/excel/src/main/java/org/apache/metamodel/excel/ExcelDeleteBuilder.java b/excel/src/main/java/org/apache/metamodel/excel/ExcelDeleteBuilder.java
index 7d835c7..e4731b3 100644
--- a/excel/src/main/java/org/apache/metamodel/excel/ExcelDeleteBuilder.java
+++ b/excel/src/main/java/org/apache/metamodel/excel/ExcelDeleteBuilder.java
@@ -22,6 +22,7 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.ss.usermodel.Sheet;
@@ -55,7 +56,7 @@ final class ExcelDeleteBuilder extends AbstractRowDeletionBuilder {
         final Workbook workbook = _updateCallback.getWorkbook(false);
 
         final String tableName = getTable().getName();
-        final SelectItem[] selectItems = MetaModelHelper.createSelectItems(getTable().getColumns());
+        final List<SelectItem> selectItems = getTable().getColumns().stream().map(SelectItem::new).collect(Collectors.toList());
         final DataSetHeader header = new SimpleDataSetHeader(selectItems);
         final Sheet sheet = workbook.getSheet(tableName);
 

http://git-wip-us.apache.org/repos/asf/metamodel/blob/2d156bcd/excel/src/main/java/org/apache/metamodel/excel/ExcelTableCreationBuilder.java
----------------------------------------------------------------------
diff --git a/excel/src/main/java/org/apache/metamodel/excel/ExcelTableCreationBuilder.java b/excel/src/main/java/org/apache/metamodel/excel/ExcelTableCreationBuilder.java
index 765886e..2d68a69 100644
--- a/excel/src/main/java/org/apache/metamodel/excel/ExcelTableCreationBuilder.java
+++ b/excel/src/main/java/org/apache/metamodel/excel/ExcelTableCreationBuilder.java
@@ -48,9 +48,7 @@ final class ExcelTableCreationBuilder extends AbstractTableCreationBuilder<Excel
         if (lineNumber != ExcelConfiguration.NO_COLUMN_NAME_LINE) {
             final int zeroBasedLineNumber = lineNumber - 1;
             final Row row = sheet.createRow(zeroBasedLineNumber);
-            final Column[] columns = table.getColumns();
-            for (int i = 0; i < columns.length; i++) {
-                final Column column = columns[i];
+            for (final Column column : table.getColumns()) {
                 final int columnNumber = column.getColumnNumber();
                 row.createCell(columnNumber).setCellValue(column.getName());
             }


[16/20] metamodel git commit: rearranged to eclipse import style

Posted by ka...@apache.org.
rearranged to eclipse import style


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

Branch: refs/heads/master
Commit: 840aea410c254e29253d46983629de03843297af
Parents: 725e210
Author: Jörg Unbehauen <jo...@unbehauen.net>
Authored: Wed Aug 2 15:14:20 2017 +0200
Committer: Jörg Unbehauen <jo...@unbehauen.net>
Committed: Wed Aug 2 15:14:20 2017 +0200

----------------------------------------------------------------------
 .../org/apache/metamodel/AbstractDataContext.java | 12 ++++++------
 .../apache/metamodel/CompositeDataContext.java    | 18 +++++++++---------
 .../java/org/apache/metamodel/DataContext.java    |  4 ++--
 .../org/apache/metamodel/convert/Converters.java  | 16 ++++++++--------
 .../apache/metamodel/data/AbstractDataSet.java    |  6 +++---
 .../metamodel/data/CachingDataSetHeader.java      |  6 +++---
 .../metamodel/data/ScalarFunctionDataSet.java     |  4 ++--
 .../metamodel/data/SimpleDataSetHeader.java       |  6 +++---
 .../org/apache/metamodel/data/UnionDataSet.java   |  6 +++---
 .../intercept/InterceptableDataContext.java       |  6 +++---
 .../apache/metamodel/schema/AbstractSchema.java   |  8 ++++----
 .../intercept/InterceptableDataContextTest.java   |  7 ++++---
 ...egacyDeserializationObjectInputStreamTest.java |  5 +++--
 13 files changed, 53 insertions(+), 51 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/metamodel/blob/840aea41/core/src/main/java/org/apache/metamodel/AbstractDataContext.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/AbstractDataContext.java b/core/src/main/java/org/apache/metamodel/AbstractDataContext.java
index 379b9ed..475add4 100644
--- a/core/src/main/java/org/apache/metamodel/AbstractDataContext.java
+++ b/core/src/main/java/org/apache/metamodel/AbstractDataContext.java
@@ -18,6 +18,12 @@
  */
 package org.apache.metamodel;
 
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
 import org.apache.metamodel.data.DataSet;
 import org.apache.metamodel.query.CompiledQuery;
 import org.apache.metamodel.query.DefaultCompiledQuery;
@@ -29,12 +35,6 @@ import org.apache.metamodel.schema.Column;
 import org.apache.metamodel.schema.Schema;
 import org.apache.metamodel.schema.Table;
 
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.List;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-
 /**
  * Abstract implementation of the DataContext interface. Provides convenient
  * implementations of all trivial and datastore-independent methods.

http://git-wip-us.apache.org/repos/asf/metamodel/blob/840aea41/core/src/main/java/org/apache/metamodel/CompositeDataContext.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/CompositeDataContext.java b/core/src/main/java/org/apache/metamodel/CompositeDataContext.java
index f595b2e..b7468fb 100644
--- a/core/src/main/java/org/apache/metamodel/CompositeDataContext.java
+++ b/core/src/main/java/org/apache/metamodel/CompositeDataContext.java
@@ -18,15 +18,6 @@
  */
 package org.apache.metamodel;
 
-import org.apache.metamodel.data.DataSet;
-import org.apache.metamodel.query.FromItem;
-import org.apache.metamodel.query.Query;
-import org.apache.metamodel.schema.CompositeSchema;
-import org.apache.metamodel.schema.Schema;
-import org.apache.metamodel.schema.Table;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
@@ -38,6 +29,15 @@ import java.util.Set;
 import java.util.TreeSet;
 import java.util.function.Function;
 
+import org.apache.metamodel.data.DataSet;
+import org.apache.metamodel.query.FromItem;
+import org.apache.metamodel.query.Query;
+import org.apache.metamodel.schema.CompositeSchema;
+import org.apache.metamodel.schema.Schema;
+import org.apache.metamodel.schema.Table;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 
 /**
  * DataContext for composite datacontexts. Composite DataContexts wrap several

http://git-wip-us.apache.org/repos/asf/metamodel/blob/840aea41/core/src/main/java/org/apache/metamodel/DataContext.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/DataContext.java b/core/src/main/java/org/apache/metamodel/DataContext.java
index 58bec4a..38223b9 100644
--- a/core/src/main/java/org/apache/metamodel/DataContext.java
+++ b/core/src/main/java/org/apache/metamodel/DataContext.java
@@ -18,6 +18,8 @@
  */
 package org.apache.metamodel;
 
+import java.util.List;
+
 import org.apache.metamodel.data.DataSet;
 import org.apache.metamodel.query.CompiledQuery;
 import org.apache.metamodel.query.Query;
@@ -27,8 +29,6 @@ import org.apache.metamodel.schema.Column;
 import org.apache.metamodel.schema.Schema;
 import org.apache.metamodel.schema.Table;
 
-import java.util.List;
-
 /**
  * A DataContext represents the central entry point for interactions with
  * datastores. The DataContext contains of the structure of data (in the form of

http://git-wip-us.apache.org/repos/asf/metamodel/blob/840aea41/core/src/main/java/org/apache/metamodel/convert/Converters.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/convert/Converters.java b/core/src/main/java/org/apache/metamodel/convert/Converters.java
index 3c2ad00..905f1f7 100644
--- a/core/src/main/java/org/apache/metamodel/convert/Converters.java
+++ b/core/src/main/java/org/apache/metamodel/convert/Converters.java
@@ -18,6 +18,14 @@
  */
 package org.apache.metamodel.convert;
 
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.stream.Collectors;
+
 import org.apache.metamodel.DataContext;
 import org.apache.metamodel.UpdateableDataContext;
 import org.apache.metamodel.data.DataSet;
@@ -33,14 +41,6 @@ import org.apache.metamodel.schema.Table;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-import java.util.stream.Collectors;
-
 /**
  * This class consists of static methods for decorating {@link DataContext}s
  * with {@link TypeConverter}s, which allows for automatic conversion of values

http://git-wip-us.apache.org/repos/asf/metamodel/blob/840aea41/core/src/main/java/org/apache/metamodel/data/AbstractDataSet.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/data/AbstractDataSet.java b/core/src/main/java/org/apache/metamodel/data/AbstractDataSet.java
index 39e5303..33238a0 100644
--- a/core/src/main/java/org/apache/metamodel/data/AbstractDataSet.java
+++ b/core/src/main/java/org/apache/metamodel/data/AbstractDataSet.java
@@ -18,15 +18,15 @@
  */
 package org.apache.metamodel.data;
 
-import org.apache.metamodel.query.SelectItem;
-import org.apache.metamodel.util.BaseObject;
-
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Objects;
 
+import org.apache.metamodel.query.SelectItem;
+import org.apache.metamodel.util.BaseObject;
+
 /**
  * Abstract DataSet implementation. Provides convenient implementations of
  * trivial method and reusable parts of non-trivial methods of a DataSet.

http://git-wip-us.apache.org/repos/asf/metamodel/blob/840aea41/core/src/main/java/org/apache/metamodel/data/CachingDataSetHeader.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/data/CachingDataSetHeader.java b/core/src/main/java/org/apache/metamodel/data/CachingDataSetHeader.java
index 965dea3..1ede3d9 100644
--- a/core/src/main/java/org/apache/metamodel/data/CachingDataSetHeader.java
+++ b/core/src/main/java/org/apache/metamodel/data/CachingDataSetHeader.java
@@ -18,13 +18,13 @@
  */
 package org.apache.metamodel.data;
 
-import org.apache.metamodel.query.SelectItem;
-import org.apache.metamodel.schema.Column;
-
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
+import org.apache.metamodel.query.SelectItem;
+import org.apache.metamodel.schema.Column;
+
 /**
  * Most common implementation of {@link DataSetHeader}. This implementation is
  * 'caching' in the sense that index values of selectitems are cached in a map

http://git-wip-us.apache.org/repos/asf/metamodel/blob/840aea41/core/src/main/java/org/apache/metamodel/data/ScalarFunctionDataSet.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/data/ScalarFunctionDataSet.java b/core/src/main/java/org/apache/metamodel/data/ScalarFunctionDataSet.java
index d9e6e9c..0b9a78f 100644
--- a/core/src/main/java/org/apache/metamodel/data/ScalarFunctionDataSet.java
+++ b/core/src/main/java/org/apache/metamodel/data/ScalarFunctionDataSet.java
@@ -18,12 +18,12 @@
  */
 package org.apache.metamodel.data;
 
+import java.util.List;
+
 import org.apache.metamodel.query.ScalarFunction;
 import org.apache.metamodel.query.SelectItem;
 import org.apache.metamodel.util.CollectionUtils;
 
-import java.util.List;
-
 /**
  * A {@link DataSet} that enhances another {@link DataSet} with
  * {@link ScalarFunction}s.

http://git-wip-us.apache.org/repos/asf/metamodel/blob/840aea41/core/src/main/java/org/apache/metamodel/data/SimpleDataSetHeader.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/data/SimpleDataSetHeader.java b/core/src/main/java/org/apache/metamodel/data/SimpleDataSetHeader.java
index e3bf59d..5dc2ca9 100644
--- a/core/src/main/java/org/apache/metamodel/data/SimpleDataSetHeader.java
+++ b/core/src/main/java/org/apache/metamodel/data/SimpleDataSetHeader.java
@@ -18,14 +18,14 @@
  */
 package org.apache.metamodel.data;
 
-import org.apache.metamodel.query.SelectItem;
-import org.apache.metamodel.schema.Column;
-
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.stream.Collectors;
 
+import org.apache.metamodel.query.SelectItem;
+import org.apache.metamodel.schema.Column;
+
 /**
  * Simple implementation of {@link DataSetHeader} which does no magic to improve
  * performance.

http://git-wip-us.apache.org/repos/asf/metamodel/blob/840aea41/core/src/main/java/org/apache/metamodel/data/UnionDataSet.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/data/UnionDataSet.java b/core/src/main/java/org/apache/metamodel/data/UnionDataSet.java
index f8ef9bf..f13124c 100644
--- a/core/src/main/java/org/apache/metamodel/data/UnionDataSet.java
+++ b/core/src/main/java/org/apache/metamodel/data/UnionDataSet.java
@@ -18,9 +18,6 @@
  */
 package org.apache.metamodel.data;
 
-import org.apache.metamodel.query.InvokableQuery;
-import org.apache.metamodel.util.ImmutableRef;
-
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.Objects;
@@ -28,6 +25,9 @@ import java.util.function.Function;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
 
+import org.apache.metamodel.query.InvokableQuery;
+import org.apache.metamodel.util.ImmutableRef;
+
 /**
  * A {@link DataSet} that represents the union of two or more other data sets
  */

http://git-wip-us.apache.org/repos/asf/metamodel/blob/840aea41/core/src/main/java/org/apache/metamodel/intercept/InterceptableDataContext.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/intercept/InterceptableDataContext.java b/core/src/main/java/org/apache/metamodel/intercept/InterceptableDataContext.java
index 74af932..b8f4c11 100644
--- a/core/src/main/java/org/apache/metamodel/intercept/InterceptableDataContext.java
+++ b/core/src/main/java/org/apache/metamodel/intercept/InterceptableDataContext.java
@@ -18,6 +18,9 @@
  */
 package org.apache.metamodel.intercept;
 
+import java.util.List;
+import java.util.stream.Collectors;
+
 import org.apache.metamodel.DataContext;
 import org.apache.metamodel.MetaModelException;
 import org.apache.metamodel.UpdateScript;
@@ -37,9 +40,6 @@ import org.apache.metamodel.schema.Schema;
 import org.apache.metamodel.schema.Table;
 import org.apache.metamodel.update.RowUpdationBuilder;
 
-import java.util.List;
-import java.util.stream.Collectors;
-
 public class InterceptableDataContext implements UpdateableDataContext {
 
     private final DataContext _delegate;

http://git-wip-us.apache.org/repos/asf/metamodel/blob/840aea41/core/src/main/java/org/apache/metamodel/schema/AbstractSchema.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/schema/AbstractSchema.java b/core/src/main/java/org/apache/metamodel/schema/AbstractSchema.java
index f8b8c1d..accfa27 100644
--- a/core/src/main/java/org/apache/metamodel/schema/AbstractSchema.java
+++ b/core/src/main/java/org/apache/metamodel/schema/AbstractSchema.java
@@ -18,16 +18,16 @@
  */
 package org.apache.metamodel.schema;
 
-import org.apache.metamodel.util.EqualsBuilder;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.stream.Collectors;
 
+import org.apache.metamodel.util.EqualsBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 /**
  * Abstract implementation of the {@link Schema} interface. Implements most
  * common and trivial methods.

http://git-wip-us.apache.org/repos/asf/metamodel/blob/840aea41/core/src/test/java/org/apache/metamodel/intercept/InterceptableDataContextTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/metamodel/intercept/InterceptableDataContextTest.java b/core/src/test/java/org/apache/metamodel/intercept/InterceptableDataContextTest.java
index fe69b6c..446577d 100644
--- a/core/src/test/java/org/apache/metamodel/intercept/InterceptableDataContextTest.java
+++ b/core/src/test/java/org/apache/metamodel/intercept/InterceptableDataContextTest.java
@@ -18,7 +18,9 @@
  */
 package org.apache.metamodel.intercept;
 
-import junit.framework.TestCase;
+import java.util.Arrays;
+import java.util.List;
+
 import org.apache.metamodel.DataContext;
 import org.apache.metamodel.MockUpdateableDataContext;
 import org.apache.metamodel.data.DataSet;
@@ -28,8 +30,7 @@ import org.apache.metamodel.schema.MutableSchema;
 import org.apache.metamodel.schema.Schema;
 import org.apache.metamodel.schema.Table;
 
-import java.util.Arrays;
-import java.util.List;
+import junit.framework.TestCase;
 
 public class InterceptableDataContextTest extends TestCase {
 

http://git-wip-us.apache.org/repos/asf/metamodel/blob/840aea41/core/src/test/java/org/apache/metamodel/util/LegacyDeserializationObjectInputStreamTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/metamodel/util/LegacyDeserializationObjectInputStreamTest.java b/core/src/test/java/org/apache/metamodel/util/LegacyDeserializationObjectInputStreamTest.java
index ce6e85c..8d18a5b 100644
--- a/core/src/test/java/org/apache/metamodel/util/LegacyDeserializationObjectInputStreamTest.java
+++ b/core/src/test/java/org/apache/metamodel/util/LegacyDeserializationObjectInputStreamTest.java
@@ -18,11 +18,12 @@
  */
 package org.apache.metamodel.util;
 
-import junit.framework.TestCase;
+import java.io.FileInputStream;
+
 import org.apache.metamodel.query.Query;
 import org.apache.metamodel.schema.Table;
 
-import java.io.FileInputStream;
+import junit.framework.TestCase;
 
 public class LegacyDeserializationObjectInputStreamTest extends TestCase {
 


[13/20] metamodel git commit: guava now in test scope of core

Posted by ka...@apache.org.
guava now in test scope of core


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

Branch: refs/heads/master
Commit: 6234fb4ab7fbf53c58b174e58c2435bb8079b54a
Parents: 056d4d1
Author: Jörg Unbehauen <jo...@unbehauen.net>
Authored: Fri Jul 28 18:27:34 2017 +0200
Committer: Jörg Unbehauen <jo...@unbehauen.net>
Committed: Fri Jul 28 18:27:34 2017 +0200

----------------------------------------------------------------------
 core/pom.xml                                                  | 1 +
 core/src/main/java/org/apache/metamodel/MetaModelHelper.java  | 1 -
 csv/src/main/java/org/apache/metamodel/csv/CsvSchema.java     | 4 ++--
 csv/src/main/java/org/apache/metamodel/csv/CsvTable.java      | 3 +--
 .../java/org/apache/metamodel/csv/SingleLineCsvRowTest.java   | 6 ++++--
 .../apache/metamodel/salesforce/SalesforceDataSetTest.java    | 7 ++-----
 6 files changed, 10 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/metamodel/blob/6234fb4a/core/pom.xml
----------------------------------------------------------------------
diff --git a/core/pom.xml b/core/pom.xml
index 4add6ad..390f5f8 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -30,6 +30,7 @@ under the License.
 		<dependency>
 			<groupId>com.google.guava</groupId>
 			<artifactId>guava</artifactId>
+			<scope>test</scope>
 		</dependency>
 		<dependency>
 			<groupId>org.slf4j</groupId>

http://git-wip-us.apache.org/repos/asf/metamodel/blob/6234fb4a/core/src/main/java/org/apache/metamodel/MetaModelHelper.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/MetaModelHelper.java b/core/src/main/java/org/apache/metamodel/MetaModelHelper.java
index ae87083..4f0a8dd 100644
--- a/core/src/main/java/org/apache/metamodel/MetaModelHelper.java
+++ b/core/src/main/java/org/apache/metamodel/MetaModelHelper.java
@@ -31,7 +31,6 @@ import java.util.Map.Entry;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-import com.google.common.collect.Lists;
 import org.apache.metamodel.data.CachingDataSetHeader;
 import org.apache.metamodel.data.DataSet;
 import org.apache.metamodel.data.DataSetHeader;

http://git-wip-us.apache.org/repos/asf/metamodel/blob/6234fb4a/csv/src/main/java/org/apache/metamodel/csv/CsvSchema.java
----------------------------------------------------------------------
diff --git a/csv/src/main/java/org/apache/metamodel/csv/CsvSchema.java b/csv/src/main/java/org/apache/metamodel/csv/CsvSchema.java
index 6c9a01e..28a9812 100644
--- a/csv/src/main/java/org/apache/metamodel/csv/CsvSchema.java
+++ b/csv/src/main/java/org/apache/metamodel/csv/CsvSchema.java
@@ -18,11 +18,11 @@
  */
 package org.apache.metamodel.csv;
 
-import com.google.common.collect.Lists;
 import org.apache.metamodel.schema.AbstractSchema;
 import org.apache.metamodel.schema.Table;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 final class CsvSchema extends AbstractSchema {
@@ -62,6 +62,6 @@ final class CsvSchema extends AbstractSchema {
 		if (_table == null) {
 			return new ArrayList<>();
 		}
-		return Lists.newArrayList(_table);
+		return Collections.singletonList(_table);
 	}
 }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/6234fb4a/csv/src/main/java/org/apache/metamodel/csv/CsvTable.java
----------------------------------------------------------------------
diff --git a/csv/src/main/java/org/apache/metamodel/csv/CsvTable.java b/csv/src/main/java/org/apache/metamodel/csv/CsvTable.java
index c786e70..41b7593 100644
--- a/csv/src/main/java/org/apache/metamodel/csv/CsvTable.java
+++ b/csv/src/main/java/org/apache/metamodel/csv/CsvTable.java
@@ -21,7 +21,6 @@ package org.apache.metamodel.csv;
 import java.io.IOException;
 import java.util.*;
 
-import com.google.common.collect.Lists;
 import org.apache.metamodel.schema.AbstractTable;
 import org.apache.metamodel.schema.Column;
 import org.apache.metamodel.schema.ColumnType;
@@ -147,7 +146,7 @@ final class CsvTable extends AbstractTable {
 
     @Override
     public Collection<Relationship> getRelationships() {
-        return Lists.newArrayList();
+        return Collections.emptyList();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/metamodel/blob/6234fb4a/csv/src/test/java/org/apache/metamodel/csv/SingleLineCsvRowTest.java
----------------------------------------------------------------------
diff --git a/csv/src/test/java/org/apache/metamodel/csv/SingleLineCsvRowTest.java b/csv/src/test/java/org/apache/metamodel/csv/SingleLineCsvRowTest.java
index 0686cab..28c640f 100644
--- a/csv/src/test/java/org/apache/metamodel/csv/SingleLineCsvRowTest.java
+++ b/csv/src/test/java/org/apache/metamodel/csv/SingleLineCsvRowTest.java
@@ -22,9 +22,9 @@ import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
+import java.util.ArrayList;
 import java.util.List;
 
-import com.google.common.collect.Lists;
 import org.apache.metamodel.data.Row;
 import org.apache.metamodel.schema.Column;
 import org.apache.metamodel.schema.MutableColumn;
@@ -37,7 +37,9 @@ public class SingleLineCsvRowTest {
 
     @Test
     public void testSerialize() throws Exception {
-        final List<Column> columns = Lists.newArrayList( new MutableColumn("1"), new MutableColumn("2"));
+        final List<Column> columns = new ArrayList<>();
+        columns.add(new MutableColumn("1"));
+        columns.add(new MutableColumn("2"));
         CSVParser csvParser = new CSVParser();
         final SingleLineCsvDataSet dataSet = new SingleLineCsvDataSet(null, csvParser, columns, null, 2, false);
         final SingleLineCsvRow originalRow = new SingleLineCsvRow(dataSet, "foo,bar", 2, false, 1);

http://git-wip-us.apache.org/repos/asf/metamodel/blob/6234fb4a/salesforce/src/test/java/org/apache/metamodel/salesforce/SalesforceDataSetTest.java
----------------------------------------------------------------------
diff --git a/salesforce/src/test/java/org/apache/metamodel/salesforce/SalesforceDataSetTest.java b/salesforce/src/test/java/org/apache/metamodel/salesforce/SalesforceDataSetTest.java
index a16cf13..2e4c2c6 100644
--- a/salesforce/src/test/java/org/apache/metamodel/salesforce/SalesforceDataSetTest.java
+++ b/salesforce/src/test/java/org/apache/metamodel/salesforce/SalesforceDataSetTest.java
@@ -18,21 +18,18 @@
  */
 package org.apache.metamodel.salesforce;
 
-import com.google.common.collect.Lists;
 import com.sforce.soap.partner.QueryResult;
 import com.sforce.ws.ConnectionException;
 import com.sforce.ws.bind.TypeMapper;
 import com.sforce.ws.parser.PullParserException;
 import com.sforce.ws.parser.XmlInputStream;
 import org.apache.metamodel.data.Row;
-import org.apache.metamodel.query.SelectItem;
-import org.apache.metamodel.schema.Column;
 import org.apache.metamodel.schema.ColumnType;
 import org.apache.metamodel.schema.MutableColumn;
 import org.junit.Test;
 
 import java.io.IOException;
-import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 import static org.junit.Assert.assertEquals;
@@ -44,7 +41,7 @@ public class SalesforceDataSetTest {
         QueryResult qr = queryResult("/result/double-value.xml");
         MutableColumn version = new MutableColumn("Version", ColumnType.DOUBLE);
 
-        SalesforceDataSet dataSet = new SalesforceDataSet(Lists.newArrayList(version), qr, null);
+        SalesforceDataSet dataSet = new SalesforceDataSet(Collections.singletonList(version), qr, null);
         List<Row> rows = dataSet.toRows();
 
         assertEquals(5386.21, rows.get(0).getValue(version));


[12/20] metamodel git commit: removed unnecessary toArray conversion

Posted by ka...@apache.org.
removed unnecessary toArray conversion


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

Branch: refs/heads/master
Commit: 056d4d18a9284c5f037ed80e00d6c16fab0c25e1
Parents: 5a9d2d1
Author: Jörg Unbehauen <jo...@unbehauen.net>
Authored: Fri Jul 28 14:19:34 2017 +0200
Committer: Jörg Unbehauen <jo...@unbehauen.net>
Committed: Fri Jul 28 14:19:34 2017 +0200

----------------------------------------------------------------------
 .../main/java/org/apache/metamodel/DeleteAndInsertBuilder.java   | 2 +-
 core/src/main/java/org/apache/metamodel/convert/Converters.java  | 2 +-
 .../main/java/org/apache/metamodel/xml/XmlDomDataContext.java    | 4 ++--
 3 files changed, 4 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/metamodel/blob/056d4d18/core/src/main/java/org/apache/metamodel/DeleteAndInsertBuilder.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/DeleteAndInsertBuilder.java b/core/src/main/java/org/apache/metamodel/DeleteAndInsertBuilder.java
index 2227256..172432d 100644
--- a/core/src/main/java/org/apache/metamodel/DeleteAndInsertBuilder.java
+++ b/core/src/main/java/org/apache/metamodel/DeleteAndInsertBuilder.java
@@ -105,7 +105,7 @@ public class DeleteAndInsertBuilder extends AbstractRowUpdationBuilder {
         final List<FilterItem> whereItems = getWhereItems();
         final DataSet dataSet = dc.query()
                 .from(table)
-                .select(table.getColumns().toArray(new Column[table.getColumns().size()]))
+                .select(table.getColumns())
                 .where(whereItems).execute();
         final List<Row> rows = dataSet.toRows();
         return rows;

http://git-wip-us.apache.org/repos/asf/metamodel/blob/056d4d18/core/src/main/java/org/apache/metamodel/convert/Converters.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/convert/Converters.java b/core/src/main/java/org/apache/metamodel/convert/Converters.java
index 97b4e65..f0859bb 100644
--- a/core/src/main/java/org/apache/metamodel/convert/Converters.java
+++ b/core/src/main/java/org/apache/metamodel/convert/Converters.java
@@ -190,7 +190,7 @@ public final class Converters {
             detectors.put(column, new ColumnTypeDetector());
         }
 
-        Query query = dataContext.query().from(table).select(columns.toArray(new Column[columns.size()])).toQuery();
+        Query query = dataContext.query().from(table).select(columns).toQuery();
         if (sampleSize > 0 && sampleSize != Integer.MAX_VALUE) {
             query.setMaxRows(sampleSize);
         }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/056d4d18/xml/src/main/java/org/apache/metamodel/xml/XmlDomDataContext.java
----------------------------------------------------------------------
diff --git a/xml/src/main/java/org/apache/metamodel/xml/XmlDomDataContext.java b/xml/src/main/java/org/apache/metamodel/xml/XmlDomDataContext.java
index ad8181c..cfc3686 100644
--- a/xml/src/main/java/org/apache/metamodel/xml/XmlDomDataContext.java
+++ b/xml/src/main/java/org/apache/metamodel/xml/XmlDomDataContext.java
@@ -533,8 +533,8 @@ public class XmlDomDataContext extends QueryPostprocessDataContext {
         }
 
         Query q = new Query();
-        q.select(primaryColumns.toArray(new Column[primaryColumns.size()]));
-        q.select(foreignColumns.toArray(new Column[foreignColumns.size()]));
+        q.select(primaryColumns);
+        q.select(foreignColumns);
         q.from(new FromItem(JoinType.LEFT, relationship));
         if (logger.isDebugEnabled()) {
             logger.debug("Setting table data for '{}' to query result: {}", primaryTableName, q.toString());


[20/20] metamodel git commit: METAMODEL-7: Updated CHANGES.md

Posted by ka...@apache.org.
METAMODEL-7: Updated CHANGES.md

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

Branch: refs/heads/master
Commit: 57e48be23844537690bdd6191ceb78adb4266e92
Parents: c4acebd
Author: Kasper Sørensen <i....@gmail.com>
Authored: Sun Aug 6 21:36:28 2017 -0700
Committer: Kasper Sørensen <i....@gmail.com>
Committed: Sun Aug 6 21:36:28 2017 -0700

----------------------------------------------------------------------
 CHANGES.md | 1 +
 1 file changed, 1 insertion(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/metamodel/blob/57e48be2/CHANGES.md
----------------------------------------------------------------------
diff --git a/CHANGES.md b/CHANGES.md
index f5cb59a..8992c3d 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,6 +1,7 @@
 ### Apache MetaModel 5.0
 
  * [METAMODEL-6] - Added update summary containing information about changes on returning UpdateableDataContext.executeUpdate(..)
+ * [METAMODEL-7] - Applied collections, lists etc. instead of arrays in the MetaModel API.
  * [METAMODEL-63] - Added UnionDataSet, a general purpose utility for doing client-side unions from other queries or data sets.
  * [METAMODEL-222] - Added support for Java 8 lambdas, removed support for Java 7.
  * [METAMODEL-1087] - Removed deprecated APIs from MetaModel's codebase.


[09/20] metamodel git commit: removing the getMutableTables and casting instead

Posted by ka...@apache.org.
removing the getMutableTables and casting instead


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

Branch: refs/heads/master
Commit: dd07999449168f2f767e68b75d90943e38028eab
Parents: 7f76973
Author: Jörg Unbehauen <jo...@unbehauen.net>
Authored: Fri Jul 28 12:16:07 2017 +0200
Committer: Jörg Unbehauen <jo...@unbehauen.net>
Committed: Fri Jul 28 12:16:07 2017 +0200

----------------------------------------------------------------------
 .../src/main/java/org/apache/metamodel/schema/MutableSchema.java | 4 ----
 .../metamodel/couchdb/CouchDbSimpleTableDefSchemaBuilder.java    | 4 ++--
 jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcSchema.java     | 3 ++-
 3 files changed, 4 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/metamodel/blob/dd079994/core/src/main/java/org/apache/metamodel/schema/MutableSchema.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/schema/MutableSchema.java b/core/src/main/java/org/apache/metamodel/schema/MutableSchema.java
index f01b5c0..1dbc0c0 100644
--- a/core/src/main/java/org/apache/metamodel/schema/MutableSchema.java
+++ b/core/src/main/java/org/apache/metamodel/schema/MutableSchema.java
@@ -68,10 +68,6 @@ public class MutableSchema extends AbstractSchema implements Serializable,
 		return Collections.unmodifiableList(_tables);
 	}
 
-	public List<MutableTable> getMutableTables() {
-		return Collections.unmodifiableList(_tables);
-	}
-
 
 	public MutableSchema setTables(Collection<? extends MutableTable> tables) {
 	    clearTables();

http://git-wip-us.apache.org/repos/asf/metamodel/blob/dd079994/couchdb/src/main/java/org/apache/metamodel/couchdb/CouchDbSimpleTableDefSchemaBuilder.java
----------------------------------------------------------------------
diff --git a/couchdb/src/main/java/org/apache/metamodel/couchdb/CouchDbSimpleTableDefSchemaBuilder.java b/couchdb/src/main/java/org/apache/metamodel/couchdb/CouchDbSimpleTableDefSchemaBuilder.java
index 97e0f8b..c96120a 100644
--- a/couchdb/src/main/java/org/apache/metamodel/couchdb/CouchDbSimpleTableDefSchemaBuilder.java
+++ b/couchdb/src/main/java/org/apache/metamodel/couchdb/CouchDbSimpleTableDefSchemaBuilder.java
@@ -40,8 +40,8 @@ public class CouchDbSimpleTableDefSchemaBuilder extends SimpleTableDefSchemaBuil
     @Override
     public MutableSchema build() {
         MutableSchema schema = super.build();
-        for (MutableTable table : schema.getMutableTables()) {
-            CouchDbTableCreationBuilder.addMandatoryColumns(table);
+        for (Table table : schema.getTables()) {
+            CouchDbTableCreationBuilder.addMandatoryColumns((MutableTable) table);
         }
         return schema;
     }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/dd079994/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcSchema.java
----------------------------------------------------------------------
diff --git a/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcSchema.java b/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcSchema.java
index 0dc0381..ccac3f8 100644
--- a/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcSchema.java
+++ b/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcSchema.java
@@ -24,6 +24,7 @@ import java.sql.Connection;
 import org.apache.metamodel.schema.MutableSchema;
 import org.apache.metamodel.schema.MutableTable;
 import org.apache.metamodel.schema.Schema;
+import org.apache.metamodel.schema.Table;
 
 /**
  * Schema implementation for JDBC data contexts
@@ -59,7 +60,7 @@ final class JdbcSchema extends MutableSchema {
     }
 
     public Schema toSerializableForm() {
-        for (MutableTable table : getMutableTables()) {
+        for (Table table : getTables()) {
             table.getColumns();
             table.getIndexedColumns();
             table.getPrimaryKeys();


[10/20] metamodel git commit: include call to loading facilities

Posted by ka...@apache.org.
include call to loading facilities


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

Branch: refs/heads/master
Commit: 44571b97562d593f5a2ac7748179464f906b269d
Parents: dd07999
Author: Jörg Unbehauen <jo...@unbehauen.net>
Authored: Fri Jul 28 12:16:28 2017 +0200
Committer: Jörg Unbehauen <jo...@unbehauen.net>
Committed: Fri Jul 28 12:16:28 2017 +0200

----------------------------------------------------------------------
 .../main/java/org/apache/metamodel/schema/MutableTable.java   | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/metamodel/blob/44571b97/core/src/main/java/org/apache/metamodel/schema/MutableTable.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/schema/MutableTable.java b/core/src/main/java/org/apache/metamodel/schema/MutableTable.java
index 0b3475c..8678085 100644
--- a/core/src/main/java/org/apache/metamodel/schema/MutableTable.java
+++ b/core/src/main/java/org/apache/metamodel/schema/MutableTable.java
@@ -102,7 +102,8 @@ public class MutableTable extends AbstractTable implements Serializable {
 
     @Override
     public List<Column> getColumns() {
-        return Collections.unmodifiableList(_columns);
+        List<Column> columns = getColumnsInternal();
+        return Collections.unmodifiableList(columns);
     }
 
     public MutableTable setColumns(Column... columns) {
@@ -158,7 +159,9 @@ public class MutableTable extends AbstractTable implements Serializable {
 
     @Override
     public List<Relationship> getRelationships() {
-      return Collections.unmodifiableList(_relationships);
+        //init relationships
+        getRelationshipsInternal();
+        return Collections.unmodifiableList(_relationships);
     }
 
     /**


[15/20] metamodel git commit: previously forgotten

Posted by ka...@apache.org.
previously forgotten


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

Branch: refs/heads/master
Commit: 725e2102b439bbd323a44d1f6e2efb2720371b86
Parents: e387a5a
Author: Jörg Unbehauen <jo...@unbehauen.net>
Authored: Wed Aug 2 15:05:33 2017 +0200
Committer: Jörg Unbehauen <jo...@unbehauen.net>
Committed: Wed Aug 2 15:05:33 2017 +0200

----------------------------------------------------------------------
 core/src/main/java/org/apache/metamodel/schema/CompositeSchema.java | 1 -
 1 file changed, 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/metamodel/blob/725e2102/core/src/main/java/org/apache/metamodel/schema/CompositeSchema.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/schema/CompositeSchema.java b/core/src/main/java/org/apache/metamodel/schema/CompositeSchema.java
index 4e5a569..b48f14b 100644
--- a/core/src/main/java/org/apache/metamodel/schema/CompositeSchema.java
+++ b/core/src/main/java/org/apache/metamodel/schema/CompositeSchema.java
@@ -25,7 +25,6 @@ import java.util.Set;
 import java.util.stream.Collectors;
 
 import org.apache.metamodel.DataContext;
-import org.apache.metamodel.util.CollectionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 


[14/20] metamodel git commit: organized the imports

Posted by ka...@apache.org.
organized the imports


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

Branch: refs/heads/master
Commit: e387a5ae62b500b467fcdae3cac0513af57fc920
Parents: 6234fb4
Author: Jörg Unbehauen <jo...@unbehauen.net>
Authored: Wed Aug 2 14:39:31 2017 +0200
Committer: Jörg Unbehauen <jo...@unbehauen.net>
Committed: Wed Aug 2 14:39:31 2017 +0200

----------------------------------------------------------------------
 .../org/apache/metamodel/AbstractDataContext.java    | 13 ++++++-------
 .../org/apache/metamodel/CompositeDataContext.java   | 15 +++++++++++----
 .../main/java/org/apache/metamodel/DataContext.java  |  1 -
 .../org/apache/metamodel/convert/Converters.java     | 13 ++++++++-----
 .../org/apache/metamodel/data/AbstractDataSet.java   |  8 +++-----
 .../apache/metamodel/data/CachingDataSetHeader.java  |  7 +++----
 .../org/apache/metamodel/data/DataSetTableModel.java |  1 -
 .../apache/metamodel/data/ScalarFunctionDataSet.java |  5 ++---
 .../apache/metamodel/data/SimpleDataSetHeader.java   |  7 +++----
 .../java/org/apache/metamodel/data/UnionDataSet.java |  6 +++---
 .../intercept/InterceptableDataContext.java          |  2 --
 .../org/apache/metamodel/schema/AbstractSchema.java  | 11 ++++++-----
 .../org/apache/metamodel/schema/AbstractTable.java   |  8 +++-----
 .../metamodel/schema/ImmutableRelationship.java      |  1 -
 .../apache/metamodel/AbstractDataContextTest.java    |  1 -
 .../intercept/InterceptableDataContextTest.java      |  7 +++----
 .../LegacyDeserializationObjectInputStreamTest.java  |  6 ++----
 17 files changed, 53 insertions(+), 59 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/metamodel/blob/e387a5ae/core/src/main/java/org/apache/metamodel/AbstractDataContext.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/AbstractDataContext.java b/core/src/main/java/org/apache/metamodel/AbstractDataContext.java
index 4fd00a6..379b9ed 100644
--- a/core/src/main/java/org/apache/metamodel/AbstractDataContext.java
+++ b/core/src/main/java/org/apache/metamodel/AbstractDataContext.java
@@ -18,13 +18,6 @@
  */
 package org.apache.metamodel;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.List;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-
 import org.apache.metamodel.data.DataSet;
 import org.apache.metamodel.query.CompiledQuery;
 import org.apache.metamodel.query.DefaultCompiledQuery;
@@ -36,6 +29,12 @@ import org.apache.metamodel.schema.Column;
 import org.apache.metamodel.schema.Schema;
 import org.apache.metamodel.schema.Table;
 
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
 /**
  * Abstract implementation of the DataContext interface. Provides convenient
  * implementations of all trivial and datastore-independent methods.

http://git-wip-us.apache.org/repos/asf/metamodel/blob/e387a5ae/core/src/main/java/org/apache/metamodel/CompositeDataContext.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/CompositeDataContext.java b/core/src/main/java/org/apache/metamodel/CompositeDataContext.java
index 0ddc78c..f595b2e 100644
--- a/core/src/main/java/org/apache/metamodel/CompositeDataContext.java
+++ b/core/src/main/java/org/apache/metamodel/CompositeDataContext.java
@@ -18,10 +18,6 @@
  */
 package org.apache.metamodel;
 
-import java.util.*;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-
 import org.apache.metamodel.data.DataSet;
 import org.apache.metamodel.query.FromItem;
 import org.apache.metamodel.query.Query;
@@ -31,6 +27,17 @@ import org.apache.metamodel.schema.Table;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.function.Function;
+
 
 /**
  * DataContext for composite datacontexts. Composite DataContexts wrap several

http://git-wip-us.apache.org/repos/asf/metamodel/blob/e387a5ae/core/src/main/java/org/apache/metamodel/DataContext.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/DataContext.java b/core/src/main/java/org/apache/metamodel/DataContext.java
index ee56f1e..58bec4a 100644
--- a/core/src/main/java/org/apache/metamodel/DataContext.java
+++ b/core/src/main/java/org/apache/metamodel/DataContext.java
@@ -27,7 +27,6 @@ import org.apache.metamodel.schema.Column;
 import org.apache.metamodel.schema.Schema;
 import org.apache.metamodel.schema.Table;
 
-import java.util.Collection;
 import java.util.List;
 
 /**

http://git-wip-us.apache.org/repos/asf/metamodel/blob/e387a5ae/core/src/main/java/org/apache/metamodel/convert/Converters.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/convert/Converters.java b/core/src/main/java/org/apache/metamodel/convert/Converters.java
index f0859bb..3c2ad00 100644
--- a/core/src/main/java/org/apache/metamodel/convert/Converters.java
+++ b/core/src/main/java/org/apache/metamodel/convert/Converters.java
@@ -18,12 +18,7 @@
  */
 package org.apache.metamodel.convert;
 
-import java.util.*;
-import java.util.Map.Entry;
-import java.util.stream.Collectors;
-
 import org.apache.metamodel.DataContext;
-import org.apache.metamodel.MetaModelHelper;
 import org.apache.metamodel.UpdateableDataContext;
 import org.apache.metamodel.data.DataSet;
 import org.apache.metamodel.data.Row;
@@ -38,6 +33,14 @@ import org.apache.metamodel.schema.Table;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.stream.Collectors;
+
 /**
  * This class consists of static methods for decorating {@link DataContext}s
  * with {@link TypeConverter}s, which allows for automatic conversion of values

http://git-wip-us.apache.org/repos/asf/metamodel/blob/e387a5ae/core/src/main/java/org/apache/metamodel/data/AbstractDataSet.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/data/AbstractDataSet.java b/core/src/main/java/org/apache/metamodel/data/AbstractDataSet.java
index 17699b5..39e5303 100644
--- a/core/src/main/java/org/apache/metamodel/data/AbstractDataSet.java
+++ b/core/src/main/java/org/apache/metamodel/data/AbstractDataSet.java
@@ -18,17 +18,15 @@
  */
 package org.apache.metamodel.data;
 
+import org.apache.metamodel.query.SelectItem;
+import org.apache.metamodel.util.BaseObject;
+
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Objects;
 
-import org.apache.metamodel.MetaModelHelper;
-import org.apache.metamodel.query.SelectItem;
-import org.apache.metamodel.schema.Column;
-import org.apache.metamodel.util.BaseObject;
-
 /**
  * Abstract DataSet implementation. Provides convenient implementations of
  * trivial method and reusable parts of non-trivial methods of a DataSet.

http://git-wip-us.apache.org/repos/asf/metamodel/blob/e387a5ae/core/src/main/java/org/apache/metamodel/data/CachingDataSetHeader.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/data/CachingDataSetHeader.java b/core/src/main/java/org/apache/metamodel/data/CachingDataSetHeader.java
index 76ce891..965dea3 100644
--- a/core/src/main/java/org/apache/metamodel/data/CachingDataSetHeader.java
+++ b/core/src/main/java/org/apache/metamodel/data/CachingDataSetHeader.java
@@ -18,14 +18,13 @@
  */
 package org.apache.metamodel.data;
 
-import java.util.Arrays;
+import org.apache.metamodel.query.SelectItem;
+import org.apache.metamodel.schema.Column;
+
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
-import org.apache.metamodel.query.SelectItem;
-import org.apache.metamodel.schema.Column;
-
 /**
  * Most common implementation of {@link DataSetHeader}. This implementation is
  * 'caching' in the sense that index values of selectitems are cached in a map

http://git-wip-us.apache.org/repos/asf/metamodel/blob/e387a5ae/core/src/main/java/org/apache/metamodel/data/DataSetTableModel.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/data/DataSetTableModel.java b/core/src/main/java/org/apache/metamodel/data/DataSetTableModel.java
index c67ff05..939b980 100644
--- a/core/src/main/java/org/apache/metamodel/data/DataSetTableModel.java
+++ b/core/src/main/java/org/apache/metamodel/data/DataSetTableModel.java
@@ -19,7 +19,6 @@
 package org.apache.metamodel.data;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
 
 import javax.swing.table.AbstractTableModel;

http://git-wip-us.apache.org/repos/asf/metamodel/blob/e387a5ae/core/src/main/java/org/apache/metamodel/data/ScalarFunctionDataSet.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/data/ScalarFunctionDataSet.java b/core/src/main/java/org/apache/metamodel/data/ScalarFunctionDataSet.java
index 9d45946..d9e6e9c 100644
--- a/core/src/main/java/org/apache/metamodel/data/ScalarFunctionDataSet.java
+++ b/core/src/main/java/org/apache/metamodel/data/ScalarFunctionDataSet.java
@@ -18,13 +18,12 @@
  */
 package org.apache.metamodel.data;
 
-import java.util.Arrays;
-import java.util.List;
-
 import org.apache.metamodel.query.ScalarFunction;
 import org.apache.metamodel.query.SelectItem;
 import org.apache.metamodel.util.CollectionUtils;
 
+import java.util.List;
+
 /**
  * A {@link DataSet} that enhances another {@link DataSet} with
  * {@link ScalarFunction}s.

http://git-wip-us.apache.org/repos/asf/metamodel/blob/e387a5ae/core/src/main/java/org/apache/metamodel/data/SimpleDataSetHeader.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/data/SimpleDataSetHeader.java b/core/src/main/java/org/apache/metamodel/data/SimpleDataSetHeader.java
index 71703d5..e3bf59d 100644
--- a/core/src/main/java/org/apache/metamodel/data/SimpleDataSetHeader.java
+++ b/core/src/main/java/org/apache/metamodel/data/SimpleDataSetHeader.java
@@ -18,15 +18,14 @@
  */
 package org.apache.metamodel.data;
 
+import org.apache.metamodel.query.SelectItem;
+import org.apache.metamodel.schema.Column;
+
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.stream.Collectors;
 
-import org.apache.metamodel.MetaModelHelper;
-import org.apache.metamodel.query.SelectItem;
-import org.apache.metamodel.schema.Column;
-
 /**
  * Simple implementation of {@link DataSetHeader} which does no magic to improve
  * performance.

http://git-wip-us.apache.org/repos/asf/metamodel/blob/e387a5ae/core/src/main/java/org/apache/metamodel/data/UnionDataSet.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/data/UnionDataSet.java b/core/src/main/java/org/apache/metamodel/data/UnionDataSet.java
index f13124c..f8ef9bf 100644
--- a/core/src/main/java/org/apache/metamodel/data/UnionDataSet.java
+++ b/core/src/main/java/org/apache/metamodel/data/UnionDataSet.java
@@ -18,6 +18,9 @@
  */
 package org.apache.metamodel.data;
 
+import org.apache.metamodel.query.InvokableQuery;
+import org.apache.metamodel.util.ImmutableRef;
+
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.Objects;
@@ -25,9 +28,6 @@ import java.util.function.Function;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
 
-import org.apache.metamodel.query.InvokableQuery;
-import org.apache.metamodel.util.ImmutableRef;
-
 /**
  * A {@link DataSet} that represents the union of two or more other data sets
  */

http://git-wip-us.apache.org/repos/asf/metamodel/blob/e387a5ae/core/src/main/java/org/apache/metamodel/intercept/InterceptableDataContext.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/intercept/InterceptableDataContext.java b/core/src/main/java/org/apache/metamodel/intercept/InterceptableDataContext.java
index 3076ca8..74af932 100644
--- a/core/src/main/java/org/apache/metamodel/intercept/InterceptableDataContext.java
+++ b/core/src/main/java/org/apache/metamodel/intercept/InterceptableDataContext.java
@@ -36,9 +36,7 @@ import org.apache.metamodel.schema.Column;
 import org.apache.metamodel.schema.Schema;
 import org.apache.metamodel.schema.Table;
 import org.apache.metamodel.update.RowUpdationBuilder;
-import org.apache.metamodel.util.HasNameMapper;
 
-import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
 

http://git-wip-us.apache.org/repos/asf/metamodel/blob/e387a5ae/core/src/main/java/org/apache/metamodel/schema/AbstractSchema.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/schema/AbstractSchema.java b/core/src/main/java/org/apache/metamodel/schema/AbstractSchema.java
index df4a033..f8b8c1d 100644
--- a/core/src/main/java/org/apache/metamodel/schema/AbstractSchema.java
+++ b/core/src/main/java/org/apache/metamodel/schema/AbstractSchema.java
@@ -18,15 +18,16 @@
  */
 package org.apache.metamodel.schema;
 
-import java.util.*;
-import java.util.stream.Collectors;
-
-import org.apache.metamodel.util.CollectionUtils;
 import org.apache.metamodel.util.EqualsBuilder;
-import org.apache.metamodel.util.HasNameMapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.stream.Collectors;
+
 /**
  * Abstract implementation of the {@link Schema} interface. Implements most
  * common and trivial methods.

http://git-wip-us.apache.org/repos/asf/metamodel/blob/e387a5ae/core/src/main/java/org/apache/metamodel/schema/AbstractTable.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/schema/AbstractTable.java b/core/src/main/java/org/apache/metamodel/schema/AbstractTable.java
index 6e5b55f..4f11f50 100644
--- a/core/src/main/java/org/apache/metamodel/schema/AbstractTable.java
+++ b/core/src/main/java/org/apache/metamodel/schema/AbstractTable.java
@@ -18,15 +18,13 @@
  */
 package org.apache.metamodel.schema;
 
-import java.util.*;
-import java.util.function.Predicate;
-import java.util.stream.Collectors;
-
-import org.apache.metamodel.MetaModelHelper;
 import org.apache.metamodel.util.CollectionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.*;
+import java.util.stream.Collectors;
+
 /**
  * Abstract {@link Table} implementation. Includes most common/trivial methods.
  */

http://git-wip-us.apache.org/repos/asf/metamodel/blob/e387a5ae/core/src/main/java/org/apache/metamodel/schema/ImmutableRelationship.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/schema/ImmutableRelationship.java b/core/src/main/java/org/apache/metamodel/schema/ImmutableRelationship.java
index b930359..7ca8fe9 100644
--- a/core/src/main/java/org/apache/metamodel/schema/ImmutableRelationship.java
+++ b/core/src/main/java/org/apache/metamodel/schema/ImmutableRelationship.java
@@ -19,7 +19,6 @@
 package org.apache.metamodel.schema;
 
 import java.io.Serializable;
-import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
 

http://git-wip-us.apache.org/repos/asf/metamodel/blob/e387a5ae/core/src/test/java/org/apache/metamodel/AbstractDataContextTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/metamodel/AbstractDataContextTest.java b/core/src/test/java/org/apache/metamodel/AbstractDataContextTest.java
index c526df5..8c102af 100644
--- a/core/src/test/java/org/apache/metamodel/AbstractDataContextTest.java
+++ b/core/src/test/java/org/apache/metamodel/AbstractDataContextTest.java
@@ -21,7 +21,6 @@ package org.apache.metamodel;
 import java.util.*;
 
 import com.google.common.collect.Lists;
-import javafx.scene.Scene;
 import junit.framework.TestCase;
 import org.apache.metamodel.data.DataSet;
 import org.apache.metamodel.query.Query;

http://git-wip-us.apache.org/repos/asf/metamodel/blob/e387a5ae/core/src/test/java/org/apache/metamodel/intercept/InterceptableDataContextTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/metamodel/intercept/InterceptableDataContextTest.java b/core/src/test/java/org/apache/metamodel/intercept/InterceptableDataContextTest.java
index 647ace4..fe69b6c 100644
--- a/core/src/test/java/org/apache/metamodel/intercept/InterceptableDataContextTest.java
+++ b/core/src/test/java/org/apache/metamodel/intercept/InterceptableDataContextTest.java
@@ -18,11 +18,7 @@
  */
 package org.apache.metamodel.intercept;
 
-import java.util.Arrays;
-import java.util.List;
-
 import junit.framework.TestCase;
-
 import org.apache.metamodel.DataContext;
 import org.apache.metamodel.MockUpdateableDataContext;
 import org.apache.metamodel.data.DataSet;
@@ -32,6 +28,9 @@ import org.apache.metamodel.schema.MutableSchema;
 import org.apache.metamodel.schema.Schema;
 import org.apache.metamodel.schema.Table;
 
+import java.util.Arrays;
+import java.util.List;
+
 public class InterceptableDataContextTest extends TestCase {
 
 	private final MockUpdateableDataContext delegateDataContext = new MockUpdateableDataContext();

http://git-wip-us.apache.org/repos/asf/metamodel/blob/e387a5ae/core/src/test/java/org/apache/metamodel/util/LegacyDeserializationObjectInputStreamTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/metamodel/util/LegacyDeserializationObjectInputStreamTest.java b/core/src/test/java/org/apache/metamodel/util/LegacyDeserializationObjectInputStreamTest.java
index 7753539..ce6e85c 100644
--- a/core/src/test/java/org/apache/metamodel/util/LegacyDeserializationObjectInputStreamTest.java
+++ b/core/src/test/java/org/apache/metamodel/util/LegacyDeserializationObjectInputStreamTest.java
@@ -18,14 +18,12 @@
  */
 package org.apache.metamodel.util;
 
-import java.io.FileInputStream;
-
 import junit.framework.TestCase;
-
 import org.apache.metamodel.query.Query;
-import org.apache.metamodel.schema.Column;
 import org.apache.metamodel.schema.Table;
 
+import java.io.FileInputStream;
+
 public class LegacyDeserializationObjectInputStreamTest extends TestCase {
 
     /**


[03/20] metamodel git commit: first round of refactoring

Posted by ka...@apache.org.
first round of refactoring


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

Branch: refs/heads/master
Commit: ab5c9482dd2efbb4cdc17402fddabfed05915ff2
Parents: 6f9e094
Author: Jörg Unbehauen <jo...@unbehauen.net>
Authored: Thu Jul 27 13:01:26 2017 +0200
Committer: Jörg Unbehauen <jo...@unbehauen.net>
Committed: Thu Jul 27 13:01:26 2017 +0200

----------------------------------------------------------------------
 core/pom.xml                                    |   4 +
 .../apache/metamodel/AbstractDataContext.java   |  48 ++++---
 .../metamodel/AbstractUpdateCallback.java       |   4 +-
 .../apache/metamodel/CompositeDataContext.java  |  21 +---
 .../metamodel/CompositeQueryDelegate.java       |   3 +-
 .../java/org/apache/metamodel/DataContext.java  |   7 +-
 .../metamodel/DeleteAndInsertBuilder.java       |  13 +-
 .../org/apache/metamodel/MetaModelHelper.java   |  59 +++++----
 .../metamodel/QueryPostprocessDataContext.java  |  55 ++++----
 .../convert/ConvertedDataSetInterceptor.java    |   9 +-
 .../apache/metamodel/convert/Converters.java    |  33 ++---
 .../create/AbstractTableCreationBuilder.java    |  18 +--
 .../apache/metamodel/data/AbstractDataSet.java  |   6 +-
 .../org/apache/metamodel/data/AbstractRow.java  |   3 +-
 .../metamodel/data/AbstractRowBuilder.java      |   9 +-
 .../metamodel/data/CachingDataSetHeader.java    |   3 -
 .../java/org/apache/metamodel/data/DataSet.java |   2 +-
 .../apache/metamodel/data/DataSetHeader.java    |   3 +-
 .../metamodel/data/DataSetTableModel.java       |   8 +-
 .../org/apache/metamodel/data/EmptyDataSet.java |   8 --
 .../apache/metamodel/data/InMemoryDataSet.java  |   2 +-
 .../java/org/apache/metamodel/data/Row.java     |   3 +-
 .../metamodel/data/ScalarFunctionDataSet.java   |   2 +-
 .../metamodel/data/SimpleDataSetHeader.java     |   9 +-
 .../org/apache/metamodel/data/UnionDataSet.java |   2 +-
 .../insert/AbstractRowInsertionBuilder.java     |   8 +-
 .../intercept/InterceptableDataContext.java     |  30 +++--
 .../org/apache/metamodel/query/FromItem.java    |  14 +--
 .../java/org/apache/metamodel/query/Query.java  |  14 ++-
 .../query/builder/GroupedQueryBuilderImpl.java  |   2 +-
 .../query/builder/InitFromBuilderImpl.java      |   2 +-
 .../query/builder/SatisfiedFromBuilder.java     |   6 +-
 .../builder/SatisfiedFromBuilderCallback.java   |   5 +
 .../metamodel/schema/AbstractRelationship.java  |  32 ++---
 .../apache/metamodel/schema/AbstractSchema.java |  44 +++----
 .../apache/metamodel/schema/AbstractTable.java  | 119 ++++++++----------
 .../metamodel/schema/CompositeSchema.java       |  22 ++--
 .../metamodel/schema/ImmutableRelationship.java |  31 ++---
 .../metamodel/schema/ImmutableSchema.java       |  10 +-
 .../apache/metamodel/schema/ImmutableTable.java |  12 +-
 .../metamodel/schema/MutableRelationship.java   |  25 ++--
 .../apache/metamodel/schema/MutableSchema.java  |   6 +-
 .../apache/metamodel/schema/MutableTable.java   |  11 +-
 .../apache/metamodel/schema/Relationship.java   |   5 +-
 .../org/apache/metamodel/schema/Schema.java     |  10 +-
 .../java/org/apache/metamodel/schema/Table.java |  32 ++---
 .../metamodel/AbstractDataContextTest.java      |  24 ++--
 .../metamodel/CompositeDataContextTest.java     |  17 ++-
 .../apache/metamodel/MetaModelHelperTest.java   |  41 +++---
 .../org/apache/metamodel/MetaModelTestCase.java |  14 +--
 .../org/apache/metamodel/MockDataContext.java   |   9 +-
 .../metamodel/MockUpdateableDataContext.java    |  13 +-
 .../QueryPostprocessDataContextTest.java        | 124 +++++++++----------
 .../metamodel/convert/ConvertersTest.java       |   4 +-
 .../create/AbstractCreateTableBuilderTest.java  |  14 +--
 .../metamodel/data/DataSetTableModelTest.java   |   3 +-
 .../apache/metamodel/data/DefaultRowTest.java   |   9 +-
 .../java/org/apache/metamodel/data/RowTest.java |  17 ++-
 .../apache/metamodel/data/UnionDataSetTest.java |  19 ++-
 .../delete/AbstractRowDeletionCallbackTest.java |   2 +-
 .../intercept/InterceptableDataContextTest.java |  25 ++--
 .../apache/metamodel/query/FilterItemTest.java  |  30 ++---
 .../apache/metamodel/query/FromItemTest.java    |  11 +-
 .../org/apache/metamodel/query/QueryTest.java   |   2 +-
 .../apache/metamodel/query/SelectItemTest.java  |  14 ++-
 .../builder/GroupedQueryBuilderImplTest.java    |   4 +-
 .../query/builder/SyntaxExamplesTest.java       |   6 +-
 .../metamodel/schema/MutableTableTest.java      |  19 +--
 .../metamodel/schema/SchemaModelTest.java       |  40 +++---
 ...acyDeserializationObjectInputStreamTest.java |   5 +-
 .../metamodel/sugarcrm/SugarCrmDataContext.java |   2 +-
 .../apache/metamodel/xml/XmlDomDataContext.java |  69 +++++------
 .../apache/metamodel/xml/XmlSaxDataContext.java |  11 +-
 .../metamodel/xml/XmlDomDataContextTest.java    |  53 ++++----
 .../metamodel/xml/XmlSaxDataContextTest.java    |  10 +-
 75 files changed, 705 insertions(+), 680 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/pom.xml
----------------------------------------------------------------------
diff --git a/core/pom.xml b/core/pom.xml
index 3af58c9..4add6ad 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -28,6 +28,10 @@ under the License.
 	<name>MetaModel core API</name>
 	<dependencies>
 		<dependency>
+			<groupId>com.google.guava</groupId>
+			<artifactId>guava</artifactId>
+		</dependency>
+		<dependency>
 			<groupId>org.slf4j</groupId>
 			<artifactId>slf4j-api</artifactId>
 		</dependency>

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/main/java/org/apache/metamodel/AbstractDataContext.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/AbstractDataContext.java b/core/src/main/java/org/apache/metamodel/AbstractDataContext.java
index a42d7f6..4fd00a6 100644
--- a/core/src/main/java/org/apache/metamodel/AbstractDataContext.java
+++ b/core/src/main/java/org/apache/metamodel/AbstractDataContext.java
@@ -45,7 +45,7 @@ public abstract class AbstractDataContext implements DataContext {
     private static final String NULL_SCHEMA_NAME_TOKEN = "<metamodel.schema.name.null>";
     private final ConcurrentMap<String, Schema> _schemaCache = new ConcurrentHashMap<String, Schema>();
     private final Comparator<? super String> _schemaNameComparator = SchemaNameComparator.getInstance();
-    private String[] _schemaNameCache;
+    private List<String> _schemaNameCache;
 
     /**
      * {@inheritDoc}
@@ -70,11 +70,10 @@ public abstract class AbstractDataContext implements DataContext {
      * {@inheritDoc}
      */
     @Override
-    public final Schema[] getSchemas() throws MetaModelException {
-        String[] schemaNames = getSchemaNames();
-        Schema[] schemas = new Schema[schemaNames.length];
-        for (int i = 0; i < schemaNames.length; i++) {
-            final String name = schemaNames[i];
+    public final List<Schema> getSchemas() throws MetaModelException {
+        List<String> schemaNames = getSchemaNames();
+        List<Schema> schemas = new ArrayList<>();
+        for (final String name: schemaNames) {
             final Schema schema = _schemaCache.get(getSchemaCacheKey(name));
             if (schema == null) {
                 final Schema newSchema = getSchemaByName(name);
@@ -83,12 +82,12 @@ public abstract class AbstractDataContext implements DataContext {
                 }
                 final Schema existingSchema = _schemaCache.putIfAbsent(getSchemaCacheKey(name), newSchema);
                 if (existingSchema == null) {
-                    schemas[i] = newSchema;
+                    schemas.add(newSchema);
                 } else {
-                    schemas[i] = existingSchema;
+                    schemas.add(existingSchema);
                 }
             } else {
-                schemas[i] = schema;
+                schemas.add(schema);
             }
         }
         return schemas;
@@ -105,12 +104,12 @@ public abstract class AbstractDataContext implements DataContext {
      * m {@inheritDoc}
      */
     @Override
-    public final String[] getSchemaNames() throws MetaModelException {
+    public final List<String> getSchemaNames() throws MetaModelException {
         if (_schemaNameCache == null) {
             _schemaNameCache = getSchemaNamesInternal();
         }
-        String[] schemaNames = Arrays.copyOf(_schemaNameCache, _schemaNameCache.length);
-        Arrays.sort(schemaNames, _schemaNameComparator);
+        List<String> schemaNames = new ArrayList<>(_schemaNameCache);
+        schemaNames.sort(_schemaNameComparator);
         return schemaNames;
     }
 
@@ -125,13 +124,12 @@ public abstract class AbstractDataContext implements DataContext {
             result = getSchemaByName(defaultSchemaName);
         }
         if (result == null) {
-            final Schema[] schemas = getSchemas();
-            if (schemas.length == 1) {
-                result = schemas[0];
+            final List<Schema> schemas = getSchemas();
+            if (schemas.size() == 1) {
+                result = schemas.get(0);
             } else {
                 int highestTableCount = -1;
-                for (int i = 0; i < schemas.length; i++) {
-                    final Schema schema = schemas[i];
+                for (Schema schema: schemas) {
                     String name = schema.getName();
                     if (schema != null) {
                         name = name.toLowerCase();
@@ -200,7 +198,7 @@ public abstract class AbstractDataContext implements DataContext {
             if (name == null) {
                 schema = getSchemaByNameInternal(null);
             } else {
-                String[] schemaNames = getSchemaNames();
+                List<String> schemaNames = getSchemaNames();
                 for (String schemaName : schemaNames) {
                     if (name.equalsIgnoreCase(schemaName)) {
                         schema = getSchemaByNameInternal(name);
@@ -255,7 +253,7 @@ public abstract class AbstractDataContext implements DataContext {
         }
 
         Schema schema = null;
-        final String[] schemaNames = getSchemaNames();
+        final List<String> schemaNames = getSchemaNames();
         for (final String schemaName : schemaNames) {
             if (schemaName == null) {
                 // search without schema name (some databases have only a single
@@ -333,7 +331,7 @@ public abstract class AbstractDataContext implements DataContext {
     private final Column getColumn(final Schema schema, final String tableAndColumnPath) {
         Table table = null;
         String columnPath = tableAndColumnPath;
-        final String[] tableNames = schema.getTableNames();
+        final List<String> tableNames = schema.getTableNames();
         for (final String tableName : tableNames) {
             if (tableName != null) {
                 // search case-sensitive
@@ -368,8 +366,8 @@ public abstract class AbstractDataContext implements DataContext {
             }
         }
 
-        if (table == null && tableNames.length == 1) {
-            table = schema.getTables()[0];
+        if (table == null && tableNames.size() == 1) {
+            table = schema.getTables().get(0);
         }
 
         if (table != null) {
@@ -403,7 +401,7 @@ public abstract class AbstractDataContext implements DataContext {
         }
 
         Schema schema = null;
-        String[] schemaNames = getSchemaNames();
+        List<String> schemaNames = getSchemaNames();
         for (String schemaName : schemaNames) {
             if (schemaName == null) {
                 // there's an unnamed schema present.
@@ -452,7 +450,7 @@ public abstract class AbstractDataContext implements DataContext {
     /**
      * Tokenizes a path for a table or a column.
      * 
-     * @param tableName
+     * @param path
      * @param expectedParts
      * @return
      */
@@ -545,7 +543,7 @@ public abstract class AbstractDataContext implements DataContext {
      * 
      * @return an array of schema names.
      */
-    protected abstract String[] getSchemaNamesInternal();
+    protected abstract List<String> getSchemaNamesInternal();
 
     /**
      * Gets the name of the default schema.

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/main/java/org/apache/metamodel/AbstractUpdateCallback.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/AbstractUpdateCallback.java b/core/src/main/java/org/apache/metamodel/AbstractUpdateCallback.java
index a1c2f1a..4ff7279 100644
--- a/core/src/main/java/org/apache/metamodel/AbstractUpdateCallback.java
+++ b/core/src/main/java/org/apache/metamodel/AbstractUpdateCallback.java
@@ -60,7 +60,7 @@ public abstract class AbstractUpdateCallback implements UpdateCallback {
         final Table table = schema.getTableByName(tableName);
         if (table == null) {
             throw new IllegalArgumentException("Nu such table '" + tableName + "' found in schema: " + schema
-                    + ". Available tables are: " + Arrays.toString(schema.getTableNames()));
+                    + ". Available tables are: " + Arrays.toString(schema.getTableNames().toArray()));
         }
         return dropTable(table);
     }
@@ -82,7 +82,7 @@ public abstract class AbstractUpdateCallback implements UpdateCallback {
         final Table table = schema.getTableByName(tableName);
         if (table == null) {
             throw new IllegalArgumentException("Nu such table '" + tableName + "' found in schema: " + schema
-                    + ". Available tables are: " + Arrays.toString(schema.getTableNames()));
+                    + ". Available tables are: " + Arrays.toString(schema.getTableNames().toArray()));
         }
         return table;
     }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/main/java/org/apache/metamodel/CompositeDataContext.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/CompositeDataContext.java b/core/src/main/java/org/apache/metamodel/CompositeDataContext.java
index 8612a51..0ddc78c 100644
--- a/core/src/main/java/org/apache/metamodel/CompositeDataContext.java
+++ b/core/src/main/java/org/apache/metamodel/CompositeDataContext.java
@@ -18,16 +18,9 @@
  */
 package org.apache.metamodel;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 import java.util.function.Function;
+import java.util.stream.Collectors;
 
 import org.apache.metamodel.data.DataSet;
 import org.apache.metamodel.query.FromItem;
@@ -178,10 +171,10 @@ public class CompositeDataContext extends AbstractDataContext {
     }
 
     @Override
-    public String[] getSchemaNamesInternal() throws MetaModelException {
-        Set<String> set = new HashSet<String>();
+    public List<String> getSchemaNamesInternal() throws MetaModelException {
+        Set<String> set = new TreeSet<>();
         for (DataContext dc : _delegates) {
-            String[] schemaNames = dc.getSchemaNames();
+            List<String> schemaNames = dc.getSchemaNames();
             for (String name : schemaNames) {
                 if (!MetaModelHelper.isInformationSchema(name)) {
                     // we skip information schemas, since they're anyways going
@@ -190,9 +183,7 @@ public class CompositeDataContext extends AbstractDataContext {
                 }
             }
         }
-        String[] result = set.toArray(new String[set.size()]);
-        Arrays.sort(result);
-        return result;
+        return new ArrayList<>(set);
     }
 
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/main/java/org/apache/metamodel/CompositeQueryDelegate.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/CompositeQueryDelegate.java b/core/src/main/java/org/apache/metamodel/CompositeQueryDelegate.java
index d3e1a04..8402695 100644
--- a/core/src/main/java/org/apache/metamodel/CompositeQueryDelegate.java
+++ b/core/src/main/java/org/apache/metamodel/CompositeQueryDelegate.java
@@ -18,6 +18,7 @@
  */
 package org.apache.metamodel;
 
+import java.util.List;
 import java.util.function.Function;
 
 import org.apache.metamodel.data.DataSet;
@@ -35,7 +36,7 @@ final class CompositeQueryDelegate extends QueryPostprocessDelegate {
 	}
 
 	@Override
-	protected DataSet materializeMainSchemaTable(Table table, Column[] columns,
+	protected DataSet materializeMainSchemaTable(Table table, List<Column> columns,
 			int maxRows) {
 		// find the appropriate datacontext to execute a simple
 		// table materialization query

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/main/java/org/apache/metamodel/DataContext.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/DataContext.java b/core/src/main/java/org/apache/metamodel/DataContext.java
index 132ecfb..ee56f1e 100644
--- a/core/src/main/java/org/apache/metamodel/DataContext.java
+++ b/core/src/main/java/org/apache/metamodel/DataContext.java
@@ -27,6 +27,9 @@ import org.apache.metamodel.schema.Column;
 import org.apache.metamodel.schema.Schema;
 import org.apache.metamodel.schema.Table;
 
+import java.util.Collection;
+import java.util.List;
+
 /**
  * A DataContext represents the central entry point for interactions with
  * datastores. The DataContext contains of the structure of data (in the form of
@@ -51,7 +54,7 @@ public interface DataContext {
      * @throws MetaModelException
      *             if an error occurs retrieving the schema model
      */
-    public Schema[] getSchemas() throws MetaModelException;
+    public List<Schema> getSchemas() throws MetaModelException;
 
     /**
      * Gets the names of all schemas within this DataContext.
@@ -60,7 +63,7 @@ public interface DataContext {
      * @throws MetaModelException
      *             if an error occurs retrieving the schema model
      */
-    public String[] getSchemaNames() throws MetaModelException;
+    public List<String> getSchemaNames() throws MetaModelException;
 
     /**
      * Gets the default schema of this DataContext.

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/main/java/org/apache/metamodel/DeleteAndInsertBuilder.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/DeleteAndInsertBuilder.java b/core/src/main/java/org/apache/metamodel/DeleteAndInsertBuilder.java
index 1b4670b..2227256 100644
--- a/core/src/main/java/org/apache/metamodel/DeleteAndInsertBuilder.java
+++ b/core/src/main/java/org/apache/metamodel/DeleteAndInsertBuilder.java
@@ -82,11 +82,11 @@ public class DeleteAndInsertBuilder extends AbstractRowUpdationBuilder {
      * @return
      */
     private Row update(final Row original) {
-        SelectItem[] items = original.getSelectItems();
-        Object[] values = new Object[items.length];
-        for (int i = 0; i < items.length; i++) {
+        List<SelectItem> items = original.getSelectItems();
+        Object[] values = new Object[items.size()];
+        for (int i = 0; i < items.size(); i++) {
             final Object value;
-            Column column = items[i].getColumn();
+            Column column = items.get(i).getColumn();
             if (isSet(column)) {
                 // use update statement's value
                 value = getValues()[i];
@@ -103,7 +103,10 @@ public class DeleteAndInsertBuilder extends AbstractRowUpdationBuilder {
         final DataContext dc = _updateCallback.getDataContext();
         final Table table = getTable();
         final List<FilterItem> whereItems = getWhereItems();
-        final DataSet dataSet = dc.query().from(table).select(table.getColumns()).where(whereItems).execute();
+        final DataSet dataSet = dc.query()
+                .from(table)
+                .select(table.getColumns().toArray(new Column[table.getColumns().size()]))
+                .where(whereItems).execute();
         final List<Row> rows = dataSet.toRows();
         return rows;
     }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/main/java/org/apache/metamodel/MetaModelHelper.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/MetaModelHelper.java b/core/src/main/java/org/apache/metamodel/MetaModelHelper.java
index 09d47bc..ae87083 100644
--- a/core/src/main/java/org/apache/metamodel/MetaModelHelper.java
+++ b/core/src/main/java/org/apache/metamodel/MetaModelHelper.java
@@ -28,7 +28,10 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
+import com.google.common.collect.Lists;
 import org.apache.metamodel.data.CachingDataSetHeader;
 import org.apache.metamodel.data.DataSet;
 import org.apache.metamodel.data.DataSetHeader;
@@ -185,8 +188,8 @@ public final class MetaModelHelper {
 
         List<SelectItem> selectItems = new ArrayList<SelectItem>();
         for (DataSet dataSet : fromDataSets) {
-            for (int i = 0; i < dataSet.getSelectItems().length; i++) {
-                SelectItem item = dataSet.getSelectItems()[i];
+            for (int i = 0; i < dataSet.getSelectItems().size(); i++) {
+                SelectItem item = dataSet.getSelectItems().get(i);
                 selectItems.add(item);
             }
         }
@@ -195,7 +198,7 @@ public final class MetaModelHelper {
         List<Object[]> data = new ArrayList<Object[]>();
         for (int fromDataSetIndex = 0; fromDataSetIndex < fromDataSets.length; fromDataSetIndex++) {
             DataSet fromDataSet = fromDataSets[fromDataSetIndex];
-            SelectItem[] fromSelectItems = fromDataSet.getSelectItems();
+            List<SelectItem> fromSelectItems = fromDataSet.getSelectItems();
             if (fromDataSetIndex == 0) {
                 while (fromDataSet.next()) {
                     Object[] values = fromDataSet.getRow().getValues();
@@ -220,7 +223,7 @@ public final class MetaModelHelper {
                     }
                 }
             }
-            selectItemOffset += fromSelectItems.length;
+            selectItemOffset += fromSelectItems.size();
         }
 
         if (data.isEmpty()) {
@@ -261,7 +264,7 @@ public final class MetaModelHelper {
     }
 
     public static DataSet getSelection(final List<SelectItem> selectItems, final DataSet dataSet) {
-        final List<SelectItem> dataSetSelectItems = Arrays.asList(dataSet.getSelectItems());
+        final List<SelectItem> dataSetSelectItems = dataSet.getSelectItems();
 
         // check if the selection is already the same
         if (selectItems.equals(dataSetSelectItems)) {
@@ -295,18 +298,17 @@ public final class MetaModelHelper {
 
     public static DataSet getGrouped(List<SelectItem> selectItems, DataSet dataSet,
             Collection<GroupByItem> groupByItems) {
-        return getGrouped(selectItems, dataSet, groupByItems.toArray(new GroupByItem[groupByItems.size()]));
+        return getGrouped(selectItems, dataSet, groupByItems);
     }
 
-    public static DataSet getGrouped(List<SelectItem> selectItems, DataSet dataSet, GroupByItem[] groupByItems) {
+    public static DataSet getGrouped(List<SelectItem> selectItems, DataSet dataSet, List<GroupByItem> groupByItems) {
         DataSet result = dataSet;
-        if (groupByItems != null && groupByItems.length > 0) {
+        if (groupByItems != null && groupByItems.size() > 0) {
             Map<Row, Map<SelectItem, List<Object>>> uniqueRows = new HashMap<Row, Map<SelectItem, List<Object>>>();
 
-            final SelectItem[] groupBySelects = new SelectItem[groupByItems.length];
-            for (int i = 0; i < groupBySelects.length; i++) {
-                groupBySelects[i] = groupByItems[i].getSelectItem();
-            }
+            final List<SelectItem> groupBySelects = groupByItems.stream()
+                    .map(gbi -> gbi.getSelectItem())
+                    .collect(Collectors.toList());
             final DataSetHeader groupByHeader = new CachingDataSetHeader(groupBySelects);
 
             // Creates a list of SelectItems that have aggregate functions
@@ -663,12 +665,9 @@ public final class MetaModelHelper {
         if (ds2 == null) {
             throw new IllegalArgumentException("Right DataSet cannot be null");
         }
-        SelectItem[] si1 = ds1.getSelectItems();
-        SelectItem[] si2 = ds2.getSelectItems();
-        SelectItem[] selectItems = new SelectItem[si1.length + si2.length];
-        System.arraycopy(si1, 0, selectItems, 0, si1.length);
-        System.arraycopy(si2, 0, selectItems, si1.length, si2.length);
-
+        List<SelectItem> si1 = ds1.getSelectItems();
+        List<SelectItem> si2 = ds2.getSelectItems();
+        List<SelectItem> selectItems = Stream.concat(si1.stream(),si2.stream()).collect(Collectors.toList());
         List<Row> resultRows = new ArrayList<Row>();
         List<Row> ds2data = readDataSetFull(ds2);
         if (ds2data.isEmpty()) {
@@ -695,7 +694,7 @@ public final class MetaModelHelper {
                 resultRows.addAll(carthesianRows);
             } else {
                 Object[] values = ds1row.getValues();
-                Object[] row = new Object[selectItems.length];
+                Object[] row = new Object[selectItems.size()];
                 System.arraycopy(values, 0, row, 0, values.length);
                 resultRows.add(new DefaultRow(header, row));
             }
@@ -721,11 +720,11 @@ public final class MetaModelHelper {
      * @return the right joined result dataset
      */
     public static DataSet getRightJoin(DataSet ds1, DataSet ds2, FilterItem[] onConditions) {
-        SelectItem[] ds1selects = ds1.getSelectItems();
-        SelectItem[] ds2selects = ds2.getSelectItems();
-        SelectItem[] leftOrderedSelects = new SelectItem[ds1selects.length + ds2selects.length];
-        System.arraycopy(ds1selects, 0, leftOrderedSelects, 0, ds1selects.length);
-        System.arraycopy(ds2selects, 0, leftOrderedSelects, ds1selects.length, ds2selects.length);
+        List<SelectItem> ds1selects = ds1.getSelectItems();
+        List<SelectItem> ds2selects = ds2.getSelectItems();
+        List<SelectItem> leftOrderedSelects = new ArrayList<>();
+        leftOrderedSelects.addAll(ds1selects);
+        leftOrderedSelects.addAll(ds2selects);
 
         // We will reuse the left join algorithm (but switch the datasets
         // around)
@@ -744,12 +743,12 @@ public final class MetaModelHelper {
     }
 
     public static DataSet getDistinct(DataSet dataSet) {
-        SelectItem[] selectItems = dataSet.getSelectItems();
-        GroupByItem[] groupByItems = new GroupByItem[selectItems.length];
-        for (int i = 0; i < groupByItems.length; i++) {
-            groupByItems[i] = new GroupByItem(selectItems[i]);
-        }
-        return getGrouped(Arrays.asList(selectItems), dataSet, groupByItems);
+        List<SelectItem> selectItems = dataSet.getSelectItems();
+        List<GroupByItem> groupByItems = selectItems.stream()
+                .map(GroupByItem::new)
+                .collect(Collectors.toList());
+
+        return getGrouped(selectItems, dataSet, groupByItems);
     }
 
     public static Table[] getTables(Column[] columns) {

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/main/java/org/apache/metamodel/QueryPostprocessDataContext.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/QueryPostprocessDataContext.java b/core/src/main/java/org/apache/metamodel/QueryPostprocessDataContext.java
index fac70d0..cbd97d3 100644
--- a/core/src/main/java/org/apache/metamodel/QueryPostprocessDataContext.java
+++ b/core/src/main/java/org/apache/metamodel/QueryPostprocessDataContext.java
@@ -24,6 +24,7 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import org.apache.metamodel.convert.ConvertedDataSetInterceptor;
 import org.apache.metamodel.convert.Converters;
@@ -366,11 +367,11 @@ public abstract class QueryPostprocessDataContext extends AbstractDataContext im
         if (selectItems == null || selectItems.isEmpty()) {
             // add any column (typically this occurs because of COUNT(*)
             // queries)
-            Column[] columns = table.getColumns();
-            if (columns.length == 0) {
+            List<Column> columns = table.getColumns();
+            if (columns.size() == 0) {
                 logger.warn("Queried table has no columns: {}", table);
             } else {
-                selectItems.add(new SelectItem(columns[0]));
+                selectItems.add(new SelectItem(columns.get(0)));
             }
         }
 
@@ -442,10 +443,10 @@ public abstract class QueryPostprocessDataContext extends AbstractDataContext im
     }
 
     @Override
-    protected final String[] getSchemaNamesInternal() throws MetaModelException {
-        final String[] schemaNames = new String[2];
-        schemaNames[0] = INFORMATION_SCHEMA_NAME;
-        schemaNames[1] = getMainSchemaName();
+    protected final List<String> getSchemaNamesInternal() throws MetaModelException {
+        final List<String> schemaNames = new ArrayList<>();
+        schemaNames.add(INFORMATION_SCHEMA_NAME);
+        schemaNames.add(getMainSchemaName());
         return schemaNames;
     }
 
@@ -527,9 +528,11 @@ public abstract class QueryPostprocessDataContext extends AbstractDataContext im
 
     private DataSet materializeInformationSchemaTable(final Table table, final List<SelectItem> selectItems) {
         final String tableName = table.getName();
-        final SelectItem[] columnSelectItems = MetaModelHelper.createSelectItems(table.getColumns());
+        final List<SelectItem> columnSelectItems = table.getColumns().stream()
+                .map(SelectItem::new)
+                .collect(Collectors.toList());
         final SimpleDataSetHeader header = new SimpleDataSetHeader(columnSelectItems);
-        final Table[] tables = getDefaultSchema().getTables();
+        final List<Table> tables = getDefaultSchema().getTables();
         final List<Row> data = new ArrayList<Row>();
         if ("tables".equals(tableName)) {
             // "tables" columns: name, type, num_columns, remarks
@@ -558,13 +561,13 @@ public abstract class QueryPostprocessDataContext extends AbstractDataContext im
             // "relationships" columns: primary_table, primary_column,
             // foreign_table, foreign_column
             for (Relationship r : getDefaultSchema().getRelationships()) {
-                Column[] primaryColumns = r.getPrimaryColumns();
-                Column[] foreignColumns = r.getForeignColumns();
+                List<Column> primaryColumns = r.getPrimaryColumns();
+                List<Column> foreignColumns = r.getForeignColumns();
                 Table pTable = r.getPrimaryTable();
                 Table fTable = r.getForeignTable();
-                for (int i = 0; i < primaryColumns.length; i++) {
-                    Column pColumn = primaryColumns[i];
-                    Column fColumn = foreignColumns[i];
+                for (int i = 0; i < primaryColumns.size(); i++) {
+                    Column pColumn = primaryColumns.get(i);
+                    Column fColumn = foreignColumns.get(i);
                     data.add(new DefaultRow(header,
                             new Object[] { pTable.getName(), pColumn.getName(), fTable.getName(), fColumn.getName() }));
                 }
@@ -628,11 +631,11 @@ public abstract class QueryPostprocessDataContext extends AbstractDataContext im
         DataSet dataSet;
         if (whereItems.isEmpty()) {
             // paging is pushed down to materializeMainSchemaTable
-            dataSet = materializeMainSchemaTable(table, workingSelectItems, firstRow, maxRows);
+            dataSet = materializeMainSchemaTableSelect(table, workingSelectItems, firstRow, maxRows);
             dataSet = MetaModelHelper.getSelection(selectItems, dataSet);
         } else {
             // do not push down paging, first we have to apply filtering
-            dataSet = materializeMainSchemaTable(table, workingSelectItems, 1, -1);
+            dataSet = materializeMainSchemaTableSelect(table, workingSelectItems, 1, -1);
             dataSet = MetaModelHelper.getFiltered(dataSet, whereItems);
             dataSet = MetaModelHelper.getPaged(dataSet, firstRow, maxRows);
             dataSet = MetaModelHelper.getSelection(selectItems, dataSet);
@@ -643,19 +646,19 @@ public abstract class QueryPostprocessDataContext extends AbstractDataContext im
     /**
      * Executes a simple one-table query against a table in the main schema of
      * the subclasses of this class. This default implementation will delegate
-     * to {@link #materializeMainSchemaTable(Table, Column[], int, int)}.
-     * 
+     * to {@link #materializeMainSchemaTable(Table, List, int, int)}.
+     *
      * @param table
      * @param selectItems
      * @param firstRow
      * @param maxRows
      * @return
      */
-    protected DataSet materializeMainSchemaTable(Table table, List<SelectItem> selectItems, int firstRow, int maxRows) {
-        Column[] columns = new Column[selectItems.size()];
-        for (int i = 0; i < columns.length; i++) {
-            columns[i] = selectItems.get(i).getColumn();
-        }
+    protected DataSet materializeMainSchemaTableSelect(Table table, List<SelectItem> selectItems, int firstRow, int maxRows) {
+        List<Column> columns = selectItems.stream()
+                .map(si -> si.getColumn())
+                .collect(Collectors.toList());
+
         DataSet dataSet = materializeMainSchemaTable(table, columns, firstRow, maxRows);
 
         dataSet = MetaModelHelper.getSelection(selectItems, dataSet);
@@ -666,7 +669,7 @@ public abstract class QueryPostprocessDataContext extends AbstractDataContext im
     /**
      * Executes a simple one-table query against a table in the main schema of
      * the subclasses of this class. This default implementation will delegate
-     * to {@link #materializeMainSchemaTable(Table, Column[], int)} and apply a
+     * to {@link #materializeMainSchemaTable(Table, List, int)} and apply a
      * {@link FirstRowDataSet} if necessary.
      * 
      * @param table
@@ -675,7 +678,7 @@ public abstract class QueryPostprocessDataContext extends AbstractDataContext im
      * @param maxRows
      * @return
      */
-    protected DataSet materializeMainSchemaTable(Table table, Column[] columns, int firstRow, int maxRows) {
+    protected DataSet materializeMainSchemaTable(Table table, List<Column> columns, int firstRow, int maxRows) {
         final int rowsToMaterialize;
         if (firstRow == 1) {
             rowsToMaterialize = maxRows;
@@ -702,5 +705,5 @@ public abstract class QueryPostprocessDataContext extends AbstractDataContext im
      *            wanted.
      * @return a dataset with the raw table/column content.
      */
-    protected abstract DataSet materializeMainSchemaTable(Table table, Column[] columns, int maxRows);
+    protected abstract DataSet materializeMainSchemaTable(Table table, List<Column> columns, int maxRows);
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/main/java/org/apache/metamodel/convert/ConvertedDataSetInterceptor.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/convert/ConvertedDataSetInterceptor.java b/core/src/main/java/org/apache/metamodel/convert/ConvertedDataSetInterceptor.java
index 082d121..4ff00e8 100644
--- a/core/src/main/java/org/apache/metamodel/convert/ConvertedDataSetInterceptor.java
+++ b/core/src/main/java/org/apache/metamodel/convert/ConvertedDataSetInterceptor.java
@@ -19,6 +19,7 @@
 package org.apache.metamodel.convert;
 
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import org.apache.metamodel.data.DataSet;
@@ -67,10 +68,10 @@ public class ConvertedDataSetInterceptor implements DataSetInterceptor, HasReadT
 		}
 
 		boolean hasConverter = false;
-		SelectItem[] selectItems = dataSet.getSelectItems();
-		TypeConverter<?, ?>[] converterArray = new TypeConverter[selectItems.length];
-		for (int i = 0; i < selectItems.length; i++) {
-			SelectItem selectItem = selectItems[i];
+		List<SelectItem> selectItems = dataSet.getSelectItems();
+		TypeConverter<?, ?>[] converterArray = new TypeConverter[selectItems.size()];
+		for (int i = 0; i < selectItems.size(); i++) {
+			SelectItem selectItem = selectItems.get(i);
 			Column column = selectItem.getColumn();
 			if (column != null && selectItem.getAggregateFunction() == null) {
 				TypeConverter<?, ?> converter = converters.get(column);

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/main/java/org/apache/metamodel/convert/Converters.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/convert/Converters.java b/core/src/main/java/org/apache/metamodel/convert/Converters.java
index 1be0e13..142987e 100644
--- a/core/src/main/java/org/apache/metamodel/convert/Converters.java
+++ b/core/src/main/java/org/apache/metamodel/convert/Converters.java
@@ -18,10 +18,9 @@
  */
 package org.apache.metamodel.convert;
 
-import java.util.HashMap;
-import java.util.Map;
+import java.util.*;
 import java.util.Map.Entry;
-import java.util.Set;
+import java.util.stream.Collectors;
 
 import org.apache.metamodel.DataContext;
 import org.apache.metamodel.MetaModelHelper;
@@ -136,15 +135,19 @@ public final class Converters {
      *         used (eg. with the {@link #addTypeConverters(DataContext, Map)}
      *         method) to decorate the DataContext with type converters.
      */
-    public static Map<Column, TypeConverter<?, ?>> autoDetectConverters(DataContext dataContext, Column[] columns,
+    public static Map<Column, TypeConverter<?, ?>> autoDetectConverters(DataContext dataContext, final List<Column> columns,
             int sampleSize) {
-        columns = MetaModelHelper.getColumnsBySuperType(columns, SuperColumnType.LITERAL_TYPE);
         final Map<Column, TypeConverter<?, ?>> result = new HashMap<Column, TypeConverter<?, ?>>();
-        Table[] tables = MetaModelHelper.getTables(columns);
-        for (Table table : tables) {
-            Column[] tableColumns = MetaModelHelper.getTableColumns(table, columns);
-            autoDetectConvertersInternally(dataContext, table, tableColumns, sampleSize, result);
-        }
+        columns.stream()
+                .filter(col -> col.getType() != null)
+                .filter(col -> col.getType().getSuperType().equals(SuperColumnType.LITERAL_TYPE))
+                // group by table
+                .collect(Collectors.toMap(Column::getTable,Arrays::asList))
+                //and detect it
+                .forEach((tab, cols) ->{
+                    autoDetectConvertersInternally(dataContext,tab,cols,sampleSize,result);
+        });
+
         return result;
     }
 
@@ -172,14 +175,14 @@ public final class Converters {
     public static Map<Column, TypeConverter<?, ?>> autoDetectConverters(DataContext dataContext, Table table,
             int sampleSize) {
         final Map<Column, TypeConverter<?, ?>> result = new HashMap<Column, TypeConverter<?, ?>>();
-        Column[] columns = table.getColumnsOfSuperType(SuperColumnType.LITERAL_TYPE);
+        List<Column> columns = table.getColumnsOfSuperType(SuperColumnType.LITERAL_TYPE);
         autoDetectConvertersInternally(dataContext, table, columns, sampleSize, result);
         return result;
     }
 
-    private static void autoDetectConvertersInternally(DataContext dataContext, Table table, Column[] columns,
+    private static void autoDetectConvertersInternally(DataContext dataContext, Table table, List<Column> columns,
             int sampleSize, Map<Column, TypeConverter<?, ?>> result) {
-        if (columns == null || columns.length == 0) {
+        if (columns == null || columns.size() == 0) {
             return;
         }
 
@@ -188,7 +191,7 @@ public final class Converters {
             detectors.put(column, new ColumnTypeDetector());
         }
 
-        Query query = dataContext.query().from(table).select(columns).toQuery();
+        Query query = dataContext.query().from(table).select(columns.toArray(new Column[columns.size()])).toQuery();
         if (sampleSize > 0 && sampleSize != Integer.MAX_VALUE) {
             query.setMaxRows(sampleSize);
         }
@@ -306,7 +309,7 @@ public final class Converters {
      */
     protected static <RB extends RowBuilder<?>> RB convertRow(RB rowBuilder, Map<Column, TypeConverter<?, ?>> converters) {
         Table table = rowBuilder.getTable();
-        Column[] columns = table.getColumns();
+        List<Column> columns = table.getColumns();
         Row row = rowBuilder.toRow();
         for (Column column : columns) {
             @SuppressWarnings("unchecked")

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/main/java/org/apache/metamodel/create/AbstractTableCreationBuilder.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/create/AbstractTableCreationBuilder.java b/core/src/main/java/org/apache/metamodel/create/AbstractTableCreationBuilder.java
index 401be9f..1833120 100644
--- a/core/src/main/java/org/apache/metamodel/create/AbstractTableCreationBuilder.java
+++ b/core/src/main/java/org/apache/metamodel/create/AbstractTableCreationBuilder.java
@@ -29,6 +29,8 @@ import org.apache.metamodel.schema.TableType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.List;
+
 /**
  * Abstract {@link TableCreationBuilder} implementation, provided as convenience
  * for {@link TableCreatable} implementations. Handles all the building
@@ -72,7 +74,7 @@ public abstract class AbstractTableCreationBuilder<U extends UpdateCallback> imp
     @Override
     public TableCreationBuilder like(Table table) {
         logger.debug("like({})", table);
-        Column[] columns = table.getColumns();
+        List<Column> columns = table.getColumns();
         for (Column column : columns) {
             withColumn(column.getName()).like(column);
         }
@@ -101,12 +103,12 @@ public abstract class AbstractTableCreationBuilder<U extends UpdateCallback> imp
         sb.append("CREATE TABLE ");
         sb.append(_table.getQualifiedLabel());
         sb.append(" (");
-        Column[] columns = _table.getColumns();
-        for (int i = 0; i < columns.length; i++) {
+        List<Column> columns = _table.getColumns();
+        for (int i = 0; i < columns.size(); i++) {
             if (i != 0) {
                 sb.append(',');
             }
-            Column column = columns[i];
+            Column column = columns.get(i);
             sb.append(column.getName());
             ColumnType type = column.getType();
             if (type != null) {
@@ -125,15 +127,15 @@ public abstract class AbstractTableCreationBuilder<U extends UpdateCallback> imp
             }
         }
         boolean primaryKeyExists = false;
-        for(int i = 0 ; i < columns.length ; i++) {
-            if(columns[i].isPrimaryKey()) {
+        for(int i = 0 ; i < columns.size() ; i++) {
+            if(columns.get(i).isPrimaryKey()) {
                 if(!primaryKeyExists) {
                     sb.append(", PRIMARY KEY(");
-                    sb.append(columns[i].getName());
+                    sb.append(columns.get(i).getName());
                     primaryKeyExists = true;
                 } else {
                     sb.append(",");
-                    sb.append(columns[i].getName());
+                    sb.append(columns.get(i).getName());
                 }
             }    
         }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/main/java/org/apache/metamodel/data/AbstractDataSet.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/data/AbstractDataSet.java b/core/src/main/java/org/apache/metamodel/data/AbstractDataSet.java
index f616ddc..6e64446 100644
--- a/core/src/main/java/org/apache/metamodel/data/AbstractDataSet.java
+++ b/core/src/main/java/org/apache/metamodel/data/AbstractDataSet.java
@@ -56,7 +56,7 @@ public abstract class AbstractDataSet extends BaseObject implements DataSet {
         if (dataSet instanceof AbstractDataSet) {
             _header = ((AbstractDataSet) dataSet).getHeader();
         } else {
-            _header = new CachingDataSetHeader(Arrays.asList(dataSet.getSelectItems()));
+            _header = new CachingDataSetHeader(dataSet.getSelectItems());
         }
     }
 
@@ -72,7 +72,7 @@ public abstract class AbstractDataSet extends BaseObject implements DataSet {
      * {@inheritDoc}
      */
     @Override
-    public SelectItem[] getSelectItems() {
+    public List<SelectItem> getSelectItems() {
         return getHeader().getSelectItems();
     }
 
@@ -118,7 +118,7 @@ public abstract class AbstractDataSet extends BaseObject implements DataSet {
      */
     @Override
     public String toString() {
-        return "DataSet[selectItems=" + Arrays.toString(getSelectItems()) + "]";
+        return "DataSet[selectItems=" + Arrays.toString(getSelectItems().toArray()) + "]";
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/main/java/org/apache/metamodel/data/AbstractRow.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/data/AbstractRow.java b/core/src/main/java/org/apache/metamodel/data/AbstractRow.java
index 9c931f1..f438a64 100644
--- a/core/src/main/java/org/apache/metamodel/data/AbstractRow.java
+++ b/core/src/main/java/org/apache/metamodel/data/AbstractRow.java
@@ -19,6 +19,7 @@
 package org.apache.metamodel.data;
 
 import java.util.Arrays;
+import java.util.List;
 
 import org.apache.metamodel.query.SelectItem;
 import org.apache.metamodel.schema.Column;
@@ -122,7 +123,7 @@ public abstract class AbstractRow implements Cloneable, Row {
     }
 
     @Override
-    public final SelectItem[] getSelectItems() {
+    public final List<SelectItem> getSelectItems() {
         return getHeader().getSelectItems();
     }
 

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/main/java/org/apache/metamodel/data/AbstractRowBuilder.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/data/AbstractRowBuilder.java b/core/src/main/java/org/apache/metamodel/data/AbstractRowBuilder.java
index fef04c9..144017c 100644
--- a/core/src/main/java/org/apache/metamodel/data/AbstractRowBuilder.java
+++ b/core/src/main/java/org/apache/metamodel/data/AbstractRowBuilder.java
@@ -19,7 +19,10 @@
 package org.apache.metamodel.data;
 
 import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
 
+import org.apache.metamodel.query.SelectItem;
 import org.apache.metamodel.schema.Column;
 import org.apache.metamodel.schema.Table;
 
@@ -37,8 +40,8 @@ public abstract class AbstractRowBuilder<RB extends RowBuilder<?>> implements Ro
         this(table.getColumns());
     }
 
-    public AbstractRowBuilder(Column[] columns) {
-        _columns = columns;
+    public AbstractRowBuilder(List<Column> columns) {
+        _columns = columns.toArray(new Column[columns.size()]);
         _explicitNulls = new boolean[_columns.length];
         _values = new Object[_columns.length];
         _styles = new Style[_columns.length];
@@ -68,7 +71,7 @@ public abstract class AbstractRowBuilder<RB extends RowBuilder<?>> implements Ro
 
     @Override
     public final Row toRow() {
-        return new DefaultRow(new SimpleDataSetHeader(_columns), _values);
+        return new DefaultRow(new SimpleDataSetHeader(Arrays.stream(_columns).map(SelectItem::new).collect(Collectors.toList())), _values);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/main/java/org/apache/metamodel/data/CachingDataSetHeader.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/data/CachingDataSetHeader.java b/core/src/main/java/org/apache/metamodel/data/CachingDataSetHeader.java
index 2c4b0c9..76ce891 100644
--- a/core/src/main/java/org/apache/metamodel/data/CachingDataSetHeader.java
+++ b/core/src/main/java/org/apache/metamodel/data/CachingDataSetHeader.java
@@ -46,9 +46,6 @@ public final class CachingDataSetHeader extends SimpleDataSetHeader implements D
         super(items);
     }
 
-    public CachingDataSetHeader(SelectItem[] items) {
-        this(Arrays.asList(items));
-    }
 
     @Override
     public int indexOf(Column column) {

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/main/java/org/apache/metamodel/data/DataSet.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/data/DataSet.java b/core/src/main/java/org/apache/metamodel/data/DataSet.java
index 993d408..fc277d0 100644
--- a/core/src/main/java/org/apache/metamodel/data/DataSet.java
+++ b/core/src/main/java/org/apache/metamodel/data/DataSet.java
@@ -35,7 +35,7 @@ public interface DataSet extends Closeable, Iterable<Row> {
     /**
      * @return the SelectItems that represent the columns of this DataSet
      */
-    public SelectItem[] getSelectItems();
+    public List<SelectItem> getSelectItems();
 
     /**
      * Finds the index of a given SelectItem

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/main/java/org/apache/metamodel/data/DataSetHeader.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/data/DataSetHeader.java b/core/src/main/java/org/apache/metamodel/data/DataSetHeader.java
index 79e8c6c..6113497 100644
--- a/core/src/main/java/org/apache/metamodel/data/DataSetHeader.java
+++ b/core/src/main/java/org/apache/metamodel/data/DataSetHeader.java
@@ -19,6 +19,7 @@
 package org.apache.metamodel.data;
 
 import java.io.Serializable;
+import java.util.List;
 
 import org.apache.metamodel.query.SelectItem;
 import org.apache.metamodel.schema.Column;
@@ -29,7 +30,7 @@ import org.apache.metamodel.schema.Column;
  */
 public interface DataSetHeader extends Serializable {
 
-    public SelectItem[] getSelectItems();
+    public List<SelectItem> getSelectItems();
 
     public int size();
 

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/main/java/org/apache/metamodel/data/DataSetTableModel.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/data/DataSetTableModel.java b/core/src/main/java/org/apache/metamodel/data/DataSetTableModel.java
index 7316c00..c67ff05 100644
--- a/core/src/main/java/org/apache/metamodel/data/DataSetTableModel.java
+++ b/core/src/main/java/org/apache/metamodel/data/DataSetTableModel.java
@@ -39,7 +39,7 @@ public class DataSetTableModel extends AbstractTableModel {
 	private boolean _materialized;
 	private final List<Row> _materializedRows = new ArrayList<Row>();
 	private final DataSet _dataSet;
-	private final SelectItem[] _selectItems;
+	private final List<SelectItem> _selectItems;
 
 	public DataSetTableModel(DataSet dataSet) {
 		_dataSet = dataSet;
@@ -49,7 +49,7 @@ public class DataSetTableModel extends AbstractTableModel {
 
 	@Override
 	public int hashCode() {
-		return Arrays.hashCode(_selectItems) + _materializedRows.hashCode();
+		return _selectItems.hashCode() + _materializedRows.hashCode();
 	}
 
 	@Override
@@ -71,7 +71,7 @@ public class DataSetTableModel extends AbstractTableModel {
 	}
 
 	public int getColumnCount() {
-		return _selectItems.length;
+		return _selectItems.size();
 	}
 
 	public int getRowCount() {
@@ -99,7 +99,7 @@ public class DataSetTableModel extends AbstractTableModel {
 
 	@Override
 	public String getColumnName(int column) {
-		return _selectItems[column].getSuperQueryAlias(false);
+		return _selectItems.get(column).getSuperQueryAlias(false);
 	}
 
 	@Override

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/main/java/org/apache/metamodel/data/EmptyDataSet.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/data/EmptyDataSet.java b/core/src/main/java/org/apache/metamodel/data/EmptyDataSet.java
index 0849255..fd71be3 100644
--- a/core/src/main/java/org/apache/metamodel/data/EmptyDataSet.java
+++ b/core/src/main/java/org/apache/metamodel/data/EmptyDataSet.java
@@ -32,14 +32,6 @@ public final class EmptyDataSet extends AbstractDataSet {
         super(header);
     }
 
-    public EmptyDataSet(SelectItem[] selectItems) {
-        super(new SimpleDataSetHeader(selectItems));
-    }
-
-    public EmptyDataSet(Column[] columns) {
-        super(new SimpleDataSetHeader(columns));
-    }
-
     public EmptyDataSet(List<SelectItem> selectItems) {
        this(new SimpleDataSetHeader(selectItems));
     }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/main/java/org/apache/metamodel/data/InMemoryDataSet.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/data/InMemoryDataSet.java b/core/src/main/java/org/apache/metamodel/data/InMemoryDataSet.java
index a6b2d7e..88bf5ad 100644
--- a/core/src/main/java/org/apache/metamodel/data/InMemoryDataSet.java
+++ b/core/src/main/java/org/apache/metamodel/data/InMemoryDataSet.java
@@ -55,7 +55,7 @@ public final class InMemoryDataSet extends AbstractDataSet {
                     + " for this");
         }
 
-        final SelectItem[] selectItems = rows.get(0).getSelectItems();
+        final List<SelectItem> selectItems = rows.get(0).getSelectItems();
 
         if (rows.size() > 3) {
             // not that many records - caching will not have body to scale

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/main/java/org/apache/metamodel/data/Row.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/data/Row.java b/core/src/main/java/org/apache/metamodel/data/Row.java
index 65fc273..9f6f634 100644
--- a/core/src/main/java/org/apache/metamodel/data/Row.java
+++ b/core/src/main/java/org/apache/metamodel/data/Row.java
@@ -19,6 +19,7 @@
 package org.apache.metamodel.data;
 
 import java.io.Serializable;
+import java.util.List;
 
 import org.apache.metamodel.query.SelectItem;
 import org.apache.metamodel.schema.Column;
@@ -96,7 +97,7 @@ public interface Row extends Serializable {
      * 
      * @return
      */
-    public SelectItem[] getSelectItems();
+    public List<SelectItem> getSelectItems();
 
     /**
      * Gets the values of the row, represented as an object array

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/main/java/org/apache/metamodel/data/ScalarFunctionDataSet.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/data/ScalarFunctionDataSet.java b/core/src/main/java/org/apache/metamodel/data/ScalarFunctionDataSet.java
index 64a7866..9d45946 100644
--- a/core/src/main/java/org/apache/metamodel/data/ScalarFunctionDataSet.java
+++ b/core/src/main/java/org/apache/metamodel/data/ScalarFunctionDataSet.java
@@ -36,7 +36,7 @@ public class ScalarFunctionDataSet extends AbstractDataSet implements WrappingDa
 
     public ScalarFunctionDataSet(List<SelectItem> scalarFunctionSelectItemsToEvaluate, DataSet dataSet) {
         super(CollectionUtils.concat(false, scalarFunctionSelectItemsToEvaluate,
-                Arrays.<SelectItem> asList(dataSet.getSelectItems())));
+                dataSet.getSelectItems()));
         _scalarFunctionSelectItemsToEvaluate = scalarFunctionSelectItemsToEvaluate;
         _dataSet = dataSet;
     }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/main/java/org/apache/metamodel/data/SimpleDataSetHeader.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/data/SimpleDataSetHeader.java b/core/src/main/java/org/apache/metamodel/data/SimpleDataSetHeader.java
index 8f8a8a8..afc6226 100644
--- a/core/src/main/java/org/apache/metamodel/data/SimpleDataSetHeader.java
+++ b/core/src/main/java/org/apache/metamodel/data/SimpleDataSetHeader.java
@@ -19,7 +19,9 @@
 package org.apache.metamodel.data;
 
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import org.apache.metamodel.MetaModelHelper;
 import org.apache.metamodel.query.SelectItem;
@@ -46,13 +48,10 @@ public class SimpleDataSetHeader implements DataSetHeader {
         this(Arrays.asList(selectItems));
     }
 
-    public SimpleDataSetHeader(Column[] columns) {
-        this(MetaModelHelper.createSelectItems(columns));
-    }
 
     @Override
-    public final SelectItem[] getSelectItems() {
-        return _items.toArray(new SelectItem[_items.size()]);
+    public final List<SelectItem> getSelectItems() {
+        return Collections.unmodifiableList(_items);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/main/java/org/apache/metamodel/data/UnionDataSet.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/data/UnionDataSet.java b/core/src/main/java/org/apache/metamodel/data/UnionDataSet.java
index 7962f56..f13124c 100644
--- a/core/src/main/java/org/apache/metamodel/data/UnionDataSet.java
+++ b/core/src/main/java/org/apache/metamodel/data/UnionDataSet.java
@@ -67,7 +67,7 @@ public class UnionDataSet extends AbstractDataSet implements WrappingDataSet {
                 return false;
             }
             _currentDataSet = _iterator.next().get();
-            assert getHeader().size() == _currentDataSet.getSelectItems().length;
+            assert getHeader().size() == _currentDataSet.getSelectItems().size();
         }
         return true;
     }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/main/java/org/apache/metamodel/insert/AbstractRowInsertionBuilder.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/insert/AbstractRowInsertionBuilder.java b/core/src/main/java/org/apache/metamodel/insert/AbstractRowInsertionBuilder.java
index bc09f98..58c0da8 100644
--- a/core/src/main/java/org/apache/metamodel/insert/AbstractRowInsertionBuilder.java
+++ b/core/src/main/java/org/apache/metamodel/insert/AbstractRowInsertionBuilder.java
@@ -25,6 +25,8 @@ import org.apache.metamodel.query.SelectItem;
 import org.apache.metamodel.schema.Column;
 import org.apache.metamodel.schema.Table;
 
+import java.util.List;
+
 /**
  * Abstract implementation of the {@link RowInsertionBuilder} interface,
  * provided as a convenience to {@link RowInsertable} implementations. Handles
@@ -53,9 +55,9 @@ public abstract class AbstractRowInsertionBuilder<U extends UpdateCallback> exte
 
     @Override
     public RowInsertionBuilder like(Row row) {
-        SelectItem[] selectItems = row.getSelectItems();
-        for (int i = 0; i < selectItems.length; i++) {
-            SelectItem selectItem = selectItems[i];
+        List<SelectItem> selectItems = row.getSelectItems();
+        for (int i = 0; i < selectItems.size(); i++) {
+            SelectItem selectItem = selectItems.get(i);
             Column column = selectItem.getColumn();
             if (column != null) {
                 if (_table == column.getTable()) {

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/main/java/org/apache/metamodel/intercept/InterceptableDataContext.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/intercept/InterceptableDataContext.java b/core/src/main/java/org/apache/metamodel/intercept/InterceptableDataContext.java
index f8c74cb..1811e78 100644
--- a/core/src/main/java/org/apache/metamodel/intercept/InterceptableDataContext.java
+++ b/core/src/main/java/org/apache/metamodel/intercept/InterceptableDataContext.java
@@ -38,6 +38,10 @@ import org.apache.metamodel.schema.Table;
 import org.apache.metamodel.update.RowUpdationBuilder;
 import org.apache.metamodel.util.HasNameMapper;
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
 public class InterceptableDataContext implements UpdateableDataContext {
 
     private final DataContext _delegate;
@@ -189,27 +193,29 @@ public class InterceptableDataContext implements UpdateableDataContext {
     }
 
     @Override
-    public Schema[] getSchemas() throws MetaModelException {
-        Schema[] schemas = _delegate.getSchemas();
+    public List<Schema> getSchemas() throws MetaModelException {
+        List<Schema> schemas = _delegate.getSchemas();
+        List<Schema> result = new ArrayList<>(schemas.size());
         if (!_schemaInterceptors.isEmpty()) {
-            for (int i = 0; i < schemas.length; i++) {
-                schemas[i] = _schemaInterceptors.interceptAll(schemas[i]);
+            for (int i = 0; i < schemas.size(); i++) {
+                schemas.set(i, _schemaInterceptors.interceptAll(schemas.get(i)));
             }
+        }else {
+            result = schemas;
         }
-        return schemas;
+        return result;
+
     }
 
     @Override
-    public String[] getSchemaNames() throws MetaModelException {
+    public List<String> getSchemaNames() throws MetaModelException {
         if (_schemaInterceptors.isEmpty()) {
             return _delegate.getSchemaNames();
         }
-        Schema[] schemas = getSchemas();
-        String[] schemaNames = new String[schemas.length];
-        for (int i = 0; i < schemaNames.length; i++) {
-            schemaNames[i] = new HasNameMapper().apply(schemas[i]);
-        }
-        return schemaNames;
+
+        return getSchemas().stream()
+                .map(schema -> schema.getName())
+                .collect(Collectors.toList());
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/main/java/org/apache/metamodel/query/FromItem.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/query/FromItem.java b/core/src/main/java/org/apache/metamodel/query/FromItem.java
index 392c0bf..63eac69 100644
--- a/core/src/main/java/org/apache/metamodel/query/FromItem.java
+++ b/core/src/main/java/org/apache/metamodel/query/FromItem.java
@@ -88,16 +88,16 @@ public class FromItem extends BaseObject implements QueryItem, Cloneable {
     public FromItem(JoinType join, Relationship relationship) {
         _join = join;
         _leftSide = new FromItem(relationship.getPrimaryTable());
-        Column[] columns = relationship.getPrimaryColumns();
-        _leftOn = new SelectItem[columns.length];
-        for (int i = 0; i < columns.length; i++) {
-            _leftOn[i] = new SelectItem(columns[i]);
+        List<Column> columns = relationship.getPrimaryColumns();
+        _leftOn = new SelectItem[columns.size()];
+        for (int i = 0; i < columns.size(); i++) {
+            _leftOn[i] = new SelectItem(columns.get(i));
         }
         _rightSide = new FromItem(relationship.getForeignTable());
         columns = relationship.getForeignColumns();
-        _rightOn = new SelectItem[columns.length];
-        for (int i = 0; i < columns.length; i++) {
-            _rightOn[i] = new SelectItem(columns[i]);
+        _rightOn = new SelectItem[columns.size()];
+        for (int i = 0; i < columns.size(); i++) {
+            _rightOn[i] = new SelectItem(columns.get(i));
         }
     }
 

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/main/java/org/apache/metamodel/query/Query.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/query/Query.java b/core/src/main/java/org/apache/metamodel/query/Query.java
index 7dc9278..e29b7dd 100644
--- a/core/src/main/java/org/apache/metamodel/query/Query.java
+++ b/core/src/main/java/org/apache/metamodel/query/Query.java
@@ -92,6 +92,10 @@ public final class Query extends BaseObject implements Cloneable, Serializable {
         return select(selectItem);
     }
 
+    public Query select(List<Column> columns){
+        return select(columns.toArray(new Column[columns.size()]));
+    }
+
     public Query select(Column... columns) {
         for (Column column : columns) {
             SelectItem selectItem = new SelectItem(column);
@@ -164,7 +168,7 @@ public final class Query extends BaseObject implements Cloneable, Serializable {
 
     public Query selectAll(final FromItem fromItem) {
         if (fromItem.getTable() != null) {
-            final Column[] columns = fromItem.getTable().getColumns();
+            final List<Column> columns = fromItem.getTable().getColumns();
             for (final Column column : columns) {
                 select(column, fromItem);
             }
@@ -242,6 +246,14 @@ public final class Query extends BaseObject implements Cloneable, Serializable {
         return this;
     }
 
+    public Query groupBy(List<Column> columns) {
+        for (Column column : columns) {
+            SelectItem selectItem = new SelectItem(column).setQuery(this);
+            _groupByClause.addItem(new GroupByItem(selectItem));
+        }
+        return this;
+    }
+
     public Query orderBy(OrderByItem... items) {
         _orderByClause.addItems(items);
         return this;

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/main/java/org/apache/metamodel/query/builder/GroupedQueryBuilderImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/query/builder/GroupedQueryBuilderImpl.java b/core/src/main/java/org/apache/metamodel/query/builder/GroupedQueryBuilderImpl.java
index d73ae8f..904b657 100644
--- a/core/src/main/java/org/apache/metamodel/query/builder/GroupedQueryBuilderImpl.java
+++ b/core/src/main/java/org/apache/metamodel/query/builder/GroupedQueryBuilderImpl.java
@@ -198,7 +198,7 @@ final class GroupedQueryBuilderImpl extends BaseObject implements GroupedQueryBu
                 final Table table = fromItem.getTable();
                 if (table != null) {
                     logger.debug("Table available in FROM item: {}. Column names: {}", table, Arrays.toString(table
-                            .getColumnNames()));
+                            .getColumnNames().toArray()));
                 }
             }
         }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/main/java/org/apache/metamodel/query/builder/InitFromBuilderImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/query/builder/InitFromBuilderImpl.java b/core/src/main/java/org/apache/metamodel/query/builder/InitFromBuilderImpl.java
index 2585bea..9248db6 100644
--- a/core/src/main/java/org/apache/metamodel/query/builder/InitFromBuilderImpl.java
+++ b/core/src/main/java/org/apache/metamodel/query/builder/InitFromBuilderImpl.java
@@ -65,7 +65,7 @@ public final class InitFromBuilderImpl extends BaseObject implements InitFromBui
         Table table = schema.getTableByName(tableName);
         if (table == null) {
             throw new IllegalArgumentException("Nu such table '" + tableName + "' found in schema: " + schema
-                    + ". Available tables are: " + Arrays.toString(schema.getTableNames()));
+                    + ". Available tables are: " + Arrays.toString(schema.getTableNames().toArray()));
         }
         return from(table);
     }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/main/java/org/apache/metamodel/query/builder/SatisfiedFromBuilder.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/query/builder/SatisfiedFromBuilder.java b/core/src/main/java/org/apache/metamodel/query/builder/SatisfiedFromBuilder.java
index f1a706c..8984dca 100644
--- a/core/src/main/java/org/apache/metamodel/query/builder/SatisfiedFromBuilder.java
+++ b/core/src/main/java/org/apache/metamodel/query/builder/SatisfiedFromBuilder.java
@@ -22,6 +22,8 @@ import org.apache.metamodel.query.FunctionType;
 import org.apache.metamodel.schema.Column;
 import org.apache.metamodel.schema.Table;
 
+import java.util.List;
+
 /**
  * Represents a builder where the FROM part is satisfied, ie. a SELECT clause is
  * now buildable.
@@ -47,7 +49,9 @@ public interface SatisfiedFromBuilder {
     public CountSelectBuilder<?> selectCount();
 
     public SatisfiedSelectBuilder<?> select(Column... columns);
-    
+
+    public SatisfiedSelectBuilder<?> select(List<Column> columns);
+
     public SatisfiedSelectBuilder<?> selectAll();
 
     public SatisfiedSelectBuilder<?> select(String selectExpression);

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/main/java/org/apache/metamodel/query/builder/SatisfiedFromBuilderCallback.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/query/builder/SatisfiedFromBuilderCallback.java b/core/src/main/java/org/apache/metamodel/query/builder/SatisfiedFromBuilderCallback.java
index 74831e9..4fb54ef 100644
--- a/core/src/main/java/org/apache/metamodel/query/builder/SatisfiedFromBuilderCallback.java
+++ b/core/src/main/java/org/apache/metamodel/query/builder/SatisfiedFromBuilderCallback.java
@@ -150,6 +150,11 @@ abstract class SatisfiedFromBuilderCallback extends BaseObject implements Satisf
     }
 
     @Override
+    public SatisfiedSelectBuilder<?> select(List<Column> columns) {
+        return select(columns.toArray(new Column[columns.size()]));
+    }
+
+    @Override
     public SatisfiedSelectBuilder<?> select(String... columnNames) {
         if (columnNames == null) {
             throw new IllegalArgumentException("columnNames cannot be null");

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/main/java/org/apache/metamodel/schema/AbstractRelationship.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/schema/AbstractRelationship.java b/core/src/main/java/org/apache/metamodel/schema/AbstractRelationship.java
index 88dd54e..cafa1c1 100644
--- a/core/src/main/java/org/apache/metamodel/schema/AbstractRelationship.java
+++ b/core/src/main/java/org/apache/metamodel/schema/AbstractRelationship.java
@@ -27,16 +27,16 @@ public abstract class AbstractRelationship extends BaseObject implements
     
     private static final long serialVersionUID = 1L;
 
-	protected static Table checkSameTable(Column[] columns) {
-		if (columns == null || columns.length == 0) {
+	protected static Table checkSameTable(List<Column> columns) {
+		if (columns == null || columns.size() == 0) {
 			throw new IllegalArgumentException(
 					"At least one key-column must exist on both "
 							+ "primary and foreign side for "
 							+ "a relation to exist.");
 		}
 		Table table = null;
-		for (int i = 0; i < columns.length; i++) {
-			Column column = columns[i];
+		for (int i = 0; i < columns.size(); i++) {
+			Column column = columns.get(i);
 			if (i == 0) {
 				table = column.getTable();
 			} else {
@@ -51,12 +51,12 @@ public abstract class AbstractRelationship extends BaseObject implements
 
 	@Override
 	public Table getForeignTable() {
-		return getForeignColumns()[0].getTable();
+		return getForeignColumns().get(0).getTable();
 	}
 
 	@Override
 	public Table getPrimaryTable() {
-		return getPrimaryColumns()[0].getTable();
+		return getPrimaryColumns().get(0).getTable();
 	}
 
 	@Override
@@ -64,23 +64,23 @@ public abstract class AbstractRelationship extends BaseObject implements
 		StringBuilder sb = new StringBuilder();
 		sb.append("Relationship[");
 		sb.append("primaryTable=" + getPrimaryTable().getName());
-		Column[] columns = getPrimaryColumns();
+		List<Column> columns = getPrimaryColumns();
 		sb.append(",primaryColumns=[");
-		for (int i = 0; i < columns.length; i++) {
+		for (int i = 0; i < columns.size(); i++) {
 			if (i != 0) {
 				sb.append(", ");
 			}
-			sb.append(columns[i].getName());
+			sb.append(columns.get(i).getName());
 		}
 		sb.append("]");
 		sb.append(",foreignTable=" + getForeignTable().getName());
 		columns = getForeignColumns();
 		sb.append(",foreignColumns=[");
-		for (int i = 0; i < columns.length; i++) {
+		for (int i = 0; i < columns.size(); i++) {
 			if (i != 0) {
 				sb.append(", ");
 			}
-			sb.append(columns[i].getName());
+			sb.append(columns.get(i).getName());
 		}
 		sb.append("]");
 		sb.append("]");
@@ -105,11 +105,11 @@ public abstract class AbstractRelationship extends BaseObject implements
 	@Override
 	public boolean containsColumnPair(Column pkColumn, Column fkColumn) {
 		if (pkColumn != null && fkColumn != null) {
-			Column[] primaryColumns = getPrimaryColumns();
-			Column[] foreignColumns = getForeignColumns();
-			for (int i = 0; i < primaryColumns.length; i++) {
-				if (pkColumn.equals(primaryColumns[i])
-						&& fkColumn.equals(foreignColumns[i])) {
+			List<Column> primaryColumns = getPrimaryColumns();
+			List<Column> foreignColumns = getForeignColumns();
+			for (int i = 0; i < primaryColumns.size(); i++) {
+				if (pkColumn.equals(primaryColumns.get(i))
+						&& fkColumn.equals(foreignColumns.get(i))) {
 					return true;
 				}
 			}

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/main/java/org/apache/metamodel/schema/AbstractSchema.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/schema/AbstractSchema.java b/core/src/main/java/org/apache/metamodel/schema/AbstractSchema.java
index e44737a..df4a033 100644
--- a/core/src/main/java/org/apache/metamodel/schema/AbstractSchema.java
+++ b/core/src/main/java/org/apache/metamodel/schema/AbstractSchema.java
@@ -18,10 +18,8 @@
  */
 package org.apache.metamodel.schema;
 
-import java.util.ArrayList;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
+import java.util.stream.Collectors;
 
 import org.apache.metamodel.util.CollectionUtils;
 import org.apache.metamodel.util.EqualsBuilder;
@@ -49,22 +47,15 @@ public abstract class AbstractSchema implements Schema {
     }
 
     @Override
-    public Relationship[] getRelationships() {
-        final Set<Relationship> result = new LinkedHashSet<Relationship>();
-        CollectionUtils.forEach(getTables(), table -> {
-            final Relationship[] relations = table.getRelationships();
-            for (int i = 0; i < relations.length; i++) {
-                final Relationship relation = relations[i];
-                result.add(relation);
-            }
-        });
-        return result.toArray(new Relationship[result.size()]);
+    public Collection<Relationship> getRelationships() {
+        return getTables().stream()
+                .flatMap(tab -> tab.getRelationships().stream())
+                .collect(Collectors.toCollection(LinkedHashSet::new));
     }
 
     @Override
     public Table getTable(int index) throws IndexOutOfBoundsException {
-        Table[] tables = getTables();
-        return tables[index];
+        return getTables().get(index);
     }
 
     @Override
@@ -74,24 +65,24 @@ public abstract class AbstractSchema implements Schema {
 
     @Override
     public final int getTableCount(TableType type) {
-        return getTables(type).length;
+        return getTables(type).size();
     }
 
     @Override
     public final int getRelationshipCount() {
-        return getRelationships().length;
+        return getRelationships().size();
     }
 
     @Override
     public final int getTableCount() {
-        return getTables().length;
+        return getTables().size();
     }
 
     @Override
-    public final Table[] getTables(final TableType type) {
-        return CollectionUtils.filter(getTables(), table -> {
-            return table.getType() == type;
-        }).toArray(new Table[0]);
+    public final List<Table> getTables(final TableType type) {
+        return  getTables().stream()
+                .filter(table -> table.getType().equals(type))
+                .collect(Collectors.toList());
     }
 
     @Override
@@ -131,9 +122,10 @@ public abstract class AbstractSchema implements Schema {
     }
 
     @Override
-    public final String[] getTableNames() {
-        Table[] tables = getTables();
-        return CollectionUtils.map(tables, new HasNameMapper()).toArray(new String[tables.length]);
+    public final List<String> getTableNames() {
+        return getTables().stream()
+                .map(table -> table.getName())
+                .collect(Collectors.toList());
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/main/java/org/apache/metamodel/schema/AbstractTable.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/schema/AbstractTable.java b/core/src/main/java/org/apache/metamodel/schema/AbstractTable.java
index 4f5ad7f..6e5b55f 100644
--- a/core/src/main/java/org/apache/metamodel/schema/AbstractTable.java
+++ b/core/src/main/java/org/apache/metamodel/schema/AbstractTable.java
@@ -18,16 +18,12 @@
  */
 package org.apache.metamodel.schema;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
 import java.util.function.Predicate;
+import java.util.stream.Collectors;
 
 import org.apache.metamodel.MetaModelHelper;
 import org.apache.metamodel.util.CollectionUtils;
-import org.apache.metamodel.util.HasNameMapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -42,13 +38,12 @@ public abstract class AbstractTable implements Table {
 
     @Override
     public final int getColumnCount() {
-        return getColumns().length;
+        return getColumns().size();
     }
 
     @Override
     public Column getColumn(int index) throws IndexOutOfBoundsException {
-        Column[] columns = getColumns();
-        return columns[index];
+        return getColumns().get(index);
     }
 
     @Override
@@ -93,112 +88,102 @@ public abstract class AbstractTable implements Table {
 
     @Override
     public final int getRelationshipCount() {
-        return getRelationships().length;
+        return getRelationships().size();
     }
 
     @Override
-    public final Column[] getNumberColumns() {
-        return CollectionUtils.filter(getColumns(), new Predicate<Column>() {
-            @Override
-            public boolean test(Column col) {
-                ColumnType type = col.getType();
-                return type != null && type.isNumber();
-            }
-        }).toArray(new Column[0]);
+    public final List<Column> getNumberColumns() {
+        return getColumnsOfSuperType(SuperColumnType.NUMBER_TYPE);
     }
 
     @Override
-    public final Column[] getLiteralColumns() {
-        return CollectionUtils.filter(getColumns(), new Predicate<Column>() {
-            @Override
-            public boolean test(Column col) {
-                ColumnType type = col.getType();
-                return type != null && type.isLiteral();
-            }
-        }).toArray(new Column[0]);
+    public final List<Column> getLiteralColumns() {
+        return getColumnsOfSuperType(SuperColumnType.LITERAL_TYPE);
     }
 
     @Override
-    public final Column[] getTimeBasedColumns() {
-        return CollectionUtils.filter(getColumns(), col -> {
-            final ColumnType type = col.getType();
-            return type != null && type.isTimeBased();
-        }).toArray(new Column[0]);
+    public final List<Column> getTimeBasedColumns() {
+        return getColumnsOfSuperType(SuperColumnType.TIME_TYPE);
     }
 
     @Override
-    public final Column[] getBooleanColumns() {
-        return CollectionUtils.filter(getColumns(), col -> {
-            final ColumnType type = col.getType();
-            return type != null && type.isBoolean();
-        }).toArray(new Column[0]);
+    public final List<Column> getBooleanColumns() {
+        return getColumnsOfSuperType(SuperColumnType.BOOLEAN_TYPE);
     }
 
     @Override
-    public final Column[] getIndexedColumns() {
-        return CollectionUtils.filter(getColumns(), Column::isIndexed).toArray(new Column[0]);
+    public final List<Column> getIndexedColumns() {
+        return getColumns().stream()
+                .filter(Column::isIndexed)
+                .collect(Collectors.toList());
     }
 
     @Override
-    public final Relationship[] getForeignKeyRelationships() {
+    public final Collection<Relationship> getForeignKeyRelationships() {
         return CollectionUtils.filter(getRelationships(), rel -> {
             return AbstractTable.this.equals(rel.getForeignTable());
-        }).toArray(new Relationship[0]);
+        });
     }
 
     @Override
-    public final Relationship[] getPrimaryKeyRelationships() {
+    public final List<Relationship> getPrimaryKeyRelationships() {
         return CollectionUtils.filter(getRelationships(), rel -> {
             return AbstractTable.this.equals(rel.getPrimaryTable());
-        }).toArray(new Relationship[0]);
+        });
     }
 
     @Override
-    public final Column[] getForeignKeys() {
-        final Set<Column> columns = new HashSet<Column>();
-        final Relationship[] relationships = getForeignKeyRelationships();
+    public final List<Column> getForeignKeys() {
+        final Set<Column> columns = new LinkedHashSet<>();
+        final Collection<Relationship> relationships = getForeignKeyRelationships();
         CollectionUtils.forEach(relationships, rel -> {
-            Column[] foreignColumns = rel.getForeignColumns();
+            List<Column> foreignColumns = rel.getForeignColumns();
             for (Column column : foreignColumns) {
                 columns.add(column);
             }
         });
-        return columns.toArray(new Column[columns.size()]);
+        return new ArrayList<>(columns);
     }
 
     @Override
-    public final Column[] getPrimaryKeys() {
+    public final List<Column> getPrimaryKeys() {
         final List<Column> primaryKeyColumns = new ArrayList<Column>();
-        final Column[] columnsInTable = getColumns();
+        final List<Column> columnsInTable = getColumns();
         for (Column column : columnsInTable) {
             if (column.isPrimaryKey()) {
                 primaryKeyColumns.add(column);
             }
         }
-        return primaryKeyColumns.toArray(new Column[primaryKeyColumns.size()]);
+        return primaryKeyColumns;
     }
 
     @Override
-    public final String[] getColumnNames() {
-        Column[] columns = getColumns();
-        return CollectionUtils.map(columns, new HasNameMapper()).toArray(new String[columns.length]);
+    public final List<String> getColumnNames() {
+        return getColumns().stream()
+                .map(col -> col.getName())
+                .collect(Collectors.toList());
     }
 
     @Override
-    public final Column[] getColumnsOfType(ColumnType columnType) {
-        Column[] columns = getColumns();
-        return MetaModelHelper.getColumnsByType(columns, columnType);
+    public final List<Column> getColumnsOfType(ColumnType columnType) {
+        return getColumns().stream()
+                .filter(col -> col.getType()!=null)
+                .filter((col -> col.getType().equals(columnType)))
+                .collect(Collectors.toList());
     }
 
+
+
     @Override
-    public final Column[] getColumnsOfSuperType(final SuperColumnType superColumnType) {
-        Column[] columns = getColumns();
-        return MetaModelHelper.getColumnsBySuperType(columns, superColumnType);
+    public final List<Column> getColumnsOfSuperType(final SuperColumnType superColumnType) {
+        return getColumns().stream() .filter(col -> col.getType()!=null)
+                .filter((col -> col.getType().getSuperType().equals(superColumnType)))
+                .collect(Collectors.toList());
     }
 
     @Override
-    public final Relationship[] getRelationships(final Table otherTable) {
-        Relationship[] relationships = getRelationships();
+    public final Collection<Relationship> getRelationships(final Table otherTable) {
+        Collection<Relationship> relationships = getRelationships();
 
         return CollectionUtils.filter(relationships, relation -> {
             if (relation.getForeignTable() == otherTable && relation.getPrimaryTable() == AbstractTable.this) {
@@ -207,7 +192,7 @@ public abstract class AbstractTable implements Table {
                 return true;
             }
             return false;
-        }).toArray(new Relationship[0]);
+        });
     }
 
     @Override
@@ -270,12 +255,12 @@ public abstract class AbstractTable implements Table {
             }
 
             try {
-                final String[] columnNames1 = getColumnNames();
-                final String[] columnNames2 = other.getColumnNames();
+                final List<String> columnNames1 = getColumnNames();
+                final List<String> columnNames2 = other.getColumnNames();
 
-                if (columnNames1 != null && columnNames1.length != 0) {
-                    if (columnNames2 != null && columnNames2.length != 0) {
-                        if (!Arrays.equals(columnNames1, columnNames2)) {
+                if (columnNames1 != null && columnNames1.size() != 0) {
+                    if (columnNames2 != null && columnNames2.size() != 0) {
+                        if (!columnNames1.equals(columnNames2)) {
                             return false;
                         }
                     }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/ab5c9482/core/src/main/java/org/apache/metamodel/schema/CompositeSchema.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/schema/CompositeSchema.java b/core/src/main/java/org/apache/metamodel/schema/CompositeSchema.java
index 68cfecf..4e5a569 100644
--- a/core/src/main/java/org/apache/metamodel/schema/CompositeSchema.java
+++ b/core/src/main/java/org/apache/metamodel/schema/CompositeSchema.java
@@ -20,7 +20,9 @@ package org.apache.metamodel.schema;
 
 import java.util.Collection;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 import org.apache.metamodel.DataContext;
 import org.apache.metamodel.util.CollectionUtils;
@@ -60,21 +62,17 @@ public class CompositeSchema extends AbstractSchema {
     }
 
     @Override
-    public Relationship[] getRelationships() {
-        Relationship[] result = new Relationship[0];
-        for (Schema delegate : delegates) {
-            result = CollectionUtils.array(result, delegate.getRelationships());
-        }
-        return result;
+    public List<Relationship> getRelationships() {
+        return delegates.stream()
+                .flatMap(delegate -> delegate.getRelationships().stream())
+                .collect(Collectors.toList());
     }
 
     @Override
-    public Table[] getTables() {
-        Table[] result = new Table[0];
-        for (Schema delegate : delegates) {
-            result = CollectionUtils.array(result, delegate.getTables());
-        }
-        return result;
+    public List<Table> getTables() {
+        return delegates.stream()
+                .flatMap(delegate -> delegate.getTables().stream())
+                .collect(Collectors.toList());
     }
 
     @Override


[19/20] metamodel git commit: merged master

Posted by ka...@apache.org.
merged master


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

Branch: refs/heads/master
Commit: c4acebd5d3911bc208c3fd919a8cf7894b371c00
Parents: a07b8fe 2fe6a2b
Author: Jörg Unbehauen <jo...@unbehauen.net>
Authored: Fri Aug 4 15:31:21 2017 +0200
Committer: Jörg Unbehauen <jo...@unbehauen.net>
Committed: Fri Aug 4 15:31:21 2017 +0200

----------------------------------------------------------------------
 CHANGES.md                                      |   2 +
 README.md                                       |  78 +++++------
 .../org/apache/metamodel/MetaModelHelper.java   | 138 +++++++++++--------
 .../factory/DataContextPropertiesImpl.java      |   3 +
 .../apache/metamodel/MetaModelHelperTest.java   |  83 +++++++++--
 jdbc/pom.xml                                    |   4 +
 .../metamodel/jdbc/JdbcMetadataLoader.java      |  92 ++++++++++---
 .../jdbc/dialects/DefaultQueryRewriter.java     |  24 ++--
 .../jdbc/dialects/HsqldbQueryRewriter.java      |  13 ++
 .../apache/metamodel/jdbc/H2databaseTest.java   | 104 +++++++++-----
 .../org/apache/metamodel/jdbc/HsqldbTest.java   | 112 +++++++++++----
 .../metamodel/jdbc/MultiJDBCDataSetTest.java    | 132 ++++++++++++++++++
 .../apache/metamodel/pojo/PojoDataContext.java  |   4 +-
 .../metamodel/pojo/PojoDataContextFactory.java  |  71 ++++++++++
 ....apache.metamodel.factory.DataContextFactory |   1 +
 pom.xml                                         |  84 ++++++++++-
 spring/pom.xml                                  |  12 --
 17 files changed, 732 insertions(+), 225 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/metamodel/blob/c4acebd5/core/src/main/java/org/apache/metamodel/MetaModelHelper.java
----------------------------------------------------------------------
diff --cc core/src/main/java/org/apache/metamodel/MetaModelHelper.java
index 4f0a8dd,a2681da..f23c98e
--- a/core/src/main/java/org/apache/metamodel/MetaModelHelper.java
+++ b/core/src/main/java/org/apache/metamodel/MetaModelHelper.java
@@@ -18,19 -18,10 +18,12 @@@
   */
  package org.apache.metamodel;
  
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.Collection;
- import java.util.Collections;
- import java.util.Comparator;
- import java.util.HashMap;
- import java.util.HashSet;
- import java.util.List;
- import java.util.Map;
+ import java.util.*;
  import java.util.Map.Entry;
  import java.util.stream.Collectors;
 +import java.util.stream.Stream;
 +
+ 
  import org.apache.metamodel.data.CachingDataSetHeader;
  import org.apache.metamodel.data.DataSet;
  import org.apache.metamodel.data.DataSetHeader;
@@@ -184,67 -180,86 +182,87 @@@ public final class MetaModelHelper 
          if (fromDataSets.length == 1) {
              return getFiltered(fromDataSets[0], whereItems);
          }
+         // do a nested loop join, no matter what
+         Iterator<DataSet> dsIter = Arrays.asList(fromDataSets).iterator();
  
-         List<SelectItem> selectItems = new ArrayList<SelectItem>();
-         for (DataSet dataSet : fromDataSets) {
-             for (int i = 0; i < dataSet.getSelectItems().size(); i++) {
-                 SelectItem item = dataSet.getSelectItems().get(i);
-                 selectItems.add(item);
-             }
-         }
 +
-         int selectItemOffset = 0;
-         List<Object[]> data = new ArrayList<Object[]>();
-         for (int fromDataSetIndex = 0; fromDataSetIndex < fromDataSets.length; fromDataSetIndex++) {
-             DataSet fromDataSet = fromDataSets[fromDataSetIndex];
-             List<SelectItem> fromSelectItems = fromDataSet.getSelectItems();
-             if (fromDataSetIndex == 0) {
-                 while (fromDataSet.next()) {
-                     Object[] values = fromDataSet.getRow().getValues();
-                     Object[] row = new Object[selectItems.size()];
-                     System.arraycopy(values, 0, row, selectItemOffset, values.length);
-                     data.add(row);
-                 }
-                 fromDataSet.close();
-             } else {
-                 List<Object[]> fromDataRows = new ArrayList<Object[]>();
-                 while (fromDataSet.next()) {
-                     fromDataRows.add(fromDataSet.getRow().getValues());
-                 }
-                 fromDataSet.close();
-                 for (int i = 0; i < data.size(); i = i + fromDataRows.size()) {
-                     Object[] originalRow = data.get(i);
-                     data.remove(i);
-                     for (int j = 0; j < fromDataRows.size(); j++) {
-                         Object[] newRow = fromDataRows.get(j);
-                         System.arraycopy(newRow, 0, originalRow, selectItemOffset, newRow.length);
-                         data.add(i + j, originalRow.clone());
-                     }
-                 }
-             }
-             selectItemOffset += fromSelectItems.size();
-         }
+         DataSet joined = dsIter.next();
+ 
+         while (dsIter.hasNext()) {
+             joined = nestedLoopJoin(dsIter.next(), joined, (whereItems));
  
-         if (data.isEmpty()) {
-             return new EmptyDataSet(selectItems);
          }
  
-         final DataSetHeader header = new CachingDataSetHeader(selectItems);
-         final List<Row> rows = new ArrayList<Row>(data.size());
-         for (Object[] objects : data) {
-             rows.add(new DefaultRow(header, objects, null));
+         return joined;
+ 
+     }
+ 
+     /**
+      * Executes a simple nested loop join. The innerLoopDs will be copied in an
+      * in-memory dataset.
+      *
+      */
+     public static InMemoryDataSet nestedLoopJoin(DataSet innerLoopDs, DataSet outerLoopDs,
+             Iterable<FilterItem> filtersIterable) {
+ 
+         List<FilterItem> filters = new ArrayList<>();
+         for (FilterItem fi : filtersIterable) {
+             filters.add(fi);
          }
+         List<Row> innerRows = innerLoopDs.toRows();
+ 
 -        List<SelectItem> allItems = new ArrayList<>(Arrays.asList(outerLoopDs.getSelectItems()));
 -        allItems.addAll(Arrays.asList(innerLoopDs.getSelectItems()));
++        List<SelectItem> allItems = new ArrayList<>(outerLoopDs.getSelectItems());
++        allItems.addAll(innerLoopDs.getSelectItems());
  
-         DataSet result = new InMemoryDataSet(header, rows);
-         if (whereItems != null) {
-             DataSet filteredResult = getFiltered(result, whereItems);
-             result = filteredResult;
+         Set<FilterItem> applicableFilters = applicableFilters(filters, allItems);
+ 
+         DataSetHeader jointHeader = new CachingDataSetHeader(allItems);
+ 
+         List<Row> resultRows = new ArrayList<>();
+         for (Row outerRow : outerLoopDs) {
+             for (Row innerRow : innerRows) {
+ 
+                 Object[] joinedRowObjects = new Object[outerRow.getValues().length + innerRow.getValues().length];
+ 
+                 System.arraycopy(outerRow.getValues(), 0, joinedRowObjects, 0, outerRow.getValues().length);
+                 System.arraycopy(innerRow.getValues(), 0, joinedRowObjects, outerRow.getValues().length, innerRow
+                         .getValues().length);
+ 
+                 Row joinedRow = new DefaultRow(jointHeader, joinedRowObjects);
+ 
+                 if (applicableFilters.isEmpty() || applicableFilters.stream().allMatch(fi -> fi.accept(joinedRow))) {
+                     resultRows.add(joinedRow);
+                 }
+             }
          }
-         return result;
+ 
+         return new InMemoryDataSet(jointHeader, resultRows);
      }
  
-     public static DataSet getCarthesianProduct(DataSet[] fromDataSets, FilterItem... filterItems) {
-         return getCarthesianProduct(fromDataSets, Arrays.asList(filterItems));
+     /**
+      * Filters the FilterItems such that only the FilterItems are returned,
+      * which contain SelectItems that are contained in selectItemList
+      * 
+      * @param filters
+      * @param selectItemList
+      * @return
+      */
+     private static Set<FilterItem> applicableFilters(Collection<FilterItem> filters,
+             Collection<SelectItem> selectItemList) {
+ 
+         Set<SelectItem> items = new HashSet<SelectItem>(selectItemList);
+ 
+         return filters.stream().filter(fi -> {
+             Collection<SelectItem> fiSelectItems = new ArrayList<>();
+             fiSelectItems.add(fi.getSelectItem());
+             Object operand = fi.getOperand();
+             if (operand instanceof SelectItem) {
+                 fiSelectItems.add((SelectItem) operand);
+             }
+ 
+             return items.containsAll(fiSelectItems);
+ 
+         }).collect(Collectors.toSet());
      }
  
      public static DataSet getFiltered(DataSet dataSet, Iterable<FilterItem> filterItems) {

http://git-wip-us.apache.org/repos/asf/metamodel/blob/c4acebd5/core/src/test/java/org/apache/metamodel/MetaModelHelperTest.java
----------------------------------------------------------------------
diff --cc core/src/test/java/org/apache/metamodel/MetaModelHelperTest.java
index 84a09b2,a84cef1..7196bf4
--- a/core/src/test/java/org/apache/metamodel/MetaModelHelperTest.java
+++ b/core/src/test/java/org/apache/metamodel/MetaModelHelperTest.java
@@@ -116,21 -115,19 +116,21 @@@ public class MetaModelHelperTest extend
  
      public void testSimpleCarthesianProduct() throws Exception {
          DataSet dataSet = MetaModelHelper.getCarthesianProduct(createDataSet1(), createDataSet2());
+         List<String> results = new ArrayList<String>();
  
++
+         while (dataSet.next()) {
+             results.add(dataSet.getRow().toString());
+         }
 -        assertEquals(2, dataSet.getSelectItems().length);
 +        assertEquals(2, dataSet.getSelectItems().size());
-         assertTrue(dataSet.next());
-         assertEquals("Row[values=[f, b]]", dataSet.getRow().toString());
-         assertTrue(dataSet.next());
-         assertEquals("Row[values=[f, a]]", dataSet.getRow().toString());
-         assertTrue(dataSet.next());
-         assertTrue(dataSet.next());
-         assertTrue(dataSet.next());
-         assertTrue(dataSet.next());
-         assertTrue(dataSet.next());
-         assertTrue(dataSet.next());
-         assertTrue(dataSet.next());
-         assertEquals("Row[values=[o, r]]", dataSet.getRow().toString());
-         assertFalse(dataSet.next());
+         assertEquals(9, results.size());
+         assertTrue(results.contains("Row[values=[f, b]]"));
+         assertTrue(results.contains("Row[values=[f, a]]"));
+         assertTrue(results.contains("Row[values=[f, r]]"));
+         assertTrue(results.contains("Row[values=[o, b]]"));
+         assertTrue(results.contains("Row[values=[o, a]]"));
+         assertTrue(results.contains("Row[values=[o, r]]"));
++
      }
  
      public void testTripleCarthesianProduct() throws Exception {
@@@ -188,8 -185,8 +188,10 @@@
          data1.add(new Object[] { "f" });
          data1.add(new Object[] { "o" });
          data1.add(new Object[] { "o" });
 -        DataSet dataSet1 = createDataSet(new SelectItem[] { new SelectItem(new MutableColumn("foo",
 -                ColumnType.VARCHAR)) }, data1);
++
 +        DataSet dataSet1 = createDataSet(
 +                Lists.newArrayList( new SelectItem(new MutableColumn("foo", ColumnType.VARCHAR)) ), data1);
++
          return dataSet1;
      }
  
@@@ -206,8 -203,8 +208,10 @@@
          List<Object[]> data3 = new ArrayList<Object[]>();
          data3.add(new Object[] { "w00p", true });
          data3.add(new Object[] { "yippie", false });
 -        DataSet dataSet3 = createDataSet(new SelectItem[] { new SelectItem("expression", "e"), new SelectItem("webish?",
 -                "w") }, data3);
++
 +        DataSet dataSet3 = createDataSet(Lists.newArrayList(new SelectItem("expression", "e"),
 +                new SelectItem("webish?", "w") ), data3);
++
          return dataSet3;
      }
  
@@@ -217,6 -214,41 +221,41 @@@
          return dataSet4;
      }
  
+     private int bigDataSetSize = 3000;
+ 
+     /**
+      * 
+      * @return a big dataset, mocking an employee table
+      */
+     private DataSet createDataSet5() {
+         List<Object[]> data5 = new ArrayList<Object[]>();
+ 
+         for (int i = 0; i < bigDataSetSize; i++) {
+             data5.add(new Object[] { i, "Person_" + i, bigDataSetSize - (i + 1) });
+         }
+ 
 -        DataSet dataSet5 = createDataSet(new SelectItem[] { new SelectItem(new MutableColumn("nr", ColumnType.BIGINT)),
++        DataSet dataSet5 = createDataSet(Lists.newArrayList( new SelectItem(new MutableColumn("nr", ColumnType.BIGINT)),
+                 new SelectItem(new MutableColumn("name", ColumnType.STRING)), new SelectItem(new MutableColumn("dnr",
 -                        ColumnType.BIGINT)) }, data5);
++                        ColumnType.BIGINT)) ), data5);
+         return dataSet5;
+     }
+ 
+     /**
+      * 
+      * @return a big dataset, mocking an department table
+      */
+     private DataSet createDataSet6() {
+         List<Object[]> data6 = new ArrayList<Object[]>();
+ 
+         for (int i = 0; i < bigDataSetSize; i++) {
+             data6.add(new Object[] { i, "Department_" + i });
+         }
+ 
 -        DataSet dataSet6 = createDataSet(new SelectItem[] { new SelectItem(new MutableColumn("nr", ColumnType.BIGINT)),
 -                new SelectItem(new MutableColumn("name", ColumnType.STRING)), }, data6);
++        DataSet dataSet6 = createDataSet(Lists.newArrayList(new SelectItem(new MutableColumn("nr", ColumnType.BIGINT)),
++                new SelectItem(new MutableColumn("name", ColumnType.STRING))), data6);
+         return dataSet6;
+     }
+ 
      public void testGetTables() throws Exception {
          MutableTable table1 = new MutableTable("table1");
          MutableTable table2 = new MutableTable("table2");
@@@ -325,4 -357,22 +364,22 @@@
          assertEquals("Row[values=[1, 2, null]]", joinedDs.getRow().toString());
          assertFalse(joinedDs.next());
      }
+ 
+     public void testCarthesianProductScalability() {
+ 
+         DataSet employees = createDataSet5();
+         DataSet departmens = createDataSet6();
+ 
 -        FilterItem fi = new FilterItem(employees.getSelectItems()[2], OperatorType.EQUALS_TO, departmens
 -                .getSelectItems()[0]);
++        FilterItem fi = new FilterItem(employees.getSelectItems().get(2), OperatorType.EQUALS_TO, departmens
++                .getSelectItems().get(0));
+ 
+         DataSet joined = MetaModelHelper.getCarthesianProduct(new DataSet[] { employees, departmens }, fi);
+         int count = 0;
+         while (joined.next()) {
+             count++;
+         }
+ 
+         assertTrue(count == bigDataSetSize);
+ 
+     }
  }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/c4acebd5/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcMetadataLoader.java
----------------------------------------------------------------------
diff --cc jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcMetadataLoader.java
index 49e242b,2c29405..ce64b87
--- a/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcMetadataLoader.java
+++ b/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcMetadataLoader.java
@@@ -452,9 -468,42 +467,42 @@@ final class JdbcMetadataLoader implemen
                  logger.error("pkColumn={}", pkColumn);
                  logger.error("fkColumn={}", fkColumn);
              } else {
-                 MutableRelationship.createRelationship(pkColumn, fkColumn);
+ 
+                 if (!relations.containsKey(pkTable)) {
+                     relations.put(pkTable, new HashMap<>());
+                 }
+ 
+                 // get or init the columns tuple
+                 ColumnsTuple ct = relations.get(pkTable).get(fkTable);
+                 if (Objects.isNull(ct)) {
+                     ct = new ColumnsTuple();
+                     relations.get(pkTable).put(fkTable, ct);
+                 }
+                 // we can now safely add the columns
+                 ct.getPkCols().add(pkColumn);
+                 ct.getFkCols().add(fkColumn);
              }
          }
+ 
+         relations.values().stream().flatMap(map -> map.values().stream()).forEach(ct -> MutableRelationship
 -                .createRelationship(ct.getPkCols().toArray(new Column[0]), ct.getFkCols().toArray(new Column[0])));
++                .createRelationship(ct.getPkCols(), ct.getFkCols()));
+     }
+ 
+     /**
+      * Represents the columns of a relationship while it is being built from a
+      * {@link ResultSet}.
+      */
+     private static class ColumnsTuple {
+         private final List<Column> pkCols = new ArrayList<>();
+         private final List<Column> fkCols = new ArrayList<>();
+ 
+         public List<Column> getFkCols() {
+             return fkCols;
+         }
+ 
+         public List<Column> getPkCols() {
+             return pkCols;
+         }
      }
  
  }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/c4acebd5/jdbc/src/test/java/org/apache/metamodel/jdbc/H2databaseTest.java
----------------------------------------------------------------------
diff --cc jdbc/src/test/java/org/apache/metamodel/jdbc/H2databaseTest.java
index e7b5386,d46bc31..18b02de
--- a/jdbc/src/test/java/org/apache/metamodel/jdbc/H2databaseTest.java
+++ b/jdbc/src/test/java/org/apache/metamodel/jdbc/H2databaseTest.java
@@@ -276,14 -281,17 +281,17 @@@ public class H2databaseTest extends Tes
  
              @Override
              public void run(UpdateCallback cb) {
-                 JdbcCreateTableBuilder createTableBuilder = (JdbcCreateTableBuilder) cb.createTable(schema, "test_table");
+                 JdbcCreateTableBuilder createTableBuilder = (JdbcCreateTableBuilder) cb.createTable(schema,
+                         "test_table");
                  Table writtenTable = createTableBuilder.withColumn("id").asPrimaryKey().ofType(ColumnType.INTEGER)
-                         .withColumn("name").ofSize(255).ofType(ColumnType.VARCHAR).withColumn("age").ofType(ColumnType.INTEGER)
-                         .execute();
+                         .withColumn("name").ofSize(255).ofType(ColumnType.VARCHAR).withColumn("age").ofType(
+                                 ColumnType.INTEGER).execute();
                  String sql = createTableBuilder.createSqlStatement();
-                 assertEquals("CREATE TABLE PUBLIC.test_table (id INTEGER, name VARCHAR(255), age INTEGER, PRIMARY KEY(id))", sql);
+                 assertEquals(
+                         "CREATE TABLE PUBLIC.test_table (id INTEGER, name VARCHAR(255), age INTEGER, PRIMARY KEY(id))",
+                         sql);
                  assertNotNull(writtenTable);
 -                assertEquals("[ID, NAME, AGE]", Arrays.toString(writtenTable.getColumnNames()));
 +                assertEquals("[ID, NAME, AGE]", Arrays.toString(writtenTable.getColumnNames().toArray()));
  
                  writtenTableRef.set(writtenTable);
              }
@@@ -521,4 -531,32 +531,32 @@@
      public void testInterpretationOfNull() throws Exception {
          JdbcTestTemplates.interpretationOfNulls(conn);
      }
+ 
+     public void testCompositeFkRelation() throws Exception {
+ 
+         try (Statement stmt = conn.createStatement()) {
+             stmt.execute(
+                     "CREATE TABLE PARENT (P1 INTEGER, P2 INTEGER, P3 INTEGER, P4 INTEGER, PRIMARY  KEY (P1,P2, P3, P4))");
+             stmt.execute(
+                     "CREATE TABLE CHILD (C1 INTEGER PRIMARY KEY, CP1 INTEGER , CP2 INTEGER, CP3 INTEGER, CP4 INTEGER, FOREIGN  KEY (CP1,CP2,CP3,CP4) REFERENCES  PARENT(P1,P2,P3,P4))");
+         }
+ 
+         final JdbcDataContext dc = new JdbcDataContext(conn);
+ 
+         final Schema schema = dc.getDefaultSchema();
+ 
 -        assertEquals(1, schema.getRelationships().length);
++        assertEquals(1, schema.getRelationships().size());
+ 
 -        Relationship rel = schema.getRelationships()[0];
++        Relationship rel = schema.getRelationships().iterator().next();
+ 
 -        assertEquals("CP1", rel.getForeignColumns()[0].getName());
 -        assertEquals("CP2", rel.getForeignColumns()[1].getName());
 -        assertEquals("CP3", rel.getForeignColumns()[2].getName());
 -        assertEquals("CP4", rel.getForeignColumns()[3].getName());
++        assertEquals("CP1", rel.getForeignColumns().get(0).getName());
++        assertEquals("CP2", rel.getForeignColumns().get(1).getName());
++        assertEquals("CP3", rel.getForeignColumns().get(2).getName());
++        assertEquals("CP4", rel.getForeignColumns().get(3).getName());
+ 
 -        assertEquals("P1", rel.getPrimaryColumns()[0].getName());
 -        assertEquals("P2", rel.getPrimaryColumns()[1].getName());
 -        assertEquals("P3", rel.getPrimaryColumns()[2].getName());
 -        assertEquals("P4", rel.getPrimaryColumns()[3].getName());
++        assertEquals("P1", rel.getPrimaryColumns().get(0).getName());
++        assertEquals("P2", rel.getPrimaryColumns().get(1).getName());
++        assertEquals("P3", rel.getPrimaryColumns().get(2).getName());
++        assertEquals("P4", rel.getPrimaryColumns().get(3).getName());
+     }
  }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/c4acebd5/jdbc/src/test/java/org/apache/metamodel/jdbc/HsqldbTest.java
----------------------------------------------------------------------
diff --cc jdbc/src/test/java/org/apache/metamodel/jdbc/HsqldbTest.java
index bf64fdd,d9f0587..3d9d268
--- a/jdbc/src/test/java/org/apache/metamodel/jdbc/HsqldbTest.java
+++ b/jdbc/src/test/java/org/apache/metamodel/jdbc/HsqldbTest.java
@@@ -146,8 -145,8 +145,9 @@@ public class HsqldbTest extends TestCas
          Table productsTable = schema.getTableByName("PRODUCTS");
          Table factTable = schema.getTableByName("ORDERFACT");
  
 -        Query q = new Query().from(new FromItem(JoinType.INNER, productsTable.getRelationships(factTable)[0]))
 -                .select(productsTable.getColumns()[0], factTable.getColumns()[0]);
 +        Query q = new Query().from(new FromItem(JoinType.INNER, productsTable.getRelationships(factTable).iterator().next())).select(
 +                productsTable.getColumns().get(0), factTable.getColumns().get(0));
++
          assertEquals(
                  "SELECT \"PRODUCTS\".\"PRODUCTCODE\", \"ORDERFACT\".\"ORDERNUMBER\" FROM PUBLIC.\"PRODUCTS\" INNER JOIN PUBLIC.\"ORDERFACT\" ON \"PRODUCTS\".\"PRODUCTCODE\" = \"ORDERFACT\".\"PRODUCTCODE\"",
                  q.toString());

http://git-wip-us.apache.org/repos/asf/metamodel/blob/c4acebd5/pojo/src/main/java/org/apache/metamodel/pojo/PojoDataContext.java
----------------------------------------------------------------------