You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@metamodel.apache.org by ka...@apache.org on 2013/08/23 10:46:13 UTC

[1/3] git commit: METAMODEL-4: Using folder name as schema name for CSV and Fixed Width file modules

Updated Branches:
  refs/heads/master c65307da9 -> 500610830


METAMODEL-4: Using folder name as schema name for CSV and Fixed Width
file modules

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

Branch: refs/heads/master
Commit: 3bbd56f21a471889fefb068d8461385e1ce5b061
Parents: c65307d
Author: Kasper Sørensen <i....@gmail.com>
Authored: Fri Aug 23 10:25:57 2013 +0200
Committer: Kasper Sørensen <i....@gmail.com>
Committed: Fri Aug 23 10:25:57 2013 +0200

----------------------------------------------------------------------
 .../metamodel/util/ClasspathResource.java       | 10 ++++-
 .../org/apache/metamodel/util/FileResource.java | 10 +++++
 .../apache/metamodel/util/InMemoryResource.java |  5 +++
 .../org/apache/metamodel/util/Resource.java     |  8 ++++
 .../org/apache/metamodel/util/UrlResource.java  |  5 +++
 .../metamodel/csv/CsvCreateTableBuilder.java    | 39 ++++++++---------
 .../apache/metamodel/csv/CsvDataContext.java    |  5 ++-
 .../java/org/apache/metamodel/csv/CsvTable.java | 20 ++++++---
 .../metamodel/csv/CsvDataContextTest.java       | 44 ++++++++++----------
 .../metamodel/csv/SingleLineCsvDataSetTest.java |  2 +-
 .../InterceptionCsvIntegrationTest.java         |  2 +-
 .../fixedwidth/FixedWidthDataContext.java       |  5 ++-
 .../fixedwidth/FixedWidthDataContextTest.java   | 22 +++++-----
 13 files changed, 109 insertions(+), 68 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/3bbd56f2/core/src/main/java/org/apache/metamodel/util/ClasspathResource.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/util/ClasspathResource.java b/core/src/main/java/org/apache/metamodel/util/ClasspathResource.java
index a205886..e9e1234 100644
--- a/core/src/main/java/org/apache/metamodel/util/ClasspathResource.java
+++ b/core/src/main/java/org/apache/metamodel/util/ClasspathResource.java
@@ -38,14 +38,15 @@ public class ClasspathResource implements Resource, Serializable {
         }
         _resourcePath = resourcePath;
     }
-    
+
     @Override
     public String toString() {
         return "ClasspathResource[" + _resourcePath + "]";
     }
