Repository: ignite
Updated Branches:
  refs/heads/master 187fc7eb5 -> 609ca3531


IGNITE-9197 Fixed error when querying empty table from java thin client

This closes #4488


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/609ca353
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/609ca353
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/609ca353

Branch: refs/heads/master
Commit: 609ca353104777550b6d0e68ea5ec8c2cffe9f26
Parents: 187fc7e
Author: Alexey Kukushkin <[email protected]>
Authored: Tue Aug 7 12:13:16 2018 +0300
Committer: Igor Sapego <[email protected]>
Committed: Tue Aug 7 12:13:16 2018 +0300

----------------------------------------------------------------------
 .../internal/client/thin/ClientQueryCursor.java | 32 +++++++-----
 .../internal/client/thin/GenericQueryPager.java |  4 +-
 .../ignite/internal/client/thin/QueryPager.java |  3 ++
 .../ignite/client/FunctionalQueryTest.java      | 52 ++++++++++++++++++--
 4 files changed, 71 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/609ca353/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientQueryCursor.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientQueryCursor.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientQueryCursor.java
index 086fab8..cdf94f0 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientQueryCursor.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientQueryCursor.java
@@ -18,7 +18,6 @@
 package org.apache.ignite.internal.client.thin;
 
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
 import java.util.NoSuchElementException;
@@ -64,6 +63,9 @@ class ClientQueryCursor<T> implements QueryCursor<T> {
             private Iterator<T> currPageIt = null;
 
             @Override public boolean hasNext() {
+                if (!pager.hasFirstPage())
+                    return nextPage().hasNext();
+
                 return pager.hasNext() || (currPageIt != null && 
currPageIt.hasNext());
             }
 
@@ -71,21 +73,25 @@ class ClientQueryCursor<T> implements QueryCursor<T> {
                 if (!hasNext())
                     throw new NoSuchElementException();
 
-                if (currPageIt == null || (!currPageIt.hasNext() && 
pager.hasNext())) {
-                    try {
-                        Collection<T> currPage = pager.next();
-                        currPageIt = currPage.iterator();
-                    }
-                    catch (ClientException e) {
-                        throw e;
-                    }
-                    catch (Exception e) {
-                        throw new ClientException("Failed to retrieve query 
results", e);
-                    }
-                }
+                if (currPageIt == null || (!currPageIt.hasNext() && 
pager.hasNext()))
+                    nextPage();
 
                 return currPageIt.next();
             }
+
+            private Iterator<T> nextPage() {
+                try {
+                    currPageIt = pager.next().iterator();
+
+                    return currPageIt;
+                }
+                catch (ClientException e) {
+                    throw e;
+                }
+                catch (Exception e) {
+                    throw new ClientException("Failed to retrieve query 
results", e);
+                }
+            }
         };
     }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/609ca353/modules/core/src/main/java/org/apache/ignite/internal/client/thin/GenericQueryPager.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/GenericQueryPager.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/GenericQueryPager.java
index cee5dc9..ce15cae 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/GenericQueryPager.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/GenericQueryPager.java
@@ -83,8 +83,8 @@ abstract class GenericQueryPager<T> implements QueryPager<T> {
         return hasNext;
     }
 
-    /** Indicates if initial query response was received. */
-    boolean hasFirstPage() {
+    /** {@inheritDoc} */
+    @Override public boolean hasFirstPage() {
         return hasFirstPage;
     }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/609ca353/modules/core/src/main/java/org/apache/ignite/internal/client/thin/QueryPager.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/QueryPager.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/QueryPager.java
index bc1c509..e985689 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/QueryPager.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/QueryPager.java
@@ -33,4 +33,7 @@ interface QueryPager<T> extends AutoCloseable {
      * @return {@code true} if there are more pages to read; {@code false} 
otherwise.
      */
     public boolean hasNext();
+
+    /** Indicates if initial query response was received. */
+    public boolean hasFirstPage();
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/609ca353/modules/indexing/src/test/java/org/apache/ignite/client/FunctionalQueryTest.java
----------------------------------------------------------------------
diff --git 
a/modules/indexing/src/test/java/org/apache/ignite/client/FunctionalQueryTest.java
 
b/modules/indexing/src/test/java/org/apache/ignite/client/FunctionalQueryTest.java
index b352646..eeec30f 100644
--- 
a/modules/indexing/src/test/java/org/apache/ignite/client/FunctionalQueryTest.java
+++ 
b/modules/indexing/src/test/java/org/apache/ignite/client/FunctionalQueryTest.java
@@ -36,13 +36,9 @@ import org.apache.ignite.cache.query.SqlQuery;
 import org.apache.ignite.configuration.BinaryConfiguration;
 import org.apache.ignite.configuration.ClientConfiguration;
 import org.apache.ignite.configuration.IgniteConfiguration;
-import org.apache.ignite.client.ClientCache;
-import org.apache.ignite.client.Config;
-import org.apache.ignite.client.IgniteClient;
-import org.apache.ignite.client.Person;
 import org.junit.Test;
 
-import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.*;
 
 /**
  * Thin client functional tests.
@@ -161,6 +157,52 @@ public class FunctionalQueryTest {
     }
 
     /** */
+    @Test
+    public void testGettingEmptyResultWhenQueryingEmptyTable() throws 
Exception {
+        try (Ignite ignored = Ignition.start(Config.getServerConfiguration());
+             IgniteClient client = Ignition.startClient(new 
ClientConfiguration().setAddresses(Config.SERVER))
+        ) {
+            final String TBL = "Person";
+
+            client.query(
+                new SqlFieldsQuery(String.format(
+                    "CREATE TABLE IF NOT EXISTS " + TBL + " (id INT PRIMARY 
KEY, name VARCHAR) WITH \"VALUE_TYPE=%s\"",
+                    Person.class.getName()
+                )).setSchema("PUBLIC")
+            ).getAll();
+
+            // IgniteClient#query() API
+            List<List<?>> res = client.query(new SqlFieldsQuery("SELECT * FROM 
" + TBL)).getAll();
+
+            assertNotNull(res);
+            assertEquals(0, res.size());
+
+            // ClientCache#query(SqlFieldsQuery) API
+            ClientCache<Integer, Person> cache = client.cache("SQL_PUBLIC_" + 
TBL.toUpperCase());
+
+            res = cache.query(new SqlFieldsQuery("SELECT * FROM " + 
TBL)).getAll();
+
+            assertNotNull(res);
+            assertEquals(0, res.size());
+
+            // ClientCache#query(ScanQuery) and ClientCache#query(SqlQuery) API
+            Collection<Query<Cache.Entry<Integer, Person>>> queries = 
Arrays.asList(
+                new ScanQuery<>(),
+                new SqlQuery<>(Person.class, "1 = 1")
+            );
+
+            for (Query<Cache.Entry<Integer, Person>> qry : queries) {
+                try (QueryCursor<Cache.Entry<Integer, Person>> cur = 
cache.query(qry)) {
+                    List<Cache.Entry<Integer, Person>> res2 = cur.getAll();
+
+                    assertNotNull(res2);
+                    assertEquals(0, res2.size());
+                }
+            }
+        }
+    }
+
+    /** */
     private static ClientConfiguration getClientConfiguration() {
         return new ClientConfiguration().setAddresses(Config.SERVER)
             .setSendBufferSize(0)

Reply via email to