drill-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From jacq...@apache.org
Subject [36/38] git commit: Add support for generating optiq planner independent schema plus root for information schema purposes.
Date Tue, 04 Mar 2014 08:08:03 GMT
Add support for generating optiq planner independent schema plus root for information schema
purposes.


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

Branch: refs/heads/master
Commit: ae041d07b351c6e8f744b28df083fa8556838ee6
Parents: d90d5b1
Author: Jacques Nadeau <jacques@apache.org>
Authored: Thu Feb 27 06:56:19 2014 -0800
Committer: Jacques Nadeau <jacques@apache.org>
Committed: Mon Mar 3 23:22:18 2014 -0800

----------------------------------------------------------------------
 .../drill/exec/store/StoragePluginRegistry.java | 155 +++++++++++++++++++
 .../drill/exec/store/TestOrphanSchema.java      |  58 +++++++
 2 files changed, 213 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ae041d07/exec/java-exec/src/main/java/org/apache/drill/exec/store/StoragePluginRegistry.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/StoragePluginRegistry.java
b/exec/java-exec/src/main/java/org/apache/drill/exec/store/StoragePluginRegistry.java
index b182abe..0e9d1e6 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/StoragePluginRegistry.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/StoragePluginRegistry.java
@@ -21,14 +21,20 @@ import java.io.IOException;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.Set;
 
+import net.hydromatic.linq4j.expressions.DefaultExpression;
+import net.hydromatic.linq4j.expressions.Expression;
 import net.hydromatic.linq4j.function.Function1;
 import net.hydromatic.optiq.Schema;
 import net.hydromatic.optiq.SchemaPlus;
+import net.hydromatic.optiq.Table;
+import net.hydromatic.optiq.TableFunction;
 
 import org.apache.drill.common.config.DrillConfig;
 import org.apache.drill.common.exceptions.ExecutionSetupException;
@@ -44,6 +50,7 @@ import org.apache.drill.exec.store.dfs.FormatPlugin;
 import com.google.common.base.Charsets;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.io.Resources;
+import com.google.hive12.common.collect.Maps;
 
 public class StoragePluginRegistry implements Iterable<Map.Entry<String, StoragePlugin>>{
   static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(StoragePluginRegistry.class);
@@ -167,9 +174,157 @@ public class StoragePluginRegistry implements Iterable<Map.Entry<String,
Storage
       return defaultSchema;
     }
     
+    /**
+     * Used in situations where we want to get a schema without having to use in the context
of an Optiq planner. 
+     * @return Root schema of the storage engine hiearchy.
+     */
+    public SchemaPlus getOrphanedRootSchema(){
+      SchemaPlus p = new OrphanPlus();
+      apply(p);
+      return p;
+    }
+    
   }
   
 
