You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kafka.apache.org by bb...@apache.org on 2022/12/19 18:39:15 UTC

[kafka] branch trunk updated: MINOR: No error with zero results state query (#13002)

This is an automated email from the ASF dual-hosted git repository.

bbejeck pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/kafka.git


The following commit(s) were added to refs/heads/trunk by this push:
     new ea65d74f6bc MINOR: No error with zero results state query (#13002)
ea65d74f6bc is described below

commit ea65d74f6bc7f4a94f7f037cbf0103e925a9ddbb
Author: Bill Bejeck <bb...@gmail.com>
AuthorDate: Mon Dec 19 13:39:06 2022 -0500

    MINOR: No error with zero results state query (#13002)
    
    This PR updates StateQueryResult.getOnlyPartitionResult() to not throw an IllegaArgumentException when there are 0 query results.
    
    Added a test that will fail without this patch
    
    Reviewers: John Roesler<vv...@apache.org>
---
 .../kafka/streams/query/StateQueryResult.java      |  4 +-
 .../kafka/streams/query/StateQueryResultTest.java  | 64 ++++++++++++++++++++++
 2 files changed, 66 insertions(+), 2 deletions(-)

diff --git a/streams/src/main/java/org/apache/kafka/streams/query/StateQueryResult.java b/streams/src/main/java/org/apache/kafka/streams/query/StateQueryResult.java
index c5eaa10663a..722a1851660 100644
--- a/streams/src/main/java/org/apache/kafka/streams/query/StateQueryResult.java
+++ b/streams/src/main/java/org/apache/kafka/streams/query/StateQueryResult.java
@@ -72,12 +72,12 @@ public class StateQueryResult<R> {
                 .filter(r -> r.getResult() != null)
                 .collect(Collectors.toList());
 
-        if (nonempty.size() != 1) {
+        if (nonempty.size() > 1) {
             throw new IllegalArgumentException(
                 "The query did not return exactly one partition result: " + partitionResults
             );
         } else {
-            return nonempty.get(0);
+            return nonempty.isEmpty() ? null : nonempty.get(0);
         }
     }
 
diff --git a/streams/src/test/java/org/apache/kafka/streams/query/StateQueryResultTest.java b/streams/src/test/java/org/apache/kafka/streams/query/StateQueryResultTest.java
new file mode 100644
index 00000000000..0e9313da8d3
--- /dev/null
+++ b/streams/src/test/java/org/apache/kafka/streams/query/StateQueryResultTest.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.kafka.streams.query;
+
+import org.apache.kafka.streams.query.internals.SucceededQueryResult;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.nullValue;
+import static org.junit.Assert.assertThrows;
+
+
+class StateQueryResultTest {
+
+    StateQueryResult<String> stringStateQueryResult;
+    final QueryResult<String> noResultsFound = new SucceededQueryResult<>(null);
+    final QueryResult<String> validResult = new SucceededQueryResult<>("Foo");
+
+    @BeforeEach
+    public void setUp() {
+        stringStateQueryResult = new StateQueryResult<>();
+    }
+
+    @Test
+    @DisplayName("Zero query results shouldn't error")
+    void getOnlyPartitionResultNoResultsTest() {
+        stringStateQueryResult.addResult(0, noResultsFound);
+        final QueryResult<String> result = stringStateQueryResult.getOnlyPartitionResult();
+        assertThat(result, nullValue());
+    }
+
+    @Test
+    @DisplayName("Valid query results still works")
+    void getOnlyPartitionResultWithSingleResultTest() {
+        stringStateQueryResult.addResult(0, validResult);
+        final QueryResult<String> result = stringStateQueryResult.getOnlyPartitionResult();
+        assertThat(result.getResult(), is("Foo"));
+    }
+
+    @Test
+    @DisplayName("More than one query result throws IllegalArgumentException ")
+    void getOnlyPartitionResultMultipleResults() {
+        stringStateQueryResult.addResult(0, validResult);
+        stringStateQueryResult.addResult(1, validResult);
+        assertThrows(IllegalArgumentException.class, () -> stringStateQueryResult.getOnlyPartitionResult());
+    }
+}
\ No newline at end of file