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);
 

Reply via email to