Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/incubator-ignite into ignite-843
Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/53f12f53 Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/53f12f53 Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/53f12f53 Branch: refs/heads/ignite-843 Commit: 53f12f532133ae61e0c2a963f2d42350bf851c1f Parents: d71b5cf c087be2 Author: AKuznetsov <akuznet...@gridgain.com> Authored: Wed Aug 5 08:06:45 2015 +0700 Committer: AKuznetsov <akuznet...@gridgain.com> Committed: Wed Aug 5 08:06:45 2015 +0700 ---------------------------------------------------------------------- .../ClientAbstractMultiNodeSelfTest.java | 4 +- .../JettyRestProcessorAbstractSelfTest.java | 14 +- .../apache/ignite/IgniteSystemProperties.java | 2 +- .../store/jdbc/CacheAbstractJdbcStore.java | 21 +- .../apache/ignite/internal/IgniteKernal.java | 2 +- .../org/apache/ignite/internal/IgnitionEx.java | 43 +- .../managers/communication/GridIoManager.java | 188 +++++++- .../processors/cache/GridCacheMvccManager.java | 73 +-- .../processors/cache/GridCacheProcessor.java | 2 +- .../processors/cache/GridCacheProxyImpl.java | 42 +- .../processors/cache/GridCacheSwapManager.java | 2 +- .../GridDhtPartitionsExchangeFuture.java | 20 +- .../distributed/near/GridNearGetFuture.java | 20 +- .../handlers/query/QueryCommandHandler.java | 6 +- .../ignite/internal/util/IgniteUtils.java | 16 + .../util/nio/GridCommunicationClient.java | 5 +- .../util/nio/GridNioFinishedFuture.java | 12 + .../ignite/internal/util/nio/GridNioFuture.java | 14 + .../internal/util/nio/GridNioFutureImpl.java | 15 + .../util/nio/GridNioRecoveryDescriptor.java | 13 +- .../ignite/internal/util/nio/GridNioServer.java | 5 + .../util/nio/GridNioSessionMetaKey.java | 5 +- .../util/nio/GridShmemCommunicationClient.java | 7 +- .../util/nio/GridTcpNioCommunicationClient.java | 14 +- .../communication/tcp/TcpCommunicationSpi.java | 84 +++- .../ignite/spi/discovery/tcp/ClientImpl.java | 2 +- .../ignite/spi/discovery/tcp/ServerImpl.java | 45 +- .../spi/discovery/tcp/TcpDiscoverySpi.java | 2 +- .../src/test/config/io-manager-benchmark.xml | 3 +- .../GridJobMasterLeaveAwareSelfTest.java | 10 +- .../IgniteClientReconnectAbstractTest.java | 5 +- .../IgniteClientReconnectCacheTest.java | 5 +- .../GridDeploymentMessageCountSelfTest.java | 5 +- ...cheDhtLocalPartitionAfterRemoveSelfTest.java | 107 +++++ .../cache/CacheStopAndDestroySelfTest.java | 8 +- .../GridCacheAtomicMessageCountSelfTest.java | 6 +- .../processors/cache/GridCacheMvccSelfTest.java | 1 - ...ridCacheReplicatedSynchronousCommitTest.java | 5 +- .../cache/GridCacheSwapPreloadSelfTest.java | 2 + .../IgniteCacheAbstractStopBusySelfTest.java | 6 +- .../cache/IgniteCacheNearLockValueSelfTest.java | 6 +- ...eDynamicCacheStartNoExchangeTimeoutTest.java | 4 +- .../cache/IgniteTxReentryAbstractSelfTest.java | 5 +- ...niteCacheClientNodeChangingTopologyTest.java | 6 +- ...teCacheClientNodePartitionsExchangeTest.java | 4 +- .../IgniteCacheNearOffheapGetSelfTest.java | 131 ++++++ ...xOriginatingNodeFailureAbstractSelfTest.java | 6 +- ...cOriginatingNodeFailureAbstractSelfTest.java | 6 +- .../GridCacheDhtPreloadMessageCountTest.java | 5 +- ...ePrimaryNodeFailureRecoveryAbstractTest.java | 6 +- ...eAtomicInvalidPartitionHandlingSelfTest.java | 5 +- .../near/IgniteCacheNearTxRollbackTest.java | 6 +- .../GridCacheReplicatedInvalidateSelfTest.java | 6 +- ...CommunicationRecoveryAckClosureSelfTest.java | 464 +++++++++++++++++++ .../tcp/TcpDiscoveryMultiThreadedTest.java | 8 +- .../testsuites/IgniteCacheTestSuite2.java | 1 + .../IgniteSpiCommunicationSelfTestSuite.java | 1 + .../ignite/util/TestTcpCommunicationSpi.java | 6 +- .../query/h2/twostep/GridMergeIndex.java | 7 + .../h2/twostep/GridMergeIndexUnsorted.java | 17 +- .../query/h2/twostep/GridMergeTable.java | 52 +-- .../h2/twostep/GridReduceQueryExecutor.java | 62 +-- ...CacheScanPartitionQueryFallbackSelfTest.java | 15 +- ...idCacheReduceQueryMultithreadedSelfTest.java | 21 +- .../http/jetty/GridJettyRestHandler.java | 12 +- .../parser/dialect/OracleMetadataDialect.java | 4 +- .../src/test/java/config/ignite-test-config.xml | 43 ++ .../ignite/internal/GridFactorySelfTest.java | 9 + .../visor/commands/kill/VisorKillCommand.scala | 2 +- .../yardstick/config/benchmark-query.properties | 3 +- modules/yardstick/config/ignite-base-config.xml | 2 - .../yardstick/IgniteBenchmarkArguments.java | 11 + .../cache/IgniteJdbcSqlQueryBenchmark.java | 134 ++++++ 73 files changed, 1588 insertions(+), 323 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/53f12f53/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/53f12f53/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/53f12f53/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/query/QueryCommandHandler.java ---------------------------------------------------------------------- diff --cc modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/query/QueryCommandHandler.java index 35fbcef,1712dd4..43ecc0c --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/query/QueryCommandHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/query/QueryCommandHandler.java @@@ -252,9 -247,9 +252,9 @@@ public class QueryCommandHandler extend if (cur == null) return new GridRestResponse(GridRestResponse.STATUS_FAILED, - "Cannot find query [qryId=" + req.queryId() + "]"); + "Failed to find query with ID: " + req.queryId()); - CacheQueryResult res = createQueryResult(qryCurs, cur, req, req.queryId()); + CacheQueryResult res = createQueryResult(qryCurs, cur, req, req.queryId(), ctx); return new GridRestResponse(res); } http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/53f12f53/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestHandler.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/53f12f53/modules/schema-import-db/src/main/java/org/apache/ignite/schema/parser/dialect/OracleMetadataDialect.java ---------------------------------------------------------------------- diff --cc modules/schema-import-db/src/main/java/org/apache/ignite/schema/parser/dialect/OracleMetadataDialect.java index 855c9f7,0000000..860ff68 mode 100644,000000..100644 --- a/modules/schema-import-db/src/main/java/org/apache/ignite/schema/parser/dialect/OracleMetadataDialect.java +++ b/modules/schema-import-db/src/main/java/org/apache/ignite/schema/parser/dialect/OracleMetadataDialect.java @@@ -1,281 -1,0 +1,281 @@@ +/* + * 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.ignite.schema.parser.dialect; + +import org.apache.ignite.schema.parser.*; + +import java.sql.*; +import java.util.*; + +import static java.sql.Types.*; + +/** + * Oracle specific metadata dialect. + */ +public class OracleMetadataDialect extends DatabaseMetadataDialect { + /** SQL to get columns metadata. */ + private static final String SQL_COLUMNS = "SELECT a.owner, a.table_name, a.column_name, a.nullable," + + " a.data_type, a.data_precision, a.data_scale " + + "FROM all_tab_columns a %s" + + " WHERE a.owner = '%s'" + + " ORDER BY a.owner, a.table_name, a.column_id"; + + /** SQL to get list of PRIMARY KEYS columns. */ + private static final String SQL_PRIMARY_KEYS = "SELECT b.column_name" + + " FROM all_constraints a" + + " INNER JOIN all_cons_columns b ON a.owner = b.owner AND a.constraint_name = b.constraint_name" + + " WHERE a.owner = ? and a.table_name = ? AND a.constraint_type = 'P'"; + + /** SQL to get indexes metadata. */ - private static final String SQL_INDEXES = "select i.index_name, u.column_expression, i.column_name, i.descend" + ++ private static final String SQL_INDEXES = "SELECT i.index_name, u.column_expression, i.column_name, i.descend" + + " FROM all_ind_columns i" + + " LEFT JOIN user_ind_expressions u on u.index_name = i.index_name and i.table_name = u.table_name" + + " WHERE i.index_owner = ? and i.table_name = ?" + + " ORDER BY i.index_name, i.column_position"; + + /** Owner index. */ + private static final int OWNER_IDX = 1; + + /** Table name index. */ + private static final int TBL_NAME_IDX = 2; + + /** Column name index. */ + private static final int COL_NAME_IDX = 3; + + /** Nullable index. */ + private static final int NULLABLE_IDX = 4; + + /** Data type index. */ + private static final int DATA_TYPE_IDX = 5; + + /** Numeric precision index. */ + private static final int DATA_PRECISION_IDX = 6; + + /** Numeric scale index. */ + private static final int DATA_SCALE_IDX = 7; + + /** Index name index. */ + private static final int IDX_NAME_IDX = 1; + + /** Index name index. */ + private static final int IDX_EXPR_IDX = 2; + + /** Index column name index. */ + private static final int IDX_COL_NAME_IDX = 3; + + /** Index column sort order index. */ + private static final int IDX_COL_DESCEND_IDX = 4; + + /** + * @param rs Result set with column type metadata from Oracle database. + * @return JDBC type. + * @throws SQLException If failed to decode type. + */ + private int decodeType(ResultSet rs) throws SQLException { + switch (rs.getString(DATA_TYPE_IDX)) { + case "CHAR": + case "NCHAR": + return CHAR; + + case "VARCHAR2": + case "NVARCHAR2": + return VARCHAR; + + case "LONG": + return LONGVARCHAR; + + case "LONG RAW": + return LONGVARBINARY; + + case "FLOAT": + return FLOAT; + + case "NUMBER": + int precision = rs.getInt(DATA_PRECISION_IDX); + int scale = rs.getInt(DATA_SCALE_IDX); + + if (scale > 0) { + if (scale < 4 && precision < 19) + return FLOAT; + + if (scale > 4 || precision > 19) + return DOUBLE; + + return NUMERIC; + } + else { + if (precision < 1) + return INTEGER; + + if (precision < 2) + return BOOLEAN; + + if (precision < 4) + return TINYINT; + + if (precision < 6) + return SMALLINT; + + if (precision < 11) + return INTEGER; + + if (precision < 20) + return BIGINT; + + return NUMERIC; + } + + case "DATE": + return DATE; + + case "TIMESTAMP": + return TIMESTAMP; + + case "BFILE": + case "BLOB": + return BLOB; + + case "CLOB": + case "NCLOB": + case "XMLTYPE": + return CLOB; + } + + return OTHER; + } + + /** + * Retrieve primary key columns. + * + * @param stmt Prepared SQL statement to execute. + * @param owner DB owner. + * @param tbl Table name. + * @return Primary key columns. + * @throws SQLException If failed to retrieve primary key columns. + */ + private Set<String> primaryKeys(PreparedStatement stmt, String owner, String tbl) throws SQLException { + Set<String> pkCols = new HashSet<>(); + + stmt.setString(1, owner); + stmt.setString(2, tbl); + + try (ResultSet pkRs = stmt.executeQuery()) { + while(pkRs.next()) + pkCols.add(pkRs.getString(1)); + } + + return pkCols; + } + + /** + * Retrieve index columns. + * + * @param stmt Prepared SQL statement to execute. + * @param owner DB owner. + * @param tbl Table name. + * @return Index columns. + * @throws SQLException If failed to retrieve indexes columns. + */ + private Map<String, Map<String, Boolean>> indexes(PreparedStatement stmt, String owner, String tbl) + throws SQLException { + Map<String, Map<String, Boolean>> idxs = new LinkedHashMap<>(); + + stmt.setString(1, owner); + stmt.setString(2, tbl); + + try (ResultSet idxsRs = stmt.executeQuery()) { + while (idxsRs.next()) { + String idxName = idxsRs.getString(IDX_NAME_IDX); + + Map<String, Boolean> idx = idxs.get(idxName); + + if (idx == null) { + idx = new LinkedHashMap<>(); + + idxs.put(idxName, idx); + } + + String expr = idxsRs.getString(IDX_EXPR_IDX); + + String col = expr == null ? idxsRs.getString(IDX_COL_NAME_IDX) : expr.replaceAll("\"", ""); + + idx.put(col, "DESC".equals(idxsRs.getString(IDX_COL_DESCEND_IDX))); + } + } + + return idxs; + } + + /** {@inheritDoc} */ + @Override public Collection<DbTable> tables(Connection conn, boolean tblsOnly) throws SQLException { + Collection<DbTable> tbls = new ArrayList<>(); + + PreparedStatement pkStmt = conn.prepareStatement(SQL_PRIMARY_KEYS); + + PreparedStatement idxStmt = conn.prepareStatement(SQL_INDEXES); + + try (Statement colsStmt = conn.createStatement()) { + Collection<DbColumn> cols = new ArrayList<>(); + + Set<String> pkCols = Collections.emptySet(); + Map<String, Map<String, Boolean>> idxs = Collections.emptyMap(); + + String user = conn.getMetaData().getUserName().toUpperCase(); + + String sql = String.format(SQL_COLUMNS, - tblsOnly ? "INNER JOIN all_tables b on a.table_name = b.table_name" : "", user); ++ tblsOnly ? "INNER JOIN all_tables b on a.table_name = b.table_name and a.owner = b.owner" : "", user); + + try (ResultSet colsRs = colsStmt.executeQuery(sql)) { + String prevSchema = ""; + String prevTbl = ""; + + boolean first = true; + + while (colsRs.next()) { + String owner = colsRs.getString(OWNER_IDX); + String tbl = colsRs.getString(TBL_NAME_IDX); + + boolean changed = !owner.equals(prevSchema) || !tbl.equals(prevTbl); + + if (changed) { + if (first) + first = false; + else + tbls.add(table(prevSchema, prevTbl, cols, idxs)); + + prevSchema = owner; + prevTbl = tbl; + cols = new ArrayList<>(); + pkCols = primaryKeys(pkStmt, owner, tbl); + idxs = indexes(idxStmt, owner, tbl); + } + + String colName = colsRs.getString(COL_NAME_IDX); + + cols.add(new DbColumn(colName, decodeType(colsRs), pkCols.contains(colName), + !"N".equals(colsRs.getString(NULLABLE_IDX)))); + } + + if (!cols.isEmpty()) + tbls.add(table(prevSchema, prevTbl, cols, idxs)); + } + } + + return tbls; + } +}