You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by kl...@apache.org on 2016/12/12 22:36:28 UTC

[25/46] geode git commit: GEODE-2124: Queries that invoke StructSet addAll fail with ClassCastException

GEODE-2124: Queries that invoke StructSet addAll fail with ClassCastException

 * Fixed addAll method in StructSet to call the overridden add method


Project: http://git-wip-us.apache.org/repos/asf/geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/geode/commit/6e501310
Tree: http://git-wip-us.apache.org/repos/asf/geode/tree/6e501310
Diff: http://git-wip-us.apache.org/repos/asf/geode/diff/6e501310

Branch: refs/heads/feature/GEODE-1930
Commit: 6e5013102927099a725282b6bad5d64a79152fab
Parents: bf2a038
Author: Jason Huynh <hu...@gmail.com>
Authored: Fri Nov 18 11:32:53 2016 -0800
Committer: Jason Huynh <hu...@gmail.com>
Committed: Mon Nov 21 10:03:52 2016 -0800

----------------------------------------------------------------------
 .../geode/cache/query/internal/StructSet.java   |  14 +-
 .../query/dunit/SelectStarQueryDUnitTest.java   | 135 +++++++++++++++++++
 2 files changed, 147 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/geode/blob/6e501310/geode-core/src/main/java/org/apache/geode/cache/query/internal/StructSet.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/cache/query/internal/StructSet.java b/geode-core/src/main/java/org/apache/geode/cache/query/internal/StructSet.java
