IGNITE-5320: Introduced "PUBLIC" SQL schema. This closes #2044.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/738451c1 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/738451c1 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/738451c1 Branch: refs/heads/ignite-5075 Commit: 738451c16ec75b84c36bff7cd9dfbcf094c5b8ee Parents: c71b7c2 Author: devozerov <[email protected]> Authored: Wed May 31 14:52:47 2017 +0300 Committer: devozerov <[email protected]> Committed: Wed May 31 14:52:47 2017 +0300 ---------------------------------------------------------------------- .../ignite/cache/query/SqlFieldsQuery.java | 24 ++++ .../configuration/CacheConfiguration.java | 6 + .../configuration/IgniteConfiguration.java | 28 +++++ .../ignite/internal/jdbc2/JdbcConnection.java | 45 ++++--- .../ignite/internal/jdbc2/JdbcQueryTask.java | 11 +- .../ignite/internal/jdbc2/JdbcResultSet.java | 5 +- .../ignite/internal/jdbc2/JdbcStatement.java | 12 +- .../jdbc2/JdbcStreamedPreparedStatement.java | 3 +- .../processors/query/GridQueryIndexing.java | 27 +---- .../processors/query/GridQueryProcessor.java | 32 ++--- .../internal/processors/query/QueryUtils.java | 2 + .../processors/query/h2/H2RowDescriptor.java | 35 ++++-- .../internal/processors/query/h2/H2Schema.java | 65 ++++------- .../processors/query/h2/H2TableDescriptor.java | 25 ++-- .../processors/query/h2/H2TableEngine.java | 2 +- .../internal/processors/query/h2/H2Utils.java | 2 +- .../processors/query/h2/IgniteH2Indexing.java | 117 ++++++++++--------- .../query/h2/opt/GridH2RowDescriptor.java | 5 - .../processors/query/h2/opt/GridH2Table.java | 25 ++-- .../query/IgniteSqlSchemaIndexingTest.java | 2 +- .../h2/GridIndexingSpiAbstractSelfTest.java | 7 +- 21 files changed, 265 insertions(+), 215 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/738451c1/modules/core/src/main/java/org/apache/ignite/cache/query/SqlFieldsQuery.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/cache/query/SqlFieldsQuery.java b/modules/core/src/main/java/org/apache/ignite/cache/query/SqlFieldsQuery.java index 9a7211b..93910dc 100644 --- a/modules/core/src/main/java/org/apache/ignite/cache/query/SqlFieldsQuery.java +++ b/modules/core/src/main/java/org/apache/ignite/cache/query/SqlFieldsQuery.java @@ -74,6 +74,9 @@ public class SqlFieldsQuery extends Query<List<?>> { /** Partitions for query */ private int[] parts; + /** Schema. */ + private String schema; + /** * Constructs SQL fields query. * @@ -287,6 +290,27 @@ public class SqlFieldsQuery extends Query<List<?>> { return this; } + /** + * Get schema. + * + * @return Schema. + */ + @Nullable public String getSchema() { + return schema; + } + + /** + * Set schema. + * + * @param schema Schema. + * @return {@code this} for chaining. + */ + public SqlFieldsQuery setSchema(@Nullable String schema) { + this.schema = schema; + + return this; + } + /** {@inheritDoc} */ @Override public String toString() { return S.toString(SqlFieldsQuery.class, this); http://git-wip-us.apache.org/repos/asf/ignite/blob/738451c1/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java b/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java index 7269086..21f2fba 100644 --- a/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java +++ b/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java @@ -180,6 +180,7 @@ public class CacheConfiguration<K, V> extends MutableConfiguration<K, V> { public static final IgnitePredicate<ClusterNode> ALL_NODES = new IgniteAllNodesPredicate(); /** Default timeout after which long query warning will be printed. */ + @Deprecated public static final long DFLT_LONG_QRY_WARN_TIMEOUT = 3000; /** Default number of queries detail metrics to collect. */ @@ -320,6 +321,7 @@ public class CacheConfiguration<K, V> extends MutableConfiguration<K, V> { private Class<?>[] sqlFuncCls; /** */ + @Deprecated private long longQryWarnTimeout = DFLT_LONG_QRY_WARN_TIMEOUT; /** */ @@ -1550,7 +1552,9 @@ public class CacheConfiguration<K, V> extends MutableConfiguration<K, V> { * Gets timeout in milliseconds after which long query warning will be printed. * * @return Timeout in milliseconds. + * @deprecated Use {@link IgniteConfiguration#getLongQueryWarningTimeout()} instead. */ + @Deprecated public long getLongQueryWarningTimeout() { return longQryWarnTimeout; } @@ -1560,7 +1564,9 @@ public class CacheConfiguration<K, V> extends MutableConfiguration<K, V> { * * @param longQryWarnTimeout Timeout in milliseconds. * @return {@code this} for chaining. + * @deprecated Use {@link IgniteConfiguration#setLongQueryWarningTimeout(long)} instead. */ + @Deprecated public CacheConfiguration<K, V> setLongQueryWarningTimeout(long longQryWarnTimeout) { this.longQryWarnTimeout = longQryWarnTimeout; http://git-wip-us.apache.org/repos/asf/ignite/blob/738451c1/modules/core/src/main/java/org/apache/ignite/configuration/IgniteConfiguration.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/configuration/IgniteConfiguration.java b/modules/core/src/main/java/org/apache/ignite/configuration/IgniteConfiguration.java index 9f68399..89ab43e 100644 --- a/modules/core/src/main/java/org/apache/ignite/configuration/IgniteConfiguration.java +++ b/modules/core/src/main/java/org/apache/ignite/configuration/IgniteConfiguration.java @@ -204,6 +204,9 @@ public class IgniteConfiguration { @SuppressWarnings("UnnecessaryBoxing") public static final Long DFLT_CLIENT_FAILURE_DETECTION_TIMEOUT = new Long(30_000); + /** Default timeout after which long query warning will be printed. */ + public static final long DFLT_LONG_QRY_WARN_TIMEOUT = 3000; + /** Optional local Ignite instance name. */ private String igniteInstanceName; @@ -457,6 +460,9 @@ public class IgniteConfiguration { /** Active on start flag. */ private boolean activeOnStart = DFLT_ACTIVE_ON_START; + /** */ + private long longQryWarnTimeout = DFLT_LONG_QRY_WARN_TIMEOUT; + /** * Creates valid grid configuration with all default values. */ @@ -520,6 +526,7 @@ public class IgniteConfiguration { lifecycleBeans = cfg.getLifecycleBeans(); locHost = cfg.getLocalHost(); log = cfg.getGridLogger(); + longQryWarnTimeout = cfg.getLongQueryWarningTimeout(); lsnrs = cfg.getLocalEventListeners(); marsh = cfg.getMarshaller(); marshLocJobs = cfg.isMarshalLocalJobs(); @@ -2714,6 +2721,27 @@ public class IgniteConfiguration { return this; } + /** + * Gets timeout in milliseconds after which long query warning will be printed. + * + * @return Timeout in milliseconds. + */ + public long getLongQueryWarningTimeout() { + return longQryWarnTimeout; + } + + /** + * Sets timeout in milliseconds after which long query warning will be printed. + * + * @param longQryWarnTimeout Timeout in milliseconds. + * @return {@code this} for chaining. + */ + public IgniteConfiguration setLongQueryWarningTimeout(long longQryWarnTimeout) { + this.longQryWarnTimeout = longQryWarnTimeout; + + return this; + } + /** {@inheritDoc} */ @Override public String toString() { return S.toString(IgniteConfiguration.class, this); http://git-wip-us.apache.org/repos/asf/ignite/blob/738451c1/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcConnection.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcConnection.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcConnection.java index 9385d7d..1bf51f2 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcConnection.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcConnection.java @@ -53,19 +53,17 @@ import org.apache.ignite.IgniteJdbcDriver; import org.apache.ignite.Ignition; import org.apache.ignite.cluster.ClusterGroup; import org.apache.ignite.compute.ComputeTaskTimeoutException; -import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.configuration.IgniteConfiguration; -import org.apache.ignite.internal.IgniteEx; import org.apache.ignite.internal.IgniteKernal; import org.apache.ignite.internal.IgnitionEx; -import org.apache.ignite.internal.processors.cache.IgniteCacheProxy; +import org.apache.ignite.internal.processors.cache.DynamicCacheDescriptor; import org.apache.ignite.internal.processors.cache.query.IgniteQueryErrorCode; import org.apache.ignite.internal.processors.query.GridQueryIndexing; import org.apache.ignite.internal.processors.query.IgniteSQLException; +import org.apache.ignite.internal.processors.query.QueryUtils; import org.apache.ignite.internal.processors.resource.GridSpringResourceContext; import org.apache.ignite.internal.util.future.GridFutureAdapter; import org.apache.ignite.internal.util.typedef.F; -import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.lang.IgniteBiTuple; import org.apache.ignite.lang.IgniteCallable; import org.apache.ignite.resources.IgniteInstanceResource; @@ -111,7 +109,10 @@ public class JdbcConnection implements Connection { private final String cfg; /** Cache name. */ - private String cacheName; + private final String cacheName; + + /** Schema name. */ + private String schemaName; /** Closed flag. */ private boolean closed; @@ -162,6 +163,7 @@ public class JdbcConnection implements Connection { * @param props Additional properties. * @throws SQLException In case Ignite node failed to start. */ + @SuppressWarnings("unchecked") public JdbcConnection(String url, Properties props) throws SQLException { assert url != null; assert props != null; @@ -175,6 +177,10 @@ public class JdbcConnection implements Connection { txAllowed = Boolean.parseBoolean(props.getProperty(PROP_TX_ALLOWED)); stream = Boolean.parseBoolean(props.getProperty(PROP_STREAMING)); + + if (stream && cacheName == null) + throw new SQLException("Cache name cannot be null when streaming is enabled."); + streamAllowOverwrite = Boolean.parseBoolean(props.getProperty(PROP_STREAMING_ALLOW_OVERWRITE)); streamFlushTimeout = Long.parseLong(props.getProperty(PROP_STREAMING_FLUSH_FREQ, "0")); streamNodeBufSize = Integer.parseInt(props.getProperty(PROP_STREAMING_PER_NODE_BUF_SIZE, @@ -196,6 +202,17 @@ public class JdbcConnection implements Connection { if (!isValid(2)) throw new SQLException("Client is invalid. Probably cache name is wrong."); + + if (cacheName != null) { + DynamicCacheDescriptor cacheDesc = ignite().context().cache().cacheDescriptor(cacheName); + + if (cacheDesc == null) + throw new SQLException("Cache doesn't exist: " + cacheName); + + schemaName = QueryUtils.normalizeSchemaName(cacheName, cacheDesc.cacheConfiguration().getSqlSchema()); + } + else + schemaName = QueryUtils.DFLT_SCHEMA; } catch (Exception e) { close(); @@ -722,18 +739,21 @@ public class JdbcConnection implements Connection { } /** {@inheritDoc} */ - @Override public void setSchema(String schema) throws SQLException { - assert ignite instanceof IgniteEx; - - cacheName = ((IgniteEx)ignite).context().query().cacheName(schema); + @Override public void setSchema(String schemaName) throws SQLException { + this.schemaName = schemaName; } /** {@inheritDoc} */ @SuppressWarnings("unchecked") @Override public String getSchema() throws SQLException { - String sqlSchema = ignite.cache(cacheName).getConfiguration(CacheConfiguration.class).getSqlSchema(); + return schemaName; + } - return U.firstNotNull(sqlSchema, cacheName, ""); + /** + * @return Normalized schema name. + */ + public String schemaName() { + return F.isEmpty(schemaName) ? QueryUtils.DFLT_SCHEMA : schemaName; } /** {@inheritDoc} */ @@ -830,8 +850,7 @@ public class JdbcConnection implements Connection { * @return {@link PreparedStatement} from underlying engine to supply metadata to Prepared - most likely H2. */ PreparedStatement prepareNativeStatement(String sql) throws SQLException { - return ((IgniteCacheProxy) ignite().cache(cacheName())).context() - .kernalContext().query().prepareNativeStatement(getSchema(), sql); + return ignite().context().query().prepareNativeStatement(schemaName(), sql); } /** http://git-wip-us.apache.org/repos/asf/ignite/blob/738451c1/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcQueryTask.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcQueryTask.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcQueryTask.java index 68ea4c2..7ae6ea2 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcQueryTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcQueryTask.java @@ -74,6 +74,9 @@ class JdbcQueryTask implements IgniteCallable<JdbcQueryTask.QueryResult> { /** Cache name. */ private final String cacheName; + /** Schema name. */ + private final String schemaName; + /** Sql. */ private final String sql; @@ -101,6 +104,7 @@ class JdbcQueryTask implements IgniteCallable<JdbcQueryTask.QueryResult> { /** * @param ignite Ignite. * @param cacheName Cache name. + * @param schemaName Schema name. * @param sql Sql query. * @param isQry Operation type flag - query or not - to enforce query type check. * @param loc Local execution flag. @@ -111,13 +115,13 @@ class JdbcQueryTask implements IgniteCallable<JdbcQueryTask.QueryResult> { * @param collocatedQry Collocated query flag. * @param distributedJoins Distributed joins flag. */ - public JdbcQueryTask(Ignite ignite, String cacheName, String sql, - Boolean isQry, boolean loc, Object[] args, int fetchSize, UUID uuid, - boolean locQry, boolean collocatedQry, boolean distributedJoins) { + public JdbcQueryTask(Ignite ignite, String cacheName, String schemaName, String sql, Boolean isQry, boolean loc, + Object[] args, int fetchSize, UUID uuid, boolean locQry, boolean collocatedQry, boolean distributedJoins) { this.ignite = ignite; this.args = args; this.uuid = uuid; this.cacheName = cacheName; + this.schemaName = schemaName; this.sql = sql; this.isQry = isQry; this.fetchSize = fetchSize; @@ -160,6 +164,7 @@ class JdbcQueryTask implements IgniteCallable<JdbcQueryTask.QueryResult> { qry.setLocal(locQry); qry.setCollocated(collocatedQry); qry.setDistributedJoins(distributedJoins); + qry.setSchema(schemaName); QueryCursorImpl<List<?>> qryCursor = (QueryCursorImpl<List<?>>)cache.withKeepBinary().query(qry); http://git-wip-us.apache.org/repos/asf/ignite/blob/738451c1/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcResultSet.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcResultSet.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcResultSet.java index 10cf17a..01c6386 100755 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcResultSet.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcResultSet.java @@ -146,8 +146,9 @@ public class JdbcResultSet implements ResultSet { boolean loc = nodeId == null; // Connections from new clients send queries with new tasks, so we have to continue in the same manner - JdbcQueryTask qryTask = new JdbcQueryTask(loc ? ignite : null, conn.cacheName(), null, true, loc, null, - fetchSize, uuid, conn.isLocalQuery(), conn.isCollocatedQuery(), conn.isDistributedJoins()); + JdbcQueryTask qryTask = new JdbcQueryTask(loc ? ignite : null, conn.cacheName(), conn.schemaName(), null, + true, loc, null, fetchSize, uuid, conn.isLocalQuery(), conn.isCollocatedQuery(), + conn.isDistributedJoins()); try { JdbcQueryTask.QueryResult res = http://git-wip-us.apache.org/repos/asf/ignite/blob/738451c1/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcStatement.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcStatement.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcStatement.java index 81045b8..89a80ca 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcStatement.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcStatement.java @@ -108,8 +108,8 @@ public class JdbcStatement implements Statement { boolean loc = nodeId == null; - JdbcQueryTask qryTask = new JdbcQueryTask(loc ? ignite : null, conn.cacheName(), sql, true, loc, getArgs(), - fetchSize, uuid, conn.isLocalQuery(), conn.isCollocatedQuery(), conn.isDistributedJoins()); + JdbcQueryTask qryTask = new JdbcQueryTask(loc ? ignite : null, conn.cacheName(), conn.schemaName(), sql, true, + loc, getArgs(), fetchSize, uuid, conn.isLocalQuery(), conn.isCollocatedQuery(), conn.isDistributedJoins()); try { JdbcQueryTask.QueryResult res = @@ -165,8 +165,8 @@ public class JdbcStatement implements Statement { if (!conn.isDmlSupported()) throw new SQLException("Failed to query Ignite: DML operations are supported in versions 1.8.0 and newer"); - JdbcQueryTask qryTask = new JdbcQueryTask(loc ? ignite : null, conn.cacheName(), sql, false, loc, args, - fetchSize, uuid, conn.isLocalQuery(), conn.isCollocatedQuery(), conn.isDistributedJoins()); + JdbcQueryTask qryTask = new JdbcQueryTask(loc ? ignite : null, conn.cacheName(), conn.schemaName(), sql, false, + loc, args, fetchSize, uuid, conn.isLocalQuery(), conn.isCollocatedQuery(), conn.isDistributedJoins()); try { JdbcQueryTask.QueryResult qryRes = @@ -332,8 +332,8 @@ public class JdbcStatement implements Statement { boolean loc = nodeId == null; - JdbcQueryTask qryTask = new JdbcQueryTask(loc ? ignite : null, conn.cacheName(), sql, null, loc, getArgs(), - fetchSize, uuid, conn.isLocalQuery(), conn.isCollocatedQuery(), conn.isDistributedJoins()); + JdbcQueryTask qryTask = new JdbcQueryTask(loc ? ignite : null, conn.cacheName(), conn.schemaName(), sql, null, + loc, getArgs(), fetchSize, uuid, conn.isLocalQuery(), conn.isCollocatedQuery(), conn.isDistributedJoins()); try { JdbcQueryTask.QueryResult res = http://git-wip-us.apache.org/repos/asf/ignite/blob/738451c1/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcStreamedPreparedStatement.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcStreamedPreparedStatement.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcStreamedPreparedStatement.java index 019923f..9f76700 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcStreamedPreparedStatement.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcStreamedPreparedStatement.java @@ -54,6 +54,7 @@ class JdbcStreamedPreparedStatement extends JdbcPreparedStatement { /** {@inheritDoc} */ @Override long doUpdate(String sql, Object[] args) throws SQLException { - return ((IgniteEx)conn.ignite()).context().query().streamUpdateQuery(conn.cacheName(), streamer, sql, args); + return conn.ignite().context().query().streamUpdateQuery(conn.cacheName(), conn.schemaName(), + streamer, sql, args); } } http://git-wip-us.apache.org/repos/asf/ignite/blob/738451c1/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryIndexing.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryIndexing.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryIndexing.java index 4429058..031b5dd 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryIndexing.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryIndexing.java @@ -28,7 +28,6 @@ import org.apache.ignite.cache.query.FieldsQueryCursor; import org.apache.ignite.cache.query.QueryCursor; import org.apache.ignite.cache.query.SqlFieldsQuery; import org.apache.ignite.cache.query.SqlQuery; -import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.internal.GridKernalContext; import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion; import org.apache.ignite.internal.processors.cache.CacheObject; @@ -171,11 +170,10 @@ public interface GridQueryIndexing { * @param cacheName Cache name. * @param schemaName Schema name. * @param cctx Cache context. - * @param ccfg Cache configuration. * @throws IgniteCheckedException If failed. */ - public void registerCache(String cacheName, String schemaName, GridCacheContext<?,?> cctx, - CacheConfiguration<?,?> ccfg) throws IgniteCheckedException; + public void registerCache(String cacheName, String schemaName, GridCacheContext<?,?> cctx) + throws IgniteCheckedException; /** * Unregisters cache. @@ -188,21 +186,12 @@ public interface GridQueryIndexing { /** * Registers type if it was not known before or updates it otherwise. * - * @param cacheName Cache name. + * @param cctx Cache context. * @param desc Type descriptor. * @throws IgniteCheckedException If failed. * @return {@code True} if type was registered, {@code false} if for some reason it was rejected. */ - public boolean registerType(String cacheName, GridQueryTypeDescriptor desc) throws IgniteCheckedException; - - /** - * Unregisters type and removes all corresponding data. - * - * @param schemaName Schema name. - * @param typeName Type name. - * @throws IgniteCheckedException If failed. - */ - public void unregisterType(String schemaName, String typeName) throws IgniteCheckedException; + public boolean registerType(GridCacheContext cctx, GridQueryTypeDescriptor desc) throws IgniteCheckedException; /** * Updates index. Note that key is unique for cache, so if cache contains multiple indexes @@ -275,14 +264,6 @@ public interface GridQueryIndexing { public PreparedStatement prepareNativeStatement(String schemaName, String sql) throws SQLException; /** - * Gets cache name from database schema. - * - * @param schemaName Schema name. Could not be null. Could be empty. - * @return Cache name. Could be null. - */ - public String cacheName(String schemaName); - - /** * Collect queries that already running more than specified duration. * * @param duration Duration to check. http://git-wip-us.apache.org/repos/asf/ignite/blob/738451c1/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java index 990226e..fef7d4c 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java @@ -1336,7 +1336,7 @@ public class GridQueryProcessor extends GridProcessorAdapter { Collection<QueryTypeCandidate> cands) throws IgniteCheckedException { synchronized (stateMux) { if (idx != null) - idx.registerCache(cacheName, schemaName, cctx, cctx.config()); + idx.registerCache(cacheName, schemaName, cctx); try { for (QueryTypeCandidate cand : cands) { @@ -1367,7 +1367,7 @@ public class GridQueryProcessor extends GridProcessorAdapter { } if (idx != null) - idx.registerType(cacheName, desc); + idx.registerType(cctx, desc); } cacheNames.add(CU.mask(cacheName)); @@ -1732,7 +1732,7 @@ public class GridQueryProcessor extends GridProcessorAdapter { throw new IllegalStateException("Failed to execute query (grid is stopping)."); try { - final String schemaName = idx.schema(cctx.name()); + final String schemaName = qry.getSchema() != null ? qry.getSchema() : idx.schema(cctx.name()); final int mainCacheId = CU.cacheId(cctx.name()); IgniteOutClosureX<FieldsQueryCursor<List<?>>> clo; @@ -1782,13 +1782,11 @@ public class GridQueryProcessor extends GridProcessorAdapter { /** * Query SQL fields without strict dependency on concrete cache. * - * @param schemaName Schema name. * @param qry Query. * @param keepBinary Keep binary flag. - * @return Cursot. + * @return Cursor. */ - public FieldsQueryCursor<List<?>> querySqlFieldsNoCache(final String schemaName, final SqlFieldsQuery qry, - final boolean keepBinary) { + public FieldsQueryCursor<List<?>> querySqlFieldsNoCache(final SqlFieldsQuery qry, final boolean keepBinary) { checkxEnabled(); validateSqlFieldsQuery(qry); @@ -1796,6 +1794,9 @@ public class GridQueryProcessor extends GridProcessorAdapter { if (qry.isLocal()) throw new IgniteException("Local query is not supported without specific cache."); + if (qry.getSchema() == null) + throw new IgniteException("Query schema is not set."); + if (!busyLock.enterBusy()) throw new IllegalStateException("Failed to execute query (grid is stopping)."); @@ -1804,7 +1805,7 @@ public class GridQueryProcessor extends GridProcessorAdapter { @Override public FieldsQueryCursor<List<?>> applyx() throws IgniteCheckedException { GridQueryCancel cancel = new GridQueryCancel(); - return idx.queryDistributedSqlFields(schemaName, qry, keepBinary, cancel, null); + return idx.queryDistributedSqlFields(qry.getSchema(), qry, keepBinary, cancel, null); } }; @@ -1833,11 +1834,12 @@ public class GridQueryProcessor extends GridProcessorAdapter { /** * @param cacheName Cache name. + * @param schemaName Schema name. * @param streamer Data streamer. * @param qry Query. * @return Iterator. */ - public long streamUpdateQuery(@Nullable final String cacheName, + public long streamUpdateQuery(@Nullable final String cacheName, final String schemaName, final IgniteDataStreamer<?, ?> streamer, final String qry, final Object[] args) { assert streamer != null; @@ -1847,8 +1849,6 @@ public class GridQueryProcessor extends GridProcessorAdapter { try { GridCacheContext cctx = ctx.cache().cache(cacheName).context(); - final String schemaName = idx.schema(cacheName); - return executeQuery(GridCacheQueryType.SQL_FIELDS, qry, cctx, new IgniteOutClosureX<Long>() { @Override public Long applyx() throws IgniteCheckedException { return idx.streamUpdateQuery(schemaName, qry, args, streamer); @@ -2106,16 +2106,6 @@ public class GridQueryProcessor extends GridProcessorAdapter { } /** - * @param schema Schema name. - * @return Cache name from schema name. - */ - public String cacheName(String schema) throws SQLException { - checkxEnabled(); - - return idx.cacheName(schema); - } - - /** * @param cacheName Cache name. * @param key Key. * @throws IgniteCheckedException Thrown in case of any errors. http://git-wip-us.apache.org/repos/asf/ignite/blob/738451c1/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java index b4feea4..51648e5 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java @@ -63,6 +63,8 @@ import static org.apache.ignite.IgniteSystemProperties.getInteger; * Utility methods for queries. */ public class QueryUtils { + /** Default schema. */ + public static final String DFLT_SCHEMA = "PUBLIC"; /** Field name for key. */ public static final String KEY_FIELD_NAME = "_KEY"; http://git-wip-us.apache.org/repos/asf/ignite/blob/738451c1/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2RowDescriptor.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2RowDescriptor.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2RowDescriptor.java index 327ca14..a9bbd23 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2RowDescriptor.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2RowDescriptor.java @@ -18,7 +18,6 @@ package org.apache.ignite.internal.processors.query.h2; import org.apache.ignite.IgniteCheckedException; -import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.internal.processors.cache.CacheObject; import org.apache.ignite.internal.processors.cache.GridCacheContext; import org.apache.ignite.internal.processors.cache.KeyCacheObject; @@ -34,6 +33,7 @@ import org.apache.ignite.internal.processors.query.h2.opt.GridH2ValueCacheObject import org.apache.ignite.internal.util.offheap.unsafe.GridUnsafeGuard; import org.apache.ignite.internal.util.offheap.unsafe.GridUnsafeMemory; import org.h2.message.DbException; +import org.h2.mvstore.cache.CacheLongKeyLIRS; import org.h2.result.SearchRow; import org.h2.result.SimpleRow; import org.h2.value.DataType; @@ -56,6 +56,7 @@ import org.h2.value.ValueString; import org.h2.value.ValueTime; import org.h2.value.ValueTimestamp; import org.h2.value.ValueUuid; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.math.BigDecimal; @@ -80,6 +81,9 @@ public class H2RowDescriptor implements GridH2RowDescriptor { /** Indexing SPI. */ private final IgniteH2Indexing idx; + /** Table descriptor. */ + private final H2TableDescriptor tbl; + /** */ private final GridQueryTypeDescriptor type; @@ -114,14 +118,19 @@ public class H2RowDescriptor implements GridH2RowDescriptor { private final int valueAliasColumnId; /** + * Constructor. + * + * @param idx Indexing. + * @param tbl Table. * @param type Type descriptor. * @param schema Schema. */ - H2RowDescriptor(IgniteH2Indexing idx, GridQueryTypeDescriptor type, H2Schema schema) { + H2RowDescriptor(IgniteH2Indexing idx, H2TableDescriptor tbl, GridQueryTypeDescriptor type, H2Schema schema) { assert type != null; assert schema != null; this.idx = idx; + this.tbl = tbl; this.type = type; this.schema = schema; @@ -177,12 +186,7 @@ public class H2RowDescriptor implements GridH2RowDescriptor { /** {@inheritDoc} */ @Override public GridCacheContext<?, ?> context() { - return schema.cacheContext(); - } - - /** {@inheritDoc} */ - @Override public CacheConfiguration configuration() { - return schema.cacheContext().config(); + return tbl.cache(); } /** {@inheritDoc} */ @@ -196,12 +200,12 @@ public class H2RowDescriptor implements GridH2RowDescriptor { assert ptr > 0 : ptr; - schema.rowCache().put(ptr, row); + rowCache().put(ptr, row); } /** {@inheritDoc} */ @Override public void uncache(long ptr) { - schema.rowCache().remove(ptr); + rowCache().remove(ptr); } /** {@inheritDoc} */ @@ -348,7 +352,7 @@ public class H2RowDescriptor implements GridH2RowDescriptor { /** {@inheritDoc} */ @Override public GridH2KeyValueRowOffheap createPointer(long ptr) { - GridH2KeyValueRowOffheap row = (GridH2KeyValueRowOffheap)schema.rowCache().get(ptr); + GridH2KeyValueRowOffheap row = (GridH2KeyValueRowOffheap)rowCache().get(ptr); if (row != null) { assert row.pointer() == ptr : ptr + " " + row.pointer(); @@ -361,7 +365,7 @@ public class H2RowDescriptor implements GridH2RowDescriptor { /** {@inheritDoc} */ @Override public GridH2Row cachedRow(long link) { - return schema.rowCache().get(link); + return rowCache().get(link); } /** {@inheritDoc} */ @@ -475,4 +479,11 @@ public class H2RowDescriptor implements GridH2RowDescriptor { return colId; } + + /** + * @return Row cache. + */ + @NotNull private CacheLongKeyLIRS<GridH2Row> rowCache() { + throw new UnsupportedOperationException(); // TODO: Unused for not. + } } http://git-wip-us.apache.org/repos/asf/ignite/blob/738451c1/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2Schema.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2Schema.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2Schema.java index 8dd87c0..deca4b2 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2Schema.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2Schema.java @@ -17,10 +17,7 @@ package org.apache.ignite.internal.processors.query.h2; -import org.apache.ignite.internal.processors.cache.GridCacheContext; -import org.apache.ignite.internal.processors.query.h2.opt.GridH2Row; import org.apache.ignite.internal.util.offheap.unsafe.GridUnsafeMemory; -import org.h2.mvstore.cache.CacheLongKeyLIRS; import org.jsr166.ConcurrentHashMap8; import java.util.Collection; @@ -31,9 +28,6 @@ import java.util.concurrent.ConcurrentMap; */ public class H2Schema { /** */ - private final String cacheName; - - /** */ private final String schemaName; /** */ @@ -45,37 +39,13 @@ public class H2Schema { /** */ private final ConcurrentMap<String, H2TableDescriptor> typeToTbl = new ConcurrentHashMap8<>(); - /** Cache for deserialized offheap rows. */ - private final CacheLongKeyLIRS<GridH2Row> rowCache; - - /** */ - private final GridCacheContext<?, ?> cctx; - /** - * @param cacheName Cache name. + * Constructor. + * * @param schemaName Schema name. - * @param cctx Cache context. */ - public H2Schema(String cacheName, String schemaName, GridCacheContext<?, ?> cctx) { - this.cacheName = cacheName; - this.cctx = cctx; + public H2Schema(String schemaName) { this.schemaName = schemaName; - - rowCache = null; - } - - /** - * @return Cache context. - */ - public GridCacheContext cacheContext() { - return cctx; - } - - /** - * @return Cache name. - */ - public String cacheName() { - return cacheName; } /** @@ -93,13 +63,6 @@ public class H2Schema { } /** - * @return Row cache. - */ - public CacheLongKeyLIRS<GridH2Row> rowCache() { - return rowCache; - } - - /** * @return Tables. */ public Collection<H2TableDescriptor> tables() { @@ -138,14 +101,30 @@ public class H2Schema { */ public void remove(H2TableDescriptor tbl) { tbls.remove(tbl.tableName()); + + typeToTbl.remove(tbl.typeName()); + } + + /** + * Drop table. + * + * @param tbl Table to be removed. + */ + public void drop(H2TableDescriptor tbl) { + tbl.onDrop(); + + tbls.remove(tbl.tableName()); typeToTbl.remove(tbl.typeName()); } /** * Called after the schema was dropped. */ - public void onDrop() { - for (H2TableDescriptor tblDesc : tbls.values()) - tblDesc.onDrop(); + public void dropAll() { + for (H2TableDescriptor tbl : tbls.values()) + tbl.onDrop(); + + tbls.clear(); + typeToTbl.clear(); } } http://git-wip-us.apache.org/repos/asf/ignite/blob/738451c1/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2TableDescriptor.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2TableDescriptor.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2TableDescriptor.java index eedfc3a..589f90e 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2TableDescriptor.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2TableDescriptor.java @@ -59,8 +59,8 @@ public class H2TableDescriptor implements GridH2SystemIndexFactory { /** */ private final H2Schema schema; - /** Cache name. */ - private final String cacheName; + /** Cache context. */ + private final GridCacheContext cctx; /** */ private GridH2Table tbl; @@ -77,13 +77,14 @@ public class H2TableDescriptor implements GridH2SystemIndexFactory { * @param idx Indexing. * @param schema Schema. * @param type Type descriptor. - * @param cacheName Cache name. + * @param cctx Cache context. */ - H2TableDescriptor(IgniteH2Indexing idx, H2Schema schema, GridQueryTypeDescriptor type, String cacheName) { + public H2TableDescriptor(IgniteH2Indexing idx, H2Schema schema, GridQueryTypeDescriptor type, + GridCacheContext cctx) { this.idx = idx; this.type = type; this.schema = schema; - this.cacheName = cacheName; + this.cctx = cctx; fullTblName = H2Utils.withQuotes(schema.schemaName()) + "." + H2Utils.withQuotes(type.tableName()); } @@ -145,10 +146,10 @@ public class H2TableDescriptor implements GridH2SystemIndexFactory { } /** - * @return Cache name. + * @return Cache context. */ - String cacheName() { - return cacheName; + GridCacheContext cache() { + return cctx; } /** @@ -177,8 +178,6 @@ public class H2TableDescriptor implements GridH2SystemIndexFactory { * @return H2 row factory. */ H2RowFactory rowFactory(GridH2RowDescriptor rowDesc) { - GridCacheContext cctx = schema.cacheContext(); - if (cctx.affinityNode()) return new H2RowFactory(rowDesc, cctx); @@ -198,7 +197,6 @@ public class H2TableDescriptor implements GridH2SystemIndexFactory { GridH2RowDescriptor desc = tbl.rowDescriptor(); Index hashIdx = createHashIndex( - schema, tbl, "_key_PK_hash", H2Utils.treeIndexColumns(desc, new ArrayList<IndexColumn>(2), keyCol, affCol) @@ -322,15 +320,12 @@ public class H2TableDescriptor implements GridH2SystemIndexFactory { /** * Create hash index. * - * @param schema Schema. * @param tbl Table. * @param idxName Index name. * @param cols Columns. * @return Index. */ - private Index createHashIndex(H2Schema schema, GridH2Table tbl, String idxName, List<IndexColumn> cols) { - GridCacheContext cctx = schema.cacheContext(); - + private Index createHashIndex(GridH2Table tbl, String idxName, List<IndexColumn> cols) { if (cctx.affinityNode()) { assert pkHashIdx == null : pkHashIdx; http://git-wip-us.apache.org/repos/asf/ignite/blob/738451c1/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2TableEngine.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2TableEngine.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2TableEngine.java index db34064..57b7ba0 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2TableEngine.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2TableEngine.java @@ -82,7 +82,7 @@ public class H2TableEngine implements TableEngine { /** {@inheritDoc} */ @Override public TableBase createTable(CreateTableData createTblData) { - resTbl0 = new GridH2Table(createTblData, rowDesc0, rowFactory0, tblDesc0, tblDesc0.cacheName()); + resTbl0 = new GridH2Table(createTblData, rowDesc0, rowFactory0, tblDesc0, tblDesc0.cache()); return resTbl0; } http://git-wip-us.apache.org/repos/asf/ignite/blob/738451c1/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2Utils.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2Utils.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2Utils.java index a4fdb53..ee88acf 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2Utils.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2Utils.java @@ -173,7 +173,7 @@ public class H2Utils { if (!ctor.isAccessible()) ctor.setAccessible(true); - final int segments = tbl.rowDescriptor().configuration().getQueryParallelism(); + final int segments = tbl.rowDescriptor().context().config().getQueryParallelism(); return (GridH2IndexBase)ctor.newInstance(tbl, idxName, segments, cols); } http://git-wip-us.apache.org/repos/asf/ignite/blob/738451c1/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java index bd611f6..e192008 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java @@ -54,7 +54,6 @@ import org.apache.ignite.cache.query.SqlFieldsQuery; import org.apache.ignite.cache.query.SqlQuery; import org.apache.ignite.cache.query.annotations.QuerySqlFunction; import org.apache.ignite.cluster.ClusterNode; -import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.internal.GridKernalContext; import org.apache.ignite.internal.GridTopic; import org.apache.ignite.internal.IgniteInternalFuture; @@ -90,6 +89,7 @@ import org.apache.ignite.internal.processors.query.GridQueryTypeDescriptor; import org.apache.ignite.internal.processors.query.GridRunningQueryInfo; import org.apache.ignite.internal.processors.query.IgniteSQLException; import org.apache.ignite.internal.processors.query.QueryIndexDescriptorImpl; +import org.apache.ignite.internal.processors.query.QueryUtils; import org.apache.ignite.internal.processors.query.h2.ddl.DdlStatementsProcessor; import org.apache.ignite.internal.processors.query.h2.opt.DistributedJoinMode; import org.apache.ignite.internal.processors.query.h2.database.H2PkHashIndex; @@ -581,7 +581,7 @@ public class IgniteH2Indexing implements GridQueryIndexing { * @param tbl Table to unregister. * @throws IgniteCheckedException If failed to unregister. */ - private void removeTable(H2TableDescriptor tbl) throws IgniteCheckedException { + private void dropTable(H2TableDescriptor tbl) throws IgniteCheckedException { assert tbl != null; if (log.isDebugEnabled()) @@ -614,10 +614,6 @@ public class IgniteH2Indexing implements GridQueryIndexing { finally { U.close(stmt, log); } - - tbl.onDrop(); - - tbl.schema().remove(tbl); } /** @@ -743,12 +739,12 @@ public class IgniteH2Indexing implements GridQueryIndexing { public GridH2IndexBase createSortedIndex(H2Schema schema, String name, GridH2Table tbl, boolean pk, List<IndexColumn> cols, int inlineSize) { try { - GridCacheContext cctx = schema.cacheContext(); + GridCacheContext cctx = tbl.cache(); if (log.isDebugEnabled()) log.debug("Creating cache index [cacheId=" + cctx.cacheId() + ", idxName=" + name + ']'); - final int segments = tbl.rowDescriptor().configuration().getQueryParallelism(); + final int segments = tbl.rowDescriptor().context().config().getQueryParallelism(); return new H2TreeIndex(cctx, tbl, name, pk, cols, inlineSize, segments); } @@ -779,15 +775,6 @@ public class IgniteH2Indexing implements GridQueryIndexing { return new GridEmptyCloseableIterator<>(); } - /** {@inheritDoc} */ - @Override public void unregisterType(String schemaName, String typeName) - throws IgniteCheckedException { - H2TableDescriptor tbl = tableDescriptor(schemaName, typeName); - - if (tbl != null) - removeTable(tbl); - } - /** * Queries individual fields (generally used by JDBC drivers). * @@ -1001,7 +988,7 @@ public class IgniteH2Indexing implements GridQueryIndexing { long time = U.currentTimeMillis() - start; - long longQryExecTimeout = schemas.get(schema).cacheContext().config().getLongQueryWarningTimeout(); + long longQryExecTimeout = ctx.config().getLongQueryWarningTimeout(); if (time > longQryExecTimeout) { String msg = "Query execution is too long (" + time + " ms): " + sql; @@ -1519,15 +1506,15 @@ public class IgniteH2Indexing implements GridQueryIndexing { * @param type Type description. * @throws IgniteCheckedException In case of error. */ - @Override public boolean registerType(String cacheName, GridQueryTypeDescriptor type) + @Override public boolean registerType(GridCacheContext cctx, GridQueryTypeDescriptor type) throws IgniteCheckedException { validateTypeDescriptor(type); - String schemaName = schema(cacheName); + String schemaName = schema(cctx.name()); H2Schema schema = schemas.get(schemaName); - H2TableDescriptor tbl = new H2TableDescriptor(this, schema, type, cacheName); + H2TableDescriptor tbl = new H2TableDescriptor(this, schema, type, cctx); try { Connection conn = connectionForThread(schemaName); @@ -1609,7 +1596,7 @@ public class IgniteH2Indexing implements GridQueryIndexing { if (log.isDebugEnabled()) log.debug("Creating DB table with SQL: " + sql); - GridH2RowDescriptor rowDesc = new H2RowDescriptor(this, tbl.type(), schema); + GridH2RowDescriptor rowDesc = new H2RowDescriptor(this, tbl, tbl.type(), schema); H2RowFactory rowFactory = tbl.rowFactory(rowDesc); @@ -1732,17 +1719,6 @@ public class IgniteH2Indexing implements GridQueryIndexing { } /** {@inheritDoc} */ - @Override public String cacheName(String schemaName) { - assert schemaName != null; - - H2Schema schema = schemas.get(schemaName); - - assert schema != null; - - return schema.cacheName(); - } - - /** {@inheritDoc} */ @SuppressWarnings("SynchronizationOnLocalVariableOrMethodParameter") @Override public void rebuildIndexesFromHash(GridCacheContext cctx, String schemaName, String typeName) throws IgniteCheckedException { @@ -1886,6 +1862,8 @@ public class IgniteH2Indexing implements GridQueryIndexing { else { this.ctx = ctx; + schemas.put(QueryUtils.DFLT_SCHEMA, new H2Schema(QueryUtils.DFLT_SCHEMA)); + valCtx = new CacheQueryObjectValueContext(ctx); nodeId = ctx.localNodeId(); @@ -2081,7 +2059,7 @@ public class IgniteH2Indexing implements GridQueryIndexing { // unregisterMBean(); TODO https://issues.apache.org/jira/browse/IGNITE-2139 if (ctx != null && !ctx.cache().context().database().persistenceEnabled()) { for (H2Schema schema : schemas.values()) - schema.onDrop(); + schema.dropAll(); } for (Connection c : conns) @@ -2091,8 +2069,7 @@ public class IgniteH2Indexing implements GridQueryIndexing { schemas.clear(); cacheName2schema.clear(); - try (Connection c = DriverManager.getConnection(dbUrl); - Statement s = c.createStatement()) { + try (Connection c = DriverManager.getConnection(dbUrl); Statement s = c.createStatement()) { s.execute("SHUTDOWN"); } catch (SQLException e) { @@ -2108,41 +2085,75 @@ public class IgniteH2Indexing implements GridQueryIndexing { log.debug("Cache query index stopped."); } + /** + * Whether this is default schema. + * + * @param schemaName Schema name. + * @return {@code True} if default. + */ + private boolean isDefaultSchema(String schemaName) { + return F.eq(schemaName, QueryUtils.DFLT_SCHEMA); + } + /** {@inheritDoc} */ - @Override public void registerCache(String cacheName, String schemaName, GridCacheContext<?, ?> cctx, - CacheConfiguration<?, ?> ccfg) throws IgniteCheckedException { - if (schemas.putIfAbsent(schemaName, new H2Schema(cacheName, schemaName, cctx)) != null) - throw new IgniteCheckedException("Cache already registered: " + U.maskName(cacheName)); + @Override public void registerCache(String cacheName, String schemaName, GridCacheContext<?, ?> cctx) + throws IgniteCheckedException { + if (!isDefaultSchema(schemaName)) { + if (schemas.putIfAbsent(schemaName, new H2Schema(schemaName)) != null) + throw new IgniteCheckedException("Schema already registered: " + U.maskName(schemaName)); - cacheName2schema.put(cacheName, schemaName); + createSchema(schemaName); + } - createSchema(schemaName); + cacheName2schema.put(cacheName, schemaName); - createSqlFunctions(schemaName, ccfg.getSqlFunctionClasses()); + createSqlFunctions(schemaName, cctx.config().getSqlFunctionClasses()); } /** {@inheritDoc} */ @Override public void unregisterCache(String cacheName) { - String schema = schema(cacheName); - H2Schema rmv = schemas.remove(schema); + String schemaName = schema(cacheName); - if (rmv != null) { + boolean dflt = isDefaultSchema(schemaName); + + H2Schema schema = dflt ? schemas.get(schemaName) : schemas.remove(schemaName); + + if (schema != null) { cacheName2schema.remove(cacheName); mapQryExec.onCacheStop(cacheName); dmlProc.onCacheStop(cacheName); - rmv.onDrop(); + // Drop tables. + Collection<H2TableDescriptor> rmvTbls = new HashSet<>(); - try { - dropSchema(schema); + for (H2TableDescriptor tbl : schema.tables()) { + if (F.eq(tbl.cache().name(), cacheName)) { + try { + dropTable(tbl); + } + catch (IgniteCheckedException e) { + U.error(log, "Failed to drop table on cache stop (will ignore): " + tbl.fullTableName(), e); + } + + schema.drop(tbl); + + rmvTbls.add(tbl); + } } - catch (IgniteCheckedException e) { - U.error(log, "Failed to drop schema on cache stop (will ignore): " + cacheName, e); + + if (!dflt) { + try { + dropSchema(schemaName); + } + catch (IgniteCheckedException e) { + U.error(log, "Failed to drop schema on cache stop (will ignore): " + cacheName, e); + } } - for (H2TableDescriptor tblDesc : rmv.tables()) - for (Index idx : tblDesc.table().getIndexes()) + for (H2TableDescriptor tbl : rmvTbls) { + for (Index idx : tbl.table().getIndexes()) idx.close(null); + } int cacheId = CU.cacheId(cacheName); http://git-wip-us.apache.org/repos/asf/ignite/blob/738451c1/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2RowDescriptor.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2RowDescriptor.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2RowDescriptor.java index 778ebfb..ce73010 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2RowDescriptor.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2RowDescriptor.java @@ -58,11 +58,6 @@ public interface GridH2RowDescriptor extends GridOffHeapSmartPointerFactory<Grid public GridCacheContext<?, ?> context(); /** - * @return Cache configuration. - */ - public CacheConfiguration configuration(); - - /** * Creates new row. * * @param key Key. http://git-wip-us.apache.org/repos/asf/ignite/blob/738451c1/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java index a85cd93..d656cc3 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java @@ -64,8 +64,8 @@ import static org.apache.ignite.internal.processors.query.h2.opt.GridH2QueryType * H2 Table implementation. */ public class GridH2Table extends TableBase { - /** */ - private final String cacheName; + /** Cache context. */ + private final GridCacheContext cctx; /** */ private final GridH2RowDescriptor desc; @@ -119,16 +119,16 @@ public class GridH2Table extends TableBase { * @param desc Row descriptor. * @param rowFactory Row factory. * @param idxsFactory Indexes factory. - * @param cacheName Cache name. + * @param cctx Cache context. */ public GridH2Table(CreateTableData createTblData, @Nullable GridH2RowDescriptor desc, H2RowFactory rowFactory, - GridH2SystemIndexFactory idxsFactory, String cacheName) { + GridH2SystemIndexFactory idxsFactory, GridCacheContext cctx) { super(createTblData); assert idxsFactory != null; this.desc = desc; - this.cacheName = cacheName; + this.cctx = cctx; if (desc != null && desc.context() != null && !desc.context().customAffinityMapper()) { boolean affinityColExists = true; @@ -184,7 +184,7 @@ public class GridH2Table extends TableBase { pkIndexPos = hasHashIndex ? 2 : 1; - final int segments = desc != null ? desc.configuration().getQueryParallelism() : + final int segments = desc != null ? desc.context().config().getQueryParallelism() : // Get index segments count from PK index. Null desc can be passed from tests. index(pkIndexPos).segmentsCount(); @@ -197,7 +197,7 @@ public class GridH2Table extends TableBase { * @return {@code true} If this is a partitioned table. */ public boolean isPartitioned() { - return desc != null && desc.configuration().getCacheMode() == PARTITIONED; + return desc != null && desc.context().config().getCacheMode() == PARTITIONED; } /** @@ -222,8 +222,15 @@ public class GridH2Table extends TableBase { /** * @return Cache name. */ - @Nullable public String cacheName() { - return cacheName; + public String cacheName() { + return cctx.name(); + } + + /** + * @return Cache context. + */ + public GridCacheContext cache() { + return cctx; } /** {@inheritDoc} */ http://git-wip-us.apache.org/repos/asf/ignite/blob/738451c1/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteSqlSchemaIndexingTest.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteSqlSchemaIndexingTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteSqlSchemaIndexingTest.java index 3d994c2..3cecbc8 100644 --- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteSqlSchemaIndexingTest.java +++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteSqlSchemaIndexingTest.java @@ -105,7 +105,7 @@ public class IgniteSqlSchemaIndexingTest extends GridCommonAbstractTest { return null; } - }, IgniteException.class, "Cache already registered: "); + }, IgniteException.class, "Schema already registered: "); } /** http://git-wip-us.apache.org/repos/asf/ignite/blob/738451c1/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexingSpiAbstractSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexingSpiAbstractSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexingSpiAbstractSelfTest.java index 7b0cbf8..99246eb 100644 --- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexingSpiAbstractSelfTest.java +++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexingSpiAbstractSelfTest.java @@ -367,11 +367,6 @@ public abstract class GridIndexingSpiAbstractSelfTest extends GridCommonAbstract // Remove cacheA.remove(2); cacheB.remove(1); - - // Unregister. - spi.unregisterType(spi.schema(typeAA.cacheName()), typeAA.name()); - spi.unregisterType(spi.schema(typeAB.cacheName()), typeAB.name()); - spi.unregisterType(spi.schema(typeBA.cacheName()), typeBA.name()); } /** @@ -384,7 +379,7 @@ public abstract class GridIndexingSpiAbstractSelfTest extends GridCommonAbstract ignite0.createCache(cacheACfg()); - long longQryExecTime = CacheConfiguration.DFLT_LONG_QRY_WARN_TIMEOUT; + long longQryExecTime = IgniteConfiguration.DFLT_LONG_QRY_WARN_TIMEOUT; GridStringLogger log = new GridStringLogger(false, this.log);
