Skip to content

Commit 27a1fc2

Browse files
Add support for query in listSchedules (#2163)
1 parent 1acafa3 commit 27a1fc2

File tree

6 files changed

+65
-10
lines changed

6 files changed

+65
-10
lines changed

temporal-sdk/src/main/java/io/temporal/client/ListScheduleListDescriptionIterator.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
public final class ListScheduleListDescriptionIterator
3535
extends EagerPaginator<ListSchedulesResponse, ScheduleListEntry> {
3636
private final @Nonnull String namespace;
37+
private final @Nullable String query;
3738
private final @Nullable Integer pageSize;
3839
private final @Nonnull GenericWorkflowClient genericClient;
3940

@@ -42,6 +43,18 @@ public ListScheduleListDescriptionIterator(
4243
@Nullable Integer pageSize,
4344
@Nonnull GenericWorkflowClient genericClient) {
4445
this.namespace = namespace;
46+
this.query = null;
47+
this.pageSize = pageSize;
48+
this.genericClient = genericClient;
49+
}
50+
51+
public ListScheduleListDescriptionIterator(
52+
@Nonnull String namespace,
53+
@Nullable String query,
54+
@Nullable Integer pageSize,
55+
@Nonnull GenericWorkflowClient genericClient) {
56+
this.namespace = namespace;
57+
this.query = query;
4558
this.pageSize = pageSize;
4659
this.genericClient = genericClient;
4760
}
@@ -51,10 +64,12 @@ CompletableFuture<ListSchedulesResponse> performRequest(@Nonnull ByteString next
5164
ListSchedulesRequest.Builder request =
5265
ListSchedulesRequest.newBuilder().setNamespace(namespace).setNextPageToken(nextPageToken);
5366

67+
if (query != null) {
68+
request.setQuery(query);
69+
}
5470
if (pageSize != null) {
5571
request.setMaximumPageSize(pageSize);
5672
}
57-
5873
return genericClient.listSchedulesAsync(request.build());
5974
}
6075

temporal-sdk/src/main/java/io/temporal/client/schedules/ScheduleClient.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,4 +87,14 @@ static ScheduleClient newInstance(WorkflowServiceStubs service, ScheduleClientOp
8787
* @return sequential stream that performs remote pagination under the hood
8888
*/
8989
Stream<ScheduleListDescription> listSchedules(@Nullable Integer pageSize);
90+
91+
/**
92+
* List schedules.
93+
*
94+
* @param query Temporal Visibility Query, for syntax see <a
95+
* href="https://docs.temporal.io/visibility#list-filter">Visibility docs</a>
96+
* @param pageSize how many results to fetch from the Server at a time. Default is 100.
97+
* @return sequential stream that performs remote pagination under the hood
98+
*/
99+
Stream<ScheduleListDescription> listSchedules(@Nullable String query, @Nullable Integer pageSize);
90100
}

temporal-sdk/src/main/java/io/temporal/client/schedules/ScheduleClientImpl.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,15 +97,21 @@ public ScheduleHandle getHandle(String scheduleID) {
9797

9898
@Override
9999
public Stream<ScheduleListDescription> listSchedules() {
100-
return this.listSchedules(null);
100+
return this.listSchedules(null, null);
101101
}
102102

103103
@Override
104104
public Stream<ScheduleListDescription> listSchedules(@Nullable Integer pageSize) {
105+
return this.listSchedules(null, pageSize);
106+
}
107+
108+
@Override
109+
public Stream<ScheduleListDescription> listSchedules(
110+
@Nullable String query, @Nullable Integer pageSize) {
105111
return scheduleClientCallsInvoker
106112
.listSchedules(
107113
new ScheduleClientCallsInterceptor.ListSchedulesInput(
108-
pageSize == null ? 100 : pageSize))
114+
query, pageSize == null ? 100 : pageSize))
109115
.getStream();
110116
}
111117
}

temporal-sdk/src/main/java/io/temporal/common/interceptors/ScheduleClientCallsInterceptor.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,15 +81,21 @@ public ScheduleOptions getOptions() {
8181
}
8282