index 6d04c02..e89e123 100644
--- a/geode-core/src/main/java/org/apache/geode/cache/query/internal/StructSet.java
+++ b/geode-core/src/main/java/org/apache/geode/cache/query/internal/StructSet.java
@@ -240,15 +240,25 @@ public final class StructSet /* extends ObjectOpenCustomHashSet */ implements Se
   public boolean addAll(Collection c) {
     if (c instanceof StructSet) {
       return addAll((StructSet) c);
+    } else {
+      boolean modified = false;
+      for (Object o : c) {
+        modified = add(o);
+      }
+      return modified;
     }
-    return this.contents.addAll(c);
   }
 
   public boolean removeAll(Collection c) {
     if (c instanceof StructSet) {
       return removeAll((StructSet) c);
+    } else {
+      boolean modified = false;
+      for (Object o : c) {
+        modified = remove(o);
+      }
+      return modified;
     }
-    return this.contents.removeAll(c);
   }
 
   public boolean retainAll(Collection c) {

http://git-wip-us.apache.org/repos/asf/geode/blob/6e501310/geode-core/src/test/java/org/apache/geode/cache/query/dunit/SelectStarQueryDUnitTest.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/org/apache/geode/cache/query/dunit/SelectStarQueryDUnitTest.java b/geode-core/src/test/java/org/apache/geode/cache/query/dunit/SelectStarQueryDUnitTest.java
index 4596fdc..525aa2f 100644
--- a/geode-core/src/test/java/org/apache/geode/cache/query/dunit/SelectStarQueryDUnitTest.java
+++ b/geode-core/src/test/java/org/apache/geode/cache/query/dunit/SelectStarQueryDUnitTest.java
@@ -92,6 +92,141 @@ public class SelectStarQueryDUnitTest extends JUnit4CacheTestCase {
   }
 
   @Test
+  public void functionWithStructTypeInInnerQueryShouldNotThrowException() throws Exception {
+    final Host host = Host.getHost(0);
+    final VM server1 = host.getVM(0);
+    final VM client = host.getVM(3);
+    PortfolioPdx[] portfolios = new PortfolioPdx[10];
+    for (int i = 0; i < portfolios.length; i++) {
+      portfolios[i] = new PortfolioPdx(i);
+    }
+
+    // create servers and regions
+    final int port1 = startPartitionedCacheServer(server1, portfolios);
+
+    // create client
+    client.invoke(new SerializableCallable("Create client") {
+      @Override
+      public Object call() throws Exception {
+        ClientCacheFactory cf = new ClientCacheFactory();
+        cf.addPoolServer(getServerHostName(server1.getHost()), port1);
+        ClientCache cache = getClientCache(cf);
+        cache.createClientRegionFactory(ClientRegionShortcut.PROXY).create(regName);
+        return null;
+      }
+    });
+
+    // put serialized PortfolioPdx objects
+    client.invoke(new SerializableCallable("Put objects") {
+      @Override
+      public Object call() throws Exception {
+        Region r1 = getRootRegion(regName);
+        for (int i = 10; i < 100; i++) {
+          r1.put("key-" + i, new PortfolioPdx(i));
+        }
+        return null;
+      }
+    });
+
+    // query remotely from client
+    client.invoke(new SerializableCallable("Query") {
+      @Override
+      public Object call() throws Exception {
+        getLogWriter().info("Querying remotely from client");
+        QueryService remoteQS = null;
+        try {
+          remoteQS = ((ClientCache) getCache()).getQueryService();
+          SelectResults sr = (SelectResults) remoteQS
+              .newQuery("select distinct oP.ID, oP.status, oP.getType from /" + regName
+                  + " oP where element(select distinct p.ID, p.status, p.getType from /" + regName
+                  + " p where p.ID = oP.ID).status = 'inactive'")
+              .execute();
+          assertEquals(50, sr.size());
+        } catch (Exception e) {
+          fail("Exception getting query service ", e);
+        }
+
+        return null;
+      }
+    });
+
+    closeCache(client);
+    closeCache(server1);
+  }
+
+  @Test
+  public void functionWithStructTypeInInnerQueryShouldNotThrowExceptionWhenRunOnMultipleNodes()
+      throws Exception {
+    final Host host = Host.getHost(0);
+    final VM server1 = host.getVM(0);
+    final VM server2 = host.getVM(1);
+    final VM server3 = host.getVM(2);
+    final VM client = host.getVM(3);
+    PortfolioPdx[] portfolios = new PortfolioPdx[10];
+    for (int i = 0; i < portfolios.length; i++) {
+      portfolios[i] = new PortfolioPdx(i);
+    }
+
+    // create servers and regions
+    final int port1 = startPartitionedCacheServer(server1, portfolios);
+    final int port2 = startPartitionedCacheServer(server2, portfolios);
+    final int port3 = startPartitionedCacheServer(server3, portfolios);
+
+    // create client
+    client.invoke(new SerializableCallable("Create client") {
+      @Override
+      public Object call() throws Exception {
+        ClientCacheFactory cf = new ClientCacheFactory();
+        cf.addPoolServer(getServerHostName(server1.getHost()), port1);
+        cf.addPoolServer(getServerHostName(server2.getHost()), port2);
+        cf.addPoolServer(getServerHostName(server3.getHost()), port3);
+        ClientCache cache = getClientCache(cf);
+        cache.createClientRegionFactory(ClientRegionShortcut.PROXY).create(regName);
+        return null;
+      }
+    });
+
+    // put serialized PortfolioPdx objects
+    client.invoke(new SerializableCallable("Put objects") {
+      @Override
+      public Object call() throws Exception {
+        Region r1 = getRootRegion(regName);
+        for (int i = 10; i < 100; i++) {
+          r1.put("key-" + i, new PortfolioPdx(i));
+        }
+        return null;
+      }
+    });
+
+    // query remotely from client
+    client.invoke(new SerializableCallable("Query") {
+      @Override
+      public Object call() throws Exception {
+        getLogWriter().info("Querying remotely from client");
+        QueryService remoteQS = null;
+        try {
+          remoteQS = ((ClientCache) getCache()).getQueryService();
+          SelectResults sr = (SelectResults) remoteQS
+              .newQuery("select distinct oP.ID, oP.status, oP.getType from /" + regName
+                  + " oP where element(select distinct p.ID, p.status, p.getType from /" + regName
+                  + " p where p.ID = oP.ID).status = 'inactive'")
+              .execute();
+          assertEquals(50, sr.size());
+        } catch (Exception e) {
+          fail("Exception getting query service ", e);
+        }
+        return null;
+      }
+    });
+
+
+    closeCache(client);
+    closeCache(server1);
+    closeCache(server2);
+    closeCache(server3);
+  }
+
+  @Test
   public void testSelectStarQueryForPartitionedRegion() throws Exception {
     final Host host = Host.getHost(0);
     final VM server1 = host.getVM(0);