You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tajo.apache.org by hy...@apache.org on 2014/05/07 08:08:19 UTC

git commit: TAJO-812: Some methods of TajoDatabaseMetaData should result in an empty tuple list instead of SQLFeatureNotSupportedException.

Repository: tajo
Updated Branches:
  refs/heads/master 3c204f4b6 -> 3ffb4ee24


TAJO-812: Some methods of TajoDatabaseMetaData should result in an empty tuple list instead of SQLFeatureNotSupportedException.

This closes #6


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

Branch: refs/heads/master
Commit: 3ffb4ee24499865720eef518d8ccb1948c274d65
Parents: 3c204f4
Author: Hyunsik Choi <hy...@apache.org>
Authored: Wed May 7 14:47:29 2014 +0900
Committer: Hyunsik Choi <hy...@apache.org>
Committed: Wed May 7 15:07:53 2014 +0900

----------------------------------------------------------------------
 pom.xml                                         |   1 +
 .../java/org/apache/tajo/client/TajoClient.java |   4 +
 .../apache/tajo/jdbc/TajoDatabaseMetaData.java  | 138 ++++++++++---------
 .../apache/tajo/jdbc/TajoMetaDataResultSet.java |  16 ++-
 .../apache/tajo/jdbc/TajoPreparedStatement.java |   2 +-
 .../site/resources/releases/0.8.0/relnotes.html |  20 ++-
 .../org/apache/tajo/rpc/NettyClientBase.java    |  19 +++
 .../org/apache/tajo/rpc/NettyServerBase.java    |   2 -
 8 files changed, 129 insertions(+), 73 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tajo/blob/3ffb4ee2/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 5105584..47643e4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -377,6 +377,7 @@
             <exclude>**/sphinx_rtd_theme/**/*</exclude>
             <!-- tajo-doc -->
             <exclude>**/*.rst</exclude>
+            <exclude>**/resources/*</exclude>
           </excludes>
         </configuration>
       </plugin>

http://git-wip-us.apache.org/repos/asf/tajo/blob/3ffb4ee2/tajo-client/src/main/java/org/apache/tajo/client/TajoClient.java
----------------------------------------------------------------------
diff --git a/tajo-client/src/main/java/org/apache/tajo/client/TajoClient.java b/tajo-client/src/main/java/org/apache/tajo/client/TajoClient.java
index 9662424..d981917 100644
--- a/tajo-client/src/main/java/org/apache/tajo/client/TajoClient.java
+++ b/tajo-client/src/main/java/org/apache/tajo/client/TajoClient.java
@@ -105,6 +105,10 @@ public class TajoClient implements Closeable {
     this.baseDatabase = baseDatabase != null ? baseDatabase : null;
   }
 
+  public void setSessionId(TajoIdProtos.SessionIdProto sessionId) {
+      this.sessionId = sessionId;
+  }
+
   public boolean isConnected() {
     try {
       return connPool.getConnection(tajoMasterAddr, TajoMasterClientProtocol.class, false).isConnected();

http://git-wip-us.apache.org/repos/asf/tajo/blob/3ffb4ee2/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/TajoDatabaseMetaData.java
----------------------------------------------------------------------
diff --git a/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/TajoDatabaseMetaData.java b/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/TajoDatabaseMetaData.java
index c06014d..1b73047 100644
--- a/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/TajoDatabaseMetaData.java
+++ b/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/TajoDatabaseMetaData.java
@@ -21,10 +21,7 @@ import com.google.common.collect.Lists;
 import com.google.protobuf.ServiceException;
 import org.apache.tajo.TajoConstants;
 import org.apache.tajo.annotation.Nullable;
-import org.apache.tajo.catalog.CatalogConstants;
-import org.apache.tajo.catalog.CatalogUtil;
-import org.apache.tajo.catalog.Column;
-import org.apache.tajo.catalog.TableDesc;
+import org.apache.tajo.catalog.*;
 import org.apache.tajo.client.ResultSetUtil;
 import org.apache.tajo.client.TajoClient;
 import org.apache.tajo.common.TajoDataTypes.Type;
@@ -350,64 +347,58 @@ public class TajoDatabaseMetaData implements DatabaseMetaData {
   @Override
   public ResultSet getTables(@Nullable String catalog, @Nullable String schemaPattern,
                              @Nullable String tableNamePattern, @Nullable String [] types) throws SQLException {
-    try {
-      final List<MetaDataTuple> resultTables = new ArrayList<MetaDataTuple>();
-      String regtableNamePattern = convertPattern(tableNamePattern == null ? null : tableNamePattern);
-
-      List<String> targetCatalogs = Lists.newArrayList();
-      if (catalog != null) {
-        targetCatalogs.add(catalog);
-      }
-
-      try {
-        TajoClient tajoClient = conn.getTajoClient();
+    final List<MetaDataTuple> resultTables = new ArrayList<MetaDataTuple>();
+    String regtableNamePattern = convertPattern(tableNamePattern == null ? null : tableNamePattern);
 
-        // if catalog is null, all databases are targets.
-        if (targetCatalogs.isEmpty()) {
-          targetCatalogs.addAll(tajoClient.getAllDatabaseNames());
-        }
+    List<String> targetCatalogs = Lists.newArrayList();
+    if (catalog != null) {
+      targetCatalogs.add(catalog);
+    }
 
-        for (String databaseName : targetCatalogs) {
-          List<String> tableNames = tajoClient.getTableList(databaseName);
-          for (String eachTableName: tableNames) {
-            if (eachTableName.matches(regtableNamePattern)) {
-              MetaDataTuple tuple = new MetaDataTuple(5);
+    try {
+      TajoClient tajoClient = conn.getTajoClient();
 
-              int index = 0;
-              tuple.put(index++, new TextDatum(databaseName));         // TABLE_CAT
-              tuple.put(index++, new TextDatum(DEFAULT_SCHEMA_NAME));   // TABLE_SCHEM
-              tuple.put(index++, new TextDatum(eachTableName));         // TABLE_NAME
-              tuple.put(index++, new TextDatum("TABLE"));               // TABLE_TYPE
-              tuple.put(index++, NullDatum.get());                      // REMARKS
+      // if catalog is null, all databases are targets.
+      if (targetCatalogs.isEmpty()) {
+        targetCatalogs.addAll(tajoClient.getAllDatabaseNames());
+      }
 
-              resultTables.add(tuple);
-            }
+      for (String databaseName : targetCatalogs) {
+        List<String> tableNames = tajoClient.getTableList(databaseName);
+        for (String eachTableName: tableNames) {
+          if (eachTableName.matches(regtableNamePattern)) {
+            MetaDataTuple tuple = new MetaDataTuple(5);
+
+            int index = 0;
+            tuple.put(index++, new TextDatum(databaseName));         // TABLE_CAT
+            tuple.put(index++, new TextDatum(DEFAULT_SCHEMA_NAME));   // TABLE_SCHEM
+            tuple.put(index++, new TextDatum(eachTableName));         // TABLE_NAME
+            tuple.put(index++, new TextDatum("TABLE"));               // TABLE_TYPE
+            tuple.put(index++, NullDatum.get());                      // REMARKS
+
+            resultTables.add(tuple);
           }
         }
-        Collections.sort(resultTables, new Comparator<MetaDataTuple> () {
-          @Override
-          public int compare(MetaDataTuple table1, MetaDataTuple table2) {
-            int compVal = table1.getText(1).compareTo(table2.getText(1));
-            if (compVal == 0) {
-              compVal = table1.getText(2).compareTo(table2.getText(2));
-            }
-            return compVal;
-          }
-        });
-      } catch (Exception e) {
-        e.printStackTrace();
-        throw new SQLException(e);
       }
-      TajoMetaDataResultSet result = new TajoMetaDataResultSet(
-          Arrays.asList("TABLE_CAT", "TABLE_SCHEM", "TABLE_NAME", "TABLE_TYPE", "REMARKS"),
-          Arrays.asList(Type.VARCHAR, Type.VARCHAR, Type.VARCHAR, Type.VARCHAR, Type.VARCHAR),
-          resultTables);
-
-      return result;
-    } catch (Exception e) {
-      e.printStackTrace();
-      throw new SQLException(e.getMessage(), e);
+      Collections.sort(resultTables, new Comparator<MetaDataTuple> () {
+        @Override
+        public int compare(MetaDataTuple table1, MetaDataTuple table2) {
+          int compVal = table1.getText(1).compareTo(table2.getText(1));
+          if (compVal == 0) {
+            compVal = table1.getText(2).compareTo(table2.getText(2));
+          }
+          return compVal;
+        }
+      });
+    } catch (Throwable e) {
+      throw new SQLException(e);
     }
+    TajoMetaDataResultSet result = new TajoMetaDataResultSet(
+        Arrays.asList("TABLE_CAT", "TABLE_SCHEM", "TABLE_NAME", "TABLE_TYPE", "REMARKS"),
+        Arrays.asList(Type.VARCHAR, Type.VARCHAR, Type.VARCHAR, Type.VARCHAR, Type.VARCHAR),
+        resultTables);
+
+    return result;
   }
 
   @Override
@@ -551,8 +542,7 @@ public class TajoDatabaseMetaData implements DatabaseMetaData {
               , Type.INT4, Type.INT4, Type.VARCHAR, Type.VARCHAR, Type.VARCHAR
               , Type.VARCHAR, Type.INT4)
           , columns);
-    } catch (Exception e) {
-      e.printStackTrace();
+    } catch (Throwable e) {
       throw new SQLException(e);
     }
   }
@@ -582,28 +572,44 @@ public class TajoDatabaseMetaData implements DatabaseMetaData {
   }
 
   @Override
-  public ResultSet getPrimaryKeys(String catalog, String schema, String table)
-      throws SQLException {
-    throw new SQLFeatureNotSupportedException("primary keys not supported");
+  public ResultSet getPrimaryKeys(String catalog, String schema, String table) throws SQLException {
+    return new TajoMetaDataResultSet(
+        Arrays.asList("TABLE_CAT", "TABLE_SCHEM", "TABLE_NAME", "COLUMN_NAME", "KEY_SEQ", "PK_NAME")
+        , Arrays.asList(Type.VARCHAR, Type.VARCHAR, Type.VARCHAR, Type.VARCHAR, Type.INT4, Type.VARCHAR)
+        , new ArrayList<MetaDataTuple>());
   }
 
+  private final static Schema importedExportedSchema = new Schema()
+      .addColumn("PKTABLE_CAT", Type.VARCHAR)   // 0
+      .addColumn("PKTABLE_SCHEM", Type.VARCHAR) // 1
+      .addColumn("PKTABLE_NAME", Type.VARCHAR)  // 2
+      .addColumn("PKCOLUMN_NAME", Type.VARCHAR) // 3
+      .addColumn("FKTABLE_CAT", Type.VARCHAR)   // 4
+      .addColumn("FKTABLE_SCHEM", Type.VARCHAR) // 5
+      .addColumn("FKTABLE_NAME", Type.VARCHAR)  // 6
+      .addColumn("FKCOLUMN_NAME", Type.VARCHAR) // 7
+      .addColumn("KEY_SEQ", Type.INT2)          // 8
+      .addColumn("UPDATE_RULE", Type.INT2)      // 9
+      .addColumn("DELETE_RULE", Type.INT2)      // 10
+      .addColumn("FK_NAME", Type.VARCHAR)       // 11
+      .addColumn("PK_NAME", Type.VARCHAR)       // 12
+      .addColumn("DEFERRABILITY", Type.INT2);   // 13
+
   @Override
-  public ResultSet getImportedKeys(String catalog, String schema, String table)
-      throws SQLException {
-    throw new SQLFeatureNotSupportedException("imported keys not supported");
+  public ResultSet getImportedKeys(String catalog, String schema, String table) throws SQLException {
+    return new TajoMetaDataResultSet(importedExportedSchema, new ArrayList<MetaDataTuple>());
   }
 
   @Override
-  public ResultSet getExportedKeys(String catalog, String schema, String table)
-      throws SQLException {
-    throw new SQLFeatureNotSupportedException("exported keys not supported");
+  public ResultSet getExportedKeys(String catalog, String schema, String table) throws SQLException {
+    return new TajoMetaDataResultSet(importedExportedSchema, new ArrayList<MetaDataTuple>());
   }
 
   @Override
   public ResultSet getCrossReference(String parentCatalog, String parentSchema, String parentTable,
                                      String foreignCatalog, String foreignSchema, String foreignTable)
       throws SQLException {
-    throw new SQLFeatureNotSupportedException("cross reference not supported");
+    return new TajoMetaDataResultSet(importedExportedSchema, new ArrayList<MetaDataTuple>());
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/tajo/blob/3ffb4ee2/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/TajoMetaDataResultSet.java
----------------------------------------------------------------------
diff --git a/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/TajoMetaDataResultSet.java b/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/TajoMetaDataResultSet.java
index fb0a834..faa058d 100644
--- a/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/TajoMetaDataResultSet.java
+++ b/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/TajoMetaDataResultSet.java
@@ -1,4 +1,4 @@
-package org.apache.tajo.jdbc; /**
+/**
  * 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
@@ -16,6 +16,8 @@ package org.apache.tajo.jdbc; /**
  * limitations under the License.
  */
 