8383
class ListSchedulesInput {
84+
private final String query;
8485
private final int pageSize;
8586

86-
public ListSchedulesInput(int pageSize) {
87+
public ListSchedulesInput(String query, int pageSize) {
88+
this.query = query;
8789
this.pageSize = pageSize;
8890
}
8991

9092
public int getPageSize() {
9193
return pageSize;
9294
}
95+
96+
public String getQuery() {
97+
return query;
98+
}
9399
}
94100

95101
class ListScheduleOutput {

temporal-sdk/src/main/java/io/temporal/internal/client/RootScheduleClientInvoker.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ public void createSchedule(CreateScheduleInput input) {
126126
public ListScheduleOutput listSchedules(ListSchedulesInput input) {
127127
ListScheduleListDescriptionIterator iterator =
128128
new ListScheduleListDescriptionIterator(
129-
clientOptions.getNamespace(), input.getPageSize(), genericClient);
129+
clientOptions.getNamespace(), input.getQuery(), input.getPageSize(), genericClient);
130130
iterator.init();
131131
Iterator<ScheduleListDescription> wrappedIterator =
132132
Iterators.transform(

temporal-sdk/src/test/java/io/temporal/client/schedules/ScheduleTest.java

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
import io.temporal.api.enums.v1.ScheduleOverlapPolicy;
2626
import io.temporal.client.WorkflowOptions;
2727
import io.temporal.common.RetryOptions;
28+
import io.temporal.common.SearchAttributeKey;
29+
import io.temporal.common.SearchAttributes;
2830
import io.temporal.common.converter.EncodedValues;
2931
import io.temporal.common.interceptors.ScheduleClientInterceptor;
3032
import io.temporal.testing.internal.SDKTestWorkflowRule;
@@ -43,6 +45,9 @@
4345
import org.junit.Test;
4446

4547
public class ScheduleTest {
48+
static final SearchAttributeKey<String> CUSTOM_KEYWORD_SA =
49+
SearchAttributeKey.forKeyword("CustomKeywordField");
50+
4651
@Rule
4752
public SDKTestWorkflowRule testWorkflowRule =
4853
SDKTestWorkflowRule.newBuilder()
@@ -484,10 +489,12 @@ public void updateSchedules() {
484489
public void listSchedules() {
485490
ScheduleClient client = createScheduleClient();
486491
// Create the schedule
487-
ScheduleOptions options =
492+
ScheduleOptions.Builder optionsBuilder =
488493
ScheduleOptions.newBuilder()
489494
.setMemo(Collections.singletonMap("memokey2", "memoval2"))
490-
.build();
495+
.setTypedSearchAttributes(
496+
SearchAttributes.newBuilder().set(CUSTOM_KEYWORD_SA, "keyword").build());
497+
ScheduleOptions options = optionsBuilder.build();
491498
Schedule schedule =
492499
createTestSchedule()
493500
.setState(ScheduleState.newBuilder().setPaused(true).setNote("schedule list").build())
@@ -532,17 +539,28 @@ public void listSchedules() {
532539
(ScheduleListActionStartWorkflow) listDescription.getSchedule().getAction();
533540
Assert.assertEquals("TestWorkflow1", action.getWorkflow());
534541
// Create two additional schedules
535-
client.createSchedule(scheduleIdPrefix + UUID.randomUUID(), schedule, options);
536-
client.createSchedule(scheduleIdPrefix + UUID.randomUUID(), schedule, options);
542+
optionsBuilder = optionsBuilder.setTypedSearchAttributes(null);
543+
client.createSchedule(scheduleIdPrefix + UUID.randomUUID(), schedule, optionsBuilder.build());
544+
client.createSchedule(scheduleIdPrefix + UUID.randomUUID(), schedule, optionsBuilder.build());
537545
// Add delay for schedules to appear
538546
testWorkflowRule.sleep(Duration.ofSeconds(2));
539547
// List all schedules and filter
540548
scheduleStream = client.listSchedules(10);
541549
long listedSchedulesCount =
542550
scheduleStream.filter(s -> s.getScheduleId().startsWith(scheduleIdPrefix)).count();
543551
Assert.assertEquals(3, listedSchedulesCount);
552+
// List all schedules with a null filter
553+
scheduleStream = client.listSchedules(null, 10);
554+
listedSchedulesCount =
555+
scheduleStream.filter(s -> s.getScheduleId().startsWith(scheduleIdPrefix)).count();
556+
Assert.assertEquals(3, listedSchedulesCount);
557+
// List schedules with a query
558+
scheduleStream = client.listSchedules("CustomKeywordField = 'keyword'", null);
559+
listedSchedulesCount =
560+
scheduleStream.filter(s -> s.getScheduleId().startsWith(scheduleIdPrefix)).count();
561+
Assert.assertEquals(1, listedSchedulesCount);
544562
// Cleanup all schedules
545-
scheduleStream = client.listSchedules(null);
563+
scheduleStream = client.listSchedules(null, null);
546564
scheduleStream
547565
.filter(s -> s.getScheduleId().startsWith(scheduleIdPrefix))
548566
.forEach(

0 commit comments

Comments
 (0)