Repository: incubator-ignite Updated Branches: refs/heads/ignite-484 [created] 7000722cf
ignite-484 - extra spaces Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/e975b7a9 Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/e975b7a9 Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/e975b7a9 Branch: refs/heads/ignite-484 Commit: e975b7a9e1856bbb5c200f8c89a0d3d87423a016 Parents: ecc7a50 Author: S.Vladykin <svlady...@gridgain.com> Authored: Mon May 11 20:59:28 2015 +0300 Committer: S.Vladykin <svlady...@gridgain.com> Committed: Mon May 11 20:59:28 2015 +0300 ---------------------------------------------------------------------- .../cache/query/GridCacheTwoStepQuery.java | 22 +++++++- .../h2/twostep/messages/GridQueryRequest.java | 56 +++++++++++++++++++- .../processors/query/h2/IgniteH2Indexing.java | 12 ++++- .../query/h2/sql/GridSqlQuerySplitter.java | 48 ++++++++++++++++- .../h2/twostep/GridReduceQueryExecutor.java | 23 +++++++- .../cache/GridCacheCrossCacheQuerySelfTest.java | 3 +- 6 files changed, 157 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e975b7a9/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheTwoStepQuery.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheTwoStepQuery.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheTwoStepQuery.java index 53fc7a3..1aa5890 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheTwoStepQuery.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheTwoStepQuery.java @@ -46,11 +46,17 @@ public class GridCacheTwoStepQuery { /** */ private boolean explain; + /** */ + private Set<String> spaces; + /** + * @param spaces All spaces accessed in query. * @param qry Reduce query. * @param params Reduce query parameters. */ - public GridCacheTwoStepQuery(String qry, Object ... params) { + public GridCacheTwoStepQuery(Set<String> spaces, String qry, Object ... params) { + this.spaces = spaces; + reduce = new GridCacheSqlQuery(null, qry, params); } @@ -115,4 +121,18 @@ public class GridCacheTwoStepQuery { @Override public String toString() { return S.toString(GridCacheTwoStepQuery.class, this); } + + /** + * @return Spaces. + */ + public Set<String> spaces() { + return spaces; + } + + /** + * @param spaces Spaces. + */ + public void spaces(Set<String> spaces) { + this.spaces = spaces; + } } http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e975b7a9/modules/core/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/messages/GridQueryRequest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/messages/GridQueryRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/messages/GridQueryRequest.java index 3d3bcf9..319a818 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/messages/GridQueryRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/messages/GridQueryRequest.java @@ -48,6 +48,13 @@ public class GridQueryRequest implements Message { @GridDirectCollection(GridCacheSqlQuery.class) private Collection<GridCacheSqlQuery> qrys; + /** Topology version. */ + private long topVer; + + /** */ + @GridDirectCollection(String.class) + private Collection<String> extraSpaces; + /** * Default constructor. */ @@ -60,13 +67,32 @@ public class GridQueryRequest implements Message { * @param pageSize Page size. * @param space Space. * @param qrys Queries. + * @param topVer Topology version. + * @param extraSpaces All space names participating in query other than {@code space}. */ - public GridQueryRequest(long reqId, int pageSize, String space, Collection<GridCacheSqlQuery> qrys) { + public GridQueryRequest(long reqId, int pageSize, String space, Collection<GridCacheSqlQuery> qrys, long topVer, + List<String> extraSpaces) { this.reqId = reqId; this.pageSize = pageSize; this.space = space; this.qrys = qrys; + this.topVer = topVer; + this.extraSpaces = extraSpaces; + } + + /** + * @return All extra space names participating in query other than {@link #space()}. + */ + public Collection<String> extraSpaces() { + return extraSpaces; + } + + /** + * @return Topology version. + */ + public long topologyVersion() { + return topVer; } /** @@ -138,6 +164,17 @@ public class GridQueryRequest implements Message { writer.incrementState(); + case 4: + if (!writer.writeLong("topVer", topVer)) + return false; + + writer.incrementState(); + + case 5: + if (!writer.writeCollection("extraSpaces", extraSpaces, MessageCollectionItemType.STRING)) + return false; + + writer.incrementState(); } return true; @@ -183,6 +220,21 @@ public class GridQueryRequest implements Message { reader.incrementState(); + case 4: + topVer = reader.readLong("topVer"); + + if (!reader.isLastRead()) + return false; + + reader.incrementState(); + + case 5: + extraSpaces = reader.readCollection("extraSpaces", MessageCollectionItemType.STRING); + + if (!reader.isLastRead()) + return false; + + reader.incrementState(); } return true; @@ -195,6 +247,6 @@ public class GridQueryRequest implements Message { /** {@inheritDoc} */ @Override public byte fieldsCount() { - return 4; + return 6; } } http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e975b7a9/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 975378c..44db280 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 @@ -1120,13 +1120,23 @@ public class IgniteH2Indexing implements GridQueryIndexing { * @param space Space name. * @return Schema name. */ - private static String schema(@Nullable String space) { + public static String schema(@Nullable String space) { if (space == null) return ""; return space; } + /** + * @param schema Schema. + * @return Space name. + */ + public static String space(String schema) { + assert schema != null; + + return "".equals(schema) ? null : schema; + } + /** {@inheritDoc} */ @Override public void rebuildIndexes(@Nullable String spaceName, GridQueryTypeDescriptor type) { TableDescriptor tbl = tableDescriptor(spaceName, type); http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e975b7a9/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlQuerySplitter.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlQuerySplitter.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlQuerySplitter.java index 6c7e2e2..5795a1e 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlQuerySplitter.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlQuerySplitter.java @@ -19,6 +19,7 @@ package org.apache.ignite.internal.processors.query.h2.sql; import org.apache.ignite.*; import org.apache.ignite.internal.processors.cache.query.*; +import org.apache.ignite.internal.processors.query.h2.*; import org.apache.ignite.internal.util.typedef.*; import org.h2.jdbc.*; import org.h2.value.*; @@ -212,7 +213,9 @@ public class GridSqlQuerySplitter { } // Build resulting two step query. - GridCacheTwoStepQuery res = new GridCacheTwoStepQuery(rdcQry.getSQL(), + GridCacheTwoStepQuery res = new GridCacheTwoStepQuery( + collectAllSpaces(qry0, new HashSet<String>()), + rdcQry.getSQL(), findParams(rdcQry, params, new ArrayList<>()).toArray()); res.addMapQuery(mergeTable, mapQry.getSQL(), @@ -224,6 +227,49 @@ public class GridSqlQuerySplitter { } /** + * @param qry Query. + * @param spaces Space names. + * @return Space names. + */ + private static Set<String> collectAllSpaces(GridSqlQuery qry, Set<String> spaces) { + if (qry instanceof GridSqlUnion) { + GridSqlUnion union = (GridSqlUnion)qry; + + collectAllSpaces(union.left(), spaces); + collectAllSpaces(union.right(), spaces); + } + else + collectAllSpacesInFrom(((GridSqlSelect)qry).from(), spaces); + + return spaces; + } + + /** + * @param from From element. + * @param spaces Space names. + */ + private static void collectAllSpacesInFrom(GridSqlElement from, Set<String> spaces) { + assert from != null; + + if (from instanceof GridSqlJoin) { + for (int i = 0; i < from.size(); i++) + collectAllSpacesInFrom(from.child(i), spaces); + } + else if (from instanceof GridSqlTable) { + String schema = ((GridSqlTable)from).schema(); + + if (schema != null) + spaces.add(IgniteH2Indexing.space(schema)); + } + else if (from instanceof GridSqlSubquery) + collectAllSpaces(((GridSqlSubquery)from).select(), spaces); + else if (from instanceof GridSqlAlias) + collectAllSpacesInFrom(from.child(), spaces); + else if (!(from instanceof GridSqlFunction)) + throw new IllegalStateException(from.getClass().getName()); + } + + /** * @param qry Select. * @param params Parameters. * @param target Extracted parameters. http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e975b7a9/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridReduceQueryExecutor.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridReduceQueryExecutor.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridReduceQueryExecutor.java index 09a238f..2e69286 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridReduceQueryExecutor.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridReduceQueryExecutor.java @@ -335,7 +335,9 @@ public class GridReduceQueryExecutor { mapQry.marshallParams(m); } - send(nodes, new GridQueryRequest(qryReqId, r.pageSize, space, mapQrys)); + send(nodes, new GridQueryRequest(qryReqId, r.pageSize, space, mapQrys, + ctx.cluster().get().topologyVersion(), + extraSpaces(space, qry.spaces()))); r.latch.await(); @@ -375,6 +377,25 @@ public class GridReduceQueryExecutor { } /** + * @param mainSpace Main space. + * @param allSpaces All spaces. + * @return List of all extra spaces or {@code null} if none. + */ + private List<String> extraSpaces(String mainSpace, Set<String> allSpaces) { + if (F.isEmpty(allSpaces) || (allSpaces.size() == 1 && allSpaces.contains(mainSpace))) + return null; + + ArrayList<String> res = new ArrayList<>(allSpaces.size()); + + for (String space : allSpaces) { + if (!F.eq(space, mainSpace)) + res.add(space); + } + + return res; + } + + /** * @param c Connection. * @param space Space. * @param qry Query. http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e975b7a9/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheCrossCacheQuerySelfTest.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheCrossCacheQuerySelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheCrossCacheQuerySelfTest.java index 4e9bf31..0c9714d 100644 --- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheCrossCacheQuerySelfTest.java +++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheCrossCacheQuerySelfTest.java @@ -123,7 +123,8 @@ public class GridCacheCrossCacheQuerySelfTest extends GridCommonAbstractTest { // for (Map.Entry<Integer, FactPurchase> e : qx.createSqlQuery(FactPurchase.class, "1 = 1").execute().get()) // X.println("___ " + e); - GridCacheTwoStepQuery q = new GridCacheTwoStepQuery("select cast(sum(x) as long) from _cnts_ where ? = ?", 1, 1); + GridCacheTwoStepQuery q = new GridCacheTwoStepQuery(null, + "select cast(sum(x) as long) from _cnts_ where ? = ?", 1, 1); q.addMapQuery("_cnts_", "select count(*) x from \"partitioned\".FactPurchase where ? = ?", 2, 2);