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)