+package org.apache.tajo.jdbc;
+
 import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.datum.Datum;
@@ -28,6 +30,12 @@ import java.util.List;
 public class TajoMetaDataResultSet extends TajoResultSetBase {
   private List<MetaDataTuple> values;
 
+  public TajoMetaDataResultSet(Schema schema, List<MetaDataTuple> values) {
+    init();
+    this.schema = schema;
+    setDataTuples(values);
+  }
+
   public TajoMetaDataResultSet(List<String> columns, List<Type> types, List<MetaDataTuple> values) {
     init();
     schema = new Schema();
@@ -38,8 +46,12 @@ public class TajoMetaDataResultSet extends TajoResultSetBase {
         schema.addColumn(columnName, types.get(index++));
       }
     }
+    setDataTuples(values);
+  }
+
+  protected void setDataTuples(List<MetaDataTuple> values) {
     this.values = values;
-    totalRow = values == null ? 0 : values.size();
+    this.totalRow = values == null ? 0 : values.size();
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/tajo/blob/3ffb4ee2/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/TajoPreparedStatement.java
----------------------------------------------------------------------
diff --git a/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/TajoPreparedStatement.java b/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/TajoPreparedStatement.java
index c1d0ad2..bc7d0b0 100644
--- a/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/TajoPreparedStatement.java
+++ b/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/TajoPreparedStatement.java
@@ -60,7 +60,7 @@ public class TajoPreparedStatement implements PreparedStatement {
   /**
    * keep the current ResultRet update count
    */
-  private final int updateCount = 0;
+  private int updateCount = 0;
 
   /**
    *

http://git-wip-us.apache.org/repos/asf/tajo/blob/3ffb4ee2/tajo-project/src/site/resources/releases/0.8.0/relnotes.html
----------------------------------------------------------------------
diff --git a/tajo-project/src/site/resources/releases/0.8.0/relnotes.html b/tajo-project/src/site/resources/releases/0.8.0/relnotes.html
index 3eae925..892db47 100644
--- a/tajo-project/src/site/resources/releases/0.8.0/relnotes.html
+++ b/tajo-project/src/site/resources/releases/0.8.0/relnotes.html
@@ -1,5 +1,21 @@
+<!--
+  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.
+  -->
 
-<!-- saved from url=(0073)http://people.apache.org/~hyunsik/tajo-0.8.0-rc0/RELEASE_NOTES_0.8.0.html -->
 <html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 <title>Apache Tajo 0.8.0 Release Notes</title>
 </head>
@@ -769,4 +785,4 @@
 </ul>
 
 
-<iframe id="rdbIndicator" width="100%" height="270" border="0" src="./Apache Tajo 0.8.0 Release Notes_files/indicator.html" style="display: none; border: 0; position: fixed; left: 0; top: 0; z-index: 2147483647"></iframe></body></html>
\ No newline at end of file
+<iframe id="rdbIndicator" width="100%" height="270" border="0" src="./Apache Tajo 0.8.0 Release Notes_files/indicator.html" style="display: none; border: 0; position: fixed; left: 0; top: 0; z-index: 2147483647"></iframe></body></html>

http://git-wip-us.apache.org/repos/asf/tajo/blob/3ffb4ee2/tajo-rpc/src/main/java/org/apache/tajo/rpc/NettyClientBase.java
----------------------------------------------------------------------
diff --git a/tajo-rpc/src/main/java/org/apache/tajo/rpc/NettyClientBase.java b/tajo-rpc/src/main/java/org/apache/tajo/rpc/NettyClientBase.java
index fa4b941..fe41267 100644
--- a/tajo-rpc/src/main/java/org/apache/tajo/rpc/NettyClientBase.java
+++ b/tajo-rpc/src/main/java/org/apache/tajo/rpc/NettyClientBase.java
@@ -24,15 +24,19 @@ import org.apache.tajo.util.NetUtils;
 import org.jboss.netty.bootstrap.ClientBootstrap;
 import org.jboss.netty.channel.Channel;
 import org.jboss.netty.channel.ChannelFuture;
+import org.jboss.netty.channel.ChannelFutureListener;
 import org.jboss.netty.channel.ChannelPipelineFactory;
 import org.jboss.netty.channel.socket.ClientSocketChannelFactory;
 
 import java.io.Closeable;
 import java.io.IOException;
 import java.net.InetSocketAddress;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
 
 public abstract class NettyClientBase implements Closeable {
   private static Log LOG = LogFactory.getLog(NettyClientBase.class);
+  private static final int CLIENT_CONNECTION_TIMEOUT_SEC = 60;
 
   protected ClientBootstrap bootstrap;
   private ChannelFuture channelFuture;
@@ -71,6 +75,21 @@ public abstract class NettyClientBase implements Closeable {
     }
     this.channelFuture = bootstrap.connect(addr);
     this.channelFuture.awaitUninterruptibly();
+
+    final CountDownLatch latch = new CountDownLatch(1);
+    this.channelFuture.addListener(new ChannelFutureListener() {
+      @Override
+      public void operationComplete(ChannelFuture future) throws Exception {
+        latch.countDown();
+      }
+    });
+
+    try {
+      latch.await(CLIENT_CONNECTION_TIMEOUT_SEC, TimeUnit.SECONDS);
+    } catch (InterruptedException e) {
+    }
+
+
     if (!channelFuture.isSuccess()) {
       throw new RuntimeException(channelFuture.getCause());
     }

http://git-wip-us.apache.org/repos/asf/tajo/blob/3ffb4ee2/tajo-rpc/src/main/java/org/apache/tajo/rpc/NettyServerBase.java
----------------------------------------------------------------------
diff --git a/tajo-rpc/src/main/java/org/apache/tajo/rpc/NettyServerBase.java b/tajo-rpc/src/main/java/org/apache/tajo/rpc/NettyServerBase.java
index 9ee098d..e75418d 100644
--- a/tajo-rpc/src/main/java/org/apache/tajo/rpc/NettyServerBase.java
+++ b/tajo-rpc/src/main/java/org/apache/tajo/rpc/NettyServerBase.java
@@ -68,8 +68,6 @@ public class NettyServerBase {
   public void init(ChannelPipelineFactory pipeline, int workerNum) {
     ChannelFactory factory = RpcChannelFactory.createServerChannelFactory(serviceName, workerNum);
 
-    DefaultChannelFuture.setUseDeadLockChecker(false);
-
     pipelineFactory = pipeline;
     bootstrap = new ServerBootstrap(factory);
     bootstrap.setPipelineFactory(pipelineFactory);