+  private class OrphanPlusWrap extends OrphanPlus{
+    private Schema inner;
+
+    public OrphanPlusWrap(Schema inner) {
+      super();
+      this.inner = inner;
+    }
+
+    @Override
+    public SchemaPlus getParentSchema() {
+      return inner.getParentSchema();
+    }
+
+    @Override
+    public String getName() {
+      return inner.getName();
+    }
+
+    @Override
+    public Table getTable(String name) {
+      return inner.getTable(name);
+    }
+
+    @Override
+    public Set<String> getTableNames() {
+      return inner.getTableNames();
+    }
+
+    @Override
+    public Collection<TableFunction> getTableFunctions(String name) {
+      return inner.getTableFunctions(name);
+    }
+
+    @Override
+    public Set<String> getTableFunctionNames() {
+      return inner.getTableFunctionNames();
+    }
+
+    @Override
+    public Set<String> getSubSchemaNames() {
+      return inner.getSubSchemaNames();
+    }
 
+    @Override
+    public Expression getExpression() {
+      return inner.getExpression();
+    }
+
+    @Override
+    public SchemaPlus addRecursive(Schema schema) {
+      return schema.getParentSchema().add(schema);
+    }
+    
+    
+    
+  }
+
+  private class OrphanPlus implements SchemaPlus{
+
+    private HashMap<String, SchemaPlus> schemas = Maps.newHashMap();
+    
+    @Override
+    public SchemaPlus getParentSchema() {
+      return null;
+    }
+
+    @Override
+    public String getName() {
+      return "";
+    }
+
+    @Override
+    public Table getTable(String name) {
+      return null;
+    }
+
+    @Override
+    public Set<String> getTableNames() {
+      return Collections.emptySet();
+    }
+
+    @Override
+    public Collection<TableFunction> getTableFunctions(String name) {
+      return Collections.emptyList();
+    }
+
+    @Override
+    public Set<String> getTableFunctionNames() {
+      return Collections.emptySet();
+    }
+
+    @Override
+    public Set<String> getSubSchemaNames() {
+      return schemas.keySet();
+    }
+
+    @Override
+    public Expression getExpression() {
+      return new DefaultExpression(Object.class);
+    }
+
+    @Override
+    public SchemaPlus getSubSchema(String name) {
+      return schemas.get(name);
+    }
+
+    @Override
+    public SchemaPlus add(Schema schema) {
+      OrphanPlusWrap plus = new OrphanPlusWrap(schema);
+      schemas.put(schema.getName(), plus);
+      return plus;
+    }
+
+    @Override
+    public void add(String name, Table table) {
+      throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void add(String name, TableFunction table) {
+      throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public boolean isMutable() {
+      return false;
+    }
+
+    @Override
+    public <T> T unwrap(Class<T> clazz) {
+      throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public SchemaPlus addRecursive(Schema schema) {
+      return schema.getParentSchema().add(schema);
+    }
+    
+  }
   
 }

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/ae041d07/exec/java-exec/src/test/java/org/apache/drill/exec/store/TestOrphanSchema.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/store/TestOrphanSchema.java
b/exec/java-exec/src/test/java/org/apache/drill/exec/store/TestOrphanSchema.java
new file mode 100644
index 0000000..2087dc2
--- /dev/null
+++ b/exec/java-exec/src/test/java/org/apache/drill/exec/store/TestOrphanSchema.java
@@ -0,0 +1,58 @@
+package org.apache.drill.exec.store;
+
+import mockit.NonStrictExpectations;
+import net.hydromatic.optiq.SchemaPlus;
+
+import org.apache.drill.common.config.DrillConfig;
+import org.apache.drill.exec.memory.TopLevelAllocator;
+import org.apache.drill.exec.server.DrillbitContext;
+import org.junit.Test;
+
+import com.codahale.metrics.MetricRegistry;
+
+public class TestOrphanSchema {
+  static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(TestOrphanSchema.class);
+  
+  
+  @Test
+  public void test(final DrillbitContext bitContext){
+    final DrillConfig c = DrillConfig.create();
+    
+    new NonStrictExpectations() {
+      {
+        bitContext.getMetrics();
+        result = new MetricRegistry();
+        bitContext.getAllocator();
+        result = new TopLevelAllocator();
+        bitContext.getConfig();
+        result = c;
+      }
+    };
+    
+    StoragePluginRegistry r = new StoragePluginRegistry(bitContext);
+    SchemaPlus plus = r.getSchemaFactory().getOrphanedRootSchema();
+    
+    printSchema(plus, 0);
+        
+  }
+  
+  private static void t(final int t){
+    for(int i =0; i < t; i++) System.out.print('\t');
+  }
+  private static void printSchema(SchemaPlus s, int indent){
+    t(indent);
+    System.out.print("Schema: ");
+    System.out.println(s.getName().equals("") ? "root" : s.getName());
+    for(String table : s.getTableNames()){
+      t(indent + 1);
+      System.out.print("Table: ");
+      System.out.println(table);
+    }
+    
+    for(String schema : s.getSubSchemaNames()){
+      SchemaPlus p = s.getSubSchema(schema);
+      printSchema(p, indent + 1);
+    }
+    
+  }
+}


Mime
View raw message