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/window_function Commit: 3ffb4ee24499865720eef518d8ccb1948c274d65 Parents: 3c204f4 Author: Hyunsik Choi <[email protected]> Authored: Wed May 7 14:47:29 2014 +0900 Committer: Hyunsik Choi <[email protected]> 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);
