IGNITE-4379: Fixed local query execution. This closes #1323.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/6e485637 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/6e485637 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/6e485637 Branch: refs/heads/master Commit: 6e485637e2738a7e809eac1a802f0964dc12383d Parents: b83ec8e Author: Andrey V. Mashenkov <[email protected]> Authored: Fri Dec 9 15:42:40 2016 +0300 Committer: devozerov <[email protected]> Committed: Fri Dec 9 15:42:40 2016 +0300 ---------------------------------------------------------------------- .../processors/query/h2/IgniteH2Indexing.java | 54 ++++++++++---------- .../IgniteCacheAbstractFieldsQuerySelfTest.java | 19 +++++++ 2 files changed, 45 insertions(+), 28 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/6e485637/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 6da8758..362ddd8 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 @@ -774,31 +774,38 @@ public class IgniteH2Indexing implements GridQueryIndexing { throws IgniteCheckedException { final Connection conn = connectionForSpace(spaceName); - initLocalQueryContext(conn, enforceJoinOrder, filters); + setupConnection(conn, false, enforceJoinOrder); + + final PreparedStatement stmt = preparedStatementWithParams(conn, qry, params, true); + + List<GridQueryFieldMetadata> meta; try { - final PreparedStatement stmt = preparedStatementWithParams(conn, qry, params, true); + meta = meta(stmt.getMetaData()); + } + catch (SQLException e) { + throw new IgniteCheckedException("Cannot prepare query metadata", e); + } - List<GridQueryFieldMetadata> meta; + final GridH2QueryContext ctx = new GridH2QueryContext(nodeId, nodeId, 0, LOCAL) + .filter(filters).distributedJoins(false); - try { - meta = meta(stmt.getMetaData()); - } - catch (SQLException e) { - throw new IgniteCheckedException("Cannot prepare query metadata", e); - } + return new GridQueryFieldsResultAdapter(meta, null) { + @Override public GridCloseableIterator<List<?>> iterator() throws IgniteCheckedException { + assert GridH2QueryContext.get() == null; + + GridH2QueryContext.set(ctx); - return new GridQueryFieldsResultAdapter(meta, null) { - @Override public GridCloseableIterator<List<?>> iterator() throws IgniteCheckedException{ + try { ResultSet rs = executeSqlQueryWithTimer(spaceName, stmt, conn, qry, params, timeout, cancel); return new FieldsIterator(rs); } - }; - } - finally { - GridH2QueryContext.clearThreadLocal(); - } + finally { + GridH2QueryContext.clearThreadLocal(); + } + } + }; } /** @@ -1025,17 +1032,6 @@ public class IgniteH2Indexing implements GridQueryIndexing { } /** - * @param conn Connection. - * @param enforceJoinOrder Enforce join order of tables. - * @param filter Filter. - */ - private void initLocalQueryContext(Connection conn, boolean enforceJoinOrder, IndexingQueryFilter filter) { - setupConnection(conn, false, enforceJoinOrder); - - GridH2QueryContext.set(new GridH2QueryContext(nodeId, nodeId, 0, LOCAL).filter(filter).distributedJoins(false)); - } - - /** * @param conn Connection to use. * @param distributedJoins If distributed joins are enabled. * @param enforceJoinOrder Enforce join order of tables. @@ -1061,7 +1057,9 @@ public class IgniteH2Indexing implements GridQueryIndexing { Connection conn = connectionForThread(tbl.schemaName()); - initLocalQueryContext(conn, false, filter); + setupConnection(conn, false, false); + + GridH2QueryContext.set(new GridH2QueryContext(nodeId, nodeId, 0, LOCAL).filter(filter).distributedJoins(false)); try { ResultSet rs = executeSqlQueryWithTimer(spaceName, conn, sql, params, true, 0, null); http://git-wip-us.apache.org/repos/asf/ignite/blob/6e485637/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAbstractFieldsQuerySelfTest.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAbstractFieldsQuerySelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAbstractFieldsQuerySelfTest.java index d5f02eb..2c35501 100644 --- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAbstractFieldsQuerySelfTest.java +++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAbstractFieldsQuerySelfTest.java @@ -28,10 +28,12 @@ import java.util.List; import java.util.Map; import java.util.UUID; import java.util.concurrent.Callable; +import javax.cache.Cache; import javax.cache.CacheException; import org.apache.ignite.IgniteCache; import org.apache.ignite.cache.CacheAtomicityMode; import org.apache.ignite.cache.CacheMode; +import org.apache.ignite.cache.CachePeekMode; import org.apache.ignite.cache.CacheRebalanceMode; import org.apache.ignite.cache.CacheWriteSynchronizationMode; import org.apache.ignite.cache.affinity.AffinityKey; @@ -650,6 +652,23 @@ public abstract class IgniteCacheAbstractFieldsQuerySelfTest extends GridCommonA } /** @throws Exception If failed. */ + public void testLocalQuery() throws Exception { + IgniteCache<Object, Object> cache = grid(0).cache( null); + + int expected = 0; + + for(Cache.Entry e: cache.localEntries(CachePeekMode.PRIMARY)){ + if(e.getValue() instanceof Integer) + expected++; + } + + QueryCursor<List<?>> qry = cache + .query(new SqlFieldsQuery("select _key, _val from Integer").setLocal(true)); + + assertEquals(expected, qry.getAll().size()); + } + + /** @throws Exception If failed. */ public void testQueryIntegersWithJoin() throws Exception { QueryCursor<List<?>> qry = grid(0).cache(null).query(new SqlFieldsQuery( "select i._KEY, i._VAL, j._KEY, j._VAL from Integer i join Integer j where i._VAL >= 100"));