-    
+
     /**
      * Gets the name of the classpath entry
+     *
      * @return
      */
     public String getResourcePath() {
@@ -67,6 +68,11 @@ public class ClasspathResource implements Resource, Serializable {
         return name;
     }
 
+    @Override
+    public String getQualifiedPath() {
+        return _resourcePath;
+    }
+
     protected ClassLoader getClassLoader() {
         return ClassLoader.getSystemClassLoader();
     }

http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/3bbd56f2/core/src/main/java/org/apache/metamodel/util/FileResource.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/util/FileResource.java b/core/src/main/java/org/apache/metamodel/util/FileResource.java
index 12fe80d..94b7293 100644
--- a/core/src/main/java/org/apache/metamodel/util/FileResource.java
+++ b/core/src/main/java/org/apache/metamodel/util/FileResource.java
@@ -19,6 +19,7 @@
 package org.apache.metamodel.util;
 
 import java.io.File;
+import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.Serializable;
@@ -50,6 +51,15 @@ public class FileResource implements Resource, Serializable {
     }
 
     @Override
+    public String getQualifiedPath() {
+        try {
+            return _file.getCanonicalPath();
+        } catch (IOException e) {
+            return _file.getAbsolutePath();
+        }
+    }
+
+    @Override
     public boolean isReadOnly() {
         if (!isExists()) {
             return false;

http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/3bbd56f2/core/src/main/java/org/apache/metamodel/util/InMemoryResource.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/util/InMemoryResource.java b/core/src/main/java/org/apache/metamodel/util/InMemoryResource.java
index 64bf531..3dafadf 100644
--- a/core/src/main/java/org/apache/metamodel/util/InMemoryResource.java
+++ b/core/src/main/java/org/apache/metamodel/util/InMemoryResource.java
@@ -78,6 +78,11 @@ public class InMemoryResource implements Resource, Serializable {
         return name;
     }
 
+    @Override
+    public String getQualifiedPath() {
+        return _path;
+    }
+
     /**
      * Gets the path of this resource
      * 

http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/3bbd56f2/core/src/main/java/org/apache/metamodel/util/Resource.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/util/Resource.java b/core/src/main/java/org/apache/metamodel/util/Resource.java
index 9b5ed53..f1a3dc3 100644
--- a/core/src/main/java/org/apache/metamodel/util/Resource.java
+++ b/core/src/main/java/org/apache/metamodel/util/Resource.java
@@ -34,6 +34,14 @@ public interface Resource extends HasName {
     public String getName();
 
     /**
+     * Gets the qualified path of the resource, which typically includes slash
+     * or backslash separated nodes in a hierarical tree structure.
+     *
+     * @return
+     */
+    public String getQualifiedPath();
+
+    /**
      * Determines if the file is read only, or if writes are also possible.
      * 
      * @return

http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/3bbd56f2/core/src/main/java/org/apache/metamodel/util/UrlResource.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/util/UrlResource.java b/core/src/main/java/org/apache/metamodel/util/UrlResource.java
index 7030854..b0702aa 100644
--- a/core/src/main/java/org/apache/metamodel/util/UrlResource.java
+++ b/core/src/main/java/org/apache/metamodel/util/UrlResource.java
@@ -84,6 +84,11 @@ public class UrlResource implements Resource, Serializable {
     }
 
     @Override
+    public String getQualifiedPath() {
+        return _uri.toString();
+    }
+
+    @Override
     public boolean isReadOnly() {
         return true;
     }

http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/3bbd56f2/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 513b8e8..c8eb569 100644
--- a/csv/src/main/java/org/apache/metamodel/csv/CsvCreateTableBuilder.java
+++ b/csv/src/main/java/org/apache/metamodel/csv/CsvCreateTableBuilder.java
@@ -23,29 +23,26 @@ import org.apache.metamodel.schema.MutableTable;
 import org.apache.metamodel.schema.Schema;
 import org.apache.metamodel.schema.Table;
 
-final class CsvCreateTableBuilder extends
-		AbstractTableCreationBuilder<CsvUpdateCallback> {
+final class CsvCreateTableBuilder extends AbstractTableCreationBuilder<CsvUpdateCallback> {
 
-	public CsvCreateTableBuilder(CsvUpdateCallback updateCallback,
-			Schema schema, String name) {
-		super(updateCallback, schema, name);
-		if (!(schema instanceof CsvSchema)) {
-			throw new IllegalArgumentException("Not a valid CSV schema: "
-					+ schema);
-		}
-	}
+    public CsvCreateTableBuilder(CsvUpdateCallback updateCallback, Schema schema, String name) {
+        super(updateCallback, schema, name);
+        if (!(schema instanceof CsvSchema)) {
+            throw new IllegalArgumentException("Not a valid CSV schema: " + schema);
+        }
+    }
 
-	@Override
-	public Table execute() {
-		CsvUpdateCallback csvUpdateCallback = getUpdateCallback();
+    @Override
+    public Table execute() {
+        CsvUpdateCallback csvUpdateCallback = getUpdateCallback();
 
-		MutableTable table = getTable();
-		String[] columnNames = table.getColumnNames();
-		csvUpdateCallback.writeRow(columnNames, false);
+        MutableTable table = getTable();
+        String[] columnNames = table.getColumnNames();
+        csvUpdateCallback.writeRow(columnNames, false);
 
-		CsvSchema schema = (CsvSchema) table.getSchema();
-		CsvTable csvTable = new CsvTable(schema, table.getColumnNames());
-		schema.setTable(csvTable);
-		return csvTable;
-	}
+        CsvSchema schema = (CsvSchema) table.getSchema();
+        CsvTable csvTable = new CsvTable(schema, table.getName(), table.getColumnNames());
+        schema.setTable(csvTable);
+        return csvTable;
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/3bbd56f2/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 5effa2c..c34c52b 100644
--- a/csv/src/main/java/org/apache/metamodel/csv/CsvDataContext.java
+++ b/csv/src/main/java/org/apache/metamodel/csv/CsvDataContext.java
@@ -43,6 +43,7 @@ import org.apache.metamodel.util.FileHelper;
 import org.apache.metamodel.util.FileResource;
 import org.apache.metamodel.util.Func;
 import org.apache.metamodel.util.Resource;
+import org.apache.metamodel.util.ResourceUtils;
 import org.apache.metamodel.util.UrlResource;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -386,14 +387,14 @@ public final class CsvDataContext extends QueryPostprocessDataContext implements
     protected CsvSchema getMainSchema() throws MetaModelException {
         CsvSchema schema = new CsvSchema(getMainSchemaName(), this);
         if (_resource.isExists()) {
-            schema.setTable(new CsvTable(schema));
+            schema.setTable(new CsvTable(schema, _resource.getName()));
         }
         return schema;
     }
 
     @Override
     protected String getMainSchemaName() {
-        return _resource.getName();
+        return ResourceUtils.getParentName(_resource);
     }
 
     protected boolean isWritable() {

http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/3bbd56f2/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 1603bc8..0fde506 100644
--- a/csv/src/main/java/org/apache/metamodel/csv/CsvTable.java
+++ b/csv/src/main/java/org/apache/metamodel/csv/CsvTable.java
@@ -37,6 +37,7 @@ final class CsvTable extends AbstractTable {
     private static final long serialVersionUID = 1L;
 
     private final CsvSchema _schema;
+    private final String _tableName;
     private Column[] _columns;
 
     /**
@@ -45,8 +46,8 @@ final class CsvTable extends AbstractTable {
      * @param schema
      * @param columnNames
      */
-    public CsvTable(CsvSchema schema, String[] columnNames) {
-        this(schema);
+    public CsvTable(CsvSchema schema, String tableName, String[] columnNames) {
+        this(schema, tableName);
         _columns = buildColumns(columnNames);
     }
 
@@ -55,14 +56,20 @@ final class CsvTable extends AbstractTable {
      * 
      * @param schema
      */
-    public CsvTable(CsvSchema schema) {
+    public CsvTable(CsvSchema schema, String tableName) {
         _schema = schema;
+        _tableName = tableName;
     }
 
     @Override
     public String getName() {
-        String schemaName = _schema.getName();
-        return schemaName.substring(0, schemaName.length() - 4);
+        if (_tableName == null) {
+            // can only occur when deserializing legacy objects. Using the
+            // legacy MetaModel code for creating table name here.
+            String schemaName = _schema.getName();
+            return schemaName.substring(0, schemaName.length() - 4);
+        }
+        return _tableName;
     }
 
     @Override
@@ -91,7 +98,8 @@ final class CsvTable extends AbstractTable {
             reader.close();
             return buildColumns(columnHeaders);
         } catch (IOException e) {
-            throw new IllegalStateException("Exception reading from resource: " + _schema.getDataContext().getResource().getName(), e);
+            throw new IllegalStateException("Exception reading from resource: "
+                    + _schema.getDataContext().getResource().getName(), e);
         } finally {
             FileHelper.safeClose(reader);
         }

http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/3bbd56f2/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 c94190c..e9b0f5b 100644
--- a/csv/src/test/java/org/apache/metamodel/csv/CsvDataContextTest.java
+++ b/csv/src/test/java/org/apache/metamodel/csv/CsvDataContextTest.java
@@ -61,7 +61,7 @@ public class CsvDataContextTest extends TestCase {
         assertEquals(1, dc.getDefaultSchema().getTableCount());
 
         Table table = dc.getDefaultSchema().getTables()[0];
-        assertEquals("empty_file", table.getName());
+        assertEquals("empty_file.csv", table.getName());
         assertEquals(0, table.getColumnCount());
     }
 
@@ -94,7 +94,7 @@ public class CsvDataContextTest extends TestCase {
         assertEquals(1, dc.getDefaultSchema().getTableCount());
 
         Table table = dc.getDefaultSchema().getTables()[0];
-        assertEquals("empty_file", table.getName());
+        assertEquals("empty_file.csv", table.getName());
         assertEquals(0, table.getColumnCount());
     }
 
@@ -103,7 +103,7 @@ public class CsvDataContextTest extends TestCase {
         assertEquals(1, dc.getDefaultSchema().getTableCount());
 
         Table table = dc.getDefaultSchema().getTables()[0];
-        assertEquals("csv_people", table.getName());
+        assertEquals("csv_people.csv", table.getName());
         assertEquals(0, table.getColumnCount());
     }
 
@@ -111,7 +111,7 @@ public class CsvDataContextTest extends TestCase {
         CsvConfiguration conf = new CsvConfiguration(CsvConfiguration.DEFAULT_COLUMN_NAME_LINE, "UTF8", ',', '"', '\\',
                 true);
         DataContext dc = new CsvDataContext(new File("src/test/resources/csv_inconsistent_columns.csv"), conf);
-        DataSet ds = dc.query().from("csv_inconsistent_columns").select("hello").and("world").execute();
+        DataSet ds = dc.query().from("csv_inconsistent_columns.csv").select("hello").and("world").execute();
         assertTrue(ds.next());
         assertTrue(ds.next());
 
@@ -185,7 +185,7 @@ public class CsvDataContextTest extends TestCase {
         }
 
         Schema schema = dc.getDefaultSchema();
-        String name = schema.getName();
+        String name = schema.getTable(0).getName();
         assertTrue(name.startsWith("metamodel"));
         assertTrue(name.endsWith("csv"));
 
@@ -199,7 +199,7 @@ public class CsvDataContextTest extends TestCase {
         File file = new File("src/test/resources/tickets.csv");
         DataContext dc = new CsvDataContext(file);
         Schema schema = dc.getDefaultSchema();
-        Table table = schema.getTableByName("tickets");
+        Table table = schema.getTableByName("tickets.csv");
         Column descColumn = table.getColumnByName("_description");
 
         assertNotNull(table);
@@ -233,10 +233,10 @@ public class CsvDataContextTest extends TestCase {
         Schema[] schemas = dc.getSchemas();
         assertEquals(2, schemas.length);
         Schema schema = dc.getDefaultSchema();
-        assertEquals("csv_people.csv", schema.getName());
+        assertEquals("resources", schema.getName());
         assertEquals(1, schema.getTableCount());
         Table table = schema.getTables()[0];
-        assertEquals("csv_people", table.getName());
+        assertEquals("csv_people.csv", table.getName());
 
         assertEquals(4, table.getColumnCount());
         assertEquals(0, table.getRelationshipCount());
@@ -265,10 +265,10 @@ public class CsvDataContextTest extends TestCase {
         Schema[] schemas = dc.getSchemas();
         assertEquals(2, schemas.length);
         Schema schema = dc.getDefaultSchema();
-        assertEquals("csv_people.csv", schema.getName());
+        assertEquals("resources", schema.getName());
         assertEquals(1, schema.getTableCount());
         Table table = schema.getTables()[0];
-        assertEquals("csv_people", table.getName());
+        assertEquals("csv_people.csv", table.getName());
 
         assertEquals(4, table.getColumnCount());
         assertEquals(0, table.getRelationshipCount());
@@ -296,10 +296,10 @@ public class CsvDataContextTest extends TestCase {
         Schema[] schemas = dc.getSchemas();
         assertEquals(2, schemas.length);
         Schema schema = dc.getDefaultSchema();
-        assertEquals("csv_people.csv", schema.getName());
+        assertEquals("resources", schema.getName());
         assertEquals(1, schema.getTableCount());
         Table table = schema.getTables()[0];
-        assertEquals("csv_people", table.getName());
+        assertEquals("csv_people.csv", table.getName());
 
         assertEquals(4, table.getColumnCount());
         assertEquals(0, table.getRelationshipCount());
@@ -314,7 +314,7 @@ public class CsvDataContextTest extends TestCase {
     public void testWhereItemNotInSelectClause() throws Exception {
         File file = new File("src/test/resources/csv_people.csv");
         QueryPostprocessDataContext dc = new CsvDataContext(file);
-        Table table = dc.getDefaultSchema().getTableByName("csv_people");
+        Table table = dc.getDefaultSchema().getTableByName("csv_people.csv");
 
         Query q = new Query();
         q.from(table);
@@ -329,10 +329,10 @@ public class CsvDataContextTest extends TestCase {
     public void testWhereColumnInValues() throws Exception {
         File file = new File("src/test/resources/csv_people.csv");
         QueryPostprocessDataContext dc = new CsvDataContext(file, new CsvConfiguration(1, true, true));
-        Table table = dc.getDefaultSchema().getTableByName("csv_people");
+        Table table = dc.getDefaultSchema().getTableByName("csv_people.csv");
 
         Query q = dc.query().from(table).as("t").select("name").and("age").where("age").in("18", "20").toQuery();
-        assertEquals("SELECT t.name, t.age FROM csv_people.csv.csv_people t WHERE t.age IN ('18' , '20')", q.toSql());
+        assertEquals("SELECT t.name, t.age FROM resources.csv_people.csv t WHERE t.age IN ('18' , '20')", q.toSql());
 
         DataSet ds = dc.executeQuery(q);
         assertTrue(ds.next());
@@ -352,7 +352,7 @@ public class CsvDataContextTest extends TestCase {
 
     public void testGroupByQuery() throws Exception {
         DataContext dc = new CsvDataContext(new File("src/test/resources/csv_people.csv"));
-        Table table = dc.getDefaultSchema().getTableByName("csv_people");
+        Table table = dc.getDefaultSchema().getTableByName("csv_people.csv");
 
         Query q = new Query();
         q.from(table);
@@ -363,7 +363,7 @@ public class CsvDataContextTest extends TestCase {
                         "total"), new SelectItem(FunctionType.MIN, table.getColumnByName("id")).setAlias("firstId"));
         DataSet data = dc.executeQuery(q);
         assertEquals(
-                "[csv_people.gender, MAX(csv_people.age), MIN(csv_people.age), COUNT(*) AS total, MIN(csv_people.id) AS firstId]",
+                "[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()));
 
         String[] expectations = new String[] { "Row[values=[female, 20, 17, 5, 5]]", "Row[values=[male, 19, 17, 4, 1]]" };
@@ -443,7 +443,7 @@ public class CsvDataContextTest extends TestCase {
         Table table = dc.getDefaultSchema().getTables()[0];
 
         Query q = new Query().selectCount().from(table);
-        assertEquals("SELECT COUNT(*) FROM csv_people.csv.csv_people", q.toString());
+        assertEquals("SELECT COUNT(*) FROM resources.csv_people.csv", q.toString());
 
         List<Object[]> data = dc.executeQuery(q).toObjectArrays();
         assertEquals(1, data.size());
@@ -452,7 +452,7 @@ public class CsvDataContextTest extends TestCase {
         assertEquals("[9]", Arrays.toString(row));
 
         q.select(table.getColumns()[0]);
-        assertEquals("SELECT COUNT(*), csv_people.id FROM csv_people.csv.csv_people", q.toString());
+        assertEquals("SELECT COUNT(*), csv_people.csv.id FROM resources.csv_people.csv", q.toString());
         data = dc.executeQuery(q).toObjectArrays();
         assertEquals(9, data.size());
         row = data.get(0);
@@ -511,11 +511,11 @@ public class CsvDataContextTest extends TestCase {
         dc.executeUpdate(new UpdateScript() {
             @Override
             public void run(UpdateCallback callback) {
-                callback.deleteFrom("csv_delete_all_records").execute();
+                callback.deleteFrom("csv_delete_all_records.txt").execute();
             }
         });
 
-        DataSet ds = dc.query().from("csv_delete_all_records").selectCount().execute();
+        DataSet ds = dc.query().from("csv_delete_all_records.txt").selectCount().execute();
         assertTrue(ds.next());
         assertEquals(0, ((Number) ds.getRow().getValue(0)).intValue());
         assertFalse(ds.next());
@@ -645,7 +645,7 @@ public class CsvDataContextTest extends TestCase {
         Table table = dc.getDefaultSchema().getTables()[0];
         MutableColumn col = (MutableColumn) table.getColumns()[0];
         Query q = dc.query().from(table).select(col).toQuery();
-        assertEquals("SELECT csv_only_number_one.number FROM csv_only_number_one.csv.csv_only_number_one", q.toSql());
+        assertEquals("SELECT csv_only_number_one.csv.number FROM resources.csv_only_number_one.csv", q.toSql());
 
         DataSet ds = dc.executeQuery(q);
         while (ds.next()) {

http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/3bbd56f2/csv/src/test/java/org/apache/metamodel/csv/SingleLineCsvDataSetTest.java
----------------------------------------------------------------------
diff --git a/csv/src/test/java/org/apache/metamodel/csv/SingleLineCsvDataSetTest.java b/csv/src/test/java/org/apache/metamodel/csv/SingleLineCsvDataSetTest.java
index f618906..e41db1b 100644
--- a/csv/src/test/java/org/apache/metamodel/csv/SingleLineCsvDataSetTest.java
+++ b/csv/src/test/java/org/apache/metamodel/csv/SingleLineCsvDataSetTest.java
@@ -30,7 +30,7 @@ public class SingleLineCsvDataSetTest extends TestCase {
         CsvConfiguration configuration = new CsvConfiguration(1, true, false);
         CsvDataContext dc = new CsvDataContext(new File("src/test/resources/csv_people.csv"), configuration);
 
-        DataSet dataSet = dc.query().from("csv_people").select("age", "name").execute();
+        DataSet dataSet = dc.query().from("csv_people.csv").select("age", "name").execute();
 
         assertTrue(dataSet.next());
         assertEquals("Row[values=[18, mike]]", dataSet.getRow().toString());

http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/3bbd56f2/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 5f516f3..7974beb 100644
--- a/csv/src/test/java/org/apache/metamodel/intercept/InterceptionCsvIntegrationTest.java
+++ b/csv/src/test/java/org/apache/metamodel/intercept/InterceptionCsvIntegrationTest.java
@@ -67,7 +67,7 @@ public class InterceptionCsvIntegrationTest extends TestCase {
 			}
 		});
 
-		assertEquals("[test_interception_scenario]",
+		assertEquals("[table]",
 				Arrays.toString(dc.getDefaultSchema().getTableNames()));
 		Table table = dc.getDefaultSchema().getTables()[0];
 		assertEquals("[col1, col2, foobar]",

http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/3bbd56f2/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 1c807fa..58ec92a 100644
--- a/fixedwidth/src/main/java/org/apache/metamodel/fixedwidth/FixedWidthDataContext.java
+++ b/fixedwidth/src/main/java/org/apache/metamodel/fixedwidth/FixedWidthDataContext.java
@@ -37,6 +37,7 @@ import org.apache.metamodel.util.AlphabeticSequence;
 import org.apache.metamodel.util.FileHelper;
 import org.apache.metamodel.util.FileResource;
 import org.apache.metamodel.util.Resource;
+import org.apache.metamodel.util.ResourceUtils;
 
 /**
  * DataContext implementation for fixed width value files.
@@ -115,7 +116,7 @@ public class FixedWidthDataContext extends QueryPostprocessDataContext {
     protected Schema getMainSchema() throws MetaModelException {
         final String schemaName = getDefaultSchemaName();
         final MutableSchema schema = new MutableSchema(schemaName);
-        final String tableName = schemaName.substring(0, schemaName.length() - 4);
+        final String tableName = _resource.getName();
         final MutableTable table = new MutableTable(tableName, TableType.TABLE, schema);
         schema.addTable(table);
 
@@ -154,7 +155,7 @@ public class FixedWidthDataContext extends QueryPostprocessDataContext {
 
     @Override
     protected String getMainSchemaName() throws MetaModelException {
-        return _resource.getName();
+        return ResourceUtils.getParentName(_resource);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/3bbd56f2/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 52af87f..2ac3680 100644
--- a/fixedwidth/src/test/java/org/apache/metamodel/fixedwidth/FixedWidthDataContextTest.java
+++ b/fixedwidth/src/test/java/org/apache/metamodel/fixedwidth/FixedWidthDataContextTest.java
@@ -40,7 +40,7 @@ public class FixedWidthDataContextTest extends TestCase {
         assertEquals(1, dc.getDefaultSchema().getTableCount());
 
         Table table = dc.getDefaultSchema().getTables()[0];
-        assertEquals("empty_file", table.getName());
+        assertEquals("empty_file.txt", table.getName());
         assertEquals(0, table.getColumnCount());
     }
 
@@ -50,7 +50,7 @@ public class FixedWidthDataContextTest extends TestCase {
         assertEquals(1, dc.getDefaultSchema().getTableCount());
 
         Table table = dc.getDefaultSchema().getTables()[0];
-        assertEquals("empty_file", table.getName());
+        assertEquals("empty_file.txt", table.getName());
         assertEquals(0, table.getColumnCount());
     }
 
@@ -60,7 +60,7 @@ public class FixedWidthDataContextTest extends TestCase {
         assertEquals(1, dc.getDefaultSchema().getTableCount());
 
         Table table = dc.getDefaultSchema().getTables()[0];
-        assertEquals("example_simple1", table.getName());
+        assertEquals("example_simple1.txt", table.getName());
         assertEquals(0, table.getColumnCount());
     }
 
@@ -70,15 +70,15 @@ public class FixedWidthDataContextTest extends TestCase {
 
         String[] schemaNames = dc.getSchemaNames();
         assertEquals(2, schemaNames.length);
-        assertEquals("[information_schema, example_simple1.txt]", Arrays.toString(schemaNames));
+        assertEquals("[information_schema, resources]", Arrays.toString(schemaNames));
 
         Schema schema = dc.getDefaultSchema();
-        assertEquals("Schema[name=example_simple1.txt]", schema.toString());
+        assertEquals("Schema[name=resources]", schema.toString());
 
         assertEquals(1, schema.getTableCount());
 
-        Table table = schema.getTableByName("example_simple1");
-        assertEquals("Table[name=example_simple1,type=TABLE,remarks=null]", table.toString());
+        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(10, table.getColumnByName("greeting").getColumnSize().intValue());
@@ -103,15 +103,15 @@ public class FixedWidthDataContextTest extends TestCase {
 
         String[] schemaNames = dc.getSchemaNames();
         assertEquals(2, schemaNames.length);
-        assertEquals("[information_schema, example_simple1.txt]", Arrays.toString(schemaNames));
+        assertEquals("[information_schema, resources]", Arrays.toString(schemaNames));
 
         Schema schema = dc.getDefaultSchema();
-        assertEquals("Schema[name=example_simple1.txt]", schema.toString());
+        assertEquals("Schema[name=resources]", schema.toString());
 
         assertEquals(1, schema.getTableCount());
 
-        Table table = schema.getTableByName("example_simple1");
-        assertEquals("Table[name=example_simple1,type=TABLE,remarks=null]", table.toString());
+        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()));
 


[2/3] git commit: METAMODEL-4: Added ResourceUtils for getting parent paths of resources.

Posted by ka...@apache.org.
METAMODEL-4: Added ResourceUtils for getting parent paths of resources.

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

Branch: refs/heads/master
Commit: bb54ab78a5df6a74299806513372520d0c2f8bd0
Parents: 3bbd56f
Author: Kasper Sørensen <i....@gmail.com>
Authored: Fri Aug 23 10:26:31 2013 +0200
Committer: Kasper Sørensen <i....@gmail.com>
Committed: Fri Aug 23 10:26:31 2013 +0200

----------------------------------------------------------------------
 .../apache/metamodel/util/ResourceUtils.java    | 61 ++++++++++++++++++++
 .../metamodel/util/ResourceUtilsTest.java       | 40 +++++++++++++
 2 files changed, 101 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/bb54ab78/core/src/main/java/org/apache/metamodel/util/ResourceUtils.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/util/ResourceUtils.java b/core/src/main/java/org/apache/metamodel/util/ResourceUtils.java
new file mode 100644
index 0000000..f39b2c8
--- /dev/null
+++ b/core/src/main/java/org/apache/metamodel/util/ResourceUtils.java
@@ -0,0 +1,61 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.metamodel.util;
+
+/**
+ * Static utility methods for handling {@link Resource}s.
+ */
+public class ResourceUtils {
+
+    /**
+     * Gets the parent name of a resource. For example, if the resource's
+     * qualified path is /foo/bar/baz, this method will return "bar".
+     *
+     * @param resource
+     * @return
+     */
+    public static String getParentName(Resource resource) {
+        String name = resource.getName();
+        String qualifiedPath = resource.getQualifiedPath();
+
+        assert qualifiedPath.endsWith(name);
+
+        int indexOfChild = qualifiedPath.length() - name.length() - 1;
+
+        if (indexOfChild <= 0) {
+            return name;
+        }
+
+        String parentQualifiedPath = qualifiedPath.substring(0, indexOfChild);
+
+        int lastIndexOfSlash = parentQualifiedPath.lastIndexOf('/');
+        int lastIndexOfBackSlash = parentQualifiedPath.lastIndexOf('\\');
+        int lastIndexToUse = Math.max(lastIndexOfSlash, lastIndexOfBackSlash);
+
+        if (lastIndexToUse == -1) {
+            return parentQualifiedPath;
+        }
+
+        // add one because of the slash/backslash itself
+        lastIndexToUse++;
+
+        String parentName = parentQualifiedPath.substring(lastIndexToUse);
+        return parentName;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/bb54ab78/core/src/test/java/org/apache/metamodel/util/ResourceUtilsTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/metamodel/util/ResourceUtilsTest.java b/core/src/test/java/org/apache/metamodel/util/ResourceUtilsTest.java
new file mode 100644
index 0000000..c3a24aa
--- /dev/null
+++ b/core/src/test/java/org/apache/metamodel/util/ResourceUtilsTest.java
@@ -0,0 +1,40 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.metamodel.util;
+
+import java.io.File;
+
+import junit.framework.TestCase;
+
+public class ResourceUtilsTest extends TestCase {
+
+    public void testGetParentName() throws Exception {
+        Resource res = new FileResource(new File("src/test/resources/folder/foo"));
+
+        assertEquals("folder", ResourceUtils.getParentName(res));
+
+        res = new FileResource(new File("src/test/resources/folder/"));
+
+        assertEquals("resources", ResourceUtils.getParentName(res));
+
+        assertEquals("", ResourceUtils.getParentName(new InMemoryResource("")));
+        assertEquals("foo", ResourceUtils.getParentName(new InMemoryResource("foo")));
+        assertEquals("bar", ResourceUtils.getParentName(new InMemoryResource("foo/bar\\baz")));
+    }
+}


[3/3] git commit: METAMODEL-4: Added capability to parse column and table paths with quoted elements in the path.

Posted by ka...@apache.org.
METAMODEL-4: Added capability to parse column and table paths with
quoted elements in the path.

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

Branch: refs/heads/master
Commit: 500610830cf70e667d1f0a7c0b492192ffd04a27
Parents: bb54ab7
Author: Kasper Sørensen <i....@gmail.com>
Authored: Fri Aug 23 10:45:51 2013 +0200
Committer: Kasper Sørensen <i....@gmail.com>
Committed: Fri Aug 23 10:45:51 2013 +0200

----------------------------------------------------------------------
 .../apache/metamodel/AbstractDataContext.java   |  98 +++++
 .../apache/metamodel/schema/MutableColumn.java  |   5 +
 .../apache/metamodel/schema/MutableTable.java   |   5 +
 .../metamodel/AbstractDataContextTest.java      | 410 ++++++++++---------
 4 files changed, 332 insertions(+), 186 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/50061083/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 77ab3c1..c3d53c4 100644
--- a/core/src/main/java/org/apache/metamodel/AbstractDataContext.java
+++ b/core/src/main/java/org/apache/metamodel/AbstractDataContext.java
@@ -18,8 +18,10 @@
  */
 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;
 
@@ -230,6 +232,21 @@ public abstract class AbstractDataContext implements DataContext {
         if (columnName == null) {
             return null;
         }
+
+        final String[] tokens = tokenizePath(columnName, 3);
+        if (tokens != null) {
+            final Schema schema = getSchemaByToken(tokens[0]);
+            if (schema != null) {
+                final Table table = schema.getTableByName(tokens[1]);
+                if (table != null) {
+                    final Column column = table.getColumnByName(tokens[2]);
+                    if (column != null) {
+                        return column;
+                    }
+                }
+            }
+        }
+
         Schema schema = null;
         final String[] schemaNames = getSchemaNames();
         for (final String schemaName : schemaNames) {
@@ -366,6 +383,18 @@ public abstract class AbstractDataContext implements DataContext {
         if (tableName == null) {
             return null;
         }
+
+        final String[] tokens = tokenizePath(tableName, 2);
+        if (tokens != null) {
+            Schema schema = getSchemaByToken(tokens[0]);
+            if (schema != null) {
+                Table table = schema.getTableByName(tokens[1]);
+                if (table != null) {
+                    return table;
+                }
+            }
+        }
+
         Schema schema = null;
         String[] schemaNames = getSchemaNames();
         for (String schemaName : schemaNames) {
@@ -413,6 +442,75 @@ public abstract class AbstractDataContext implements DataContext {
         return schema.getTableByName(tablePart);
     }
 
+    /**
+     * Tokenizes a path for a table or a column.
+     * 
+     * @param tableName
+     * @param expectedParts
+     * @return
+     */
+    private String[] tokenizePath(String path, int expectedParts) {
+        final List<String> tokens = new ArrayList<String>(expectedParts);
+
+        boolean inQuotes = false;
+        final StringBuilder currentToken = new StringBuilder();
+        for (int i = 0; i < path.length(); i++) {
+            char c = path.charAt(i);
+            if (c == '.' && !inQuotes) {
+                // token finished
+                tokens.add(currentToken.toString());
+                currentToken.setLength(0);
+
+                if (tokens.size() > expectedParts) {
+                    // unsuccesfull - return null
+                    return null;
+                }
+            } else if (c == '"') {
+                if (inQuotes) {
+                    if (i + 1 < path.length() && path.charAt(i + 1) != '.') {
+                        // unsuccesfull - return null
+                        return null;
+                    }
+                } else {
+                    if (currentToken.length() > 0) {
+                        // unsuccesfull - return null
+                        return null;
+                    }
+                }
+                inQuotes = !inQuotes;
+            } else {
+                currentToken.append(c);
+            }
+        }
+
+        if (currentToken.length() > 0) {
+            tokens.add(currentToken.toString());
+        }
+
+        if (tokens.size() == expectedParts - 1) {
+            // add a special-meaning "null" which will be interpreted as the
+            // default schema (since the schema wasn't specified).
+            tokens.add(0, null);
+        } else if (tokens.size() != expectedParts) {
+            return null;
+        }
+
+        return tokens.toArray(new String[tokens.size()]);
+    }
+
+    private Schema getSchemaByToken(String token) {
+        if (token == null) {
+            return getDefaultSchema();
+        }
+        try {
+            return getSchemaByName(token);
+        } catch (RuntimeException e) {
+            // swallow this exception - the attempt did not work and the null
+            // will be treated.
+            return null;
+        }
+    }
+
     private boolean isStartingToken(String partName, String fullName) {
         if (fullName.startsWith(partName)) {
             final int length = partName.length();

http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/50061083/core/src/main/java/org/apache/metamodel/schema/MutableColumn.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/schema/MutableColumn.java b/core/src/main/java/org/apache/metamodel/schema/MutableColumn.java
index 6308d50..050de15 100644
--- a/core/src/main/java/org/apache/metamodel/schema/MutableColumn.java
+++ b/core/src/main/java/org/apache/metamodel/schema/MutableColumn.java
@@ -73,6 +73,11 @@ public class MutableColumn extends AbstractColumn implements Serializable {
         setQuote(quote);
     }
 
+    public MutableColumn(String name, Table table) {
+        this(name);
+        setTable(table);
+    }
+
     @Override
     public int getColumnNumber() {
         return _columnNumber;

http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/50061083/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 39ad0b2..904fc81 100644
--- a/core/src/main/java/org/apache/metamodel/schema/MutableTable.java
+++ b/core/src/main/java/org/apache/metamodel/schema/MutableTable.java
@@ -68,6 +68,11 @@ public class MutableTable extends AbstractTable implements Serializable {
         setColumns(columns);
     }
 
+    public MutableTable(String name, Schema schema) {
+        this(name);
+        setSchema(schema);
+    }
+
     @Override
     public String getName() {
         return _name;

http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/50061083/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 8493a08..ea8a9de 100644
--- a/core/src/test/java/org/apache/metamodel/AbstractDataContextTest.java
+++ b/core/src/test/java/org/apache/metamodel/AbstractDataContextTest.java
@@ -19,6 +19,8 @@
 package org.apache.metamodel;
 
 import java.util.Arrays;
+import java.util.LinkedHashMap;
+import java.util.Map;
 
 import junit.framework.TestCase;
 import org.apache.metamodel.data.DataSet;
@@ -32,101 +34,130 @@ import org.apache.metamodel.schema.Table;
 
 public class AbstractDataContextTest extends TestCase {
 
-	private class MyDataContext extends AbstractDataContext {
-		@Override
-		public DataSet executeQuery(Query query) throws MetaModelException {
-			throw new UnsupportedOperationException();
-		}
-
-		@Override
-		protected String[] getSchemaNamesInternal() {
-			return new String[] { "barfoo", "foobar", "foo.bar" };
-		}
-
-		@Override
-		protected String getDefaultSchemaName() {
-			return "foobar";
-		}
-
-		@Override
-		protected Schema getSchemaByNameInternal(String name) {
-			if ("barfoo".equals(name) || "foobar".equals(name)
-					|| "foo.bar".equals(name)) {
-				return createSchema(name);
-			}
-			throw new IllegalStateException("No such schema: " + name);
-		}
-
-		private Schema createSchema(String name) {
-			MutableSchema schema = new MutableSchema(name);
-			MutableTable t1 = new MutableTable("table");
-			MutableColumn col1 = new MutableColumn("col1");
-			MutableColumn col2 = new MutableColumn("col2");
-			t1.addColumn(col1).addColumn(col2);
-			col1.setTable(t1);
-			col2.setTable(t1);
-			MutableTable t2 = new MutableTable("tab.le");
-			MutableColumn col3 = new MutableColumn("col3");
-			MutableColumn col4 = new MutableColumn("col4");
-			t2.addColumn(col3).addColumn(col4);
-			col3.setTable(t2);
-			col4.setTable(t2);
-			schema.addTable(t1).addTable(t2);
-			t1.setSchema(schema);
-			t2.setSchema(schema);
-			return schema;
-		}
-
-	}
-	
-
-	public void testGetColumnByQualifiedLabel() throws Exception {
-		MyDataContext dc = new MyDataContext();
-		Column result;
-
-		result = dc.getColumnByQualifiedLabel("foobar.tab.le.col1");
-		result = dc.getColumnByQualifiedLabel("blabla.tab.le.col4");
-		result = dc.getColumnByQualifiedLabel("FOOBAR.TABLE.COL3");
-		assertNull(result);
-
-		result = dc.getColumnByQualifiedLabel("foobar.table.col1");
-		assertEquals("col1", result.getName());
-		assertEquals("table", result.getTable().getName());
-		assertEquals("foobar", result.getTable().getSchema().getName());
-
-		result = dc.getColumnByQualifiedLabel("foo.bar.table.col1");
-		assertEquals("col1", result.getName());
-		assertEquals("table", result.getTable().getName());
-		assertEquals("foo.bar", result.getTable().getSchema().getName());
-
-		result = dc.getColumnByQualifiedLabel("foobar.tab.le.col3");
-		assertEquals("col3", result.getName());
-		assertEquals("tab.le", result.getTable().getName());
-		assertEquals("foobar", result.getTable().getSchema().getName());
-
-		result = dc.getColumnByQualifiedLabel("FOO.BAR.tab.le.col3");
-		assertEquals("col3", result.getName());
-		assertEquals("tab.le", result.getTable().getName());
-		assertEquals("foo.bar", result.getTable().getSchema().getName());
-
-		result = dc.getColumnByQualifiedLabel("tab.le.col3");
-		assertEquals("col3", result.getName());
-		assertEquals("tab.le", result.getTable().getName());
-		assertEquals("foobar", result.getTable().getSchema().getName());
-	}
-	
-	public void testGetTableByQualfiedLabelSchemaNameInTableName() throws Exception {
+    private class MyDataContext extends AbstractDataContext {
+
+        private final Map<String, Schema> _schemas;
+        private final String _defaultSchemaName;
+
+        public MyDataContext() {
+            this("foobar", createSchema("barfoo"), createSchema("foobar"), createSchema("foo.bar"));
+        }
+
+        public MyDataContext(String defaultSchemaName, Schema... schemas) {
+            _defaultSchemaName = defaultSchemaName;
+            _schemas = new LinkedHashMap<String, Schema>();
+            for (Schema schema : schemas) {
+                _schemas.put(schema.getName(), schema);
+            }
+        }
+
+        @Override
+        public DataSet executeQuery(Query query) throws MetaModelException {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        protected String[] getSchemaNamesInternal() {
+            return _schemas.keySet().toArray(new String[0]);
+        }
+
+        @Override
+        protected String getDefaultSchemaName() {
+            return _defaultSchemaName;
+        }
+
+        @Override
+        protected Schema getSchemaByNameInternal(String name) {
+            Schema schema = _schemas.get(name);
+            if (schema == null) {
+                throw new IllegalStateException("No such schema: " + name);
+            }
+            return schema;
+        }
+    }
+
+    public void testGetTableWithQuotesInLabel() throws Exception {
+        MutableSchema schema1 = new MutableSchema("foo");
+        schema1.addTable(new MutableTable("bar.baz", schema1));
+        MutableSchema schema2 = new MutableSchema("foo.bar");
+        schema2.addTable(new MutableTable("baz", schema2));
+
+        MyDataContext dc = new MyDataContext("foo", schema1, schema2);
+        assertEquals("baz", dc.getTableByQualifiedLabel("foo.bar.baz").getName());
+
+        assertEquals("baz", dc.getTableByQualifiedLabel("\"foo.bar\".baz").getName());
+        assertEquals("baz", dc.getTableByQualifiedLabel("\"foo.bar\".\"baz\"").getName());
+        assertEquals("bar.baz", dc.getTableByQualifiedLabel("foo.\"bar.baz\"").getName());
+        assertEquals("bar.baz", dc.getTableByQualifiedLabel("\"foo\".\"bar.baz\"").getName());
+    }
+
+    public void testGetColumnWithQuotesInLabel() throws Exception {
+        MutableSchema schema = new MutableSchema("foo");
+
+        MutableTable table1 = new MutableTable("bar.baz", schema);
+        schema.addTable(table1);
+        table1.addColumn(new MutableColumn("buuh", table1));
+
+        MutableTable table2 = new MutableTable("bar", schema);
+        schema.addTable(table2);
+        table2.addColumn(new MutableColumn("baz.buuh", table2));
+
+        MyDataContext dc = new MyDataContext("foo", schema);
+        assertEquals("buuh", dc.getColumnByQualifiedLabel("foo.bar.baz.buuh").getName());
+
+        assertEquals("buuh", dc.getColumnByQualifiedLabel("foo.\"bar.baz\".buuh").getName());
+        assertEquals("buuh", dc.getColumnByQualifiedLabel("foo.\"bar.baz\".\"buuh\"").getName());
+        assertEquals("baz.buuh", dc.getColumnByQualifiedLabel("foo.bar.\"baz.buuh\"").getName());
+        assertEquals("baz.buuh", dc.getColumnByQualifiedLabel("\"foo\".bar.\"baz.buuh\"").getName());
+    }
+
+    public void testGetColumnByQualifiedLabel() throws Exception {
+        MyDataContext dc = new MyDataContext();
+        Column result;
+
+        result = dc.getColumnByQualifiedLabel("foobar.tab.le.col1");
+        result = dc.getColumnByQualifiedLabel("blabla.tab.le.col4");
+        result = dc.getColumnByQualifiedLabel("FOOBAR.TABLE.COL3");
+        assertNull(result);
+
+        result = dc.getColumnByQualifiedLabel("foobar.table.col1");
+        assertEquals("col1", result.getName());
+        assertEquals("table", result.getTable().getName());
+        assertEquals("foobar", result.getTable().getSchema().getName());
+
+        result = dc.getColumnByQualifiedLabel("foo.bar.table.col1");
+        assertEquals("col1", result.getName());
+        assertEquals("table", result.getTable().getName());
+        assertEquals("foo.bar", result.getTable().getSchema().getName());
+
+        result = dc.getColumnByQualifiedLabel("foobar.tab.le.col3");
+        assertEquals("col3", result.getName());
+        assertEquals("tab.le", result.getTable().getName());
+        assertEquals("foobar", result.getTable().getSchema().getName());
+
+        result = dc.getColumnByQualifiedLabel("FOO.BAR.tab.le.col3");
+        assertEquals("col3", result.getName());
+        assertEquals("tab.le", result.getTable().getName());
+        assertEquals("foo.bar", result.getTable().getSchema().getName());
+
+        result = dc.getColumnByQualifiedLabel("tab.le.col3");
+        assertEquals("col3", result.getName());
+        assertEquals("tab.le", result.getTable().getName());
+        assertEquals("foobar", result.getTable().getSchema().getName());
+    }
+
+    public void testGetTableByQualfiedLabelSchemaNameInTableName() throws Exception {
         AbstractDataContext dc = new AbstractDataContext() {
             @Override
             public DataSet executeQuery(Query query) throws MetaModelException {
                 return null;
             }
-            
+
             @Override
             protected String[] getSchemaNamesInternal() {
-                return new String[] {"test"};
+                return new String[] { "test" };
             }
-            
+
             @Override
             protected Schema getSchemaByNameInternal(String name) {
                 MutableSchema sch = new MutableSchema("test");
@@ -135,113 +166,120 @@ public class AbstractDataContextTest extends TestCase {
                 sch.addTable(new MutableTable("test_table3").setSchema(sch));
                 return sch;
             }
-            
+
             @Override
             protected String getDefaultSchemaName() {
                 return "test";
             }
         };
-        
+
         assertEquals("test_table1", dc.getTableByQualifiedLabel("test_table1").getName());
         assertEquals("test_table2", dc.getTableByQualifiedLabel("test_table2").getName());
         assertEquals("test_table3", dc.getTableByQualifiedLabel("test_table3").getName());
     }
 
-	public void testGetTableByQualifiedLabel() throws Exception {
-		MyDataContext dc = new MyDataContext();
-
-		Table result;
-
-		result = dc.getTableByQualifiedLabel("FOOBAR.table");
-		assertEquals("table", result.getName());
-		assertEquals("foobar", result.getSchema().getName());
-
-		result = dc.getTableByQualifiedLabel("table");
-		assertEquals("table", result.getName());
-		assertEquals("foobar", result.getSchema().getName());
-
-		result = dc.getTableByQualifiedLabel("foo.bar.table");
-		assertEquals("table", result.getName());
-		assertEquals("foo.bar", result.getSchema().getName());
-
-		result = dc.getTableByQualifiedLabel("foobar.tab.le");
-		assertEquals("tab.le", result.getName());
-		assertEquals("foobar", result.getSchema().getName());
-
-		result = dc.getTableByQualifiedLabel("foo.bar.tab.le");
-		assertEquals("tab.le", result.getName());
-		assertEquals("foo.bar", result.getSchema().getName());
-
-		result = dc.getTableByQualifiedLabel("foo.table");
-		assertNull(result);
-	}
-
-	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));
-
-		dc.refreshSchemas();
-		schemas = dc.getSchemas();
-		assertEquals(
-				"[Schema[name=barfoo], Schema[name=foo.bar], Schema[name=foobar]]",
-				Arrays.toString(schemas));
-	}
-
-	public void testGetColumnByQualifiedLabelWithNameOverlaps()
-			throws Exception {
-		AbstractDataContext dc = new AbstractDataContext() {
-
-			@Override
-			public DataSet executeQuery(Query query) throws MetaModelException {
-				throw new UnsupportedOperationException();
-			}
-
-			@Override
-			protected String[] getSchemaNamesInternal() {
-				return new String[] { "sch" };
-			}
-
-			@Override
-			protected Schema getSchemaByNameInternal(String name) {
-				MutableSchema schema = new MutableSchema("sch");
-				MutableTable table1 = new MutableTable("tab");
-				MutableTable table2 = new MutableTable("tab_le");
-				MutableTable table3 = new MutableTable("table");
-				MutableTable table4 = new MutableTable("tabl_e");
-				schema.addTable(table1.addColumn(new MutableColumn("col")
-						.setTable(table1)));
-				schema.addTable(table2.addColumn(new MutableColumn("col")
-						.setTable(table2)));
-				schema.addTable(table3.addColumn(new MutableColumn("col")
-						.setTable(table3)));
-				schema.addTable(table4.addColumn(new MutableColumn("col")
-						.setTable(table4)));
-				return schema;
-			}
-
-			@Override
-			protected String getDefaultSchemaName() {
-				return "sch";
-			}
-		};
-
-		assertEquals("tab.col", dc.getColumnByQualifiedLabel("sch.tab.col")
-				.getQualifiedLabel());
-		assertEquals("table.col", dc.getColumnByQualifiedLabel("sch.table.col")
-				.getQualifiedLabel());
-		assertEquals("tab_le.col", dc.getColumnByQualifiedLabel(
-				"sch.tab_le.col").getQualifiedLabel());
-		assertEquals("tabl_e.col", dc.getColumnByQualifiedLabel(
-				"sch.tabl_e.col").getQualifiedLabel());
-	}
-
-	public void testGetColumnByQualifiedLabelCaseInsensitive() throws Exception {
-		MyDataContext dc = new MyDataContext();
-		Column result = dc.getColumnByQualifiedLabel("FOOBAR.TABLE.COL1");
-		assertNotNull(result);
-		assertEquals("col1", result.getName());
-	}
+    public void testGetTableByQualifiedLabel() throws Exception {
+        MyDataContext dc = new MyDataContext();
+
+        Table result;
+
+        result = dc.getTableByQualifiedLabel("FOOBAR.table");
+        assertEquals("table", result.getName());
+        assertEquals("foobar", result.getSchema().getName());
+
+        result = dc.getTableByQualifiedLabel("table");
+        assertEquals("table", result.getName());
+        assertEquals("foobar", result.getSchema().getName());
+
+        result = dc.getTableByQualifiedLabel("foo.bar.table");
+        assertEquals("table", result.getName());
+        assertEquals("foo.bar", result.getSchema().getName());
+
+        result = dc.getTableByQualifiedLabel("foobar.tab.le");
+        assertEquals("tab.le", result.getName());
+        assertEquals("foobar", result.getSchema().getName());
+
+        result = dc.getTableByQualifiedLabel("foo.bar.tab.le");
+        assertEquals("tab.le", result.getName());
+        assertEquals("foo.bar", result.getSchema().getName());
+
+        result = dc.getTableByQualifiedLabel("foo.table");
+        assertNull(result);
+    }
+
+    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));
+
+        dc.refreshSchemas();
+        schemas = dc.getSchemas();
+        assertEquals("[Schema[name=barfoo], Schema[name=foo.bar], Schema[name=foobar]]", Arrays.toString(schemas));
+    }
+
+    public void testGetColumnByQualifiedLabelWithNameOverlaps() throws Exception {
+        AbstractDataContext dc = new AbstractDataContext() {
+
+            @Override
+            public DataSet executeQuery(Query query) throws MetaModelException {
+                throw new UnsupportedOperationException();
+            }
+
+            @Override
+            protected String[] getSchemaNamesInternal() {
+                return new String[] { "sch" };
+            }
+
+            @Override
+            protected Schema getSchemaByNameInternal(String name) {
+                MutableSchema schema = new MutableSchema("sch");
+                MutableTable table1 = new MutableTable("tab");
+                MutableTable table2 = new MutableTable("tab_le");
+                MutableTable table3 = new MutableTable("table");
+                MutableTable table4 = new MutableTable("tabl_e");
+                schema.addTable(table1.addColumn(new MutableColumn("col").setTable(table1)));
+                schema.addTable(table2.addColumn(new MutableColumn("col").setTable(table2)));
+                schema.addTable(table3.addColumn(new MutableColumn("col").setTable(table3)));
+                schema.addTable(table4.addColumn(new MutableColumn("col").setTable(table4)));
+                return schema;
+            }
+
+            @Override
+            protected String getDefaultSchemaName() {
+                return "sch";
+            }
+        };
+
+        assertEquals("tab.col", dc.getColumnByQualifiedLabel("sch.tab.col").getQualifiedLabel());
+        assertEquals("table.col", dc.getColumnByQualifiedLabel("sch.table.col").getQualifiedLabel());
+        assertEquals("tab_le.col", dc.getColumnByQualifiedLabel("sch.tab_le.col").getQualifiedLabel());
+        assertEquals("tabl_e.col", dc.getColumnByQualifiedLabel("sch.tabl_e.col").getQualifiedLabel());
+    }
+
+    public void testGetColumnByQualifiedLabelCaseInsensitive() throws Exception {
+        MyDataContext dc = new MyDataContext();
+        Column result = dc.getColumnByQualifiedLabel("FOOBAR.TABLE.COL1");
+        assertNotNull(result);
+        assertEquals("col1", result.getName());
+    }
+
+    private Schema createSchema(String name) {
+        MutableSchema schema = new MutableSchema(name);
+        MutableTable t1 = new MutableTable("table");
+        MutableColumn col1 = new MutableColumn("col1");
+        MutableColumn col2 = new MutableColumn("col2");
+        t1.addColumn(col1).addColumn(col2);
+        col1.setTable(t1);
+        col2.setTable(t1);
+        MutableTable t2 = new MutableTable("tab.le");
+        MutableColumn col3 = new MutableColumn("col3");
+        MutableColumn col4 = new MutableColumn("col4");
+        t2.addColumn(col3).addColumn(col4);
+        col3.setTable(t2);
+        col4.setTable(t2);
+        schema.addTable(t1).addTable(t2);
+        t1.setSchema(schema);
+        t2.setSchema(schema);
+        return schema;
+    }
 }
\ No newline at end of file